ZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQklGRndyaXRlci5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQklGRndyaXRlci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjYxOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9CSUZGd3JpdGVyLnBtCkBAIC0wLDAgKzEsMzE2IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJJRkZ3cml0ZXIgLSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBFeGNlbCB3b3JrYm9va3MgYW5kIHdvcmtzaGVldHMuCisjCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7CisKKworCisKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ2xhc3MgZGF0YS4KKyMKK215ICRieXRlX29yZGVyICAgPSAnJzsKK215ICRCSUZGX3ZlcnNpb24gPSAweDA2MDA7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIyBDb25zdHJ1Y3RvcgorIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgID0gJF9bMF07CisKKyAgICBteSAkc2VsZiAgID0geworICAgICAgICAgICAgICAgICAgICBfYnl0ZV9vcmRlciAgICAgID0+ICcnLAorICAgICAgICAgICAgICAgICAgICBfZGF0YSAgICAgICAgICAgID0+ICcnLAorICAgICAgICAgICAgICAgICAgICBfZGF0YXNpemUgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9saW1pdCAgICAgICAgICAgPT4gODIyNCwKKyAgICAgICAgICAgICAgICAgICAgX2lnbm9yZV9jb250aW51ZSA9PiAwLAorICAgICAgICAgICAgICAgICB9OworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgICAkc2VsZi0+X3NldF9ieXRlX29yZGVyKCk7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NldF9ieXRlX29yZGVyKCkKKyMKKyMgRGV0ZXJtaW5lIHRoZSBieXRlIG9yZGVyIGFuZCBzdG9yZSBpdCBhcyBjbGFzcyBkYXRhIHRvIGF2b2lkCisjIHJlY2FsY3VsYXRpbmcgaXQgZm9yIGVhY2ggY2FsbCB0byBuZXcoKS4KKyMKK3N1YiBfc2V0X2J5dGVfb3JkZXIgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIGlmICgkYnl0ZV9vcmRlciBlcSAnJyl7CisgICAgICAgICMgQ2hlY2sgaWYgInBhY2siIGdpdmVzIHRoZSByZXF1aXJlZCBJRUVFIDY0Yml0IGZsb2F0CisgICAgICAgIG15ICR0ZXN0c3RyID0gcGFjayAiZCIsIDEuMjM0NTsKKyAgICAgICAgbXkgQGhleGRhdGEgPSgweDhELCAweDk3LCAweDZFLCAweDEyLCAweDgzLCAweEMwLCAweEYzLCAweDNGKTsKKyAgICAgICAgbXkgJG51bWJlciAgPSBwYWNrICJDOCIsIEBoZXhkYXRhOworCisgICAgICAgIGlmICgkbnVtYmVyIGVxICR0ZXN0c3RyKSB7CisgICAgICAgICAgICAkYnl0ZV9vcmRlciA9IDA7ICAgICMgTGl0dGxlIEVuZGlhbgorICAgICAgICB9CisgICAgICAgIGVsc2lmICgkbnVtYmVyIGVxIHJldmVyc2UoJHRlc3RzdHIpKXsKKyAgICAgICAgICAgICRieXRlX29yZGVyID0gMTsgICAgIyBCaWcgRW5kaWFuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIEdpdmUgdXAuIEknbGwgZml4IHRoaXMgaW4gYSBsYXRlciB2ZXJzaW9uLgorICAgICAgICAgICAgY3JvYWsgKCAiUmVxdWlyZWQgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IG5vdCBzdXBwb3J0ZWQgIiAgLgorICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBwbGF0Zm9ybS4gU2VlIHRoZSBwb3J0YWJpbGl0eSBzZWN0aW9uICIgLgorICAgICAgICAgICAgICAgICAgICAib2YgdGhlIGRvY3VtZW50YXRpb24uIgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAkc2VsZi0+e19ieXRlX29yZGVyfSA9ICRieXRlX29yZGVyOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3ByZXBlbmQoJGRhdGEpCisjCisjIEdlbmVyYWwgc3RvcmFnZSBmdW5jdGlvbgorIworc3ViIF9wcmVwZW5kIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJGRhdGEgICAgPSBqb2luKCcnLCBAXyk7CisKKyAgICAkZGF0YSA9ICRzZWxmLT5fYWRkX2NvbnRpbnVlKCRkYXRhKSBpZiBsZW5ndGgoJGRhdGEpID4gJHNlbGYtPntfbGltaXR9OworCisgICAgJHNlbGYtPntfZGF0YX0gICAgICA9ICRkYXRhIC4gJHNlbGYtPntfZGF0YX07CisgICAgJHNlbGYtPntfZGF0YXNpemV9ICs9IGxlbmd0aCgkZGF0YSk7CisKKyAgICByZXR1cm4gJGRhdGE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfYXBwZW5kKCRkYXRhKQorIworIyBHZW5lcmFsIHN0b3JhZ2UgZnVuY3Rpb24KKyMKK3N1YiBfYXBwZW5kIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJGRhdGEgICAgPSBqb2luKCcnLCBAXyk7CisKKyAgICAkZGF0YSA9ICRzZWxmLT5fYWRkX2NvbnRpbnVlKCRkYXRhKSBpZiBsZW5ndGgoJGRhdGEpID4gJHNlbGYtPntfbGltaXR9OworCisgICAgJHNlbGYtPntfZGF0YX0gICAgICA9ICRzZWxmLT57X2RhdGF9IC4gJGRhdGE7CisgICAgJHNlbGYtPntfZGF0YXNpemV9ICs9IGxlbmd0aCgkZGF0YSk7CisKKyAgICByZXR1cm4gJGRhdGE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYm9mKCR0eXBlKQorIworIyAkdHlwZSA9IDB4MDAwNSwgV29ya2Jvb2sKKyMgJHR5cGUgPSAweDAwMTAsIFdvcmtzaGVldAorIyAkdHlwZSA9IDB4MDAyMCwgQ2hhcnQKKyMKKyMgV3JpdGVzIEV4Y2VsIEJPRiByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmVhbSBvcgorIyBzdWItc3RyZWFtIGluIHRoZSBCSUZGIGZpbGUuCisjCitzdWIgX3N0b3JlX2JvZiB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgID0gMHgwODA5OyAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDEwOyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkdmVyc2lvbiA9ICRCSUZGX3ZlcnNpb247CisgICAgbXkgJHR5cGUgICAgPSAkX1swXTsKKworICAgICMgQWNjb3JkaW5nIHRvIHRoZSBTREsgJGJ1aWxkIGFuZCAkeWVhciBzaG91bGQgYmUgc2V0IHRvIHplcm8uCisgICAgIyBIb3dldmVyLCB0aGlzIHRocm93cyBhIHdhcm5pbmcgaW4gRXhjZWwgNS4gU28sIHVzZSB0aGVzZQorICAgICMgbWFnaWMgbnVtYmVycy4KKyAgICBteSAkYnVpbGQgICA9IDB4MERCQjsKKyAgICBteSAkeWVhciAgICA9IDB4MDdDQzsKKworICAgIG15ICRiZmggICAgID0gMHgwMDAwMDA0MTsKKyAgICBteSAkc2ZvICAgICA9IDB4MDAwMDAwMDY7CisKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInZ2dnZWViIsICR2ZXJzaW9uLCAkdHlwZSwgJGJ1aWxkLCAkeWVhciwgJGJmaCwgJHNmbyk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2VvZigpCisjCisjIFdyaXRlcyBFeGNlbCBFT0YgcmVjb3JkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBCSUZGIHN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfZW9mIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMDBBOyAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICA9IDB4MDAwMDsgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaGVhZGVyICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FkZF9jb250aW51ZSgpCisjCisjIEV4Y2VsIGxpbWl0cyB0aGUgc2l6ZSBvZiBCSUZGIHJlY29yZHMuIEluIEV4Y2VsIDUgdGhlIGxpbWl0IGlzIDIwODQgYnl0ZXMuIEluCisjIEV4Y2VsIDk3IHRoZSBsaW1pdCBpcyA4MjI4IGJ5dGVzLiBSZWNvcmRzIHRoYXQgYXJlIGxvbmdlciB0aGFuIHRoZXNlIGxpbWl0cworIyBtdXN0IGJlIHNwbGl0IHVwIGludG8gQ09OVElOVUUgYmxvY2tzLgorIworIyBUaGlzIGZ1bmN0aW9uIHRha2UgYSBsb25nIEJJRkYgcmVjb3JkIGFuZCBpbnNlcnRzIENPTlRJTlVFIHJlY29yZHMgYXMKKyMgbmVjZXNzYXJ5LgorIworIyBTb21lIHJlY29yZHMgaGF2ZSB0aGVpciBvd24gc3BlY2lhbGlzZWQgQ29udGludWUgYmxvY2tzIHNvIHRoZXJlIGlzIGFsc28gYW4KKyMgb3B0aW9uIHRvIGJ5cGFzcyB0aGlzIGZ1bmN0aW9uLgorIworc3ViIF9hZGRfY29udGludWUgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGRhdGEgICAgICAgID0gJF9bMF07CisgICAgbXkgJGxpbWl0ICAgICAgID0gJHNlbGYtPntfbGltaXR9OworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAzQzsgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRoZWFkZXI7CisgICAgbXkgJHRtcDsKKworICAgICMgU2tpcCB0aGlzIGlmIGFub3RoZXIgbWV0aG9kIGhhbmRsZXMgdGhlIGNvbnRpbnVlIGJsb2Nrcy4KKyAgICByZXR1cm4gJGRhdGEgaWYgJHNlbGYtPntfaWdub3JlX2NvbnRpbnVlfTsKKworICAgICMgVGhlIGZpcnN0IDIwODAvODIyNCBieXRlcyByZW1haW4gaW50YWN0LiBIb3dldmVyLCB3ZSBoYXZlIHRvIGNoYW5nZQorICAgICMgdGhlIGxlbmd0aCBmaWVsZCBvZiB0aGUgcmVjb3JkLgorICAgICMKKyAgICAkdG1wID0gc3Vic3RyKCRkYXRhLCAwLCAkbGltaXQsICIiKTsKKyAgICBzdWJzdHIoJHRtcCwgMiwgMiwgcGFjaygidiIsICRsaW1pdC00KSk7CisKKyAgICAjIFN0cmlwIG91dCBjaHVua3Mgb2YgMjA4MC84MjI0IGJ5dGVzICs0IGZvciB0aGUgaGVhZGVyLgorICAgIHdoaWxlIChsZW5ndGgoJGRhdGEpID4gJGxpbWl0KSB7CisgICAgICAgICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGltaXQpOworICAgICAgICAkdG1wICAgIC49ICRoZWFkZXI7CisgICAgICAgICR0bXAgICAgLj0gc3Vic3RyKCRkYXRhLCAwLCAkbGltaXQsICIiKTsKKyAgICB9CisKKyAgICAjIE1vcCB1cCB0aGUgbGFzdCBvZiB0aGUgZGF0YQorICAgICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCBsZW5ndGgoJGRhdGEpKTsKKyAgICAkdG1wICAgIC49ICRoZWFkZXI7CisgICAgJHRtcCAgICAuPSAkZGF0YTsKKworICAgIHJldHVybiAkdG1wIDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9hZGRfbXNvX2dlbmVyaWMoKQorIworIyBDcmVhdGUgYSBtc28gc3RydWN0dXJlIHRoYXQgaXMgcGFydCBvZiBhbiBFc2NoZXIgZHJhd2luZyBvYmplY3QuIFRoZXNlIGFyZQorIyBhcmUgdXNlZCBmb3IgaW1hZ2VzLCBjb21tZW50cyBhbmQgZmlsdGVycy4gVGhpcyBnZW5lcmljIG1ldGhvZCBpcyB1c2VkIGJ5CisjIG90aGVyIG1ldGhvZHMgdG8gY3JlYXRlIHNwZWNpZmljIG1zbyByZWNvcmRzLgorIworIyBSZXR1cm5zIHRoZSBwYWNrZWQgcmVjb3JkLgorIworc3ViIF9hZGRfbXNvX2dlbmVyaWMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJHR5cGUgICAgICAgID0gJF9bMF07CisgICAgbXkgJHZlcnNpb24gICAgID0gJF9bMV07CisgICAgbXkgJGluc3RhbmNlICAgID0gJF9bMl07CisgICAgbXkgJGRhdGEgICAgICAgID0gJF9bM107CisgICAgbXkgJGxlbmd0aCAgICAgID0gZGVmaW5lZCAkX1s0XSA/ICRfWzRdIDogbGVuZ3RoKCRkYXRhKTsKKworICAgICMgVGhlIGhlYWRlciBjb250YWlucyB2ZXJzaW9uIGFuZCBpbnN0YW5jZSBpbmZvIHBhY2tlZCBpbnRvIDIgYnl0ZXMuCisgICAgbXkgJGhlYWRlciAgICAgID0gJHZlcnNpb24gfCAoJGluc3RhbmNlIDw8IDQpOworCisgICAgbXkgJHJlY29yZCAgICAgID0gcGFjayAidnZWIiwgJGhlYWRlciwgJHR5cGUsICRsZW5ndGg7CisgICAgICAgJHJlY29yZCAgICAgLj0gJGRhdGE7CisKKyAgICByZXR1cm4gJHJlY29yZDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEZvciBkZWJ1Z2dpbmcKKyMKK3N1YiBfaGV4b3V0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBwcmludCArKGNhbGxlcigxKSlbM10sICJcbiI7CisKKyAgICBteSAkZGF0YSA9IGpvaW4gJycsIEBfOworCisgICAgbXkgQGJ5dGVzID0gdW5wYWNrKCJIKiIsICRkYXRhKSA9fiAvLi4vZzsKKworICAgIHdoaWxlIChAYnl0ZXMgPiAxNikgeworICAgICAgICBwcmludCBqb2luICIgIiwgc3BsaWNlIEBieXRlcywgMCwgMTY7CisgICAgICAgIHByaW50ICJcbiI7CisgICAgfQorICAgIHByaW50IGpvaW4gIiAiLCBAYnl0ZXMsICJcblxuIjsKK30KKworCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK0JJRkZ3cml0ZXIgLSBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBFeGNlbCB3b3JrYm9va3MgYW5kIHdvcmtzaGVldHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9CaWcucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0JpZy5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjI2ZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9CaWcucG0KQEAgLTAsMCArMSw5NCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QmlnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFdyaXRlRXhjZWw6OkJpZworIworIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCAtIFdyaXRlIGZvcm1hdHRlZCB0ZXh0IGFuZCBudW1iZXJzIHRvIGEKKyMgY3Jvc3MtcGxhdGZvcm0gRXhjZWwgYmluYXJ5IGZpbGUuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEuCisjCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Oldvcmtib29rOworCisKKworCisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Oldvcmtib29rIEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IuIFRoaW4gd3JhcHBlciBmb3IgYSBXb3JrYm9vayBvYmplY3QuCisjCisjIFRoaXMgbW9kdWxlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBkaXJlY3RseSBhbmQgaXRzIHVzZSBpcyBkZXByZWNhdGVkLiBTZWUKKyMgdGhlIFBvZCBkb2N1bWVudGF0aW9uIGJlbG93LgorIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya2Jvb2stPm5ldyhAXyk7CisKKyAgICAjIENoZWNrIGZvciBmaWxlIGNyZWF0aW9uIGZhaWx1cmVzIGJlZm9yZSByZS1ibGVzc2luZworICAgIGJsZXNzICAkc2VsZiwgJGNsYXNzIGlmIGRlZmluZWQgJHNlbGY7CisKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworCis9aGVhZDEgTkFNRQorCisKK0JpZyAtIEEgY2xhc3MgZm9yIGNyZWF0aW5nIEV4Y2VsIGZpbGVzID4gN01CLgorCisKKz1oZWFkMSBTWU5PUFNJUworCitVc2Ugb2YgdGhpcyBtb2R1bGUgaXMgZGVwcmVjYXRlZC4gU2VlIGJlbG93LgorCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgbW9kdWxlIHdhcyBhIHN1Yi1jbGFzcyBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB1c2VkIGZvciBjcmVhdGluZyBFeGNlbCBmaWxlcyBncmVhdGVyIHRoYW4gN01CLiBIb3dldmVyLCBpdCBpcyBubyBsb25nZXIgcmVxdWlyZWQgYW5kIGlzIG5vdyBkZXByZWNhdGVkLgorCitBcyBvZiB2ZXJzaW9uIDIuMTcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2FuIGNyZWF0ZSBmaWxlcyBsYXJnZXIgdGhhbiA3TUIgZGlyZWN0bHkgaWYgT0xFOjpTdG9yYWdlX0xpdGUgaXMgaW5zdGFsbGVkLgorCitUaGlzIG1vZHVsZSBvbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIElmIHlvdXIgcHJvZ3JhbXMgdXNlIDo6QmlnIHlvdSBzaG91bGQgY29udmVydCB0aGVtIHRvIHVzZSBTcHJlYWRzaGVldDo6V3JpdEV4Y2VsIGRpcmVjdGx5LgorCisKKz1oZWFkMSBSRVFVSVJFTUVOVFMKKworTDxPTEU6OlN0b3JhZ2VfTGl0ZT4uCisKKworPWhlYWQxIEFVVEhPUgorCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKworPWhlYWQxIENPUFlSSUdIVAorCisKK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmY0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0LnBtCkBAIC0wLDAgKzEsMzA2MiBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ2hhcnQgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgQ2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIEV4cG9ydGVyOwordXNlIHN0cmljdDsKK3VzZSBDYXJwOwordXNlIEZpbGVIYW5kbGU7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0KTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRm9ybWF0dGluZyBpbmZvcm1hdGlvbi4KKyMKKyMgcGVybHRpZHkgd2l0aCBvcHRpb25zOiAtbWJsPTIgLXB0PTAgLW5vbGEKKyMKKyMgQW55IGNhbWVsIGNhc2UgSHVuZ2FyaWFuIG5vdGF0aW9uIHN0eWxlIHZhcmlhYmxlIG5hbWVzIGluIHRoZSBCSUZGIHJlY29yZAorIyB3cml0aW5nIHN1Yi1yb3V0aW5lcyBiZWxvdyBhcmUgZm9yIHNpbWlsYXJpdHkgd2l0aCBuYW1lcyB1c2VkIGluIHRoZSBFeGNlbAorIyBkb2N1bWVudGF0aW9uLiBPdGhlcndpc2UgbG93ZXJjYXNlIHVuZGVyc2NvcmUgc3R5bGUgbmFtZXMgYXJlIHVzZWQuCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGUgY2hhcnQgY2xhc3MgaGllcmFyY2h5IGlzIGFzIGZvbGxvd3MuIENoYXJ0LnBtIGFjdHMgYXMgYSBmYWN0b3J5IGZvciB0aGUKKyMgc3ViLWNsYXNzZXMuCisjCisjCisjICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcgorIyAgICAgICAgICAgICAgICAgICAgIF4KKyMgICAgICAgICAgICAgICAgICAgICB8CisjICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0CisjICAgICAgICAgICAgICAgICAgICAgXgorIyAgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydAorIyAgICAgICAgICAgICAgICAgICAgIF4KKyMgICAgICAgICAgICAgICAgICAgICB8CisjICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OiogKHN1Yi10eXBlcykKKyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGZhY3RvcnkoKQorIworIyBGYWN0b3J5IG1ldGhvZCBmb3IgcmV0dXJuaW5nIGNoYXJ0IG9iamVjdHMgYmFzZWQgb24gdGhlaXIgY2xhc3MgdHlwZS4KKyMKK3N1YiBmYWN0b3J5IHsKKworICAgIG15ICRjdXJyZW50X2NsYXNzICA9IHNoaWZ0OworICAgIG15ICRjaGFydF9zdWJjbGFzcyA9IHNoaWZ0OworCisgICAgJGNoYXJ0X3N1YmNsYXNzID0gdWNmaXJzdCBsYyAkY2hhcnRfc3ViY2xhc3M7CisKKyAgICBteSAkbW9kdWxlID0gIlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6IiAuICRjaGFydF9zdWJjbGFzczsKKworICAgIGV2YWwgInJlcXVpcmUgJG1vZHVsZSI7CisKKyAgICAjIFRPRE8uIE5lZWQgdG8gcmUtcmFpc2UgdGhpcyBlcnJvciBmcm9tIFdvcmtib29rOjphZGRfY2hhcnQoKS4KKyAgICBkaWUgIkNoYXJ0IHR5cGUgJyRjaGFydF9zdWJjbGFzcycgbm90IHN1cHBvcnRlZCBpbiBhZGRfY2hhcnQoKVxuIiBpZiAkQDsKKworICAgIHJldHVybiAkbW9kdWxlLT5uZXcoIEBfICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIyBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBzdWItY2xhc3Nlcy4KKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldC0+bmV3KCBAXyApOworCisgICAgJHNlbGYtPntfc2hlZXRfdHlwZX0gID0gMHgwMjAwOworICAgICRzZWxmLT57X29yaWVudGF0aW9ufSA9IDB4MDsKKyAgICAkc2VsZi0+e19zZXJpZXN9ICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19lbWJlZGRlZH0gICAgPSAwOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgICAkc2VsZi0+X3NldF9kZWZhdWx0X3Byb3BlcnRpZXMoKTsKKyAgICAkc2VsZi0+X3NldF9kZWZhdWx0X2NvbmZpZ19kYXRhKCk7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUHVibGljIG1ldGhvZHMuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhZGRfc2VyaWVzKCkKKyMKKyMgQWRkIGEgc2VyaWVzIGFuZCBpdCdzIHByb3BlcnRpZXMgdG8gYSBjaGFydC4KKyMKK3N1YiBhZGRfc2VyaWVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIGNyb2FrICJNdXN0IHNwZWNpZnkgJ3ZhbHVlcycgaW4gYWRkX3NlcmllcygpIiBpZiAhZXhpc3RzICRhcmd7dmFsdWVzfTsKKworICAgICMgUGFyc2UgdGhlIHJhbmdlcyB0byB2YWxpZGF0ZSB0aGVtIGFuZCBleHRyYWN0IHNhbGllbnQgaW5mb3JtYXRpb24uCisgICAgbXkgQHZhbHVlX2RhdGEgICAgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne3ZhbHVlc30gKTsKKyAgICBteSBAY2F0ZWdvcnlfZGF0YSA9ICRzZWxmLT5fcGFyc2Vfc2VyaWVzX2Zvcm11bGEoICRhcmd7Y2F0ZWdvcmllc30gKTsKKyAgICBteSAkbmFtZV9mb3JtdWxhICA9ICRzZWxmLT5fcGFyc2Vfc2VyaWVzX2Zvcm11bGEoICRhcmd7bmFtZV9mb3JtdWxhfSApOworCisgICAgIyBEZWZhdWx0IGNhdGVnb3J5IGNvdW50IHRvIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSBjb3VudCBpZiBub3QgZGVmaW5lZC4KKyAgICBpZiAoICFkZWZpbmVkICRjYXRlZ29yeV9kYXRhWzFdICkgeworICAgICAgICAkY2F0ZWdvcnlfZGF0YVsxXSA9ICR2YWx1ZV9kYXRhWzFdOworICAgIH0KKworICAgICMgQWRkIHRoZSBwYXJzZWQgZGF0YSB0byB0aGUgdXNlciBzdXBwbGllZCBkYXRhLgorICAgICVhcmcgPSAoCisgICAgICAgIEBfLAorICAgICAgICBfdmFsdWVzICAgICAgID0+IFxAdmFsdWVfZGF0YSwKKyAgICAgICAgX2NhdGVnb3JpZXMgICA9PiBcQGNhdGVnb3J5X2RhdGEsCisgICAgICAgIF9uYW1lX2Zvcm11bGEgPT4gJG5hbWVfZm9ybXVsYQorICAgICk7CisKKyAgICAjIEVuY29kZSB0aGUgU2VyaWVzIG5hbWUuCisgICAgbXkgKCAkbmFtZSwgJGVuY29kaW5nICkgPQorICAgICAgJHNlbGYtPl9lbmNvZGVfdXRmMTYoICRhcmd7bmFtZX0sICRhcmd7bmFtZV9lbmNvZGluZ30gKTsKKworICAgICRhcmd7bmFtZX0gICAgICAgICAgPSAkbmFtZTsKKyAgICAkYXJne25hbWVfZW5jb2Rpbmd9ID0gJGVuY29kaW5nOworCisgICAgcHVzaCBAeyAkc2VsZi0+e19zZXJpZXN9IH0sIFwlYXJnOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3hfYXhpcygpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgWC1heGlzLgorIworc3ViIHNldF94X2F4aXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlYXJnICA9IEBfOworCisgICAgbXkgKCAkbmFtZSwgJGVuY29kaW5nICkgPQorICAgICAgJHNlbGYtPl9lbmNvZGVfdXRmMTYoICRhcmd7bmFtZX0sICRhcmd7bmFtZV9lbmNvZGluZ30gKTsKKworICAgIG15ICRmb3JtdWxhID0gJHNlbGYtPl9wYXJzZV9zZXJpZXNfZm9ybXVsYSggJGFyZ3tuYW1lX2Zvcm11bGF9ICk7CisKKyAgICAkc2VsZi0+e194X2F4aXNfbmFtZX0gICAgID0gJG5hbWU7CisgICAgJHNlbGYtPntfeF9heGlzX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKKyAgICAkc2VsZi0+e194X2F4aXNfZm9ybXVsYX0gID0gJGZvcm11bGE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfeV9heGlzKCkKKyMKKyMgU2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBZLWF4aXMuCisjCitzdWIgc2V0X3lfYXhpcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICVhcmcgID0gQF87CisKKyAgICBteSAoICRuYW1lLCAkZW5jb2RpbmcgKSA9CisgICAgICAkc2VsZi0+X2VuY29kZV91dGYxNiggJGFyZ3tuYW1lfSwgJGFyZ3tuYW1lX2VuY29kaW5nfSApOworCisgICAgbXkgJGZvcm11bGEgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne25hbWVfZm9ybXVsYX0gKTsKKworICAgICRzZWxmLT57X3lfYXhpc19uYW1lfSAgICAgPSAkbmFtZTsKKyAgICAkc2VsZi0+e195X2F4aXNfZW5jb2Rpbmd9ID0gJGVuY29kaW5nOworICAgICRzZWxmLT57X3lfYXhpc19mb3JtdWxhfSAgPSAkZm9ybXVsYTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF90aXRsZSgpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgY2hhcnQgdGl0bGUuCisjCitzdWIgc2V0X3RpdGxlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIG15ICggJG5hbWUsICRlbmNvZGluZyApID0KKyAgICAgICRzZWxmLT5fZW5jb2RlX3V0ZjE2KCAkYXJne25hbWV9LCAkYXJne25hbWVfZW5jb2Rpbmd9ICk7CisKKyAgICBteSAkZm9ybXVsYSA9ICRzZWxmLT5fcGFyc2Vfc2VyaWVzX2Zvcm11bGEoICRhcmd7bmFtZV9mb3JtdWxhfSApOworCisgICAgJHNlbGYtPntfdGl0bGVfbmFtZX0gICAgID0gJG5hbWU7CisgICAgJHNlbGYtPntfdGl0bGVfZW5jb2Rpbmd9ID0gJGVuY29kaW5nOworICAgICRzZWxmLT57X3RpdGxlX2Zvcm11bGF9ICA9ICRmb3JtdWxhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2xlZ2VuZCgpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgY2hhcnQgbGVnZW5kLgorIworc3ViIHNldF9sZWdlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlYXJnICA9IEBfOworCisgICAgaWYgKCBkZWZpbmVkICRhcmd7cG9zaXRpb259ICkgeworICAgICAgICBpZiAoIGxjICRhcmd7cG9zaXRpb259IGVxICdub25lJyApIHsKKyAgICAgICAgICAgICRzZWxmLT57X2xlZ2VuZH0tPntfdmlzaWJsZX0gPSAwOworICAgICAgICB9CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3Bsb3RhcmVhKCkKKyMKKyMgU2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFydCBwbG90YXJlYS4KKyMKK3N1YiBzZXRfcGxvdGFyZWEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlYXJnICA9IEBfOworICAgIHJldHVybiB1bmxlc3Mga2V5cyAlYXJnOworCisgICAgbXkgJGFyZWEgPSAkc2VsZi0+e19wbG90YXJlYX07CisKKyAgICAjIFNldCB0aGUgcGxvdGFyZWEgdmlzaWJpbGl0eS4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3t2aXNpYmxlfSApIHsKKyAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gPSAkYXJne3Zpc2libGV9OworICAgICAgICByZXR1cm4gaWYgISRhcmVhLT57X3Zpc2libGV9OworICAgIH0KKworICAgICMgVE9ETy4gY291bGQgbW92ZSB0aGlzIG91dCBvZiBpZiBzdGF0ZW1lbnQuCisgICAgJGFyZWEtPntfYmdfY29sb3JfaW5kZXh9ID0gMHgwODsKKworICAgICMgU2V0IHRoZSBjaGFydCBiYWNrZ3JvdW5kIGNvbG91ci4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3tjb2xvcn0gKSB7CisgICAgICAgIG15ICggJGluZGV4LCAkcmdiICkgPSAkc2VsZi0+X2dldF9jb2xvcl9pbmRpY2VzKCAkYXJne2NvbG9yfSApOworICAgICAgICBpZiAoIGRlZmluZWQgJGluZGV4ICkgeworICAgICAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfaW5kZXh9ID0gJGluZGV4OworICAgICAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfcmdifSAgID0gJHJnYjsKKyAgICAgICAgICAgICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fSA9IDB4MDg7CisgICAgICAgICAgICAkYXJlYS0+e19iZ19jb2xvcl9yZ2J9ICAgPSAweDAwMDAwMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgU2V0IHRoZSBib3JkZXIgbGluZSBjb2xvdXIuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7bGluZV9jb2xvcn0gKSB7CisgICAgICAgIG15ICggJGluZGV4LCAkcmdiICkgPSAkc2VsZi0+X2dldF9jb2xvcl9pbmRpY2VzKCAkYXJne2xpbmVfY29sb3J9ICk7CisgICAgICAgIGlmICggZGVmaW5lZCAkaW5kZXggKSB7CisgICAgICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fSA9ICRpbmRleDsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfcmdifSAgID0gJHJnYjsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgU2V0IHRoZSBib3JkZXIgbGluZSBwYXR0ZXJuLgorICAgIGlmICggZGVmaW5lZCAkYXJne2xpbmVfcGF0dGVybn0gKSB7CisgICAgICAgIG15ICRwYXR0ZXJuID0gJHNlbGYtPl9nZXRfbGluZV9wYXR0ZXJuKCAkYXJne2xpbmVfcGF0dGVybn0gKTsKKyAgICAgICAgJGFyZWEtPntfbGluZV9wYXR0ZXJufSA9ICRwYXR0ZXJuOworICAgIH0KKworICAgICMgU2V0IHRoZSBib3JkZXIgbGluZSB3ZWlnaHQuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7bGluZV93ZWlnaHR9ICkgeworICAgICAgICBteSAkd2VpZ2h0ID0gJHNlbGYtPl9nZXRfbGluZV93ZWlnaHQoICRhcmd7bGluZV93ZWlnaHR9ICk7CisgICAgICAgICRhcmVhLT57X2xpbmVfd2VpZ2h0fSA9ICR3ZWlnaHQ7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2NoYXJ0YXJlYSgpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgY2hhcnQgY2hhcnRhcmVhLgorIworc3ViIHNldF9jaGFydGFyZWEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlYXJnICA9IEBfOworICAgIHJldHVybiB1bmxlc3Mga2V5cyAlYXJnOworCisgICAgbXkgJGFyZWEgPSAkc2VsZi0+e19jaGFydGFyZWF9OworCisgICAgIyBFbWJlZGRlZCBhdXRvbWF0aWMgbGluZSB3ZWlnaHQgaGFzIGEgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWUuCisgICAgJGFyZWEtPntfbGluZV93ZWlnaHR9ID0gMHhGRkZGIGlmICRzZWxmLT57X2VtYmVkZGVkfTsKKworCisgICAgIyBTZXQgdGhlIGNoYXJ0IGJhY2tncm91bmQgY29sb3VyLgorICAgIGlmICggZGVmaW5lZCAkYXJne2NvbG9yfSApIHsKKyAgICAgICAgbXkgKCAkaW5kZXgsICRyZ2IgKSA9ICRzZWxmLT5fZ2V0X2NvbG9yX2luZGljZXMoICRhcmd7Y29sb3J9ICk7CisgICAgICAgIGlmICggZGVmaW5lZCAkaW5kZXggKSB7CisgICAgICAgICAgICAkYXJlYS0+e19mZ19jb2xvcl9pbmRleH0gPSAkaW5kZXg7CisgICAgICAgICAgICAkYXJlYS0+e19mZ19jb2xvcl9yZ2J9ICAgPSAkcmdiOworICAgICAgICAgICAgJGFyZWEtPntfYmdfY29sb3JfaW5kZXh9ID0gMHgwODsKKyAgICAgICAgICAgICRhcmVhLT57X2JnX2NvbG9yX3JnYn0gICA9IDB4MDAwMDAwOworICAgICAgICAgICAgJGFyZWEtPntfYXJlYV9wYXR0ZXJufSAgID0gMTsKKyAgICAgICAgICAgICRhcmVhLT57X2FyZWFfb3B0aW9uc30gICA9IDB4MDAwMCBpZiAkc2VsZi0+e19lbWJlZGRlZH07CisgICAgICAgICAgICAkYXJlYS0+e192aXNpYmxlfSAgICAgICAgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgIyBTZXQgdGhlIGJvcmRlciBsaW5lIGNvbG91ci4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3tsaW5lX2NvbG9yfSApIHsKKyAgICAgICAgbXkgKCAkaW5kZXgsICRyZ2IgKSA9ICRzZWxmLT5fZ2V0X2NvbG9yX2luZGljZXMoICRhcmd7bGluZV9jb2xvcn0gKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkICRpbmRleCApIHsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfaW5kZXh9ID0gJGluZGV4OworICAgICAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9yZ2J9ICAgPSAkcmdiOworICAgICAgICAgICAgJGFyZWEtPntfbGluZV9wYXR0ZXJufSAgICAgPSAweDAwOworICAgICAgICAgICAgJGFyZWEtPntfbGluZV9vcHRpb25zfSAgICAgPSAweDAwMDA7CisgICAgICAgICAgICAkYXJlYS0+e192aXNpYmxlfSAgICAgICAgICA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgcGF0dGVybi4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3tsaW5lX3BhdHRlcm59ICkgeworICAgICAgICBteSAkcGF0dGVybiA9ICRzZWxmLT5fZ2V0X2xpbmVfcGF0dGVybiggJGFyZ3tsaW5lX3BhdHRlcm59ICk7CisgICAgICAgICRhcmVhLT57X2xpbmVfcGF0dGVybn0gICAgID0gJHBhdHRlcm47CisgICAgICAgICRhcmVhLT57X2xpbmVfb3B0aW9uc30gICAgID0gMHgwMDAwOworICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fSA9IDB4NEYgaWYgIWRlZmluZWQgJGFyZ3tsaW5lX2NvbG9yfTsKKyAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gICAgICAgICAgPSAxOworICAgIH0KKworICAgICMgU2V0IHRoZSBib3JkZXIgbGluZSB3ZWlnaHQuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7bGluZV93ZWlnaHR9ICkgeworICAgICAgICBteSAkd2VpZ2h0ID0gJHNlbGYtPl9nZXRfbGluZV93ZWlnaHQoICRhcmd7bGluZV93ZWlnaHR9ICk7CisgICAgICAgICRhcmVhLT57X2xpbmVfd2VpZ2h0fSAgICAgID0gJHdlaWdodDsKKyAgICAgICAgJGFyZWEtPntfbGluZV9vcHRpb25zfSAgICAgPSAweDAwMDA7CisgICAgICAgICRhcmVhLT57X2xpbmVfcGF0dGVybn0gICAgID0gMHgwMCBpZiAhZGVmaW5lZCAkYXJne2xpbmVfcGF0dGVybn07CisgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfaW5kZXh9ID0gMHg0RiBpZiAhZGVmaW5lZCAkYXJne2xpbmVfY29sb3J9OworICAgICAgICAkYXJlYS0+e192aXNpYmxlfSAgICAgICAgICA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgSW50ZXJuYWwgbWV0aG9kcy4gVGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIG1ldGhvZHMgYXJlIHVzZWQgZm9yIHRoZSBpbnRlcm5hbAorIyBzdHJ1Y3R1cmluZyBvZiB0aGUgQ2hhcnQgb2JqZWN0IGFuZCBmaWxlIGZvcm1hdC4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wcmVwZW5kKCksIG92ZXJyaWRkZW4uCisjCisjIFRoZSBwYXJlbnQgV29ya3NoZWV0IGNsYXNzIG5lZWRzIHRvIHN0b3JlIHNvbWUgZGF0YSBpbiBtZW1vcnkgYW5kIHNvbWUgaW4KKyMgdGVtcG9yYXJ5IGZpbGVzIGZvciBlZmZpY2llbmN5LiBUaGUgQ2hhcnQqIGNsYXNzZXMgZG9uJ3QgbmVlZCB0byBkbyB0aGlzCisjIHNpbmNlIHRoZXkgYXJlIGRlYWxpbmcgd2l0aCBzbWFsbGVyIGFtb3VudHMgb2YgZGF0YSBzbyB3ZSBvdmVycmlkZQorIyBfcHJlcGVuZCgpIHRvIHR1cm4gaXQgaW50byBhbiBfYXBwZW5kKCkgbWV0aG9kLiBUaGlzIGFsbG93cyBmb3IgYSBtb3JlCisjIG5hdHVyYWwgbWV0aG9kIGNhbGxpbmcgb3JkZXIuCisjCitzdWIgX3ByZXBlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9ID0gMDsKKworICAgIHJldHVybiAkc2VsZi0+X2FwcGVuZCggQF8gKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jbG9zZSgpLCBvdmVycmlkZGVuLgorIworIyBDcmVhdGUgYW5kIHN0b3JlIHRoZSBDaGFydCBkYXRhIHN0cnVjdHVyZXMuCisjCitzdWIgX2Nsb3NlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIElnbm9yZSBhbnkgZGF0YSB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4gc28gZmFyIHNpbmNlIGl0IGlzIHByb2JhYmx5CisgICAgIyBmcm9tIHVud2FudGVkIFdvcmtzaGVldCBtZXRob2QgY2FsbHMuCisgICAgJHNlbGYtPntfZGF0YX0gPSAnJzsKKworICAgICMgVE9ETy4gQ2hlY2sgZm9yIGNoYXJ0cyB3aXRob3V0IGEgc2VyaWVzPworCisgICAgIyBTdG9yZSB0aGUgY2hhcnQgQk9GLgorICAgICRzZWxmLT5fc3RvcmVfYm9mKCAweDAwMjAgKTsKKworICAgICMgU3RvcmUgdGhlIHBhZ2UgaGVhZGVyCisgICAgJHNlbGYtPl9zdG9yZV9oZWFkZXIoKTsKKworICAgICMgU3RvcmUgdGhlIHBhZ2UgZm9vdGVyCisgICAgJHNlbGYtPl9zdG9yZV9mb290ZXIoKTsKKworICAgICMgU3RvcmUgdGhlIHBhZ2UgaG9yaXpvbnRhbCBjZW50ZXJpbmcKKyAgICAkc2VsZi0+X3N0b3JlX2hjZW50ZXIoKTsKKworICAgICMgU3RvcmUgdGhlIHBhZ2UgdmVydGljYWwgY2VudGVyaW5nCisgICAgJHNlbGYtPl9zdG9yZV92Y2VudGVyKCk7CisKKyAgICAjIFN0b3JlIHRoZSBsZWZ0IG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX2xlZnQoKTsKKworICAgICMgU3RvcmUgdGhlIHJpZ2h0IG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX3JpZ2h0KCk7CisKKyAgICAjIFN0b3JlIHRoZSB0b3AgbWFyZ2luCisgICAgJHNlbGYtPl9zdG9yZV9tYXJnaW5fdG9wKCk7CisKKyAgICAjIFN0b3JlIHRoZSBib3R0b20gbWFyZ2luCisgICAgJHNlbGYtPl9zdG9yZV9tYXJnaW5fYm90dG9tKCk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIHNldHVwCisgICAgJHNlbGYtPl9zdG9yZV9zZXR1cCgpOworCisgICAgIyBTdG9yZSB0aGUgc2hlZXQgcGFzc3dvcmQKKyAgICAkc2VsZi0+X3N0b3JlX3Bhc3N3b3JkKCk7CisKKyAgICAjIFN0YXJ0IG9mIENoYXJ0IHNwZWNpZmljIHJlY29yZHMuCisKKyAgICAjIFN0b3JlIHRoZSBGQkkgZm9udCByZWNvcmRzLgorICAgICRzZWxmLT5fc3RvcmVfZmJpKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2ZvbnRfbnVtYmVyc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZmJpKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2ZvbnRfc2VyaWVzfSB9ICk7CisgICAgJHNlbGYtPl9zdG9yZV9mYmkoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfZm9udF90aXRsZX0gfSApOworICAgICRzZWxmLT5fc3RvcmVfZmJpKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2ZvbnRfYXhlc30gfSApOworCisgICAgIyBJZ25vcmUgVU5JVFMgcmVjb3JkLgorCisgICAgIyBTdG9yZSB0aGUgQ2hhcnQgc3ViLXN0cmVhbS4KKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0X3N0cmVhbSgpOworCisgICAgIyBBcHBlbmQgdGhlIHNoZWV0IGRpbWVuc2lvbnMKKyAgICAkc2VsZi0+X3N0b3JlX2RpbWVuc2lvbnMoKTsKKworICAgICMgVE9ETyBhZGQgU0lOREVYIGFuZCBOVU1CRVIgcmVjb3Jkcy4KKworICAgIGlmICggISRzZWxmLT57X2VtYmVkZGVkfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV93aW5kb3cyKCk7CisgICAgfQorCisgICAgJHNlbGYtPl9zdG9yZV9lb2YoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV93aW5kb3cyKCksIG92ZXJyaWRkZW4uCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIFdpbmRvdzIuIE5vdGUsIHRoaXMgb3ZlcnJpZGVzIHRoZSBwYXJlbnQgV29ya3NoZWV0CisjIHJlY29yZCBiZWNhdXNlIHRoZSBDaGFydCB2ZXJzaW9uIG9mIHRoZSByZWNvcmQgaXMgc21hbGxlciBhbmQgaXMgdXNlZAorIyBtYWlubHkgdG8gaW5kaWNhdGUgaWYgdGhlIGNoYXJ0IHRhYiBpcyBzZWxlY3RlZCBvciBub3QuCisjCitzdWIgX3N0b3JlX3dpbmRvdzIgeworCisgICAgdXNlIGludGVnZXI7ICAgICMgQXZvaWQgPDwgc2hpZnQgYnVnIGluIFBlcmwgNS42LjAgb24gSFAtVVgKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDIzRTsgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDBBOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKyAgICBteSAkZ3JiaXQgICA9IDB4MDAwMDsgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkcndUb3AgICA9IDB4MDAwMDsgICAgIyBUb3AgdmlzaWJsZSByb3cKKyAgICBteSAkY29sTGVmdCA9IDB4MDAwMDsgICAgIyBMZWZ0bW9zdCB2aXNpYmxlIGNvbHVtbgorICAgIG15ICRyZ2JIZHIgID0gMHgwMDAwOyAgICAjIFJvdy9jb2wgaGVhZGluZywgZ3JpZCBjb2xvcgorCisgICAgIyBUaGUgb3B0aW9ucyBmbGFncyB0aGF0IGNvbXByaXNlICRncmJpdAorICAgIG15ICRmRHNwRm1sYSAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyAwIC0gYml0CisgICAgbXkgJGZEc3BHcmlkICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDEKKyAgICBteSAkZkRzcFJ3Q29sICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgMgorICAgIG15ICRmRnJvemVuICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyAzCisgICAgbXkgJGZEc3BaZXJvcyAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDQKKyAgICBteSAkZkRlZmF1bHRIZHIgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgNQorICAgIG15ICRmQXJhYmljICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyA2CisgICAgbXkgJGZEc3BHdXRzICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDcKKyAgICBteSAkZkZyb3plbk5vU3BsaXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgMCAtIGJpdAorICAgIG15ICRmU2VsZWN0ZWQgICAgICA9ICRzZWxmLT57X3NlbGVjdGVkfTsgICAgIyAxCisgICAgbXkgJGZQYWdlZCAgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDIKKyAgICBteSAkZkJyZWFrUHJldmlldyAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgMworCisgICAgIzw8PCBQZXJsdGlkeSBpZ25vcmUgdGhpcy4KKyAgICAkZ3JiaXQgICAgICAgICAgICAgPSAkZkRzcEZtbGE7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZEc3BHcmlkICAgICAgIDw8IDE7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZEc3BSd0NvbCAgICAgIDw8IDI7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZGcm96ZW4gICAgICAgIDw8IDM7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZEc3BaZXJvcyAgICAgIDw8IDQ7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZEZWZhdWx0SGRyICAgIDw8IDU7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZBcmFiaWMgICAgICAgIDw8IDY7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZEc3BHdXRzICAgICAgIDw8IDc7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZGcm96ZW5Ob1NwbGl0IDw8IDg7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZTZWxlY3RlZCAgICAgIDw8IDk7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZQYWdlZCAgICAgICAgIDw8IDEwOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmQnJlYWtQcmV2aWV3ICA8PCAxMTsKKyAgICAjPj4+CisKKyAgICBteSAkaGVhZGVyID0gcGFjayggInZ2IiwgJHJlY29yZCwgJGxlbmd0aCApOworICAgIG15ICRkYXRhID0gcGFjayggInZ2dlYiLCAkZ3JiaXQsICRyd1RvcCwgJGNvbExlZnQsICRyZ2JIZHIgKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhcnNlX3Nlcmllc19mb3JtdWxhKCkKKyMKKyMgUGFyc2UgdGhlIGZvcm11bGEgdXNlZCB0byBkZWZpbmUgYSBzZXJpZXMuIFdlIGFsc28gZXh0cmFjdCBzb21lIHJhbmdlCisjIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciBfc3RvcmVfc2VyaWVzKCkgYW5kIHRoZSBTRVJJRVMgcmVjb3JkLgorIworc3ViIF9wYXJzZV9zZXJpZXNfZm9ybXVsYSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGZvcm11bGEgID0gJF9bMF07CisgICAgbXkgJGVuY29kaW5nID0gMDsKKyAgICBteSAkbGVuZ3RoICAgPSAwOworICAgIG15ICRjb3VudCAgICA9IDA7CisgICAgbXkgQHRva2VuczsKKworICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkZm9ybXVsYTsKKworICAgICMgU3RyaXAgdGhlID0gc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtdWxhIHN0cmluZworICAgICRmb3JtdWxhID1+IHMoXj0pKCk7CisKKyAgICAjIFBhcnNlIHRoZSBmb3JtdWxhIHVzaW5nIHRoZSBwYXJzZXIgaW4gRm9ybXVsYS5wbQorICAgIG15ICRwYXJzZXIgPSAkc2VsZi0+e19wYXJzZXJ9OworCisgICAgIyBJbiBvcmRlciB0byByYWlzZSBmb3JtdWxhIGVycm9ycyBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBjYWxsaW5nCisgICAgIyBwcm9ncmFtIHdlIHVzZSBhbiBldmFsIGJsb2NrIGFuZCByZS1yYWlzZSB0aGUgZXJyb3IgZnJvbSBoZXJlLgorICAgICMKKyAgICBldmFsIHsgQHRva2VucyA9ICRwYXJzZXItPnBhcnNlX2Zvcm11bGEoICRmb3JtdWxhICkgfTsKKworICAgIGlmICggJEAgKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAgICMgU3RyaXAgdGhlIFxuIHVzZWQgaW4gdGhlIEZvcm11bGEucG0gZGllKCkuCisgICAgICAgIGNyb2FrICRAOyAgICAgICAgICMgUmUtcmFpc2UgdGhlIGVycm9yLgorICAgIH0KKworICAgICMgRm9yY2UgcmFuZ2VzIHRvIGJlIGEgcmVmZXJlbmNlIGNsYXNzLgorICAgIHMvX3JlZjNkL19yZWYzZFIvICAgICBmb3IgQHRva2VuczsKKyAgICBzL19yYW5nZTNkL19yYW5nZTNkUi8gZm9yIEB0b2tlbnM7CisgICAgcy9fbmFtZS9fbmFtZVIvICAgICAgIGZvciBAdG9rZW5zOworCisgICAgIyBQYXJzZSB0aGUgdG9rZW5zIGludG8gYSBmb3JtdWxhIHN0cmluZy4KKyAgICAkZm9ybXVsYSA9ICRwYXJzZXItPnBhcnNlX3Rva2VucyggQHRva2VucyApOworCisgICAgIyBSZXR1cm4gZm9ybXVsYSBmb3IgYSBzaW5nbGUgY2VsbCBhcyB1c2VkIGJ5IHRpdGxlIGFuZCBzZXJpZXMgbmFtZS4KKyAgICBpZiAoIG9yZCAkZm9ybXVsYSA9PSAweDNBICkgeworICAgICAgICByZXR1cm4gJGZvcm11bGE7CisgICAgfQorCisgICAgIyBFeHRyYWN0IHRoZSByYW5nZSBmcm9tIHRoZSBwYXJzZSBmb3JtdWxhLgorICAgIGlmICggb3JkICRmb3JtdWxhID09IDB4M0IgKSB7CisgICAgICAgIG15ICggJHB0ZywgJGV4dF9yZWYsICRyb3dfMSwgJHJvd18yLCAkY29sXzEsICRjb2xfMiApID0gdW5wYWNrICdDdjUnLAorICAgICAgICAgICRmb3JtdWxhOworCisgICAgICAgICMgVE9ETy4gUmVtb3ZlIGhpZ2ggYml0IG9uIHJlbGF0aXZlIHJlZmVyZW5jZXMuCisgICAgICAgICRjb3VudCA9ICRyb3dfMiAtICRyb3dfMSArIDE7CisgICAgfQorCisgICAgcmV0dXJuICggJGZvcm11bGEsICRjb3VudCApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9lbmNvZGVfdXRmMTYoKQorIworIyBDb252ZXJ0IFVURjggc3RyaW5ncyB1c2VkIGluIHRoZSBjaGFydCB0byBVVEYxNi4KKyMKK3N1YiBfZW5jb2RlX3V0ZjE2IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkc3RyaW5nID0gc2hpZnQ7CisgICAgbXkgJGVuY29kaW5nID0gc2hpZnQgfHwgMDsKKworICAgICMgRXhpdCBpZiB0aGUgJHN0cmluZyBpc24ndCBkZWZpbmVkLCBpLmUuLCBoYXNuJ3QgYmVlbiBzZXQgYnkgdXNlci4KKyAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKSBpZiAhZGVmaW5lZCAkc3RyaW5nOworCisgICAgIyBSZXR1cm4gaWYgZW5jb2RpbmcgaXMgc2V0LCBpLmUuLCBzdHJpbmcgaGFzIGJlZW4gbWFudWFsbHkgZW5jb2RlZC4KKyAgICAjcmV0dXJuICggdW5kZWYsIHVuZGVmICkgaWYgJHN0cmluZyA9PSAxOworCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICggJF0gPj0gNS4wMDggKSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmICggRW5jb2RlOjppc191dGY4KCAkc3RyaW5nICkgKSB7CisgICAgICAgICAgICAkc3RyaW5nID0gRW5jb2RlOjplbmNvZGUoICJVVEYtMTZCRSIsICRzdHJpbmcgKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIENoYXJ0IHN0cmluZ3MgYXJlIGxpbWl0ZWQgdG8gMjU1IGNoYXJhY3RlcnMuCisgICAgbXkgJGxpbWl0ID0gJGVuY29kaW5nID8gMjU1ICogMiA6IDI1NTsKKworICAgIGlmICggbGVuZ3RoICRzdHJpbmcgPj0gJGxpbWl0ICkgeworCisgICAgICAgICMgdHJ1bmNhdGUgdGhlIHN0cmluZyBhbmQgcmFpc2UgYSB3YXJuaW5nLgorICAgICAgICAkc3RyaW5nID0gc3Vic3RyICRzdHJpbmcsIDAsICRsaW1pdDsKKyAgICAgICAgY2FycCAnQ2hhcnQgc3RyaW5ncyBtdXN0IGJlIGxlc3MgdGhhbiAyNTYgY2hhcmFjdGVycy4gJworICAgICAgICAgIC4gJ1N0cmluZyB0cnVuY2F0ZWQnOworICAgIH0KKworICAgIHJldHVybiAoICRzdHJpbmcsICRlbmNvZGluZyApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9jb2xvcl9pbmRpY2VzKCkKKyMKKyMgQ29udmVydCB0aGUgdXNlciBzcGVjaWZpZWQgY29sb3VyIGluZGV4IG9yIHN0cmluZyB0byBhbiBjb2xvdXIgaW5kZXggYW5kCisjIFJHQiBjb2xvdXIgbnVtYmVyLgorIworc3ViIF9nZXRfY29sb3JfaW5kaWNlcyB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkY29sb3IgPSBzaGlmdDsKKyAgICBteSAkaW5kZXg7CisgICAgbXkgJHJnYjsKKworICAgIHJldHVybiAoIHVuZGVmLCB1bmRlZiApIGlmICFkZWZpbmVkICRjb2xvcjsKKworICAgIG15ICVjb2xvcnMgPSAoCisgICAgICAgIGFxdWEgICAgPT4gMHgwRiwKKyAgICAgICAgY3lhbiAgICA9PiAweDBGLAorICAgICAgICBibGFjayAgID0+IDB4MDgsCisgICAgICAgIGJsdWUgICAgPT4gMHgwQywKKyAgICAgICAgYnJvd24gICA9PiAweDEwLAorICAgICAgICBtYWdlbnRhID0+IDB4MEUsCisgICAgICAgIGZ1Y2hzaWEgPT4gMHgwRSwKKyAgICAgICAgZ3JheSAgICA9PiAweDE3LAorICAgICAgICBncmV5ICAgID0+IDB4MTcsCisgICAgICAgIGdyZWVuICAgPT4gMHgxMSwKKyAgICAgICAgbGltZSAgICA9PiAweDBCLAorICAgICAgICBuYXZ5ICAgID0+IDB4MTIsCisgICAgICAgIG9yYW5nZSAgPT4gMHgzNSwKKyAgICAgICAgcGluayAgICA9PiAweDIxLAorICAgICAgICBwdXJwbGUgID0+IDB4MTQsCisgICAgICAgIHJlZCAgICAgPT4gMHgwQSwKKyAgICAgICAgc2lsdmVyICA9PiAweDE2LAorICAgICAgICB3aGl0ZSAgID0+IDB4MDksCisgICAgICAgIHllbGxvdyAgPT4gMHgwRCwKKyAgICApOworCisKKyAgICAjIENoZWNrIGZvciB0aGUgdmFyaW91cyBzdXBwb3J0ZWQgY29sb3VyIGluZGV4L25hbWUgcG9zc2liaWxpdGllcy4KKyAgICBpZiAoIGV4aXN0cyAkY29sb3JzeyRjb2xvcn0gKSB7CisKKyAgICAgICAgIyBDb2xvdXIgbWF0Y2hlcyBvbmUgb2YgdGhlIHN1cHBvcnRlZCBjb2xvdXIgbmFtZXMuCisgICAgICAgICRpbmRleCA9ICRjb2xvcnN7JGNvbG9yfTsKKyAgICB9CisgICAgZWxzaWYgKCAkY29sb3IgPX4gbS9cRC8gKSB7CisKKyAgICAgICAgIyBSZXR1cm4gdW5kZWYgaWYgJGNvbG9yIGlzIGEgc3RyaW5nIGJ1dCBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgb25lcy4KKyAgICAgICAgcmV0dXJuICggdW5kZWYsIHVuZGVmICk7CisgICAgfQorICAgIGVsc2lmICggJGNvbG9yIDwgOCB8fCAkY29sb3IgPiA2MyApIHsKKworICAgICAgICAjIFJldHVybiB1bmRlZiBpZiBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCisgICAgICAgIHJldHVybiAoIHVuZGVmLCB1bmRlZiApOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIFdlIHNob3VsZCBoYXZlIGEgdmFsaWQgY29sb3IgaW5kZXggaW4gYSB2YWxpZCByYW5nZS4KKyAgICAgICAgJGluZGV4ID0gJGNvbG9yOworICAgIH0KKworICAgICRyZ2IgPSAkc2VsZi0+X2dldF9jb2xvcl9yYmcoICRpbmRleCApOworICAgIHJldHVybiAoICRpbmRleCwgJHJnYiApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9jb2xvcl9yYmcoKQorIworIyBHZXQgdGhlIFJlZEdyZWVuQmx1ZSBudW1iZXIgZm9yIHRoZSBjb2xvdXIgaW5kZXggZnJvbSB0aGUgV29ya2Jvb2sgcGFsZXR0ZS4KKyMKK3N1YiBfZ2V0X2NvbG9yX3JiZyB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkaW5kZXggPSBzaGlmdDsKKworICAgICMgQWRqdXN0IGNvbG91ciBpbmRleCBmcm9tIDgtNjMgKHVzZXIgcmFuZ2UpIHRvIDAtNTUgKEV4Y2VsIHJhbmdlKS4KKyAgICAkaW5kZXggLT0gODsKKworICAgIG15IEByZWRfZ3JlZW5fYmx1ZSA9IEB7ICRzZWxmLT57X3BhbGV0dGV9LT5bJGluZGV4XSB9OworICAgIHJldHVybiB1bnBhY2sgJ1YnLCBwYWNrICdDKicsIEByZWRfZ3JlZW5fYmx1ZTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfbGluZV9wYXR0ZXJuKCkKKyMKKyMgR2V0IHRoZSBFeGNlbCBjaGFydCBpbmRleCBmb3IgbGluZSBwYXR0ZXJuIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHVzZXIKKyMgZGVmaW5lZCB2YWx1ZS4KKyMKK3N1YiBfZ2V0X2xpbmVfcGF0dGVybiB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICR2YWx1ZSAgID0gbGMgc2hpZnQ7CisgICAgbXkgJGRlZmF1bHQgPSAwOworICAgIG15ICRwYXR0ZXJuOworCisgICAgbXkgJXBhdHRlcm5zID0gKAorICAgICAgICAwICAgICAgICAgICAgICA9PiA1LAorICAgICAgICAxICAgICAgICAgICAgICA9PiAwLAorICAgICAgICAyICAgICAgICAgICAgICA9PiAxLAorICAgICAgICAzICAgICAgICAgICAgICA9PiAyLAorICAgICAgICA0ICAgICAgICAgICAgICA9PiAzLAorICAgICAgICA1ICAgICAgICAgICAgICA9PiA0LAorICAgICAgICA2ICAgICAgICAgICAgICA9PiA3LAorICAgICAgICA3ICAgICAgICAgICAgICA9PiA2LAorICAgICAgICA4ICAgICAgICAgICAgICA9PiA4LAorICAgICAgICAnc29saWQnICAgICAgICA9PiAwLAorICAgICAgICAnZGFzaCcgICAgICAgICA9PiAxLAorICAgICAgICAnZG90JyAgICAgICAgICA9PiAyLAorICAgICAgICAnZGFzaC1kb3QnICAgICA9PiAzLAorICAgICAgICAnZGFzaC1kb3QtZG90JyA9PiA0LAorICAgICAgICAnbm9uZScgICAgICAgICA9PiA1LAorICAgICAgICAnZGFyay1ncmF5JyAgICA9PiA2LAorICAgICAgICAnbWVkaXVtLWdyYXknICA9PiA3LAorICAgICAgICAnbGlnaHQtZ3JheScgICA9PiA4LAorICAgICk7CisKKyAgICBpZiAoIGV4aXN0cyAkcGF0dGVybnN7JHZhbHVlfSApIHsKKyAgICAgICAgJHBhdHRlcm4gPSAkcGF0dGVybnN7JHZhbHVlfTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRwYXR0ZXJuID0gJGRlZmF1bHQ7CisgICAgfQorCisgICAgcmV0dXJuICRwYXR0ZXJuOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9saW5lX3dlaWdodCgpCisjCisjIEdldCB0aGUgRXhjZWwgY2hhcnQgaW5kZXggZm9yIGxpbmUgd2VpZ2h0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHVzZXIKKyMgZGVmaW5lZCB2YWx1ZS4KKyMKK3N1YiBfZ2V0X2xpbmVfd2VpZ2h0IHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJHZhbHVlICAgPSBsYyBzaGlmdDsKKyAgICBteSAkZGVmYXVsdCA9IDA7CisgICAgbXkgJHdlaWdodDsKKworICAgIG15ICV3ZWlnaHRzID0gKAorICAgICAgICAxICAgICAgICAgID0+IC0xLAorICAgICAgICAyICAgICAgICAgID0+IDAsCisgICAgICAgIDMgICAgICAgICAgPT4gMSwKKyAgICAgICAgNCAgICAgICAgICA9PiAyLAorICAgICAgICAnaGFpcmxpbmUnID0+IC0xLAorICAgICAgICAnbmFycm93JyAgID0+IDAsCisgICAgICAgICdtZWRpdW0nICAgPT4gMSwKKyAgICAgICAgJ3dpZGUnICAgICA9PiAyLAorICAgICk7CisKKyAgICBpZiAoIGV4aXN0cyAkd2VpZ2h0c3skdmFsdWV9ICkgeworICAgICAgICAkd2VpZ2h0ID0gJHdlaWdodHN7JHZhbHVlfTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR3ZWlnaHQgPSAkZGVmYXVsdDsKKyAgICB9CisKKyAgICByZXR1cm4gJHdlaWdodDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF9zdHJlYW0oKQorIworIyBTdG9yZSB0aGUgQ0hBUlQgcmVjb3JkIGFuZCBpdCdzIHN1YnN0cmVhbXMuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydCggQHsgJHNlbGYtPntfY29uZmlnfS0+e19jaGFydH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworCisgICAgIyBJZ25vcmUgU0NMIHJlY29yZCBmb3Igbm93LgorICAgICRzZWxmLT5fc3RvcmVfcGxvdGdyb3d0aCgpOworCisgICAgaWYgKCAkc2VsZi0+e19jaGFydGFyZWF9LT57X3Zpc2libGV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0YXJlYV9mcmFtZV9zdHJlYW0oKTsKKyAgICB9CisKKyAgICAjIFN0b3JlIFNFUklFUyBzdHJlYW0gZm9yIGVhY2ggc2VyaWVzLgorICAgIG15ICRpbmRleCA9IDA7CisgICAgZm9yIG15ICRzZXJpZXMgKCBAeyAkc2VsZi0+e19zZXJpZXN9IH0gKSB7CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXNfc3RyZWFtKAorICAgICAgICAgICAgX2luZGV4ICAgICAgICAgICAgPT4gJGluZGV4LAorICAgICAgICAgICAgX3ZhbHVlX2Zvcm11bGEgICAgPT4gJHNlcmllcy0+e192YWx1ZXN9LT5bMF0sCisgICAgICAgICAgICBfdmFsdWVfY291bnQgICAgICA9PiAkc2VyaWVzLT57X3ZhbHVlc30tPlsxXSwKKyAgICAgICAgICAgIF9jYXRlZ29yeV9jb3VudCAgID0+ICRzZXJpZXMtPntfY2F0ZWdvcmllc30tPlsxXSwKKyAgICAgICAgICAgIF9jYXRlZ29yeV9mb3JtdWxhID0+ICRzZXJpZXMtPntfY2F0ZWdvcmllc30tPlswXSwKKyAgICAgICAgICAgIF9uYW1lICAgICAgICAgICAgID0+ICRzZXJpZXMtPntuYW1lfSwKKyAgICAgICAgICAgIF9uYW1lX2VuY29kaW5nICAgID0+ICRzZXJpZXMtPntuYW1lX2VuY29kaW5nfSwKKyAgICAgICAgICAgIF9uYW1lX2Zvcm11bGEgICAgID0+ICRzZXJpZXMtPntfbmFtZV9mb3JtdWxhfSwKKyAgICAgICAgKTsKKworICAgICAgICAkaW5kZXgrKzsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX3NodHByb3BzKCk7CisKKyAgICAjIFdyaXRlIHRoZSBURVhUIHN0cmVhbXMuCisgICAgZm9yIG15ICRmb250X2luZGV4ICggNSAuLiA2ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX2RlZmF1bHR0ZXh0KCk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfc2VyaWVzX3RleHRfc3RyZWFtKCAkZm9udF9pbmRleCApOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfYXhlc3VzZWQoIDEgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXNwYXJlbnRfc3RyZWFtKCk7CisKKyAgICBpZiAoIGRlZmluZWQgJHNlbGYtPntfdGl0bGVfbmFtZX0gfHwgZGVmaW5lZCAkc2VsZi0+e190aXRsZV9mb3JtdWxhfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV90aXRsZV90ZXh0X3N0cmVhbSgpOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJpZXNfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIFNFUklFUyBjaGFydCBzdWJzdHJlYW0uCisjCitzdWIgX3N0b3JlX3Nlcmllc19zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlYXJnICA9IEBfOworCisgICAgbXkgJG5hbWVfdHlwZSAgICAgPSAkYXJne19uYW1lX2Zvcm11bGF9ICAgICA/IDIgOiAxOworICAgIG15ICR2YWx1ZV90eXBlICAgID0gJGFyZ3tfdmFsdWVfZm9ybXVsYX0gICAgPyAyIDogMDsKKyAgICBteSAkY2F0ZWdvcnlfdHlwZSA9ICRhcmd7X2NhdGVnb3J5X2Zvcm11bGF9ID8gMiA6IDA7CisKKyAgICAkc2VsZi0+X3N0b3JlX3NlcmllcyggJGFyZ3tfdmFsdWVfY291bnR9LCAkYXJne19jYXRlZ29yeV9jb3VudH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKworICAgICMgU3RvcmUgdGhlIFNlcmllcyBuYW1lIEFJIHJlY29yZC4KKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAwLCAkbmFtZV90eXBlLCAkYXJne19uYW1lX2Zvcm11bGF9ICk7CisgICAgaWYgKCBkZWZpbmVkICRhcmd7X25hbWV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3Nlcmllc3RleHQoICRhcmd7X25hbWV9LCAkYXJne19uYW1lX2VuY29kaW5nfSApOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfYWkoIDEsICR2YWx1ZV90eXBlLCAgICAkYXJne192YWx1ZV9mb3JtdWxhfSApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDIsICRjYXRlZ29yeV90eXBlLCAkYXJne19jYXRlZ29yeV9mb3JtdWxhfSApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDMsIDEsICAgICAgICAgICAgICAnJyApOworCisgICAgJHNlbGYtPl9zdG9yZV9kYXRhZm9ybWF0X3N0cmVhbSggJGFyZ3tfaW5kZXh9LCAkYXJne19pbmRleH0sIDB4RkZGRiApOworICAgICRzZWxmLT5fc3RvcmVfc2VydG9jcnQoIDAgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RhdGFmb3JtYXRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIERBVEFGT1JNQVQgY2hhcnQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9kYXRhZm9ybWF0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHNlcmllc19pbmRleCA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9kYXRhZm9ybWF0KCAkc2VyaWVzX2luZGV4LCAkc2VyaWVzX2luZGV4LCAweEZGRkYgKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlXzNkYmFyc2hhcGUoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Nlcmllc190ZXh0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBzZXJpZXMgVEVYVCBzdWJzdHJlYW0uCisjCitzdWIgX3N0b3JlX3Nlcmllc190ZXh0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGZvbnRfaW5kZXggPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfdGV4dCggQHsgJHNlbGYtPntfY29uZmlnfS0+e19zZXJpZXNfdGV4dH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfcG9zKCBAeyAkc2VsZi0+e19jb25maWd9LT57X3Nlcmllc190ZXh0X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZm9udHgoICRmb250X2luZGV4ICk7CisgICAgJHNlbGYtPl9zdG9yZV9haSggMCwgMSwgJycgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3hfYXhpc190ZXh0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBYLWF4aXMgVEVYVCBzdWJzdHJlYW0uCisjCitzdWIgX3N0b3JlX3hfYXhpc190ZXh0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGZvcm11bGEgPSAkc2VsZi0+e194X2F4aXNfZm9ybXVsYX07CisgICAgbXkgJGFpX3R5cGUgPSAkZm9ybXVsYSA/IDIgOiAxOworCisgICAgJHNlbGYtPl9zdG9yZV90ZXh0KCBAeyAkc2VsZi0+e19jb25maWd9LT57X3hfYXhpc190ZXh0fSB9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV9wb3MoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfeF9heGlzX3RleHRfcG9zfSB9ICk7CisgICAgJHNlbGYtPl9zdG9yZV9mb250eCggOCApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDAsICRhaV90eXBlLCAkZm9ybXVsYSApOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3hfYXhpc19uYW1lfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXN0ZXh0KCAkc2VsZi0+e194X2F4aXNfbmFtZX0sCisgICAgICAgICAgICAkc2VsZi0+e194X2F4aXNfZW5jb2Rpbmd9LAorICAgICAgICApOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfb2JqZWN0bGluayggMyApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfeV9heGlzX3RleHRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIFktYXhpcyBURVhUIHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfeV9heGlzX3RleHRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkZm9ybXVsYSA9ICRzZWxmLT57X3lfYXhpc19mb3JtdWxhfTsKKyAgICBteSAkYWlfdHlwZSA9ICRmb3JtdWxhID8gMiA6IDE7CisKKyAgICAkc2VsZi0+X3N0b3JlX3RleHQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfeV9heGlzX3RleHR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e195X2F4aXNfdGV4dF9wb3N9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZvbnR4KCA4ICk7CisgICAgJHNlbGYtPl9zdG9yZV9haSggMCwgJGFpX3R5cGUsICRmb3JtdWxhICk7CisKKyAgICBpZiAoIGRlZmluZWQgJHNlbGYtPntfeV9heGlzX25hbWV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3Nlcmllc3RleHQoICRzZWxmLT57X3lfYXhpc19uYW1lfSwKKyAgICAgICAgICAgICRzZWxmLT57X3lfYXhpc19lbmNvZGluZ30sCisgICAgICAgICk7CisgICAgfQorCisgICAgJHNlbGYtPl9zdG9yZV9vYmplY3RsaW5rKCAyICk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9sZWdlbmRfdGV4dF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgbGVnZW5kIFRFWFQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9sZWdlbmRfdGV4dF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfdGV4dCggQHsgJHNlbGYtPntfY29uZmlnfS0+e19sZWdlbmRfdGV4dH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfcG9zKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2xlZ2VuZF90ZXh0X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDAsIDEsICcnICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3RpdGxlX3RleHRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIHRpdGxlIFRFWFQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV90aXRsZV90ZXh0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGZvcm11bGEgPSAkc2VsZi0+e190aXRsZV9mb3JtdWxhfTsKKyAgICBteSAkYWlfdHlwZSA9ICRmb3JtdWxhID8gMiA6IDE7CisKKyAgICAkc2VsZi0+X3N0b3JlX3RleHQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfdGl0bGVfdGV4dH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfcG9zKCBAeyAkc2VsZi0+e19jb25maWd9LT57X3RpdGxlX3RleHRfcG9zfSB9ICk7CisgICAgJHNlbGYtPl9zdG9yZV9mb250eCggNyApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDAsICRhaV90eXBlLCAkZm9ybXVsYSApOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3RpdGxlX25hbWV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3Nlcmllc3RleHQoICRzZWxmLT57X3RpdGxlX25hbWV9LAorICAgICAgICAgICAgJHNlbGYtPntfdGl0bGVfZW5jb2Rpbmd9LAorICAgICAgICApOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfb2JqZWN0bGluayggMSApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc3BhcmVudF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgQVhJU1BBUkVOVCBjaGFydCBzdWJzdHJlYW0uCisjCitzdWIgX3N0b3JlX2F4aXNwYXJlbnRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXNwYXJlbnQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfYXhpc3BhcmVudH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfcG9zKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2F4aXNwYXJlbnRfcG9zfSB9ICk7CisgICAgJHNlbGYtPl9zdG9yZV9heGlzX2NhdGVnb3J5X3N0cmVhbSgpOworICAgICRzZWxmLT5fc3RvcmVfYXhpc192YWx1ZXNfc3RyZWFtKCk7CisKKyAgICBpZiAoIGRlZmluZWQgJHNlbGYtPntfeF9heGlzX25hbWV9IHx8IGRlZmluZWQgJHNlbGYtPntfeF9heGlzX2Zvcm11bGF9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3hfYXhpc190ZXh0X3N0cmVhbSgpOworICAgIH0KKworICAgIGlmICggZGVmaW5lZCAkc2VsZi0+e195X2F4aXNfbmFtZX0gfHwgZGVmaW5lZCAkc2VsZi0+e195X2F4aXNfZm9ybXVsYX0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfeV9heGlzX3RleHRfc3RyZWFtKCk7CisgICAgfQorCisgICAgaWYgKCAkc2VsZi0+e19wbG90YXJlYX0tPntfdmlzaWJsZX0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfcGxvdGFyZWEoKTsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9wbG90YXJlYV9mcmFtZV9zdHJlYW0oKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0Zm9ybWF0X3N0cmVhbSgpOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgQVhJUyBjaGFydCBzdWJzdHJlYW0gZm9yIHRoZSBjaGFydCBjYXRlZ29yeS4KKyMKK3N1YiBfc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfYXhpcyggMCApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfY2F0c2VycmFuZ2UoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2F4Y2V4dCgpOworICAgICRzZWxmLT5fc3RvcmVfdGljaygpOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc192YWx1ZXNfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIEFYSVMgY2hhcnQgc3Vic3RyZWFtIGZvciB0aGUgY2hhcnQgdmFsdWVzLgorIworc3ViIF9zdG9yZV9heGlzX3ZhbHVlc19zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfYXhpcyggMSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfdmFsdWVyYW5nZSgpOworICAgICRzZWxmLT5fc3RvcmVfdGljaygpOworICAgICRzZWxmLT5fc3RvcmVfYXhpc2xpbmVmb3JtYXQoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2xpbmVmb3JtYXQoIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDksIDB4MDA0RCApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGxvdGFyZWFfZnJhbWVfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIEZSQU1FIGNoYXJ0IHN1YnN0cmVhbSBmb3IgdGhlIHBsb3RhcmVhLgorIworc3ViIF9zdG9yZV9wbG90YXJlYV9mcmFtZV9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRhcmVhID0gJHNlbGYtPntfcGxvdGFyZWF9OworCisgICAgJHNlbGYtPl9zdG9yZV9mcmFtZSggMHgwMCwgMHgwMyApOworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCgKKyAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9yZ2J9LCAkYXJlYS0+e19saW5lX3BhdHRlcm59LAorICAgICAgICAkYXJlYS0+e19saW5lX3dlaWdodH0sICAgICRhcmVhLT57X2xpbmVfb3B0aW9uc30sCisgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfaW5kZXh9CisgICAgKTsKKworICAgICRzZWxmLT5fc3RvcmVfYXJlYWZvcm1hdCgKKyAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfcmdifSwgICAkYXJlYS0+e19iZ19jb2xvcl9yZ2J9LAorICAgICAgICAkYXJlYS0+e19hcmVhX3BhdHRlcm59LCAgICRhcmVhLT57X2FyZWFfb3B0aW9uc30sCisgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX2luZGV4fSwgJGFyZWEtPntfYmdfY29sb3JfaW5kZXh9CisgICAgKTsKKworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRhcmVhX2ZyYW1lX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBGUkFNRSBjaGFydCBzdWJzdHJlYW0gZm9yIHRoZSBjaGFydGFyZWEuCisjCitzdWIgX3N0b3JlX2NoYXJ0YXJlYV9mcmFtZV9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRhcmVhID0gJHNlbGYtPntfY2hhcnRhcmVhfTsKKworICAgICRzZWxmLT5fc3RvcmVfZnJhbWUoIDB4MDAsIDB4MDIgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2xpbmVmb3JtYXQoCisgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfcmdifSwgJGFyZWEtPntfbGluZV9wYXR0ZXJufSwKKyAgICAgICAgJGFyZWEtPntfbGluZV93ZWlnaHR9LCAgICAkYXJlYS0+e19saW5lX29wdGlvbnN9LAorICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fQorICAgICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoCisgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX3JnYn0sICAgJGFyZWEtPntfYmdfY29sb3JfcmdifSwKKyAgICAgICAgJGFyZWEtPntfYXJlYV9wYXR0ZXJufSwgICAkYXJlYS0+e19hcmVhX29wdGlvbnN9LAorICAgICAgICAkYXJlYS0+e19mZ19jb2xvcl9pbmRleH0sICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fQorICAgICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydGZvcm1hdF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgQ0hBUlRGT1JNQVQgY2hhcnQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9jaGFydGZvcm1hdF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgVGhlIF92YXJ5X2RhdGFfY29sb3IgaXMgc2V0IGJ5IGNsYXNzZXMgdGhhdCBuZWVkIGl0LCBsaWtlIFBpZS4KKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0Zm9ybWF0KCAkc2VsZi0+e192YXJ5X2RhdGFfY29sb3J9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisKKyAgICAjIFN0b3JlIHRoZSBCSUZGIHJlY29yZCB0aGF0IHdpbGwgZGVmaW5lIHRoZSBjaGFydCB0eXBlLgorICAgICRzZWxmLT5fc3RvcmVfY2hhcnRfdHlwZSgpOworCisgICAgIyBOb3RlLCB0aGUgQ0hBUlRGT1JNQVRMSU5LIHJlY29yZCBpcyBvbmx5IHdyaXR0ZW4gYnkgRXhjZWwuCisKKyAgICBpZiAoICRzZWxmLT57X2xlZ2VuZH0tPntfdmlzaWJsZX0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfbGVnZW5kX3N0cmVhbSgpOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtKCk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QgdGhhdCBpcyBvdmVycmlkZGVuIGJ5IHRoZSBzdWItY2xhc3NlcyB0byBkZWZpbmUKKyMgdGhlIGNoYXJ0IHR5cGVzIHN1Y2ggYXMgQ29sdW1uLCBMaW5lLCBQaWUsIGV0Yy4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJrZXJfZGF0YWZvcm1hdF9zdHJlYW0oKQorIworIyBUaGlzIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB0aGF0IGlzIG92ZXJyaWRkZW4gYnkgdGhlIHN1Yi1jbGFzc2VzIHRvIGRlZmluZQorIyBwcm9wZXJ0aWVzIG9mIG1hcmtlcnMsIGxpbmV0eXBlcywgcGllIGZvcm1hdHMgYW5kIG90aGVyLgorIworc3ViIF9zdG9yZV9tYXJrZXJfZGF0YWZvcm1hdF9zdHJlYW0geworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbGVnZW5kX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBMRUdFTkQgY2hhcnQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9sZWdlbmRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2xlZ2VuZCggQHsgJHNlbGYtPntfY29uZmlnfS0+e19sZWdlbmR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19sZWdlbmRfcG9zfSB9ICk7CisgICAgJHNlbGYtPl9zdG9yZV9sZWdlbmRfdGV4dF9zdHJlYW0oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQklGRiBSZWNvcmRzLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlXzNkYmFyc2hhcGUoKQorIworIyBXcml0ZSB0aGUgM0RCQVJTSEFQRSBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfM2RiYXJzaGFwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTA1RjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHJpc2VyICA9IDB4MDA7ICAgICAgIyBTaGFwZSBvZiBiYXNlLgorICAgIG15ICR0YXBlciAgPSAweDAwOyAgICAgICMgQ29sdW1uIHRhcGVyIHR5cGUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRyaXNlcjsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHRhcGVyOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYWkoKQorIworIyBXcml0ZSB0aGUgQUkgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2FpIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgID0gMHgxMDUxOyAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgID0gMHgwMDA4OyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRpZCAgICAgICAgICAgPSAkX1swXTsgICAgICAgICAjIExpbmsgaW5kZXguCisgICAgbXkgJHR5cGUgICAgICAgICA9ICRfWzFdOyAgICAgICAgICMgUmVmZXJlbmNlIHR5cGUuCisgICAgbXkgJGZvcm11bGEgICAgICA9ICRfWzJdOyAgICAgICAgICMgUHJlLXBhcnNlZCBmb3JtdWxhLgorICAgIG15ICRmb3JtYXRfaW5kZXggPSAkX1szXSB8fCAwOyAgICAjIE51bSBmb3JtYXQgaW5kZXguCisgICAgbXkgJGdyYml0ICAgICAgICA9IDB4MDAwMDsgICAgICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGZvcm11bGFfbGVuZ3RoID0gbGVuZ3RoICRmb3JtdWxhOworCisgICAgJGxlbmd0aCArPSAkZm9ybXVsYV9sZW5ndGg7CisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRpZDsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHR5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGZvcm1hdF9pbmRleDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGZvcm11bGFfbGVuZ3RoOworICAgICRkYXRhIC49ICRmb3JtdWxhOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXJlYWZvcm1hdCgpCisjCisjIFdyaXRlIHRoZSBBUkVBRk9STUFUIGNoYXJ0IEJJRkYgcmVjb3JkLiBDb250YWlucyB0aGUgcGF0dGVybnMgYW5kIGNvbG91cnMKKyMgb2YgYSBjaGFydCBhcmVhLgorIworc3ViIF9zdG9yZV9hcmVhZm9ybWF0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgxMDBBOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMTA7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkcmdiRm9yZSAgID0gJF9bMF07ICAgICAjIEZvcmVncm91bmQgUkdCIGNvbG91ci4KKyAgICBteSAkcmdiQmFjayAgID0gJF9bMV07ICAgICAjIEJhY2tncm91bmQgUkdCIGNvbG91ci4KKyAgICBteSAkcGF0dGVybiAgID0gJF9bMl07ICAgICAjIFBhdHRlcm4uCisgICAgbXkgJGdyYml0ICAgICA9ICRfWzNdOyAgICAgIyBPcHRpb24gZmxhZ3MuCisgICAgbXkgJGluZGV4Rm9yZSA9ICRfWzRdOyAgICAgIyBJbmRleCB0byBGb3JlZ3JvdW5kIGNvbG91ci4KKyAgICBteSAkaW5kZXhCYWNrID0gJF9bNV07ICAgICAjIEluZGV4IHRvIEJhY2tncm91bmQgY29sb3VyLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiRm9yZTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJnYkJhY2s7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwYXR0ZXJuOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRpbmRleEZvcmU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRpbmRleEJhY2s7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGNleHQoKQorIworIyBXcml0ZSB0aGUgQVhDRVhUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9heGNleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgPSAweDEwNjI7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICA9IDB4MDAxMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRjYXRNaW4gICAgICAgPSAweDAwMDA7ICAgICMgTWluaW11bSBjYXRlZ29yeSBvbiBheGlzLgorICAgIG15ICRjYXRNYXggICAgICAgPSAweDAwMDA7ICAgICMgTWF4aW11bSBjYXRlZ29yeSBvbiBheGlzLgorICAgIG15ICRjYXRNYWpvciAgICAgPSAweDAwMDE7ICAgICMgVmFsdWUgb2YgbWFqb3IgdW5pdC4KKyAgICBteSAkdW5pdE1ham9yICAgID0gMHgwMDAwOyAgICAjIFVuaXRzIG9mIG1ham9yIHVuaXQuCisgICAgbXkgJGNhdE1pbm9yICAgICA9IDB4MDAwMTsgICAgIyBWYWx1ZSBvZiBtaW5vciB1bml0LgorICAgIG15ICR1bml0TWlub3IgICAgPSAweDAwMDA7ICAgICMgVW5pdHMgb2YgbWlub3IgdW5pdC4KKyAgICBteSAkdW5pdEJhc2UgICAgID0gMHgwMDAwOyAgICAjIEJhc2UgdW5pdCBvZiBheGlzLgorICAgIG15ICRjYXRDcm9zc0RhdGUgPSAweDAwMDA7ICAgICMgQ3Jvc3NpbmcgcG9pbnQuCisgICAgbXkgJGdyYml0ICAgICAgICA9IDB4MDBFRjsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRNaW47CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRNYXg7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRNYWpvcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHVuaXRNYWpvcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGNhdE1pbm9yOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkdW5pdE1pbm9yOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkdW5pdEJhc2U7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRDcm9zc0RhdGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4ZXN1c2VkKCkKKyMKKyMgV3JpdGUgdGhlIEFYRVNVU0VEIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9heGVzdXNlZCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgID0gMHgxMDQ2OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRudW1fYXhlcyA9ICRfWzBdOyAgICAgIyBOdW1iZXIgb2YgYXhlcyB1c2VkLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9IHBhY2sgJ3YnLCAkbnVtX2F4ZXM7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGlzKCkKKyMKKyMgV3JpdGUgdGhlIEFYSVMgY2hhcnQgQklGRiByZWNvcmQgdG8gZGVmaW5lIHRoZSBheGlzIHR5cGUuCisjCitzdWIgX3N0b3JlX2F4aXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDEwMUQ7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMTI7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHR5cGUgICAgICA9ICRfWzBdOyAgICAgICAgICMgQXhpcyB0eXBlLgorICAgIG15ICRyZXNlcnZlZDEgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDIgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDMgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDQgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMjsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkNDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNsaW5lZm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIEFYSVNMSU5FRk9STUFUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9heGlzbGluZWZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgxMDIxOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRsaW5lX2Zvcm1hdCA9IDB4MDAwMTsgICAgIyBBeGlzIGxpbmUgZm9ybWF0LgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9IHBhY2sgJ3YnLCAkbGluZV9mb3JtYXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGlzcGFyZW50KCkKKyMKKyMgV3JpdGUgdGhlIEFYSVNQQVJFTlQgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2F4aXNwYXJlbnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwNDE7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAxMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRpYXggICAgPSAkX1swXTsgICAgICMgQXhpcyBpbmRleC4KKyAgICBteSAkeCAgICAgID0gJF9bMV07ICAgICAjIFgtY29vcmQuCisgICAgbXkgJHkgICAgICA9ICRfWzJdOyAgICAgIyBZLWNvb3JkLgorICAgIG15ICRkeCAgICAgPSAkX1szXTsgICAgICMgTGVuZ3RoIG9mIHggYXhpcy4KKyAgICBteSAkZHkgICAgID0gJF9bNF07ICAgICAjIExlbmd0aCBvZiB5IGF4aXMuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRpYXg7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR4OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGR4OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkZHk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9iZWdpbigpCisjCisjIFdyaXRlIHRoZSBCRUdJTiBjaGFydCBCSUZGIHJlY29yZCB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBzdWIgc3RyZWFtLgorIworc3ViIF9zdG9yZV9iZWdpbiB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAzMzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAwOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jYXRzZXJyYW5nZSgpCisjCisjIFdyaXRlIHRoZSBDQVRTRVJSQU5HRSBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY2F0c2VycmFuZ2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTAyMDsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDg7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkY2F0Q3Jvc3MgPSAweDAwMDE7ICAgICMgVmFsdWUvY2F0ZWdvcnkgY3Jvc3NpbmcuCisgICAgbXkgJGNhdExhYmVsID0gMHgwMDAxOyAgICAjIEZyZXF1ZW5jeSBvZiBsYWJlbHMuCisgICAgbXkgJGNhdE1hcmsgID0gMHgwMDAxOyAgICAjIEZyZXF1ZW5jeSBvZiB0aWNrcy4KKyAgICBteSAkZ3JiaXQgICAgPSAweDAwMDE7ICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0Q3Jvc3M7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRMYWJlbDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGNhdE1hcms7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0KCkKKyMKKyMgV3JpdGUgdGhlIENIQVJUIEJJRkYgcmVjb3JkLiBUaGlzIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIGNoYXJ0IHN1Yi1zdHJlYW0KKyMgYW5kIGNvbnRhaW5zIGRpbWVuc2lvbnMgb2YgdGhlIGNoYXJ0IG9uIHRoZSBkaXNwbGF5LiBVbml0cyBhcmUgaW4gMS83MiBpbmNoCisjIGFuZCBhcmUgMiBieXRlIGludGVnZXIgd2l0aCAyIGJ5dGUgZnJhY3Rpb24uCisjCitzdWIgX3N0b3JlX2NoYXJ0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDAyOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMTA7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkeF9wb3MgID0gJF9bMF07ICAgICAjIFggcG9zIG9mIHRvcCBsZWZ0IGNvcm5lci4KKyAgICBteSAkeV9wb3MgID0gJF9bMV07ICAgICAjIFkgcG9zIG9mIHRvcCBsZWZ0IGNvcm5lci4KKyAgICBteSAkZHggICAgID0gJF9bMl07ICAgICAjIFggc2l6ZS4KKyAgICBteSAkZHkgICAgID0gJF9bM107ICAgICAjIFkgc2l6ZS4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHhfcG9zOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeV9wb3M7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGR5OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgQ0hBUlRGT1JNQVQgY2hhcnQgQklGRiByZWNvcmQuIFRoZSBwYXJlbnQgcmVjb3JkIGZvciBmb3JtYXR0aW5nCisjIG9mIGEgY2hhcnQgZ3JvdXAuCisjCitzdWIgX3N0b3JlX2NoYXJ0Zm9ybWF0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgxMDE0OyAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDE0OyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRyZXNlcnZlZDEgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDIgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDMgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDQgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRncmJpdCAgICAgPSAkX1swXSB8fCAwOyAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkaWNydCAgICAgID0gMHgwMDAwOyAgICAgICAgIyBEcmF3aW5nIG9yZGVyLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmVzZXJ2ZWQxOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmVzZXJ2ZWQyOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmVzZXJ2ZWQzOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmVzZXJ2ZWQ0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRpY3J0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRsaW5lKCkKKyMKKyMgV3JpdGUgdGhlIENIQVJUTElORSBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY2hhcnRsaW5lIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDFDOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkdHlwZSAgID0gMHgwMDAxOyAgICAjIERyb3AvaGktbG8gbGluZSB0eXBlLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9IHBhY2sgJ3YnLCAkdHlwZTsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0dGV4dCgpCisjCisjIFdyaXRlIHRoZSBURVhUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9jaGFydHRleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgID0gMHgxMDI1OyAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgICAgICA9IDB4MDAyMDsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaG9yel9hbGlnbiAgICAgICA9IDB4MDI7ICAgICAgICAgICMgSG9yaXpvbnRhbCBhbGlnbm1lbnQuCisgICAgbXkgJHZlcnRfYWxpZ24gICAgICAgPSAweDAyOyAgICAgICAgICAjIFZlcnRpY2FsIGFsaWdubWVudC4KKyAgICBteSAkYmdfbW9kZSAgICAgICAgICA9IDB4MDAwMTsgICAgICAgICMgQmFja2dyb3VuZCBkaXNwbGF5LgorICAgIG15ICR0ZXh0X2NvbG9yX3JnYiAgID0gMHgwMDAwMDAwMDsgICAgIyBUZXh0IFJHQiBjb2xvdXIuCisgICAgbXkgJHRleHRfeCAgICAgICAgICAgPSAweEZGRkZGRjQ2OyAgICAjIFRleHQgeC1wb3MuCisgICAgbXkgJHRleHRfeSAgICAgICAgICAgPSAweEZGRkZGRjA2OyAgICAjIFRleHQgeS1wb3MuCisgICAgbXkgJHRleHRfZHggICAgICAgICAgPSAweDAwMDAwMDAwOyAgICAjIFdpZHRoLgorICAgIG15ICR0ZXh0X2R5ICAgICAgICAgID0gMHgwMDAwMDAwMDsgICAgIyBIZWlnaHQuCisgICAgbXkgJGdyYml0MSAgICAgICAgICAgPSAweDAwQjE7ICAgICAgICAjIE9wdGlvbnMKKyAgICBteSAkdGV4dF9jb2xvcl9pbmRleCA9IDB4MDA0RDsgICAgICAgICMgQXV0byBDb2xvdXIuCisgICAgbXkgJGdyYml0MiAgICAgICAgICAgPSAweDAwMDA7ICAgICAgICAjIERhdGEgbGFiZWwgcGxhY2VtZW50LgorICAgIG15ICRyb3RhdGlvbiAgICAgICAgID0gMHgwMDAwOyAgICAgICAgIyBUZXh0IHJvdGF0aW9uLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkaG9yel9hbGlnbjsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHZlcnRfYWxpZ247CisgICAgJGRhdGEgLj0gcGFjayAndicsICRiZ19tb2RlOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF9jb2xvcl9yZ2I7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR0ZXh0X3g7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR0ZXh0X3k7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR0ZXh0X2R4OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF9keTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0MTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHRleHRfY29sb3JfaW5kZXg7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDI7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRyb3RhdGlvbjsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RhdGFmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgREFUQUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4gVGhpcyByZWNvcmQgc3BlY2lmaWVzIHRoZSBzZXJpZXMKKyMgdGhhdCB0aGUgc3Vic2VxdWVudCBzdWIgc3RyZWFtIHJlZmVycyB0by4KKyMKK3N1YiBfc3RvcmVfZGF0YWZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgPSAweDEwMDY7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICAgPSAweDAwMDg7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkc2VyaWVzX2luZGV4ICA9ICRfWzBdOyAgICAgIyBTZXJpZXMgaW5kZXguCisgICAgbXkgJHNlcmllc19udW1iZXIgPSAkX1sxXTsgICAgICMgU2VyaWVzIG51bWJlci4gKFNhbWUgYXMgaW5kZXgpLgorICAgIG15ICRwb2ludF9udW1iZXIgID0gJF9bMl07ICAgICAjIFBvaW50IG51bWJlci4KKyAgICBteSAkZ3JiaXQgICAgICAgICA9IDB4MDAwMDsgICAgIyBGb3JtYXQgZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwb2ludF9udW1iZXI7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRzZXJpZXNfaW5kZXg7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRzZXJpZXNfbnVtYmVyOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kZWZhdWx0dGV4dCgpCisjCisjIFdyaXRlIHRoZSBERUZBVUxUVEVYVCBjaGFydCBCSUZGIHJlY29yZC4gSWRlbnRpZmllciBmb3Igc3Vic2VxdWVudCBURVhUCisjIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfZGVmYXVsdHRleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMjQ7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICR0eXBlICAgPSAweDAwMDI7ICAgICMgVHlwZS4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJHR5cGU7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kcm9wYmFyKCkKKyMKKyMgV3JpdGUgdGhlIERST1BCQVIgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2Ryb3BiYXIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MTAzRDsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkcGVyY2VudF9nYXAgPSAweDAwOTY7ICAgICMgRHJvcCBiYXIgd2lkdGggZ2FwICglKS4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJHBlcmNlbnRfZ2FwOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZW5kKCkKKyMKKyMgV3JpdGUgdGhlIEVORCBjaGFydCBCSUZGIHJlY29yZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgc3ViIHN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfZW5kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDM0OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDA7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2ZiaSgpCisjCisjIFdyaXRlIHRoZSBGQkkgY2hhcnQgQklGRiByZWNvcmQuIFNwZWNpZmllcyB0aGUgZm9udCBpbmZvcm1hdGlvbiBhdCB0aGUgdGltZQorIyBpdCB3YXMgYXBwbGllZCB0byB0aGUgY2hhcnQuCisjCitzdWIgX3N0b3JlX2ZiaSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICA9IDB4MTA2MDsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICA9IDB4MDAwQTsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaW5kZXggICAgICAgID0gJF9bMF07ICAgICAgICAgIyBGb250IGluZGV4LgorICAgIG15ICRoZWlnaHQgICAgICAgPSAkX1sxXSAqIDIwOyAgICAjIERlZmF1bHQgZm9udCBoZWlnaHQgaW4gdHdpcHMuCisgICAgbXkgJHdpZHRoX2Jhc2lzICA9ICRfWzJdOyAgICAgICAgICMgV2lkdGggYmFzaXMsIGluIHR3aXBzLgorICAgIG15ICRoZWlnaHRfYmFzaXMgPSAkX1szXTsgICAgICAgICAjIEhlaWdodCBiYXNpcywgaW4gdHdpcHMuCisgICAgbXkgJHNjYWxlX2Jhc2lzICA9ICRfWzRdOyAgICAgICAgICMgU2NhbGUgYnkgY2hhcnQgYXJlYSBvciBwbG90IGFyZWEuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICR3aWR0aF9iYXNpczsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGhlaWdodF9iYXNpczsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGhlaWdodDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHNjYWxlX2Jhc2lzOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaW5kZXg7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9mb250eCgpCisjCisjIFdyaXRlIHRoZSBGT05UWCBjaGFydCBCSUZGIHJlY29yZCB3aGljaCBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIEZPTlQKKyMgcmVjb3JkIGluIHRoZSBXb3JrYm9vay4KKyMKK3N1YiBfc3RvcmVfZm9udHggeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMjY7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRpbmRleCAgPSAkX1swXTsgICAgICMgRm9udCBpbmRleC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJGluZGV4OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZnJhbWUoKQorIworIyBXcml0ZSB0aGUgRlJBTUUgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2ZyYW1lIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICA9IDB4MTAzMjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICA9IDB4MDAwNDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRmcmFtZV90eXBlID0gJF9bMF07ICAgICAjIEZyYW1lIHR5cGUuCisgICAgbXkgJGdyYml0ICAgICAgPSAkX1sxXTsgICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZnJhbWVfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbGVnZW5kKCkKKyMKKyMgV3JpdGUgdGhlIExFR0VORCBjaGFydCBCSUZGIHJlY29yZC4gVGhlIE1hcmN1cyBIb3JhbiBtZXRob2QuCisjCitzdWIgX3N0b3JlX2xlZ2VuZCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgID0gMHgxMDE1OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAxNDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICR4ICAgICAgICA9ICRfWzBdOyAgICAgIyBYLXBvc2l0aW9uLgorICAgIG15ICR5ICAgICAgICA9ICRfWzFdOyAgICAgIyBZLXBvc2l0aW9uLgorICAgIG15ICR3aWR0aCAgICA9ICRfWzJdOyAgICAgIyBXaWR0aC4KKyAgICBteSAkaGVpZ2h0ICAgPSAkX1szXTsgICAgICMgSGVpZ2h0LgorICAgIG15ICR3VHlwZSAgICA9ICRfWzRdOyAgICAgIyBUeXBlLgorICAgIG15ICR3U3BhY2luZyA9ICRfWzVdOyAgICAgIyBTcGFjaW5nLgorICAgIG15ICRncmJpdCAgICA9ICRfWzZdOyAgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR4OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHdpZHRoOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkaGVpZ2h0OworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkd1R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR3U3BhY2luZzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbGluZWZvcm1hdCgpCisjCisjIFdyaXRlIHRoZSBMSU5FRk9STUFUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9saW5lZm9ybWF0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDA3OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMEM7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkcmdiICAgID0gJF9bMF07ICAgICAjIExpbmUgUkdCIGNvbG91ci4KKyAgICBteSAkbG5zICAgID0gJF9bMV07ICAgICAjIExpbmUgcGF0dGVybi4KKyAgICBteSAkd2UgICAgID0gJF9bMl07ICAgICAjIExpbmUgd2VpZ2h0LgorICAgIG15ICRncmJpdCAgPSAkX1szXTsgICAgICMgT3B0aW9uIGZsYWdzLgorICAgIG15ICRpbmRleCAgPSAkX1s0XTsgICAgICMgSW5kZXggdG8gY29sb3VyIG9mIGxpbmUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZ2I7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRsbnM7CisgICAgJGRhdGEgLj0gcGFjayAndicsICR3ZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaW5kZXg7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJrZXJmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgTUFSS0VSRk9STUFUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJrZXJmb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgID0gMHgxMDA5OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggID0gMHgwMDE0OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHJnYkZvcmUgPSAkX1swXTsgICAgICMgRm9yZWdyb3VuZCBSR0IgY29sb3IuCisgICAgbXkgJHJnYkJhY2sgPSAkX1sxXTsgICAgICMgQmFja2dyb3VuZCBSR0IgY29sb3IuCisgICAgbXkgJG1hcmtlciAgPSAkX1syXTsgICAgICMgVHlwZSBvZiBtYXJrZXIuCisgICAgbXkgJGdyYml0ICAgPSAkX1szXTsgICAgICMgRm9ybWF0IGZsYWdzLgorICAgIG15ICRpY3ZGb3JlID0gJF9bNF07ICAgICAjIENvbG9yIGluZGV4IG1hcmtlciBib3JkZXIuCisgICAgbXkgJGljdkJhY2sgPSAkX1s1XTsgICAgICMgQ29sb3IgaW5kZXggbWFya2VyIGZpbGwuCisgICAgbXkgJG1pU2l6ZSAgPSAkX1s2XTsgICAgICMgU2l6ZSBvZiBsaW5lIG1hcmtlcnMuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZ2JGb3JlOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiQmFjazsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJG1hcmtlcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaWN2Rm9yZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGljdkJhY2s7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRtaVNpemU7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9vYmplY3RsaW5rKCkKKyMKKyMgV3JpdGUgdGhlIE9CSkVDVExJTksgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX29iamVjdGxpbmsgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MTAyNzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDY7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbGlua190eXBlICAgPSAkX1swXTsgICAgICMgT2JqZWN0IHRleHQgbGluayB0eXBlLgorICAgIG15ICRsaW5rX2luZGV4MSA9IDB4MDAwMDsgICAgIyBMaW5rIGluZGV4IDEuCisgICAgbXkgJGxpbmtfaW5kZXgyID0gMHgwMDAwOyAgICAjIExpbmsgaW5kZXggMi4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGxpbmtfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGxpbmtfaW5kZXgxOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkbGlua19pbmRleDI7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9waWVmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgUElFRk9STUFUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9waWVmb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgID0gMHgxMDBCOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHBlcmNlbnQgPSAweDAwMDA7ICAgICMgRGlzdGFuY2UgJSBmcm9tIGNlbnRlci4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHBlcmNlbnQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wbG90YXJlYSgpCisjCisjIFdyaXRlIHRoZSBQTE9UQVJFQSBjaGFydCBCSUZGIHJlY29yZC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgc3Vic2VxdWVudAorIyBGUkFNRSByZWNvcmQgYmVsb25ncyB0byBhIHBsb3QgYXJlYS4KKyMKK3N1YiBfc3RvcmVfcGxvdGFyZWEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMzU7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGxvdGdyb3d0aCgpCisjCisjIFdyaXRlIHRoZSBQTE9UR1JPV1RIIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9wbG90Z3Jvd3RoIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MTA2NDsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMDg7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGR4X3Bsb3QgPSAweDAwMDEwMDAwOyAgICAjIEhvcnogZ3Jvd3RoIGZvciBmb250IHNjYWxlLgorICAgIG15ICRkeV9wbG90ID0gMHgwMDAxMDAwMDsgICAgIyBWZXJ0IGdyb3d0aCBmb3IgZm9udCBzY2FsZS4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGR4X3Bsb3Q7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeV9wbG90OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcG9zKCkKKyMKKyMgV3JpdGUgdGhlIFBPUyBjaGFydCBCSUZGIHJlY29yZC4gR2VuZXJhbGx5IG5vdCByZXF1aXJlZCB3aGVuIHVzaW5nCisjIGF1dG9tYXRpYyBwb3NpdGlvbmluZy4KKyMKK3N1YiBfc3RvcmVfcG9zIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MTA0RjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICA9IDB4MDAxNDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRtZFRvcEx0ID0gJF9bMF07ICAgICAjIFRvcCBsZWZ0LgorICAgIG15ICRtZEJvdFJ0ID0gJF9bMV07ICAgICAjIEJvdHRvbSByaWdodC4KKyAgICBteSAkeDEgICAgICA9ICRfWzJdOyAgICAgIyBYIGNvb3JkaW5hdGUuCisgICAgbXkgJHkxICAgICAgPSAkX1szXTsgICAgICMgWSBjb29yZGluYXRlLgorICAgIG15ICR4MiAgICAgID0gJF9bNF07ICAgICAjIFdpZHRoLgorICAgIG15ICR5MiAgICAgID0gJF9bNV07ICAgICAjIEhlaWdodC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJG1kVG9wTHQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRtZEJvdFJ0OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeDE7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR5MTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHgyOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeTI7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJhdXh0cmVuZCgpCisjCisjIFdyaXRlIHRoZSBTRVJBVVhUUkVORCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfc2VyYXV4dHJlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgID0gMHgxMDRCOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgID0gMHgwMDFDOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHJlZ190eXBlICAgPSAkX1swXTsgICAgICMgUmVncmVzc2lvbiB0eXBlLgorICAgIG15ICRwb2x5X29yZGVyID0gJF9bMV07ICAgICAjIFBvbHlub21pYWwgb3JkZXIuCisgICAgbXkgJGVxdWF0aW9uICAgPSAkX1syXTsgICAgICMgRGlzcGxheSBlcXVhdGlvbi4KKyAgICBteSAkcl9zcXVhcmVkICA9ICRfWzNdOyAgICAgIyBEaXNwbGF5IFItc3F1YXJlZC4KKyAgICBteSAkaW50ZXJjZXB0OyAgICAgICAgICAgICAgIyBGb3JjZWQgaW50ZXJjZXB0LgorICAgIG15ICRmb3JlY2FzdDsgICAgICAgICAgICAgICAjIEZvcmVjYXN0IGZvcndhcmQuCisgICAgbXkgJGJhY2tjYXN0OyAgICAgICAgICAgICAgICMgRm9yZWNhc3QgYmFja3dhcmQuCisKKyAgICAjIFRPRE8uIFdoZW4gc3VwcG9ydGVkLCBpbnRlcmNlcHQgbmVlZHMgdG8gYmUgTkFOIGlmIG5vdCB1c2VkLgorICAgICMgQWxzbyBuZWVkIHRvIHJldmVyc2UgZG91Ymxlcy4KKyAgICAkaW50ZXJjZXB0ID0gcGFjayAnSConLCAnRkZGRkZGRkYwMDAxRkZGRic7CisgICAgJGZvcmVjYXN0ICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDAwMDAwMDAnOworICAgICRiYWNrY2FzdCAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAwMDAwMDAwJzsKKworCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkcmVnX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRwb2x5X29yZGVyOworICAgICRkYXRhIC49ICRpbnRlcmNlcHQ7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRlcXVhdGlvbjsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHJfc3F1YXJlZDsKKyAgICAkZGF0YSAuPSAkZm9yZWNhc3Q7CisgICAgJGRhdGEgLj0gJGJhY2tjYXN0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2VyaWVzKCkKKyMKKyMgV3JpdGUgdGhlIFNFUklFUyBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfc2VyaWVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgPSAweDEwMDM7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICAgID0gMHgwMDBDOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGNhdGVnb3J5X3R5cGUgID0gMHgwMDAxOyAgICAjIFR5cGU6IGNhdGVnb3J5LgorICAgIG15ICR2YWx1ZV90eXBlICAgICA9IDB4MDAwMTsgICAgIyBUeXBlOiB2YWx1ZS4KKyAgICBteSAkY2F0ZWdvcnlfY291bnQgPSAkX1swXTsgICAgICMgTnVtIG9mIGNhdGVnb3JpZXMuCisgICAgbXkgJHZhbHVlX2NvdW50ICAgID0gJF9bMV07ICAgICAjIE51bSBvZiB2YWx1ZXMuCisgICAgbXkgJGJ1YmJsZV90eXBlICAgID0gMHgwMDAxOyAgICAjIFR5cGU6IGJ1YmJsZS4KKyAgICBteSAkYnViYmxlX2NvdW50ICAgPSAweDAwMDA7ICAgICMgTnVtIG9mIGJ1YmJsZSB2YWx1ZXMuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRlZ29yeV90eXBlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkdmFsdWVfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGNhdGVnb3J5X2NvdW50OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkdmFsdWVfY291bnQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRidWJibGVfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGJ1YmJsZV9jb3VudDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Nlcmllc3RleHQoKQorIworIyBXcml0ZSB0aGUgU0VSSUVTVEVYVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfc2VyaWVzdGV4dCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgID0gMHgxMDBEOyAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDAwOyAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaWQgICAgICAgPSAweDAwMDA7ICAgICAgICAgIyBUZXh0IGlkLgorICAgIG15ICRzdHIgICAgICA9ICRfWzBdOyAgICAgICAgICAjIFRleHQuCisgICAgbXkgJGVuY29kaW5nID0gJF9bMV07ICAgICAgICAgICMgU3RyaW5nIGVuY29kaW5nLgorICAgIG15ICRjY2ggICAgICA9IGxlbmd0aCAkc3RyOyAgICAjIFN0cmluZyBsZW5ndGguCisKKyAgICAjIENoYXJhY3RlciBsZW5ndGggaXMgbnVtIG9mIGNoYXJzIG5vdCBudW0gb2YgYnl0ZXMKKyAgICAkY2NoIC89IDIgaWYgJGVuY29kaW5nOworCisgICAgIyBDaGFuZ2UgdGhlIFVURi0xNiBuYW1lIGZyb20gQkUgdG8gTEUKKyAgICAkc3RyID0gcGFjayAnbionLCB1bnBhY2sgJ3YqJywgJHN0ciBpZiAkZW5jb2Rpbmc7CisKKyAgICAkbGVuZ3RoID0gNCArIGxlbmd0aCggJHN0ciApOworCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaWQ7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRjY2g7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRlbmNvZGluZzsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSwgJHN0ciApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NlcnBhcmVudCgpCisjCisjIFdyaXRlIHRoZSBTRVJQQVJFTlQgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NlcnBhcmVudCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTA0QTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHNlcmllcyA9ICRfWzBdOyAgICAgIyBTZXJpZXMgcGFyZW50LgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9IHBhY2sgJ3YnLCAkc2VyaWVzOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2VydG9jcnQoKQorIworIyBXcml0ZSB0aGUgU0VSVE9DUlQgY2hhcnQgQklGRiByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIGNoYXJ0IGdyb3VwIGluZGV4LgorIworc3ViIF9zdG9yZV9zZXJ0b2NydCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgPSAweDEwNDU7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkY2hhcnRncm91cCA9IDB4MDAwMDsgICAgIyBDaGFydCBncm91cCBpbmRleC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJGNoYXJ0Z3JvdXA7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zaHRwcm9wcygpCisjCisjIFdyaXRlIHRoZSBTSFRQUk9QUyBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfc2h0cHJvcHMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MTA0NDsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDQ7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAwMEU7ICAgICMgT3B0aW9uIGZsYWdzLgorICAgIG15ICRlbXB0eV9jZWxscyA9IDB4MDAwMDsgICAgIyBFbXB0eSBjZWxsIGhhbmRsaW5nLgorCisgICAgJGdyYml0ID0gMHgwMDBBIGlmICRzZWxmLT57X2VtYmVkZGVkfTsKKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZW1wdHlfY2VsbHM7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90ZXh0KCkKKyMKKyMgV3JpdGUgdGhlIFRFWFQgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3RleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTAyNTsgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDIwOyAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRhdCAgICAgICA9IDB4MDI7ICAgICAgICAgICAgICMgSG9yaXpvbnRhbCBhbGlnbm1lbnQuCisgICAgbXkgJHZhdCAgICAgID0gMHgwMjsgICAgICAgICAgICAgIyBWZXJ0aWNhbCBhbGlnbm1lbnQuCisgICAgbXkgJHdCa2dNb2RlID0gMHgwMDAxOyAgICAgICAgICAgIyBCYWNrZ3JvdW5kIGRpc3BsYXkuCisgICAgbXkgJHJnYlRleHQgID0gMHgwMDAwOyAgICAgICAgICAgIyBUZXh0IFJHQiBjb2xvdXIuCisgICAgbXkgJHggICAgICAgID0gJF9bMF07ICAgICAgICAgICAgIyBUZXh0IHgtcG9zLgorICAgIG15ICR5ICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICMgVGV4dCB5LXBvcy4KKyAgICBteSAkZHggICAgICAgPSAkX1syXTsgICAgICAgICAgICAjIFdpZHRoLgorICAgIG15ICRkeSAgICAgICA9ICRfWzNdOyAgICAgICAgICAgICMgSGVpZ2h0LgorICAgIG15ICRncmJpdDEgICA9ICRfWzRdOyAgICAgICAgICAgICMgT3B0aW9uIGZsYWdzLgorICAgIG15ICRpY3ZUZXh0ICA9IDB4MDA0RDsgICAgICAgICAgICMgQXV0byBDb2xvdXIuCisgICAgbXkgJGdyYml0MiAgID0gJF9bNV07ICAgICAgICAgICAgIyBTaG93IGxlZ2VuZC4KKyAgICBteSAkcm90YXRpb24gPSAkX1s2XSB8fCAweDAwOyAgICAjIFNob3cgdmFsdWUuCisKKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJGF0OworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkdmF0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkd0JrZ01vZGU7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZ2JUZXh0OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHk7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGR5OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQxOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaWN2VGV4dDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0MjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHJvdGF0aW9uOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3RpY2soKQorIworIyBXcml0ZSB0aGUgVElDSyBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfdGljayB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAxRTsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICA9IDB4MDAxRTsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkdGt0TWFqb3IgID0gMHgwMjsgICAgICAgICAgIyBUeXBlIG9mIG1ham9yIHRpY2sgbWFyay4KKyAgICBteSAkdGt0TWlub3IgID0gMHgwMDsgICAgICAgICAgIyBUeXBlIG9mIG1pbm9yIHRpY2sgbWFyay4KKyAgICBteSAkdGx0ICAgICAgID0gMHgwMzsgICAgICAgICAgIyBUaWNrIGxhYmVsIHBvc2l0aW9uLgorICAgIG15ICR3QmtnTW9kZSAgPSAweDAxOyAgICAgICAgICAjIEJhY2tncm91bmQgbW9kZS4KKyAgICBteSAkcmdiICAgICAgID0gMHgwMDAwMDAwMDsgICAgIyBUaWNrLWxhYmVsIFJHQiBjb2xvdXIuCisgICAgbXkgJHJlc2VydmVkMSA9IDB4MDAwMDAwMDA7ICAgICMgUmVzZXJ2ZWQuCisgICAgbXkgJHJlc2VydmVkMiA9IDB4MDAwMDAwMDA7ICAgICMgUmVzZXJ2ZWQuCisgICAgbXkgJHJlc2VydmVkMyA9IDB4MDAwMDAwMDA7ICAgICMgUmVzZXJ2ZWQuCisgICAgbXkgJHJlc2VydmVkNCA9IDB4MDAwMDAwMDA7ICAgICMgUmVzZXJ2ZWQuCisgICAgbXkgJGdyYml0ICAgICA9IDB4MDAyMzsgICAgICAgICMgT3B0aW9uIGZsYWdzLgorICAgIG15ICRpbmRleCAgICAgPSAweDAwNEQ7ICAgICAgICAjIENvbG91ciBpbmRleC4KKyAgICBteSAkcmVzZXJ2ZWQ1ID0gMHgwMDAwOyAgICAgICAgIyBSZXNlcnZlZC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHRrdE1ham9yOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkdGt0TWlub3I7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR0bHQ7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR3QmtnTW9kZTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJnYjsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMjsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkNDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaW5kZXg7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRyZXNlcnZlZDU7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV92YWx1ZXJhbmdlKCkKKyMKKyMgV3JpdGUgdGhlIFZBTFVFUkFOR0UgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3ZhbHVlcmFuZ2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTAxRjsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDJBOyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRudW1NaW4gICA9IDB4MDAwMDAwMDA7ICAgICMgTWluaW11bSB2YWx1ZSBvbiBheGlzLgorICAgIG15ICRudW1NYXggICA9IDB4MDAwMDAwMDA7ICAgICMgTWF4aW11bSB2YWx1ZSBvbiBheGlzLgorICAgIG15ICRudW1NYWpvciA9IDB4MDAwMDAwMDA7ICAgICMgVmFsdWUgb2YgbWFqb3IgaW5jcmVtZW50LgorICAgIG15ICRudW1NaW5vciA9IDB4MDAwMDAwMDA7ICAgICMgVmFsdWUgb2YgbWlub3IgaW5jcmVtZW50LgorICAgIG15ICRudW1Dcm9zcyA9IDB4MDAwMDAwMDA7ICAgICMgVmFsdWUgd2hlcmUgY2F0ZWdvcnkgYXhpcyBjcm9zc2VzLgorICAgIG15ICRncmJpdCAgICA9IDB4MDExRjsgICAgICAgICMgRm9ybWF0IGZsYWdzLgorCisgICAgIyBUT0RPLiBSZXZlcnNlIGRvdWJsZXMgd2hlbiB0aGV5IGFyZSBoYW5kbGVkLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ2QnLCAkbnVtTWluOworICAgICRkYXRhIC49IHBhY2sgJ2QnLCAkbnVtTWF4OworICAgICRkYXRhIC49IHBhY2sgJ2QnLCAkbnVtTWFqb3I7CisgICAgJGRhdGEgLj0gcGFjayAnZCcsICRudW1NaW5vcjsKKyAgICAkZGF0YSAuPSBwYWNrICdkJywgJG51bUNyb3NzOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENvbmZpZyBkYXRhLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NldF9kZWZhdWx0X3Byb3BlcnRpZXMoKQorIworIyBTZXR1cCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBhIGNoYXJ0LgorIworc3ViIF9zZXRfZGVmYXVsdF9wcm9wZXJ0aWVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19sZWdlbmR9ID0geworICAgICAgICBfdmlzaWJsZSAgPT4gMSwKKyAgICAgICAgX3Bvc2l0aW9uID0+IDAsCisgICAgICAgIF92ZXJ0aWNhbCA9PiAwLAorICAgIH07CisKKyAgICAkc2VsZi0+e19jaGFydGFyZWF9ID0geworICAgICAgICBfdmlzaWJsZSAgICAgICAgICA9PiAwLAorICAgICAgICBfZmdfY29sb3JfaW5kZXggICA9PiAweDRFLAorICAgICAgICBfZmdfY29sb3JfcmdiICAgICA9PiAweEZGRkZGRiwKKyAgICAgICAgX2JnX2NvbG9yX2luZGV4ICAgPT4gMHg0RCwKKyAgICAgICAgX2JnX2NvbG9yX3JnYiAgICAgPT4gMHgwMDAwMDAsCisgICAgICAgIF9hcmVhX3BhdHRlcm4gICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2FyZWFfb3B0aW9ucyAgICAgPT4gMHgwMDAwLAorICAgICAgICBfbGluZV9wYXR0ZXJuICAgICA9PiAweDAwMDUsCisgICAgICAgIF9saW5lX3dlaWdodCAgICAgID0+IDB4RkZGRiwKKyAgICAgICAgX2xpbmVfY29sb3JfaW5kZXggPT4gMHg0RCwKKyAgICAgICAgX2xpbmVfY29sb3JfcmdiICAgPT4gMHgwMDAwMDAsCisgICAgICAgIF9saW5lX29wdGlvbnMgICAgID0+IDB4MDAwOCwKKyAgICB9OworCisgICAgJHNlbGYtPntfcGxvdGFyZWF9ID0geworICAgICAgICBfdmlzaWJsZSAgICAgICAgICA9PiAxLAorICAgICAgICBfZmdfY29sb3JfaW5kZXggICA9PiAweDE2LAorICAgICAgICBfZmdfY29sb3JfcmdiICAgICA9PiAweEMwQzBDMCwKKyAgICAgICAgX2JnX2NvbG9yX2luZGV4ICAgPT4gMHg0RiwKKyAgICAgICAgX2JnX2NvbG9yX3JnYiAgICAgPT4gMHgwMDAwMDAsCisgICAgICAgIF9hcmVhX3BhdHRlcm4gICAgID0+IDB4MDAwMSwKKyAgICAgICAgX2FyZWFfb3B0aW9ucyAgICAgPT4gMHgwMDAwLAorICAgICAgICBfbGluZV9wYXR0ZXJuICAgICA9PiAweDAwMDAsCisgICAgICAgIF9saW5lX3dlaWdodCAgICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2xpbmVfY29sb3JfaW5kZXggPT4gMHgxNywKKyAgICAgICAgX2xpbmVfY29sb3JfcmdiICAgPT4gMHg4MDgwODAsCisgICAgICAgIF9saW5lX29wdGlvbnMgICAgID0+IDB4MDAwMCwKKyAgICB9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NldF9kZWZhdWx0X2NvbmZpZ19kYXRhKCkKKyMKKyMgU2V0dXAgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkYXRhIGZvciBhIGNoYXJ0LgorIworc3ViIF9zZXRfZGVmYXVsdF9jb25maWdfZGF0YSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIzw8PCBQZXJsdGlkeSBpZ25vcmUgdGhpcy4KKyAgICAkc2VsZi0+e19jb25maWd9ID0geworICAgICAgICBfYXhpc3BhcmVudCAgICAgID0+IFsgMCwgMHgwMEY4LCAweDAxRjUsIDB4MEU3RiwgMHgwQjM2ICAgICAgICAgICAgICBdLAorICAgICAgICBfYXhpc3BhcmVudF9wb3MgID0+IFsgMiwgMiwgMHgwMDhDLCAweDAxQUEsIDB4MEVFQSwgMHgwQzUyICAgICAgICAgICBdLAorICAgICAgICBfY2hhcnQgICAgICAgICAgID0+IFsgMHgwMDAwLCAweDAwMDAsIDB4MDJERDUxRTAsIDB4MDFDMkI4MzggICAgICAgICBdLAorICAgICAgICBfZm9udF9udW1iZXJzICAgID0+IFsgNSwgMTAsIDB4MzhCOCwgMHgyMkExLCAweDAwMDAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfZm9udF9zZXJpZXMgICAgID0+IFsgNiwgMTAsIDB4MzhCOCwgMHgyMkExLCAweDAwMDEgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfZm9udF90aXRsZSAgICAgID0+IFsgNywgMTIsIDB4MzhCOCwgMHgyMkExLCAweDAwMDAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfZm9udF9heGVzICAgICAgID0+IFsgOCwgMTAsIDB4MzhCOCwgMHgyMkExLCAweDAwMDEgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfbGVnZW5kICAgICAgICAgID0+IFsgMHgwNUY5LCAweDBFRTksIDB4MDQ3RCwgMHg5QywgMHgwMCwgMHgwMSwgMHgwRiBdLAorICAgICAgICBfbGVnZW5kX3BvcyAgICAgID0+IFsgNSwgMiwgMHgwNUY5LCAweDBFRTksIDAsIDAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfbGVnZW5kX3RleHQgICAgID0+IFsgMHhGRkZGRkY0NiwgMHhGRkZGRkYwNiwgMCwgMCwgMHgwMEIxLCAweDAwMDAgICBdLAorICAgICAgICBfbGVnZW5kX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfc2VyaWVzX3RleHQgICAgID0+IFsgMHhGRkZGRkY0NiwgMHhGRkZGRkYwNiwgMCwgMCwgMHgwMEIxLCAweDEwMjAgICBdLAorICAgICAgICBfc2VyaWVzX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfdGl0bGVfdGV4dCAgICAgID0+IFsgMHgwNkU0LCAweDAwNTEsIDB4MDFEQiwgMHgwMEM0LCAweDAwODEsIDB4MTAzMCBdLAorICAgICAgICBfdGl0bGVfdGV4dF9wb3MgID0+IFsgMiwgMiwgMCwgMCwgMHg3MywgMHgxRCAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfeF9heGlzX3RleHQgICAgID0+IFsgMHgwN0UxLCAweDBERkMsIDB4QjIsIDB4OUMsIDB4MDA4MSwgMHgwMDAwICAgICBdLAorICAgICAgICBfeF9heGlzX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgIDB4MkIsICAweDE3ICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfeV9heGlzX3RleHQgICAgID0+IFsgMHgwMDJELCAweDA2QUEsIDB4NUYsIDB4MUNDLCAweDAyODEsIDB4MDAsIDkwICBdLAorICAgICAgICBfeV9heGlzX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgMHgxNywgIDB4NDQgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgIH07ICM+Pj4KKworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhKCkKKyMKKyMgU2V0dXAgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkYXRhIGZvciBhbiBlbWJlZGRlZCBjaGFydC4KKyMKK3N1YiBfc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19lbWJlZGRlZH0gPSAxOworCisgICAgJHNlbGYtPntfY2hhcnRhcmVhfSA9IHsKKyAgICAgICAgX3Zpc2libGUgICAgICAgICAgPT4gMSwKKyAgICAgICAgX2ZnX2NvbG9yX2luZGV4ICAgPT4gMHg0RSwKKyAgICAgICAgX2ZnX2NvbG9yX3JnYiAgICAgPT4gMHhGRkZGRkYsCisgICAgICAgIF9iZ19jb2xvcl9pbmRleCAgID0+IDB4NEQsCisgICAgICAgIF9iZ19jb2xvcl9yZ2IgICAgID0+IDB4MDAwMDAwLAorICAgICAgICBfYXJlYV9wYXR0ZXJuICAgICA9PiAweDAwMDEsCisgICAgICAgIF9hcmVhX29wdGlvbnMgICAgID0+IDB4MDAwMSwKKyAgICAgICAgX2xpbmVfcGF0dGVybiAgICAgPT4gMHgwMDAwLAorICAgICAgICBfbGluZV93ZWlnaHQgICAgICA9PiAweDAwMDAsCisgICAgICAgIF9saW5lX2NvbG9yX2luZGV4ID0+IDB4NEQsCisgICAgICAgIF9saW5lX2NvbG9yX3JnYiAgID0+IDB4MDAwMDAwLAorICAgICAgICBfbGluZV9vcHRpb25zICAgICA9PiAweDAwMDksCisgICAgfTsKKworCisgICAgIzw8PCBQZXJsdGlkeSBpZ25vcmUgdGhpcy4KKyAgICAkc2VsZi0+e19jb25maWd9ID0geworICAgICAgICBfYXhpc3BhcmVudCAgICAgID0+IFsgMCwgMHgwMUQ4LCAweDAzMUQsIDB4MEQ3OSwgMHgwN0U5ICAgICAgICAgICAgICBdLAorICAgICAgICBfYXhpc3BhcmVudF9wb3MgID0+IFsgMiwgMiwgMHgwMTBDLCAweDAyOTIsIDB4MEU0NiwgMHgwOUZEICAgICAgICAgICBdLAorICAgICAgICBfY2hhcnQgICAgICAgICAgID0+IFsgMHgwMDAwLCAweDAwMDAsIDB4MDE4NDdGRTgsIDB4MDBGNDdGRTggICAgICAgICBdLAorICAgICAgICBfZm9udF9udW1iZXJzICAgID0+IFsgNSwgMTAsIDB4MURDNCwgMHgxMjg0LCAweDAwMDAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfZm9udF9zZXJpZXMgICAgID0+IFsgNiwgMTAsIDB4MURDNCwgMHgxMjg0LCAweDAwMDEgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfZm9udF90aXRsZSAgICAgID0+IFsgNywgMTIsIDB4MURDNCwgMHgxMjg0LCAweDAwMDAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfZm9udF9heGVzICAgICAgID0+IFsgOCwgMTAsIDB4MURDNCwgMHgxMjg0LCAweDAwMDEgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfbGVnZW5kICAgICAgICAgID0+IFsgMHgwNDRFLCAweDBFNEEsIDB4MDg4RCwgMHgwMTIzLCAweDAsIDB4MSwgMHhGICBdLAorICAgICAgICBfbGVnZW5kX3BvcyAgICAgID0+IFsgNSwgMiwgMHgwNDRFLCAweDBFNEEsIDAsIDAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfbGVnZW5kX3RleHQgICAgID0+IFsgMHhGRkZGRkZEOSwgMHhGRkZGRkZDMSwgMCwgMCwgMHgwMEIxLCAweDAwMDAgICBdLAorICAgICAgICBfbGVnZW5kX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfc2VyaWVzX3RleHQgICAgID0+IFsgMHhGRkZGRkZEOSwgMHhGRkZGRkZDMSwgMCwgMCwgMHgwMEIxLCAweDEwMjAgICBdLAorICAgICAgICBfc2VyaWVzX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfdGl0bGVfdGV4dCAgICAgID0+IFsgMHgwNjBGLCAweDAwNEMsIDB4MDM4QSwgMHgwMTZGLCAweDAwODEsIDB4MTAzMCBdLAorICAgICAgICBfdGl0bGVfdGV4dF9wb3MgID0+IFsgMiwgMiwgMCwgMCwgMHg3MywgMHgxRCAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfeF9heGlzX3RleHQgICAgID0+IFsgMHgwN0VGLCAweDBDOEYsIDB4MTUzLCAweDEyMywgMHg4MSwgMHgwMCAgICAgICBdLAorICAgICAgICBfeF9heGlzX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgMHgyQiwgMHgxNyAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICBfeV9heGlzX3RleHQgICAgID0+IFsgMHgwMDU3LCAweDA1NjQsIDB4QjUsIDB4MDM1RCwgMHgwMjgxLCAweDAwLCA5MCBdLAorICAgICAgICBfeV9heGlzX3RleHRfcG9zID0+IFsgMiwgMiwgMCwgMCwgMHgxNywgMHg0NCAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgIH07ICM+Pj4KK30KKworCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK0NoYXJ0IC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIENoYXJ0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1RvIGNyZWF0ZSBhIHNpbXBsZSBFeGNlbCBmaWxlIHdpdGggYSBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIEM8Q2hhcnQ+IG1vZHVsZSBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBtb2R1bGVzIHRoYXQgaW1wbGVtZW50IGNoYXJ0cyBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGluZm9ybWF0aW9uIGJlbG93IGlzIGFwcGxpY2FibGUgdG8gYWxsIG9mIHRoZSBhdmFpbGFibGUgc3ViY2xhc3Nlcy4KKworVGhlIEM8Q2hhcnQ+IG1vZHVsZSBpc24ndCB1c2VkIGRpcmVjdGx5LCBhIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kIHdoZXJlIHRoZSBjaGFydCB0eXBlIGlzIHNwZWNpZmllZDoKKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdjb2x1bW4nICk7CisKK0N1cnJlbnRseSB0aGUgc3VwcG9ydGVkIGNoYXJ0IHR5cGVzIGFyZToKKworPW92ZXIKKworPWl0ZW0gKiBDPGFyZWE+OiBDcmVhdGVzIGFuIEFyZWEgKGZpbGxlZCBsaW5lKSBzdHlsZSBjaGFydC4gU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpBcmVhPi4KKworPWl0ZW0gKiBDPGJhcj46IENyZWF0ZXMgYSBCYXIgc3R5bGUgKHRyYW5zcG9zZWQgaGlzdG9ncmFtKSBjaGFydC4gU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpCYXI+LgorCis9aXRlbSAqIEM8Y29sdW1uPjogQ3JlYXRlcyBhIGNvbHVtbiBzdHlsZSAoaGlzdG9ncmFtKSBjaGFydC4gU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpDb2x1bW4+LgorCis9aXRlbSAqIEM8bGluZT46IENyZWF0ZXMgYSBMaW5lIHN0eWxlIGNoYXJ0LiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OkxpbmU+LgorCis9aXRlbSAqIEM8cGllPjogQ3JlYXRlcyBhbiBQaWUgc3R5bGUgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6UGllPi4KKworPWl0ZW0gKiBDPHNjYXR0ZXI+OiBDcmVhdGVzIGFuIFNjYXR0ZXIgc3R5bGUgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6U2NhdHRlcj4uCisKKz1pdGVtICogQzxzdG9jaz46IENyZWF0ZXMgYW4gU3RvY2sgc3R5bGUgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6U3RvY2s+LgorCis9YmFjaworCitNb3JlIGNoYXJ0cyBhbmQgc3ViLXR5cGVzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHRpbWUuIFNlZSB0aGUgTDwvVE9ETz4gc2VjdGlvbi4KKworTWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IHR5cGVzIGFyZSBkb2N1bWVudGVkIGJlbG93LgorCis9aGVhZDEgQ0hBUlQgTUVUSE9EUworCis9aGVhZDIgYWRkX3NlcmllcygpCisKK0luIGFuIEV4Y2VsIGNoYXJ0IGEgInNlcmllcyIgaXMgYSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIHN1Y2ggYXMgdmFsdWVzLCB4LWF4aXMgbGFiZWxzIGFuZCB0aGUgbmFtZSB0aGF0IGRlZmluZSB3aGljaCBkYXRhIGlzIHBsb3R0ZWQuIFRoZXNlIHNldHRpbmdzIGFyZSBkaXNwbGF5ZWQgd2hlbiB5b3Ugc2VsZWN0IHRoZSBDPDwgQ2hhcnQgLT4gU291cmNlIERhdGEuLi4gPj4gbWVudSBvcHRpb24uCisKK1dpdGggYSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjaGFydCBvYmplY3QgdGhlIEM8YWRkX3NlcmllcygpPiBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIHByb3BlcnRpZXMgZm9yIGEgc2VyaWVzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzICAgID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkMTAnLAorICAgICAgICBuYW1lICAgICAgICAgID0+ICdTZXJpZXMgbmFtZScsCisgICAgICAgIG5hbWVfZm9ybXVsYSAgPT4gJz1TaGVldDEhJEIkMScsCisgICAgKTsKKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworPW92ZXIKKworPWl0ZW0gKiBDPHZhbHVlcz4KKworVGhpcyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcHJvcGVydHkgb2YgYSBzZXJpZXMgYW5kIG11c3QgYmUgc2V0IGZvciBldmVyeSBjaGFydCBvYmplY3QuIEl0IGxpbmtzIHRoZSBjaGFydCB3aXRoIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IGl0IGRpc3BsYXlzLiBOb3RlIHRoZSBmb3JtYXQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGZvcm11bGEuIFNlZSBMPC9Xb3JraW5nIHdpdGggQ2VsbCBSYW5nZXM+LgorCis9aXRlbSAqIEM8Y2F0ZWdvcmllcz4KKworVGhpcyBzZXRzIHRoZSBjaGFydCBjYXRlZ29yeSBsYWJlbHMuIFRoZSBjYXRlZ29yeSBpcyBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgYXMgdGhlIFgtYXhpcy4gSW4gbW9zdCBjaGFydCB0eXBlcyB0aGUgQzxjYXRlZ29yaWVzPiBwcm9wZXJ0eSBpcyBvcHRpb25hbCBhbmQgdGhlIGNoYXJ0IHdpbGwganVzdCBhc3N1bWUgYSBzZXF1ZW50aWFsIHNlcmllcyBmcm9tIEM8MSAuLiBuPi4KKworPWl0ZW0gKiBDPG5hbWU+CisKK1NldCB0aGUgbmFtZSBmb3IgdGhlIHNlcmllcy4gVGhlIG5hbWUgaXMgZGlzcGxheWVkIGluIHRoZSBjaGFydCBsZWdlbmQgYW5kIGluIHRoZSBmb3JtdWxhIGJhci4gVGhlIG5hbWUgcHJvcGVydHkgaXMgb3B0aW9uYWwgYW5kIGlmIGl0IGlzbid0IHN1cHBsaWVkIHdpbGwgZGVmYXVsdCB0byBDPFNlcmllcyAxIC4uIG4+LgorCis9aXRlbSAqIEM8bmFtZV9mb3JtdWxhPgorCitPcHRpb25hbCwgY2FuIGJlIHVzZWQgdG8gbGluayB0aGUgbmFtZSB0byBhIHdvcmtzaGVldCBjZWxsLiBTZWUgTDwvQ2hhcnQgbmFtZXMgYW5kIGxpbmtzPi4KKworPWJhY2sKKworWW91IGNhbiBhZGQgbW9yZSB0aGFuIG9uZSBzZXJpZXMgdG8gYSBjaGFydCwgaW4gZmFjdCBzb21lIGNoYXJ0IHR5cGVzIHN1Y2ggYXMgQzxzdG9jaz4gcmVxdWlyZSBpdC4gVGhlIHNlcmllcyBudW1iZXJpbmcgYW5kIG9yZGVyIGluIHRoZSBmaW5hbCBjaGFydCBpcyB0aGUgc2FtZSBhcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhhdCBhcmUgYWRkZWQuCisKKyAgICAjIEFkZCB0aGUgZmlyc3Qgc2VyaWVzLgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKworICAgICMgQWRkIGFub3RoZXIgc2VyaWVzLiBDYXRlZ29yeSBpcyB0aGUgc2FtZSBidXQgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworCisKKworPWhlYWQyIHNldF94X2F4aXMoKQorCitUaGUgQzxzZXRfeF9heGlzKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBYIGF4aXMuCisKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKG0pJyApOworCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8bmFtZT4KKworU2V0IHRoZSBuYW1lICh0aXRsZSBvciBjYXB0aW9uKSBmb3IgdGhlIGF4aXMuIFRoZSBuYW1lIGlzIGRpc3BsYXllZCBiZWxvdyB0aGUgWCBheGlzLiBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLiBUaGUgZGVmYXVsdCBpcyB0byBoYXZlIG5vIGF4aXMgbmFtZS4KKworPWl0ZW0gKiBDPG5hbWVfZm9ybXVsYT4KKworT3B0aW9uYWwsIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIG5hbWUgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gU2VlIEw8L0NoYXJ0IG5hbWVzIGFuZCBsaW5rcz4uCisKKz1iYWNrCisKK0FkZGl0aW9uYWwgYXhpcyBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmFuZ2UsIGRpdmlzaW9ucyBhbmQgdGlja3Mgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBpbiBsYXRlciByZWxlYXNlcy4gU2VlIHRoZSBMPC9UT0RPPiBzZWN0aW9uLgorCisKKz1oZWFkMiBzZXRfeV9heGlzKCkKKworVGhlIEM8c2V0X3lfYXhpcygpPiBtZXRob2QgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcyBvZiB0aGUgWSBheGlzLgorCisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgd2VpZ2h0IChrZyknICk7CisKK1RoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzxuYW1lPgorCitTZXQgdGhlIG5hbWUgKHRpdGxlIG9yIGNhcHRpb24pIGZvciB0aGUgYXhpcy4gVGhlIG5hbWUgaXMgZGlzcGxheWVkIHRvIHRoZSBsZWZ0IG9mIHRoZSBZIGF4aXMuIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwuIFRoZSBkZWZhdWx0IGlzIHRvIGhhdmUgbm8gYXhpcyBuYW1lLgorCis9aXRlbSAqIEM8bmFtZV9mb3JtdWxhPgorCitPcHRpb25hbCwgY2FuIGJlIHVzZWQgdG8gbGluayB0aGUgbmFtZSB0byBhIHdvcmtzaGVldCBjZWxsLiBTZWUgTDwvQ2hhcnQgbmFtZXMgYW5kIGxpbmtzPi4KKworPWJhY2sKKworQWRkaXRpb25hbCBheGlzIHByb3BlcnRpZXMgc3VjaCBhcyByYW5nZSwgZGl2aXNpb25zIGFuZCB0aWNrcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGluIGxhdGVyIHJlbGVhc2VzLiBTZWUgdGhlIEw8L1RPRE8+IHNlY3Rpb24uCisKKz1oZWFkMiBzZXRfdGl0bGUoKQorCitUaGUgQzxzZXRfdGl0bGUoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IHRpdGxlLgorCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1llYXIgRW5kIFJlc3VsdHMnICk7CisKK1RoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzxuYW1lPgorCitTZXQgdGhlIG5hbWUgKHRpdGxlKSBmb3IgdGhlIGNoYXJ0LiBUaGUgbmFtZSBpcyBkaXNwbGF5ZWQgYWJvdmUgdGhlIGNoYXJ0LiBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLiBUaGUgZGVmYXVsdCBpcyB0byBoYXZlIG5vIGNoYXJ0IHRpdGxlLgorCis9aXRlbSAqIEM8bmFtZV9mb3JtdWxhPgorCitPcHRpb25hbCwgY2FuIGJlIHVzZWQgdG8gbGluayB0aGUgbmFtZSB0byBhIHdvcmtzaGVldCBjZWxsLiBTZWUgTDwvQ2hhcnQgbmFtZXMgYW5kIGxpbmtzPi4KKworPWJhY2sKKworCis9aGVhZDIgc2V0X2xlZ2VuZCgpCisKK1RoZSBDPHNldF9sZWdlbmQoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IGxlZ2VuZC4KKworICAgICRjaGFydC0+c2V0X2xlZ2VuZCggcG9zaXRpb24gPT4gJ25vbmUnICk7CisKK1RoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzxwb3NpdGlvbj4KKworU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcnQgbGVnZW5kLgorCisgICAgJGNoYXJ0LT5zZXRfbGVnZW5kKCBwb3NpdGlvbiA9PiAnbm9uZScgKTsKKworVGhlIGRlZmF1bHQgbGVnZW5kIHBvc2l0aW9uIGlzIEM8Ym90dG9tPi4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2hhcnQgcG9zaXRpb25zIGFyZToKKworICAgIG5vbmUKKyAgICBib3R0b20KKworVGhlIG90aGVyIGxlZ2VuZCBwb3NpdGlvbnMgd2lsbCBiZSBhZGRlZCBzb29uLgorCis9YmFjaworCisKKz1oZWFkMiBzZXRfY2hhcnRhcmVhKCkKKworVGhlIEM8c2V0X2NoYXJ0YXJlYSgpPiBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IGFyZWEuIEluIEV4Y2VsIHRoZSBjaGFydCBhcmVhIGlzIHRoZSBiYWNrZ3JvdW5kIGFyZWEgYmVoaW5kIHRoZSBjaGFydC4KKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworPW92ZXIKKworPWl0ZW0gKiBDPGNvbG9yPgorCitTZXQgdGhlIGNvbG91ciBvZiB0aGUgY2hhcnQgYXJlYS4gVGhlIEV4Y2VsIGRlZmF1bHQgY2hhcnQgYXJlYSBjb2xvciBpcyAnd2hpdGUnLCBpbmRleCA5LiBTZWUgTDwvQ2hhcnQgb2JqZWN0IGNvbG91cnM+LgorCis9aXRlbSAqIEM8bGluZV9jb2xvcj4KKworU2V0IHRoZSBjb2xvdXIgb2YgdGhlIGNoYXJ0IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IGJvcmRlciBsaW5lIGNvbG91ciBpcyAnYmxhY2snLCBpbmRleCA5LiAgU2VlIEw8L0NoYXJ0IG9iamVjdCBjb2xvdXJzPi4KKworPWl0ZW0gKiBDPGxpbmVfcGF0dGVybj4KKworU2V0IHRoZSBwYXR0ZXJuIG9mIHRoZSBvZiB0aGUgY2hhcnQgYXJlYSBib3JkZXIgbGluZS4gVGhlIEV4Y2VsIGRlZmF1bHQgcGF0dGVybiBpcyAnbm9uZScsIGluZGV4IDAgZm9yIGEgY2hhcnQgc2hlZXQgYW5kICdzb2xpZCcsIGluZGV4IDEsIGZvciBhbiBlbWJlZGRlZCBjaGFydC4gU2VlIEw8L0NoYXJ0IGxpbmUgcGF0dGVybnM+LgorCis9aXRlbSAqIEM8bGluZV93ZWlnaHQ+CisKK1NldCB0aGUgd2VpZ2h0IG9mIHRoZSBvZiB0aGUgY2hhcnQgYXJlYSBib3JkZXIgbGluZS4gVGhlIEV4Y2VsIGRlZmF1bHQgd2VpZ2h0IGlzICduYXJyb3cnLCBpbmRleCAyLiBTZWUgTDwvQ2hhcnQgbGluZSB3ZWlnaHRzPi4KKworPWJhY2sKKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIHNldHRpbmcgc2V2ZXJhbCBwcm9wZXJ0aWVzOgorCisgICAgJGNoYXJ0LT5zZXRfY2hhcnRhcmVhKAorICAgICAgICBjb2xvciAgICAgICAgPT4gJ3JlZCcsCisgICAgICAgIGxpbmVfY29sb3IgICA9PiAnYmxhY2snLAorICAgICAgICBsaW5lX3BhdHRlcm4gPT4gMiwKKyAgICAgICAgbGluZV93ZWlnaHQgID0+IDMsCisgICAgKTsKKworTm90ZSwgZm9yIGNoYXJ0IHNoZWV0cyB0aGUgY2hhcnQgYXJlYSBib3JkZXIgaXMgb2ZmIGJ5IGRlZmF1bHQuIEZvciBlbWJlZGRlZCBjaGFydHMgaXMgaXMgb24gYnkgZGVmYXVsdC4KKworPWhlYWQyIHNldF9wbG90YXJlYSgpCisKK1RoZSBDPHNldF9wbG90YXJlYSgpPiBtZXRob2QgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcyBvZiB0aGUgcGxvdCBhcmVhIG9mIGEgY2hhcnQuIEluIEV4Y2VsIHRoZSBwbG90IGFyZWEgaXMgdGhlIGFyZWEgYmV0d2VlbiB0aGUgYXhlcyBvbiB3aGljaCB0aGUgY2hhcnQgc2VyaWVzIGFyZSBwbG90dGVkLgorCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8dmlzaWJsZT4KKworU2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwbG90IGFyZWEuIFRoZSBkZWZhdWx0IGlzIDEgZm9yIHZpc2libGUuIFNldCB0byAwIHRvIGhpZGUgdGhlIHBsb3QgYXJlYSBhbmQgaGF2ZSB0aGUgc2FtZSBjb2xvdXIgYXMgdGhlIGJhY2tncm91bmQgY2hhcnQgYXJlYS4KKworPWl0ZW0gKiBDPGNvbG9yPgorCitTZXQgdGhlIGNvbG91ciBvZiB0aGUgcGxvdCBhcmVhLiBUaGUgRXhjZWwgZGVmYXVsdCBwbG90IGFyZWEgY29sb3IgaXMgJ3NpbHZlcicsIGluZGV4IDIzLiBTZWUgTDwvQ2hhcnQgb2JqZWN0IGNvbG91cnM+LgorCis9aXRlbSAqIEM8bGluZV9jb2xvcj4KKworU2V0IHRoZSBjb2xvdXIgb2YgdGhlIHBsb3QgYXJlYSBib3JkZXIgbGluZS4gVGhlIEV4Y2VsIGRlZmF1bHQgYm9yZGVyIGxpbmUgY29sb3VyIGlzICdncmF5JywgaW5kZXggMjIuIFNlZSBMPC9DaGFydCBvYmplY3QgY29sb3Vycz4uCisKKz1pdGVtICogQzxsaW5lX3BhdHRlcm4+CisKK1NldCB0aGUgcGF0dGVybiBvZiB0aGUgb2YgdGhlIHBsb3QgYXJlYSBib3JkZXIgbGluZS4gVGhlIEV4Y2VsIGRlZmF1bHQgcGF0dGVybiBpcyAnc29saWQnLCBpbmRleCAxLiBTZWUgTDwvQ2hhcnQgbGluZSBwYXR0ZXJucz4uCisKKz1pdGVtICogQzxsaW5lX3dlaWdodD4KKworU2V0IHRoZSB3ZWlnaHQgb2YgdGhlIG9mIHRoZSBwbG90IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IHdlaWdodCBpcyAnbmFycm93JywgaW5kZXggMi4gU2VlIEw8L0NoYXJ0IGxpbmUgd2VpZ2h0cz4uCisKKz1iYWNrCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBzZXR0aW5nIHNldmVyYWwgcHJvcGVydGllczoKKworICAgICRjaGFydC0+c2V0X3Bsb3RhcmVhKAorICAgICAgICBjb2xvciAgICAgICAgPT4gJ3JlZCcsCisgICAgICAgIGxpbmVfY29sb3IgICA9PiAnYmxhY2snLAorICAgICAgICBsaW5lX3BhdHRlcm4gPT4gMiwKKyAgICAgICAgbGluZV93ZWlnaHQgID0+IDMsCisgICAgKTsKKworCisKKz1oZWFkMSBXT1JLU0hFRVQgTUVUSE9EUworCitJbiBFeGNlbCBhIGNoYXJ0IHNoZWV0IChpLmUsIGEgY2hhcnQgdGhhdCBpc24ndCBlbWJlZGRlZCkgc2hhcmVzIHByb3BlcnRpZXMgd2l0aCBkYXRhIHdvcmtzaGVldHMgc3VjaCBhcyB0YWIgc2VsZWN0aW9uLCBoZWFkZXJzLCBmb290ZXJzLCBtYXJnaW5zIGFuZCBwcmludCBwcm9wZXJ0aWVzLgorCitJbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB5b3UgY2FuIHNldCBjaGFydCBzaGVldCBwcm9wZXJ0aWVzIHVzaW5nIHRoZSBzYW1lIG1ldGhvZHMgdGhhdCBhcmUgdXNlZCBmb3IgV29ya3NoZWV0IG9iamVjdHMuCisKK1RoZSBmb2xsb3dpbmcgV29ya3NoZWV0IG1ldGhvZHMgYXJlIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggYSBub24tZW1iZWRkZWQgQ2hhcnQgb2JqZWN0OgorCisgICAgZ2V0X25hbWUoKQorICAgIGFjdGl2YXRlKCkKKyAgICBzZWxlY3QoKQorICAgIGhpZGUoKQorICAgIHNldF9maXJzdF9zaGVldCgpCisgICAgcHJvdGVjdCgpCisgICAgc2V0X3pvb20oKQorICAgIHNldF90YWJfY29sb3IoKQorCisgICAgc2V0X2xhbmRzY2FwZSgpCisgICAgc2V0X3BvcnRyYWl0KCkKKyAgICBzZXRfcGFwZXIoKQorICAgIHNldF9tYXJnaW5zKCkKKyAgICBzZXRfaGVhZGVyKCkKKyAgICBzZXRfZm9vdGVyKCkKKworU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+IGZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZXNlIG1ldGhvZHMuCisKKz1oZWFkMSBFWEFNUExFCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIHNvbWUgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcyB3aGVuIGNyZWF0aW5nIGEgY2hhcnQuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9hcmVhLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnTnVtYmVyJywgJ1NhbXBsZSAxJywgJ1NhbXBsZSAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworCisgICAgIyBDcmVhdGUgYSBuZXcgY2hhcnQgb2JqZWN0LiBJbiB0aGlzIGNhc2UgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgZmlyc3Qgc2VyaWVzLiAoU2FtcGxlIDEpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMScsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2Vjb25kIHNlcmllcy4gKFNhbXBsZSAyKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDInLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICApOworCisgICAgIyBBZGQgYSBjaGFydCB0aXRsZSBhbmQgc29tZSBheGlzIGxhYmVscy4KKyAgICAkY2hhcnQtPnNldF90aXRsZSAoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnVGVzdCBudW1iZXInICk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgd29ya3NoZWV0ICh3aXRoIGFuIG9mZnNldCkuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRDInLCAkY2hhcnQsIDI1LCAxMCApOworCisgICAgX19FTkRfXworCisKKz1iZWdpbiBodG1sCisKKzxwPlRoaXMgd2lsbCBwcm9kdWNlIGEgY2hhcnQgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2FyZWExLmpwZyIgd2lkdGg9IjUyNyIgaGVpZ2h0PSIzMjAiIGFsdD0iQ2hhcnQgZXhhbXBsZS4iIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCis9aGVhZDEgQ2hhcnQgb2JqZWN0IGNvbG91cnMKKworTWFueSBvZiB0aGUgY2hhcnQgb2JqZWN0cyBzdXBwb3J0ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjbCBhbGxvdyB0aGUgZGVmYXVsdCBjb2xvdXJzIHRvIGJlIGNoYW5nZWQuIEV4Y2VsIHByb3ZpZGVzIGEgcGFsZXR0ZSBvZiA1NiBjb2xvdXJzIGFuZCBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0aGVzZSBjb2xvdXJzIGFyZSBhY2Nlc3NlZCB2aWEgdGhlaXIgcGFsZXR0ZSBpbmRleCBpbiB0aGUgcmFuZ2UgOC4uNjMuCisKK1RoZSBtb3N0IGNvbW1vbmx5IHVzZWQgY29sb3VycyBjYW4gYmUgYWNjZXNzZWQgYnkgbmFtZSBvciBpbmRleC4KKworICAgIGJsYWNrICAgPT4gICA4LCAgICBncmVlbiAgICA9PiAgMTcsICAgIG5hdnkgICAgID0+ICAxOCwKKyAgICB3aGl0ZSAgID0+ICAgOSwgICAgb3JhbmdlICAgPT4gIDUzLCAgICBwaW5rICAgICA9PiAgMzMsCisgICAgcmVkICAgICA9PiAgMTAsICAgIGdyYXkgICAgID0+ICAyMywgICAgcHVycGxlICAgPT4gIDIwLAorICAgIGJsdWUgICAgPT4gIDEyLCAgICBsaW1lICAgICA9PiAgMTEsICAgIHNpbHZlciAgID0+ICAyMiwKKyAgICB5ZWxsb3cgID0+ICAxMywgICAgY3lhbiAgICAgPT4gIDE1LAorICAgIGJyb3duICAgPT4gIDE2LCAgICBtYWdlbnRhICA9PiAgMTQsCisKK0ZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQuCisKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggY29sb3IgPT4gMTAgICAgKTsKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggY29sb3IgPT4gJ3JlZCcgKTsKKworVGhlIGNvbG91ciBwYWxldHRlIGlzIHNob3duIGluIEM8cGFsZXR0ZS5odG1sPiBpbiB0aGUgQzxkb2NzPiBkaXJlY3RvcnkgIG9mIHRoZSBkaXN0cm8uIEFuIEV4Y2VsIHZlcnNpb24gb2YgdGhlIHBhbGV0dGUgY2FuIGJlIGdlbmVyYXRlZCB1c2luZyBDPGNvbG9ycy5wbD4gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeS4KKworVXNlciBkZWZpbmVkIGNvbG91cnMgY2FuIGJlIHNldCB1c2luZyB0aGUgQzxzZXRfY3VzdG9tX2NvbG9yKCk+IHdvcmtib29rIG1ldGhvZC4gVGhpcyBhbmQgb3RoZXIgYXNwZWN0cyBvZiB1c2luZyBjb2xvdXJzIGFyZSBkaXNjdXNzZWQgaW4gdGhlICJDb2xvdXJzIGluIEV4Y2VsIiBzZWN0aW9uIG9mIHRoZSBtYWluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb246IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwvbGliL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwucG0jQ09MT1VSU19JTl9FWENFTD4uCisKKz1oZWFkMSBDaGFydCBsaW5lIHBhdHRlcm5zCisKK0NoYXJ0IGxpbmVzIHBhdHRlcm5zIGNhbiBiZSBzZXQgdXNpbmcgZWl0aGVyIGFuIGluZGV4IG9yIGEgbmFtZToKKworICAgICRjaGFydC0+c2V0X3Bsb3RhcmVhKCB3ZWlnaHQgPT4gMiAgICAgICk7CisgICAgJGNoYXJ0LT5zZXRfcGxvdGFyZWEoIHdlaWdodCA9PiAnZGFzaCcgKTsKKworQ2hhcnQgbGluZXMgaGF2ZSA5IHBvc3NpYmxlIHBhdHRlcm5zIGFyZSBmb2xsb3dzOgorCisgICAgJ25vbmUnICAgICAgICAgPT4gMCwKKyAgICAnc29saWQnICAgICAgICA9PiAxLAorICAgICdkYXNoJyAgICAgICAgID0+IDIsCisgICAgJ2RvdCcgICAgICAgICAgPT4gMywKKyAgICAnZGFzaC1kb3QnICAgICA9PiA0LAorICAgICdkYXNoLWRvdC1kb3QnID0+IDUsCisgICAgJ21lZGl1bS1ncmF5JyAgPT4gNiwKKyAgICAnZGFyay1ncmF5JyAgICA9PiA3LAorICAgICdsaWdodC1ncmF5JyAgID0+IDgsCisKK1RoZSBwYXR0ZXJucyAxLTggYXJlIHNob3duIGluIG9yZGVyIGluIHRoZSBkcm9wIGRvd24gZGlhbG9nIGJveGVzIGluIEV4Y2VsLiBUaGUgZGVmYXVsdCBwYXR0ZXJuIGlzICdzb2xpZCcsIGluZGV4IDEuCisKKworPWhlYWQxIENoYXJ0IGxpbmUgd2VpZ2h0cworCitDaGFydCBsaW5lcyB3ZWlnaHRzIGNhbiBiZSBzZXQgdXNpbmcgZWl0aGVyIGFuIGluZGV4IG9yIGEgbmFtZToKKworICAgICRjaGFydC0+c2V0X3Bsb3RhcmVhKCB3ZWlnaHQgPT4gMSAgICAgICAgICApOworICAgICRjaGFydC0+c2V0X3Bsb3RhcmVhKCB3ZWlnaHQgPT4gJ2hhaXJsaW5lJyApOworCitDaGFydCBsaW5lcyBoYXZlIDQgcG9zc2libGUgd2VpZ2h0cyBhcmUgZm9sbG93czoKKworICAgICdoYWlybGluZScgPT4gMSwKKyAgICAnbmFycm93JyAgID0+IDIsCisgICAgJ21lZGl1bScgICA9PiAzLAorICAgICd3aWRlJyAgICAgPT4gNCwKKworVGhlIHdlaWdodHMgMS00IGFyZSBzaG93biBpbiBvcmRlciBpbiB0aGUgZHJvcCBkb3duIGRpYWxvZyBib3hlcyBpbiBFeGNlbC4gVGhlIGRlZmF1bHQgd2VpZ2h0IGlzICduYXJyb3cnLCBpbmRleCAyLgorCisKKz1oZWFkMSBDaGFydCBuYW1lcyBhbmQgbGlua3MKKworVGhlIEM8YWRkX3NlcmllcygpKT4sIEM8c2V0X3hfYXhpcygpPiwgQzxzZXRfeV9heGlzKCk+IGFuZCBDPHNldF90aXRsZSgpPiBtZXRob2RzIGFsbCBzdXBwb3J0IGEgQzxuYW1lPiBwcm9wZXJ0eS4gSW4gZ2VuZXJhbCB0aGVzZSBuYW1lcyBjYW4gYmUgZWl0aGVyIGEgc3RhdGljIHN0cmluZyBvciBhIGxpbmsgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gSWYgeW91IGNob29zZSB0byB1c2UgdGhlIEM8bmFtZV9mb3JtdWxhPiBwcm9wZXJ0eSB0byBzcGVjaWZ5IGEgbGluayB0aGVuIHlvdSBzaG91bGQgYWxzbyB0aGUgQzxuYW1lPiBwcm9wZXJ0eS4gVGhpcyBpc24ndCBzdHJpY3RseSByZXF1aXJlZCBieSBFeGNlbCBidXQgc29tZSB0aGlyZCBwYXJ0eSBhcHBsaWNhdGlvbnMgZXhwZWN0IGl0IHRvIGJlIHByZXNlbnQuCisKKyAgICAkY2hhcnQtPnNldF90aXRsZSgKKyAgICAgICAgbmFtZSAgICAgICAgICA9PiAnWWVhciBFbmQgUmVzdWx0cycsCisgICAgICAgIG5hbWVfZm9ybXVsYSAgPT4gJz1TaGVldDEhJEMkMScsCisgICAgKTsKKworVGhlc2UgbGlua3Mgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5IHNpbmNlIHRoZXkgYXJlbid0IGNvbW1vbmx5IHVzZWQgaW4gRXhjZWwgY2hhcnRzLgorCisKKz1oZWFkMSBDaGFydCBuYW1lcyBhbmQgVW5pY29kZQorCitUaGUgQzxhZGRfc2VyaWVzKCkpPiwgQzxzZXRfeF9heGlzKCk+LCBDPHNldF95X2F4aXMoKT4gYW5kIEM8c2V0X3RpdGxlKCk+IG1ldGhvZHMgYWxsIHN1cHBvcnQgYSBDPG5hbWU+IHByb3BlcnR5LiBUaGVzZSBuYW1lcyBjYW4gYmUgVVRGOCBzdHJpbmdzIGlmIHlvdSBhcmUgdXNpbmcgcGVybCA1LjgrLgorCisKKyAgICAjIHBlcmwgNS44KyBleGFtcGxlOgorICAgIG15ICRzbWlsZXkgPSAiXHh7MjYzQX0iOworCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gIkJlc3QuIFJlc3VsdHMuIEV2ZXIhICRzbWlsZXkiICk7CisKK0ZvciBvbGRlciBwZXJscyB5b3Ugd3JpdGUgVW5pY29kZSBzdHJpbmdzIGFzIFVURi0xNkJFIGJ5IGFkZGluZyBhIEM8bmFtZV9lbmNvZGluZz4gcHJvcGVydHk6CisKKyAgICAjIHBlcmwgNS4wMDUgZXhhbXBsZToKKyAgICBteSAkdXRmMTZiZV9uYW1lID0gcGFjayAnbicsIDB4MjYzQTsKKworICAgICRjaGFydC0+c2V0X3RpdGxlKAorICAgICAgICBuYW1lICAgICAgICAgID0+ICR1dGYxNmJlX25hbWUsCisgICAgICAgIG5hbWVfZW5jb2RpbmcgPT4gMSwKKyAgICApOworCitUaGlzIG1ldGhvZG9sb2d5IGlzIGV4cGxhaW5lZCBpbiB0aGUgIlVOSUNPREUgSU4gRVhDRUwiIHNlY3Rpb24gb2YgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4gYnV0IGlzIHNlbWktZGVwcmVjYXRlZC4gSWYgeW91IGFyZSB1c2luZyBVbmljb2RlIHRoZSBlYXNpZXN0IG9wdGlvbiBpcyB0byBqdXN0IHVzZSBVVEY4IGluIHBlcmwgNS44Ky4KKworCis9aGVhZDEgV29ya2luZyB3aXRoIENlbGwgUmFuZ2VzCisKKworSW4gdGhlIHNlY3Rpb24gb24gQzxhZGRfc2VyaWVzKCk+IGl0IHdhcyBub3RlZCB0aGF0IHRoZSBzZXJpZXMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGEgcmFuZ2UgZm9ybXVsYToKKworICAgICRjaGFydC0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkMTAnICk7CisKK1RoZSB3b3Jrc2hlZXQgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCAoZXZlbiBmb3IgZW1iZWRkZWQgY2hhcnRzKSBhbmQgdGhlIGNlbGwgcmVmZXJlbmNlcyBtdXN0IGJlICJhYnNvbHV0ZSIgcmVmZXJlbmNlcywgaS5lLiwgdGhleSBtdXN0IGNvbnRhaW4gQzwkPiBzaWducy4gVGhpcyBpcyB0aGUgZm9ybWF0IHRoYXQgaXMgcmVxdWlyZWQgYnkgRXhjZWwgZm9yIGNoYXJ0IHJlZmVyZW5jZXMuCisKK1NpbmNlIGl0IGlzbid0IHZlcnkgY29udmVuaWVudCB0byB3b3JrIHdpdGggdGhpcyB0eXBlIG9mIHN0cmluZyBwcm9ncmFtbWF0aWNhbGx5IHRoZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUsIHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwsIHByb3ZpZGVzIGEgZnVuY3Rpb24gY2FsbGVkIEM8eGxfcmFuZ2VfZm9ybXVsYSgpPiB0byBjb252ZXJ0IGZyb20gemVybyBiYXNlZCByb3cgYW5kIGNvbHVtbiBjZWxsIHJlZmVyZW5jZXMgdG8gYW4gQTEgc3R5bGUgZm9ybXVsYSBzdHJpbmcuCisKK1RoZSBzeW50YXggaXM6CisKKyAgICB4bF9yYW5nZV9mb3JtdWxhKCRzaGVldG5hbWUsICRyb3dfMSwgJHJvd18yLCAkY29sXzEsICRjb2xfMikKKworSWYgeW91IGluY2x1ZGUgaXQgaW4geW91ciBwcm9ncmFtLCB1c2luZyB0aGUgc3RhbmRhcmQgaW1wb3J0IHN5bnRheCwgeW91IGNhbiB1c2UgdGhlIGZ1bmN0aW9uIGFzIGZvbGxvd3M6CisKKworICAgICMgSW5jbHVkZSB0aGUgVXRpbGl0eSBtb2R1bGUgb3IganVzdCB0aGUgZnVuY3Rpb24geW91IG5lZWQuCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5IHF3KCB4bF9yYW5nZV9mb3JtdWxhICk7CisgICAgLi4uCisKKyAgICAjIFRoZW4gdXNlIGl0IGFzIHJlcXVpcmVkLgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyAgICA9PiB4bF9yYW5nZV9mb3JtdWxhKCAnU2hlZXQxJywgMSwgOSwgMCwgMCApLAorICAgICAgICB2YWx1ZXMgICAgICAgID0+IHhsX3JhbmdlX2Zvcm11bGEoICdTaGVldDEnLCAxLCA5LCAxLCAxICk7LAorICAgICk7CisKKyAgICAjIFdoaWNoIGlzIHRoZSBzYW1lIGFzOgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyAgICA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJywKKyAgICApOworCitTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gZm9yIG1vcmUgZGV0YWlscy4KKworCis9aGVhZDEgVE9ETworCitDaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYXJlIGEgd29yayBpbiBwcm9ncmVzcy4gTW9yZSBjaGFydCB0eXBlcyBhbmQgZmVhdHVyZXMgd2lsbCBiZSBhZGRlZCBpbiB0aW1lLiBQbGVhc2UgYmUgcGF0aWVudC4gRXZlbiBhIHNtYWxsIGZlYXR1cmUgY2FuIHRha2UgYSB3ZWVrIG9yIG1vcmUgdG8gaW1wbGVtZW50LCB0ZXN0IGFuZCBkb2N1bWVudC4KKworRmVhdHVyZXMgdGhhdCBhcmUgb24gdGhlIFRPRE8gbGlzdCBhbmQgd2lsbCBiZSBhZGRlZCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogIENoYXJ0IHN1Yi10eXBlcy4KKworPWl0ZW0gKiBDb2xvdXJzIGFuZCBmb3JtYXR0aW5nIG9wdGlvbnMuIEZvciBub3cgeW91IHdpbGwgaGF2ZSB0byBtYWtlIGRvIHdpdGggdGhlIGRlZmF1bHQgRXhjZWwgY29sb3VycyBhbmQgZm9ybWF0cy4KKworPWl0ZW0gKiBBeGlzIGNvbnRyb2xzLCBncmlkbGluZXMuCisKKz1pdGVtICogM0QgY2hhcnRzLgorCis9aXRlbSAqIEVtYmVkZGVkIGRhdGEgaW4gY2hhcnRzIGZvciB0aGlyZCBwYXJ0eSBhcHBsaWNhdGlvbiBzdXBwb3J0LiBTZWUgS25vd24gSXNzdWVzLgorCis9aXRlbSAqIEFkZGl0aW9uYWwgY2hhcnQgdHlwZXMgc3VjaCBhcyBCdWJibGUgYW5kIFJhZGFyLiBTZW5kIGFuIGVtYWlsIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBvdGhlciB0eXBlcyBhbmQgdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS4KKworPWJhY2sKKworSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHNwb25zb3JpbmcgYSBmZWF0dXJlIGxldCBtZSBrbm93LgorCis9aGVhZDEgS05PV04gSVNTVUVTCisKKz1vdmVyCisKKz1pdGVtICogQ3VycmVudGx5IGNoYXJ0cyBkb24ndCBjb250YWluIGVtYmVkZGVkIGRhdGEgZnJvbSB3aGljaCB0aGUgY2hhcnRzIGNhbiBiZSByZW5kZXJlZC4gRXhjZWwgYW5kIG1vc3Qgb3RoZXIgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIGlnbm9yZSB0aGlzIGFuZCByZWFkIHRoZSBkYXRhIHZpYSB0aGUgbGlua3MgdGhhdCBoYXZlIGJlZW4gc3BlY2lmaWVkLiBIb3dldmVyLCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgY29tcGxhaW4gb3Igbm90IHJlbmRlciBjaGFydHMgY29ycmVjdGx5LiBUaGUgcHJldmlldyBvcHRpb24gaW4gTWFjIE9TIFggaXMgYW4ga25vd24gZXhhbXBsZS4gVGhpcyB3aWxsIGJlIGZpeGVkIGluIGEgbGF0ZXIgcmVsZWFzZS4KKworPWl0ZW0gKiBXaGVuIHRoZXJlIGFyZSBzZXZlcmFsIGNoYXJ0cyB3aXRoIHRpdGxlcyBzZXQgaW4gYSB3b3JrYm9vayBzb21lIG9mIHRoZSB0aXRsZXMgbWF5IGRpc3BsYXkgYXQgYSBmb250IHNpemUgb2YgMTAgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAxMiB1bnRpbCBhbm90aGVyIGNoYXJ0IHdpdGggdGhlIHRpdGxlIHNldCBpcyB2aWV3ZWQuCisKKz1pdGVtICogU3RvY2sgKGFuZCBvdGhlcikgY2hhcnRzIHNob3VsZCBoYXZlIHRoZSBYLWF4aXMgZGF0ZXMgYWxpZ25lZCBhdCBhbiBhbmdsZSBmb3IgY2xhcml0eS4gVGhpcyB3aWxsIGJlIGZpeGVkIGF0IGEgbGF0ZXIgc3RhZ2UuCisKKz1iYWNrCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9BcmVhLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9BcmVhLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjU3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0FyZWEucG0KQEAgLTAsMCArMSwxOTQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpBcmVhOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEFyZWEgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgQXJlYSBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIFNlZSBmb3JtYXR0aW5nIG5vdGUgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfdHlwZSgpCisjCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgZnJvbSB0aGUgc3BlY2lmaWMgY2hhcnQgY2xhc3MuCisjCisjIFdyaXRlIHRoZSBBUkVBIGNoYXJ0IEJJRkYgcmVjb3JkLiBEZWZpbmVzIGEgYXJlYSBjaGFydCB0eXBlLgorIworc3ViIF9zdG9yZV9jaGFydF90eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDFBOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkZ3JiaXQgID0gMHgwMDAxOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworQXJlYSAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBBcmVhIGNoYXJ0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1RvIGNyZWF0ZSBhIHNpbXBsZSBFeGNlbCBmaWxlIHdpdGggYSBBcmVhIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgQXJlYSBjaGFydHMgZm9yIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGUgY2hhcnQgb2JqZWN0IGlzIGNyZWF0ZWQgdmlhIHRoZSBXb3JrYm9vayBDPGFkZF9jaGFydCgpPiBtZXRob2Q6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgQXJlYSBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IGFyZWEgY2hhcnQgc3BlY2lmaWMgbWV0aG9kcy4gU2VlIHRoZSBUT0RPIHNlY3Rpb24gb2YgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfYXJlYS54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdhcmVhJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9hcmVhMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9CYXIucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0Jhci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBkOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9CYXIucG0KQEAgLTAsMCArMSwyMjggQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpCYXI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQmFyIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIEJhciBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIFNlZSBmb3JtYXR0aW5nIG5vdGUgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKworICAgICMgVGhlIGF4aXMgcG9zaXRpb25zIGFyZSByZXZlcnNlZCBmb3IgYSBiYXIgY2hhcnQgc28gd2UgY2hhbmdlIHRoZSBjb25maWcuCisgICAgbXkgJGMgPSAkc2VsZi0+e19jb25maWd9OworICAgICRjLT57X3hfYXhpc190ZXh0fSAgICAgPSBbIDB4MkQsICAgMHg2RDksICAweDVGLCAgIDB4MUNDLCAweDI4MSwgIDB4MCwgOTAgXTsKKyAgICAkYy0+e194X2F4aXNfdGV4dF9wb3N9ID0gWyAyLCAgICAgIDIsICAgICAgMCwgICAgICAwLCAgICAgMHgxNywgICAweDJBIF07CisgICAgJGMtPntfeV9heGlzX3RleHR9ICAgICA9IFsgMHgwNzhBLCAweDBERkMsIDB4MDExRCwgMHg5QywgIDB4MDA4MSwgMHgwMDAwIF07CisgICAgJGMtPntfeV9heGlzX3RleHRfcG9zfSA9IFsgMiwgICAgICAyLCAgICAgIDAsICAgICAgMCwgICAgIDB4NDUsICAgMHgxNyBdOworCisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgQkFSIGNoYXJ0IEJJRkYgcmVjb3JkLiBEZWZpbmVzIGEgYmFyIG9yIGNvbHVtbiBjaGFydCB0eXBlLgorIworc3ViIF9zdG9yZV9jaGFydF90eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgxMDE3OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMDY7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkcGNPdmVybGFwID0gMHgwMDAwOyAgICAjIFNwYWNlIGJldHdlZW4gYmFycy4KKyAgICBteSAkcGNHYXAgICAgID0gMHgwMDk2OyAgICAjIFNwYWNlIGJldHdlZW4gY2F0cy4KKyAgICBteSAkZ3JiaXQgICAgID0gMHgwMDAxOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHBjT3ZlcmxhcDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHBjR2FwOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhKCkKKyMKKyMgT3ZlcnJpZGUgc29tZSBvZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGRhdGEgZm9yIGFuIGVtYmVkZGVkIGNoYXJ0LgorIworc3ViIF9zZXRfZW1iZWRkZWRfY29uZmlnX2RhdGEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgU2V0IHRoZSBwYXJlbnQgY29uZmlndXJhdGlvbiBmaXJzdC4KKyAgICAkc2VsZi0+U1VQRVI6Ol9zZXRfZW1iZWRkZWRfY29uZmlnX2RhdGEoKTsKKworICAgICMgVGhlIGF4aXMgcG9zaXRpb25zIGFyZSByZXZlcnNlZCBmb3IgYSBiYXIgY2hhcnQgc28gd2UgY2hhbmdlIHRoZSBjb25maWcuCisgICAgbXkgJGMgPSAkc2VsZi0+e19jb25maWd9OworICAgICRjLT57X3hfYXhpc190ZXh0fSAgICAgPSBbIDB4NTcsICAgMHg1QkMsICAweEI1LCAgIDB4MjE0LCAweDI4MSwgMHgwLCA5MCBdOworICAgICRjLT57X3hfYXhpc190ZXh0X3Bvc30gPSBbIDIsICAgICAgMiwgICAgICAwLCAgICAgIDAsICAgICAweDE3LCAgMHgyQSBdOworICAgICRjLT57X3lfYXhpc190ZXh0fSAgICAgPSBbIDB4MDc0QSwgMHgwQzhGLCAweDAyMUYsIDB4MTIzLCAweDgxLCAgMHgwMDAwIF07CisgICAgJGMtPntfeV9heGlzX3RleHRfcG9zfSA9IFsgMiwgICAgICAyLCAgICAgIDAsICAgICAgMCwgICAgIDB4NDUsICAweDE3IF07CisKK30KKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworQmFyIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIEJhciBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgQmFyIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYmFyJyApOworCisgICAgIyBDb25maWd1cmUgdGhlIGNoYXJ0LgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGUgY2hhcnQgcmVmZXJzIHRvLgorICAgIG15ICRkYXRhID0gWworICAgICAgICBbICdDYXRlZ29yeScsIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAnVmFsdWUnLCAgICAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkZGF0YSApOworCisgICAgX19FTkRfXworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBCYXIgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgQmFyIENoYXJ0IE1ldGhvZHMKKworVGhlcmUgYXJlbid0IGN1cnJlbnRseSBhbnkgYmFyIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2Jhci54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgZmlyc3Qgc2VyaWVzLiAoU2FtcGxlIDEpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMScsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2Vjb25kIHNlcmllcy4gKFNhbXBsZSAyKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDInLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICApOworCisgICAgIyBBZGQgYSBjaGFydCB0aXRsZSBhbmQgc29tZSBheGlzIGxhYmVscy4KKyAgICAkY2hhcnQtPnNldF90aXRsZSAoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnVGVzdCBudW1iZXInICk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgd29ya3NoZWV0ICh3aXRoIGFuIG9mZnNldCkuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRDInLCAkY2hhcnQsIDI1LCAxMCApOworCisgICAgX19FTkRfXworCisKKz1iZWdpbiBodG1sCisKKzxwPlRoaXMgd2lsbCBwcm9kdWNlIGEgY2hhcnQgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2JhcjEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQ29sdW1uLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9Db2x1bW4ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkMDQ0MwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQ29sdW1uLnBtCkBAIC0wLDAgKzEsMTk5IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6Q29sdW1uOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENvbHVtbiAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBDb2x1bW4gY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgQkFSIGNoYXJ0IEJJRkYgcmVjb3JkLiBEZWZpbmVzIGEgYmFyIG9yIGNvbHVtbiBjaGFydCB0eXBlLgorIworc3ViIF9zdG9yZV9jaGFydF90eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgxMDE3OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMDY7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkcGNPdmVybGFwID0gMHgwMDAwOyAgICAjIFNwYWNlIGJldHdlZW4gYmFycy4KKyAgICBteSAkcGNHYXAgICAgID0gMHgwMDk2OyAgICAjIFNwYWNlIGJldHdlZW4gY2F0cy4KKyAgICBteSAkZ3JiaXQgICAgID0gMHgwMDAwOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHBjT3ZlcmxhcDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHBjR2FwOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitDb2x1bW4gLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgQ29sdW1uIGNoYXJ0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1RvIGNyZWF0ZSBhIHNpbXBsZSBFeGNlbCBmaWxlIHdpdGggYSBDb2x1bW4gY2hhcnQgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydC54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgbXkgJGNoYXJ0ICAgICA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdjb2x1bW4nICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0NhdGVnb3J5JywgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbICdWYWx1ZScsICAgIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRkYXRhICk7CisKKyAgICBfX0VORF9fCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIENvbHVtbiBjaGFydHMgZm9yIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGUgY2hhcnQgb2JqZWN0IGlzIGNyZWF0ZWQgdmlhIHRoZSBXb3JrYm9vayBDPGFkZF9jaGFydCgpPiBtZXRob2Q6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworCitPbmNlIHRoZSBvYmplY3QgaXMgY3JlYXRlZCBpdCBjYW4gYmUgY29uZmlndXJlZCB2aWEgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgY2hhcnQgY2xhc3NlczoKKworICAgICRjaGFydC0+YWRkX3NlcmllcygpOworICAgICRjaGFydC0+c2V0X3hfYXhpcygpOworICAgICRjaGFydC0+c2V0X3lfYXhpcygpOworICAgICRjaGFydC0+c2V0X3RpdGxlKCk7CisKK1RoZXNlIG1ldGhvZHMgYXJlIGV4cGxhaW5lZCBpbiBkZXRhaWwgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LiBDbGFzcyBzcGVjaWZpYyBtZXRob2RzIG9yIHNldHRpbmdzLCBpZiBhbnksIGFyZSBleHBsYWluZWQgYmVsb3cuCisKKz1oZWFkMSBDb2x1bW4gQ2hhcnQgTWV0aG9kcworCitUaGVyZSBhcmVuJ3QgY3VycmVudGx5IGFueSBjb2x1bW4gY2hhcnQgc3BlY2lmaWMgbWV0aG9kcy4gU2VlIHRoZSBUT0RPIHNlY3Rpb24gb2YgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfY29sdW1uLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnTnVtYmVyJywgJ1NhbXBsZSAxJywgJ1NhbXBsZSAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworCisgICAgIyBDcmVhdGUgYSBuZXcgY2hhcnQgb2JqZWN0LiBJbiB0aGlzIGNhc2UgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBmaXJzdCBzZXJpZXMuIChTYW1wbGUgMSkKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAxJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBzZWNvbmQgc2VyaWVzLiAoU2FtcGxlIDIpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMicsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICk7CisKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBzb21lIGF4aXMgbGFiZWxzLgorICAgICRjaGFydC0+c2V0X3RpdGxlICggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdUZXN0IG51bWJlcicgKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKworICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSB3b3Jrc2hlZXQgKHdpdGggYW4gb2Zmc2V0KS4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdEMicsICRjaGFydCwgMjUsIDEwICk7CisKKyAgICBfX0VORF9fCisKKworPWJlZ2luIGh0bWwKKworPHA+VGhpcyB3aWxsIHByb2R1Y2UgYSBjaGFydCB0aGF0IGxvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY29sdW1uMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9FeHRlcm5hbC5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvRXh0ZXJuYWwucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MGI4NQotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvRXh0ZXJuYWwucG0KQEAgLTAsMCArMSwxMTkgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpFeHRlcm5hbDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBFeHRlcm5hbCAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBleHRlcm5hbCBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorIworIyBwZXJsdGlkeSB3aXRoIG9wdGlvbnM6IC1tYmw9MiAtcHQ9MCAtbm9sYQorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyAgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRleHRlcm5hbF9maWxlbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgICAgICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgJHNlbGYtPntfZmlsZW5hbWV9ICAgICA9ICRleHRlcm5hbF9maWxlbmFtZTsKKyAgICAkc2VsZi0+e19leHRlcm5hbF9iaW59ID0gMTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9pbml0aWFsaXplKCk7ICAgICMgUmVxdWlyZXMgb3ZlcnJpZGRlbiBpbml0aWFsaXplKCkuCisgICAgcmV0dXJuICRzZWxmOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9pbml0aWFsaXplKCkKKyMKKyMgUmVhZCBhbGwgdGhlIGRhdGEgaW50byBtZW1vcnkgZm9yIHRoZSBleHRlcm5hbCBiaW5hcnkgc3R5bGUgY2hhcnQuCisjCisjCitzdWIgX2luaXRpYWxpemUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmaWxlbmFtZSAgID0gJHNlbGYtPntfZmlsZW5hbWV9OworICAgIG15ICRmaWxlaGFuZGxlID0gRmlsZUhhbmRsZS0+bmV3KCAkZmlsZW5hbWUgKQorICAgICAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlbmFtZSBpbiBhZGRfY2hhcnRfZXh0KCk6ICQhLlxuIjsKKworICAgIGJpbm1vZGUoICRmaWxlaGFuZGxlICk7CisKKyAgICAkc2VsZi0+e19maWxlaGFuZGxlfSAgICA9ICRmaWxlaGFuZGxlOworICAgICRzZWxmLT57X2RhdGFzaXplfSAgICAgID0gLXMgJGZpbGVoYW5kbGU7CisgICAgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0gPSAwOworCisgICAgIyBSZWFkIHRoZSBlbnRpcmUgZXh0ZXJuYWwgY2hhcnQgYmluYXJ5IGludG8gdGhlIHRoZSBkYXRhIGJ1ZmZlci4KKyAgICAjIFRoaXMgd2lsbCBiZSByZXRyaWV2ZWQgYnkgX2dldF9kYXRhKCkgd2hlbiB0aGUgY2hhcnQgaXMgY2xvc2VkKCkuCisgICAgcmVhZCggJHNlbGYtPntfZmlsZWhhbmRsZX0sICRzZWxmLT57X2RhdGF9LCAkc2VsZi0+e19kYXRhc2l6ZX0gKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jbG9zZSgpCisjCisjIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIG9yIHN0b3JlIENoYXJ0IGRhdGEgc3RydWN0dXJlcyB3aGVuIHVzaW5nIGFuCisjIGV4dGVybmFsIGJpbmFyeSwgc28gd2UgaGF2ZSBhIGRlZmF1bHQgY2xvc2UgbWV0aG9kLgorIworc3ViIF9jbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVuZGVmOworfQorCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitFeHRlcm5hbCAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBleHRlcm5hbCBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUaGlzIG1vZHVsZSBpcyB1c2VkIHRvIGluY2x1ZGUgZXh0ZXJuYWwgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCB0byBpbmNsdWRlIGV4dGVybmFsIGNoYXJ0cyBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gSXQgaXMgYW4gaW50ZXJuYWwgbW9kdWxlIGFuZCBpc24ndCB1c2VkIGRpcmVjdGx5IGJ5IHRoZSBlbmQgdXNlci4KKworSXQgaXMgc2VtaS1kZXByZWNhdGVkIGluIGZhdm91ciBvZiB1c2luZyAibmF0aXZlIiBjaGFydHMuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uCisKK0ZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlZCBleHRlcm5hbCBjaGFydHMgc2VlIHRoZSBDPGV4dGVybmFsX2NoYXJ0cy50eHQ+ICAob3IgQzwucG9kPikgaW4gdGhlIEM8ZXh0ZXJuYWxfY2hhcnRzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0xpbmUucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0xpbmUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzMjBiNgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvTGluZS5wbQpAQCAtMCwwICsxLDE5NCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OkxpbmU7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTGluZSAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBMaW5lIGNoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgU2VlIGZvcm1hdHRpbmcgbm90ZSBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKworcmVxdWlyZSBFeHBvcnRlcjsKKwordXNlIHN0cmljdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0IEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LT5uZXcoIEBfICk7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIExJTkUgY2hhcnQgQklGRiByZWNvcmQuIERlZmluZXMgYSBsaW5lIGNoYXJ0IHR5cGUuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3R5cGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMTg7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRncmJpdCAgPSAweDAwMDA7ICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitMaW5lIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIExpbmUgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVG8gY3JlYXRlIGEgc2ltcGxlIEV4Y2VsIGZpbGUgd2l0aCBhIExpbmUgY2hhcnQgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydC54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgbXkgJGNoYXJ0ICAgICA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdsaW5lJyApOworCisgICAgIyBDb25maWd1cmUgdGhlIGNoYXJ0LgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGUgY2hhcnQgcmVmZXJzIHRvLgorICAgIG15ICRkYXRhID0gWworICAgICAgICBbICdDYXRlZ29yeScsIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAnVmFsdWUnLCAgICAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkZGF0YSApOworCisgICAgX19FTkRfXworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBMaW5lIGNoYXJ0cyBmb3IgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIFRoZSBjaGFydCBvYmplY3QgaXMgY3JlYXRlZCB2aWEgdGhlIFdvcmtib29rIEM8YWRkX2NoYXJ0KCk+IG1ldGhvZDoKKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdsaW5lJyApOworCitPbmNlIHRoZSBvYmplY3QgaXMgY3JlYXRlZCBpdCBjYW4gYmUgY29uZmlndXJlZCB2aWEgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgY2hhcnQgY2xhc3NlczoKKworICAgICRjaGFydC0+YWRkX3NlcmllcygpOworICAgICRjaGFydC0+c2V0X3hfYXhpcygpOworICAgICRjaGFydC0+c2V0X3lfYXhpcygpOworICAgICRjaGFydC0+c2V0X3RpdGxlKCk7CisKK1RoZXNlIG1ldGhvZHMgYXJlIGV4cGxhaW5lZCBpbiBkZXRhaWwgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LiBDbGFzcyBzcGVjaWZpYyBtZXRob2RzIG9yIHNldHRpbmdzLCBpZiBhbnksIGFyZSBleHBsYWluZWQgYmVsb3cuCisKKz1oZWFkMSBMaW5lIENoYXJ0IE1ldGhvZHMKKworVGhlcmUgYXJlbid0IGN1cnJlbnRseSBhbnkgbGluZSBjaGFydCBzcGVjaWZpYyBtZXRob2RzLiBTZWUgdGhlIFRPRE8gc2VjdGlvbiBvZiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uCisKKz1oZWFkMSBFWEFNUExFCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIG1vc3Qgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcyB3aGVuIGNyZWF0aW5nIGEgY2hhcnQuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9saW5lLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnTnVtYmVyJywgJ1NhbXBsZSAxJywgJ1NhbXBsZSAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworCisgICAgIyBDcmVhdGUgYSBuZXcgY2hhcnQgb2JqZWN0LiBJbiB0aGlzIGNhc2UgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgZmlyc3Qgc2VyaWVzLiAoU2FtcGxlIDEpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMScsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2Vjb25kIHNlcmllcy4gKFNhbXBsZSAyKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDInLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICApOworCisgICAgIyBBZGQgYSBjaGFydCB0aXRsZSBhbmQgc29tZSBheGlzIGxhYmVscy4KKyAgICAkY2hhcnQtPnNldF90aXRsZSAoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnVGVzdCBudW1iZXInICk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgd29ya3NoZWV0ICh3aXRoIGFuIG9mZnNldCkuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRDInLCAkY2hhcnQsIDI1LCAxMCApOworCisgICAgX19FTkRfXworCisKKz1iZWdpbiBodG1sCisKKzxwPlRoaXMgd2lsbCBwcm9kdWNlIGEgY2hhcnQgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2xpbmUxLmpwZyIgd2lkdGg9IjUyNyIgaGVpZ2h0PSIzMjAiIGFsdD0iQ2hhcnQgZXhhbXBsZS4iIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1BpZS5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvUGllLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjdlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1BpZS5wbQpAQCAtMCwwICsxLDIxNyBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlBpZTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQaWUgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgUGllIGNoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgU2VlIGZvcm1hdHRpbmcgbm90ZSBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKworcmVxdWlyZSBFeHBvcnRlcjsKKwordXNlIHN0cmljdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0IEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LT5uZXcoIEBfICk7CisKKyAgICAkc2VsZi0+e192YXJ5X2RhdGFfY29sb3J9ID0gMTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgUGllIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9jaGFydF90eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDE5OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDY7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkYW5nbGUgID0gMHgwMDAwOyAgICAjIEFuZ2xlLgorICAgIG15ICRkb251dCAgPSAweDAwMDA7ICAgICMgRG9udXQgaG9sZSBzaXplLgorICAgIG15ICRncmJpdCAgPSAweDAwMDI7ICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkYW5nbGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRkb251dDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc3BhcmVudF9zdHJlYW0oKS4gT3ZlcnJpZGRlbi4KKyMKKyMgV3JpdGUgdGhlIEFYSVNQQVJFTlQgY2hhcnQgc3Vic3RyZWFtLgorIworIyBBIFBpZSBjaGFydCBoYXMgbm8gWCBvciBZIGF4aXMgc28gd2Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZW0uCisjCitzdWIgX3N0b3JlX2F4aXNwYXJlbnRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXNwYXJlbnQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfYXhpc3BhcmVudH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfcG9zKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2F4aXNwYXJlbnRfcG9zfSB9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0Zm9ybWF0X3N0cmVhbSgpOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworUGllIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFBpZSBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgUGllIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAncGllJyApOworCisgICAgIyBDb25maWd1cmUgdGhlIGNoYXJ0LgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGUgY2hhcnQgcmVmZXJzIHRvLgorICAgIG15ICRkYXRhID0gWworICAgICAgICBbICdDYXRlZ29yeScsIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAnVmFsdWUnLCAgICAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkZGF0YSApOworCisgICAgX19FTkRfXworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBQaWUgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgUGllIENoYXJ0IE1ldGhvZHMKKworVGhlcmUgYXJlbid0IGN1cnJlbnRseSBhbnkgcGllIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworQSBQaWUgY2hhcnQgZG9lc24ndCBoYXZlIGFuIFggb3IgWSBheGlzIHNvIHRoZSBmb2xsb3dpbmcgY29tbW9uIGNoYXJ0IG1ldGhvZHMgYXJlIGlnbm9yZWQuCisKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X3BpZS54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ0NhdGVnb3J5JywgJ1ZhbHVlcycgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQXBwbGUnLCAnQ2hlcnJ5JywgJ1BlY2FuJyBdLAorICAgICAgICBbIDYwLCAgICAgICAzMCwgICAgICAgMTAgICAgIF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAncGllJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1BpZSBzYWxlcyBkYXRhJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDQnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNCcsCisgICAgKTsKKworICAgICMgQWRkIGEgdGl0bGUuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1BvcHVsYXIgUGllIFR5cGVzJyApOworCisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgd29ya3NoZWV0ICh3aXRoIGFuIG9mZnNldCkuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnQzInLCAkY2hhcnQsIDI1LCAxMCApOworCisgICAgX19FTkRfXworCisKKz1iZWdpbiBodG1sCisKKzxwPlRoaXMgd2lsbCBwcm9kdWNlIGEgY2hhcnQgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3BpZTEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU2NhdHRlci5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU2NhdHRlci5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDIwNWRlCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9TY2F0dGVyLnBtCkBAIC0wLDAgKzEsMjQ1IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6U2NhdHRlcjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTY2F0dGVyIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFNjYXR0ZXIgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgU0NBVFRFUiBjaGFydCBCSUZGIHJlY29yZC4gRGVmaW5lcyBhIHNjYXR0ZXIgY2hhcnQgdHlwZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICA9IDB4MTAxQjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGJ1YmJsZV9yYXRpbyA9IDB4MDA2NDsgICAgIyBCdWJibGUgcmF0aW8uCisgICAgbXkgJGJ1YmJsZV90eXBlICA9IDB4MDAwMTsgICAgIyBCdWJibGUgdHlwZS4KKyAgICBteSAkZ3JiaXQgICAgICAgID0gMHgwMDAwOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGJ1YmJsZV9yYXRpbzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGJ1YmJsZV90eXBlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGlzX2NhdGVnb3J5X3N0cmVhbSgpLiBPdmVycmlkZGVuLgorIworIyBXcml0ZSB0aGUgQVhJUyBjaGFydCBzdWJzdHJlYW0gZm9yIHRoZSBjaGFydCBjYXRlZ29yeS4KKyMKKyMgRm9yIGEgU2NhdHRlciBjaGFydCB0aGUgY2F0ZWdvcnkgc3RyZWFtIGlzIHJlcGxhY2Ugd2l0aCBhIHZhbHVlcyBzdHJlYW0uIFdlCisjIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCB0dXJuIGl0IGludG8gYSB2YWx1ZXMgc3RyZWFtLgorIworc3ViIF9zdG9yZV9heGlzX2NhdGVnb3J5X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9heGlzKCAwICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV92YWx1ZXJhbmdlKCk7CisgICAgJHNlbGYtPl9zdG9yZV90aWNrKCk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJrZXJfZGF0YWZvcm1hdF9zdHJlYW0oKS4gT3ZlcnJpZGRlbi4KKyMKKyMgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFyZW50IGFic3RyYWN0IG1ldGhvZCAgdG8gZGVmaW5lCisjIHByb3BlcnRpZXMgb2YgbWFya2VycywgbGluZXR5cGVzLCBwaWUgZm9ybWF0cyBhbmQgb3RoZXIuCisjCitzdWIgX3N0b3JlX21hcmtlcl9kYXRhZm9ybWF0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9kYXRhZm9ybWF0KCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV8zZGJhcnNoYXBlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KCAweDAwMDAwMDAwLCAweDAwMDUsIDB4RkZGRiwgMHgwMDA4LCAweDAwNEQgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoIDB4MDBGRkZGRkYsIDB4MDAwMCwgMHgwMSwgMHgwMSwgMHg0RSwgMHg0RCApOworICAgICRzZWxmLT5fc3RvcmVfcGllZm9ybWF0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9tYXJrZXJmb3JtYXQoIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4NEQsIDB4NEQsIDB4M0MgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworU2NhdHRlciAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBTY2F0dGVyIGNoYXJ0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1RvIGNyZWF0ZSBhIHNpbXBsZSBFeGNlbCBmaWxlIHdpdGggYSBTY2F0dGVyIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc2NhdHRlcicgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgU2NhdHRlciBjaGFydHMgZm9yIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGUgY2hhcnQgb2JqZWN0IGlzIGNyZWF0ZWQgdmlhIHRoZSBXb3JrYm9vayBDPGFkZF9jaGFydCgpPiBtZXRob2Q6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc2NhdHRlcicgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgU2NhdHRlciBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IHNjYXR0ZXIgY2hhcnQgc3BlY2lmaWMgbWV0aG9kcy4gU2VlIHRoZSBUT0RPIHNlY3Rpb24gb2YgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfc2NhdHRlci54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzY2F0dGVyJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zY2F0dGVyMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9TdG9jay5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU3RvY2sucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1MjlmMAotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU3RvY2sucG0KQEAgLTAsMCArMSwyNTcgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpTdG9jazsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTdG9jayAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBTdG9jayBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIFNlZSBmb3JtYXR0aW5nIG5vdGUgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfdHlwZSgpCisjCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgZnJvbSB0aGUgc3BlY2lmaWMgY2hhcnQgY2xhc3MuCisjCisjIFdyaXRlIHRoZSBMSU5FIGNoYXJ0IEJJRkYgcmVjb3JkLiBBIHN0b2NrIGNoYXJ0IHVzZXMgdGhlIHNhbWUgTElORSByZWNvcmQKKyMgYXMgYSBsaW5lIGNoYXJ0IGJ1dCB3aXRoIGFkZGl0aW9uYWwgRFJPUEJBUiBhbmQgQ0hBUlRMSU5FIHJlY29yZHMgdG8gZGVmaW5lCisjIHRoZSBzdG9jayBzdHlsZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAxODsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGdyYml0ICA9IDB4MDAwMDsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJrZXJfZGF0YWZvcm1hdF9zdHJlYW0oKS4gT3ZlcnJpZGRlbi4KKyMKKyMgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFyZW50IGFic3RyYWN0IG1ldGhvZCB0byBkZWZpbmUKKyMgcHJvcGVydGllcyBvZiBtYXJrZXJzLCBsaW5ldHlwZXMsIHBpZSBmb3JtYXRzIGFuZCBvdGhlci4KKyMKK3N1YiBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2Ryb3BiYXIoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KCAweDAwMDAwMDAwLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAxLCAweDAwNEYgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoIDB4MDBGRkZGRkYsIDB4MDAwMCwgMHgwMSwgMHgwMSwgMHgwOSwgMHgwOCApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2Ryb3BiYXIoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KCAweDAwMDAwMDAwLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAxLCAweDAwNEYgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoIDB4MDAwMCwgMHgwMEZGRkZGRiwgMHgwMSwgMHgwMSwgMHgwOCwgMHgwOSApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0bGluZSgpOworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHgwMDRGICk7CisKKworICAgICRzZWxmLT5fc3RvcmVfZGF0YWZvcm1hdCggMHgwMDAwLCAweEZGRkQsIDB4MDAwMCApOworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlXzNkYmFyc2hhcGUoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2xpbmVmb3JtYXQoIDB4MDAwMDAwMDAsIDB4MDAwNSwgMHhGRkZGLCAweDAwMDAsIDB4MDA0RiApOworICAgICRzZWxmLT5fc3RvcmVfYXJlYWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDAwLCAweDAwLCAweDAxLCAweDRELCAweDREICk7CisgICAgJHNlbGYtPl9zdG9yZV9waWVmb3JtYXQoKTsKKyAgICAkc2VsZi0+X3N0b3JlX21hcmtlcmZvcm1hdCggMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0RCwgMHg0RCwgMHgzQyApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7CisKK30KKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitTdG9jayAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBTdG9jayBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgU3RvY2sgY2hhcnQgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydC54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgbXkgJGNoYXJ0ICAgICA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzdG9jaycgKTsKKworICAgICMgQWRkIGEgc2VyaWVzIGZvciBlYWNoIE9wZW4tSGlnaC1Mb3ctQ2xvc2UuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsIHZhbHVlcyA9PiAnPVNoZWV0MSEkQiQyOiRCJDYnICk7CisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsIHZhbHVlcyA9PiAnPVNoZWV0MSEkQyQyOiRDJDYnICk7CisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsIHZhbHVlcyA9PiAnPVNoZWV0MSEkRCQyOiREJDYnICk7CisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsIHZhbHVlcyA9PiAnPVNoZWV0MSEkRSQyOiRFJDYnICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICAjIC4uLiBTZWUgdGhlIGZ1bGwgZXhhbXBsZSBiZWxvdy4KKworICAgIF9fRU5EX18KKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBTdG9jayBjaGFydHMgZm9yIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGUgY2hhcnQgb2JqZWN0IGlzIGNyZWF0ZWQgdmlhIHRoZSBXb3JrYm9vayBDPGFkZF9jaGFydCgpPiBtZXRob2Q6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc3RvY2snICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIFN0b2NrIENoYXJ0IE1ldGhvZHMKKworVGhlcmUgYXJlbid0IGN1cnJlbnRseSBhbnkgc3RvY2sgY2hhcnQgc3BlY2lmaWMgbWV0aG9kcy4gU2VlIHRoZSBUT0RPIHNlY3Rpb24gb2YgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCitUaGUgZGVmYXVsdCBTdG9jayBjaGFydCBpcyBhbiBPcGVuLUhpZ2gtTG93LUNsb3NlIGNoYXJ0LiBBIHNlcmllcyBtdXN0IGJlIGFkZGVkIGZvciBlYWNoIG9mIHRoZXNlIGRhdGEgc291cmNlcy4KKworVGhlIGRlZmF1bHQgU3RvY2sgY2hhcnQgaXMgaW4gYmxhY2sgYW5kIHdoaXRlLiBVc2VyIGRlZmluZWQgY29sb3VycyB3aWxsIGJlIGFkZGVkIGF0IGEgbGF0ZXIgc3RhZ2UuCisKKz1oZWFkMSBFWEFNUExFCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIG1vc3Qgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcyB3aGVuIGNyZWF0aW5nIGEgU3RvY2sgY2hhcnQuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X3N0b2NrX2V4LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworICAgIG15ICRkYXRlX2Zvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggbnVtX2Zvcm1hdCA9PiAnZGQvbW0veXl5eScgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdEYXRlJywgJ09wZW4nLCAnSGlnaCcsICdMb3cnLCAnQ2xvc2UnIF07CisgICAgbXkgQGRhdGEgPSAoCisgICAgICAgIFsgJzIwMDktMDgtMjMnLCAxMTAuNzUsIDExMy40OCwgMTA5LjA1LCAxMDkuNDAgXSwKKyAgICAgICAgWyAnMjAwOS0wOC0yNCcsIDExMS4yNCwgMTExLjYwLCAxMDMuNTcsIDEwNC44NyBdLAorICAgICAgICBbICcyMDA5LTA4LTI1JywgMTA0Ljk2LCAxMDguMDAsIDEwMy44OCwgMTA2LjAwIF0sCisgICAgICAgIFsgJzIwMDktMDgtMjYnLCAxMDQuOTUsIDEwNy45NSwgMTA0LjY2LCAxMDcuOTEgXSwKKyAgICAgICAgWyAnMjAwOS0wOC0yNycsIDEwOC4xMCwgMTA4LjYyLCAxMDUuNjksIDEwNi4xNSBdLAorICAgICk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworCisgICAgbXkgJHJvdyA9IDE7CisgICAgZm9yIG15ICRkYXRhICggQGRhdGEgKSB7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAwLCAkZGF0YS0+WzBdLCAkZGF0ZV9mb3JtYXQgKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoICRyb3csIDEsICRkYXRhLT5bMV0gKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoICRyb3csIDIsICRkYXRhLT5bMl0gKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoICRyb3csIDMsICRkYXRhLT5bM10gKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoICRyb3csIDQsICRkYXRhLT5bNF0gKTsKKyAgICAgICAgJHJvdysrOworICAgIH0KKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzdG9jaycsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQWRkIGEgc2VyaWVzIGZvciBlYWNoIG9mIHRoZSBPcGVuLUhpZ2gtTG93LUNsb3NlIGNvbHVtbnMuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ2JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnT3BlbicsCisgICAgKTsKKworICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNicsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ0hpZ2gnLAorICAgICk7CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ2JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkRCQyOiREJDYnLAorICAgICAgICBuYW1lICAgICAgID0+ICdMb3cnLAorICAgICk7CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ2JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkRSQyOiRFJDYnLAorICAgICAgICBuYW1lICAgICAgID0+ICdDbG9zZScsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ09wZW4tSGlnaC1Mb3ctQ2xvc2UnLCApOworICAgICRjaGFydC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnRGF0ZScsICk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTaGFyZSBwcmljZScsICk7CisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgd29ya3NoZWV0ICh3aXRoIGFuIG9mZnNldCkuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRjInLCAkY2hhcnQsIDI1LCAxMCApOworCisgICAgX19FTkRfXworCisKKz1iZWdpbiBodG1sCisKKzxwPlRoaXMgd2lsbCBwcm9kdWNlIGEgY2hhcnQgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3N0b2NrMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9FeGFtcGxlcy5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRXhhbXBsZXMucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyOTY5NwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRXhhbXBsZXMucG0KQEAgLTAsMCArMSwxMDYzOCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6RXhhbXBsZXM7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRXhhbXBsZXMgLSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBleGFtcGxlcy4KKyMKKyMgQSBkb2N1bWVudGF0aW9uIG9ubHkgbW9kdWxlIHNob3dpbmcgdGhlIGV4YW1wbGVzIHRoYXQgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkaXN0cmlidXRpb24uIFRoaXMKKyMgZmlsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBnZW5fZXhhbXBsZXNfcG9kLnBsCisjIHByb2dyYW0gdGhhdCBpcyBhbHNvIGluY2x1ZGVkIGluIHRoZSBleGFtcGxlcyBkaXJlY3RvcnkuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB2YXJzIHF3KCRWRVJTSU9OKTsKKyRWRVJTSU9OID0gJzIuMzcnOworCisxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworRXhhbXBsZXMgLSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBleGFtcGxlIHByb2dyYW1zLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBpcyBhIGRvY3VtZW50YXRpb24gb25seSBtb2R1bGUgc2hvd2luZyB0aGUgZXhhbXBsZXMgdGhhdCBhcmUKK2luY2x1ZGVkIGluIHRoZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPiBkaXN0cmlidXRpb24uCisKK1RoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgdmlhIHRoZSBnZW5fZXhhbXBsZXNfcG9kLnBsCitwcm9ncmFtIHRoYXQgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LgorCis9aGVhZDEgRXhhbXBsZSBwcm9ncmFtcworCitUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiB0aGUgODUgZXhhbXBsZSBwcm9ncmFtcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZGlzdHJpYnV0aW9uLgorCis9b3ZlcgorCis9aXRlbSAqIEw8RXhhbXBsZTogYV9zaW1wbGUucGw+IEEgZ2V0IHN0YXJ0ZWQgZXhhbXBsZSB3aXRoIHNvbWUgYmFzaWMgZmVhdHVyZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBkZW1vLnBsPiBBIGRlbW8gb2Ygc29tZSBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcmVnaW9ucy5wbD4gQSBzaW1wbGUgZXhhbXBsZSBvZiBtdWx0aXBsZSB3b3Jrc2hlZXRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogc3RhdHMucGw+IEJhc2ljIGZvcm11bGFzIGFuZCBmdW5jdGlvbnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBmb3JtYXRzLnBsPiBBbGwgdGhlIGF2YWlsYWJsZSBmb3JtYXR0aW5nIG9uIHNldmVyYWwgd29ya3NoZWV0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGJ1Z19yZXBvcnQucGw+IEEgdGVtcGxhdGUgZm9yIHN1Ym1pdHRpbmcgYnVnIHJlcG9ydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBhdXRvZmlsdGVyLnBsPiBFeGFtcGxlcyBvZiB3b3Jrc2hlZXQgYXV0b2ZpbHRlcnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBhdXRvZml0LnBsPiBTaW11bGF0ZSBFeGNlbCdzIGF1dG9maXQgZm9yIGNvbHVtbiB3aWR0aHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBiaWdmaWxlLnBsPiBXcml0ZSBwYXN0IHRoZSA3TUIgbGltaXQgd2l0aCBPTEU6OlN0b3JhZ2VfTGl0ZS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNnaS5wbD4gQSBzaW1wbGUgQ0dJIHByb2dyYW0uCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9hcmVhLnBsPiBBIGRlbW8gb2YgYXJlYSBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9iYXIucGw+IEEgZGVtbyBvZiBiYXIgKHZlcnRpY2FsIGhpc3RvZ3JhbSkgc3R5bGUgY2hhcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfY29sdW1uLnBsPiBBIGRlbW8gb2YgY29sdW1uIChoaXN0b2dyYW0pIHN0eWxlIGNoYXJ0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNoYXJ0X2xpbmUucGw+IEEgZGVtbyBvZiBsaW5lIHN0eWxlIGNoYXJ0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNoYXJ0X3BpZS5wbD4gQSBkZW1vIG9mIHBpZSBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9zY2F0dGVyLnBsPiBBIGRlbW8gb2Ygc2NhdHRlciBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9zdG9jay5wbD4gQSBkZW1vIG9mIHN0b2NrIHN0eWxlIGNoYXJ0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNoZXNzLnBsPiBBbiBleGFtcGxlIG9mIHJldXNpbmcgZm9ybWF0dGluZyB2aWEgcHJvcGVydGllcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNvbG9ycy5wbD4gQSBkZW1vIG9mIHRoZSBjb2xvdXIgcGFsZXR0ZSBhbmQgbmFtZWQgY29sb3Vycy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNvbW1lbnRzMS5wbD4gQWRkIGNvbW1lbnRzIHRvIHdvcmtzaGVldCBjZWxscy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNvbW1lbnRzMi5wbD4gQWRkIGNvbW1lbnRzIHdpdGggYWR2YW5jZWQgb3B0aW9ucy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNvcHlmb3JtYXQucGw+IEV4YW1wbGUgb2YgY29weWluZyBhIGNlbGwgZm9ybWF0LgorCis9aXRlbSAqIEw8RXhhbXBsZTogZGF0YV92YWxpZGF0ZS5wbD4gQW4gZXhhbXBsZSBvZiBkYXRhIHZhbGlkYXRpb24gYW5kIGRyb3Bkb3duIGxpc3RzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZGF0ZV90aW1lLnBsPiBXcml0ZSBkYXRlcyBhbmQgdGltZXMgd2l0aCB3cml0ZV9kYXRlX3RpbWUoKS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRlZmluZWRfbmFtZS5wbD4gRXhhbXBsZSBvZiBob3cgdG8gY3JlYXRlIGRlZmluZWQgbmFtZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBkaWFnX2JvcmRlci5wbD4gQSBzaW1wbGUgZXhhbXBsZSBvZiBkaWFnb25hbCBjZWxsIGJvcmRlcnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBlYXN0ZXJfZWdnLnBsPiBFeHBvc2UgdGhlIEV4Y2VsOTcgZmxpZ2h0IHNpbXVsYXRvci4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGZpbGVoYW5kbGUucGw+IEV4YW1wbGVzIG9mIHdvcmtpbmcgd2l0aCBmaWxlaGFuZGxlcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGZvcm11bGFfcmVzdWx0LnBsPiBGb3JtdWxhcyB3aXRoIHVzZXIgc3BlY2lmaWVkIHJlc3VsdHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBoZWFkZXJzLnBsPiBFeGFtcGxlcyBvZiB3b3Jrc2hlZXQgaGVhZGVycyBhbmQgZm9vdGVycy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGhpZGVfc2hlZXQucGw+IFNpbXBsZSBleGFtcGxlIG9mIGhpZGluZyBhIHdvcmtzaGVldC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGh5cGVybGluazEucGw+IFNob3dzIGhvdyB0byBjcmVhdGUgd2ViIGh5cGVybGlua3MuCisKKz1pdGVtICogTDxFeGFtcGxlOiBoeXBlcmxpbmsyLnBsPiBFeGFtcGxlcyBvZiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgaHlwZXJsaW5rcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGltYWdlcy5wbD4gQWRkaW5nIGltYWdlcyB0byB3b3Jrc2hlZXRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogaW5kZW50LnBsPiBBbiBleGFtcGxlIG9mIGNlbGwgaW5kZW50YXRpb24uCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTEucGw+IEEgc2ltcGxlIGV4YW1wbGUgb2YgY2VsbCBtZXJnaW5nLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbWVyZ2UyLnBsPiBBIHNpbXBsZSBleGFtcGxlIG9mIGNlbGwgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTMucGw+IEFkZCBoeXBlcmxpbmtzIHRvIG1lcmdlZCBjZWxscy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG1lcmdlNC5wbD4gQW4gYWR2YW5jZWQgZXhhbXBsZSBvZiBtZXJnaW5nIHdpdGggZm9ybWF0dGluZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG1lcmdlNS5wbD4gQW4gYWR2YW5jZWQgZXhhbXBsZSBvZiBtZXJnaW5nIHdpdGggZm9ybWF0dGluZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG1lcmdlNi5wbD4gQW4gZXhhbXBsZSBvZiBtZXJnaW5nIHdpdGggVW5pY29kZSBzdHJpbmdzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbW9kX3BlcmwxLnBsPiBBIHNpbXBsZSBtb2RfcGVybCAxIHByb2dyYW0uCisKKz1pdGVtICogTDxFeGFtcGxlOiBtb2RfcGVybDIucGw+IEEgc2ltcGxlIG1vZF9wZXJsIDIgcHJvZ3JhbS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG91dGxpbmUucGw+IEFuIGV4YW1wbGUgb2Ygb3V0bGluZXMgYW5kIGdyb3VwaW5nLgorCis9aXRlbSAqIEw8RXhhbXBsZTogb3V0bGluZV9jb2xsYXBzZWQucGw+IEFuIGV4YW1wbGUgb2YgY29sbGFwc2VkIG91dGxpbmVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcGFuZXMucGw+IEFuIGV4YW1wbGVzIG9mIGhvdyB0byBjcmVhdGUgcGFuZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBwcm9wZXJ0aWVzLnBsPiBBZGQgZG9jdW1lbnQgcHJvcGVydGllcyB0byBhIHdvcmtib29rLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcHJvdGVjdGlvbi5wbD4gRXhhbXBsZSBvZiBjZWxsIGxvY2tpbmcgYW5kIGZvcm11bGEgaGlkaW5nLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcmVwZWF0LnBsPiBFeGFtcGxlIG9mIHdyaXRpbmcgcmVwZWF0ZWQgZm9ybXVsYXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiByaWdodF90b19sZWZ0LnBsPiBDaGFuZ2UgZGVmYXVsdCBzaGVldCBkaXJlY3Rpb24gdG8gcmlnaHQgdG8gbGVmdC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHJvd193cmFwLnBsPiBIb3cgdG8gd3JhcCBkYXRhIGZyb20gb25lIHdvcmtzaGVldCBvbnRvIGFub3RoZXIuCisKKz1pdGVtICogTDxFeGFtcGxlOiBzYWxlcy5wbD4gQW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBzYWxlcyBzcHJlYWRzaGVldC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHNlbmRtYWlsLnBsPiBTZW5kIGFuIEV4Y2VsIGVtYWlsIGF0dGFjaG1lbnQgdXNpbmcgTWFpbDo6U2VuZGVyLgorCis9aXRlbSAqIEw8RXhhbXBsZTogc3RhdHNfZXh0LnBsPiBTYW1lIGFzIHN0YXRzLnBsIHdpdGggZXh0ZXJuYWwgcmVmZXJlbmNlcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHN0b2Nrcy5wbD4gRGVtb25zdHJhdGVzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcuCisKKz1pdGVtICogTDxFeGFtcGxlOiB0YWJfY29sb3JzLnBsPiBFeGFtcGxlIG9mIGhvdyB0byBzZXQgd29ya3NoZWV0IHRhYiBjb2xvdXJzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdGV4dHdyYXAucGw+IERlbW9uc3RyYXRlcyB0ZXh0IHdyYXBwaW5nIG9wdGlvbnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiB3aW4zMm9sZS5wbD4gQSBzYW1wbGUgV2luMzI6Ok9MRSBleGFtcGxlIGZvciBjb21wYXJpc29uLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfYXJyYXlzLnBsPiBFeGFtcGxlIG9mIHdyaXRpbmcgMUQgb3IgMkQgYXJyYXlzIG9mIGRhdGEuCisKKz1pdGVtICogTDxFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMS5wbD4gRXhhbXBsZSBvZiBleHRlbmRpbmcgdGhlIHdyaXRlKCkgbWV0aG9kLiBTdGVwIDEuCisKKz1pdGVtICogTDxFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMi5wbD4gRXhhbXBsZSBvZiBleHRlbmRpbmcgdGhlIHdyaXRlKCkgbWV0aG9kLiBTdGVwIDIuCisKKz1pdGVtICogTDxFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMy5wbD4gRXhhbXBsZSBvZiBleHRlbmRpbmcgdGhlIHdyaXRlKCkgbWV0aG9kLiBTdGVwIDMuCisKKz1pdGVtICogTDxFeGFtcGxlOiB3cml0ZV9oYW5kbGVyNC5wbD4gRXhhbXBsZSBvZiBleHRlbmRpbmcgdGhlIHdyaXRlKCkgbWV0aG9kLiBTdGVwIDQuCisKKz1pdGVtICogTDxFeGFtcGxlOiB3cml0ZV90b19zY2FsYXIucGw+IEV4YW1wbGUgb2Ygd3JpdGluZyBhbiBFeGNlbCBmaWxlIHRvIGEgUGVybCBzY2FsYXIuCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX3V0ZjE2LnBsPiBTaW1wbGUgZXhhbXBsZSBvZiB1c2luZyBVbmljb2RlIFVURjE2IHN0cmluZ3MuCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX3V0ZjE2X2phcGFuLnBsPiBXcml0ZSBKYXBhbmVzZSBVbmljb2RlIHN0cmluZ3MgdXNpbmcgVVRGLTE2LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV9jeXJpbGxpYy5wbD4gV3JpdGUgUnVzc2lhbiBDeXJpbGxpYyBzdHJpbmdzIHVzaW5nIFVURi04LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV9saXN0LnBsPiBMaXN0IHRoZSBjaGFycyBpbiBhIFVuaWNvZGUgZm9udC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfMjAyMl9qcC5wbD4gSmFwYW5lc2U6IElTTy0yMDIyLUpQIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlXzg4NTlfMTEucGw+IFRoYWk6ICAgICBJU08tODg1OV8xMSB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV84ODU5XzcucGw+IEdyZWVrOiAgICBJU08tODg1OV83ICB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV9iaWc1LnBsPiBDaGluZXNlOiAgQklHNSAgICAgICAgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfY3AxMjUxLnBsPiBSdXNzaWFuOiAgQ1AxMjUxICAgICAgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfY3AxMjU2LnBsPiBBcmFiaWM6ICAgQ1AxMjU2ICAgICAgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfa29pOHIucGw+IFJ1c3NpYW46ICBLT0k4LVIgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV9wb2xpc2hfdXRmOC5wbD4gUG9saXNoIDogIFVURjggICAgICAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX3NoaWZ0X2ppcy5wbD4gSmFwYW5lc2U6IFNoaWZ0IEpJUyAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiBjc3YyeGxzLnBsPiBQcm9ncmFtIHRvIGNvbnZlcnQgYSBDU1YgZmlsZSB0byBhbiBFeGNlbCBmaWxlLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdGFiMnhscy5wbD4gUHJvZ3JhbSB0byBjb252ZXJ0IGEgdGFiIHNlcGFyYXRlZCBmaWxlIHRvIHhscy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRhdGVjYWxjMS5wbD4gQ29udmVydCBVbml4L1BlcmwgdGltZSB0byBFeGNlbCB0aW1lLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZGF0ZWNhbGMyLnBsPiBDYWxjdWxhdGUgYW4gRXhjZWwgZGF0ZSB1c2luZyBEYXRlOjpDYWxjLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbGVjeGUucGw+IENvbnZlcnQgRXhjZWwgdG8gV3JpdGVFeGNlbCB1c2luZyBXaW4zMjo6T0xFLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY29udmVydEExLnBsPiBIZWxwZXIgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggQTEgbm90YXRpb24uCisKKz1pdGVtICogTDxFeGFtcGxlOiBmdW5jdGlvbl9sb2NhbGUucGw+IEFkZCBub24tRW5nbGlzaCBmdW5jdGlvbiBuYW1lcyB0byBGb3JtdWxhLnBtLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVBMS5wbD4gRXhhbXBsZSBvZiBob3cgdG8gZXh0ZW5kIHRoZSBtb2R1bGUuCisKKz1iYWNrCisKKz1oZWFkMiBFeGFtcGxlOiBhX3NpbXBsZS5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUKK3NvbWUgIHRleHQgYW5kIG51bWJlcnMgdG8gYW4gRXhjZWwgYmluYXJ5IGZpbGUuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2Ffc2ltcGxlLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gYV9zaW1wbGUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZQorICAgICMgc29tZSAgdGV4dCBhbmQgbnVtYmVycyB0byBhbiBFeGNlbCBiaW5hcnkgZmlsZS4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBjYWxsZWQgc2ltcGxlLnhscyBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2Ffc2ltcGxlLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIFRoZSBnZW5lcmFsIHN5bnRheCBpcyB3cml0ZSgkcm93LCAkY29sdW1uLCAkdG9rZW4pLiBOb3RlIHRoYXQgcm93IGFuZAorICAgICMgY29sdW1uIGFyZSB6ZXJvIGluZGV4ZWQKKyAgICAjCisgICAgCisgICAgIyBXcml0ZSBzb21lIHRleHQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAgIkhpIEV4Y2VsISIpOworICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBudW1iZXJzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgIDMpOyAgICAgICAgICAjIFdyaXRlcyAzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgIDMuMDAwMDApOyAgICAjIFdyaXRlcyAzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgIDMuMDAwMDEpOyAgICAjIFdyaXRlcyAzLjAwMDAxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMCwgIDMuMTQxNTkpOyAgICAjIFRlWCByZXZpc2lvbiBuby4/CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIGZvcm11bGFzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgMCwgICc9QTMgKyBBNicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDgsIDAsICAnPUlGKEE1PjMsIlllcyIsICJObyIpJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBhIGh5cGVybGluaworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEwLCAwLCAnaHR0cDovL3d3dy5wZXJsLmNvbS8nKTsKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2Ffc2ltcGxlLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGVtby5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBzb21lIG9mIHRoZSBmZWF0dXJlcyBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBwcm9qZWN0IHNjcmVlbnNob3QgZm9yIEZyZXNobWVhdDoKK0w8aHR0cDovL2ZyZXNobWVhdC5uZXQvcHJvamVjdHMvd3JpdGVleGNlbC8+CisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2RlbW8uanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkZW1vLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2Ygc29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBwcm9qZWN0IHNjcmVlbnNob3QgZm9yIEZyZXNobWVhdDoKKyAgICAjIEw8aHR0cDovL2ZyZXNobWVhdC5uZXQvcHJvamVjdHMvd3JpdGVleGNlbC8+CisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBPY3RvYmVyIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImRlbW8ueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0RlbW8nKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQW5vdGhlciBzaGVldCcpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdBbmQgYW5vdGhlcicpOworICAgIAorICAgIG15ICRib2xkICAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGJvbGQgPT4gMSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBXcml0ZSBhIGdlbmVyYWwgaGVhZGluZworICAgICMKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAzNiwgJGJvbGQpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6QicsIDIwICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+c2V0X3JvdyAgICgwLCAgICAgNDAgICAgICAgKTsKKyAgICAKKyAgICBteSAkaGVhZGluZyAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICA9PiAnYmx1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgICAgPT4gMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICBteSBAaGVhZGluZ3MgPSAoJ0ZlYXR1cmVzIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJywgJycpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3JvdygnQTEnLCBcQGhlYWRpbmdzLCAkaGVhZGluZyk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTb21lIHRleHQgZXhhbXBsZXMKKyAgICAjCisgICAgbXkgJHRleHRfZm9ybWF0ICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0YWxpYyAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgPT4gJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICAgID0+IDE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCAgICA9PidMdWNpZGEgQ2FsbGlncmFwaHknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgIyBBIHBocmFzZSBpbiBDeXJpbGxpYworICAgIG15ICR1bmljb2RlID0gcGFjayAiSCoiLCAiMDQyZDA0NDIwNDNlMDAyMDA0NDQwNDQwMDQzMDA0MzcwNDMwMDAyMDA0Ii4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjNkMDQzMDAwMjAwNDQwMDQ0MzA0NDEwNDQxMDQzYTA0M2UwNDNjMDAyMSI7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgIlRleHQiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjInLCAiSGVsbG8gRXhjZWwiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAiRm9ybWF0dGVkIHRleHQiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAiSGVsbG8gRXhjZWwiLCAkdGV4dF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNCcsICJVbmljb2RlIHRleHQiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQjQnLCAkdW5pY29kZSk7CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTb21lIG51bWVyaWMgZXhhbXBsZXMKKyAgICAjCisgICAgbXkgJG51bTFfZm9ybWF0ICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICckIywjIzAuMDAnKTsKKyAgICBteSAkbnVtMl9mb3JtYXQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJyBkIG1tbW0geXl5Jyk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E1JywgIk51bWJlcnMiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjUnLCAxMjM0LjU2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTYnLCAiRm9ybWF0dGVkIG51bWJlcnMiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjYnLCAxMjM0LjU2LCAkbnVtMV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICJGb3JtYXR0ZWQgbnVtYmVycyIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCNycsIDM3MjU3LCAkbnVtMl9mb3JtYXQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRm9ybXVsYWUKKyAgICAjCisgICAgJHdvcmtzaGVldC0+c2V0X3NlbGVjdGlvbignQjgnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTgnLCAnRm9ybXVsYXMgYW5kIGZ1bmN0aW9ucywgIj1TSU4oUEkoKS80KSInKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjgnLCAnPVNJTihQSSgpLzQpJyk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBIeXBlcmxpbmtzCisgICAgIworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOScsICJIeXBlcmxpbmtzIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I5JywgICdodHRwOi8vd3d3LnBlcmwuY29tLycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEltYWdlcworICAgICMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEwJywgIkltYWdlcyIpOworICAgICR3b3Jrc2hlZXQtPmluc2VydF9pbWFnZSgnQjEwJywgJ3JlcHVibGljLnBuZycsIDE2LCA4KTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIE1pc2MKKyAgICAjCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExOCcsICJQYWdlL3ByaW50ZXIgc2V0dXAiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTE5JywgIk11bHRpcGxlIHdvcmtzaGVldHMiKTsKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2RlbW8ucGw+CisKKz1oZWFkMiBFeGFtcGxlOiByZWdpb25zLnBsCisKKworCitBbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OldyaXRlRXhjZWwgbW9kdWxlIHRvIHdyaXRlIGEgYmFzaWMKK0V4Y2VsIHdvcmtib29rIHdpdGggbXVsdGlwbGUgd29ya3NoZWV0cy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcmVnaW9ucy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHJlZ2lvbnMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OldyaXRlRXhjZWwgbW9kdWxlIHRvIHdyaXRlIGEgYmFzaWMKKyAgICAjIEV4Y2VsIHdvcmtib29rIHdpdGggbXVsdGlwbGUgd29ya3NoZWV0cy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyBFeGNlbCB3b3JrYm9vaworICAgIG15ICR3b3JrYm9vayA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInJlZ2lvbnMueGxzIik7CisgICAgCisgICAgIyBBZGQgc29tZSB3b3Jrc2hlZXRzCisgICAgbXkgJG5vcnRoID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCJOb3J0aCIpOworICAgIG15ICRzb3V0aCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgiU291dGgiKTsKKyAgICBteSAkZWFzdCAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoIkVhc3QiKTsKKyAgICBteSAkd2VzdCAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoIldlc3QiKTsKKyAgICAKKyAgICAjIEFkZCBhIEZvcm1hdAorICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9jb2xvcignYmx1ZScpOworICAgIAorICAgICMgQWRkIGEgY2FwdGlvbiB0byBlYWNoIHdvcmtzaGVldAorICAgIGZvcmVhY2ggbXkgJHdvcmtzaGVldCAoJHdvcmtib29rLT5zaGVldHMoKSkgeworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAiU2FsZXMiLCAkZm9ybWF0KTsKKyAgICB9CisgICAgCisgICAgIyBXcml0ZSBzb21lIGRhdGEKKyAgICAkbm9ydGgtPndyaXRlKDAsIDEsIDIwMDAwMCk7CisgICAgJHNvdXRoLT53cml0ZSgwLCAxLCAxMDAwMDApOworICAgICRlYXN0LT53cml0ZSAoMCwgMSwgMTUwMDAwKTsKKyAgICAkd2VzdC0+d3JpdGUgKDAsIDEsIDEwMDAwMCk7CisgICAgCisgICAgIyBTZXQgdGhlIGFjdGl2ZSB3b3Jrc2hlZXQKKyAgICAkc291dGgtPmFjdGl2YXRlKCk7CisgICAgCisgICAgIyBTZXQgdGhlIHdpZHRoIG9mIHRoZSBmaXJzdCBjb2x1bW4KKyAgICAkc291dGgtPnNldF9jb2x1bW4oMCwgMCwgMjApOworICAgIAorICAgICMgU2V0IHRoZSBhY3RpdmUgY2VsbAorICAgICRzb3V0aC0+c2V0X3NlbGVjdGlvbigwLCAxKTsKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcmVnaW9ucy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHN0YXRzLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgZnVuY3Rpb25zIHdpdGggdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCittb2R1bGUuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3N0YXRzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gc3RhdHMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgZnVuY3Rpb25zIHdpdGggdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisgICAgIyBtb2R1bGUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJzdGF0cy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdUZXN0IGRhdGEnKTsKKyAgICAKKyAgICAjIFNldCB0aGUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIDEKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIGhlYWRpbmdzCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgc2FtcGxlIGRhdGEKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnU2FtcGxlJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMSwgMSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgMik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgMyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNCwgNCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNSwgNSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNiwgNik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNywgNyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgOCwgOCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMCwgJ0xlbmd0aCcsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDEsIDI1LjQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDIsIDI1LjQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDMsIDI0LjgpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDQsIDI1LjApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDUsIDI1LjMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDYsIDI0LjkpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDcsIDI1LjIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDgsIDI0LjgpOworICAgIAorICAgICMgV3JpdGUgc29tZSBzdGF0aXN0aWNhbCBmdW5jdGlvbnMKKyAgICAkd29ya3NoZWV0LT53cml0ZSg0LCAgMCwgJ0NvdW50JywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgIDEsICc9Q09VTlQoQjE6STEpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgIDAsICdTdW0nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAgMSwgJz1TVU0oQjI6STIpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNiwgIDAsICdBdmVyYWdlJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNiwgIDEsICc9QVZFUkFHRShCMjpJMiknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAgMCwgJ01pbicsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsICAxLCAnPU1JTihCMjpJMiknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAgMCwgJ01heCcsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDgsICAxLCAnPU1BWChCMjpJMiknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSg5LCAgMCwgJ1N0YW5kYXJkIERldmlhdGlvbicsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDksICAxLCAnPVNUREVWKEIyOkkyKScpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDEwLCAwLCAnS3VydG9zaXMnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMCwgMSwgJz1LVVJUKEIyOkkyKScpOworICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvc3RhdHMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBmb3JtYXRzLnBsCisKKworCitFeGFtcGxlcyBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisKK1RoaXMgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgYWxtb3N0IGFsbCBwb3NzaWJsZSBmb3JtYXR0aW5nIG9wdGlvbnMuIEl0IGlzIHdvcnRoCitydW5uaW5nIHRoaXMgcHJvZ3JhbSBhbmQgdmlld2luZyB0aGUgb3V0cHV0IEV4Y2VsIGZpbGUgaWYgeW91IGFyZSBpbnRlcmVzdGVkCitpbiB0aGUgdmFyaW91cyBmb3JtYXR0aW5nIHBvc3NpYmlsaXRpZXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2Zvcm1hdHMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBmb3JtYXRzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZXMgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorICAgICMKKyAgICAjIFRoaXMgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgYWxtb3N0IGFsbCBwb3NzaWJsZSBmb3JtYXR0aW5nIG9wdGlvbnMuIEl0IGlzIHdvcnRoCisgICAgIyBydW5uaW5nIHRoaXMgcHJvZ3JhbSBhbmQgdmlld2luZyB0aGUgb3V0cHV0IEV4Y2VsIGZpbGUgaWYgeW91IGFyZSBpbnRlcmVzdGVkCisgICAgIyBpbiB0aGUgdmFyaW91cyBmb3JtYXR0aW5nIHBvc3NpYmlsaXRpZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2Zvcm1hdHMueGxzJyk7CisgICAgCisgICAgIyBTb21lIGNvbW1vbiBmb3JtYXRzCisgICAgbXkgJGNlbnRlciAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYWxpZ24gPT4gJ2NlbnRlcicpOworICAgIG15ICRoZWFkaW5nID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGFsaWduID0+ICdjZW50ZXInLCBib2xkID0+IDEpOworICAgIAorICAgICMgVGhlIG5hbWVkIGNvbG9ycworICAgIG15ICVjb2xvcnMgPSAoCisgICAgICAgICAgICAgICAgICAgIDB4MDgsICdibGFjaycsCisgICAgICAgICAgICAgICAgICAgIDB4MEMsICdibHVlJywKKyAgICAgICAgICAgICAgICAgICAgMHgxMCwgJ2Jyb3duJywKKyAgICAgICAgICAgICAgICAgICAgMHgwRiwgJ2N5YW4nLAorICAgICAgICAgICAgICAgICAgICAweDE3LCAnZ3JheScsCisgICAgICAgICAgICAgICAgICAgIDB4MTEsICdncmVlbicsCisgICAgICAgICAgICAgICAgICAgIDB4MEIsICdsaW1lJywKKyAgICAgICAgICAgICAgICAgICAgMHgwRSwgJ21hZ2VudGEnLAorICAgICAgICAgICAgICAgICAgICAweDEyLCAnbmF2eScsCisgICAgICAgICAgICAgICAgICAgIDB4MzUsICdvcmFuZ2UnLAorICAgICAgICAgICAgICAgICAgICAweDIxLCAncGluaycsCisgICAgICAgICAgICAgICAgICAgIDB4MTQsICdwdXJwbGUnLAorICAgICAgICAgICAgICAgICAgICAweDBBLCAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgMHgxNiwgJ3NpbHZlcicsCisgICAgICAgICAgICAgICAgICAgIDB4MDksICd3aGl0ZScsCisgICAgICAgICAgICAgICAgICAgIDB4MEQsICd5ZWxsb3cnLAorICAgICAgICAgICAgICAgICApOworICAgIAorICAgICMgQ2FsbCB0aGVzZSBzdWJyb3V0aW5lcyB0byBkZW1vbnN0cmF0ZSBkaWZmZXJlbnQgZm9ybWF0dGluZyBvcHRpb25zCisgICAgaW50cm8oKTsKKyAgICBmb250cygpOworICAgIG5hbWVkX2NvbG9ycygpOworICAgIHN0YW5kYXJkX2NvbG9ycygpOworICAgIG51bWVyaWNfZm9ybWF0cygpOworICAgIGJvcmRlcnMoKTsKKyAgICBwYXR0ZXJucygpOworICAgIGFsaWdubWVudCgpOworICAgIG1pc2MoKTsKKyAgICAKKyAgICAjIE5vdGU6IHRoaXMgaXMgcmVxdWlyZWQKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEludHJvLgorICAgICMKKyAgICBzdWIgaW50cm8geworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdJbnRyb2R1Y3Rpb24nKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCA2MCk7CisgICAgCisgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X3NpemUoMTQpOworICAgICAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAKKyAgICAgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgJGZvcm1hdDItPnNldF9ib2xkKCk7CisgICAgICAgICRmb3JtYXQyLT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgJ1RoaXMgd29ya2Jvb2sgZGVtb25zdHJhdGVzIHNvbWUgb2YnLCAgJGZvcm1hdCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDAsICd0aGUgZm9ybWF0dGluZyBvcHRpb25zIHByb3ZpZGVkIGJ5JywgICRmb3JtYXQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSg0LCAwLCAndGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4nLCAkZm9ybWF0KTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E3JywgICdTZWN0aW9uczonLCAkZm9ybWF0Mik7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOCcsICAiaW50ZXJuYWw6Rm9udHMhQTEiLCAgICAgICAgICAgICAnRm9udHMnICAgICAgICAgICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOScsICAiaW50ZXJuYWw6J05hbWVkIGNvbG9ycychQTEiLCAgICAnTmFtZWQgY29sb3JzJyAgICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTAnLCAiaW50ZXJuYWw6J1N0YW5kYXJkIGNvbG9ycychQTEiLCAnU3RhbmRhcmQgY29sb3JzJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTEnLCAiaW50ZXJuYWw6J051bWVyaWMgZm9ybWF0cychQTEiLCAnTnVtZXJpYyBmb3JtYXRzJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTInLCAiaW50ZXJuYWw6Qm9yZGVycyFBMSIsICAgICAgICAgICAnQm9yZGVycycgICAgICAgICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTMnLCAiaW50ZXJuYWw6UGF0dGVybnMhQTEiLCAgICAgICAgICAnUGF0dGVybnMnICAgICAgICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTQnLCAiaW50ZXJuYWw6QWxpZ25tZW50IUExIiwgICAgICAgICAnQWxpZ25tZW50JyAgICAgICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTUnLCAiaW50ZXJuYWw6TWlzY2VsbGFuZW91cyFBMSIsICAgICAnTWlzY2VsbGFuZW91cycgICk7CisgICAgCisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgbmFtZWQgY29sb3JzLgorICAgICMKKyAgICBzdWIgbmFtZWRfY29sb3JzIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnTmFtZWQgY29sb3JzJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMywgMTUpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgIk5hbWUiLCAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAiQ29sb3IiLCAkaGVhZGluZyk7CisgICAgCisgICAgICAgIG15ICRpID0gMTsKKyAgICAKKyAgICAgICAgd2hpbGUgKG15KCRpbmRleCwgJGNvbG9yKSA9IGVhY2ggJWNvbG9ycykgeworICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnX2NvbG9yID0+ICRjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICA9PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGkrMSwgMCwgJGluZGV4LCAgICAgICAgICAgICAgICAgICAgJGNlbnRlcik7CisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkaSsxLCAxLCBzcHJpbnRmKCIweCUwMlgiLCAkaW5kZXgpLCAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpKzEsIDIsICRjb2xvciwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGkrMSwgMywgJycsICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgICAgICAgICAkaSsrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgc3RhbmRhcmQgRXhjZWwgY29sb3JzIGluIHRoZSByYW5nZSA4Li42My4KKyAgICAjCisgICAgc3ViIHN0YW5kYXJkX2NvbG9ycyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1N0YW5kYXJkIGNvbG9ycycpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDMsIDE1KTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDIsICJDb2xvciIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgIk5hbWUiLCAgJGhlYWRpbmcpOworICAgIAorICAgICAgICBmb3IgbXkgJGkgKDguLjYzKSB7CisgICAgICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdfY29sb3IgPT4gJGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgPT4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgkaSAtNyksIDAsICRpLCAgICAgICAgICAgICAgICAgICAgJGNlbnRlcik7CisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoJGkgLTcpLCAxLCBzcHJpbnRmKCIweCUwMlgiLCAkaSksICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKCRpIC03KSwgMiwgJycsICAgICAgICAgICAgICAgICAgICAkZm9ybWF0KTsKKyAgICAKKyAgICAgICAgICAgICMgQWRkIHRoZSAgY29sb3IgbmFtZXMKKyAgICAgICAgICAgIGlmIChleGlzdHMgJGNvbG9yc3skaX0pIHsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoJGkgLTcpLCAzLCAkY29sb3JzeyRpfSwgJGNlbnRlcik7CisgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlIHRoZSBzdGFuZGFyZCBudW1lcmljIGZvcm1hdHMuCisgICAgIworICAgIHN1YiBudW1lcmljX2Zvcm1hdHMgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdOdW1lcmljIGZvcm1hdHMnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCA0LCAxNSk7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oNSwgNSwgNDUpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAiSW5kZXgiLCAgICAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICJJbmRleCIsICAgICAgICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgIlVuZm9ybWF0dGVkIiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAiRm9ybWF0dGVkIiwgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDQsICJOZWdhdGl2ZSIsICAgICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNSwgIkZvcm1hdCIsICAgICAgJGhlYWRpbmcpOworICAgIAorICAgICAgICBteSBAZm9ybWF0czsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDAwLCAxMjM0LjU2NywgICAwLCAgICAgICAgICdHZW5lcmFsJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDEsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJzAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwMiwgMTIzNC41NjcsICAgMCwgICAgICAgICAnMC4wMCcgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDAzLCAxMjM0LjU2NywgICAwLCAgICAgICAgICcjLCMjMCcgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDA0LCAxMjM0LjU2NywgICAwLCAgICAgICAgICcjLCMjMC4wMCcgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDA1LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICcoJCMsIyMwXyk7KCQjLCMjMCknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwNiwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnKCQjLCMjMF8pO1tSZWRdKCQjLCMjMCknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwNywgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnKCQjLCMjMC4wMF8pOygkIywjIzAuMDApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDgsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygkIywjIzAuMDBfKTtbUmVkXSgkIywjIzAuMDApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDksIDAuNTY3LCAgICAgIDAsICAgICAgICAgJzAlJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MGEsIDAuNTY3LCAgICAgIDAsICAgICAgICAgJzAuMDAlJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MGIsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJzAuMDBFKzAwJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MGMsIDAuNzUsICAgICAgIDAsICAgICAgICAgJyMgPy8/JyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MGQsIDAuMzEyNSwgICAgIDAsICAgICAgICAgJyMgPz8vPz8nIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwZSwgMzY4OTIuNTIxLCAgMCwgICAgICAgICAnbS9kL3l5JyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MGYsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ2QtbW1tLXl5JyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MTAsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ2QtbW1tJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MTEsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ21tbS15eScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDEyLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdoOm1tIEFNL1BNJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MTMsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ2g6bW06c3MgQU0vUE0nIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgxNCwgMzY4OTIuNTIxLCAgMCwgICAgICAgICAnaDptbScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDE1LCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdoOm1tOnNzJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MTYsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ20vZC95eSBoOm1tJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MjUsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygjLCMjMF8pOygjLCMjMCknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyNiwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnKCMsIyMwXyk7W1JlZF0oIywjIzApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MjcsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygjLCMjMC4wMF8pOygjLCMjMC4wMCknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyOCwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnKCMsIyMwLjAwXyk7W1JlZF0oIywjIzAuMDApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MjksIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJ18oKiAjLCMjMF8pO18oKiAoIywjIzApO18oKiAiLSJfKTtfKEBfKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDJhLCAxMjM0LjU2NywgICAtMTIzNC41NjcsICdfKCQqICMsIyMwXyk7XygkKiAoIywjIzApO18oJCogIi0iXyk7XyhAXyknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyYiwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnXygqICMsIyMwLjAwXyk7XygqICgjLCMjMC4wMCk7XygqICItIj8/Xyk7XyhAXyknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyYywgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnXygkKiAjLCMjMC4wMF8pO18oJCogKCMsIyMwLjAwKTtfKCQqICItIj8/Xyk7XyhAXyknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyZCwgMzY4OTIuNTIxLCAgMCwgICAgICAgICAnbW06c3MnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyZSwgMy4wMTUzLCAgICAgMCwgICAgICAgICAnW2hdOm1tOnNzJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmYsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ21tOnNzLjAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgzMCwgMTIzNC41NjcsICAgMCwgICAgICAgICAnIyMwLjBFKzAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgzMSwgMTIzNC41NjcsICAgMCwgICAgICAgICAnQCcgXTsKKyAgICAKKyAgICAgICAgbXkgJGk7CisgICAgICAgIGZvcmVhY2ggbXkgJGZvcm1hdCAoQGZvcm1hdHMpeworICAgICAgICAgICAgbXkgJHN0eWxlID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICAgICAkc3R5bGUtPnNldF9udW1fZm9ybWF0KCRmb3JtYXQtPlswXSk7CisgICAgCisgICAgICAgICAgICAkaSsrOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDAsICRmb3JtYXQtPlswXSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDEsIHNwcmludGYoIjB4JTAyWCIsICRmb3JtYXQtPlswXSksICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDIsICRmb3JtYXQtPlsxXSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDMsICRmb3JtYXQtPlsxXSwgICAgICAgICAgICAgICAgICAgICRzdHlsZSk7CisgICAgCisgICAgICAgICAgICBpZiAoJGZvcm1hdC0+WzJdKSB7CisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDQsICRmb3JtYXQtPlsyXSwgJHN0eWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZygkaSwgNSwgJGZvcm1hdC0+WzNdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIGZvbnQgb3B0aW9ucy4KKyAgICAjCisgICAgc3ViIGZvbnRzIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRm9udHMnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCAzMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMSwgMSwgMTApOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAiRm9udCBuYW1lIiwgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICJGb250IHNpemUiLCAgICRoZWFkaW5nKTsKKyAgICAKKyAgICAgICAgbXkgQGZvbnRzOworICAgICAgICBwdXNoIEBmb250cywgWyAxMCwgJ0FyaWFsJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0FyaWFsJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxNCwgJ0FyaWFsJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0FyaWFsIEJsYWNrJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0FyaWFsIE5hcnJvdycgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdDZW50dXJ5IFNjaG9vbGJvb2snIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnQ291cmllcicgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdDb3VyaWVyIE5ldycgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdHYXJhbW9uZCcgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdJbXBhY3QnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnTHVjaWRhIEhhbmR3cml0aW5nJ10gOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ1RpbWVzIE5ldyBSb21hbicgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdTeW1ib2wnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnV2luZ2RpbmdzJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0EgZm9udCB0aGF0IGRvZXNuXCd0IGV4aXN0JyBdOworICAgIAorICAgICAgICBteSAkaTsKKyAgICAgICAgZm9yZWFjaCBteSAkZm9udCAoQGZvbnRzKXsKKyAgICAgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9zaXplKCRmb250LT5bMF0pOworICAgICAgICAgICAgJGZvcm1hdC0+c2V0X2ZvbnQoJGZvbnQtPlsxXSk7CisgICAgCisgICAgICAgICAgICAkaSsrOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDAsICRmb250LT5bMV0sICRmb3JtYXQpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDEsICRmb250LT5bMF0sICRmb3JtYXQpOworICAgICAgICB9CisgICAgCisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgc3RhbmRhcmQgRXhjZWwgYm9yZGVyIHN0eWxlcy4KKyAgICAjCisgICAgc3ViIGJvcmRlcnMgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdCb3JkZXJzJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNCwgMTApOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDUsIDUsIDQwKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICJTdHlsZSIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNSwgIlRoZSBzdHlsZSBpcyBoaWdobGlnaHRlZCBpbiByZWQgZm9yICIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgNSwgImVtcGhhc2lzLCB0aGUgZGVmYXVsdCBjb2xvciBpcyBibGFjay4iLCAkaGVhZGluZyk7CisgICAgCisgICAgICAgIGZvciBteSAkaSAoMC4uMTMpeworICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICAgICAgJGZvcm1hdC0+c2V0X2JvcmRlcigkaSk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfYm9yZGVyX2NvbG9yKCdyZWQnKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9hbGlnbignY2VudGVyJyk7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCAwLCAkaSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzEpKSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGkpLCAkY2VudGVyKTsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgyKigkaSsxKSksIDMsICJCb3JkZXIiLCAkZm9ybWF0KTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzMCwgMCwgIkRpYWcgdHlwZSIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMzAsIDEsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMzAsIDMsICJTdHlsZSIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMzAsIDUsICJEaWFnb25hbCBCb2RlciBzdHlsZXMiLCAkaGVhZGluZyk7CisgICAgCisgICAgICAgIGZvciBteSAkaSAoMS4uMyl7CisgICAgICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfZGlhZ190eXBlKCRpKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9kaWFnX2JvcmRlcigxKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9kaWFnX2NvbG9yKCdyZWQnKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9hbGlnbignY2VudGVyJyk7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMTUpKSwgMCwgJGksICAgICAgICAgICAgICAgICAgICAgJGNlbnRlcik7CisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMTUpKSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGkpLCAgJGNlbnRlcik7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMTUpKSwgMywgIkJvcmRlciIsICRmb3JtYXQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgc3RhbmRhcmQgRXhjZWwgY2VsbCBwYXR0ZXJucy4KKyAgICAjCisgICAgc3ViIHBhdHRlcm5zIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnUGF0dGVybnMnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCA0LCAxMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oNSwgNSwgNTApOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgIlBhdHRlcm4iLCAkaGVhZGluZyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDUsICJUaGUgYmFja2dyb3VuZCBjb2xvdXIgaGFzIGJlZW4gc2V0IHRvIHNpbHZlci4iLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDUsICJUaGUgZm9yZWdyb3VuZCBjb2xvdXIgaGFzIGJlZW4gc2V0IHRvIGdyZWVuLiIsICAkaGVhZGluZyk7CisgICAgCisgICAgICAgIGZvciBteSAkaSAoMC4uMTgpeworICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgIAorICAgICAgICAgICAgJGZvcm1hdC0+c2V0X3BhdHRlcm4oJGkpOworICAgICAgICAgICAgJGZvcm1hdC0+c2V0X2JnX2NvbG9yKCdzaWx2ZXInKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9mZ19jb2xvcignZ3JlZW4nKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9hbGlnbignY2VudGVyJyk7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCAwLCAkaSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzEpKSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGkpLCAkY2VudGVyKTsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgyKigkaSsxKSksIDMsICJQYXR0ZXJuIiwgJGZvcm1hdCk7CisgICAgCisgICAgICAgICAgICBpZiAoJGkgPT0gMSkgeworICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgyKigkaSsxKSksIDUsICJUaGlzIGlzIHNvbGlkIGNvbG91ciwgdGhlIG1vc3QgdXNlZnVsIHBhdHRlcm4uIiwgJGhlYWRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgc3RhbmRhcmQgRXhjZWwgY2VsbCBhbGlnbm1lbnRzLgorICAgICMKKyAgICBzdWIgYWxpZ25tZW50IHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQWxpZ25tZW50Jyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNywgMTIpOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfcm93KDAsIDQwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X3NlbGVjdGlvbig3LCAwKTsKKyAgICAKKyAgICAgICAgbXkgJGZvcm1hdDAxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwMiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDYgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA3ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwOCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDkgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDEwID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxMSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDEzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxNCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDE2ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxNyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgIAorICAgICAgICAkZm9ybWF0MDItPnNldF9hbGlnbigndG9wJyk7CisgICAgICAgICRmb3JtYXQwMy0+c2V0X2FsaWduKCdib3R0b20nKTsKKyAgICAgICAgJGZvcm1hdDA0LT5zZXRfYWxpZ24oJ3ZjZW50ZXInKTsKKyAgICAgICAgJGZvcm1hdDA1LT5zZXRfYWxpZ24oJ3ZqdXN0aWZ5Jyk7CisgICAgICAgICRmb3JtYXQwNi0+c2V0X3RleHRfd3JhcCgpOworICAgIAorICAgICAgICAkZm9ybWF0MDctPnNldF9hbGlnbignbGVmdCcpOworICAgICAgICAkZm9ybWF0MDgtPnNldF9hbGlnbigncmlnaHQnKTsKKyAgICAgICAgJGZvcm1hdDA5LT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgICAgICAkZm9ybWF0MTAtPnNldF9hbGlnbignZmlsbCcpOworICAgICAgICAkZm9ybWF0MTEtPnNldF9hbGlnbignanVzdGlmeScpOworICAgICAgICAkZm9ybWF0MTItPnNldF9tZXJnZSgpOworICAgIAorICAgICAgICAkZm9ybWF0MTMtPnNldF9yb3RhdGlvbig0NSk7CisgICAgICAgICRmb3JtYXQxNC0+c2V0X3JvdGF0aW9uKC00NSk7CisgICAgICAgICRmb3JtYXQxNS0+c2V0X3JvdGF0aW9uKDI3MCk7CisgICAgCisgICAgICAgICRmb3JtYXQxNi0+c2V0X3NocmluaygpOworICAgICAgICAkZm9ybWF0MTctPnNldF9pbmRlbnQoMSk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdWZXJ0aWNhbCcsICAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICd0b3AnLCAgICAgICAgICAkZm9ybWF0MDIpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAyLCAnYm90dG9tJywgICAgICAgJGZvcm1hdDAzKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgJ3ZjZW50ZXInLCAgICAgICRmb3JtYXQwNCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDQsICd2anVzdGlmeScsICAgICAkZm9ybWF0MDUpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA1LCAidGV4dFxud3JhcCIsICAgJGZvcm1hdDA2KTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgJ0hvcml6b250YWwnLCAgICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMSwgJ2xlZnQnLCAgICAgICAgICRmb3JtYXQwNyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDIsICdyaWdodCcsICAgICAgICAkZm9ybWF0MDgpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAzLCAnY2VudGVyJywgICAgICAgJGZvcm1hdDA5KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgNCwgJ2ZpbGwnLCAgICAgICAgICRmb3JtYXQxMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDUsICdqdXN0aWZ5JywgICAgICAkZm9ybWF0MTEpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAxLCAnbWVyZ2UnLCAgICAgICAgJGZvcm1hdDEyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMiwgJycsICAgICAgICAgICAgICRmb3JtYXQxMik7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDMsICdTaHJpbmsgJyB4IDMsICAkZm9ybWF0MTYpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzLCA0LCAnSW5kZW50JywgICAgICAgJGZvcm1hdDE3KTsKKyAgICAKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMCwgJ1JvdGF0aW9uJywgICAgICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMSwgJ1JvdGF0ZSA0NScsICAgICRmb3JtYXQxMyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsIDEsICdSb3RhdGUgLTQ1JywgICAkZm9ybWF0MTQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAxLCAnUm90YXRlIDI3MCcsICAgJGZvcm1hdDE1KTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlIG90aGVyIG1pc2NlbGxhbmVvdXMgZmVhdHVyZXMuCisgICAgIworICAgIHN1YiBtaXNjIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnTWlzY2VsbGFuZW91cycpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDIsIDIsIDI1KTsKKyAgICAKKyAgICAgICAgbXkgJGZvcm1hdDAxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwMiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDYgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA3ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgCisgICAgICAgICRmb3JtYXQwMS0+c2V0X3VuZGVybGluZSgweDAxKTsKKyAgICAgICAgJGZvcm1hdDAyLT5zZXRfdW5kZXJsaW5lKDB4MDIpOworICAgICAgICAkZm9ybWF0MDMtPnNldF91bmRlcmxpbmUoMHgyMSk7CisgICAgICAgICRmb3JtYXQwNC0+c2V0X3VuZGVybGluZSgweDIyKTsKKyAgICAgICAgJGZvcm1hdDA1LT5zZXRfZm9udF9zdHJpa2VvdXQoKTsKKyAgICAgICAgJGZvcm1hdDA2LT5zZXRfZm9udF9vdXRsaW5lKCk7CisgICAgICAgICRmb3JtYXQwNy0+c2V0X2ZvbnRfc2hhZG93KCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsICAyLCAnVW5kZXJsaW5lICAweDAxJywgICAgICAgICAgJGZvcm1hdDAxKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgIDIsICdVbmRlcmxpbmUgIDB4MDInLCAgICAgICAgICAkZm9ybWF0MDIpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAgMiwgJ1VuZGVybGluZSAgMHgyMScsICAgICAgICAgICRmb3JtYXQwMyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsICAyLCAnVW5kZXJsaW5lICAweDIyJywgICAgICAgICAgJGZvcm1hdDA0KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoOSwgIDIsICdTdHJpa2VvdXQnLCAgICAgICAgICAgICAgICAkZm9ybWF0MDUpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgxMSwgMiwgJ091dGxpbmUgKE1hY2ludG9zaCBvbmx5KScsICRmb3JtYXQwNik7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEzLCAyLCAnU2hhZG93IChNYWNpbnRvc2ggb25seSknLCAgJGZvcm1hdDA3KTsKKyAgICB9CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9mb3JtYXRzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogYnVnX3JlcG9ydC5wbAorCisKKworQSB0ZW1wbGF0ZSBmb3Igc3VibWl0dGluZyBhIGJ1ZyByZXBvcnQuCisKK1J1biB0aGlzIHByb2dyYW0gYW5kIHJlYWQgdGhlIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgdGVtcGxhdGUgZm9yIHN1Ym1pdHRpbmcgYSBidWcgcmVwb3J0LgorICAgICMKKyAgICAjIFJ1biB0aGlzIHByb2dyYW0gYW5kIHJlYWQgdGhlIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICBwcmludCA8PCAnSElOVFNfMSc7CisgICAgCisgICAgUkVQT1JUSU5HIEEgQlVHIE9SIEFTS0lORyBBIFFVRVNUSU9OCisgICAgCisgICAgICAgIEZlZWwgZnJlZSB0byByZXBvcnQgYnVncyBvciBhc2sgcXVlc3Rpb25zLiBIb3dldmVyLCB0byBzYXZlIHRpbWUKKyAgICAgICAgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBzdGVwcyBmaXJzdDoKKyAgICAKKyAgICAgICAgUmVhZCB0aGUgZG9jdW1lbnRhdGlvbjoKKyAgICAKKyAgICAgICAgICAgIFRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHJlZmluZWQgaW4KKyAgICAgICAgICAgIHJlc3BvbnNlIHRvIHVzZXIgcXVlc3Rpb25zLiBUaGVyZWZvcmUsIGlmIHlvdSBoYXZlIGEgcXVlc3Rpb24gaXQgaXMKKyAgICAgICAgICAgIHBvc3NpYmxlIHRoYXQgc29tZW9uZSBlbHNlIGhhcyBhc2tlZCBpdCBiZWZvcmUgeW91IGFuZCB0aGF0IGl0IGlzCisgICAgICAgICAgICBhbHJlYWR5IGFkZHJlc3NlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhlcmUgaXMgYSBsb3Qgb2YKKyAgICAgICAgICAgIGRvY3VtZW50YXRpb24gdG8gZ2V0IHRocm91Z2ggeW91IHNob3VsZCBhdCBsZWFzdCByZWFkIHRoZSB0YWJsZSBvZgorICAgICAgICAgICAgY29udGVudHMgYW5kIHNlYXJjaCBmb3Iga2V5d29yZHMgdGhhdCB5b3UgYXJlIGludGVyZXN0ZWQgaW4uCisgICAgCisgICAgICAgIExvb2sgYXQgdGhlIGV4YW1wbGUgcHJvZ3JhbXM6CisgICAgCisgICAgICAgICAgICBUaGVyZSBhcmUgb3ZlciA3MCBleGFtcGxlIHByb2dyYW1zIHNoaXBwZWQgd2l0aCB0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRpc3RyaWJ1dGlvbi4gTWFueSBvZiB0aGVzZSB3ZXJlIGNyZWF0ZWQgaW4KKyAgICAgICAgICAgIHJlc3BvbnNlIHRvIHVzZXIgcXVlc3Rpb25zLiBUcnkgdG8gaWRlbnRpZnkgYW4gZXhhbXBsZSBwcm9ncmFtIHRoYXQKKyAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHlvdXIgcXVlcnkgYW5kIGFkYXB0IGl0IHRvIHlvdXIgbmVlZHMuCisgICAgCisgICAgSElOVFNfMQorICAgIHByaW50ICJQcmVzcyBlbnRlciAuLi4iOyA8U1RESU4+OworICAgIAorICAgIHByaW50IDw8ICdISU5UU18yJzsKKyAgICAKKyAgICAgICAgSWYgeW91IHN1Ym1pdCBhIGJ1ZyByZXBvcnQgaGVyZSBhcmUgc29tZSBwb2ludGVycy4KKyAgICAKKyAgICAgICAgMS4gIFB1dCAiV3JpdGVFeGNlbDoiIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1YmplY3QgbGluZS4gVGhpcyBoZWxwcworICAgICAgICAgICAgdG8gZmlsdGVyIGdlbnVpbmUgbWVzc2FnZXMgZnJvbSBzcGFtLgorICAgIAorICAgICAgICAyLiAgRGVzY3JpYmUgdGhlIHByb2JsZW1zIGFzIGNsZWFybHkgYW5kIGFzIGNvbmNpc2VseSBhcyBwb3NzaWJsZS4KKyAgICAKKyAgICAgICAgMy4gIFNlbmQgYSBzYW1wbGUgcHJvZ3JhbS4gSXQgaXMgb2Z0ZW4gZWFzaWVyIHRvIGRlc2NyaWJlIGEgcHJvYmxlbSBpbgorICAgICAgICAgICAgY29kZSB0aGFuIGluIHdyaXR0ZW4gcHJvc2UuCisgICAgCisgICAgICAgIDQuICBUaGUgc2FtcGxlIHByb2dyYW0gc2hvdWxkIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlIHRvIGRlbW9uc3RyYXRlIHRoZQorICAgICAgICAgICAgcHJvYmxlbS4gRG9uJ3QgY29weSBhbmQgcGFzdCBsYXJnZSBzZWN0aW9ucyBvZiB5b3VyIHByb2dyYW0uIFRoZQorICAgICAgICAgICAgcHJvZ3JhbSBzaG91bGQgYWxzbyBiZSBzZWxmIGNvbnRhaW5lZCBhbmQgd29ya2luZy4KKyAgICAKKyAgICAgICAgQSBzYW1wbGUgYnVnIHJlcG9ydCBpcyBnZW5lcmF0ZWQgYmVsb3cuIElmIHlvdSB1c2UgdGhpcyBmb3JtYXQgdGhlbiBpdAorICAgICAgICB3aWxsIGhlbHAgdG8gYW5hbHlzZSB5b3VyIHF1ZXN0aW9uIGFuZCByZXNwb25kIHRvIGl0IG1vcmUgcXVpY2tseS4KKyAgICAKKyAgICAgICAgUGxlYXNlIGRvbid0IHNlbmQgcGF0Y2hlcyB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIGF1dGhvciBmaXJzdC4KKyAgICAKKyAgICAKKyAgICBISU5UU18yCisgICAgcHJpbnQgIlByZXNzIGVudGVyIC4uLiI7IDxTVERJTj47CisgICAgCisgICAgCisgICAgcHJpbnQgPDwgJ0VNQUlMJzsKKyAgICAKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIAorICAgIFRvOiAgICAgIEpvaG4gTWNOYW1hcmEgPGptY25hbWFyYUBjcGFuLm9yZz4KKyAgICBTdWJqZWN0OiBXcml0ZUV4Y2VsOiBQcm9ibGVtIHdpdGggc29tZXRoaW5nLgorICAgIAorICAgIEhpIEpvaG4sCisgICAgCisgICAgSSBhbSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgSSBoYXZlIGVuY291bnRlcmVkIGEgcHJvYmxlbS4gSQorICAgIHdhbnQgaXQgdG8gZG8gU09NRVRISU5HIGJ1dCB0aGUgbW9kdWxlIGFwcGVhcnMgdG8gZG8gU09NRVRISU5HX0VMU0UuCisgICAgCisgICAgSGVyZSBpcyBzb21lIGNvZGUgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHByb2JsZW0uCisgICAgCisgICAgICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICAgICB1c2Ugc3RyaWN0OworICAgICAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJyZWxvYWQueGxzIik7CisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkhpIEV4Y2VsISIpOworICAgIAorICAgICAgICBfX0VORF9fCisgICAgCisgICAgCisgICAgSSB0ZXN0ZWQgdXNpbmcgRXhjZWwgWFggKG9yIEdudW1lcmljIG9yIE9wZW5PZmZpY2Uub3JnKS4KKyAgICAKKyAgICBNeSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBzeXN0ZW0gZGV0YWlscyBhcmUgYXMgZm9sbG93czoKKyAgICBFTUFJTAorICAgIAorICAgIAorICAgIHByaW50ICJcbiAgICBQZXJsIHZlcnNpb24gICA6ICRdIjsKKyAgICBwcmludCAiXG4gICAgT1MgbmFtZSAgICAgICAgOiAkXk8iOworICAgIHByaW50ICJcbiAgICBNb2R1bGUgdmVyc2lvbnM6IChub3QgYWxsIGFyZSByZXF1aXJlZClcbiI7CisgICAgCisgICAgCisgICAgbXkgQG1vZHVsZXMgPSBxdygKKyAgICAgICAgICAgICAgICAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorICAgICAgICAgICAgICAgICAgICAgIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsCisgICAgICAgICAgICAgICAgICAgICAgT0xFOjpTdG9yYWdlX0xpdGUKKyAgICAgICAgICAgICAgICAgICAgICBQYXJzZTo6UmVjRGVzY2VudAorICAgICAgICAgICAgICAgICAgICAgIEZpbGU6OlRlbXAKKyAgICAgICAgICAgICAgICAgICAgICBEaWdlc3Q6Ok1ENAorICAgICAgICAgICAgICAgICAgICAgIERpZ2VzdDo6UGVybDo6TUQ0CisgICAgICAgICAgICAgICAgICAgICAgRGlnZXN0OjpNRDUKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICBmb3IgbXkgJG1vZHVsZSAoQG1vZHVsZXMpIHsKKyAgICAgICAgbXkgJHZlcnNpb247CisgICAgICAgIGV2YWwgInJlcXVpcmUgJG1vZHVsZSI7CisgICAgCisgICAgICAgIGlmIChub3QgJEApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gJG1vZHVsZS0+VkVSU0lPTjsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gJyh1bmtub3duKScgaWYgbm90IGRlZmluZWQgJHZlcnNpb247CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9ICcobm90IGluc3RhbGxlZCknOworICAgICAgICB9CisgICAgCisgICAgICAgIHByaW50ZiAiJTIxcyUtMjRzXHQlc1xuIiwgIiIsICRtb2R1bGUsICR2ZXJzaW9uOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwcmludCA8PCAiQllFIjsKKyAgICBZb3VycyBldGMuLAorICAgIAorICAgIEEuIFBlcnNvbgorICAgIC0tCisgICAgCisgICAgQllFCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9idWdfcmVwb3J0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogYXV0b2ZpbHRlci5wbAorCisKKworQW4gZXhhbXBsZSBvZiBob3cgdG8gY3JlYXRlIGF1dG9maWx0ZXJzIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK0FuIGF1dG9maWx0ZXIgaXMgYSB3YXkgb2YgYWRkaW5nIGRyb3AgZG93biBsaXN0cyB0byB0aGUgaGVhZGVycyBvZiBhIDJEIHJhbmdlCitvZiB3b3Jrc2hlZXQgZGF0YS4gVGhpcyBpcyB0dXJuIGFsbG93IHVzZXJzIHRvIGZpbHRlciB0aGUgZGF0YSBiYXNlZCBvbgorc2ltcGxlIGNyaXRlcmlhIHNvIHRoYXQgc29tZSBkYXRhIGlzIHNob3duIGFuZCBzb21lIGlzIGhpZGRlbi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvYXV0b2ZpbHRlci5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGF1dG9maWx0ZXIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBbiBleGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgYXV0b2ZpbHRlcnMgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBBbiBhdXRvZmlsdGVyIGlzIGEgd2F5IG9mIGFkZGluZyBkcm9wIGRvd24gbGlzdHMgdG8gdGhlIGhlYWRlcnMgb2YgYSAyRCByYW5nZQorICAgICMgb2Ygd29ya3NoZWV0IGRhdGEuIFRoaXMgaXMgdHVybiBhbGxvdyB1c2VycyB0byBmaWx0ZXIgdGhlIGRhdGEgYmFzZWQgb24KKyAgICAjIHNpbXBsZSBjcml0ZXJpYSBzbyB0aGF0IHNvbWUgZGF0YSBpcyBzaG93biBhbmQgc29tZSBpcyBoaWRkZW4uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNywgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnYXV0b2ZpbHRlci54bHMnKTsKKyAgICAKKyAgICBkaWUgIkNvdWxkbid0IGNyZWF0ZSBuZXcgRXhjZWwgZmlsZTogJCEuXG4iIHVubGVzcyBkZWZpbmVkICR3b3JrYm9vazsKKyAgICAKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ1ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDYgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICBteSAkYm9sZCAgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChib2xkID0+IDEpOworICAgIAorICAgIAorICAgICMgRXh0cmFjdCB0aGUgZGF0YSBlbWJlZGRlZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAgICBteSBAaGVhZGluZ3MgPSBzcGxpdCAnICcsIDxEQVRBPjsKKyAgICBteSBAZGF0YTsKKyAgICBwdXNoIEBkYXRhLCBbc3BsaXRdIHdoaWxlIDxEQVRBPjsKKyAgICAKKyAgICAKKyAgICAjIFNldCB1cCBzZXZlcmFsIHNoZWV0cyB3aXRoIHRoZSBzYW1lIGRhdGEuCisgICAgZm9yIG15ICR3b3Jrc2hlZXQgKCR3b3JrYm9vay0+c2hlZXRzKCkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpEJywgMTIpOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfcm93KDAsIDIwLCAkYm9sZCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsIFxAaGVhZGluZ3MpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBdXRvZmlsdGVyIHdpdGhvdXQgY29uZGl0aW9ucy4KKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDEtPmF1dG9maWx0ZXIoJ0ExOkQ1MScpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTInLCBbW0BkYXRhXV0pOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBdXRvZmlsdGVyIHdpdGggYSBmaWx0ZXIgY29uZGl0aW9uIGluIHRoZSBmaXJzdCBjb2x1bW4uCisgICAgIworICAgIAorICAgICMgVGhlIHJhbmdlIGluIHRoaXMgZXhhbXBsZSBpcyB0aGUgc2FtZSBhcyBhYm92ZSBidXQgaW4gcm93LWNvbHVtbiBub3RhdGlvbi4KKyAgICAkd29ya3NoZWV0Mi0+YXV0b2ZpbHRlcigwLCAwLCA1MCwgMyk7CisgICAgCisgICAgIyBUaGUgcGxhY2Vob2xkZXIgIlJlZ2lvbiIgaW4gdGhlIGZpbHRlciBpcyBpZ25vcmVkIGFuZCBjYW4gYmUgYW55IHN0cmluZworICAgICMgdGhhdCBhZGRzIGNsYXJpdHkgdG8gdGhlIGV4cHJlc3Npb24uCisgICAgIworICAgICR3b3Jrc2hlZXQyLT5maWx0ZXJfY29sdW1uKDAsICdSZWdpb24gZXEgRWFzdCcpOworICAgIAorICAgICMKKyAgICAjIEhpZGUgdGhlIHJvd3MgdGhhdCBkb24ndCBtYXRjaCB0aGUgZmlsdGVyIGNyaXRlcmlhLgorICAgICMKKyAgICBteSAkcm93ID0gMTsKKyAgICAKKyAgICBmb3IgbXkgJHJvd19kYXRhIChAZGF0YSkgeworICAgICAgICBteSAkcmVnaW9uID0gJHJvd19kYXRhLT5bMF07CisgICAgCisgICAgICAgIGlmICgkcmVnaW9uIGVxICdFYXN0JykgeworICAgICAgICAgICAgIyBSb3cgaXMgdmlzaWJsZS4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgSGlkZSByb3cuCisgICAgICAgICAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdygkcm93LCB1bmRlZiwgdW5kZWYsIDEpOworICAgICAgICB9CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQyLT53cml0ZSgkcm93KyssIDAsICRyb3dfZGF0YSk7CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBBdXRvZmlsdGVyIHdpdGggYSBkdWFsIGZpbHRlciBjb25kaXRpb24gaW4gb25lIG9mIHRoZSBjb2x1bW5zLgorICAgICMKKyAgICAKKyAgICAkd29ya3NoZWV0My0+YXV0b2ZpbHRlcignQTE6RDUxJyk7CisgICAgCisgICAgJHdvcmtzaGVldDMtPmZpbHRlcl9jb2x1bW4oJ0EnLCAneCBlcSBFYXN0IG9yIHggZXEgU291dGgnKTsKKyAgICAKKyAgICAjCisgICAgIyBIaWRlIHRoZSByb3dzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGZpbHRlciBjcml0ZXJpYS4KKyAgICAjCisgICAgJHJvdyA9IDE7CisgICAgCisgICAgZm9yIG15ICRyb3dfZGF0YSAoQGRhdGEpIHsKKyAgICAgICAgbXkgJHJlZ2lvbiA9ICRyb3dfZGF0YS0+WzBdOworICAgIAorICAgICAgICBpZiAoJHJlZ2lvbiBlcSAnRWFzdCcgb3IgJHJlZ2lvbiBlcSAnU291dGgnKSB7CisgICAgICAgICAgICAjIFJvdyBpcyB2aXNpYmxlLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBIaWRlIHJvdy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KCRyb3csIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDMtPndyaXRlKCRyb3crKywgMCwgJHJvd19kYXRhKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIEF1dG9maWx0ZXIgd2l0aCBmaWx0ZXIgY29uZGl0aW9ucyBpbiB0d28gY29sdW1ucy4KKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDQtPmF1dG9maWx0ZXIoJ0ExOkQ1MScpOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5maWx0ZXJfY29sdW1uKCdBJywgJ3ggZXEgRWFzdCcpOworICAgICR3b3Jrc2hlZXQ0LT5maWx0ZXJfY29sdW1uKCdDJywgJ3ggPiAzMDAwIGFuZCB4IDwgODAwMCcgKTsKKyAgICAKKyAgICAjCisgICAgIyBIaWRlIHRoZSByb3dzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGZpbHRlciBjcml0ZXJpYS4KKyAgICAjCisgICAgJHJvdyA9IDE7CisgICAgCisgICAgZm9yIG15ICRyb3dfZGF0YSAoQGRhdGEpIHsKKyAgICAgICAgbXkgJHJlZ2lvbiA9ICRyb3dfZGF0YS0+WzBdOworICAgICAgICBteSAkdm9sdW1lID0gJHJvd19kYXRhLT5bMl07CisgICAgCisgICAgICAgIGlmICgkcmVnaW9uIGVxICdFYXN0JyBhbmQKKyAgICAgICAgICAgICR2b2x1bWUgPiAgMzAwMCAgIGFuZCAkdm9sdW1lIDwgODAwMAorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgICMgUm93IGlzIHZpc2libGUuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIEhpZGUgcm93LgorICAgICAgICAgICAgJHdvcmtzaGVldDQtPnNldF9yb3coJHJvdywgdW5kZWYsIHVuZGVmLCAxKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAkd29ya3NoZWV0NC0+d3JpdGUoJHJvdysrLCAwLCAkcm93X2RhdGEpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gQXV0b2ZpbHRlciB3aXRoIGZpbHRlciBmb3IgYmxhbmtzLgorICAgICMKKyAgICAKKyAgICAjIENyZWF0ZSBhIGJsYW5rIGNlbGwgaW4gb3VyIHRlc3QgZGF0YS4KKyAgICAkZGF0YVs1XS0+WzBdID0gJyc7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDUtPmF1dG9maWx0ZXIoJ0ExOkQ1MScpOworICAgICR3b3Jrc2hlZXQ1LT5maWx0ZXJfY29sdW1uKCdBJywgJ3ggPT0gQmxhbmtzJyk7CisgICAgCisgICAgIworICAgICMgSGlkZSB0aGUgcm93cyB0aGF0IGRvbid0IG1hdGNoIHRoZSBmaWx0ZXIgY3JpdGVyaWEuCisgICAgIworICAgICRyb3cgPSAxOworICAgIAorICAgIGZvciBteSAkcm93X2RhdGEgKEBkYXRhKSB7CisgICAgICAgIG15ICRyZWdpb24gPSAkcm93X2RhdGEtPlswXTsKKyAgICAKKyAgICAgICAgaWYgKCRyZWdpb24gZXEgJycpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgUm93IGlzIHZpc2libGUuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIEhpZGUgcm93LgorICAgICAgICAgICAgJHdvcmtzaGVldDUtPnNldF9yb3coJHJvdywgdW5kZWYsIHVuZGVmLCAxKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAkd29ya3NoZWV0NS0+d3JpdGUoJHJvdysrLCAwLCAkcm93X2RhdGEpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMKKyAgICAjIEV4YW1wbGUgNi4gQXV0b2ZpbHRlciB3aXRoIGZpbHRlciBmb3Igbm9uLWJsYW5rcy4KKyAgICAjCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDYtPmF1dG9maWx0ZXIoJ0ExOkQ1MScpOworICAgICR3b3Jrc2hlZXQ2LT5maWx0ZXJfY29sdW1uKCdBJywgJ3ggPT0gTm9uQmxhbmtzJyk7CisgICAgCisgICAgIworICAgICMgSGlkZSB0aGUgcm93cyB0aGF0IGRvbid0IG1hdGNoIHRoZSBmaWx0ZXIgY3JpdGVyaWEuCisgICAgIworICAgICRyb3cgPSAxOworICAgIAorICAgIGZvciBteSAkcm93X2RhdGEgKEBkYXRhKSB7CisgICAgICAgIG15ICRyZWdpb24gPSAkcm93X2RhdGEtPlswXTsKKyAgICAKKyAgICAgICAgaWYgKCRyZWdpb24gbmUgJycpCisgICAgICAgIHsKKyAgICAgICAgICAgICMgUm93IGlzIHZpc2libGUuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIEhpZGUgcm93LgorICAgICAgICAgICAgJHdvcmtzaGVldDYtPnNldF9yb3coJHJvdywgdW5kZWYsIHVuZGVmLCAxKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAkd29ya3NoZWV0Ni0+d3JpdGUoJHJvdysrLCAwLCAkcm93X2RhdGEpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0RBVEFfXworICAgIFJlZ2lvbiAgICBJdGVtICAgICAgVm9sdW1lICAgIE1vbnRoCisgICAgRWFzdCAgICAgIEFwcGxlICAgICA5MDAwICAgICAgSnVseQorICAgIEVhc3QgICAgICBBcHBsZSAgICAgNTAwMCAgICAgIEp1bHkKKyAgICBTb3V0aCAgICAgT3JhbmdlICAgIDkwMDAgICAgICBTZXB0ZW1iZXIKKyAgICBOb3J0aCAgICAgQXBwbGUgICAgIDIwMDAgICAgICBOb3ZlbWJlcgorICAgIFdlc3QgICAgICBBcHBsZSAgICAgOTAwMCAgICAgIE5vdmVtYmVyCisgICAgU291dGggICAgIFBlYXIgICAgICA3MDAwICAgICAgT2N0b2JlcgorICAgIE5vcnRoICAgICBQZWFyICAgICAgOTAwMCAgICAgIEF1Z3VzdAorICAgIFdlc3QgICAgICBPcmFuZ2UgICAgMTAwMCAgICAgIERlY2VtYmVyCisgICAgV2VzdCAgICAgIEdyYXBlICAgICAxMDAwICAgICAgTm92ZW1iZXIKKyAgICBTb3V0aCAgICAgUGVhciAgICAgIDEwMDAwICAgICBBcHJpbAorICAgIFdlc3QgICAgICBHcmFwZSAgICAgNjAwMCAgICAgIEphbnVhcnkKKyAgICBTb3V0aCAgICAgT3JhbmdlICAgIDMwMDAgICAgICBNYXkKKyAgICBOb3J0aCAgICAgQXBwbGUgICAgIDMwMDAgICAgICBEZWNlbWJlcgorICAgIFNvdXRoICAgICBBcHBsZSAgICAgNzAwMCAgICAgIEZlYnJ1YXJ5CisgICAgV2VzdCAgICAgIEdyYXBlICAgICAxMDAwICAgICAgRGVjZW1iZXIKKyAgICBFYXN0ICAgICAgR3JhcGUgICAgIDgwMDAgICAgICBGZWJydWFyeQorICAgIFNvdXRoICAgICBHcmFwZSAgICAgMTAwMDAgICAgIEp1bmUKKyAgICBXZXN0ICAgICAgUGVhciAgICAgIDcwMDAgICAgICBEZWNlbWJlcgorICAgIFNvdXRoICAgICBBcHBsZSAgICAgMjAwMCAgICAgIE9jdG9iZXIKKyAgICBFYXN0ICAgICAgR3JhcGUgICAgIDcwMDAgICAgICBEZWNlbWJlcgorICAgIE5vcnRoICAgICBHcmFwZSAgICAgNjAwMCAgICAgIEFwcmlsCisgICAgRWFzdCAgICAgIFBlYXIgICAgICA4MDAwICAgICAgRmVicnVhcnkKKyAgICBOb3J0aCAgICAgQXBwbGUgICAgIDcwMDAgICAgICBBdWd1c3QKKyAgICBOb3J0aCAgICAgT3JhbmdlICAgIDcwMDAgICAgICBKdWx5CisgICAgTm9ydGggICAgIEFwcGxlICAgICA2MDAwICAgICAgSnVuZQorICAgIFNvdXRoICAgICBHcmFwZSAgICAgODAwMCAgICAgIFNlcHRlbWJlcgorICAgIFdlc3QgICAgICBBcHBsZSAgICAgMzAwMCAgICAgIE9jdG9iZXIKKyAgICBTb3V0aCAgICAgT3JhbmdlICAgIDEwMDAwICAgICBOb3ZlbWJlcgorICAgIFdlc3QgICAgICBHcmFwZSAgICAgNDAwMCAgICAgIEp1bHkKKyAgICBOb3J0aCAgICAgT3JhbmdlICAgIDUwMDAgICAgICBBdWd1c3QKKyAgICBFYXN0ICAgICAgT3JhbmdlICAgIDEwMDAgICAgICBOb3ZlbWJlcgorICAgIEVhc3QgICAgICBPcmFuZ2UgICAgNDAwMCAgICAgIE9jdG9iZXIKKyAgICBOb3J0aCAgICAgR3JhcGUgICAgIDUwMDAgICAgICBBdWd1c3QKKyAgICBFYXN0ICAgICAgQXBwbGUgICAgIDEwMDAgICAgICBEZWNlbWJlcgorICAgIFNvdXRoICAgICBBcHBsZSAgICAgMTAwMDAgICAgIE1hcmNoCisgICAgRWFzdCAgICAgIEdyYXBlICAgICA3MDAwICAgICAgT2N0b2JlcgorICAgIFdlc3QgICAgICBHcmFwZSAgICAgMTAwMCAgICAgIFNlcHRlbWJlcgorICAgIEVhc3QgICAgICBHcmFwZSAgICAgMTAwMDAgICAgIE9jdG9iZXIKKyAgICBTb3V0aCAgICAgT3JhbmdlICAgIDgwMDAgICAgICBNYXJjaAorICAgIE5vcnRoICAgICBBcHBsZSAgICAgNDAwMCAgICAgIEp1bHkKKyAgICBTb3V0aCAgICAgT3JhbmdlICAgIDUwMDAgICAgICBKdWx5CisgICAgV2VzdCAgICAgIEFwcGxlICAgICA0MDAwICAgICAgSnVuZQorICAgIEVhc3QgICAgICBBcHBsZSAgICAgNTAwMCAgICAgIEFwcmlsCisgICAgTm9ydGggICAgIFBlYXIgICAgICAzMDAwICAgICAgQXVndXN0CisgICAgRWFzdCAgICAgIEdyYXBlICAgICA5MDAwICAgICAgTm92ZW1iZXIKKyAgICBOb3J0aCAgICAgT3JhbmdlICAgIDgwMDAgICAgICBPY3RvYmVyCisgICAgRWFzdCAgICAgIEFwcGxlICAgICAxMDAwMCAgICAgSnVuZQorICAgIFNvdXRoICAgICBQZWFyICAgICAgMTAwMCAgICAgIERlY2VtYmVyCisgICAgTm9ydGggICAgIEdyYXBlICAgICAxMDAwMCAgICAgSnVseQorICAgIEVhc3QgICAgICBHcmFwZSAgICAgNjAwMCAgICAgIEZlYnJ1YXJ5CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2F1dG9maWx0ZXIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBhdXRvZml0LnBsCisKKworCitTaW11bGF0ZSBFeGNlbCdzIGF1dG9maXQgZm9yIGNvbHVtbiB3aWR0aHMuCisKK0V4Y2VsIHByb3ZpZGVzIGEgZnVuY3Rpb24gY2FsbGVkIEF1dG9maXQgKEZvcm1hdC0+Q29sdW1ucy0+QXV0b2ZpdCkgdGhhdAorYWRqdXN0cyBjb2x1bW4gd2lkdGhzIHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qgc3RyaW5nIGluIGEgY29sdW1uLgorRXhjZWwgY2FsY3VsYXRlcyB0aGVzZSB3aWR0aHMgYXQgcnVuIHRpbWUgd2hlbiBpdCBoYXMgYWNjZXNzIHRvIGluZm9ybWF0aW9uCithYm91dCBzdHJpbmcgbGVuZ3RocyBhbmQgZm9udCBpbmZvcm1hdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyAqbm90KiBhIGZlYXR1cmUKK29mIHRoZSBmaWxlIGZvcm1hdCBhbmQgdGh1cyBjYW5ub3QgYmUgaW1wbGVtZW50ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK0hvd2V2ZXIsIHdlIGNhbiBtYWtlIGFuIGF0dGVtcHQgdG8gc2ltdWxhdGUgaXQgYnkga2VlcGluZyB0cmFjayBvZiB0aGUKK2xvbmdlc3Qgc3RyaW5nIHdyaXR0ZW4gdG8gZWFjaCBjb2x1bW4gYW5kIHRoZW4gYWRqdXN0aW5nIHRoZSBjb2x1bW4gd2lkdGhzCitwcmlvciB0byBjbG9zaW5nIHRoZSBmaWxlLgorCitXZSBrZWVwIHRyYWNrIG9mIHRoZSBsb25nZXN0IHN0cmluZ3MgYnkgYWRkaW5nIGEgaGFuZGxlciB0byB0aGUgd3JpdGUoKQorZnVuY3Rpb24uIFNlZSBhZGRfaGFuZGxlcigpIGluIHRoZSBTOjpXRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitUaGUgbWFpbiBwcm9ibGVtIHdpdGggdHJ5aW5nIHRvIHNpbXVsYXRlIEF1dG9maXQgbGllcyBpbiBkZWZpbmluZyBhCityZWxhdGlvbnNoaXAgYmV0d2VlbiBhIHN0cmluZyBsZW5ndGggYW5kIGl0cyB3aWR0aCBpbiBhIGFyYml0cmFyeSBmb250IGFuZAorc2l6ZS4gV2UgdXNlIHR3byBhcHByb2FjaGVzIGJlbG93LiBUaGUgZmlyc3QgaXMgYSBzaW1wbGUgZGlyZWN0IHJlbGF0aW9uc2hpcAorb2J0YWluZWQgYnkgdHJpYWwgYW5kIGVycm9yLiBUaGUgc2Vjb25kIGlzIGEgc2xpZ2h0bHkgbW9yZSBzb3BoaXN0aWNhdGVkCittZXRob2QgdXNpbmcgYW4gZXh0ZXJuYWwgbW9kdWxlLiBGb3IgbW9yZSBjb21wbGljYXRlZCBhcHBsaWNhdGlvbnMgeW91IHdpbGwKK3Byb2JhYmx5IGhhdmUgdG8gd29yayBvdXQgeW91ciBvd24gbWV0aG9kcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvYXV0b2ZpdC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGF1dG9maXQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNpbXVsYXRlIEV4Y2VsJ3MgYXV0b2ZpdCBmb3IgY29sdW1uIHdpZHRocy4KKyAgICAjCisgICAgIyBFeGNlbCBwcm92aWRlcyBhIGZ1bmN0aW9uIGNhbGxlZCBBdXRvZml0IChGb3JtYXQtPkNvbHVtbnMtPkF1dG9maXQpIHRoYXQKKyAgICAjIGFkanVzdHMgY29sdW1uIHdpZHRocyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHN0cmluZyBpbiBhIGNvbHVtbi4KKyAgICAjIEV4Y2VsIGNhbGN1bGF0ZXMgdGhlc2Ugd2lkdGhzIGF0IHJ1biB0aW1lIHdoZW4gaXQgaGFzIGFjY2VzcyB0byBpbmZvcm1hdGlvbgorICAgICMgYWJvdXQgc3RyaW5nIGxlbmd0aHMgYW5kIGZvbnQgaW5mb3JtYXRpb24uIFRoaXMgZnVuY3Rpb24gaXMgKm5vdCogYSBmZWF0dXJlCisgICAgIyBvZiB0aGUgZmlsZSBmb3JtYXQgYW5kIHRodXMgY2Fubm90IGJlIGltcGxlbWVudGVkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIEhvd2V2ZXIsIHdlIGNhbiBtYWtlIGFuIGF0dGVtcHQgdG8gc2ltdWxhdGUgaXQgYnkga2VlcGluZyB0cmFjayBvZiB0aGUKKyAgICAjIGxvbmdlc3Qgc3RyaW5nIHdyaXR0ZW4gdG8gZWFjaCBjb2x1bW4gYW5kIHRoZW4gYWRqdXN0aW5nIHRoZSBjb2x1bW4gd2lkdGhzCisgICAgIyBwcmlvciB0byBjbG9zaW5nIHRoZSBmaWxlLgorICAgICMKKyAgICAjIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGxvbmdlc3Qgc3RyaW5ncyBieSBhZGRpbmcgYSBoYW5kbGVyIHRvIHRoZSB3cml0ZSgpCisgICAgIyBmdW5jdGlvbi4gU2VlIGFkZF9oYW5kbGVyKCkgaW4gdGhlIFM6OldFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgIworICAgICMgVGhlIG1haW4gcHJvYmxlbSB3aXRoIHRyeWluZyB0byBzaW11bGF0ZSBBdXRvZml0IGxpZXMgaW4gZGVmaW5pbmcgYQorICAgICMgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBzdHJpbmcgbGVuZ3RoIGFuZCBpdHMgd2lkdGggaW4gYSBhcmJpdHJhcnkgZm9udCBhbmQKKyAgICAjIHNpemUuIFdlIHVzZSB0d28gYXBwcm9hY2hlcyBiZWxvdy4gVGhlIGZpcnN0IGlzIGEgc2ltcGxlIGRpcmVjdCByZWxhdGlvbnNoaXAKKyAgICAjIG9idGFpbmVkIGJ5IHRyaWFsIGFuZCBlcnJvci4gVGhlIHNlY29uZCBpcyBhIHNsaWdodGx5IG1vcmUgc29waGlzdGljYXRlZAorICAgICMgbWV0aG9kIHVzaW5nIGFuIGV4dGVybmFsIG1vZHVsZS4gRm9yIG1vcmUgY29tcGxpY2F0ZWQgYXBwbGljYXRpb25zIHlvdSB3aWxsCisgICAgIyBwcm9iYWJseSBoYXZlIHRvIHdvcmsgb3V0IHlvdXIgb3duIG1ldGhvZHMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2F1dG9maXQueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEFkZCBhIGhhbmRsZXIgdG8gc3RvcmUgdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IHN0cmluZyB3cml0dGVuIHRvIGEgY29sdW1uLgorICAgICMgV2UgdXNlIHRoZSBzdG9yZWQgd2lkdGggdG8gc2ltdWxhdGUgYW4gYXV0b2ZpdCBvZiB0aGUgY29sdW1uIHdpZHRocy4KKyAgICAjCisgICAgIyBZb3Ugc2hvdWxkIGRvIHRoaXMgZm9yIGV2ZXJ5IHdvcmtzaGVldCB5b3Ugd2FudCB0byBhdXRvZml0LgorICAgICMKKyAgICAkd29ya3NoZWV0LT5hZGRfd3JpdGVfaGFuZGxlcihxcltcd10sIFwmc3RvcmVfc3RyaW5nX3dpZHRocyk7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0hlbGxvJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0hlbGxvIFdvcmxkJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0QxJywgJ0hlbGxvJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0YxJywgJ1RoaXMgaXMgYSBsb25nIHN0cmluZyBhcyBhbiBleGFtcGxlLicpOworICAgIAorICAgICMgUnVuIHRoZSBhdXRvZml0IGFmdGVyIHlvdSBoYXZlIGZpbmlzaGVkIHdyaXRpbmcgc3RyaW5ncyB0byB0aGUgd29ya2Jvb2suCisgICAgYXV0b2ZpdF9jb2x1bW5zKCR3b3Jrc2hlZXQpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBGdW5jdGlvbnMgdXNlZCBmb3IgQXV0b2ZpdC4KKyAgICAjCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGp1c3QgdGhlIGNvbHVtbiB3aWR0aHMgdG8gZml0IHRoZSBsb25nZXN0IHN0cmluZyBpbiB0aGUgY29sdW1uLgorICAgICMKKyAgICBzdWIgYXV0b2ZpdF9jb2x1bW5zIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9IHNoaWZ0OworICAgICAgICBteSAkY29sICAgICAgID0gMDsKKyAgICAKKyAgICAgICAgZm9yIG15ICR3aWR0aCAoQHskd29ya3NoZWV0LT57X19jb2xfd2lkdGhzfX0pIHsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJGNvbCwgJGNvbCwgJHdpZHRoKSBpZiAkd2lkdGg7CisgICAgICAgICAgICAkY29sKys7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgYSBjYWxsYmFjayB0aGF0IHdhcyBhZGRlZCB2aWEgYWRkX3dyaXRlX2hhbmRsZXIoKQorICAgICMgYWJvdmUuIEl0IG1vZGlmaWVzIHRoZSB3cml0ZSgpIGZ1bmN0aW9uIHNvIHRoYXQgaXQgc3RvcmVzIHRoZSBtYXhpbXVtCisgICAgIyB1bndyYXBwZWQgd2lkdGggb2YgYSBzdHJpbmcgaW4gYSBjb2x1bW4uCisgICAgIworICAgIHN1YiBzdG9yZV9zdHJpbmdfd2lkdGhzIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9IHNoaWZ0OworICAgICAgICBteSAkY29sICAgICAgID0gJF9bMV07CisgICAgICAgIG15ICR0b2tlbiAgICAgPSAkX1syXTsKKyAgICAKKyAgICAgICAgIyBJZ25vcmUgc29tZSB0b2tlbnMgdGhhdCB3ZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbi4KKyAgICAgICAgcmV0dXJuIGlmIG5vdCBkZWZpbmVkICR0b2tlbjsgICAgICAgIyBJZ25vcmUgdW5kZWZzLgorICAgICAgICByZXR1cm4gaWYgJHRva2VuIGVxICcnOyAgICAgICAgICAgICAjIElnbm9yZSBibGFuayBjZWxscy4KKyAgICAgICAgcmV0dXJuIGlmIHJlZiAkdG9rZW4gZXEgJ0FSUkFZJzsgICAgIyBJZ25vcmUgYXJyYXkgcmVmcy4KKyAgICAgICAgcmV0dXJuIGlmICR0b2tlbiA9fiAvXj0vOyAgICAgICAgICAgIyBJZ25vcmUgZm9ybXVsYQorICAgIAorICAgICAgICAjIElnbm9yZSBudW1iZXJzCisgICAgICAgIHJldHVybiBpZiAkdG9rZW4gPX4gL14oWystXT8pKD89XGR8XC5cZClcZCooXC5cZCopPyhbRWVdKFsrLV0/XGQrKSk/JC87CisgICAgCisgICAgICAgICMgSWdub3JlIHZhcmlvdXMgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGh5cGVybGlua3MuIEluIGEgcmVhbCBzY2VuYXJpbworICAgICAgICAjIHlvdSBtYXkgd2lzaCB0byB0cmFjayB0aGUgbGVuZ3RoIG9mIHRoZSBvcHRpb25hbCBzdHJpbmdzIHVzZWQgd2l0aAorICAgICAgICAjIHVybHMuCisgICAgICAgIHJldHVybiBpZiAkdG9rZW4gPX4gbXteW2ZoXXR0P3BzPzovL307CisgICAgICAgIHJldHVybiBpZiAkdG9rZW4gPX4gbXtebWFpbHRvOn07CisgICAgICAgIHJldHVybiBpZiAkdG9rZW4gPX4gbXteKD86aW58ZXgpdGVybmFsOn07CisgICAgCisgICAgCisgICAgICAgICMgV2Ugc3RvcmUgdGhlIHN0cmluZyB3aWR0aCBhcyBkYXRhIGluIHRoZSBXb3Jrc2hlZXQgb2JqZWN0LiBXZSB1c2UKKyAgICAgICAgIyBhIGRvdWJsZSB1bmRlcnNjb3JlIGtleSBuYW1lIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGZ1dHVyZSBuYW1lcy4KKyAgICAgICAgIworICAgICAgICBteSAkb2xkX3dpZHRoICAgID0gJHdvcmtzaGVldC0+e19fY29sX3dpZHRoc30tPlskY29sXTsKKyAgICAgICAgbXkgJHN0cmluZ193aWR0aCA9IHN0cmluZ193aWR0aCgkdG9rZW4pOworICAgIAorICAgICAgICBpZiAobm90IGRlZmluZWQgJG9sZF93aWR0aCBvciAkc3RyaW5nX3dpZHRoID4gJG9sZF93aWR0aCkgeworICAgICAgICAgICAgIyBZb3UgbWF5IHdpc2ggdG8gc2V0IGEgbWluaW11bSBjb2x1bW4gd2lkdGggYXMgZm9sbG93cy4KKyAgICAgICAgICAgICNyZXR1cm4gdW5kZWYgaWYgJHN0cmluZ193aWR0aCA8IDEwOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+e19fY29sX3dpZHRoc30tPlskY29sXSA9ICRzdHJpbmdfd2lkdGg7CisgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgIyBSZXR1cm4gY29udHJvbCB0byB3cml0ZSgpOworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBWZXJ5IHNpbXBsZSBjb252ZXJzaW9uIGJldHdlZW4gc3RyaW5nIGxlbmd0aCBhbmQgc3RyaW5nIHdpZHRoIGZvciBBcmlhbCAxMC4KKyAgICAjIFNlZSBiZWxvdyBmb3IgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgbWV0aG9kLgorICAgICMKKyAgICBzdWIgc3RyaW5nX3dpZHRoIHsKKyAgICAKKyAgICAgICAgcmV0dXJuIDAuOSAqIGxlbmd0aCAkX1swXTsKKyAgICB9CisgICAgCisgICAgX19FTkRfXworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGZ1bmN0aW9uIHVzZXMgYW4gZXh0ZXJuYWwgbW9kdWxlIHRvIGdldCBhIG1vcmUgYWNjdXJhdGUgd2lkdGggZm9yIGEKKyAgICAjIHN0cmluZy4gTm90ZSB0aGF0IGluIGEgcmVhbCBwcm9ncmFtIHlvdSBjb3VsZCAidXNlIiB0aGUgbW9kdWxlIGluc3RlYWQgb2YKKyAgICAjICJyZXF1aXJlIi1pbmcgaXQgYW5kIHlvdSBjb3VsZCBtYWtlIHRoZSBGb250IG9iamVjdCBnbG9iYWwgdG8gYXZvaWQgcmVwZWF0ZWQKKyAgICAjIGluaXRpYWxpc2F0aW9uLgorICAgICMKKyAgICAjIE5vdGUgYWxzbyB0aGF0IHRoZSAkcGl4ZWxfd2lkdGggdG8gJGNlbGxfd2lkdGggaXMgc3BlY2lmaWMgdG8gQXJpYWwuIEZvcgorICAgICMgb3RoZXIgZm9udHMgeW91IHNob3VsZCBjYWxjdWxhdGUgYXBwcm9wcmlhdGUgcmVsYXRpb25zaGlwcy4gQSBmdXR1cmUgdmVyc2lvbgorICAgICMgb2YgUzo6V0Ugd2lsbCBwcm92aWRlIGEgd2F5IG9mIHNwZWNpZnlpbmcgY29sdW1uIHdpZHRocyBpbiBwaXhlbHMgaW5zdGVhZCBvZgorICAgICMgY2VsbCB1bml0cyBpbiBvcmRlciB0byBzaW1wbGlmeSB0aGlzIGNvbnZlcnNpb24uCisgICAgIworICAgIHN1YiBzdHJpbmdfd2lkdGggeworICAgIAorICAgICAgICByZXF1aXJlIEZvbnQ6OlRURk1ldHJpY3M7CisgICAgCisgICAgICAgIG15ICRhcmlhbCAgICAgICAgPSBGb250OjpUVEZNZXRyaWNzLT5uZXcoJ2M6XHdpbmRvd3NcZm9udHNcYXJpYWwudHRmJyk7CisgICAgCisgICAgICAgIG15ICRmb250X3NpemUgICAgPSAxMDsKKyAgICAgICAgbXkgJGRwaSAgICAgICAgICA9IDk2OworICAgICAgICBteSAkdW5pdHNfcGVyX2VtID0gJGFyaWFsLT5nZXRfdW5pdHNfcGVyX2VtKCk7CisgICAgICAgIG15ICRmb250X3dpZHRoICAgPSAkYXJpYWwtPnN0cmluZ193aWR0aCgkX1swXSk7CisgICAgCisgICAgICAgICMgQ29udmVydCB0byBwaXhlbHMgYXMgcGVyIFRURk1ldHJpY3MgZG9jcy4KKyAgICAgICAgbXkgJHBpeGVsX3dpZHRoICA9IDYgKyAkZm9udF93aWR0aCAqJGZvbnRfc2l6ZSAqJGRwaSAvKDcyICokdW5pdHNfcGVyX2VtKTsKKyAgICAKKyAgICAgICAgIyBBZGQgZXh0cmEgcGl4ZWxzIGZvciBib3JkZXIgYXJvdW5kIHRleHQuCisgICAgICAgICRwaXhlbF93aWR0aCAgKz0gNjsKKyAgICAKKyAgICAgICAgIyBDb252ZXJ0IHRvIGNlbGwgd2lkdGggKGZvciBBcmlhbCkgYW5kIGZvciBjZWxsIHdpZHRocyA+IDEuCisgICAgICAgIG15ICRjZWxsX3dpZHRoICAgPSAoJHBpeGVsX3dpZHRoIC01KSAvNzsKKyAgICAKKyAgICAgICAgcmV0dXJuICRjZWxsX3dpZHRoOworICAgIAorICAgIH0KKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2F1dG9maXQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBiaWdmaWxlLnBsCisKKworCitFeGFtcGxlIG9mIGNyZWF0aW5nIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGUKK2RlZmF1bHQgN01CIGxpbWl0LgorCitUaGlzIGlzIGV4YWN0bHkgdGhhdCBzYW1lIGFzIGFueSBvdGhlciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBwcm9ncmFtIGV4Y2VwdAordGhhdCBpcyByZXF1aXJlcyB0aGF0IHRoZSBPTEU6OlN0b3JhZ2UgbW9kdWxlIGlzIGluc3RhbGxlZC4KKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2JpZ2ZpbGUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBiaWdmaWxlLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBjcmVhdGluZyBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlCisgICAgIyBkZWZhdWx0IDdNQiBsaW1pdC4KKyAgICAjCisgICAgIyBUaGlzIGlzIGV4YWN0bHkgdGhhdCBzYW1lIGFzIGFueSBvdGhlciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBwcm9ncmFtIGV4Y2VwdAorICAgICMgdGhhdCBpcyByZXF1aXJlcyB0aGF0IHRoZSBPTEU6OlN0b3JhZ2UgbW9kdWxlIGlzIGluc3RhbGxlZC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEphbiAyMDA3LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnYmlnZmlsZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCA1MCwgMTgpOworICAgIAorICAgIGZvciBteSAkY29sICgwIC4uIDUwKSB7CisgICAgICAgIGZvciBteSAkcm93ICgwIC4uIDYwMDApIHsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csICRjb2wsICJSb3c6ICRyb3cgQ29sOiAkY29sIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9iaWdmaWxlLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2dpLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0byBzZW5kIGFuIEV4Y2VsCitmaWxlIHRvIGEgYnJvd3NlciBpbiBhIENHSSBwcm9ncmFtLgorCitPbiBXaW5kb3dzIHRoZSBoYXNoLWJhbmcgbGluZSBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2U6CisKKyAgICAjIUM6XFBlcmxcYmluXHBlcmwuZXhlCisKK1RoZSAiQ29udGVudC1EaXNwb3NpdGlvbiIgbGluZSB3aWxsIGNhdXNlIGEgcHJvbXB0IHRvIGJlIGdlbmVyYXRlZCB0byBzYXZlCit0aGUgZmlsZS4gSWYgeW91IHdhbnQgdG8gc3RyZWFtIHRoZSBmaWxlIHRvIHRoZSBicm93c2VyIGluc3RlYWQsIGNvbW1lbnQgb3V0Cit0aGF0IGxpbmUgYXMgc2hvd24gYmVsb3cuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHNlbmQgYW4gRXhjZWwKKyAgICAjIGZpbGUgdG8gYSBicm93c2VyIGluIGEgQ0dJIHByb2dyYW0uCisgICAgIworICAgICMgT24gV2luZG93cyB0aGUgaGFzaC1iYW5nIGxpbmUgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlOgorICAgICMKKyAgICAjICAgICAjIUM6XFBlcmxcYmluXHBlcmwuZXhlCisgICAgIworICAgICMgVGhlICJDb250ZW50LURpc3Bvc2l0aW9uIiBsaW5lIHdpbGwgY2F1c2UgYSBwcm9tcHQgdG8gYmUgZ2VuZXJhdGVkIHRvIHNhdmUKKyAgICAjIHRoZSBmaWxlLiBJZiB5b3Ugd2FudCB0byBzdHJlYW0gdGhlIGZpbGUgdG8gdGhlIGJyb3dzZXIgaW5zdGVhZCwgY29tbWVudCBvdXQKKyAgICAjIHRoYXQgbGluZSBhcyBzaG93biBiZWxvdy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIFNldCB0aGUgZmlsZW5hbWUgYW5kIHNlbmQgdGhlIGNvbnRlbnQgdHlwZQorICAgIG15ICRmaWxlbmFtZSA9ImNnaXRlc3QueGxzIjsKKyAgICAKKyAgICBwcmludCAiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcbiI7CisgICAgIyBUaGUgQ29udGVudC1EaXNwb3NpdGlvbiB3aWxsIGdlbmVyYXRlIGEgcHJvbXB0IHRvIHNhdmUgdGhlIGZpbGUuIElmIHlvdSB3YW50CisgICAgIyB0byBzdHJlYW0gdGhlIGZpbGUgdG8gdGhlIGJyb3dzZXIsIGNvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZS4KKyAgICBwcmludCAiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9JGZpbGVuYW1lXG4iOworICAgIHByaW50ICJcbiI7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldC4gVGhlIHNwZWNpYWwgUGVybCBmaWxlaGFuZGxlIC0gd2lsbAorICAgICMgcmVkaXJlY3QgdGhlIG91dHB1dCB0byBTVERPVVQKKyAgICAjCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIi0iKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmb3IgY29sdW1uIDEKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIGZvcm1hdAorICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9zaXplKDE1KTsKKyAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHRvIHRoZSB3b3JrYm9vaworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJIaSBFeGNlbCEiLCAkZm9ybWF0KTsKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NnaS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNoYXJ0X2FyZWEucGwKKworCisKK0Egc2ltcGxlIGRlbW8gb2YgQXJlYSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X2FyZWEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGFydF9hcmVhLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZGVtbyBvZiBBcmVhIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDksIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2FyZWEueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnQ2F0ZWdvcnknLCAnVmFsdWVzIDEnLCAnVmFsdWVzIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDEuIEEgbWluaW1hbCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0MSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdhcmVhJyApOworICAgIAorICAgICMgQWRkIHZhbHVlcyBvbmx5LiBVc2UgdGhlIGRlZmF1bHQgY2F0ZWdvcmllcy4KKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKCB2YWx1ZXMgPT4gJz1TaGVldDEhJEIkMjokQiQ3JyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIEEgbWluaW1hbCBjaGFydCB3aXRoIHVzZXIgc3BlY2lmaWVkIGNhdGVnb3JpZXMgKFggYXhpcykKKyAgICAjICAgICAgICAgICAgYW5kIGEgc2VyaWVzIG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDIgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhZGRlZCB0aXRsZSBhbmQgYXhlcyBsYWJlbHMuCisgICAgIworICAgIG15ICRjaGFydDMgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDMtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0My0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQzLT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDMtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFuIGFkZGVkIHNlcmllcyBhbmQgd2l0aCBhCisgICAgIyAgICAgICAgICAgIHVzZXIgc3BlY2lmaWVkIGNoYXJ0IHNoZWV0IG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggbmFtZSA9PiAnUmVzdWx0cyBDaGFydCcsIHR5cGUgPT4gJ2FyZWEnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIGFub3RoZXIgc2VyaWVzLgorICAgICRjaGFydDQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDInLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NC0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA1LiBTYW1lIGFzIEV4YW1wbGUgMyBidXQgYXMgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDUgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDUtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NS0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDUtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgbWFpbiB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRTInLCAkY2hhcnQ1ICk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jaGFydF9hcmVhLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hhcnRfYmFyLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIEJhciBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X2Jhci5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGNoYXJ0X2Jhci5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgQmFyIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDksIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2Jhci54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworICAgIAorICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMgMScsICdWYWx1ZXMgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBtaW5pbWFsIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhZGRlZCB0aXRsZSBhbmQgYXhlcyBsYWJlbHMuCisgICAgIworICAgIG15ICRjaGFydDMgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYmFyJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0My0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQzLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDMtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0My0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYW4gYWRkZWQgc2VyaWVzIGFuZCB3aXRoIGEKKyAgICAjICAgICAgICAgICAgdXNlciBzcGVjaWZpZWQgY2hhcnQgc2hlZXQgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0NCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCBuYW1lID0+ICdSZXN1bHRzIENoYXJ0JywgdHlwZSA9PiAnYmFyJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDUtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NS0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDUtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgbWFpbiB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRTInLCAkY2hhcnQ1ICk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jaGFydF9iYXIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9jb2x1bW4ucGwKKworCisKK0Egc2ltcGxlIGRlbW8gb2YgQ29sdW1uIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY2hhcnRfY29sdW1uLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfY29sdW1uLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZGVtbyBvZiBDb2x1bW4gY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgRGVjZW1iZXIgMjAwOSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfY29sdW1uLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisgICAgCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ0NhdGVnb3J5JywgJ1ZhbHVlcyAxJywgJ1ZhbHVlcyAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIG1pbmltYWwgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworICAgIAorICAgICMgQWRkIHZhbHVlcyBvbmx5LiBVc2UgdGhlIGRlZmF1bHQgY2F0ZWdvcmllcy4KKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKCB2YWx1ZXMgPT4gJz1TaGVldDEhJEIkMjokQiQ3JyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIEEgbWluaW1hbCBjaGFydCB3aXRoIHVzZXIgc3BlY2lmaWVkIGNhdGVnb3JpZXMgKFggYXhpcykKKyAgICAjICAgICAgICAgICAgYW5kIGEgc2VyaWVzIG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDIgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFkZGVkIHRpdGxlIGFuZCBheGVzIGxhYmVscy4KKyAgICAjCisgICAgbXkgJGNoYXJ0MyA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdjb2x1bW4nICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQzLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0My0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQzLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhbiBhZGRlZCBzZXJpZXMgYW5kIHdpdGggYQorICAgICMgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBjaGFydCBzaGVldCBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnLCB0eXBlID0+ICdjb2x1bW4nICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIGFub3RoZXIgc2VyaWVzLgorICAgICRjaGFydDQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDInLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NC0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA1LiBTYW1lIGFzIEV4YW1wbGUgMyBidXQgYXMgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDUgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJywgZW1iZWRkZWQgPT4gMSApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NS0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQ1LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDUtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0NS0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSBtYWluIHdvcmtzaGVldC4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdFMicsICRjaGFydDUgKTsKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NoYXJ0X2NvbHVtbi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNoYXJ0X2xpbmUucGwKKworCisKK0Egc2ltcGxlIGRlbW8gb2YgTGluZSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X2xpbmUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGFydF9saW5lLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZGVtbyBvZiBMaW5lIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDksIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2xpbmUueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnQ2F0ZWdvcnknLCAnVmFsdWVzIDEnLCAnVmFsdWVzIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDEuIEEgbWluaW1hbCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0MSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdsaW5lJyApOworICAgIAorICAgICMgQWRkIHZhbHVlcyBvbmx5LiBVc2UgdGhlIGRlZmF1bHQgY2F0ZWdvcmllcy4KKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKCB2YWx1ZXMgPT4gJz1TaGVldDEhJEIkMjokQiQ3JyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIEEgbWluaW1hbCBjaGFydCB3aXRoIHVzZXIgc3BlY2lmaWVkIGNhdGVnb3JpZXMgKFggYXhpcykKKyAgICAjICAgICAgICAgICAgYW5kIGEgc2VyaWVzIG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDIgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhZGRlZCB0aXRsZSBhbmQgYXhlcyBsYWJlbHMuCisgICAgIworICAgIG15ICRjaGFydDMgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDMtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0My0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQzLT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDMtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFuIGFkZGVkIHNlcmllcyBhbmQgd2l0aCBhCisgICAgIyAgICAgICAgICAgIHVzZXIgc3BlY2lmaWVkIGNoYXJ0IHNoZWV0IG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggbmFtZSA9PiAnUmVzdWx0cyBDaGFydCcsIHR5cGUgPT4gJ2xpbmUnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIGFub3RoZXIgc2VyaWVzLgorICAgICRjaGFydDQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDInLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NC0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA1LiBTYW1lIGFzIEV4YW1wbGUgMyBidXQgYXMgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDUgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDUtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NS0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDUtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgbWFpbiB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRTInLCAkY2hhcnQ1ICk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jaGFydF9saW5lLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hhcnRfcGllLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIFBpZSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X3BpZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGNoYXJ0X3BpZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgUGllIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDksIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X3BpZS54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworICAgIAorICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMnIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0FwcGxlJywgJ0NoZXJyeScsICdQZWNhbicgXSwKKyAgICAgICAgWyA2MCwgICAgICAgMzAsICAgICAgIDEwICAgICBdLAorICAgIF07CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIG1pbmltYWwgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAncGllJyApOworICAgIAorICAgICMgQWRkIHZhbHVlcyBvbmx5LiBVc2UgdGhlIGRlZmF1bHQgY2F0ZWdvcmllcy4KKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKCB2YWx1ZXMgPT4gJz1TaGVldDEhJEIkMjokQiQ0JyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIEEgbWluaW1hbCBjaGFydCB3aXRoIHVzZXIgc3BlY2lmaWVkIGNhdGVnb3JpZXMgYW5kIGEgc2VyaWVzIG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDIgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAncGllJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDQnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1BpZSBzYWxlcyBkYXRhJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYW4gYWRkZWQgdGl0bGUuCisgICAgIworICAgIG15ICRjaGFydDMgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAncGllJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0My0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDQnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1BpZSBzYWxlcyBkYXRhJywKKyAgICApOworICAgIAorICAgICMgQWRkIGEgdGl0bGUuCisgICAgJGNoYXJ0My0+c2V0X3RpdGxlKCBuYW1lID0+ICdQb3B1bGFyIFBpZSBUeXBlcycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IHdpdGggYSB1c2VyIHNwZWNpZmllZCBjaGFydCBzaGVldCBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnLCB0eXBlID0+ICdwaWUnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ0JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnUGllIHNhbGVzIGRhdGEnLAorICAgICk7CisgICAgCisgICAgIyBUaGUgb3RoZXIgY2hhcnRfKi5wbCBleGFtcGxlcyBhZGQgYSBzZWNvbmQgc2VyaWVzIGluIGV4YW1wbGUgNCBidXQgYWRkaXRpb25hbAorICAgICMgc2VyaWVzIGFyZW4ndCBwbG90dGVkIGluIGEgcGllIGNoYXJ0LgorICAgIAorICAgICMgQWRkIGEgdGl0bGUuCisgICAgJGNoYXJ0NC0+c2V0X3RpdGxlKCBuYW1lID0+ICdQb3B1bGFyIFBpZSBUeXBlcycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA1LiBTYW1lIGFzIEV4YW1wbGUgMyBidXQgYXMgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDUgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAncGllJywgZW1iZWRkZWQgPT4gMSApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NS0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDQnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1BpZSBzYWxlcyBkYXRhJywKKyAgICApOworICAgIAorICAgICMgQWRkIGEgdGl0bGUuCisgICAgJGNoYXJ0NS0+c2V0X3RpdGxlKCBuYW1lID0+ICdQb3B1bGFyIFBpZSBUeXBlcycgKTsKKyAgICAKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgbWFpbiB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRDInLCAkY2hhcnQ1ICk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jaGFydF9waWUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9zY2F0dGVyLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIFNjYXR0ZXIgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9zY2F0dGVyLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfc2NhdHRlci5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgU2NhdHRlciBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9zY2F0dGVyLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisgICAgCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ0NhdGVnb3J5JywgJ1ZhbHVlcyAxJywgJ1ZhbHVlcyAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIG1pbmltYWwgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc2NhdHRlcicgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYWRkZWQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQzLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0My0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQzLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhbiBhZGRlZCBzZXJpZXMgYW5kIHdpdGggYQorICAgICMgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBjaGFydCBzaGVldCBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnLCB0eXBlID0+ICdzY2F0dGVyJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInLCBlbWJlZGRlZCA9PiAxICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ1LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0UyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfc2NhdHRlci5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNoYXJ0X3N0b2NrLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIFN0b2NrIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY2hhcnRfc3RvY2suanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGFydF9zdG9jay5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgU3RvY2sgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIHJldmVyc2UoJ8KpJyksIEphbnVhcnkgMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfc3RvY2sueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2V0IHVwIHRoZSBkYXRhIHdvcmtzaGVldCB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4gV2UgcmVhZCB0aGUgZXhhbXBsZQorICAgICMgZGF0YSBmcm9tIHRoZSBfX0RBVEFfXyBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIFRoaXMgc2ltdWxhdGVzCisgICAgIyByZWFkaW5nIHRoZSBkYXRhIGZyb20gYSBkYXRhYmFzZSBvciBvdGhlciBzb3VyY2UuCisgICAgIworICAgICMgVGhlIGRlZmF1bHQgRXhjZWwgU3RvY2sgY2hhcnQgaXMgYW4gT3Blbi1IaWdoLUxvdy1DbG9zZSBjaGFydC4gVGhlcmVmb3JlCisgICAgIyB3ZSB3aWxsIG5lZWQgZGF0YSBmb3IgZWFjaCBvZiB0aG9zZSBzZXJpZXMuCisgICAgIworICAgICMgVGhlIGxheW91dCBvZiB0aGUgX19EQVRBX18gc2VjdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBsYXlvdXQgb2YgdGhlIHdvcmtzaGVldC4KKyAgICAjCisgICAgCisgICAgIyBBZGQgc29tZSBmb3JtYXRzLgorICAgIG15ICRib2xkICAgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCAgICAgICA9PiAxICk7CisgICAgbXkgJGRhdGVfZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBudW1fZm9ybWF0ID0+ICdkZC9tbS95eXl5JyApOworICAgIAorICAgICMgSW5jcmVhc2UgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gdXNlZCBmb3IgZGF0ZSB0byBtYWtlIGl0IGNsZWFyZXIuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbiggJ0E6QScsIDEyICk7CisgICAgCisgICAgIyBSZWFkIHRoZSBkYXRhIGZyb20gdGhlIF9fREFUQV9fIHNlY3Rpb24gYXQgdGhlIGVuZC4gSW4gYSByZWFsIGV4YW1wbGUgdGhpcworICAgICMgd291bGQgcHJvYmFibHkgYmUgYSBkYXRhYmFzZSBxdWVyeS4KKyAgICBteSBAc3RvY2tfZGF0YTsKKyAgICAKKyAgICB3aGlsZSAoIDxEQVRBPiApIHsKKyAgICAgICAgbmV4dCB1bmxlc3MgL1xTLzsgICAgIyBTa2lwIGJsYW5rIGxpbmVzLgorICAgICAgICBuZXh0IGlmIC9eIy87ICAgICAgICAjIFNraXAgY29tbWVudHMuCisgICAgCisgICAgICAgIHB1c2ggQHN0b2NrX2RhdGEsIFtzcGxpdF07CisgICAgfQorICAgIAorICAgICMgV3JpdGUgdGhlIGRhdGEgdG8gdGhlIHdvcmtzaGVldC4KKyAgICBteSAkcm93ID0gMDsKKyAgICBteSAkY29sID0gMDsKKyAgICAKKyAgICBteSAkaGVhZGVycyA9IHNoaWZ0IEBzdG9ja19kYXRhOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93KyssICRjb2wsICRoZWFkZXJzLCAkYm9sZCApOworICAgIAorICAgIGZvciBteSAkc3RvY2tfZGF0YSAoIEBzdG9ja19kYXRhICkgeworICAgIAorICAgICAgICBteSBAZGF0YSA9IEAkc3RvY2tfZGF0YTsKKyAgICAgICAgbXkgJGRhdGUgPSBzaGlmdCBAZGF0YTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoICRyb3csICRjb2wsICRkYXRlLCAkZGF0ZV9mb3JtYXQgKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoICRyb3csICRjb2wgKyAxLCBcQGRhdGEgKTsKKyAgICAKKyAgICAgICAgJHJvdysrOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIGRlZmF1bHQgT3Blbi1IaWdoLUxvdy1DbG9zZSBjaGFydCB3aXRoIHNlcmllcyBuYW1lcywgYXhlcyBsYWJlbHMKKyAgICAjICAgICAgICAgICAgYW5kIGEgdGl0bGUuCisgICAgIworICAgIAorICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc3RvY2snICk7CisgICAgCisgICAgIyBBZGQgYSBzZXJpZXMgZm9yIGVhY2ggb2YgdGhlIE9wZW4tSGlnaC1Mb3ctQ2xvc2UgY29sdW1ucy4gVGhlIGNhdGVnb3JpZXMgYXJlCisgICAgIyB0aGUgZGF0ZXMgaW4gdGhlIGZpcnN0IGNvbHVtbi4KKyAgICAKKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdPcGVuJywKKyAgICApOworICAgIAorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQxMCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ0hpZ2gnLAorICAgICk7CisgICAgCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkRCQyOiREJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnTG93JywKKyAgICApOworICAgIAorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEUkMjokRSQxMCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ0Nsb3NlJywKKyAgICApOworICAgIAorICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICRjaGFydDEtPnNldF90aXRsZSggbmFtZSA9PiAnT3Blbi1IaWdoLUxvdy1DbG9zZScsICk7CisgICAgJGNoYXJ0MS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnRGF0ZScsICk7CisgICAgJGNoYXJ0MS0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2hhcmUgcHJpY2UnLCApOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIFNhbWUgYXMgdGhlIHByZXZpb3VzIGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICAKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3N0b2NrJywgZW1iZWRkZWQgPT4gMSApOworICAgIAorICAgICMgQWRkIGEgc2VyaWVzIGZvciBlYWNoIG9mIHRoZSBPcGVuLUhpZ2gtTG93LUNsb3NlIGNvbHVtbnMuIFRoZSBjYXRlZ29yaWVzIGFyZQorICAgICMgdGhlIGRhdGVzIGluIHRoZSBmaXJzdCBjb2x1bW4uCisgICAgCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnT3BlbicsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdIaWdoJywKKyAgICApOworICAgIAorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEQkMjokRCQxMCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ0xvdycsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRFJDI6JEUkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdDbG9zZScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBheGVzIGxhYmVscy4KKyAgICAkY2hhcnQyLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ09wZW4tSGlnaC1Mb3ctQ2xvc2UnLCApOworICAgICRjaGFydDItPnNldF94X2F4aXMoIG5hbWUgPT4gJ0RhdGUnLCApOworICAgICRjaGFydDItPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NoYXJlIHByaWNlJywgKTsKKyAgICAKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgbWFpbiB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRzInLCAkY2hhcnQyICk7CisgICAgCisgICAgCisgICAgX19EQVRBX18KKyAgICAjIFNvbWUgc2FtcGxlIHN0b2NrIGRhdGEgdXNlZCBmb3IgY2hhcnRpbmcuCisgICAgRGF0ZSAgICAgICAgT3BlbiAgICBIaWdoICAgIExvdyAgICAgQ2xvc2UKKyAgICAyMDA5LTA4LTE5ICAxMDAuMDAgIDEwNC4wNiAgOTUuOTYgICAxMDAuMzQKKyAgICAyMDA5LTA4LTIwICAxMDEuMDEgIDEwOS4wOCAgMTAwLjUwICAxMDguMzEKKyAgICAyMDA5LTA4LTIzICAxMTAuNzUgIDExMy40OCAgMTA5LjA1ICAxMDkuNDAKKyAgICAyMDA5LTA4LTI0ICAxMTEuMjQgIDExMS42MCAgMTAzLjU3ICAxMDQuODcKKyAgICAyMDA5LTA4LTI1ICAxMDQuOTYgIDEwOC4wMCAgMTAzLjg4ICAxMDYuMDAKKyAgICAyMDA5LTA4LTI2ICAxMDQuOTUgIDEwNy45NSAgMTA0LjY2ICAxMDcuOTEKKyAgICAyMDA5LTA4LTI3ICAxMDguMTAgIDEwOC42MiAgMTA1LjY5ICAxMDYuMTUKKyAgICAyMDA5LTA4LTMwICAxMDUuMjggIDEwNS40OSAgMTAyLjAxICAxMDIuMDEKKyAgICAyMDA5LTA4LTMxICAxMDIuMzAgIDEwMy43MSAgMTAyLjE2ICAxMDIuMzcKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfc3RvY2sucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGVzcy5wbAorCisKKworRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdmlhCitwcm9wZXJ0eSBoYXNoZXMuCisKK1NldHRpbmcgZm9ybWF0IHByb3BlcnRpZXMgdmlhIGhhc2hlcyBvZiB2YWx1ZXMgaXMgdXNlZnVsIHdoZW4geW91IGhhdmUKK3RvIGRlYWwgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBzaW1pbGFyIGZvcm1hdHMuIENvbnNpZGVyIGZvciBleGFtcGxlIGEKK2NoZXNzIGJvYXJkIHBhdHRlcm4gd2l0aCBibGFjayBzcXVhcmVzLCB3aGl0ZSB1bmZvcm1hdHRlZCBzcXVhcmVzIGFuZAorYSBib3JkZXIuCisKK1RoaXMgcmVsYXRpdmVseSBzaW1wbGUgZXhhbXBsZSByZXF1aXJlcyAxNCBzZXBhcmF0ZSBGb3JtYXQKK29iamVjdHMgYWx0aG91Z2ggdGhlcmUgYXJlIG9ubHkgNSBkaWZmZXJlbnQgcHJvcGVydGllczogYmxhY2sKK2JhY2tncm91bmQsIHRvcCBib3JkZXIsIGJvdHRvbSBib3JkZXIsIGxlZnQgYm9yZGVyIGFuZCByaWdodCBib3JkZXIuCisKK1VzaW5nIHByb3BlcnR5IGhhc2hlcyBpdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgdGhlc2UgNSBzZXRzIG9mCitwcm9wZXJ0aWVzIGFuZCB0aGVuIGFkZCB0aGVtIHRvZ2V0aGVyIHRvIGNyZWF0ZSB0aGUgMTQgRm9ybWF0Citjb25maWd1cmF0aW9ucy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY2hlc3MuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGVzcy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdmlhCisgICAgIyBwcm9wZXJ0eSBoYXNoZXMuCisgICAgIworICAgICMgU2V0dGluZyBmb3JtYXQgcHJvcGVydGllcyB2aWEgaGFzaGVzIG9mIHZhbHVlcyBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZQorICAgICMgdG8gZGVhbCB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIHNpbWlsYXIgZm9ybWF0cy4gQ29uc2lkZXIgZm9yIGV4YW1wbGUgYQorICAgICMgY2hlc3MgYm9hcmQgcGF0dGVybiB3aXRoIGJsYWNrIHNxdWFyZXMsIHdoaXRlIHVuZm9ybWF0dGVkIHNxdWFyZXMgYW5kCisgICAgIyBhIGJvcmRlci4KKyAgICAjCisgICAgIyBUaGlzIHJlbGF0aXZlbHkgc2ltcGxlIGV4YW1wbGUgcmVxdWlyZXMgMTQgc2VwYXJhdGUgRm9ybWF0CisgICAgIyBvYmplY3RzIGFsdGhvdWdoIHRoZXJlIGFyZSBvbmx5IDUgZGlmZmVyZW50IHByb3BlcnRpZXM6IGJsYWNrCisgICAgIyBiYWNrZ3JvdW5kLCB0b3AgYm9yZGVyLCBib3R0b20gYm9yZGVyLCBsZWZ0IGJvcmRlciBhbmQgcmlnaHQgYm9yZGVyLgorICAgICMKKyAgICAjIFVzaW5nIHByb3BlcnR5IGhhc2hlcyBpdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgdGhlc2UgNSBzZXRzIG9mCisgICAgIyBwcm9wZXJ0aWVzIGFuZCB0aGVuIGFkZCB0aGVtIHRvZ2V0aGVyIHRvIGNyZWF0ZSB0aGUgMTQgRm9ybWF0CisgICAgIyBjb25maWd1cmF0aW9ucy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEp1bHkgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJjaGVzcy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBTb21lIHJvdyBhbmQgY29sdW1uIGZvcm1hdHRpbmcKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkknLCAxMCk7CisgICAgCisgICAgZm9yIG15ICRpICgxLi44KSB7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9yb3coJGksIDUwKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBEZWZpbmUgdGhlIHByb3BlcnR5IGhhc2hlcworICAgICMKKyAgICBteSAlYmxhY2sgPSAoCisgICAgICAgICAgICAgICAgICAgICdmZ19jb2xvcicgID0+ICdibGFjaycsCisgICAgICAgICAgICAgICAgICAgICdwYXR0ZXJuJyAgID0+IDEsCisgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICBteSAldG9wICAgICA9ICggJ3RvcCcgICAgPT4gNiApOworICAgIG15ICVib3R0b20gID0gKCAnYm90dG9tJyA9PiA2ICk7CisgICAgbXkgJWxlZnQgICAgPSAoICdsZWZ0JyAgID0+IDYgKTsKKyAgICBteSAlcmlnaHQgICA9ICggJ3JpZ2h0JyAgPT4gNiApOworICAgIAorICAgIAorICAgICMgRGVmaW5lIHRoZSBmb3JtYXRzCisgICAgIworICAgIG15ICRmb3JtYXQwMSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgldG9wLCAgICAlbGVmdCAgICAgICAgICApOworICAgIG15ICRmb3JtYXQwMiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgldG9wLCAgICAlYmxhY2sgICAgICAgICApOworICAgIG15ICRmb3JtYXQwMyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgldG9wLCAgICAgICAgICAgICAgICAgICApOworICAgIG15ICRmb3JtYXQwNCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgldG9wLCAgICAlcmlnaHQsICVibGFjayApOworICAgIAorICAgIG15ICRmb3JtYXQwNSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglbGVmdCAgICAgICAgICAgICAgICAgICApOworICAgIG15ICRmb3JtYXQwNiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglYmxhY2sgICAgICAgICAgICAgICAgICApOworICAgIG15ICRmb3JtYXQwNyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggICAgICAgICAgICAgICAgICAgICAgICApOworICAgIG15ICRmb3JtYXQwOCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglcmlnaHQsICAlYmxhY2sgICAgICAgICApOworICAgIG15ICRmb3JtYXQwOSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglcmlnaHQgICAgICAgICAgICAgICAgICApOworICAgIG15ICRmb3JtYXQxMCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglbGVmdCwgICAlYmxhY2sgICAgICAgICApOworICAgIAorICAgIG15ICRmb3JtYXQxMSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglYm90dG9tLCAlbGVmdCwgICVibGFjayApOworICAgIG15ICRmb3JtYXQxMiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglYm90dG9tICAgICAgICAgICAgICAgICApOworICAgIG15ICRmb3JtYXQxMyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglYm90dG9tLCAlYmxhY2sgICAgICAgICApOworICAgIG15ICRmb3JtYXQxNCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglYm90dG9tLCAlcmlnaHQgICAgICAgICApOworICAgIAorICAgIAorICAgICMgRHJhdyB0aGUgcGF0dGVybgorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMicsICcnLCAkZm9ybWF0MDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDMicsICcnLCAkZm9ybWF0MDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMicsICcnLCAkZm9ybWF0MDMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFMicsICcnLCAkZm9ybWF0MDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGMicsICcnLCAkZm9ybWF0MDMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHMicsICcnLCAkZm9ybWF0MDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdIMicsICcnLCAkZm9ybWF0MDMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJMicsICcnLCAkZm9ybWF0MDQpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMycsICcnLCAkZm9ybWF0MTApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDMycsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMycsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFMycsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGMycsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHMycsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdIMycsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJMycsICcnLCAkZm9ybWF0MDkpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCNCcsICcnLCAkZm9ybWF0MDUpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDNCcsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdENCcsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFNCcsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGNCcsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHNCcsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdINCcsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJNCcsICcnLCAkZm9ybWF0MDgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCNScsICcnLCAkZm9ybWF0MTApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDNScsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdENScsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFNScsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGNScsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHNScsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdINScsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJNScsICcnLCAkZm9ybWF0MDkpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCNicsICcnLCAkZm9ybWF0MDUpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDNicsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdENicsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFNicsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGNicsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHNicsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdINicsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJNicsICcnLCAkZm9ybWF0MDgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCNycsICcnLCAkZm9ybWF0MTApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDNycsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdENycsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFNycsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGNycsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHNycsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdINycsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJNycsICcnLCAkZm9ybWF0MDkpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOCcsICcnLCAkZm9ybWF0MDUpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDOCcsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEOCcsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFOCcsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGOCcsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHOCcsICcnLCAkZm9ybWF0MDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdIOCcsICcnLCAkZm9ybWF0MDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJOCcsICcnLCAkZm9ybWF0MDgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOScsICcnLCAkZm9ybWF0MTEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDOScsICcnLCAkZm9ybWF0MTIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEOScsICcnLCAkZm9ybWF0MTMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdFOScsICcnLCAkZm9ybWF0MTIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGOScsICcnLCAkZm9ybWF0MTMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdHOScsICcnLCAkZm9ybWF0MTIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdIOScsICcnLCAkZm9ybWF0MTMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdJOScsICcnLCAkZm9ybWF0MTQpOworICAgIAorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jaGVzcy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNvbG9ycy5wbAorCisKKworRGVtb25zdHJhdGVzIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJ3MgbmFtZWQgY29sb3JzIGFuZCB0aGUgRXhjZWwgY29sb3IKK3BhbGV0dGUuCisKK1RoZSBzZXRfY3VzdG9tX2NvbG9yKCkgV29ya3NoZWV0IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBvbmUgb2YgdGhlCitidWlsdC1pbiBwYWxldHRlIHZhbHVlcyB3aXRoIGEgbW9yZSBzdWl0YWJsZSBjb2xvdXIuIFNlZSB0aGUgbWFpbiBkb2NzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jb2xvcnMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjb2xvcnMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGVzIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJ3MgbmFtZWQgY29sb3JzIGFuZCB0aGUgRXhjZWwgY29sb3IKKyAgICAjIHBhbGV0dGUuCisgICAgIworICAgICMgVGhlIHNldF9jdXN0b21fY29sb3IoKSBXb3Jrc2hlZXQgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIG9uZSBvZiB0aGUKKyAgICAjIGJ1aWx0LWluIHBhbGV0dGUgdmFsdWVzIHdpdGggYSBtb3JlIHN1aXRhYmxlIGNvbG91ci4gU2VlIHRoZSBtYWluIGRvY3MuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiY29sb3JzLnhscyIpOworICAgIAorICAgICMgU29tZSBjb21tb24gZm9ybWF0cworICAgIG15ICRjZW50ZXIgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGFsaWduID0+ICdjZW50ZXInKTsKKyAgICBteSAkaGVhZGluZyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChhbGlnbiA9PiAnY2VudGVyJywgYm9sZCA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIG5hbWVkIGNvbG9ycy4KKyAgICAjCisgICAgCisgICAgbXkgJWNvbG9ycyA9ICgKKyAgICAgICAgICAgICAgICAgICAgMHgwOCwgJ2JsYWNrJywKKyAgICAgICAgICAgICAgICAgICAgMHgwQywgJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAweDEwLCAnYnJvd24nLAorICAgICAgICAgICAgICAgICAgICAweDBGLCAnY3lhbicsCisgICAgICAgICAgICAgICAgICAgIDB4MTcsICdncmF5JywKKyAgICAgICAgICAgICAgICAgICAgMHgxMSwgJ2dyZWVuJywKKyAgICAgICAgICAgICAgICAgICAgMHgwQiwgJ2xpbWUnLAorICAgICAgICAgICAgICAgICAgICAweDBFLCAnbWFnZW50YScsCisgICAgICAgICAgICAgICAgICAgIDB4MTIsICduYXZ5JywKKyAgICAgICAgICAgICAgICAgICAgMHgzNSwgJ29yYW5nZScsCisgICAgICAgICAgICAgICAgICAgIDB4MjEsICdwaW5rJywKKyAgICAgICAgICAgICAgICAgICAgMHgxNCwgJ3B1cnBsZScsCisgICAgICAgICAgICAgICAgICAgIDB4MEEsICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAweDE2LCAnc2lsdmVyJywKKyAgICAgICAgICAgICAgICAgICAgMHgwOSwgJ3doaXRlJywKKyAgICAgICAgICAgICAgICAgICAgMHgwRCwgJ3llbGxvdycsCisgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ05hbWVkIGNvbG9ycycpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT5zZXRfY29sdW1uKDAsIDMsIDE1KTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDIsICJOYW1lIiwgICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMywgIkNvbG9yIiwgJGhlYWRpbmcpOworICAgIAorICAgIG15ICRpID0gMTsKKyAgICAKKyAgICB3aGlsZSAobXkoJGluZGV4LCAkY29sb3IpID0gZWFjaCAlY29sb3JzKSB7CisgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnX2NvbG9yID0+ICRjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgPT4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUoJGkrMSwgMCwgJGluZGV4LCAgICAgICAgICAgICAgICAgICAgJGNlbnRlcik7CisgICAgICAgICR3b3Jrc2hlZXQxLT53cml0ZSgkaSsxLCAxLCBzcHJpbnRmKCIweCUwMlgiLCAkaW5kZXgpLCAkY2VudGVyKTsKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKCRpKzEsIDIsICRjb2xvciwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUoJGkrMSwgMywgJycsICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgICAgICRpKys7CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgc3RhbmRhcmQgRXhjZWwgY29sb3JzIGluIHRoZSByYW5nZSA4Li42My4KKyAgICAjCisgICAgCisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1N0YW5kYXJkIGNvbG9ycycpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT5zZXRfY29sdW1uKDAsIDMsIDE1KTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDIsICJDb2xvciIsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMywgIk5hbWUiLCAgJGhlYWRpbmcpOworICAgIAorICAgIGZvciBteSAkaSAoOC4uNjMpIHsKKyAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmdfY29sb3IgPT4gJGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgID0+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDItPndyaXRlKCgkaSAtNyksIDAsICRpLCAgICAgICAgICAgICAgICAgICAgJGNlbnRlcik7CisgICAgICAgICR3b3Jrc2hlZXQyLT53cml0ZSgoJGkgLTcpLCAxLCBzcHJpbnRmKCIweCUwMlgiLCAkaSksICRjZW50ZXIpOworICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoKCRpIC03KSwgMiwgJycsICAgICAgICAgICAgICAgICAgICAkZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBBZGQgdGhlICBjb2xvciBuYW1lcworICAgICAgICBpZiAoZXhpc3RzICRjb2xvcnN7JGl9KSB7CisgICAgICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoKCRpIC03KSwgMywgJGNvbG9yc3skaX0sICRjZW50ZXIpOworICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY29sb3JzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY29tbWVudHMxLnBsCisKKworCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHdyaXRpbmcgY2VsbCBjb21tZW50cy4KKworQSBjZWxsIGNvbW1lbnQgaXMgaW5kaWNhdGVkIGluIEV4Y2VsIGJ5IGEgc21hbGwgcmVkIHRyaWFuZ2xlIGluIHRoZSB1cHBlcgorcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNlbGwuCisKK0ZvciBtb3JlIGFkdmFuY2VkIGNvbW1lbnQgb3B0aW9ucyBzZWUgY29tbWVudHMyLnBsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jb21tZW50czEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjb21tZW50czEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHdyaXRpbmcgY2VsbCBjb21tZW50cy4KKyAgICAjCisgICAgIyBBIGNlbGwgY29tbWVudCBpcyBpbmRpY2F0ZWQgaW4gRXhjZWwgYnkgYSBzbWFsbCByZWQgdHJpYW5nbGUgaW4gdGhlIHVwcGVyCisgICAgIyByaWdodC1oYW5kIGNvcm5lciBvZiB0aGUgY2VsbC4KKyAgICAjCisgICAgIyBGb3IgbW9yZSBhZHZhbmNlZCBjb21tZW50IG9wdGlvbnMgc2VlIGNvbW1lbnRzMi5wbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE5vdmVtYmVyIDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiY29tbWVudHMxLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICAgKCdBMScsICdIZWxsbycgICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0ExJywgJ1RoaXMgaXMgYSBjb21tZW50Jyk7CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jb21tZW50czEucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjb21tZW50czIucGwKKworCisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgd3JpdGluZyBjZWxsIGNvbW1lbnRzLgorCitBIGNlbGwgY29tbWVudCBpcyBpbmRpY2F0ZWQgaW4gRXhjZWwgYnkgYSBzbWFsbCByZWQgdHJpYW5nbGUgaW4gdGhlIHVwcGVyCityaWdodC1oYW5kIGNvcm5lciBvZiB0aGUgY2VsbC4KKworRWFjaCBvZiB0aGUgd29ya3NoZWV0cyBkZW1vbnN0cmF0ZXMgZGlmZmVyZW50IGZlYXR1cmVzIG9mIGNlbGwgY29tbWVudHMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NvbW1lbnRzMi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGNvbW1lbnRzMi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgd3JpdGluZyBjZWxsIGNvbW1lbnRzLgorICAgICMKKyAgICAjIEEgY2VsbCBjb21tZW50IGlzIGluZGljYXRlZCBpbiBFeGNlbCBieSBhIHNtYWxsIHJlZCB0cmlhbmdsZSBpbiB0aGUgdXBwZXIKKyAgICAjIHJpZ2h0LWhhbmQgY29ybmVyIG9mIHRoZSBjZWxsLgorICAgICMKKyAgICAjIEVhY2ggb2YgdGhlIHdvcmtzaGVldHMgZGVtb25zdHJhdGVzIGRpZmZlcmVudCBmZWF0dXJlcyBvZiBjZWxsIGNvbW1lbnRzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTm92ZW1iZXIgMjAwNSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiY29tbWVudHMyLnhscyIpOworICAgIG15ICR0ZXh0X3dyYXAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KHRleHRfd3JhcCA9PiAxLCB2YWxpZ24gPT4gJ3RvcCcpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDUgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ3ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDggPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIFZhcmlhYmxlcyB0aGF0IHdlIHdpbGwgdXNlIGluIGVhY2ggZXhhbXBsZS4KKyAgICBteSAkY2VsbF90ZXh0ID0gJyc7CisgICAgbXkgJGNvbW1lbnQgICA9ICcnOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDEuIERlbW9uc3RyYXRlcyBhIHNpbXBsZSBjZWxsIGNvbW1lbnQgd2l0aG91dCBmb3JtYXR0aW5nIGFuZCBVbmljb2RlCisgICAgIyAgICAgICAgICAgIGNvbW1lbnRzIGVuY29kZWQgYXMgVVRGLTE2IGFuZCBhcyBVVEYtOC4KKyAgICAjCisgICAgCisgICAgIyBTZXQgdXAgc29tZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQxLT5zZXRfY29sdW1uKCdDOkMnLCAyNSk7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMiwgNTApOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDUsIDUwKTsKKyAgICAKKyAgICAKKyAgICAjIFNpbXBsZSBhc2NpaSBzdHJpbmcuCisgICAgJGNlbGxfdGV4dCA9ICdIb2xkIHRoZSBtb3VzZSBvdmVyIHRoaXMgY2VsbCB0byBzZWUgdGhlIGNvbW1lbnQuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ1RoaXMgaXMgYSBjb21tZW50Lic7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlICAgICAgICAoJ0MzJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICMgVVRGLTE2IHN0cmluZy4KKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgaXMgYSBVVEYtMTYgY29tbWVudC4nOworICAgIAorICAgICRjb21tZW50ICAgPSBwYWNrICJuIiwgMHgyNjNhOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50LCBlbmNvZGluZyA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAjIFVURi04IHN0cmluZyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDEtPnNldF9yb3coOCwgNTApOworICAgICAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgaXMgYSBVVEYtOCBzdHJpbmcuJzsKKyAgICAgICAgJGNvbW1lbnQgICA9IGNociAweDI2M2E7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQxLT53cml0ZSAgICAgICAgKCdDOScsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGVfY29tbWVudCgnQzknLCAkY29tbWVudCk7CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIERlbW9uc3RyYXRlcyB2aXNpYmxlIGFuZCBoaWRkZW4gY29tbWVudHMuCisgICAgIworICAgIAorICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0Mi0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQyLT5zZXRfcm93KDIsIDUwKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg1LCA1MCk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBpcyB2aXNpYmxlLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50LCB2aXNpYmxlID0+IDEpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAiVGhpcyBjZWxsIGNvbW1lbnQgaXNuJ3QgdmlzaWJsZSAodGhlIGRlZmF1bHQpLiI7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBEZW1vbnN0cmF0ZXMgdmlzaWJsZSBhbmQgaGlkZGVuIGNvbW1lbnRzIHNldCBhdCB0aGUgd29ya3NoZWV0CisgICAgIyAgICAgICAgICAgIGxldmVsLgorICAgICMKKyAgICAKKyAgICAjIFNldCB1cCBzb21lIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldDMtPnNldF9jb2x1bW4oJ0M6QycsIDI1KTsKKyAgICAkd29ya3NoZWV0My0+c2V0X3JvdygyLCA1MCk7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coNSwgNTApOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDgsIDUwKTsKKyAgICAKKyAgICAjIE1ha2UgYWxsIGNvbW1lbnRzIG9uIHRoZSB3b3Jrc2hlZXQgdmlzaWJsZS4KKyAgICAkd29ya3NoZWV0My0+c2hvd19jb21tZW50cygpOworICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgdmlzaWJsZSwgZXhwbGljaXRseS4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0My0+d3JpdGUgICAgICAgICgnQzMnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0My0+d3JpdGVfY29tbWVudCgnQzMnLCAkY29tbWVudCwgdmlzaWJsZSA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIGFsc28gdmlzaWJsZSBiZWNhdXNlICcuCisgICAgICAgICAgICAgICAgICd3ZSB1c2VkIHNob3dfY29tbWVudHMoKS4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0My0+d3JpdGUgICAgICAgICgnQzYnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0My0+d3JpdGVfY29tbWVudCgnQzYnLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdIb3dldmVyLCB3ZSBjYW4gc3RpbGwgb3ZlcnJpZGUgaXQgbG9jYWxseS4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0My0+d3JpdGUgICAgICAgICgnQzknLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0My0+d3JpdGVfY29tbWVudCgnQzknLCAkY29tbWVudCwgdmlzaWJsZSA9PiAwKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBEZW1vbnN0cmF0ZXMgY2hhbmdlcyB0byB0aGUgY29tbWVudCBib3ggZGltZW5zaW9ucy4KKyAgICAjCisgICAgCisgICAgIyBTZXQgdXAgc29tZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQ0LT5zZXRfY29sdW1uKCdDOkMnLCAyNSk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMiwgIDUwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg1LCAgNTApOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDgsICA1MCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMTUsIDUwKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+c2hvd19jb21tZW50cygpOworICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgZGVmYXVsdCBzaXplLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50KTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIHR3aWNlIGFzIHdpZGUuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlICAgICAgICAoJ0M2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDQtPndyaXRlX2NvbW1lbnQoJ0M2JywgJGNvbW1lbnQsIHhfc2NhbGUgPT4gMik7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBpcyB0d2ljZSBhcyBoaWdoLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT53cml0ZSAgICAgICAgKCdDOScsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDOScsICRjb21tZW50LCB5X3NjYWxlID0+IDIpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgc2NhbGVkIGluIGJvdGggZGlyZWN0aW9ucy4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUgICAgICAgICgnQzE2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDQtPndyaXRlX2NvbW1lbnQoJ0MxNicsICRjb21tZW50LCB4X3NjYWxlID0+IDEuMiwgeV9zY2FsZSA9PiAwLjgpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIHdpZHRoIGFuZCBoZWlnaHQgc3BlY2lmaWVkIGluIHBpeGVscy4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUgICAgICAgICgnQzE5JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDQtPndyaXRlX2NvbW1lbnQoJ0MxOScsICRjb21tZW50LCB3aWR0aCA9PiAyMDAsIGhlaWdodCA9PiAyMCk7CisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gRGVtb25zdHJhdGVzIGNoYW5nZXMgdG8gdGhlIGNlbGwgY29tbWVudCBwb3NpdGlvbi4KKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0M6QycsIDI1KTsKKyAgICAkd29ya3NoZWV0NS0+c2V0X3JvdygyLCA1MCk7CisgICAgJHdvcmtzaGVldDUtPnNldF9yb3coNSwgNTApOworICAgICR3b3Jrc2hlZXQ1LT5zZXRfcm93KDgsIDUwKTsKKyAgICAkd29ya3NoZWV0NS0+c2V0X3JvdygxMSwgNTApOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT5zaG93X2NvbW1lbnRzKCk7CisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBpcyBpbiB0aGUgZGVmYXVsdCBwb3NpdGlvbi4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NS0+d3JpdGUgICAgICAgICgnQzMnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0NS0+d3JpdGVfY29tbWVudCgnQzMnLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBoYXMgYmVlbiBtb3ZlZCB0byBhbm90aGVyIGNlbGwuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDUtPndyaXRlICAgICAgICAoJ0M2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbW1lbnQoJ0M2JywgJGNvbW1lbnQsIHN0YXJ0X2NlbGwgPT4gJ0U0Jyk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBoYXMgYmVlbiBtb3ZlZCB0byBhbm90aGVyIGNlbGwuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDUtPndyaXRlICAgICAgICAoJ0M5JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbW1lbnQoJ0M5JywgJGNvbW1lbnQsIHN0YXJ0X3JvdyA9PiA4LCBzdGFydF9jb2wgPT4gNCk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBoYXMgYmVlbiBzaGlmdGVkIHdpdGhpbiBpdHMgZGVmYXVsdCBjZWxsLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT53cml0ZSAgICAgICAgKCdDMTInLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0NS0+d3JpdGVfY29tbWVudCgnQzEyJywgJGNvbW1lbnQsIHhfb2Zmc2V0ID0+IDMwLCB5X29mZnNldCA9PiAxMik7CisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNi4gRGVtb25zdHJhdGVzIGNoYW5nZXMgdG8gdGhlIGNvbW1lbnQgYmFja2dyb3VuZCBjb2xvdXIuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQ2LT5zZXRfY29sdW1uKCdDOkMnLCAyNSk7CisgICAgJHdvcmtzaGVldDYtPnNldF9yb3coMiwgNTApOworICAgICR3b3Jrc2hlZXQ2LT5zZXRfcm93KDUsIDUwKTsKKyAgICAkd29ya3NoZWV0Ni0+c2V0X3Jvdyg4LCA1MCk7CisgICAgCisgICAgJHdvcmtzaGVldDYtPnNob3dfY29tbWVudHMoKTsKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGhhcyBhIGRpZmZlcmVudCBjb2xvdXIuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDYtPndyaXRlICAgICAgICAoJ0MzJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDYtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIGNvbG9yID0+ICdncmVlbicpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIHRoZSBkZWZhdWx0IGNvbG91ci4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGUgICAgICAgICgnQzYnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGVfY29tbWVudCgnQzYnLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBoYXMgYSBkaWZmZXJlbnQgY29sb3VyLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ2LT53cml0ZSAgICAgICAgKCdDOScsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ2LT53cml0ZV9jb21tZW50KCdDOScsICRjb21tZW50LCBjb2xvciA9PiAweDM1KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA3LiBEZW1vbnN0cmF0ZXMgaG93IHRvIHNldCB0aGUgY2VsbCBjb21tZW50IGF1dGhvci4KKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDctPnNldF9jb2x1bW4oJ0M6QycsIDMwKTsKKyAgICAkd29ya3NoZWV0Ny0+c2V0X3JvdygyLCAgNTApOworICAgICR3b3Jrc2hlZXQ3LT5zZXRfcm93KDUsICA1MCk7CisgICAgJHdvcmtzaGVldDctPnNldF9yb3coOCwgIDUwKTsKKyAgICAkd29ya3NoZWV0Ny0+c2V0X3JvdygxMSwgNTApOworICAgIAorICAgIG15ICRhdXRob3IgPSAnJzsKKyAgICBteSAkY2VsbCAgID0gJ0MzJzsKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gIk1vdmUgdGhlIG1vdXNlIG92ZXIgdGhpcyBjZWxsIGFuZCB5b3Ugd2lsbCBzZWUgJ0NlbGwgY29tbWVudGVkICIuCisgICAgICAgICAgICAgICAgICJieSAkYXV0aG9yJyAoYmxhbmspIGluIHRoZSBzdGF0dXMgYmFyIGF0IHRoZSBib3R0b20iOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Ny0+d3JpdGUgICAgICAgICgkY2VsbCwgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDctPndyaXRlX2NvbW1lbnQoJGNlbGwsICRjb21tZW50KTsKKyAgICAKKyAgICAKKyAgICAkYXV0aG9yICAgID0gJ1BlcmwnOworICAgICRjZWxsICAgICAgPSAnQzYnOworICAgICRjZWxsX3RleHQgPSAiTW92ZSB0aGUgbW91c2Ugb3ZlciB0aGlzIGNlbGwgYW5kIHlvdSB3aWxsIHNlZSAnQ2VsbCBjb21tZW50ZWQgIi4KKyAgICAgICAgICAgICAgICAgImJ5ICRhdXRob3InIGluIHRoZSBzdGF0dXMgYmFyIGF0IHRoZSBib3R0b20iOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Ny0+d3JpdGUgICAgICAgICgkY2VsbCwgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDctPndyaXRlX2NvbW1lbnQoJGNlbGwsICRjb21tZW50LCBhdXRob3IgPT4gJGF1dGhvcik7CisgICAgCisgICAgCisgICAgJGF1dGhvciAgICA9IHBhY2sgIm4iLCAweDIwQUM7ICMgVVRGLTE2IEV1cm8KKyAgICAkY2VsbCAgICAgID0gJ0M5JzsKKyAgICAkY2VsbF90ZXh0ID0gIk1vdmUgdGhlIG1vdXNlIG92ZXIgdGhpcyBjZWxsIGFuZCB5b3Ugd2lsbCBzZWUgJ0NlbGwgY29tbWVudGVkICIuCisgICAgICAgICAgICAgICAgICJieSBFdXJvJyBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIjsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDctPndyaXRlICAgICAgICAoJGNlbGwsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ3LT53cml0ZV9jb21tZW50KCRjZWxsLCAkY29tbWVudCwgYXV0aG9yICAgICAgICAgID0+ICRhdXRob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JfZW5jb2RpbmcgPT4gMSAgICAgICk7CisgICAgCisgICAgIyBVVEYtOCBzdHJpbmcgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgICRhdXRob3IgICAgPSBjaHIgMHgyMEFDOworICAgICAgICAkY2VsbCAgICAgID0gJ0MxMic7CisgICAgICAgICRjZWxsX3RleHQgPSAiTW92ZSB0aGUgbW91c2Ugb3ZlciB0aGlzIGNlbGwgYW5kIHlvdSB3aWxsIHNlZSAnQ2VsbCBjb21tZW50ZWQgIi4KKyAgICAgICAgICAgICAgICAgICAgICJieSAkYXV0aG9yJyBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIjsKKyAgICAgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICAgICAkd29ya3NoZWV0Ny0+d3JpdGUgICAgICAgICgkY2VsbCwgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgICAgICR3b3Jrc2hlZXQ3LT53cml0ZV9jb21tZW50KCRjZWxsLCAkY29tbWVudCwgYXV0aG9yID0+ICRhdXRob3IpOworICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA4LiBEZW1vbnN0cmF0ZXMgdGhlIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgdGhlIHJvdyBoZWlnaHQuCisgICAgIworICAgIAorICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0OC0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQ4LT5zZXRfcm93KDIsIDgwKTsKKyAgICAKKyAgICAkd29ya3NoZWV0OC0+c2hvd19jb21tZW50cygpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhlIGhlaWdodCBvZiB0aGlzIHJvdyBoYXMgYmVlbiBhZGp1c3RlZCBleHBsaWNpdGx5IHVzaW5nICcgLgorICAgICAgICAgICAgICAgICAnc2V0X3JvdygpLiBUaGUgc2l6ZSBvZiB0aGUgY29tbWVudCBib3ggaXMgYWRqdXN0ZWQgJyAgICAgICAgIC4KKyAgICAgICAgICAgICAgICAgJ2FjY29yZGluZ2x5IGJ5IFdyaXRlRXhjZWwuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDgtPndyaXRlICAgICAgICAoJ0MzJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDgtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhlIGhlaWdodCBvZiB0aGlzIHJvdyBoYXMgYmVlbiBhZGp1c3RlZCBieSBFeGNlbCBkdWUgdG8gdGhlICcgIC4KKyAgICAgICAgICAgICAgICAgJ3RleHQgd3JhcCBwcm9wZXJ0eSBiZWluZyBzZXQuIFVuZm9ydHVuYXRlbHkgdGhpcyBtZWFucyB0aGF0ICcgICAuCisgICAgICAgICAgICAgICAgICd0aGUgaGVpZ2h0IG9mIHRoZSByb3cgaXMgdW5rbm93biB0byBXcml0ZUV4Y2VsIGF0IHJ1biB0aW1lICcgICAgLgorICAgICAgICAgICAgICAgICAiYW5kIHRodXMgdGhlIGNvbW1lbnQgYm94IGlzIHN0cmV0Y2hlZCBhcyB3ZWxsLlxuXG4iICAgICAgICAgICAgIC4KKyAgICAgICAgICAgICAgICAgJ1VzZSBzZXRfcm93KCkgdG8gc3BlY2lmeSB0aGUgcm93IGhlaWdodCBleHBsaWNpdGx5IHRvIGF2b2lkICcgICAuCisgICAgICAgICAgICAgICAgICd0aGlzIHByb2JsZW0uJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDgtPndyaXRlICAgICAgICAoJ0M2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDgtPndyaXRlX2NvbW1lbnQoJ0M2JywgJGNvbW1lbnQpOworICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY29tbWVudHMyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY29weWZvcm1hdC5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBmb3JtYXQgY29weWluZyBtZXRob2Qgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworVGhpcyBmZWF0dXJlIGlzbid0IHJlcXVpcmVkIHZlcnkgb2Z0ZW4uCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NvcHlmb3JtYXQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjb3B5Zm9ybWF0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBmb3JtYXQgY29weWluZyBtZXRob2Qgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBUaGlzIGZlYXR1cmUgaXNuJ3QgcmVxdWlyZWQgdmVyeSBvZnRlbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSB3b3JrYm9vazEKKyAgICBteSAkd29ya2Jvb2sxICAgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid29ya2Jvb2sxLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQxICAgICAgPSAkd29ya2Jvb2sxLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGZvcm1hdDFhICAgICAgICA9ICR3b3JrYm9vazEtPmFkZF9mb3JtYXQoKTsKKyAgICBteSAkZm9ybWF0MWIgICAgICAgID0gJHdvcmtib29rMS0+YWRkX2Zvcm1hdCgpOworICAgIAorICAgICMgQ3JlYXRlIHdvcmtib29rMgorICAgIG15ICR3b3JrYm9vazIgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ3b3JrYm9vazIueGxzIik7CisgICAgbXkgJHdvcmtzaGVldDIgICAgICA9ICR3b3JrYm9vazItPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkZm9ybWF0MmEgICAgICAgID0gJHdvcmtib29rMi0+YWRkX2Zvcm1hdCgpOworICAgIG15ICRmb3JtYXQyYiAgICAgICAgPSAkd29ya2Jvb2syLT5hZGRfZm9ybWF0KCk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBnbG9iYWwgZm9ybWF0IG9iamVjdCB0aGF0IGlzbid0IHRpZWQgdG8gYSB3b3JrYm9vaworICAgIG15ICRnbG9iYWxfZm9ybWF0ICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoKTsKKyAgICAKKyAgICAjIFNldCB0aGUgZm9ybWF0dGluZworICAgICRnbG9iYWxfZm9ybWF0LT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAkZ2xvYmFsX2Zvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAkZ2xvYmFsX2Zvcm1hdC0+c2V0X2l0YWxpYygpOworICAgIAorICAgICMgQ3JlYXRlIGFub3RoZXIgZXhhbXBsZSBmb3JtYXQKKyAgICAkZm9ybWF0MWItPnNldF9jb2xvcigncmVkJyk7CisgICAgCisgICAgIyBDb3B5IHRoZSBnbG9iYWwgZm9ybWF0IHByb3BlcnRpZXMgdG8gdGhlIHdvcmtzaGVldCBmb3JtYXRzCisgICAgJGZvcm1hdDFhLT5jb3B5KCRnbG9iYWxfZm9ybWF0KTsKKyAgICAkZm9ybWF0MmEtPmNvcHkoJGdsb2JhbF9mb3JtYXQpOworICAgIAorICAgICMgQ29weSBhIGZvcm1hdCBmcm9tIHdvcmtzaGVldDEgdG8gd29ya3NoZWV0MgorICAgICRmb3JtYXQyYi0+Y29weSgkZm9ybWF0MWIpOworICAgIAorICAgICMgV3JpdGUgc29tZSBvdXRwdXQKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMCwgIkNpYW8iLCAkZm9ybWF0MWEpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgxLCAwLCAiQ2lhbyIsICRmb3JtYXQxYik7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDAsICJIZWxsbyIsICRmb3JtYXQyYSk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKDEsIDAsICJIZWxsbyIsICRmb3JtYXQyYik7CisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NvcHlmb3JtYXQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBkYXRhX3ZhbGlkYXRlLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBhZGQgZGF0YSB2YWxpZGF0aW9uIGFuZCBkcm9wZG93biBsaXN0cyB0byBhCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBmaWxlLgorCitEYXRhIHZhbGlkYXRpb24gaXMgYSBmZWF0dXJlIG9mIEV4Y2VsIHdoaWNoIGFsbG93cyB5b3UgdG8gcmVzdHJpY3QgdGhlIGRhdGEKK3RoYXQgYSB1c2VycyBlbnRlcnMgaW4gYSBjZWxsIGFuZCB0byBkaXNwbGF5IGhlbHAgYW5kIHdhcm5pbmcgbWVzc2FnZXMuIEl0CithbHNvIGFsbG93cyB5b3UgdG8gcmVzdHJpY3QgaW5wdXQgdG8gdmFsdWVzIGluIGEgZHJvcCBkb3duIGxpc3QuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2RhdGFfdmFsaWRhdGUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkYXRhX3ZhbGlkYXRlLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gYWRkIGRhdGEgdmFsaWRhdGlvbiBhbmQgZHJvcGRvd24gbGlzdHMgdG8gYQorICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZS4KKyAgICAjCisgICAgIyBEYXRhIHZhbGlkYXRpb24gaXMgYSBmZWF0dXJlIG9mIEV4Y2VsIHdoaWNoIGFsbG93cyB5b3UgdG8gcmVzdHJpY3QgdGhlIGRhdGEKKyAgICAjIHRoYXQgYSB1c2VycyBlbnRlcnMgaW4gYSBjZWxsIGFuZCB0byBkaXNwbGF5IGhlbHAgYW5kIHdhcm5pbmcgbWVzc2FnZXMuIEl0CisgICAgIyBhbHNvIGFsbG93cyB5b3UgdG8gcmVzdHJpY3QgaW5wdXQgdG8gdmFsdWVzIGluIGEgZHJvcCBkb3duIGxpc3QuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwOCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdkYXRhX3ZhbGlkYXRlLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIEFkZCBhIGZvcm1hdCBmb3IgdGhlIGhlYWRlciBjZWxscy4KKyAgICBteSAkaGVhZGVyX2Zvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ19jb2xvciAgICA9PiA0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3dyYXAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICAgICAgPT4gJ3ZjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgIyBTZXQgdXAgbGF5b3V0IG9mIHRoZSB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNjQpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6QicsIDE1KTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdEOkQnLCAxNSk7CisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCAzNik7CisgICAgJHdvcmtzaGVldC0+c2V0X3NlbGVjdGlvbignQjMnKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBoZWFkZXIgY2VsbHMgYW5kIHNvbWUgZGF0YSB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgZXhhbXBsZXMuCisgICAgbXkgJHJvdyA9IDA7CisgICAgbXkgJHR4dDsKKyAgICBteSAkaGVhZGluZzEgPSAnU29tZSBleGFtcGxlcyBvZiBkYXRhIHZhbGlkYXRpb24gaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwnOworICAgIG15ICRoZWFkaW5nMiA9ICdFbnRlciB2YWx1ZXMgaW4gdGhpcyBjb2x1bW4nOworICAgIG15ICRoZWFkaW5nMyA9ICdTYW1wbGUgRGF0YSc7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJGhlYWRpbmcxLCAkaGVhZGVyX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJGhlYWRpbmcyLCAkaGVhZGVyX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0QxJywgJGhlYWRpbmczLCAkaGVhZGVyX2Zvcm1hdCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0QzJywgWydJbnRlZ2VycycsICAgMSwgMTBdKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDQnLCBbJ0xpc3QgZGF0YScsICdvcGVuJywgJ2hpZ2gnLCAnY2xvc2UnXSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0Q1JywgWydGb3JtdWxhJywgICAnPUFORChGNT01MCxHNT02MCknLCA1MCwgNjBdKTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDEuIExpbWl0aW5nIGlucHV0IHRvIGFuIGludGVnZXIgaW4gYSBmaXhlZCByYW5nZS4KKyAgICAjCisgICAgJHR4dCA9ICdFbnRlciBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdpbnRlZ2VyJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAxMCwKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSAyLiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIG91dHNpZGUgYSBmaXhlZCByYW5nZS4KKyAgICAjCisgICAgJHR4dCA9ICdFbnRlciBhbiBpbnRlZ2VyIHRoYXQgaXMgbm90IGJldHdlZW4gMSBhbmQgMTAgKHVzaW5nIGNlbGwgcmVmZXJlbmNlcyknOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdpbnRlZ2VyJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnbm90IGJldHdlZW4nLAorICAgICAgICAgICAgbWluaW11bSAgICAgICAgID0+ICc9RTMnLAorICAgICAgICAgICAgbWF4aW11bSAgICAgICAgID0+ICc9RjMnLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIExpbWl0aW5nIGlucHV0IHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGEgZml4ZWQgdmFsdWUuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMCc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICc+JywKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICA9PiAwLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIExpbWl0aW5nIGlucHV0IHRvIGFuIGludGVnZXIgbGVzcyB0aGFuIGEgZml4ZWQgdmFsdWUuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYW4gaW50ZWdlciBsZXNzIHRoYW4gMTAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdpbnRlZ2VyJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnPCcsCisgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgPT4gMTAsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgNS4gTGltaXRpbmcgaW5wdXQgdG8gYSBkZWNpbWFsIGluIGEgZml4ZWQgcmFuZ2UuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYSBkZWNpbWFsIGJldHdlZW4gMC4xIGFuZCAwLjUnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdkZWNpbWFsJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgPT4gMC4xLAorICAgICAgICAgICAgbWF4aW11bSAgICAgICAgID0+IDAuNSwKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA2LiBMaW1pdGluZyBpbnB1dCB0byBhIHZhbHVlIGluIGEgZHJvcGRvd24gbGlzdC4KKyAgICAjCisgICAgJHR4dCA9ICdTZWxlY3QgYSB2YWx1ZSBmcm9tIGEgZHJvcCBkb3duIGxpc3QnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdsaXN0JywKKyAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICA9PiBbJ29wZW4nLCAnaGlnaCcsICdjbG9zZSddLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDYuIExpbWl0aW5nIGlucHV0IHRvIGEgdmFsdWUgaW4gYSBkcm9wZG93biBsaXN0LgorICAgICMKKyAgICAkdHh0ID0gJ1NlbGVjdCBhIHZhbHVlIGZyb20gYSBkcm9wIGRvd24gbGlzdCAodXNpbmcgYSBjZWxsIHJhbmdlKSc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2xpc3QnLAorICAgICAgICAgICAgc291cmNlICAgICAgICAgID0+ICc9RTQ6RzQnLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDcuIExpbWl0aW5nIGlucHV0IHRvIGEgZGF0ZSBpbiBhIGZpeGVkIHJhbmdlLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGEgZGF0ZSBiZXR3ZWVuIDEvMS8yMDA4IGFuZCAxMi8xMi8yMDA4JzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnZGF0ZScsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJ2JldHdlZW4nLAorICAgICAgICAgICAgbWluaW11bSAgICAgICAgID0+ICcyMDA4LTAxLTAxVCcsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgPT4gJzIwMDgtMTItMTJUJywKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA4LiBMaW1pdGluZyBpbnB1dCB0byBhIHRpbWUgaW4gYSBmaXhlZCByYW5nZS4KKyAgICAjCisgICAgJHR4dCA9ICdFbnRlciBhIHRpbWUgYmV0d2VlbiA2OjAwIGFuZCAxMjowMCc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ3RpbWUnLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAnVDA2OjAwJywKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAnVDEyOjAwJywKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA5LiBMaW1pdGluZyBpbnB1dCB0byBhIHN0cmluZyBncmVhdGVyIHRoYW4gYSBmaXhlZCBsZW5ndGguCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYSBzdHJpbmcgbG9uZ2VyIHRoYW4gMyBjaGFyYWN0ZXJzJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnbGVuZ3RoJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnPicsCisgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgPT4gMywKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSAxMC4gTGltaXRpbmcgaW5wdXQgYmFzZWQgb24gYSBmb3JtdWxhLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGEgdmFsdWUgaWYgdGhlIGZvbGxvd2luZyBpcyB0cnVlICI9QU5EKEY1PTUwLEc1PTYwKSInOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdjdXN0b20nLAorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgID0+ICc9QU5EKEY1PTUwLEc1PTYwKScsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgMTEuIERpc3BsYXlpbmcgYW5kIG1vZGlmeSBkYXRhIHZhbGlkYXRpb24gbWVzc2FnZXMuCisgICAgIworICAgICR0eHQgPSAnRGlzcGxheXMgYSBtZXNzYWdlIHdoZW4geW91IHNlbGVjdCB0aGUgY2VsbCc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgID0+ICdpbnRlZ2VyJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgPT4gJ2JldHdlZW4nLAorICAgICAgICAgICAgbWluaW11bSAgICAgICA9PiAxLAorICAgICAgICAgICAgbWF4aW11bSAgICAgICA9PiAxMDAsCisgICAgICAgICAgICBpbnB1dF90aXRsZSAgID0+ICdFbnRlciBhbiBpbnRlZ2VyOicsCisgICAgICAgICAgICBpbnB1dF9tZXNzYWdlID0+ICdiZXR3ZWVuIDEgYW5kIDEwMCcsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgMTIuIERpc3BsYXlpbmcgYW5kIG1vZGlmeSBkYXRhIHZhbGlkYXRpb24gbWVzc2FnZXMuCisgICAgIworICAgICR0eHQgPSAnRGlzcGxheSBhIGN1c3RvbSBlcnJvciBtZXNzYWdlIHdoZW4gaW50ZWdlciBpc25cJ3QgYmV0d2VlbiAxIGFuZCAxMDAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgPT4gMSwKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgPT4gMTAwLAorICAgICAgICAgICAgaW5wdXRfdGl0bGUgICA9PiAnRW50ZXIgYW4gaW50ZWdlcjonLAorICAgICAgICAgICAgaW5wdXRfbWVzc2FnZSA9PiAnYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICAgICAgZXJyb3JfdGl0bGUgICA9PiAnSW5wdXQgdmFsdWUgaXMgbm90IHZhbGlkIScsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0+ICdJdCBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgMTMuIERpc3BsYXlpbmcgYW5kIG1vZGlmeSBkYXRhIHZhbGlkYXRpb24gbWVzc2FnZXMuCisgICAgIworICAgICR0eHQgPSAnRGlzcGxheSBhIGN1c3RvbSBpbmZvcm1hdGlvbiBtZXNzYWdlIHdoZW4gaW50ZWdlciBpc25cJ3QgYmV0d2VlbiAxIGFuZCAxMDAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgPT4gMSwKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgPT4gMTAwLAorICAgICAgICAgICAgaW5wdXRfdGl0bGUgICA9PiAnRW50ZXIgYW4gaW50ZWdlcjonLAorICAgICAgICAgICAgaW5wdXRfbWVzc2FnZSA9PiAnYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICAgICAgZXJyb3JfdGl0bGUgICA9PiAnSW5wdXQgdmFsdWUgaXMgbm90IHZhbGlkIScsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0+ICdJdCBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsCisgICAgICAgICAgICBlcnJvcl90eXBlICAgID0+ICdpbmZvcm1hdGlvbicsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZGF0YV92YWxpZGF0ZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGRhdGVfdGltZS5wbAorCisKKworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZXhhbXBsZSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyB1c2luZyB0aGUKK3dyaXRlX2RhdGVfdGltZSgpIFdvcmtzaGVldCBtZXRob2QuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2RhdGVfdGltZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGRhdGVfdGltZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGV4YW1wbGUgb2Ygd3JpdGluZyBkYXRlcyBhbmQgdGltZXMgdXNpbmcgdGhlCisgICAgIyB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImRhdGVfdGltZS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChib2xkID0+IDEpOworICAgIG15ICRyb3cgICAgICAgPSAwOworICAgIAorICAgIAorICAgICMgRXhwYW5kIHRoZSBmaXJzdCBjb2x1bW4gc28gdGhhdCB0aGUgZGF0ZSBpcyB2aXNpYmxlLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oIkE6QiIsIDMwKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBjb2x1bW4gaGVhZGVycworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICdGb3JtYXR0ZWQgZGF0ZScsICRib2xkKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjEnLCAnRm9ybWF0JywgICAgICAgICAkYm9sZCk7CisgICAgCisgICAgCisgICAgIyBFeGFtcGxlcyBkYXRlIGFuZCB0aW1lIGZvcm1hdHMuIEluIHRoZSBvdXRwdXQgZmlsZSBjb21wYXJlIGhvdyBjaGFuZ2luZworICAgICMgdGhlIGZvcm1hdCBjb2RlcyBjaGFuZ2UgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGRhdGUuCisgICAgIworICAgIG15IEBkYXRlX2Zvcm1hdHMgPSAoCisgICAgICAgICdkZC9tbS95eScsCisgICAgICAgICdtbS9kZC95eScsCisgICAgICAgICcnLAorICAgICAgICAnZCBtbSB5eScsCisgICAgICAgICdkZCBtbSB5eScsCisgICAgICAgICcnLAorICAgICAgICAnZGQgbSB5eScsCisgICAgICAgICdkZCBtbSB5eScsCisgICAgICAgICdkZCBtbW0geXknLAorICAgICAgICAnZGQgbW1tbSB5eScsCisgICAgICAgICcnLAorICAgICAgICAnZGQgbW0geScsCisgICAgICAgICdkZCBtbSB5eXknLAorICAgICAgICAnZGQgbW0geXl5eScsCisgICAgICAgICcnLAorICAgICAgICAnZCBtbW1tIHl5eXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2RkL21tL3l5JywKKyAgICAgICAgJ2RkL21tL3l5IGhoOm1tJywKKyAgICAgICAgJ2RkL21tL3l5IGhoOm1tOnNzJywKKyAgICAgICAgJ2RkL21tL3l5IGhoOm1tOnNzLjAwMCcsCisgICAgICAgICcnLAorICAgICAgICAnaGg6bW0nLAorICAgICAgICAnaGg6bW06c3MnLAorICAgICAgICAnaGg6bW06c3MuMDAwJywKKyAgICApOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIHNhbWUgZGF0ZSBhbmQgdGltZSB1c2luZyBlYWNoIG9mIHRoZSBhYm92ZSBmb3JtYXRzLiBUaGUgZW1wdHkKKyAgICAjIHN0cmluZyBmb3JtYXRzIGNyZWF0ZSBhIGJsYW5rIGxpbmUgdG8gbWFrZSB0aGUgZXhhbXBsZSBjbGVhcmVyLgorICAgICMKKyAgICBmb3IgbXkgJGRhdGVfZm9ybWF0IChAZGF0ZV9mb3JtYXRzKSB7CisgICAgICAgICRyb3crKzsKKyAgICAgICAgbmV4dCBpZiAkZGF0ZV9mb3JtYXQgZXEgJyc7CisgICAgCisgICAgICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgZGF0ZSBvciB0aW1lLgorICAgICAgICBteSAkZm9ybWF0ID0gICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Zvcm1hdCA9PiAkZGF0ZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgPT4gJ2xlZnQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgIyBXcml0ZSB0aGUgc2FtZSBkYXRlIHVzaW5nIGRpZmZlcmVudCBmb3JtYXRzLgorICAgICAgICAkd29ya3NoZWV0LT53cml0ZV9kYXRlX3RpbWUoJHJvdywgMCwgJzIwMDQtMDgtMDFUMTI6MzA6NDUuMTIzJywgJGZvcm1hdCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlICAgICAgICAgICgkcm93LCAxLCAkZGF0ZV9mb3JtYXQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbnZhbGlkIGRhdGUuIEl0IGlzIHdyaXR0ZW4gYXMgYSBzdHJpbmcKKyAgICAjIGluc3RlYWQgb2YgYSBudW1iZXIuIFRoaXMgaXMgYWxzbyBFeGNlbCdzIGRlZmF1bHQgYmVoYXZpb3VyLgorICAgICMKKyAgICAkcm93ICs9IDI7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCRyb3csIDAsICcyMDA0LTEzLTAxVDEyOjMwOjQ1LjEyMycpOworICAgICR3b3Jrc2hlZXQtPndyaXRlICAgICAgICAgICgkcm93LCAxLCAnSW52YWxpZCBkYXRlLiBXcml0dGVuIGFzIHN0cmluZy4nLCAkYm9sZCk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kYXRlX3RpbWUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBkZWZpbmVkX25hbWUucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBkZWZpbmVkIG5hbWVzIGluIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZS4KKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZWZpbmVkIGEgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHZhbHVlLAorYSBzaW5nbGUgY2VsbCBvciBhIHJhbmdlIG9mIGNlbGxzIGluIGEgd29ya2Jvb2suCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2RlZmluZWRfbmFtZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGRlZmluZWRfbmFtZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBkZWZpbmVkIG5hbWVzIGluIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZS4KKyAgICAjCisgICAgIyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRlZmluZWQgYSBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdmFsdWUsCisgICAgIyBhIHNpbmdsZSBjZWxsIG9yIGEgcmFuZ2Ugb2YgY2VsbHMgaW4gYSB3b3JrYm9vay4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA4LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdkZWZpbmVkX25hbWUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICR3b3JrYm9vay0+ZGVmaW5lX25hbWUoJ0V4Y2hhbmdlX3JhdGUnLCAnPTAuOTYnKTsKKyAgICAkd29ya2Jvb2stPmRlZmluZV9uYW1lKCdTYWxlcycsICAgICAgICAgJz1TaGVldDEhJEckMTokSCQxMCcpOworICAgICR3b3JrYm9vay0+ZGVmaW5lX25hbWUoJ1NoZWV0MiFTYWxlcycsICAnPVNoZWV0MiEkRyQxOiRHJDEwJyk7CisgICAgCisgICAgCisgICAgZm9yIG15ICR3b3Jrc2hlZXQgKCR3b3JrYm9vay0+c2hlZXRzKCkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNDUpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAnVGhpcyB3b3Jrc2hlZXQgY29udGFpbnMgc29tZSBkZWZpbmVkIG5hbWVzLCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAnU2VlIHRoZSBJbnNlcnQgLT4gTmFtZSAtPiBEZWZpbmUgZGlhbG9nLicpOworICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E0JywgJz1FeGNoYW5nZV9yYXRlJyk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kZWZpbmVkX25hbWUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBkaWFnX2JvcmRlci5wbAorCisKKworQSBzaW1wbGUgZm9ybWF0dGluZyBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBhZGQgYSBkaWFnb25hbCBjZWxsCitib3JkZXIgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kaWFnX2JvcmRlci5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGRpYWdfYm9yZGVyLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBmb3JtYXR0aW5nIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGFkZCBhIGRpYWdvbmFsIGNlbGwKKyAgICAjIGJvcmRlciB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdkaWFnX2JvcmRlci54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgbXkgJGZvcm1hdDEgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChkaWFnX3R5cGUgICAgICAgPT4gJzEnKTsKKyAgICAKKyAgICBteSAkZm9ybWF0MiAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGRpYWdfdHlwZSAgICAgICA9PiAnMicpOworICAgIAorICAgIG15ICRmb3JtYXQzICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoZGlhZ190eXBlICAgICAgID0+ICczJyk7CisgICAgCisgICAgbXkgJGZvcm1hdDQgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdfdHlwZSAgICAgICA9PiAnMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnX2JvcmRlciAgICAgPT4gJzcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ19jb2xvciAgICAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMycsICAnVGV4dCcsICRmb3JtYXQxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjYnLCAgJ1RleHQnLCAkZm9ybWF0Mik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I5JywgICdUZXh0JywgJGZvcm1hdDMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMTInLCAnVGV4dCcsICRmb3JtYXQ0KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2RpYWdfYm9yZGVyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZWFzdGVyX2VnZy5wbAorCisKKworVGhpcyB1c2VzIHRoZSBXaW4zMjo6T0xFIG1vZHVsZSB0byBleHBvc2UgdGhlIEZsaWdodCBTaW11bGF0b3IgZWFzdGVyIGVnZworaW4gRXhjZWwgOTcgU1IyLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIHVzZXMgdGhlIFdpbjMyOjpPTEUgbW9kdWxlIHRvIGV4cG9zZSB0aGUgRmxpZ2h0IFNpbXVsYXRvciBlYXN0ZXIgZWdnCisgICAgIyBpbiBFeGNlbCA5NyBTUjIuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgV2luMzI6Ok9MRTsKKyAgICAKKyAgICBteSAkYXBwbGljYXRpb24gPSBXaW4zMjo6T0xFLT5uZXcoIkV4Y2VsLkFwcGxpY2F0aW9uIik7CisgICAgbXkgJHdvcmtib29rICAgID0gJGFwcGxpY2F0aW9uLT5Xb3JrYm9va3MtPkFkZDsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPldvcmtzaGVldHMoMSk7CisgICAgCisgICAgJGFwcGxpY2F0aW9uLT57VmlzaWJsZX0gPSAxOworICAgIAorICAgICR3b3Jrc2hlZXQtPlJhbmdlKCJMOTc6WDk3IiktPlNlbGVjdDsKKyAgICAkd29ya3NoZWV0LT5SYW5nZSgiTTk3IiktPkFjdGl2YXRlOworICAgIAorICAgIG15ICRtZXNzYWdlID0gICJIb2xkIGRvd24gU2hpZnQgYW5kIEN0cmwgYW5kIGNsaWNrIHRoZSAiLgorICAgICAgICAgICAgICAgICAgICJDaGFydCBXaXphcmQgaWNvbiBvbiB0aGUgdG9vbGJhci5cblxuIi4KKyAgICAgICAgICAgICAgICAgICAiVXNlIHRoZSBtb3VzZSBtb3Rpb24gYW5kIGJ1dHRvbnMgdG8gY29udHJvbCAiLgorICAgICAgICAgICAgICAgICAgICJtb3ZlbWVudC4gVHJ5IHRvIGZpbmQgdGhlIG1vbm9saXRoLiAiLgorICAgICAgICAgICAgICAgICAgICJDbG9zZSB0aGlzIGRpYWxvZyBmaXJzdC4iOworICAgIAorICAgICRhcHBsaWNhdGlvbi0+SW5wdXRCb3goJG1lc3NhZ2UpOworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9lYXN0ZXJfZWdnLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZmlsZWhhbmRsZS5wbAorCisKKworRXhhbXBsZSBvZiB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byB3cml0ZSBFeGNlbCBmaWxlcyB0bworZGlmZmVyZW50IGZpbGVoYW5kbGVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9maWxlaGFuZGxlLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZmlsZWhhbmRsZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gd3JpdGUgRXhjZWwgZmlsZXMgdG8KKyAgICAjIGRpZmZlcmVudCBmaWxlaGFuZGxlcy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEFwcmlsIDIwMDMsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICB1c2UgSU86OlNjYWxhcjsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgc3RhbmRhcmQgd2F5IG9mIGNyZWF0aW5nIGFuIEV4Y2VsIGZpbGUgYnkKKyAgICAjIHNwZWNpZnlpbmcgYSBmaWxlIG5hbWUuCisgICAgIworICAgIAorICAgIG15ICR3b3JrYm9vazEgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZmhfMDEueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2sxLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDAsICAiSGkgRXhjZWwhIik7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMi4gV3JpdGUgYW4gRXhjZWwgZmlsZSB0byBhbiBleGlzdGluZyBmaWxlaGFuZGxlLgorICAgICMKKyAgICAKKyAgICBvcGVuICAgIFRFU1QsICI+IGZoXzAyLnhscyIgb3IgZGllICJDb3VsZG4ndCBvcGVuIGZpbGU6ICQhIjsKKyAgICBiaW5tb2RlIFRFU1Q7ICMgQWx3YXlzIGRvIHRoaXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwbGF0Zm9ybSByZXF1aXJlcyBpdC4KKyAgICAKKyAgICBteSAkd29ya2Jvb2syICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoXCpURVNUKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vazItPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMCwgICJIaSBFeGNlbCEiKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBXcml0ZSBhbiBFeGNlbCBmaWxlIHRvIGFuIGV4aXN0aW5nIE9PIHN0eWxlIGZpbGVoYW5kbGUuCisgICAgIworICAgIAorICAgIG15ICRmaCA9IEZpbGVIYW5kbGUtPm5ldygiPiBmaF8wMy54bHMiKQorICAgICAgICAgICAgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiBmaWxlOiAkISI7CisgICAgCisgICAgYmlubW9kZSgkZmgpOworICAgIAorICAgIG15ICR3b3JrYm9vazMgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkZmgpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rMy0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQzLT53cml0ZSgwLCAwLCAgIkhpIEV4Y2VsISIpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIFdyaXRlIGFuIEV4Y2VsIGZpbGUgdG8gYSBzdHJpbmcgdmlhIElPOjpTY2FsYXIuIFBsZWFzZSByZWZlciB0bworICAgICMgdGhlIElPOjpTY2FsYXIgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgICMKKyAgICAKKyAgICBteSAkeGxzX3N0cjsKKyAgICAKKyAgICB0aWUgKlhMUywgJ0lPOjpTY2FsYXInLCBcJHhsc19zdHI7CisgICAgCisgICAgbXkgJHdvcmtib29rNCAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KFwqWExTKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vazQtPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUoMCwgMCwgIkhpIEV4Y2VsIDQiKTsKKyAgICAkd29ya2Jvb2s0LT5jbG9zZSgpOyAjIFRoaXMgaXMgcmVxdWlyZWQgYmVmb3JlIHdlIHVzZSB0aGUgc2NhbGFyCisgICAgCisgICAgCisgICAgIyBUaGUgRXhjZWwgZmlsZSBpcyBub3cgaW4gJHhsc19zdHIuIEFzIGEgZGVtb25zdHJhdGlvbiwgcHJpbnQgaXQgdG8gYSBmaWxlLgorICAgIG9wZW4gICAgVE1QLCAiPiBmaF8wNC54bHMiIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiBmaWxlOiAkISI7CisgICAgYmlubW9kZSBUTVA7CisgICAgcHJpbnQgICBUTVAgICR4bHNfc3RyOworICAgIGNsb3NlICAgVE1QOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIFdyaXRlIGFuIEV4Y2VsIGZpbGUgdG8gYSBzdHJpbmcgdmlhIElPOjpTY2FsYXIncyBuZXdlciBpbnRlcmZhY2UuCisgICAgIyBQbGVhc2UgcmVmZXIgdG8gdGhlIElPOjpTY2FsYXIgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgICMKKyAgICBteSAkeGxzX3N0cjI7CisgICAgCisgICAgbXkgJGZoNSA9IElPOjpTY2FsYXItPm5ldyhcJHhsc19zdHIyKTsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2s1ICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJGZoNSk7CisgICAgbXkgJHdvcmtzaGVldDUgPSAkd29ya2Jvb2s1LT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDUtPndyaXRlKDAsIDAsICJIaSBFeGNlbCA1Iik7CisgICAgJHdvcmtib29rNS0+Y2xvc2UoKTsgIyBUaGlzIGlzIHJlcXVpcmVkIGJlZm9yZSB3ZSB1c2UgdGhlIHNjYWxhcgorICAgIAorICAgICMgVGhlIEV4Y2VsIGZpbGUgaXMgbm93IGluICR4bHNfc3RyLiBBcyBhIGRlbW9uc3RyYXRpb24sIHByaW50IGl0IHRvIGEgZmlsZS4KKyAgICBvcGVuICAgIFRNUCwgIj4gZmhfMDUueGxzIiBvciBkaWUgIkNvdWxkbid0IG9wZW4gZmlsZTogJCEiOworICAgIGJpbm1vZGUgVE1QOworICAgIHByaW50ICAgVE1QICAkeGxzX3N0cjI7CisgICAgY2xvc2UgICBUTVA7CisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2ZpbGVoYW5kbGUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBmb3JtdWxhX3Jlc3VsdC5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gd3JpdGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZm9ybXVsYXMgd2l0aCBhIHVzZXIKK3NwZWNpZmllZCByZXN1bHQuCisKK1RoaXMgaXMgZ2VuZXJhbGx5IG9ubHkgcmVxdWlyZWQgd2hlbiB3cml0aW5nIGEgc3ByZWFkc2hlZXQgZm9yIGFuCithcHBsaWNhdGlvbiBvdGhlciB0aGFuIEV4Y2VsIHdoZXJlIHRoZSBmb3JtdWxhIGlzbid0IGV2YWx1YXRlZC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvZm9ybXVsYV9yZXN1bHQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBmb3JtdWxhX3Jlc3VsdC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB3cml0ZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBmb3JtdWxhcyB3aXRoIGEgdXNlcgorICAgICMgc3BlY2lmaWVkIHJlc3VsdC4KKyAgICAjCisgICAgIyBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHJlcXVpcmVkIHdoZW4gd3JpdGluZyBhIHNwcmVhZHNoZWV0IGZvciBhbgorICAgICMgYXBwbGljYXRpb24gb3RoZXIgdGhhbiBFeGNlbCB3aGVyZSB0aGUgZm9ybXVsYSBpc24ndCBldmFsdWF0ZWQuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwNSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdmb3JtdWxhX3Jlc3VsdC54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGZvcm1hdCAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChjb2xvciA9PiAnYmx1ZScpOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MSsyJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJz0xKzInLCAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQsIDQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICc9IkFCQyInLCAgICAgICAgICAgICAgICAgICB1bmRlZiwgICAnREVGJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E0JywgJz1JRihBMSA+IDEsIFRSVUUsIEZBTFNFKScsIHVuZGVmLCAgICdUUlVFJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E1JywgJz0xLzAnLCAgICAgICAgICAgICAgICAgICAgIHVuZGVmLCAgICcjRElWLzAhJyk7CisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9mb3JtdWxhX3Jlc3VsdC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGhlYWRlcnMucGwKKworCisKK1RoaXMgcHJvZ3JhbSBzaG93cyBzZXZlcmFsIGV4YW1wbGVzIG9mIGhvdyB0byBzZXQgdXAgaGVhZGVycyBhbmQKK2Zvb3RlcnMgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworVGhlIGNvbnRyb2wgY2hhcmFjdGVycyB1c2VkIGluIHRoZSBoZWFkZXIvZm9vdGVyIHN0cmluZ3MgYXJlOgorCisgICAgQ29udHJvbCAgICAgICAgICAgICBDYXRlZ29yeSAgICAgICAgICAgIERlc2NyaXB0aW9uCisgICAgPT09PT09PSAgICAgICAgICAgICA9PT09PT09PSAgICAgICAgICAgID09PT09PT09PT09CisgICAgJkwgICAgICAgICAgICAgICAgICBKdXN0aWZpY2F0aW9uICAgICAgIExlZnQKKyAgICAmQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudGVyCisgICAgJlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0CisKKyAgICAmUCAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uICAgICAgICAgUGFnZSBudW1iZXIKKyAgICAmTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgbnVtYmVyIG9mIHBhZ2VzCisgICAgJkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUKKyAgICAmVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZQorICAgICZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIG5hbWUKKyAgICAmQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0IG5hbWUKKworICAgICZmb250c2l6ZSAgICAgICAgICAgRm9udCAgICAgICAgICAgICAgICBGb250IHNpemUKKyAgICAmImZvbnQsc3R5bGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udCBuYW1lIGFuZCBzdHlsZQorICAgICZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGUgdW5kZXJsaW5lCisgICAgJkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZSB1bmRlcmxpbmUKKyAgICAmUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWtldGhyb3VnaAorICAgICZYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBlcnNjcmlwdAorICAgICZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzY3JpcHQKKworICAgICYmICAgICAgICAgICAgICAgICAgTWlzY2VsbGFuZW91cyAgICAgICBMaXRlcmFsIGFtcGVyc2FuZCAmCisKK1NlZSB0aGUgbWFpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9oZWFkZXJzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gaGVhZGVycy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgcHJvZ3JhbSBzaG93cyBzZXZlcmFsIGV4YW1wbGVzIG9mIGhvdyB0byBzZXQgdXAgaGVhZGVycyBhbmQKKyAgICAjIGZvb3RlcnMgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBUaGUgY29udHJvbCBjaGFyYWN0ZXJzIHVzZWQgaW4gdGhlIGhlYWRlci9mb290ZXIgc3RyaW5ncyBhcmU6CisgICAgIworICAgICMgICAgIENvbnRyb2wgICAgICAgICAgICAgQ2F0ZWdvcnkgICAgICAgICAgICBEZXNjcmlwdGlvbgorICAgICMgICAgID09PT09PT0gICAgICAgICAgICAgPT09PT09PT0gICAgICAgICAgICA9PT09PT09PT09PQorICAgICMgICAgICZMICAgICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgICAgICBMZWZ0CisgICAgIyAgICAgJkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRlcgorICAgICMgICAgICZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodAorICAgICMKKyAgICAjICAgICAmUCAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uICAgICAgICAgUGFnZSBudW1iZXIKKyAgICAjICAgICAmTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgbnVtYmVyIG9mIHBhZ2VzCisgICAgIyAgICAgJkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUKKyAgICAjICAgICAmVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZQorICAgICMgICAgICZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIG5hbWUKKyAgICAjICAgICAmQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0IG5hbWUKKyAgICAjCisgICAgIyAgICAgJmZvbnRzaXplICAgICAgICAgICBGb250ICAgICAgICAgICAgICAgIEZvbnQgc2l6ZQorICAgICMgICAgICYiZm9udCxzdHlsZSIgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250IG5hbWUgYW5kIHN0eWxlCisgICAgIyAgICAgJlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZSB1bmRlcmxpbmUKKyAgICAjICAgICAmRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlIHVuZGVybGluZQorICAgICMgICAgICZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpa2V0aHJvdWdoCisgICAgIyAgICAgJlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cGVyc2NyaXB0CisgICAgIyAgICAgJlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnNjcmlwdAorICAgICMKKyAgICAjICAgICAmJiAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgICAgICAgTGl0ZXJhbCBhbXBlcnNhbmQgJgorICAgICMKKyAgICAjIFNlZSB0aGUgbWFpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJoZWFkZXJzLnhscyIpOworICAgIG15ICRwcmV2aWV3ICAgPSAiU2VsZWN0IFByaW50IFByZXZpZXcgdG8gc2VlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciI7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgdG8gc3RhcnQKKyAgICAjCisgICAgbXkgJHdvcmtzaGVldDEgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdTaW1wbGUnKTsKKyAgICAKKyAgICBteSAkaGVhZGVyMSAgICAgPSAnJkNIZXJlIGlzIHNvbWUgY2VudHJlZCB0ZXh0Lic7CisgICAgCisgICAgbXkgJGZvb3RlcjEgICAgID0gJyZMSGVyZSBpcyBzb21lIGxlZnQgYWxpZ25lZCB0ZXh0Lic7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDEtPnNldF9oZWFkZXIoJGhlYWRlcjEpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfZm9vdGVyKCRmb290ZXIxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTEnLCAkcHJldmlldyk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBzb21lIG9mIHRoZSBoZWFkZXIvZm9vdGVyIHZhcmlhYmxlcy4KKyAgICAjCisgICAgbXkgJHdvcmtzaGVldDIgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdWYXJpYWJsZXMnKTsKKyAgICAKKyAgICBteSAkaGVhZGVyMiAgICAgPSAnJkxQYWdlICZQIG9mICZOJy4KKyAgICAgICAgICAgICAgICAgICAgICAnJkNGaWxlbmFtZTogJkYnIC4KKyAgICAgICAgICAgICAgICAgICAgICAnJlJTaGVldG5hbWU6ICZBJzsKKyAgICAKKyAgICBteSAkZm9vdGVyMiAgICAgPSAnJkxDdXJyZW50IGRhdGU6ICZEJy4KKyAgICAgICAgICAgICAgICAgICAgICAnJlJDdXJyZW50IHRpbWU6ICZUJzsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2hlYWRlcigkaGVhZGVyMik7CisgICAgJHdvcmtzaGVldDItPnNldF9mb290ZXIoJGZvb3RlcjIpOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQyLT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMScsICRwcmV2aWV3KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0EyMScsICJOZXh0IHNoZWV0Iik7CisgICAgJHdvcmtzaGVldDItPnNldF9oX3BhZ2VicmVha3MoMjApOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBtb3JlIHRoYW4gb25lIGZvbnQKKyAgICAjCisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ01peGVkIGZvbnRzJyk7CisgICAgCisgICAgbXkgJGhlYWRlcjMgICAgPSAnJkMnIC4KKyAgICAgICAgICAgICAgICAgICAgICcmIkNvdXJpZXIgTmV3LEJvbGQiSGVsbG8gJyAuCisgICAgICAgICAgICAgICAgICAgICAnJiJBcmlhbCxJdGFsaWMiV29ybGQnOworICAgIAorICAgIG15ICRmb290ZXIzICAgID0gJyZDJyAuCisgICAgICAgICAgICAgICAgICAgICAnJiJTeW1ib2wiZScgLgorICAgICAgICAgICAgICAgICAgICAgJyYiQXJpYWwiID0gbWMmWDInOworICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfaGVhZGVyKCRoZWFkZXIzKTsKKyAgICAkd29ya3NoZWV0My0+c2V0X2Zvb3RlcigkZm9vdGVyMyk7CisgICAgCisgICAgJHdvcmtzaGVldDMtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAkd29ya3NoZWV0My0+d3JpdGUoJ0ExJywgJHByZXZpZXcpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGxpbmUgd3JhcHBpbmcKKyAgICAjCisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1dvcmQgd3JhcCcpOworICAgIAorICAgIG15ICRoZWFkZXI0ICAgID0gIiZDSGVhZGluZyAxXG5IZWFkaW5nIDJcbkhlYWRpbmcgMyI7CisgICAgCisgICAgJHdvcmtzaGVldDQtPnNldF9oZWFkZXIoJGhlYWRlcjQpOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgJHdvcmtzaGVldDQtPndyaXRlKCdBMScsICRwcmV2aWV3KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBpbnNlcnRpbmcgYSBsaXRlcmFsIGFtcGVyc2FuZCAmCisgICAgIworICAgIG15ICR3b3Jrc2hlZXQ1ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdBbXBlcnNhbmQnKTsKKyAgICAKKyAgICBteSAkaGVhZGVyNSAgICA9ICImQ0N1cmlvdXNlciAmJiBDdXJpb3VzZXIgLSBBdHRvcm5leXMgYXQgTGF3IjsKKyAgICAKKyAgICAkd29ya3NoZWV0NS0+c2V0X2hlYWRlcigkaGVhZGVyNSk7CisgICAgCisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAkd29ya3NoZWV0NS0+d3JpdGUoJ0ExJywgJHByZXZpZXcpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9oZWFkZXJzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogaGlkZV9zaGVldC5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gaGlkZSBhIHdvcmtzaGVldCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9oaWRlX3NoZWV0LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gaGlkZV9zaGVldC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byBoaWRlIGEgd29ya3NoZWV0IHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBcHJpbCAyMDA1LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdoaWRkZW4ueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBTaGVldDIgd29uJ3QgYmUgdmlzaWJsZSB1bnRpbCBpdCBpcyB1bmhpZGRlbiBpbiBFeGNlbC4KKyAgICAkd29ya3NoZWV0Mi0+aGlkZSgpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgwLCAwLCAnU2hlZXQyIGlzIGhpZGRlbicpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgwLCAwLCAnSG93IGRpZCB5b3UgZmluZCBtZT8nKTsKKyAgICAkd29ya3NoZWV0My0+d3JpdGUoMCwgMCwgJ1NoZWV0MiBpcyBoaWRkZW4nKTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2hpZGVfc2hlZXQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBoeXBlcmxpbmsxLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFdyaXRlRXhjZWwgbW9kdWxlIHRvIHdyaXRlIGh5cGVybGlua3MuCisKK1NlZSBhbHNvIGh5cGVybGluazIucGwgZm9yIHdvcmtzaGVldCBVUkwgZXhhbXBsZXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2h5cGVybGluazEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBoeXBlcmxpbmsxLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBoeXBlcmxpbmtzLgorICAgICMKKyAgICAjIFNlZSBhbHNvIGh5cGVybGluazIucGwgZm9yIHdvcmtzaGVldCBVUkwgZXhhbXBsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJoeXBlcmxpbmsueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSHlwZXJsaW5rcycpOworICAgIAorICAgICMgRm9ybWF0IHRoZSBmaXJzdCBjb2x1bW4KKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAzMCk7CisgICAgJHdvcmtzaGVldC0+c2V0X3NlbGVjdGlvbignQjEnKTsKKyAgICAKKyAgICAKKyAgICAjIEFkZCBhIHNhbXBsZSBmb3JtYXQKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X3NpemUoMTIpOworICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdyZWQnKTsKKyAgICAkZm9ybWF0LT5zZXRfdW5kZXJsaW5lKCk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIGh5cGVybGlua3MKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnaHR0cDovL3d3dy5wZXJsLmNvbS8nICAgICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgJ2h0dHA6Ly93d3cucGVybC5jb20vJywgJ1BlcmwgaG9tZScgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICdodHRwOi8vd3d3LnBlcmwuY29tLycsIHVuZGVmLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTcnLCAnbWFpbHRvOmptY25hbWFyYUBjcGFuLm9yZycsICdNYWlsIG1lJyk7CisgICAgCisgICAgIyBXcml0ZSBhIFVSTCB0aGF0IGlzbid0IGEgaHlwZXJsaW5rCisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKCdBOScsICdodHRwOi8vd3d3LnBlcmwuY29tLycpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9oeXBlcmxpbmsxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogaHlwZXJsaW5rMi5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBpbnRlcm5hbCBhbmQgaW50ZXJuYWwKK2h5cGVybGlua3MuCisKK0lmIHlvdSB3aXNoIHRvIHJ1biB0aGlzIHByb2dyYW0gYW5kIGZvbGxvdyB0aGUgaHlwZXJsaW5rcyB5b3Ugc2hvdWxkIGNyZWF0ZQordGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlOgorCisgICAgQzpcIC0tIFRlbXAgLS0rLS0gRXVyb3BlCisgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICBcLS0gQXNpYQorCisKK1NlZSBhbHNvIGh5cGVybGluazEucGwgZm9yIHdlYiBVUkwgZXhhbXBsZXMuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUgaW50ZXJuYWwgYW5kIGludGVybmFsCisgICAgIyBoeXBlcmxpbmtzLgorICAgICMKKyAgICAjIElmIHlvdSB3aXNoIHRvIHJ1biB0aGlzIHByb2dyYW0gYW5kIGZvbGxvdyB0aGUgaHlwZXJsaW5rcyB5b3Ugc2hvdWxkIGNyZWF0ZQorICAgICMgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlOgorICAgICMKKyAgICAjICAgICBDOlwgLS0gVGVtcCAtLSstLSBFdXJvcGUKKyAgICAjICAgICAgICAgICAgICAgICAgIHwKKyAgICAjICAgICAgICAgICAgICAgICAgIFwtLSBBc2lhCisgICAgIworICAgICMKKyAgICAjIFNlZSBhbHNvIGh5cGVybGluazEucGwgZm9yIHdlYiBVUkwgZXhhbXBsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBGZWJydWFyeSAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgdGhyZWUgd29ya2Jvb2tzOgorICAgICMgICBDOlxUZW1wXEV1cm9wZVxJcmVsYW5kLnhscworICAgICMgICBDOlxUZW1wXEV1cm9wZVxJdGFseS54bHMKKyAgICAjICAgQzpcVGVtcFxBc2lhXENoaW5hLnhscworICAgICMKKyAgICBteSAkaXJlbGFuZCAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnQzpcVGVtcFxFdXJvcGVcSXJlbGFuZC54bHMnKTsKKyAgICBteSAkaXJlX2xpbmtzID0gJGlyZWxhbmQtPmFkZF93b3Jrc2hlZXQoJ0xpbmtzJyk7CisgICAgbXkgJGlyZV9zYWxlcyA9ICRpcmVsYW5kLT5hZGRfd29ya3NoZWV0KCdTYWxlcycpOworICAgIG15ICRpcmVfZGF0YSAgPSAkaXJlbGFuZC0+YWRkX3dvcmtzaGVldCgnUHJvZHVjdCBEYXRhJyk7CisgICAgCisgICAgbXkgJGl0YWx5ICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ0M6XFRlbXBcRXVyb3BlXEl0YWx5LnhscycpOworICAgIG15ICRpdGFfbGlua3MgPSAkaXRhbHktPmFkZF93b3Jrc2hlZXQoJ0xpbmtzJyk7CisgICAgbXkgJGl0YV9zYWxlcyA9ICRpdGFseS0+YWRkX3dvcmtzaGVldCgnU2FsZXMnKTsKKyAgICBteSAkaXRhX2RhdGEgID0gJGl0YWx5LT5hZGRfd29ya3NoZWV0KCdQcm9kdWN0IERhdGEnKTsKKyAgICAKKyAgICBteSAkY2hpbmEgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnQzpcVGVtcFxBc2lhXENoaW5hLnhscycpOworICAgIG15ICRjaGFfbGlua3MgPSAkY2hpbmEtPmFkZF93b3Jrc2hlZXQoJ0xpbmtzJyk7CisgICAgbXkgJGNoYV9zYWxlcyA9ICRjaGluYS0+YWRkX3dvcmtzaGVldCgnU2FsZXMnKTsKKyAgICBteSAkY2hhX2RhdGEgID0gJGNoaW5hLT5hZGRfd29ya3NoZWV0KCdQcm9kdWN0IERhdGEnKTsKKyAgICAKKyAgICAjIEFkZCBhIGZvcm1hdAorICAgIG15ICRmb3JtYXQgPSAkaXJlbGFuZC0+YWRkX2Zvcm1hdChjb2xvciA9PiAnZ3JlZW4nLCBib2xkID0+IDEpOworICAgICRpcmVfbGlua3MtPnNldF9jb2x1bW4oJ0E6QicsIDI1KTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZXMgb2YgaW50ZXJuYWwgbGlua3MKKyAgICAjCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0ExJywgJ0ludGVybmFsIGxpbmtzJywgJGZvcm1hdCk7CisgICAgCisgICAgIyBJbnRlcm5hbCBsaW5rCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0EyJywgJ2ludGVybmFsOlNhbGVzIUEyJyk7CisgICAgCisgICAgIyBJbnRlcm5hbCBsaW5rIHRvIGEgcmFuZ2UKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQTMnLCAnaW50ZXJuYWw6U2FsZXMhQTM6RDMnKTsKKyAgICAKKyAgICAjIEludGVybmFsIGxpbmsgd2l0aCBhbiBhbHRlcm5hdGl2ZSBzdHJpbmcKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQTQnLCAnaW50ZXJuYWw6U2FsZXMhQTQnLCAnTGluaycpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluayB3aXRoIGEgZm9ybWF0CisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0E1JywgJ2ludGVybmFsOlNhbGVzIUE1JywgJGZvcm1hdCk7CisgICAgCisgICAgIyBJbnRlcm5hbCBsaW5rIHdpdGggYW4gYWx0ZXJuYXRpdmUgc3RyaW5nIGFuZCBmb3JtYXQKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQTYnLCAnaW50ZXJuYWw6U2FsZXMhQTYnLCAnTGluaycsICRmb3JtYXQpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluayAoc3BhY2VzIGluIHdvcmtzaGVldCBuYW1lKQorICAgICRpcmVfbGlua3MtPndyaXRlKCdBNycsIHF7aW50ZXJuYWw6J1Byb2R1Y3QgRGF0YSchQTd9KTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZXMgb2YgZXh0ZXJuYWwgbGlua3MKKyAgICAjCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0IxJywgJ0V4dGVybmFsIGxpbmtzJywgJGZvcm1hdCk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgbG9jYWwgZmlsZQorICAgICRpcmVfbGlua3MtPndyaXRlKCdCMicsICdleHRlcm5hbDpJdGFseS54bHMnKTsKKyAgICAKKyAgICAjIEV4dGVybmFsIGxpbmsgdG8gYSBsb2NhbCBmaWxlIHdpdGggd29ya3NoZWV0CisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0IzJywgJ2V4dGVybmFsOkl0YWx5LnhscyNTYWxlcyFCMycpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIGxvY2FsIGZpbGUgd2l0aCB3b3Jrc2hlZXQgYW5kIGFsdGVybmF0aXZlIHN0cmluZworICAgICRpcmVfbGlua3MtPndyaXRlKCdCNCcsICdleHRlcm5hbDpJdGFseS54bHMjU2FsZXMhQjQnLCAnTGluaycpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIGxvY2FsIGZpbGUgd2l0aCB3b3Jrc2hlZXQgYW5kIGZvcm1hdAorICAgICRpcmVfbGlua3MtPndyaXRlKCdCNScsICdleHRlcm5hbDpJdGFseS54bHMjU2FsZXMhQjUnLCAkZm9ybWF0KTsKKyAgICAKKyAgICAjIEV4dGVybmFsIGxpbmsgdG8gYSByZW1vdGUgZmlsZSwgYWJzb2x1dGUgcGF0aAorICAgICRpcmVfbGlua3MtPndyaXRlKCdCNicsICdleHRlcm5hbDpjOi9UZW1wL0FzaWEvQ2hpbmEueGxzJyk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgcmVtb3RlIGZpbGUsIHJlbGF0aXZlIHBhdGgKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjcnLCAnZXh0ZXJuYWw6Li4vQXNpYS9DaGluYS54bHMnKTsKKyAgICAKKyAgICAjIEV4dGVybmFsIGxpbmsgdG8gYSByZW1vdGUgZmlsZSB3aXRoIHdvcmtzaGVldAorICAgICRpcmVfbGlua3MtPndyaXRlKCdCOCcsICdleHRlcm5hbDpjOi9UZW1wL0FzaWEvQ2hpbmEueGxzI1NhbGVzIUI4Jyk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgcmVtb3RlIGZpbGUgd2l0aCB3b3Jrc2hlZXQgKHdpdGggc3BhY2VzIGluIHRoZSBuYW1lKQorICAgICRpcmVfbGlua3MtPndyaXRlKCdCOScsIHF7ZXh0ZXJuYWw6YzovVGVtcC9Bc2lhL0NoaW5hLnhscyMnUHJvZHVjdCBEYXRhJyFCOX0pOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTb21lIHV0aWxpdHkgbGlua3MgdG8gcmV0dXJuIHRvIHRoZSBtYWluIHNoZWV0CisgICAgIworICAgICRpcmVfc2FsZXMtPndyaXRlKCdBMicsICdpbnRlcm5hbDpMaW5rcyFBMicsICdCYWNrJyk7CisgICAgJGlyZV9zYWxlcy0+d3JpdGUoJ0EzJywgJ2ludGVybmFsOkxpbmtzIUEzJywgJ0JhY2snKTsKKyAgICAkaXJlX3NhbGVzLT53cml0ZSgnQTQnLCAnaW50ZXJuYWw6TGlua3MhQTQnLCAnQmFjaycpOworICAgICRpcmVfc2FsZXMtPndyaXRlKCdBNScsICdpbnRlcm5hbDpMaW5rcyFBNScsICdCYWNrJyk7CisgICAgJGlyZV9zYWxlcy0+d3JpdGUoJ0E2JywgJ2ludGVybmFsOkxpbmtzIUE2JywgJ0JhY2snKTsKKyAgICAkaXJlX2RhdGEtPiB3cml0ZSgnQTcnLCAnaW50ZXJuYWw6TGlua3MhQTcnLCAnQmFjaycpOworICAgIAorICAgICRpdGFfbGlua3MtPndyaXRlKCdBMScsICdleHRlcm5hbDpJcmVsYW5kLnhscyNMaW5rcyFCMicsICdCYWNrJyk7CisgICAgJGl0YV9zYWxlcy0+d3JpdGUoJ0IzJywgJ2V4dGVybmFsOklyZWxhbmQueGxzI0xpbmtzIUIzJywgJ0JhY2snKTsKKyAgICAkaXRhX3NhbGVzLT53cml0ZSgnQjQnLCAnZXh0ZXJuYWw6SXJlbGFuZC54bHMjTGlua3MhQjQnLCAnQmFjaycpOworICAgICRpdGFfc2FsZXMtPndyaXRlKCdCNScsICdleHRlcm5hbDpJcmVsYW5kLnhscyNMaW5rcyFCNScsICdCYWNrJyk7CisgICAgJGNoYV9saW5rcy0+d3JpdGUoJ0ExJywgJ2V4dGVybmFsOi4uL0V1cm9wZS9JcmVsYW5kLnhscyNMaW5rcyFCNicsICdCYWNrJyk7CisgICAgJGNoYV9zYWxlcy0+d3JpdGUoJ0I4JywgJ2V4dGVybmFsOi4uL0V1cm9wZS9JcmVsYW5kLnhscyNMaW5rcyFCOCcsICdCYWNrJyk7CisgICAgJGNoYV9kYXRhLT4gd3JpdGUoJ0I5JywgJ2V4dGVybmFsOi4uL0V1cm9wZS9JcmVsYW5kLnhscyNMaW5rcyFCOScsICdCYWNrJyk7CisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2h5cGVybGluazIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBpbWFnZXMucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGluc2VydCBpbWFnZXMgaW50byBhbiBFeGNlbCB3b3Jrc2hlZXQgdXNpbmcgdGhlCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBpbnNlcnRfaW1hZ2UoKSBtZXRob2QuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2ltYWdlcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGltYWdlcy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byBpbnNlcnQgaW1hZ2VzIGludG8gYW4gRXhjZWwgd29ya3NoZWV0IHVzaW5nIHRoZQorICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW5zZXJ0X2ltYWdlKCkgbWV0aG9kLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgT2N0b2JlciAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgY2FsbGVkIHNpbXBsZS54bHMgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiaW1hZ2VzLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdJbWFnZSAxJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0ltYWdlIDInKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSW1hZ2UgMycpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdJbWFnZSA0Jyk7CisgICAgCisgICAgIyBJbnNlcnQgYSBiYXNpYyBpbWFnZQorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTEwJywgIkltYWdlIGluc2VydGVkIGludG8gd29ya3NoZWV0LiIpOworICAgICR3b3Jrc2hlZXQxLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3JlcHVibGljLnBuZycpOworICAgIAorICAgIAorICAgICMgSW5zZXJ0IGFuIGltYWdlIHdpdGggYW4gb2Zmc2V0CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMTAnLCAiSW1hZ2UgaW5zZXJ0ZWQgd2l0aCBhbiBvZmZzZXQuIik7CisgICAgJHdvcmtzaGVldDItPmluc2VydF9pbWFnZSgnQTEnLCAncmVwdWJsaWMucG5nJywgMzIsIDEwKTsKKyAgICAKKyAgICAjIEluc2VydCBhIHNjYWxlZCBpbWFnZQorICAgICR3b3Jrc2hlZXQzLT53cml0ZSgnQTEwJywgIkltYWdlIHNjYWxlZDogd2lkdGggeCAyLCBoZWlnaHQgeCAwLjguIik7CisgICAgJHdvcmtzaGVldDMtPmluc2VydF9pbWFnZSgnQTEnLCAncmVwdWJsaWMucG5nJywgMCwgMCwgMiwgMC44KTsKKyAgICAKKyAgICAjIEluc2VydCBhbiBpbWFnZSBvdmVyIHZhcmllZCBjb2x1bW4gYW5kIHJvdyBzaXplcworICAgICMgVGhpcyBkb2VzIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIHdvcmsKKyAgICAKKyAgICAjIFNldCB0aGUgY29scyBhbmQgcm93IHNpemVzCisgICAgIyBOT1RFOiB5b3UgbXVzdCBkbyB0aGlzIGJlZm9yZSB5b3UgY2FsbCBpbnNlcnRfaW1hZ2UoKQorICAgICR3b3Jrc2hlZXQ0LT5zZXRfY29sdW1uKCdBOkEnLCA1KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQjpCJywgdW5kZWYsIHVuZGVmLCAxKTsgIyBIaWRkZW4KKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQzpEJywgMTApOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDAsIDMwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygzLCA1KTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUoJ0ExMCcsICJJbWFnZSBpbnNlcnRlZCBvdmVyIHNjYWxlZCByb3dzIGFuZCBjb2x1bW5zLiIpOworICAgICR3b3Jrc2hlZXQ0LT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3JlcHVibGljLnBuZycpOworICAgIAorICAgIAorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9pbWFnZXMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBpbmRlbnQucGwKKworCisKK0Egc2ltcGxlIGZvcm1hdHRpbmcgZXhhbXBsZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworVGhpcyBwcm9ncmFtIGRlbW9uc3RyYXRlcyB0aGUgaW5kZW50YXRpb24gY2VsbCBmb3JtYXQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2luZGVudC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGluZGVudC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZm9ybWF0dGluZyBleGFtcGxlIHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIFRoaXMgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgdGhlIGluZGVudGF0aW9uIGNlbGwgZm9ybWF0LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnaW5kZW50LnhscycpOworICAgIAorICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkaW5kZW50MSAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGluZGVudCA9PiAxKTsKKyAgICBteSAkaW5kZW50MiAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGluZGVudCA9PiAyKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA0MCk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgIlRoaXMgdGV4dCBpcyBpbmRlbnRlZCAxIGxldmVsIiwgICRpbmRlbnQxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAiVGhpcyB0ZXh0IGlzIGluZGVudGVkIDIgbGV2ZWxzIiwgJGluZGVudDIpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvaW5kZW50LnBsPgorCis9aGVhZDIgRXhhbXBsZTogbWVyZ2UxLnBsCisKKworCitTaW1wbGUgZXhhbXBsZSBvZiBtZXJnaW5nIGNlbGxzIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisKK1RoaXMgZXhhbXBsZSBtZXJnZXMgdGhyZWUgY2VsbHMgdXNpbmcgdGhlICJDZW50cmUgQWNyb3NzIFNlbGVjdGlvbiIKK2FsaWdubWVudCB3aGljaCB3YXMgdGhlIEV4Y2VsIDUgbWV0aG9kIG9mIGFjaGlldmluZyBhIG1lcmdlLiBGb3IgYSBtb3JlCittb2Rlcm4gYXBwcm9hY2ggdXNlIHRoZSBtZXJnZV9yYW5nZSgpIHdvcmtzaGVldCBtZXRob2QgaW5zdGVhZC4KK1NlZSB0aGUgbWVyZ2UzLnBsIC0gbWVyZ2U2LnBsIHByb2dyYW1zLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9tZXJnZTEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBtZXJnZTEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTaW1wbGUgZXhhbXBsZSBvZiBtZXJnaW5nIGNlbGxzIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIG1lcmdlcyB0aHJlZSBjZWxscyB1c2luZyB0aGUgIkNlbnRyZSBBY3Jvc3MgU2VsZWN0aW9uIgorICAgICMgYWxpZ25tZW50IHdoaWNoIHdhcyB0aGUgRXhjZWwgNSBtZXRob2Qgb2YgYWNoaWV2aW5nIGEgbWVyZ2UuIEZvciBhIG1vcmUKKyAgICAjIG1vZGVybiBhcHByb2FjaCB1c2UgdGhlIG1lcmdlX3JhbmdlKCkgd29ya3NoZWV0IG1ldGhvZCBpbnN0ZWFkLgorICAgICMgU2VlIHRoZSBtZXJnZTMucGwgLSBtZXJnZTYucGwgcHJvZ3JhbXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygibWVyZ2UxLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIEluY3JlYXNlIHRoZSBjZWxsIHNpemUgb2YgdGhlIG1lcmdlZCBjZWxscyB0byBoaWdobGlnaHQgdGhlIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpEJywgMjApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMiwgMzApOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgbWVyZ2UgZm9ybWF0CisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChjZW50ZXJfYWNyb3NzID0+IDEpOworICAgIAorICAgIAorICAgICMgT25seSBvbmUgY2VsbCBzaG91bGQgY29udGFpbiB0ZXh0LCB0aGUgb3RoZXJzIHNob3VsZCBiZSBibGFuay4KKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICgyLCAxLCAiQ2VudGVyIGFjcm9zcyBzZWxlY3Rpb24iLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygyLCAyLCAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoMiwgMywgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTEucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtZXJnZTIucGwKKworCisKK1NpbXBsZSBleGFtcGxlIG9mIG1lcmdpbmcgY2VsbHMgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZQorCitUaGlzIGV4YW1wbGUgbWVyZ2VzIHRocmVlIGNlbGxzIHVzaW5nIHRoZSAiQ2VudHJlIEFjcm9zcyBTZWxlY3Rpb24iCithbGlnbm1lbnQgd2hpY2ggd2FzIHRoZSBFeGNlbCA1IG1ldGhvZCBvZiBhY2hpZXZpbmcgYSBtZXJnZS4gRm9yIGEgbW9yZQorbW9kZXJuIGFwcHJvYWNoIHVzZSB0aGUgbWVyZ2VfcmFuZ2UoKSB3b3Jrc2hlZXQgbWV0aG9kIGluc3RlYWQuCitTZWUgdGhlIG1lcmdlMy5wbCAtIG1lcmdlNi5wbCBwcm9ncmFtcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvbWVyZ2UyLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gbWVyZ2UyLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2ltcGxlIGV4YW1wbGUgb2YgbWVyZ2luZyBjZWxscyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIG1lcmdlcyB0aHJlZSBjZWxscyB1c2luZyB0aGUgIkNlbnRyZSBBY3Jvc3MgU2VsZWN0aW9uIgorICAgICMgYWxpZ25tZW50IHdoaWNoIHdhcyB0aGUgRXhjZWwgNSBtZXRob2Qgb2YgYWNoaWV2aW5nIGEgbWVyZ2UuIEZvciBhIG1vcmUKKyAgICAjIG1vZGVybiBhcHByb2FjaCB1c2UgdGhlIG1lcmdlX3JhbmdlKCkgd29ya3NoZWV0IG1ldGhvZCBpbnN0ZWFkLgorICAgICMgU2VlIHRoZSBtZXJnZTMucGwgLSBtZXJnZTYucGwgcHJvZ3JhbXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygibWVyZ2UyLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIEluY3JlYXNlIHRoZSBjZWxsIHNpemUgb2YgdGhlIG1lcmdlZCBjZWxscyB0byBoaWdobGlnaHQgdGhlIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigxLCAyLCAzMCk7CisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygyLCA0MCk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBtZXJnZWQgZm9ybWF0CisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX2Fjcm9zcyAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICAgICAgICAgICAgPT4gMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgICAgID0+ICd3aGl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnX2NvbG9yICAgICAgICA9PiAnZ3JlZW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJfY29sb3IgICAgPT4gJ3llbGxvdycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgICAgICA9PiAndmNlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgIyBPbmx5IG9uZSBjZWxsIHNob3VsZCBjb250YWluIHRleHQsIHRoZSBvdGhlcnMgc2hvdWxkIGJlIGJsYW5rLgorICAgICR3b3Jrc2hlZXQtPndyaXRlICAgICAgKDIsIDEsICJDZW50ZXIgYWNyb3NzIHNlbGVjdGlvbiIsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2JsYW5rKDIsIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtZXJnZTMucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byB3cml0ZSBhIGh5cGVybGluayBpbiBhCittZXJnZWQgY2VsbC4gVGhlcmUgYXJlIHR3byBvcHRpb25zIHdyaXRlX3VybF9yYW5nZSgpIHdpdGggYSBzdGFuZGFyZCBtZXJnZQorZm9ybWF0IG9yIG1lcmdlX3JhbmdlKCkuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL21lcmdlMy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIG1lcmdlMy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byB3cml0ZSBhIGh5cGVybGluayBpbiBhCisgICAgIyBtZXJnZWQgY2VsbC4gVGhlcmUgYXJlIHR3byBvcHRpb25zIHdyaXRlX3VybF9yYW5nZSgpIHdpdGggYSBzdGFuZGFyZCBtZXJnZQorICAgICMgZm9ybWF0IG9yIG1lcmdlX3JhbmdlKCkuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnbWVyZ2UzLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIEluY3JlYXNlIHRoZSBjZWxsIHNpemUgb2YgdGhlIG1lcmdlZCBjZWxscyB0byBoaWdobGlnaHQgdGhlIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygkXywgMzApIGZvciAoMSwgMywgNiwgNyk7CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpEJywgMjApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDE6IE1lcmdlIGNlbGxzIGNvbnRhaW5pbmcgYSBoeXBlcmxpbmsgdXNpbmcgd3JpdGVfdXJsX3JhbmdlKCkKKyAgICAjIGFuZCB0aGUgc3RhbmRhcmQgRXhjZWwgNSsgbWVyZ2UgcHJvcGVydHkuCisgICAgIworICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9hY3Jvc3MgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgICAgICA9PiAnYmx1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBjZWxscyB0byBiZSBtZXJnZWQKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmxfcmFuZ2UoJ0IyOkQyJywgJ2h0dHA6Ly93d3cucGVybC5jb20nLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoJ0MyJywgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2JsYW5rKCdEMicsICRmb3JtYXQxKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyOiBNZXJnZSBjZWxscyBjb250YWluaW5nIGEgaHlwZXJsaW5rIHVzaW5nIG1lcmdlX3JhbmdlKCkuCisgICAgIworICAgIG15ICRmb3JtYXQyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgICAgICA9PiAnYmx1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICAgICAgPT4gJ2NlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICAgICAgPT4gJ3ZjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICMgTWVyZ2UgMyBjZWxscworICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCNDpENCcsICdodHRwOi8vd3d3LnBlcmwuY29tJywgJGZvcm1hdDIpOworICAgIAorICAgIAorICAgICMgTWVyZ2UgMyBjZWxscyBvdmVyIHR3byByb3dzCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0I3OkQ4JywgJ2h0dHA6Ly93d3cucGVybC5jb20nLCAkZm9ybWF0Mik7CisgICAgCisgICAgCisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL21lcmdlMy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IG1lcmdlNC5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtZXJnZV9yYW5nZSgpIHdvcmtib29rCittZXRob2Qgd2l0aCBjb21wbGV4IGZvcm1hdHRpbmcuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL21lcmdlNC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIG1lcmdlNC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfcmFuZ2UoKSB3b3JrYm9vaworICAgICMgbWV0aG9kIHdpdGggY29tcGxleCBmb3JtYXR0aW5nLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ21lcmdlNC54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9yb3coJF8sIDMwKSBmb3IgKDEuLjExKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkQnLCAyMCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMTogVGV4dCBjZW50ZXJlZCB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHkKKyAgICAjCisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgPT4gJ3ZjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgPT4gJ2NlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCMjpEMycsICdWZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCcsICRmb3JtYXQxKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyOiBUZXh0IGFsaWduZWQgdG8gdGhlIHRvcCBhbmQgbGVmdAorICAgICMKKyAgICBteSAkZm9ybWF0MiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgPT4gJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICA9PiAndG9wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgID0+ICdsZWZ0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjU6RDYnLCAnQWxpZ25lZCB0byB0aGUgdG9wIGFuZCBsZWZ0JywgJGZvcm1hdDIpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDM6ICBUZXh0IGFsaWduZWQgdG8gdGhlIGJvdHRvbSBhbmQgcmlnaHQKKyAgICAjCisgICAgbXkgJGZvcm1hdDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgPT4gJ2JvdHRvbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICA9PiAncmlnaHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCODpEOScsICdBbGlnbmVkIHRvIHRoZSBib3R0b20gYW5kIHJpZ2h0JywgJGZvcm1hdDMpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQ6ICBUZXh0IGp1c3RpZmllZCAoaS5lLiB3cmFwcGVkKSBpbiB0aGUgY2VsbAorICAgICMKKyAgICBteSAkZm9ybWF0NCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgPT4gJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICA9PiAndG9wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgID0+ICdqdXN0aWZ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjExOkQxMicsICdKdXN0aWZpZWQ6ICcuJ3NvIG9uIGFuZCAnIHgxOCwgJGZvcm1hdDQpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtZXJnZTUucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfY2VsbHMoKSB3b3JrYm9vaworbWV0aG9kIHdpdGggY29tcGxleCBmb3JtYXR0aW5nIGFuZCByb3RhdGlvbi4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9tZXJnZTUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBtZXJnZTUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1lcmdlX2NlbGxzKCkgd29ya2Jvb2sKKyAgICAjIG1ldGhvZCB3aXRoIGNvbXBsZXggZm9ybWF0dGluZyBhbmQgcm90YXRpb24uCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ21lcmdlNS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9yb3coJF8sIDM2KSAgICAgICAgIGZvciAoMy4uOCk7CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigkXywgJF8gLCAxNSkgZm9yICgxLDMsNSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFJvdGF0aW9uIDEsIGxldHRlcnMgcnVuIGZyb20gdG9wIHRvIGJvdHRvbQorICAgICMKKyAgICBteSAkZm9ybWF0MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgPT4gJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICAgICAgPT4gJ3ZjZW50cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgID0+ICdjZW50cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uICAgID0+IDI3MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjQ6QjknLCAnUm90YXRpb24gMjcwJywgJGZvcm1hdDEpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBSb3RhdGlvbiAyLCA5MLAgYW50aWNsb2Nrd2lzZQorICAgICMKKyAgICBteSAkZm9ybWF0MiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgPT4gJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICAgICAgPT4gJ3ZjZW50cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgID0+ICdjZW50cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uICAgID0+IDkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdENDpEOScsICdSb3RhdGlvbiA5MLAnLCAkZm9ybWF0Mik7CisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFJvdGF0aW9uIDMsIDkwsCBjbG9ja3dpc2UKKyAgICAjCisgICAgbXkgJGZvcm1hdDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICA9PiAnY2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiAgICA9PiAtOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0Y0OkY5JywgJ1JvdGF0aW9uIC05MLAnLCAkZm9ybWF0Myk7CisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL21lcmdlNS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IG1lcmdlNi5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtZXJnZV9jZWxscygpIHdvcmtib29rCittZXRob2Qgd2l0aCBVbmljb2RlIHN0cmluZ3MuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvbWVyZ2U2LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gbWVyZ2U2LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtZXJnZV9jZWxscygpIHdvcmtib29rCisgICAgIyBtZXRob2Qgd2l0aCBVbmljb2RlIHN0cmluZ3MuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgRGVjZW1iZXIgMjAwNSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnbWVyZ2U2LnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIEluY3JlYXNlIHRoZSBjZWxsIHNpemUgb2YgdGhlIG1lcmdlZCBjZWxscyB0byBoaWdobGlnaHQgdGhlIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygkXywgMzYpIGZvciAyLi45OworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6RCcsIDI1KTsKKyAgICAKKyAgICAKKyAgICAjIEZvcm1hdCBmb3IgdGhlIG1lcmdlZCBjZWxscy4KKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgICAgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICAgICAgICA9PiAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gICAgICA9PiAndmNlbnRyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICAgICAgPT4gJ2xlZnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFdyaXRlIGFuIEFzY2lpIHN0cmluZy4KKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0IzOkQ0JywgJ0FTQ0lJOiBBIHNpbXBsZSBzdHJpbmcnLCAkZm9ybWF0KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgV3JpdGUgYSBVVEYtMTYgVW5pY29kZSBzdHJpbmcuCisgICAgIworICAgIAorICAgICMgQSBwaHJhc2UgaW4gQ3lyaWxsaWMgZW5jb2RlZCBhcyBVVEYtMTZCRS4KKyAgICBteSAkdXRmMTZfc3RyID0gcGFjayAiSCoiLCAnMDA1NTAwNTQwMDQ2MDAyZDAwMzEwMDM2MDAzYTAwMjAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwNDJkMDQ0MjA0M2UwMDIwMDQ0NDA0NDAwNDMwMDQzNzA0MzAwMDIwMDQnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICczZDA0MzAwMDIwMDQ0MDA0NDMwNDQxMDQ0MTA0M2EwNDNlMDQzYzAwMjEnOworICAgIAorICAgICMgTm90ZSB0aGUgZXh0cmEgcGFyYW1ldGVyIGF0IHRoZSBlbmQgdG8gaW5kaWNhdGUgVVRGLTE2IGVuY29kaW5nLgorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCNjpENycsICR1dGYxNl9zdHIsICRmb3JtYXQsIDEpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBXcml0ZSBhIFVURi04IFVuaWNvZGUgc3RyaW5nLgorICAgICMKKyAgICAKKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgbXkgJHNtaWxleSA9IGNociAweDI2M2E7CisgICAgICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCOTpEMTAnLCAiVVRGLTg6IEEgVW5pY29kZSBzbWlsZXkgJHNtaWxleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjk6RDEwJywgIlVURi04OiBSZXF1aXJlcyBQZXJsIDUuOCIsICRmb3JtYXQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL21lcmdlNi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IG1vZF9wZXJsMS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gc2VuZCBhbiBFeGNlbAorZmlsZSB0byBhIGJyb3dzZXIgdXNpbmcgbW9kX3BlcmwgMSBhbmQgQXBhY2hlCisKK1RoaXMgbW9kdWxlIHRpZXMgKlhMUyBkaXJlY3RseSB0byBBcGFjaGUsIGFuZCB3aXRoIHRoZSBjb3JyZWN0Citjb250ZW50LWRpc3Bvc2l0aW9uL3R5cGVzIGl0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUKK3RoZSBmaWxlLCBvciBvcGVuIGl0IGF0IHRoaXMgbG9jYXRpb24uCisKK1RoaXMgc2NyaXB0IGlzIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjZ2kucGwgZXhhbXBsZS4KKworQ2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSB0byBDZ2kucG0uCitDaGFuZ2UgdGhlIHBhY2thZ2UgbG9jYXRpb24gdG8gd2hlcmUgZXZlciB5b3UgbG9jYXRlIHRoaXMgcGFja2FnZS4KK0luIHRoZSBleGFtcGxlIGJlbG93IGl0IGlzIGxvY2F0ZWQgaW4gdGhlIFdyaXRlRXhjZWwgZGlyZWN0b3J5LgorCitZb3VyIGh0dHBkLmNvbmYgZW50cnkgZm9yIHRoaXMgbW9kdWxlLCBzaG91bGQgeW91IGNob29zZSB0byB1c2UgaXQKK2FzIGEgc3RhbmQgYWxvbmUgYXBwLCBzaG91bGQgbG9vayBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICA8TG9jYXRpb24gL3NwcmVhZHNoZWV0LXRlc3Q+CisgICAgICBTZXRIYW5kbGVyIHBlcmwtc2NyaXB0CisgICAgICBQZXJsSGFuZGxlciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2dpCisgICAgICBQZXJsU2VuZEhlYWRlciBPbgorICAgIDwvTG9jYXRpb24+CisKK1RoZSBQZXJsSGFuZGxlciBuYW1lIGFib3ZlIGFuZCB0aGUgcGFja2FnZSBuYW1lIGJlbG93ICpoYXZlKiB0byBtYXRjaC4KKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0byBzZW5kIGFuIEV4Y2VsCisgICAgIyBmaWxlIHRvIGEgYnJvd3NlciB1c2luZyBtb2RfcGVybCAxIGFuZCBBcGFjaGUKKyAgICAjCisgICAgIyBUaGlzIG1vZHVsZSB0aWVzICpYTFMgZGlyZWN0bHkgdG8gQXBhY2hlLCBhbmQgd2l0aCB0aGUgY29ycmVjdAorICAgICMgY29udGVudC1kaXNwb3NpdGlvbi90eXBlcyBpdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlCisgICAgIyB0aGUgZmlsZSwgb3Igb3BlbiBpdCBhdCB0aGlzIGxvY2F0aW9uLgorICAgICMKKyAgICAjIFRoaXMgc2NyaXB0IGlzIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjZ2kucGwgZXhhbXBsZS4KKyAgICAjCisgICAgIyBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRvIENnaS5wbS4KKyAgICAjIENoYW5nZSB0aGUgcGFja2FnZSBsb2NhdGlvbiB0byB3aGVyZSBldmVyIHlvdSBsb2NhdGUgdGhpcyBwYWNrYWdlLgorICAgICMgSW4gdGhlIGV4YW1wbGUgYmVsb3cgaXQgaXMgbG9jYXRlZCBpbiB0aGUgV3JpdGVFeGNlbCBkaXJlY3RvcnkuCisgICAgIworICAgICMgWW91ciBodHRwZC5jb25mIGVudHJ5IGZvciB0aGlzIG1vZHVsZSwgc2hvdWxkIHlvdSBjaG9vc2UgdG8gdXNlIGl0CisgICAgIyBhcyBhIHN0YW5kIGFsb25lIGFwcCwgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgorICAgICMKKyAgICAjICAgICA8TG9jYXRpb24gL3NwcmVhZHNoZWV0LXRlc3Q+CisgICAgIyAgICAgICBTZXRIYW5kbGVyIHBlcmwtc2NyaXB0CisgICAgIyAgICAgICBQZXJsSGFuZGxlciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2dpCisgICAgIyAgICAgICBQZXJsU2VuZEhlYWRlciBPbgorICAgICMgICAgIDwvTG9jYXRpb24+CisgICAgIworICAgICMgVGhlIFBlcmxIYW5kbGVyIG5hbWUgYWJvdmUgYW5kIHRoZSBwYWNrYWdlIG5hbWUgYmVsb3cgKmhhdmUqIHRvIG1hdGNoLgorICAgIAorICAgICMgQXByIDIwMDEsIFRob21hcyBTdWxsaXZhbiwgd2VibWFzdGVyQDg2MC5vcmcKKyAgICAjIEZlYiAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAKKyAgICBwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDZ2k7CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBQcmFnbWEgRGVmaW5pdGlvbnMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICB1c2Ugc3RyaWN0OworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgUmVxdWlyZWQgTW9kdWxlcworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHVzZSBBcGFjaGU6OkNvbnN0YW50cyBxdyg6Y29tbW9uKTsKKyAgICB1c2UgQXBhY2hlOjpSZXF1ZXN0OworICAgIHVzZSBBcGFjaGU6OlVSSTsgIyBUaGlzIG1heSBub3QgYmUgbmVlZGVkCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgTWFpbiBBcHAgQm9keQorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHN1YiBoYW5kbGVyIHsKKyAgICAgICAgIyBOZXcgYXBhY2hlIG9iamVjdAorICAgICAgICAjIFNob3VsZCB5b3UgZGVjaWRlIHRvIHVzZSBpdC4KKyAgICAgICAgbXkgJHIgPSBBcGFjaGU6OlJlcXVlc3QtPm5ldyhzaGlmdCk7CisgICAgCisgICAgICAgICMgU2V0IHRoZSBmaWxlbmFtZSBhbmQgc2VuZCB0aGUgY29udGVudCB0eXBlCisgICAgICAgICMgVGhpcyB3aWxsIGFwcGVhciB3aGVuIHRoZXkgc2F2ZSB0aGUgc3ByZWFkc2hlZXQKKyAgICAgICAgbXkgJGZpbGVuYW1lID0iY2dpdGVzdC54bHMiOworICAgIAorICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMjIFNlbmQgdGhlIGNvbnRlbnQgdHlwZSBoZWFkZXJzCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgcHJpbnQgIkNvbnRlbnQtZGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7ZmlsZW5hbWU9JGZpbGVuYW1lXG4iOworICAgICAgICBwcmludCAiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcblxuIjsKKyAgICAKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFRpZSBhIGZpbGVoYW5kbGUgdG8gQXBhY2hlJ3MgU1RET1VULgorICAgICAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0LgorICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIHRpZSAqWExTID0+ICdBcGFjaGUnOworICAgICAgICBiaW5tb2RlKCpYTFMpOworICAgIAorICAgICAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAgICAgIyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmb3IgY29sdW1uIDEKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCAyMCk7CisgICAgCisgICAgCisgICAgICAgICMgQ3JlYXRlIGEgZm9ybWF0CisgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X3NpemUoMTUpOworICAgICAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAKKyAgICAKKyAgICAgICAgIyBXcml0ZSB0byB0aGUgd29ya2Jvb2sKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkhpIEV4Y2VsISIsICRmb3JtYXQpOworICAgIAorICAgICAgICAjIFlvdSBtdXN0IGNsb3NlIHRoZSB3b3JrYm9vayBmb3IgQ29udGVudC1kaXNwb3NpdGlvbgorICAgICAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIDE7CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL21vZF9wZXJsMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IG1vZF9wZXJsMi5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gc2VuZCBhbiBFeGNlbAorZmlsZSB0byBhIGJyb3dzZXIgdXNpbmcgbW9kX3BlcmwgMiBhbmQgQXBhY2hlLgorCitUaGlzIG1vZHVsZSB0aWVzICpYTFMgZGlyZWN0bHkgdG8gQXBhY2hlLCBhbmQgd2l0aCB0aGUgY29ycmVjdAorY29udGVudC1kaXNwb3NpdGlvbi90eXBlcyBpdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlCit0aGUgZmlsZSwgb3Igb3BlbiBpdCBhdCB0aGlzIGxvY2F0aW9uLgorCitUaGlzIHNjcmlwdCBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2dpLnBsIGV4YW1wbGUuCisKK0NoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgdG8gTVAyVGVzdC5wbS4KK0NoYW5nZSB0aGUgcGFja2FnZSBsb2NhdGlvbiB0byB3aGVyZSBldmVyIHlvdSBsb2NhdGUgdGhpcyBwYWNrYWdlLgorSW4gdGhlIGV4YW1wbGUgYmVsb3cgaXQgaXMgbG9jYXRlZCBpbiB0aGUgV3JpdGVFeGNlbCBkaXJlY3RvcnkuCisKK1lvdXIgaHR0cGQuY29uZiBlbnRyeSBmb3IgdGhpcyBtb2R1bGUsIHNob3VsZCB5b3UgY2hvb3NlIHRvIHVzZSBpdAorYXMgYSBzdGFuZCBhbG9uZSBhcHAsIHNob3VsZCBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKKworICAgIFBlcmxNb2R1bGUgQXBhY2hlMjo6UmVxdWVzdFJlYworICAgIFBlcmxNb2R1bGUgQVBSOjpUYWJsZQorICAgIFBlcmxNb2R1bGUgQXBhY2hlMjo6UmVxdWVzdElPCisKKyAgICA8TG9jYXRpb24gL3NwcmVhZHNoZWV0LXRlc3Q+CisgICAgICAgU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorICAgICAgIFBlcmxSZXNwb25zZUhhbmRsZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Ok1QMlRlc3QKKyAgICA8L0xvY2F0aW9uPgorCitUaGUgUGVybFJlc3BvbnNlSGFuZGxlciBtdXN0IG1hdGNoIHRoZSBwYWNrYWdlIG5hbWUgYmVsb3cuCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gc2VuZCBhbiBFeGNlbAorICAgICMgZmlsZSB0byBhIGJyb3dzZXIgdXNpbmcgbW9kX3BlcmwgMiBhbmQgQXBhY2hlLgorICAgICMKKyAgICAjIFRoaXMgbW9kdWxlIHRpZXMgKlhMUyBkaXJlY3RseSB0byBBcGFjaGUsIGFuZCB3aXRoIHRoZSBjb3JyZWN0CisgICAgIyBjb250ZW50LWRpc3Bvc2l0aW9uL3R5cGVzIGl0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUKKyAgICAjIHRoZSBmaWxlLCBvciBvcGVuIGl0IGF0IHRoaXMgbG9jYXRpb24uCisgICAgIworICAgICMgVGhpcyBzY3JpcHQgaXMgYSBtb2RpZmljYXRpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGNnaS5wbCBleGFtcGxlLgorICAgICMKKyAgICAjIENoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgdG8gTVAyVGVzdC5wbS4KKyAgICAjIENoYW5nZSB0aGUgcGFja2FnZSBsb2NhdGlvbiB0byB3aGVyZSBldmVyIHlvdSBsb2NhdGUgdGhpcyBwYWNrYWdlLgorICAgICMgSW4gdGhlIGV4YW1wbGUgYmVsb3cgaXQgaXMgbG9jYXRlZCBpbiB0aGUgV3JpdGVFeGNlbCBkaXJlY3RvcnkuCisgICAgIworICAgICMgWW91ciBodHRwZC5jb25mIGVudHJ5IGZvciB0aGlzIG1vZHVsZSwgc2hvdWxkIHlvdSBjaG9vc2UgdG8gdXNlIGl0CisgICAgIyBhcyBhIHN0YW5kIGFsb25lIGFwcCwgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgorICAgICMKKyAgICAjICAgICBQZXJsTW9kdWxlIEFwYWNoZTI6OlJlcXVlc3RSZWMKKyAgICAjICAgICBQZXJsTW9kdWxlIEFQUjo6VGFibGUKKyAgICAjICAgICBQZXJsTW9kdWxlIEFwYWNoZTI6OlJlcXVlc3RJTworICAgICMKKyAgICAjICAgICA8TG9jYXRpb24gL3NwcmVhZHNoZWV0LXRlc3Q+CisgICAgIyAgICAgICAgU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorICAgICMgICAgICAgIFBlcmxSZXNwb25zZUhhbmRsZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Ok1QMlRlc3QKKyAgICAjICAgICA8L0xvY2F0aW9uPgorICAgICMKKyAgICAjIFRoZSBQZXJsUmVzcG9uc2VIYW5kbGVyIG11c3QgbWF0Y2ggdGhlIHBhY2thZ2UgbmFtZSBiZWxvdy4KKyAgICAKKyAgICAjIEp1biAyMDA0LCBNYXRpc3NlIEVuemVyLCBtYXRpc3NlQG1hdGlzc2UubmV0ICAobW9kX3BlcmwgMiB2ZXJzaW9uKQorICAgICMgQXByIDIwMDEsIFRob21hcyBTdWxsaXZhbiwgd2VibWFzdGVyQDg2MC5vcmcKKyAgICAjIEZlYiAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAKKyAgICBwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpNUDJUZXN0OworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgUHJhZ21hIERlZmluaXRpb25zCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFJlcXVpcmVkIE1vZHVsZXMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICB1c2UgQXBhY2hlMjo6Q29uc3QgLWNvbXBpbGUgPT4gcXcoIDpjb21tb24gKTsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBNYWluIEFwcCBCb2R5CisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgc3ViIGhhbmRsZXIgeworICAgICAgICBteSgkcikgPSBAXzsgICMgQXBhY2hlIHJlcXVlc3Qgb2JqZWN0IGlzIHBhc3NlZCB0byBoYW5kbGVyIGluIG1vZF9wZXJsIDIKKyAgICAKKyAgICAgICAgIyBTZXQgdGhlIGZpbGVuYW1lIGFuZCBzZW5kIHRoZSBjb250ZW50IHR5cGUKKyAgICAgICAgIyBUaGlzIHdpbGwgYXBwZWFyIHdoZW4gdGhleSBzYXZlIHRoZSBzcHJlYWRzaGVldAorICAgICAgICBteSAkZmlsZW5hbWUgPSJtb2RfcGVybDJfdGVzdC54bHMiOworICAgIAorICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMjIFNlbmQgdGhlIGNvbnRlbnQgdHlwZSBoZWFkZXJzIHRoZSBtb2RfcGVybCAyIHdheQorICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICRyLT5oZWFkZXJzX291dC0+eydDb250ZW50LURpc3Bvc2l0aW9uJ30gPSAiYXR0YWNobWVudDtmaWxlbmFtZT0kZmlsZW5hbWUiOworICAgICAgICAkci0+Y29udGVudF90eXBlKCdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnKTsKKyAgICAKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFRpZSBhIGZpbGVoYW5kbGUgdG8gQXBhY2hlJ3MgU1RET1VULgorICAgICAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0LgorICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIHRpZSAqWExTID0+ICRyOyAgIyBUaGUgbW9kX3BlcmwgMiB3YXkuIFRpZSB0byB0aGUgQXBhY2hlOjpSZXF1ZXN0UmVjIG9iamVjdAorICAgICAgICBiaW5tb2RlKCpYTFMpOworICAgIAorICAgICAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAgICAgIyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmb3IgY29sdW1uIDEKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCAyMCk7CisgICAgCisgICAgCisgICAgICAgICMgQ3JlYXRlIGEgZm9ybWF0CisgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X3NpemUoMTUpOworICAgICAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAKKyAgICAKKyAgICAgICAgIyBXcml0ZSB0byB0aGUgd29ya2Jvb2sKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJ0hpIEV4Y2VsISBmcm9tICcgLiAkci0+aG9zdG5hbWUgLCAkZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBZb3UgbXVzdCBjbG9zZSB0aGUgd29ya2Jvb2sgZm9yIENvbnRlbnQtZGlzcG9zaXRpb24KKyAgICAgICAgJHdvcmtib29rLT5jbG9zZSgpOworICAgICAgICByZXR1cm4gQXBhY2hlMjo6Q29uc3Q6Ok9LOworICAgIH0KKyAgICAKKyAgICAxOworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tb2RfcGVybDIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBvdXRsaW5lLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZ2VuZXJhdGUgRXhjZWwgb3V0bGluZXMgYW5kCitncm91cGluZy4KKworCitFeGNlbCBhbGxvd3MgeW91IHRvIGdyb3VwIHJvd3Mgb3IgY29sdW1ucyBzbyB0aGF0IHRoZXkgY2FuIGJlIGhpZGRlbiBvcgorZGlzcGxheWVkIHdpdGggYSBzaW5nbGUgbW91c2UgY2xpY2suIFRoaXMgZmVhdHVyZSBpcyByZWZlcnJlZCB0byBhcyBvdXRsaW5lcy4KKworT3V0bGluZXMgY2FuIHJlZHVjZSBjb21wbGV4IGRhdGEgZG93biB0byBhIGZldyBzYWxpZW50IHN1Yi10b3RhbHMgb3IgCitzdW1tYXJpZXMuCisKK1RoaXMgZmVhdHVyZSBpcyBiZXN0IHZpZXdlZCBpbiBFeGNlbCBidXQgdGhlIGZvbGxvd2luZyBpcyBhbiBBU0NJSQorcmVwcmVzZW50YXRpb24gb2Ygd2hhdCBhIHdvcmtzaGVldCB3aXRoIHRocmVlIG91dGxpbmVzIG1pZ2h0IGxvb2sgbGlrZS4KK1Jvd3MgMy00IGFuZCByb3dzIDctOCBhcmUgZ3JvdXBlZCBhdCBsZXZlbCAyLiBSb3dzIDItOSBhcmUgZ3JvdXBlZCBhdAorbGV2ZWwgMS4gVGhlIGxpbmVzIGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBhcmUgY2FsbGVkIG91dGxpbmUgbGV2ZWwgYmFycy4KKworCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIF8gICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgIF8gIHwgMiB8ICAgQiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IHwgICB8IDMgfCAgKEMpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCB8ICAgfCA0IHwgIChEKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgLSAgIHwgNSB8ICAgRSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICBfICB8IDYgfCAgIEYgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCB8ICAgfCA3IHwgIChHKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgfCAgIHwgOCB8ICAoSCkgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IC0gICB8IDkgfCAgIEkgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgLSAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisKKworQ2xpY2tpbmcgdGhlIG1pbnVzIHNpZ24gb24gZWFjaCBvZiB0aGUgbGV2ZWwgMiBvdXRsaW5lcyB3aWxsIGNvbGxhcHNlIGFuZAoraGlkZSB0aGUgZGF0YSBhcyBzaG93biBpbiB0aGUgbmV4dCBmaWd1cmUuIFRoZSBtaW51cyBzaWduIGNoYW5nZXMgdG8gYSBwbHVzCitzaWduIHRvIGluZGljYXRlIHRoYXQgdGhlIGRhdGEgaW4gdGhlIG91dGxpbmUgaXMgaGlkZGVuLgorCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIF8gICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgICAgIHwgMiB8ICAgQiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICsgICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAgICAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgKyAgIHwgOSB8ICAgSSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICAtICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKworCitDbGlja2luZyBvbiB0aGUgbWludXMgc2lnbiBvbiB0aGUgbGV2ZWwgMSBvdXRsaW5lIHdpbGwgY29sbGFwc2UgdGhlIHJlbWFpbmluZworcm93cyBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgICsgICAgIHwgLiB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorCitTZWUgdGhlIG1haW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvb3V0bGluZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIG91dGxpbmUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZ2VuZXJhdGUgRXhjZWwgb3V0bGluZXMgYW5kCisgICAgIyBncm91cGluZy4KKyAgICAjCisgICAgIworICAgICMgRXhjZWwgYWxsb3dzIHlvdSB0byBncm91cCByb3dzIG9yIGNvbHVtbnMgc28gdGhhdCB0aGV5IGNhbiBiZSBoaWRkZW4gb3IKKyAgICAjIGRpc3BsYXllZCB3aXRoIGEgc2luZ2xlIG1vdXNlIGNsaWNrLiBUaGlzIGZlYXR1cmUgaXMgcmVmZXJyZWQgdG8gYXMgb3V0bGluZXMuCisgICAgIworICAgICMgT3V0bGluZXMgY2FuIHJlZHVjZSBjb21wbGV4IGRhdGEgZG93biB0byBhIGZldyBzYWxpZW50IHN1Yi10b3RhbHMgb3IgCisgICAgIyBzdW1tYXJpZXMuCisgICAgIworICAgICMgVGhpcyBmZWF0dXJlIGlzIGJlc3Qgdmlld2VkIGluIEV4Y2VsIGJ1dCB0aGUgZm9sbG93aW5nIGlzIGFuIEFTQ0lJCisgICAgIyByZXByZXNlbnRhdGlvbiBvZiB3aGF0IGEgd29ya3NoZWV0IHdpdGggdGhyZWUgb3V0bGluZXMgbWlnaHQgbG9vayBsaWtlLgorICAgICMgUm93cyAzLTQgYW5kIHJvd3MgNy04IGFyZSBncm91cGVkIGF0IGxldmVsIDIuIFJvd3MgMi05IGFyZSBncm91cGVkIGF0CisgICAgIyBsZXZlbCAxLiBUaGUgbGluZXMgYXQgdGhlIGxlZnQgaGFuZCBzaWRlIGFyZSBjYWxsZWQgb3V0bGluZSBsZXZlbCBiYXJzLgorICAgICMKKyAgICAjCisgICAgIyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgIyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICAgICAgIF8gICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgIF8gIHwgMiB8ICAgQiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8IHwgICB8IDMgfCAgKEMpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCB8ICAgfCA0IHwgIChEKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgLSAgIHwgNSB8ICAgRSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICBfICB8IDYgfCAgIEYgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCB8ICAgfCA3IHwgIChHKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgfCAgIHwgOCB8ICAoSCkgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8IC0gICB8IDkgfCAgIEkgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgLSAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisgICAgIworICAgICMKKyAgICAjIENsaWNraW5nIHRoZSBtaW51cyBzaWduIG9uIGVhY2ggb2YgdGhlIGxldmVsIDIgb3V0bGluZXMgd2lsbCBjb2xsYXBzZSBhbmQKKyAgICAjIGhpZGUgdGhlIGRhdGEgYXMgc2hvd24gaW4gdGhlIG5leHQgZmlndXJlLiBUaGUgbWludXMgc2lnbiBjaGFuZ2VzIHRvIGEgcGx1cworICAgICMgc2lnbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkYXRhIGluIHRoZSBvdXRsaW5lIGlzIGhpZGRlbi4KKyAgICAjCisgICAgIyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgIyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICAgICAgIF8gICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgICAgIHwgMiB8ICAgQiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICsgICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCAgICAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgKyAgIHwgOSB8ICAgSSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICAtICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKyAgICAjCisgICAgIworICAgICMgQ2xpY2tpbmcgb24gdGhlIG1pbnVzIHNpZ24gb24gdGhlIGxldmVsIDEgb3V0bGluZSB3aWxsIGNvbGxhcHNlIHRoZSByZW1haW5pbmcKKyAgICAjIHJvd3MgYXMgZm9sbG93czoKKyAgICAjCisgICAgIyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgIyAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICAgICAgICAgICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgICsgICAgIHwgLiB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorICAgICMKKyAgICAjIFNlZSB0aGUgbWFpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXByaWwgMjAwMywgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgc29tZSB3b3Jrc2hlZXRzCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdvdXRsaW5lLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdPdXRsaW5lZCBSb3dzJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0NvbGxhcHNlZCBSb3dzJyk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ091dGxpbmUgQ29sdW1ucycpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdPdXRsaW5lIGxldmVscycpOworICAgIAorICAgICMgQWRkIGEgZ2VuZXJhbCBmb3JtYXQKKyAgICBteSAkYm9sZCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChib2xkID0+IDEpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDE6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIHJvd3MuIEl0IGFsc28gaW5jbHVkZXMgU1VCVE9UQUwoKQorICAgICMgZnVuY3Rpb25zIHNvIHRoYXQgaXQgbG9va3MgbGlrZSB0aGUgdHlwZSBvZiBhdXRvbWF0aWMgb3V0bGluZXMgdGhhdCBhcmUKKyAgICAjIGdlbmVyYXRlZCB3aGVuIHlvdSB1c2UgdGhlIEV4Y2VsIERhdGEtPlN1YlRvdGFscyBtZW51IGl0ZW0uCisgICAgIworICAgIAorICAgIAorICAgICMgRm9yIG91dGxpbmVzIHRoZSBpbXBvcnRhbnQgcGFyYW1ldGVycyBhcmUgJGhpZGRlbiBhbmQgJGxldmVsLiBSb3dzIHdpdGggdGhlCisgICAgIyBzYW1lICRsZXZlbCBhcmUgZ3JvdXBlZCB0b2dldGhlci4gVGhlIGdyb3VwIHdpbGwgYmUgY29sbGFwc2VkIGlmICRoaWRkZW4gaXMKKyAgICAjIG5vbi16ZXJvLiAkaGVpZ2h0IGFuZCAkWEYgYXJlIGFzc2lnbmVkIGRlZmF1bHQgdmFsdWVzIGlmIHRoZXkgYXJlIHVuZGVmLgorICAgICMKKyAgICAjIFRoZSBzeW50YXggaXM6IHNldF9yb3coJHJvdywgJGhlaWdodCwgJFhGLCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgIworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDEsICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDIsICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDMsICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDQsICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDUsICB1bmRlZiwgdW5kZWYsIDAsIDEpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDYsICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDcsICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDgsICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDksICB1bmRlZiwgdW5kZWYsIDAsIDIpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDEwLCB1bmRlZiwgdW5kZWYsIDAsIDEpOworICAgIAorICAgIAorICAgICMgQWRkIGEgY29sdW1uIGZvcm1hdCBmb3IgY2xhcml0eQorICAgICR3b3Jrc2hlZXQxLT5zZXRfY29sdW1uKCdBOkEnLCAyMCk7CisgICAgCisgICAgIyBBZGQgdGhlIGRhdGEsIGxhYmVscyBhbmQgZm9ybXVsYXMKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExJywgICdSZWdpb24nLCAkYm9sZCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMicsICAnTm9ydGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0EzJywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTQnLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNScsICAnTm9ydGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E2JywgICdOb3J0aCBUb3RhbCcsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IxJywgICdTYWxlcycsICAkYm9sZCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMicsICAxMDAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IzJywgIDEyMDApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjQnLCAgOTAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I1JywgIDEyMDApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjYnLCAgJz1TVUJUT1RBTCg5LEIyOkI1KScsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E3JywgICdTb3V0aCcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTgnLCAgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBOScsICAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExMCcsICdTb3V0aCcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTExJywgJ1NvdXRoIFRvdGFsJywgJGJvbGQpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjcnLCAgNDAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I4JywgIDYwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCOScsICA1MDApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjEwJywgNjAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IxMScsICc9U1VCVE9UQUwoOSxCNzpCMTApJywgJGJvbGQpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTEyJywgJ0dyYW5kIFRvdGFsJywgJGJvbGQpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjEyJywgJz1TVUJUT1RBTCg5LEIyOkIxMCknLCAkYm9sZCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMjogQ3JlYXRlIGEgd29ya3NoZWV0IHdpdGggb3V0bGluZWQgcm93cy4gVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUKKyAgICAjIHByZXZpb3VzIGV4YW1wbGUgZXhjZXB0IHRoYXQgdGhlIHJvd3MgYXJlIGNvbGxhcHNlZC4KKyAgICAjIE5vdGU6IFdlIG5lZWQgdG8gaW5kaWNhdGUgdGhlIHJvdyB0aGF0IGNvbnRhaW5zIHRoZSBjb2xsYXBzZWQgc3ltYm9sICcrJworICAgICMgd2l0aCB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyLCAkY29sbGFwc2VkLgorICAgIAorICAgICMgVGhlIGdyb3VwIHdpbGwgYmUgY29sbGFwc2VkIGlmICRoaWRkZW4gaXMgbm9uLXplcm8uCisgICAgIyBUaGUgc3ludGF4IGlzOiBzZXRfcm93KCRyb3csICRoZWlnaHQsICRYRiwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorICAgICMKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygxLCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygyLCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygzLCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg0LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg1LCAgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg2LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg3LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg4LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg5LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygxMCwgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygxMSwgdW5kZWYsIHVuZGVmLCAwLCAwLCAxKTsKKyAgICAKKyAgICAKKyAgICAjIEFkZCBhIGNvbHVtbiBmb3JtYXQgZm9yIGNsYXJpdHkKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2NvbHVtbignQTpBJywgMjApOworICAgIAorICAgICMgQWRkIHRoZSBkYXRhLCBsYWJlbHMgYW5kIGZvcm11bGFzCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMScsICAnUmVnaW9uJywgJGJvbGQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTInLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMycsICAnTm9ydGgnKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E0JywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTUnLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBNicsICAnTm9ydGggVG90YWwnLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMScsICAnU2FsZXMnLCAgJGJvbGQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjInLCAgMTAwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMycsICAxMjAwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I0JywgIDkwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNScsICAxMjAwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I2JywgICc9U1VCVE9UQUwoOSxCMjpCNSknLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBNycsICAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E4JywgICdTb3V0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTknLCAgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMTAnLCAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0ExMScsICdTb3V0aCBUb3RhbCcsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I3JywgIDQwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCOCcsICA2MDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjknLCAgNTAwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IxMCcsIDYwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMTEnLCAnPVNVQlRPVEFMKDksQjc6QjEwKScsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0ExMicsICdHcmFuZCBUb3RhbCcsICRib2xkKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IxMicsICc9U1VCVE9UQUwoOSxCMjpCMTApJywgJGJvbGQpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDM6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIGNvbHVtbnMuCisgICAgIworICAgIG15ICRkYXRhID0gWworICAgICAgICAgICAgICAgIFsnTW9udGgnLCAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCcgVG90YWwnXSwKKyAgICAgICAgICAgICAgICBbJ05vcnRoJywgNTAsICAgIDIwLCAgICAxNSwgICAgMjUsICAgIDY1LCAgICA4MCwgICAgLCc9U1VNKEIyOkcyKSddLAorICAgICAgICAgICAgICAgIFsnU291dGgnLCAxMCwgICAgMjAsICAgIDMwLCAgICA1MCwgICAgNTAsICAgIDUwLCAgICAsJz1TVU0oQjM6RzMpJ10sCisgICAgICAgICAgICAgICAgWydFYXN0JywgIDQ1LCAgICA3NSwgICAgNTAsICAgIDE1LCAgICA3NSwgICAgMTAwLCAgICwnPVNVTShCNDpHNCknXSwKKyAgICAgICAgICAgICAgICBbJ1dlc3QnLCAgMTUsICAgIDE1LCAgICA1NSwgICAgMzUsICAgIDIwLCAgICA1MCwgICAgLCc9U1VNKEI1Okc2KSddLAorICAgICAgICAgICAgICAgXTsKKyAgICAKKyAgICAjIEFkZCBib2xkIGZvcm1hdCB0byB0aGUgZmlyc3Qgcm93CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coMCwgdW5kZWYsICRib2xkKTsKKyAgICAKKyAgICAjIFN5bnRheDogc2V0X2NvbHVtbigkY29sMSwgJGNvbDIsICR3aWR0aCwgJFhGLCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgJHdvcmtzaGVldDMtPnNldF9jb2x1bW4oJ0E6QScsIDEwLCAkYm9sZCAgICAgICk7CisgICAgJHdvcmtzaGVldDMtPnNldF9jb2x1bW4oJ0I6RycsIDUsICB1bmRlZiwgMCwgMSk7CisgICAgJHdvcmtzaGVldDMtPnNldF9jb2x1bW4oJ0g6SCcsIDEwKTsKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBkYXRhIGFuZCBhIGZvcm11bGEKKyAgICAkd29ya3NoZWV0My0+d3JpdGVfY29sKCdBMScsICRkYXRhKTsKKyAgICAkd29ya3NoZWV0My0+d3JpdGUoJ0g2JywgJz1TVU0oSDI6SDUpJywgJGJvbGQpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQ6IFNob3cgYWxsIHBvc3NpYmxlIG91dGxpbmUgbGV2ZWxzLgorICAgICMKKyAgICBteSAkbGV2ZWxzID0gWyJMZXZlbCAxIiwgIkxldmVsIDIiLCAiTGV2ZWwgMyIsICJMZXZlbCA0IiwKKyAgICAgICAgICAgICAgICAgICJMZXZlbCA1IiwgIkxldmVsIDYiLCAiTGV2ZWwgNyIsICJMZXZlbCA2IiwKKyAgICAgICAgICAgICAgICAgICJMZXZlbCA1IiwgIkxldmVsIDQiLCAiTGV2ZWwgMyIsICJMZXZlbCAyIiwgIkxldmVsIDEiXTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGVfY29sKCdBMScsICRsZXZlbHMpOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDAsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCAxKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygxLCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDMpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDMsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCA0KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg0LCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNSk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDYpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDYsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCA3KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg3LCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDUpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDksICB1bmRlZiwgdW5kZWYsIHVuZGVmLCA0KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygxMCwgdW5kZWYsIHVuZGVmLCB1bmRlZiwgMyk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMTEsIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDEyLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCAxKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL291dGxpbmUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBvdXRsaW5lX2NvbGxhcHNlZC5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIGdlbmVyYXRlIEV4Y2VsIG91dGxpbmVzIGFuZAorZ3JvdXBpbmcuCisKK1RoZXNlIGV4YW1wbGUgZm9jdXMgbWFpbmx5IG9uIGNvbGxhcHNlZCBvdXRsaW5lcy4gU2VlIGFsc28gdGhlCitvdXRsaW5lcy5wbCBleGFtcGxlIHByb2dyYW0gZm9yIG1vcmUgZ2VuZXJhbCBleGFtcGxlcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvb3V0bGluZV9jb2xsYXBzZWQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBvdXRsaW5lX2NvbGxhcHNlZC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byBnZW5lcmF0ZSBFeGNlbCBvdXRsaW5lcyBhbmQKKyAgICAjIGdyb3VwaW5nLgorICAgICMKKyAgICAjIFRoZXNlIGV4YW1wbGUgZm9jdXMgbWFpbmx5IG9uIGNvbGxhcHNlZCBvdXRsaW5lcy4gU2VlIGFsc28gdGhlCisgICAgIyBvdXRsaW5lcy5wbCBleGFtcGxlIHByb2dyYW0gZm9yIG1vcmUgZ2VuZXJhbCBleGFtcGxlcy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDgsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIHNvbWUgd29ya3NoZWV0cworICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnb3V0bGluZV9jb2xsYXBzZWQueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ091dGxpbmVkIFJvd3MnKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQ29sbGFwc2VkIFJvd3MgMScpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdDb2xsYXBzZWQgUm93cyAyJyk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0NvbGxhcHNlZCBSb3dzIDMnKTsKKyAgICBteSAkd29ya3NoZWV0NSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnT3V0bGluZSBDb2x1bW5zJyk7CisgICAgbXkgJHdvcmtzaGVldDYgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0NvbGxhcHNlZCBDb2x1bW5zJyk7CisgICAgCisgICAgCisgICAgIyBBZGQgYSBnZW5lcmFsIGZvcm1hdAorICAgIG15ICRib2xkID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGJvbGQgPT4gMSk7CisgICAgCisgICAgCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlIHRoZSBzYW1lIGRhdGEgYW5kIHN1Yi10b3RhbHMgb24gZWFjaCB3b3Jrc2hlZXQuCisgICAgIworICAgIHN1YiBjcmVhdGVfc3ViX3RvdGFscyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkX1swXTsKKyAgICAKKyAgICAgICAgIyBBZGQgYSBjb2x1bW4gZm9ybWF0IGZvciBjbGFyaXR5CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDIwKTsKKyAgICAKKyAgICAgICAgIyBBZGQgdGhlIGRhdGEsIGxhYmVscyBhbmQgZm9ybXVsYXMKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgICdSZWdpb24nLCAkYm9sZCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICAnTm9ydGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgICdOb3J0aCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAgJ05vcnRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICAnTm9ydGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgICdOb3J0aCBUb3RhbCcsICRib2xkKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgICdTYWxlcycsICAkYm9sZCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMicsICAxMDAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IzJywgIDEyMDApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjQnLCAgOTAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I1JywgIDEyMDApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjYnLCAgJz1TVUJUT1RBTCg5LEIyOkI1KScsICRib2xkKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E3JywgICdTb3V0aCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTgnLCAgJ1NvdXRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOScsICAnU291dGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMCcsICdTb3V0aCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTExJywgJ1NvdXRoIFRvdGFsJywgJGJvbGQpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjcnLCAgNDAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I4JywgIDYwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOScsICA1MDApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjEwJywgNjAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxMScsICc9U1VCVE9UQUwoOSxCNzpCMTApJywgJGJvbGQpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEyJywgJ0dyYW5kIFRvdGFsJywgJGJvbGQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjEyJywgJz1TVUJUT1RBTCg5LEIyOkIxMCknLCAkYm9sZCk7CisgICAgCisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDE6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIHJvd3MuIEl0IGFsc28gaW5jbHVkZXMgU1VCVE9UQUwoKQorICAgICMgZnVuY3Rpb25zIHNvIHRoYXQgaXQgbG9va3MgbGlrZSB0aGUgdHlwZSBvZiBhdXRvbWF0aWMgb3V0bGluZXMgdGhhdCBhcmUKKyAgICAjIGdlbmVyYXRlZCB3aGVuIHlvdSB1c2UgdGhlIEV4Y2VsIERhdGEtPlN1YlRvdGFscyBtZW51IGl0ZW0uCisgICAgIworICAgIAorICAgICMgVGhlIHN5bnRheCBpczogc2V0X3Jvdygkcm93LCAkaGVpZ2h0LCAkWEYsICRoaWRkZW4sICRsZXZlbCwgJGNvbGxhcHNlZCkKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygxLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygyLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygzLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg0LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg1LCAgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg2LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg3LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg4LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg5LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygxMCwgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBzdWItdG90YWwgZGF0YSB0aGF0IGlzIGNvbW1vbiB0byB0aGUgcm93IGV4YW1wbGVzLgorICAgIGNyZWF0ZV9zdWJfdG90YWxzKCR3b3Jrc2hlZXQxKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBjb2xsYXBzZWQgb3V0bGluZWQgcm93cy4KKyAgICAjIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGV4YW1wbGUgMSAgZXhjZXB0IHRoYXQgdGhlIGFsbCByb3dzIGFyZSBjb2xsYXBzZWQuCisgICAgIyBOb3RlOiBXZSBuZWVkIHRvIGluZGljYXRlIHRoZSByb3cgdGhhdCBjb250YWlucyB0aGUgY29sbGFwc2VkIHN5bWJvbCAnKycgd2l0aAorICAgICMgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciwgJGNvbGxhcHNlZC4KKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygxLCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygyLCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygzLCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg0LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg1LCAgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg2LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg3LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg4LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3Jvdyg5LCAgdW5kZWYsIHVuZGVmLCAxLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygxMCwgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygxMSwgdW5kZWYsIHVuZGVmLCAwLCAwLCAxKTsKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBzdWItdG90YWwgZGF0YSB0aGF0IGlzIGNvbW1vbiB0byB0aGUgcm93IGV4YW1wbGVzLgorICAgIGNyZWF0ZV9zdWJfdG90YWxzKCR3b3Jrc2hlZXQyKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBjb2xsYXBzZWQgb3V0bGluZWQgcm93cy4KKyAgICAjIFNhbWUgYXMgdGhlIGV4YW1wbGUgMSAgZXhjZXB0IHRoYXQgdGhlIHR3byBzdWItdG90YWxzIGFyZSBjb2xsYXBzZWQuCisgICAgCisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMCwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMCwgMSwgMSk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgc3ViLXRvdGFsIGRhdGEgdGhhdCBpcyBjb21tb24gdG8gdGhlIHJvdyBleGFtcGxlcy4KKyAgICBjcmVhdGVfc3ViX3RvdGFscygkd29ya3NoZWV0Myk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNDogQ3JlYXRlIGEgd29ya3NoZWV0IHdpdGggb3V0bGluZWQgcm93cy4KKyAgICAjIFNhbWUgYXMgdGhlIGV4YW1wbGUgMSAgZXhjZXB0IHRoYXQgdGhlIHR3byBzdWItdG90YWxzIGFyZSBjb2xsYXBzZWQuCisgICAgCisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMSwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMSwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMTEsIHVuZGVmLCB1bmRlZiwgMCwgMCwgMSk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgc3ViLXRvdGFsIGRhdGEgdGhhdCBpcyBjb21tb24gdG8gdGhlIHJvdyBleGFtcGxlcy4KKyAgICBjcmVhdGVfc3ViX3RvdGFscygkd29ya3NoZWV0NCk7CisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNTogQ3JlYXRlIGEgd29ya3NoZWV0IHdpdGggb3V0bGluZWQgY29sdW1ucy4KKyAgICAjCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgICAgICAgICAgWydNb250aCcsICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsJyBUb3RhbCddLAorICAgICAgICAgICAgICAgIFsnTm9ydGgnLCA1MCwgICAgMjAsICAgIDE1LCAgICAyNSwgICAgNjUsICAgIDgwLCAgICAsJz1TVU0oQjI6RzIpJ10sCisgICAgICAgICAgICAgICAgWydTb3V0aCcsIDEwLCAgICAyMCwgICAgMzAsICAgIDUwLCAgICA1MCwgICAgNTAsICAgICwnPVNVTShCMzpHMyknXSwKKyAgICAgICAgICAgICAgICBbJ0Vhc3QnLCAgNDUsICAgIDc1LCAgICA1MCwgICAgMTUsICAgIDc1LCAgICAxMDAsICAgLCc9U1VNKEI0Okc0KSddLAorICAgICAgICAgICAgICAgIFsnV2VzdCcsICAxNSwgICAgMTUsICAgIDU1LCAgICAzNSwgICAgMjAsICAgIDUwLCAgICAsJz1TVU0oQjU6RzYpJ10sCisgICAgICAgICAgICAgICBdOworICAgIAorICAgICMgQWRkIGJvbGQgZm9ybWF0IHRvIHRoZSBmaXJzdCByb3cKKyAgICAkd29ya3NoZWV0NS0+c2V0X3JvdygwLCB1bmRlZiwgJGJvbGQpOworICAgIAorICAgICMgU3ludGF4OiBzZXRfY29sdW1uKCRjb2wxLCAkY29sMiwgJHdpZHRoLCAkWEYsICRoaWRkZW4sICRsZXZlbCwgJGNvbGxhcHNlZCkKKyAgICAkd29ya3NoZWV0NS0+c2V0X2NvbHVtbignQTpBJywgMTAsICRib2xkICAgICAgKTsKKyAgICAkd29ya3NoZWV0NS0+c2V0X2NvbHVtbignQjpHJywgNSwgIHVuZGVmLCAwLCAxKTsKKyAgICAkd29ya3NoZWV0NS0+c2V0X2NvbHVtbignSDpIJywgMTAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBkYXRhIGFuZCBhIGZvcm11bGEKKyAgICAkd29ya3NoZWV0NS0+d3JpdGVfY29sKCdBMScsICRkYXRhKTsKKyAgICAkd29ya3NoZWV0NS0+d3JpdGUoJ0g2JywgJz1TVU0oSDI6SDUpJywgJGJvbGQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDY6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIGNvbGxhcHNlZCBvdXRsaW5lZCBjb2x1bW5zLgorICAgICMgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSBleGNlcHQgY29sbGFwc2VkIGNvbHVtbnMuCisgICAgCisgICAgIyBBZGQgYm9sZCBmb3JtYXQgdG8gdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQ2LT5zZXRfcm93KDAsIHVuZGVmLCAkYm9sZCk7CisgICAgCisgICAgIyBTeW50YXg6IHNldF9jb2x1bW4oJGNvbDEsICRjb2wyLCAkd2lkdGgsICRYRiwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorICAgICR3b3Jrc2hlZXQ2LT5zZXRfY29sdW1uKCdBOkEnLCAxMCwgJGJvbGQgICAgICAgICApOworICAgICR3b3Jrc2hlZXQ2LT5zZXRfY29sdW1uKCdCOkcnLCA1LCAgdW5kZWYsIDEsIDEgICApOworICAgICR3b3Jrc2hlZXQ2LT5zZXRfY29sdW1uKCdIOkgnLCAxMCwgdW5kZWYsIDAsIDAsIDEpOworICAgIAorICAgICMgV3JpdGUgdGhlIGRhdGEgYW5kIGEgZm9ybXVsYQorICAgICR3b3Jrc2hlZXQ2LT53cml0ZV9jb2woJ0ExJywgJGRhdGEpOworICAgICR3b3Jrc2hlZXQ2LT53cml0ZSgnSDYnLCAnPVNVTShIMjpINSknLCAkYm9sZCk7CisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9vdXRsaW5lX2NvbGxhcHNlZC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHBhbmVzLnBsCisKKworCitFeGFtcGxlIG9mIHVzaW5nIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZSB0byBjcmVhdGUgd29ya3NoZWV0IHBhbmVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9wYW5lcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHBhbmVzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgdXNpbmcgdGhlIFdyaXRlRXhjZWwgbW9kdWxlIHRvIGNyZWF0ZSB3b3Jrc2hlZXQgcGFuZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJwYW5lcy54bHMiKTsKKyAgICAKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnUGFuZXMgMScpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdQYW5lcyAyJyk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1BhbmVzIDMnKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnUGFuZXMgNCcpOworICAgIAorICAgICMgRnJlZXplIHBhbmVzCisgICAgJHdvcmtzaGVldDEtPmZyZWV6ZV9wYW5lcygxLCAwKTsgIyAxIHJvdworICAgIAorICAgICR3b3Jrc2hlZXQyLT5mcmVlemVfcGFuZXMoMCwgMSk7ICMgMSBjb2x1bW4KKyAgICAkd29ya3NoZWV0My0+ZnJlZXplX3BhbmVzKDEsIDEpOyAjIDEgcm93IGFuZCBjb2x1bW4KKyAgICAKKyAgICAjIFNwbGl0IHBhbmVzLgorICAgICMgVGhlIGRpdmlzaW9ucyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiByb3cgYW5kIGNvbHVtbiBkaW1lbnNpb25zLgorICAgICMgVGhlIGRlZmF1bHQgcm93IGhlaWdodCBpcyAxMi43NSBhbmQgdGhlIGRlZmF1bHQgY29sdW1uIHdpZHRoIGlzIDguNDMKKyAgICAjCisgICAgJHdvcmtzaGVldDQtPnNwbGl0X3BhbmVzKDEyLjc1LCA4LjQzLCAxLCAxKTsgIyAxIHJvdyBhbmQgY29sdW1uCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTZXQgdXAgc29tZSBmb3JtYXR0aW5nIGFuZCB0ZXh0IHRvIGhpZ2hsaWdodCB0aGUgcGFuZXMKKyAgICAjCisgICAgCisgICAgbXkgJGhlYWRlciA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoZWFkZXItPnNldF9jb2xvcignd2hpdGUnKTsKKyAgICAkaGVhZGVyLT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgICRoZWFkZXItPnNldF9hbGlnbigndmNlbnRlcicpOworICAgICRoZWFkZXItPnNldF9wYXR0ZXJuKCk7CisgICAgJGhlYWRlci0+c2V0X2ZnX2NvbG9yKCdncmVlbicpOworICAgIAorICAgIG15ICRjZW50ZXIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkY2VudGVyLT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2hlZXQgMQorICAgICMKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQTpJJywgMTYpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDAsIDIwKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3NlbGVjdGlvbignQzMnKTsKKyAgICAKKyAgICBmb3IgbXkgJGkgKDAuLjgpeworICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgJGksICdTY3JvbGwgZG93bicsICRoZWFkZXIpOworICAgIH0KKyAgICAKKyAgICBmb3IgbXkgJGkgKDEuLjEwMCl7CisgICAgICAgIGZvciBteSAkaiAoMC4uOCl7CisgICAgICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUoJGksICRqLCAkaSsxLCAkY2VudGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNoZWV0IDIKKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9jb2x1bW4oJ0E6QScsIDE2KTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3NlbGVjdGlvbignQzMnKTsKKyAgICAKKyAgICBmb3IgbXkgJGkgKDAuLjQ5KXsKKyAgICAgICAgJHdvcmtzaGVldDItPnNldF9yb3coJGksIDE1KTsKKyAgICAgICAgJHdvcmtzaGVldDItPndyaXRlKCRpLCAwLCAnU2Nyb2xsIHJpZ2h0JywgJGhlYWRlcik7CisgICAgfQorICAgIAorICAgIGZvciBteSAkaSAoMC4uNDkpeworICAgICAgICBmb3IgbXkgJGogKDEuLjI1KXsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQyLT53cml0ZSgkaSwgJGosICRqLCAkY2VudGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNoZWV0IDMKKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDMtPnNldF9jb2x1bW4oJ0E6WicsIDE2KTsKKyAgICAkd29ya3NoZWV0My0+c2V0X3NlbGVjdGlvbignQzMnKTsKKyAgICAKKyAgICBmb3IgbXkgJGkgKDEuLjI1KXsKKyAgICAgICAgJHdvcmtzaGVldDMtPndyaXRlKDAsICRpLCAnU2Nyb2xsIGRvd24nLCAgJGhlYWRlcik7CisgICAgfQorICAgIAorICAgIGZvciBteSAkaSAoMS4uNDkpeworICAgICAgICAkd29ya3NoZWV0My0+d3JpdGUoJGksIDAsICdTY3JvbGwgcmlnaHQnLCAkaGVhZGVyKTsKKyAgICB9CisgICAgCisgICAgZm9yIG15ICRpICgxLi40OSl7CisgICAgICAgIGZvciBteSAkaiAoMS4uMjUpeworICAgICAgICAgICAgJHdvcmtzaGVldDMtPndyaXRlKCRpLCAkaiwgJGosICRjZW50ZXIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2hlZXQgNAorICAgICMKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+c2V0X3NlbGVjdGlvbignQzMnKTsKKyAgICAKKyAgICBmb3IgbXkgJGkgKDEuLjI1KXsKKyAgICAgICAgJHdvcmtzaGVldDQtPndyaXRlKDAsICRpLCAnU2Nyb2xsJywgJGNlbnRlcik7CisgICAgfQorICAgIAorICAgIGZvciBteSAkaSAoMS4uNDkpeworICAgICAgICAkd29ya3NoZWV0NC0+d3JpdGUoJGksIDAsICdTY3JvbGwnLCAkY2VudGVyKTsKKyAgICB9CisgICAgCisgICAgZm9yIG15ICRpICgxLi40OSl7CisgICAgICAgIGZvciBteSAkaiAoMS4uMjUpeworICAgICAgICAgICAgJHdvcmtzaGVldDQtPndyaXRlKCRpLCAkaiwgJGosICRjZW50ZXIpOworICAgICAgICB9CisgICAgfQorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9wYW5lcy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHByb3BlcnRpZXMucGwKKworCisKK0FuIGV4YW1wbGUgb2YgYWRkaW5nIGRvY3VtZW50IHByb3BlcnRpZXMgdG8gYSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBmaWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9wcm9wZXJ0aWVzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gcHJvcGVydGllcy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQW4gZXhhbXBsZSBvZiBhZGRpbmcgZG9jdW1lbnQgcHJvcGVydGllcyB0byBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwOCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdwcm9wZXJ0aWVzLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAkd29ya2Jvb2stPnNldF9wcm9wZXJ0aWVzKAorICAgICAgICB0aXRsZSAgICA9PiAnVGhpcyBpcyBhbiBleGFtcGxlIHNwcmVhZHNoZWV0JywKKyAgICAgICAgc3ViamVjdCAgPT4gJ1dpdGggZG9jdW1lbnQgcHJvcGVydGllcycsCisgICAgICAgIGF1dGhvciAgID0+ICdKb2huIE1jTmFtYXJhJywKKyAgICAgICAgbWFuYWdlciAgPT4gJ0RyLiBIZWlueiBEb29mZW5zaG1pcnR6ICcsCisgICAgICAgIGNvbXBhbnkgID0+ICdvZiBXb2x2ZXMnLAorICAgICAgICBjYXRlZ29yeSA9PiAnRXhhbXBsZSBzcHJlYWRzaGVldHMnLAorICAgICAgICBrZXl3b3JkcyA9PiAnU2FtcGxlLCBFeGFtcGxlLCBQcm9wZXJ0aWVzJywKKyAgICAgICAgY29tbWVudHMgPT4gJ0NyZWF0ZWQgd2l0aCBQZXJsIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCcsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ1NlbGVjdCBGaWxlLT5Qcm9wZXJ0aWVzIHRvIHNlZSB0aGUgZmlsZSBwcm9wZXJ0aWVzJyk7CisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9wcm9wZXJ0aWVzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogcHJvdGVjdGlvbi5wbAorCisKKworRXhhbXBsZSBvZiBjZWxsIGxvY2tpbmcgYW5kIGZvcm11bGEgaGlkaW5nIGluIGFuIEV4Y2VsIHdvcmtzaGVldCB2aWEKK3RoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3Byb3RlY3Rpb24uanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBwcm90ZWN0aW9uLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGNlbGwgbG9ja2luZyBhbmQgZm9ybXVsYSBoaWRpbmcgaW4gYW4gRXhjZWwgd29ya3NoZWV0IHZpYQorICAgICMgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEF1Z3VzdCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInByb3RlY3Rpb24ueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgQ3JlYXRlIHNvbWUgZm9ybWF0IG9iamVjdHMKKyAgICBteSAkbG9ja2VkICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGxvY2tlZCA9PiAxKTsKKyAgICBteSAkdW5sb2NrZWQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGxvY2tlZCA9PiAwKTsKKyAgICBteSAkaGlkZGVuICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGhpZGRlbiA9PiAxKTsKKyAgICAKKyAgICAjIEZvcm1hdCB0aGUgY29sdW1ucworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDQyKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfc2VsZWN0aW9uKCdCMzpCMycpOworICAgIAorICAgICMgUHJvdGVjdCB0aGUgd29ya3NoZWV0CisgICAgJHdvcmtzaGVldC0+cHJvdGVjdCgpOworICAgIAorICAgICMgRXhhbXBsZXMgb2YgY2VsbCBsb2NraW5nIGFuZCBoaWRpbmcKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnQ2VsbCBCMSBpcyBsb2NrZWQuIEl0IGNhbm5vdCBiZSBlZGl0ZWQuJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJz0xKzInLCAkbG9ja2VkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAnQ2VsbCBCMiBpcyB1bmxvY2tlZC4gSXQgY2FuIGJlIGVkaXRlZC4nKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjInLCAnPTErMicsICR1bmxvY2tlZCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgIkNlbGwgQjMgaXMgaGlkZGVuLiBUaGUgZm9ybXVsYSBpc24ndCB2aXNpYmxlLiIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMycsICc9MSsyJywgJGhpZGRlbik7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E1JywgJ1VzZSBNZW51LT5Ub29scy0+UHJvdGVjdGlvbi0+VW5wcm90ZWN0IFNoZWV0Jyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgJ3RvIHJlbW92ZSB0aGUgd29ya3NoZWV0IHByb3RlY3Rpb24uICAgJyk7CisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3Byb3RlY3Rpb24ucGw+CisKKz1oZWFkMiBFeGFtcGxlOiByZXBlYXQucGwKKworCisKK0V4YW1wbGUgb2Ygd3JpdGluZyByZXBlYXRlZCBmb3JtdWxhcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcmVwZWF0LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gcmVwZWF0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiB3cml0aW5nIHJlcGVhdGVkIGZvcm11bGFzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygicmVwZWF0LnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICBteSAkbGltaXQgPSAxMDAwOworICAgIAorICAgICMgV3JpdGUgYSBjb2x1bW4gb2YgbnVtYmVycworICAgIGZvciBteSAkcm93ICgwLi4kbGltaXQpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgICRyb3cpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFN0b3JlIGEgZm9ybXVsYQorICAgIG15ICRmb3JtdWxhID0gJHdvcmtzaGVldC0+c3RvcmVfZm9ybXVsYSgnPUExKjUrNCcpOworICAgIAorICAgIAorICAgICMgV3JpdGUgYSBjb2x1bW4gb2YgZm9ybXVsYXMgYmFzZWQgb24gdGhlIHN0b3JlZCBmb3JtdWxhCisgICAgZm9yIG15ICRyb3cgKDAuLiRsaW1pdCkgeworICAgICAgICAkd29ya3NoZWV0LT5yZXBlYXRfZm9ybXVsYSgkcm93LCAxLCAkZm9ybXVsYSwgdW5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyL15BMSQvLCAnQScuKCRyb3crMSkpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIERpcmVjdCBmb3JtdWxhIHdyaXRpbmcuIEFzIGEgc3BlZWQgY29tcGFyaXNvbiB1bmNvbW1lbnQgdGhlCisgICAgIyBmb2xsb3dpbmcgYW5kIHJ1biB0aGUgcHJvZ3JhbSBhZ2FpbgorICAgIAorICAgICNmb3IgbXkgJHJvdyAoMC4uJGxpbWl0KSB7CisgICAgIyAgICAkd29ya3NoZWV0LT53cml0ZV9mb3JtdWxhKCRyb3csIDIsICc9QScuKCRyb3crMSkuJyo1KzQnKTsKKyAgICAjfQorICAgIAorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcmVwZWF0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogcmlnaHRfdG9fbGVmdC5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHdvcmtzaGVldCBkaXJlY3Rpb24gZnJvbQorbGVmdC10by1yaWdodCB0byByaWdodC10by1sZWZ0IGFzIHJlcXVpcmVkIGJ5IHNvbWUgZWFzdGVybiB2ZXJpb25zCitvZiBFeGNlbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcmlnaHRfdG9fbGVmdC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHJpZ2h0X3RvX2xlZnQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHdvcmtzaGVldCBkaXJlY3Rpb24gZnJvbQorICAgICMgbGVmdC10by1yaWdodCB0byByaWdodC10by1sZWZ0IGFzIHJlcXVpcmVkIGJ5IHNvbWUgZWFzdGVybiB2ZXJpb25zCisgICAgIyBvZiBFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEphbnVhcnkgMjAwNiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygicmlnaHRfdG9fbGVmdC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPnJpZ2h0X3RvX2xlZnQoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMCwgJ0hlbGxvJyk7ICMgIEExLCBCMSwgQzEsIC4uLgorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgwLCAwLCAnSGVsbG8nKTsgIyAuLi4sIEMxLCBCMSwgQTEKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcmlnaHRfdG9fbGVmdC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHJvd193cmFwLnBsCisKKworCitEZW1vbnN0cmF0ZXMgaG93IHRvIHdyYXAgZGF0YSBmcm9tIG9uZSB3b3Jrc2hlZXQgb250byBhbm90aGVyLgorCitFeGNlbCBoYXMgYSByb3cgbGltaXQgb2YgNjU1MzYgcm93cy4gU29tZXRpbWVzIHRoZSBhbW91bnQgb2Ygcm93IGRhdGEgdG8gYmUKK3dyaXR0ZW4gdG8gYSBmaWxlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGxpbWl0LiBJbiB0aGlzIGNhc2UgaXQgaXMgYSB1c2VmdWwKK3RlY2huaXF1ZSB0byB3cmFwIHRoZSBkYXRhIGZyb20gb25lIHdvcmtzaGVldCBvbnRvIHRoZSBuZXh0IHNvIHRoYXQgd2UgZ2V0Citzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgIFNoZWV0MSAgUm93ICAgICAxICAtICA2NTUzNgorICBTaGVldDIgIFJvdyA2NTUzNyAgLSAxMzEwNzIKKyAgU2hlZXQzICBSb3cgMTMxMDczIC0gLi4uCisKK0luIG9yZGVyIHRvIGFjaGlldmUgdGhpcyB3ZSB1c2UgYSBzaW5nbGUgd29ya3NoZWV0IHJlZmVyZW5jZSBhbmQKK3JlaW5pdGlhbGlzZSBpdCB0byBwb2ludCB0byBhIG5ldyB3b3Jrc2hlZXQgd2hlbiByZXF1aXJlZC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcm93X3dyYXAuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSByb3dfd3JhcC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGVzIGhvdyB0byB3cmFwIGRhdGEgZnJvbSBvbmUgd29ya3NoZWV0IG9udG8gYW5vdGhlci4KKyAgICAjCisgICAgIyBFeGNlbCBoYXMgYSByb3cgbGltaXQgb2YgNjU1MzYgcm93cy4gU29tZXRpbWVzIHRoZSBhbW91bnQgb2Ygcm93IGRhdGEgdG8gYmUKKyAgICAjIHdyaXR0ZW4gdG8gYSBmaWxlIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIGxpbWl0LiBJbiB0aGlzIGNhc2UgaXQgaXMgYSB1c2VmdWwKKyAgICAjIHRlY2huaXF1ZSB0byB3cmFwIHRoZSBkYXRhIGZyb20gb25lIHdvcmtzaGVldCBvbnRvIHRoZSBuZXh0IHNvIHRoYXQgd2UgZ2V0CisgICAgIyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorICAgICMKKyAgICAjICAgU2hlZXQxICBSb3cgICAgIDEgIC0gIDY1NTM2CisgICAgIyAgIFNoZWV0MiAgUm93IDY1NTM3ICAtIDEzMTA3MgorICAgICMgICBTaGVldDMgIFJvdyAxMzEwNzMgLSAuLi4KKyAgICAjCisgICAgIyBJbiBvcmRlciB0byBhY2hpZXZlIHRoaXMgd2UgdXNlIGEgc2luZ2xlIHdvcmtzaGVldCByZWZlcmVuY2UgYW5kCisgICAgIyByZWluaXRpYWxpc2UgaXQgdG8gcG9pbnQgdG8gYSBuZXcgd29ya3NoZWV0IHdoZW4gcmVxdWlyZWQuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdyb3dfd3JhcC54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBXb3Jrc2hlZXQgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAyMCk7CisgICAgCisgICAgCisgICAgIyBGb3IgdGhlIHNha2Ugb2YgdGhpcyBleGFtcGxlIHdlIHdpbGwgdXNlIGEgc21hbGwgcm93IGxpbWl0LiBJbiBvcmRlciB0byB1c2UKKyAgICAjIHRoZSBlbnRpcmUgcm93IHJhbmdlIHNldCB0aGUgJHJvd19saW1pdCB0byA2NTUzNi4KKyAgICBteSAkcm93X2xpbWl0ID0gMTA7CisgICAgbXkgJHJvdyAgICAgICA9IDA7CisgICAgCisgICAgZm9yIG15ICRjb3VudCAoMSAuLiAyICogJHJvd19saW1pdCArMTApIHsKKyAgICAKKyAgICAgICAgIyBXaGVuIHdlIGhpdCB0aGUgcm93IGxpbWl0IHdlIHJlZGlyZWN0IHRoZSBvdXRwdXQKKyAgICAgICAgIyB0byBhIG5ldyB3b3Jrc2hlZXQgYW5kIHJlc2V0IHRoZSByb3cgbnVtYmVyLgorICAgICAgICBpZiAoJHJvdyA9PSAkcm93X2xpbWl0KSB7CisgICAgICAgICAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgICAgICAkcm93ID0gMDsKKyAgICAKKyAgICAgICAgICAgICMgUmVwZWF0IGFueSB3b3Jrc2hlZXQgZm9ybWF0dGluZy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDIwKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAgIlRoaXMgaXMgcm93ICRjb3VudCIpOworICAgICAgICAkcm93Kys7CisgICAgfQorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9yb3dfd3JhcC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHNhbGVzLnBsCisKKworCitFeGFtcGxlIG9mIGEgc2FsZXMgd29ya3NoZWV0IHRvIGRlbW9uc3RyYXRlIHNldmVyYWwgZGlmZmVyZW50IGZlYXR1cmVzLgorQWxzbyB1c2VzIGZ1bmN0aW9ucyBmcm9tIHRoZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3NhbGVzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gc2FsZXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGEgc2FsZXMgd29ya3NoZWV0IHRvIGRlbW9uc3RyYXRlIHNldmVyYWwgZGlmZmVyZW50IGZlYXR1cmVzLgorICAgICMgQWxzbyB1c2VzIGZ1bmN0aW9ucyBmcm9tIHRoZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBPY3RvYmVyIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHk7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJzYWxlcy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ICAgICAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdNYXkgU2FsZXMnKTsKKyAgICAKKyAgICAKKyAgICAjIFNldCB1cCBzb21lIGZvcm1hdHMKKyAgICBteSAlaGVhZGluZyAgICAgICAgID0gICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnX2NvbG9yICAgID0+IDE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICA9PiAnY2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIG15ICV0b3RhbCAgICAgICAgICAgPSAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Zvcm1hdCAgPT4gJyQjLCMjMC4wMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIG15ICRoZWFkaW5nICAgICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWhlYWRpbmcpOworICAgIG15ICR0b3RhbF9mb3JtYXQgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvdGFsKTsKKyAgICBteSAkcHJpY2VfZm9ybWF0ICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJyQjLCMjMC4wMCcpOworICAgIG15ICRkYXRlX2Zvcm1hdCAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnbW1tIGQgeXl5Jyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgbWFpbiBoZWFkaW5ncworICAgICR3b3Jrc2hlZXQtPmZyZWV6ZV9wYW5lcygxKTsgIyBGcmVlemUgdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICdJdGVtJywgICAgICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjEnLCAnUXVhbnRpdHknLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0MxJywgJ1ByaWNlJywgICAgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMScsICdUb3RhbCcsICAgICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTEnLCAnRGF0ZScsICAgICAkaGVhZGluZyk7CisgICAgCisgICAgIyBTZXQgdGhlIGNvbHVtbiB3aWR0aHMKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAyNSk7CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpCJywgMTApOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0M6RScsIDE2KTsKKyAgICAKKyAgICAKKyAgICAjIEV4dHJhY3QgdGhlIHNhbGVzIGRhdGEgZnJvbSB0aGUgX19EQVRBX18gc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICAgICMgSW4gcmVhbGl0eSB0aGlzIGluZm9ybWF0aW9uIHdvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSBhIGRhdGFiYXNlCisgICAgbXkgQHNhbGVzOworICAgIAorICAgIGZvcmVhY2ggbXkgJGxpbmUgKDxEQVRBPikgeworICAgICAgICBjaG9tcCAkbGluZTsKKyAgICAgICAgbmV4dCBpZiAkbGluZSBlcSAnJzsKKyAgICAgICAgIyBTaW1wbGUtbWluZGVkIHByb2Nlc3Npbmcgb2YgQ1NWIGRhdGEuIFJlZmVyIHRvIHRoZSBUZXh0OjpDU1ZfWFMKKyAgICAgICAgIyBhbmQgVGV4dDo6eFNWIG1vZHVsZXMgZm9yIGEgbW9yZSBjb21wbGV0ZSBDU1YgaGFuZGxpbmcuCisgICAgICAgIG15IEBpdGVtcyA9IHNwbGl0IC8sLywgJGxpbmU7CisgICAgICAgIHB1c2ggQHNhbGVzLCBcQGl0ZW1zOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIG91dCB0aGUgaXRlbXMgZnJvbSBlYWNoIHJvdworICAgIG15ICRyb3cgPSAxOworICAgIGZvcmVhY2ggbXkgJHNhbGUgKEBzYWxlcykgeworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCBAJHNhbGVbMF0pOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAxLCBAJHNhbGVbMV0pOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAyLCBAJHNhbGVbMl0sICRwcmljZV9mb3JtYXQpOworICAgIAorICAgICAgICAjIENyZWF0ZSBhIGZvcm11bGEgbGlrZSAnPUIyKkMyJworICAgICAgICBteSAkZm9ybXVsYSA9ICAgJz0nCisgICAgICAgICAgICAgICAgICAgICAgICAuIHhsX3Jvd2NvbF90b19jZWxsKCRyb3csIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAuICIqIgorICAgICAgICAgICAgICAgICAgICAgICAgLiB4bF9yb3djb2xfdG9fY2VsbCgkcm93LCAyKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMywgJGZvcm11bGEsICRwcmljZV9mb3JtYXQpOworICAgIAorICAgICAgICAjIFBhcnNlIHRoZSBkYXRlCisgICAgICAgIG15ICRkYXRlID0geGxfZGVjb2RlX2RhdGVfVVMoQCRzYWxlWzNdKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgNCwgJGRhdGUsICRkYXRlX2Zvcm1hdCk7CisgICAgICAgICRyb3crKzsKKyAgICB9CisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtdWxhIHRvIHN1bSB0aGUgdG90YWxzLCBsaWtlICc9U1VNKEQyOkQ2KScKKyAgICBteSAkdG90YWwgPSAnPVNVTShEMjonCisgICAgICAgICAgICAgICAgLiB4bF9yb3djb2xfdG9fY2VsbCgkcm93LTEsIDMpCisgICAgICAgICAgICAgICAgLiAiKSI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMywgJHRvdGFsLCAkdG90YWxfZm9ybWF0KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0RBVEFfXworICAgIDU4NiBjYXJkLDIwLDEyNS41MCw1LzEyLzAxCisgICAgRmxhdCBTY3JlZW4gTW9uaXRvciwxLDEzMDAuMDAsNS8xMi8wMQorICAgIDY0IE1CIGRpbW1zLDQ1LDQ5Ljk5LDUvMTMvMDEKKyAgICAxNSBHQiBIRCwxMiwzMDAuMDAsNS8xMy8wMQorICAgIFNwZWFrZXJzIChwYWlyKSw1LDE1LjUwLDUvMTQvMDEKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvc2FsZXMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzZW5kbWFpbC5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIE1haWw6OlNlbmRlciB0byBzZW5kIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgRXhjZWwKK2ZpbGUgYXMgYW4gYXR0YWNobWVudC4KKworVGhlIG1haW4gdGhpbmcgaXMgdG8gZW5zdXJlIHRoYXQgeW91IGNsb3NlKCkgdGhlIFdvcmJvb2sgYmVmb3JlIHlvdSBzZW5kIGl0LgorCitTZWUgdGhlIEw8TWFpbDo6U2VuZGVyPiBtb2R1bGUgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIE1haWw6OlNlbmRlciB0byBzZW5kIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgRXhjZWwKKyAgICAjIGZpbGUgYXMgYW4gYXR0YWNobWVudC4KKyAgICAjCisgICAgIyBUaGUgbWFpbiB0aGluZyBpcyB0byBlbnN1cmUgdGhhdCB5b3UgY2xvc2UoKSB0aGUgV29yYm9vayBiZWZvcmUgeW91IHNlbmQgaXQuCisgICAgIworICAgICMgU2VlIHRoZSBMPE1haWw6OlNlbmRlcj4gbW9kdWxlIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIHVzZSBNYWlsOjpTZW5kZXI7CisgICAgCisgICAgIyBDcmVhdGUgYW4gRXhjZWwgZmlsZQorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJzZW5kbWFpbC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0OworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICJIZWxsbyBXb3JsZCEiKTsKKyAgICAKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7ICMgTXVzdCBjbG9zZSBiZWZvcmUgc2VuZGluZworICAgIAorICAgIAorICAgIAorICAgICMgU2VuZCB0aGUgZmlsZS4gIENoYW5nZSBhbGwgdmFyaWFibGVzIHRvIHN1aXQKKyAgICBteSAkc2VuZGVyID0gbmV3IE1haWw6OlNlbmRlcgorICAgIHsKKyAgICAgICAgc210cCA9PiAnMTIzLjEyMy4xMjMuMTIzJywKKyAgICAgICAgZnJvbSA9PiAnU29tZW9uZScKKyAgICB9OworICAgIAorICAgICRzZW5kZXItPk1haWxGaWxlKAorICAgIHsKKyAgICAgICAgdG8gICAgICA9PiAnYW5vdGhlckBtYWlsLmNvbScsCisgICAgICAgIHN1YmplY3QgPT4gJ0V4Y2VsIGZpbGUnLAorICAgICAgICBtc2cgICAgID0+ICJIZXJlIGlzIHRoZSBkYXRhLlxuIiwKKyAgICAgICAgZmlsZSAgICA9PiAnbWFpbC54bHMnLAorICAgIH0pOworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9zZW5kbWFpbC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHN0YXRzX2V4dC5wbAorCisKKworRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKworVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgZnVuY3Rpb25zIHRoYXQgcmVmZXJlbmNlIGNlbGxzIGluCitvdGhlciB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgc2FtZSB3b3JrYm9vay4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvc3RhdHNfZXh0LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gc3RhdHNfZXh0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKyAgICAjCisgICAgIyBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmdW5jdGlvbnMgdGhhdCByZWZlcmVuY2UgY2VsbHMgaW4KKyAgICAjIG90aGVyIHdvcmtzaGVldHMgd2l0aGluIHRoZSBzYW1lIHdvcmtib29rLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygic3RhdHNfZXh0LnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdUZXN0IHJlc3VsdHMnKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRGF0YScpOworICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbnMgMQorICAgICR3b3Jrc2hlZXQxLT5zZXRfY29sdW1uKCdBOkEnLCAyMCk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBoZWFkaW5ncworICAgIG15ICRoZWFkaW5nID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGhlYWRpbmctPnNldF9ib2xkKCk7CisgICAgCisgICAgIyBDcmVhdGUgYSBudW1lcmljYWwgZm9ybWF0CisgICAgbXkgJG51bWZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRudW1mb3JtYXQtPnNldF9udW1fZm9ybWF0KCcwLjAwJyk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIHN0YXRpc3RpY2FsIGZ1bmN0aW9ucworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTEnLCAnQ291bnQnLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMScsICc9Q09VTlQoRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0EyJywgJ1N1bScsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IyJywgJz1TVU0oRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0EzJywgJ0F2ZXJhZ2UnLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMycsICc9QVZFUkFHRShEYXRhIUIyOkI5KScpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTQnLCAnTWluJywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjQnLCAnPU1JTihEYXRhIUIyOkI5KScpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTUnLCAnTWF4JywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjUnLCAnPU1BWChEYXRhIUIyOkI5KScpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTYnLCAnU3RhbmRhcmQgRGV2aWF0aW9uJywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjYnLCAnPVNUREVWKERhdGEhQjI6QjkpJyk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNycsICdLdXJ0b3NpcycsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I3JywgJz1LVVJUKERhdGEhQjI6QjkpJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgc2FtcGxlIGRhdGEKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0ExJywgJ1NhbXBsZScsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0EyJywgMSk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMycsIDIpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTQnLCAzKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E1JywgNCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBNicsIDUpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTcnLCA2KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E4JywgNyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBOScsIDgpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjEnLCAnTGVuZ3RoJywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjInLCAyNS40LCAkbnVtZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IzJywgMjUuNCwgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNCcsIDI0LjgsICRudW1mb3JtYXQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjUnLCAyNS4wLCAkbnVtZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I2JywgMjUuMywgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNycsIDI0LjksICRudW1mb3JtYXQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjgnLCAyNS4yLCAkbnVtZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I5JywgMjQuOCwgJG51bWZvcm1hdCk7CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3N0YXRzX2V4dC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHN0b2Nrcy5wbAorCisKKworRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKworVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYSBjb25kaXRpb25hbCBudW1lcmljYWwgZm9ybWF0Cit3aXRoIGNvbG91cnMgdG8gaW5kaWNhdGUgaWYgYSBzaGFyZSBwcmljZSBoYXMgZ29uZSB1cCBvciBkb3duLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zdG9ja3MuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBzdG9ja3MucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGZvcm1hdHRpbmcgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZQorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGEgY29uZGl0aW9uYWwgbnVtZXJpY2FsIGZvcm1hdAorICAgICMgd2l0aCBjb2xvdXJzIHRvIGluZGljYXRlIGlmIGEgc2hhcmUgcHJpY2UgaGFzIGdvbmUgdXAgb3IgZG93bi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInN0b2Nrcy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmb3IgY29sdW1ucyAxLCAyLCAzIGFuZCA0CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAzLCAxNSk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBjb2x1bW4gaGVhZGluZ3MKKyAgICBteSAkaGVhZGVyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGhlYWRlci0+c2V0X2JvbGQoKTsKKyAgICAkaGVhZGVyLT5zZXRfc2l6ZSgxMik7CisgICAgJGhlYWRlci0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBzdG9jayBwcmljZQorICAgIG15ICRmX3ByaWNlID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZfcHJpY2UtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX3ByaWNlLT5zZXRfbnVtX2Zvcm1hdCgnJDAuMDAnKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIHN0b2NrIHZvbHVtZQorICAgIG15ICRmX3ZvbHVtZSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmX3ZvbHVtZS0+c2V0X2FsaWduKCdsZWZ0Jyk7CisgICAgJGZfdm9sdW1lLT5zZXRfbnVtX2Zvcm1hdCgnIywjIzAnKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIHByaWNlIGNoYW5nZS4gVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29uZGl0aW9uYWwKKyAgICAjIGZvcm1hdC4gVGhlIG51bWJlciBpcyBmb3JtYXR0ZWQgYXMgYSBwZXJjZW50YWdlLiBJZiBpdCBpcyBwb3NpdGl2ZSBpdCBpcworICAgICMgZm9ybWF0dGVkIGluIGdyZWVuLCBpZiBpdCBpcyBuZWdhdGl2ZSBpdCBpcyBmb3JtYXR0ZWQgaW4gcmVkIGFuZCBpZiBpdCBpcworICAgICMgemVybyBpdCBpcyBmb3JtYXR0ZWQgYXMgdGhlIGRlZmF1bHQgZm9udCBjb2xvdXIgKGluIHRoaXMgY2FzZSBibGFjaykuCisgICAgIyBOb3RlOiB0aGUgW0dyZWVuXSBmb3JtYXQgcHJvZHVjZXMgYW4gdW5hcHBlYWxpbmcgbGltZSBncmVlbi4gVHJ5CisgICAgIyBbQ29sb3IgMTBdIGluc3RlYWQgZm9yIGEgZGFyayBncmVlbi4KKyAgICAjCisgICAgbXkgJGZfY2hhbmdlID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZfY2hhbmdlLT5zZXRfYWxpZ24oJ2xlZnQnKTsKKyAgICAkZl9jaGFuZ2UtPnNldF9udW1fZm9ybWF0KCdbR3JlZW5dMC4wJTtbUmVkXS0wLjAlOzAuMCUnKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIG91dCB0aGUgZGF0YQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdDb21wYW55JywgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMSwgJ1ByaWNlJywgICAkaGVhZGVyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAyLCAnVm9sdW1lJywgICRoZWFkZXIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICdDaGFuZ2UnLCAgJGhlYWRlcik7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMCwgJ0RhbWFnZSBJbmMuJyAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAzMC4yNSwgICAgICRmX3ByaWNlKTsgICMgJDMwLjI1CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMiwgMTIzNDU2NywgICAkZl92b2x1bWUpOyAjIDEsMjM0LDU2NworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDMsIDAuMDg1LCAgICAgJGZfY2hhbmdlKTsgIyA4LjUlIGluIGdyZWVuCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgJ0R1bXAgQ29ycC4nICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAxLCAxLjU2LCAgICAgICRmX3ByaWNlKTsgICMgJDEuNTYKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAyLCA3NTY0LCAgICAgICRmX3ZvbHVtZSk7ICMgNyw1NjQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAzLCAtMC4wMTUsICAgICRmX2NoYW5nZSk7ICMgLTEuNSUgaW4gcmVkCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgJ1JldiBMdGQuJyAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAxLCAwLjEzLCAgICAgICRmX3ByaWNlKTsgICMgJDAuMTMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAyLCAzMjEsICAgICAgICRmX3ZvbHVtZSk7ICMgMzIxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMywgMCwgICAgICAgICAkZl9jaGFuZ2UpOyAjIDAgaW4gdGhlIGZvbnQgY29sb3IgKGJsYWNrKQorICAgIAorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9zdG9ja3MucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB0YWJfY29sb3JzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBzZXQgRXhjZWwgd29ya3NoZWV0IHRhYiBjb2xvdXJzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy90YWJfY29sb3JzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdGFiX2NvbG9ycy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byBzZXQgRXhjZWwgd29ya3NoZWV0IHRhYiBjb2xvdXJzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDYsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ3RhYl9jb2xvcnMueGxzJyk7CisgICAgCisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIFdvcmtzaGVldDEgd2lsbCBoYXZlIHRoZSBkZWZhdWx0IHRhYiBjb2xvdXIuCisgICAgJHdvcmtzaGVldDItPnNldF90YWJfY29sb3IoJ3JlZCcpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfdGFiX2NvbG9yKCdncmVlbicpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfdGFiX2NvbG9yKDB4MzUpOyAjIE9yYW5nZQorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy90YWJfY29sb3JzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdGV4dHdyYXAucGwKKworCisKK0V4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisKK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gd3JhcCB0ZXh0IGluIGEgY2VsbC4gVGhlcmUgYXJlIHR3byBhbHRlcm5hdGl2ZXMsCit2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uIGFuZCB0ZXh0IHdyYXAuCisKK1dpdGggdmVydGljYWwganVzdGlmaWNhdGlvbiB0aGUgdGV4dCBpcyB3cmFwcGVkIGF1dG9tYXRpY2FsbHkgdG8gZml0IHRoZQorY29sdW1uIHdpZHRoLiBXaXRoIHRleHQgd3JhcCB5b3UgbXVzdCBzcGVjaWZ5IGEgbmV3bGluZSB3aXRoIGFuIGVtYmVkZGVkIFxuLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy90ZXh0d3JhcC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHRleHR3cmFwLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHdyYXAgdGV4dCBpbiBhIGNlbGwuIFRoZXJlIGFyZSB0d28gYWx0ZXJuYXRpdmVzLAorICAgICMgdmVydGljYWwganVzdGlmaWNhdGlvbiBhbmQgdGV4dCB3cmFwLgorICAgICMKKyAgICAjIFdpdGggdmVydGljYWwganVzdGlmaWNhdGlvbiB0aGUgdGV4dCBpcyB3cmFwcGVkIGF1dG9tYXRpY2FsbHkgdG8gZml0IHRoZQorICAgICMgY29sdW1uIHdpZHRoLiBXaXRoIHRleHQgd3JhcCB5b3UgbXVzdCBzcGVjaWZ5IGEgbmV3bGluZSB3aXRoIGFuIGVtYmVkZGVkIFxuLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidGV4dHdyYXAueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbnMgMSwgMiBhbmQgMworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMSwgMSwgMjQpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMiwgMiwgMzQpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMywgMywgMzQpOworICAgIAorICAgICMgU2V0IHRoZSByb3cgaGVpZ2h0IGZvciByb3dzIDEsIDQsIGFuZCA2LiBUaGUgaGVpZ2h0IG9mIHJvdyAyIHdpbGwgYWRqdXN0CisgICAgIyBhdXRvbWF0aWNhbGx5IHRvIGZpdCB0aGUgdGV4dC4KKyAgICAjCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCAzMCk7CisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygzLCA0MCk7CisgICAgJHdvcmtzaGVldC0+c2V0X3Jvdyg1LCA4MCk7CisgICAgCisgICAgCisgICAgIyBObyBuZXdsaW5lcworICAgIG15ICRzdHIxICA9ICJGb3Igd2hhdGV2ZXIgd2UgbG9zZSAobGlrZSBhIHlvdSBvciBhIG1lKSAiOworICAgICRzdHIxICAgIC49ICJpdCdzIGFsd2F5cyBvdXJzZWx2ZXMgd2UgZmluZCBpbiB0aGUgc2VhIjsKKyAgICAKKyAgICAjIEVtYmVkZGVkIG5ld2xpbmVzCisgICAgbXkgJHN0cjIgID0gIkZvciB3aGF0ZXZlciB3ZSBsb3NlXG4obGlrZSBhIHlvdSBvciBhIG1lKVxuIjsKKyAgICAgICAkc3RyMiAuPSAiaXQncyBhbHdheXMgb3Vyc2VsdmVzXG53ZSBmaW5kIGluIHRoZSBzZWEiOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgY29sdW1uIGhlYWRpbmdzCisgICAgbXkgJGhlYWRlciA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoZWFkZXItPnNldF9ib2xkKCk7CisgICAgJGhlYWRlci0+c2V0X2ZvbnQoIkNvdXJpZXIgTmV3Iik7CisgICAgJGhlYWRlci0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAkaGVhZGVyLT5zZXRfYWxpZ24oJ3ZjZW50ZXInKTsKKyAgICAKKyAgICAjIENyZWF0ZSBhICJ2ZXJ0aWNhbCBqdXN0aWZpY2F0aW9uIiBmb3JtYXQKKyAgICBteSAkZm9ybWF0MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQxLT5zZXRfYWxpZ24oJ3ZqdXN0aWZ5Jyk7CisgICAgCisgICAgIyBDcmVhdGUgYSAidGV4dCB3cmFwIiBmb3JtYXQKKyAgICBteSAkZm9ybWF0MiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQyLT5zZXRfdGV4dF93cmFwKCk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgaGVhZGVycworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICJzZXRfYWxpZ24oJ3ZqdXN0aWZ5JykiLCAkaGVhZGVyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAyLCAic2V0X2FsaWduKCd2anVzdGlmeScpIiwgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgInNldF90ZXh0X3dyYXAoKSIsICRoZWFkZXIpOworICAgIAorICAgICMgV3JpdGUgc29tZSBleGFtcGxlcworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDEsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMiwgJHN0cjEsICRmb3JtYXQxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAkc3RyMiwgJGZvcm1hdDIpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDEsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMiwgJHN0cjEsICRmb3JtYXQxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAzLCAkc3RyMiwgJGZvcm1hdDIpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDEsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMiwgJHN0cjEsICRmb3JtYXQxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAzLCAkc3RyMiwgJGZvcm1hdDIpOworICAgIAorICAgIAorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy90ZXh0d3JhcC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHdpbjMyb2xlLnBsCisKKworCitUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhbiBFeGNlbCBmaWxlIHVzaW5nIHRoZQorV2luMzI6Ok9MRSBtb2R1bGUgZm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24uCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gY3JlYXRlIGFuIEV4Y2VsIGZpbGUgdXNpbmcgdGhlCisgICAgIyBXaW4zMjo6T0xFIG1vZHVsZSBmb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBDd2Q7CisgICAgdXNlIFdpbjMyOjpPTEU7CisgICAgdXNlIFdpbjMyOjpPTEU6OkNvbnN0ICdNaWNyb3NvZnQgRXhjZWwnOworICAgIAorICAgIAorICAgIG15ICRhcHBsaWNhdGlvbiA9IFdpbjMyOjpPTEUtPm5ldygiRXhjZWwuQXBwbGljYXRpb24iKTsKKyAgICBteSAkd29ya2Jvb2sgICAgPSAkYXBwbGljYXRpb24tPldvcmtib29rcy0+QWRkOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+V29ya3NoZWV0cygxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT5DZWxscygxLDEpLT57VmFsdWV9ID0gIkhlbGxvIFdvcmxkIjsKKyAgICAkd29ya3NoZWV0LT5DZWxscygyLDEpLT57VmFsdWV9ID0gIk9uZSI7CisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMywxKS0+e1ZhbHVlfSA9ICJUd28iOworICAgICR3b3Jrc2hlZXQtPkNlbGxzKDQsMSktPntWYWx1ZX0gPSAgMzsKKyAgICAkd29ya3NoZWV0LT5DZWxscyg1LDEpLT57VmFsdWV9ID0gIDQuMDAwMDAwMTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGZvcm1hdHRpbmcKKyAgICAkd29ya3NoZWV0LT5DZWxscygxLDEpLT5Gb250LT57Qm9sZH0gICAgICAgPSAiVHJ1ZSI7CisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMSwxKS0+Rm9udC0+e1NpemV9ICAgICAgID0gMTY7CisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMSwxKS0+Rm9udC0+e0NvbG9ySW5kZXh9ID0gMzsKKyAgICAkd29ya3NoZWV0LT5Db2x1bW5zKCJBOkEiKS0+e0NvbHVtbldpZHRofSAgPSAyNTsKKyAgICAKKyAgICAjIFdyaXRlIGEgaHlwZXJsaW5rCisgICAgbXkgJHJhbmdlID0gJHdvcmtzaGVldC0+UmFuZ2UoIkE3OkE3Iik7CisgICAgJHdvcmtzaGVldC0+SHlwZXJsaW5rcy0+QWRkKHsgQW5jaG9yID0+ICRyYW5nZSwgQWRkcmVzcyA9PiAiaHR0cDovL3d3dy5wZXJsLmNvbS8ifSk7CisgICAgCisgICAgIyBHZXQgY3VycmVudCBkaXJlY3RvcnkgdXNpbmcgQ3dkLnBtCisgICAgbXkgJGRpciA9IGN3ZCgpOworICAgIAorICAgICR3b3JrYm9vay0+U2F2ZUFzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOYW1lICAgPT4gJGRpciAuICcvd2luMzJvbGUueGxzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVGb3JtYXQgPT4geGxOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgJHdvcmtib29rLT5DbG9zZTsKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd2luMzJvbGUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZV9hcnJheXMucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvCit3cml0ZSAxRCBhbmQgMkQgYXJyYXlzIG9mIGRhdGEuCisKK1RvIGZpbmQgb3V0IG1vcmUgYWJvdXQgYXJyYXkgcmVmZXJlbmNlcyByZWZlcighISkgdG8gdGhlIHBlcmxyZWYgYW5kCitwZXJscmVmdHV0IG1hbnBhZ2VzLiBUbyBmaW5kIG91dCBtb3JlIGFib3V0IDJEIGFycmF5cyBvciAibGlzdCBvZgorbGlzdHMiIHJlZmVyIHRvIHRoZSBwZXJsbG9sIG1hbnBhZ2UuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3dyaXRlX2FycmF5cy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHdyaXRlX2FycmF5cy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0bworICAgICMgd3JpdGUgMUQgYW5kIDJEIGFycmF5cyBvZiBkYXRhLgorICAgICMKKyAgICAjIFRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgYXJyYXkgcmVmZXJlbmNlcyByZWZlcighISkgdG8gdGhlIHBlcmxyZWYgYW5kCisgICAgIyBwZXJscmVmdHV0IG1hbnBhZ2VzLiBUbyBmaW5kIG91dCBtb3JlIGFib3V0IDJEIGFycmF5cyBvciAibGlzdCBvZgorICAgICMgbGlzdHMiIHJlZmVyIHRvIHRoZSBwZXJsbG9sIG1hbnBhZ2UuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ3cml0ZV9hcnJheXMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0V4YW1wbGUgMScpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDInKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSAzJyk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0V4YW1wbGUgNCcpOworICAgIG15ICR3b3Jrc2hlZXQ1ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDUnKTsKKyAgICBteSAkd29ya3NoZWV0NiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSA2Jyk7CisgICAgbXkgJHdvcmtzaGVldDcgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0V4YW1wbGUgNycpOworICAgIG15ICR3b3Jrc2hlZXQ4ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDgnKTsKKyAgICAKKyAgICBteSAkZm9ybWF0ICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChjb2xvciA9PiAncmVkJywgYm9sZCA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAjIERhdGEgYXJyYXlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcy4KKyAgICAjIHVuZGVmIHZhbHVlcyBhcmUgd3JpdHRlbiBhcyBibGFuayBjZWxscyAod2l0aCBmb3JtYXQgaWYgc3BlY2lmaWVkKS4KKyAgICAjCisgICAgbXkgQGFycmF5ICAgPSAgICggJ29uZScsICd0d28nLCB1bmRlZiwgJ2ZvdXInICk7CisgICAgCisgICAgbXkgQGFycmF5MmQgPSAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnbWFnZ2llJywgJ21pbGx5JywgJ21vbGx5JywgJ21heScgIF0sCisgICAgICAgICAgICAgICAgICAgICAgICBbMTMsICAgICAgIDE0LCAgICAgIDE1LCAgICAgIDE2ICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgWydzaGVsbCcsICAnc3RhcicsICAnY3JhYicsICAnc3RvbmUnXSwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIDEuIFdyaXRlIGEgcm93IG9mIGRhdGEgdXNpbmcgYW4gYXJyYXkgcmVmZXJlbmNlLgorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTEnLCBcQGFycmF5KTsKKyAgICAKKyAgICAjIDIuIFNhbWUgYXMgMS4gYWJvdmUgdXNpbmcgYW4gYW5vbnltb3VzIGFycmF5IHJlZi4KKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0ExJywgWyBAYXJyYXkgXSk7CisgICAgCisgICAgIyAzLiBXcml0ZSBhIHJvdyBvZiBkYXRhIHVzaW5nIGFuIGV4cGxpY2l0IHdyaXRlX3JvdygpIG1ldGhvZCBjYWxsLgorICAgICMgICAgVGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIHdyaXRlKCkgaW4gRXguIDEgYWJvdmUuCisgICAgIworICAgICR3b3Jrc2hlZXQzLT53cml0ZV9yb3coJ0ExJywgXEBhcnJheSk7CisgICAgCisgICAgIyA0LiBXcml0ZSBhIGNvbHVtbiBvZiBkYXRhIHVzaW5nIHRoZSB3cml0ZV9jb2woKSBtZXRob2QgY2FsbC4KKyAgICAkd29ya3NoZWV0NC0+d3JpdGVfY29sKCdBMScsIFxAYXJyYXkpOworICAgIAorICAgICMgNS4gV3JpdGUgYSBjb2x1bW4gb2YgZGF0YSB1c2luZyBhIHJlZiB0byBhbiBhcnJheSByZWYsIGkuZS4gYSAyRCBhcnJheS4KKyAgICAkd29ya3NoZWV0NS0+d3JpdGUoJ0ExJywgWyBcQGFycmF5IF0pOworICAgIAorICAgICMgNi4gV3JpdGUgYSAyRCBhcnJheSBpbiBjb2wtcm93IG9yZGVyLgorICAgICR3b3Jrc2hlZXQ2LT53cml0ZSgnQTEnLCBcQGFycmF5MmQpOworICAgIAorICAgICMgNy4gV3JpdGUgYSAyRCBhcnJheSBpbiByb3ctY29sIG9yZGVyLgorICAgICR3b3Jrc2hlZXQ3LT53cml0ZV9jb2woJ0ExJywgXEBhcnJheTJkKTsKKyAgICAKKyAgICAjIDguIFdyaXRlIGEgcm93IG9mIGRhdGEgd2l0aCBmb3JtYXR0aW5nLiBUaGUgYmxhbmsgY2VsbCBpcyBhbHNvIGZvcm1hdHRlZC4KKyAgICAkd29ya3NoZWV0OC0+d3JpdGUoJ0ExJywgXEBhcnJheSwgJGZvcm1hdCk7CisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX2FycmF5cy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHdyaXRlX2hhbmRsZXIxLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBhZGQgYSB1c2VyIGRlZmluZWQgZGF0YSBoYW5kbGVyIHRvIHRoZSBTcHJlYWRzaGVldDo6CitXcml0ZUV4Y2VsIHdyaXRlKCkgbWV0aG9kLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIGhhbmRsZXIgZm9yIGEgNyBkaWdpdCBJRCBudW1iZXIuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvd3JpdGVfaGFuZGxlcjEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9oYW5kbGVyMS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBhIDcgZGlnaXQgSUQgbnVtYmVyLgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVfaGFuZGxlcjEueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEFkZCBhIGhhbmRsZXIgZm9yIDcgZGlnaXQgaWQgbnVtYmVycy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCBhIHN0cmluZworICAgICMgc3VjaCBhcyAwMDAwMDAxIHdyaXR0ZW4gYXMgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIG51bWJlciBhbmQgdGh1cyBwcmVzZXJ2ZQorICAgICMgdGhlIGxlYWRpbmcgemVyb2VzLgorICAgICMKKyAgICAjIE5vdGU6IHlvdSBjYW4gZ2V0IHRoZSBzYW1lIGVmZmVjdCB1c2luZyB0aGUga2VlcF9sZWFkaW5nX3plcm9zKCkgbWV0aG9kIGJ1dAorICAgICMgdGhpcyBzZXJ2ZXMgYXMgYSBzaW1wbGUgZXhhbXBsZS4KKyAgICAjCisgICAgJHdvcmtzaGVldC0+YWRkX3dyaXRlX2hhbmRsZXIocXJbXlxkezd9JF0sIFwmd3JpdGVfbXlfaWQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgZGF0YSB3aGVuIGEgbWF0Y2ggaXMgZm91bmQuCisgICAgIworICAgIHN1YiB3cml0ZV9teV9pZCB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAKKyAgICAgICAgcmV0dXJuICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyhAXyk7CisgICAgfQorICAgIAorICAgIAorICAgICMgVGhpcyBmb3JtYXQgbWFpbnRhaW5zIHRoZSBjZWxsIGFzIHRleHQgZXZlbiBpZiBpdCBpcyBlZGl0ZWQuCisgICAgbXkgJGlkX2Zvcm1hdCAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ0AnKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgbnVtYmVycyBpbiB0aGUgdXNlciBkZWZpbmVkIGZvcm1hdAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICcwMDAwMDAwJywgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJzAwMDAwMDEnLCAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAnMDAwNDAwMCcsICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNCcsICcxMjM0NTY3JywgJGlkX2Zvcm1hdCk7CisgICAgCisgICAgIyBXcml0ZSBzb21lIG51bWJlcnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgZGVmaW5lZCBmb3JtYXQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTYnLCAnMDAwMDAwJywgICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICcwMDAwMDEnLCAgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E4JywgJzAwNDAwMCcsICAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAnMTIzNDU2JywgICRpZF9mb3JtYXQpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd3JpdGVfaGFuZGxlcjEucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMi5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBhIDcgZGlnaXQgSUQgbnVtYmVyLgorSXQgYWRkcyBhbiBhZGRpdGlvbmFsIGNvbnN0cmFpbnQgdG8gdGhlIHdyaXRlX2hhbmRsZXIxLnBsIGluIHRoYXQgaXQgb25seQorZmlsdGVycyBkYXRhIHRoYXQgaXNuJ3QgaW4gdGhlIHRoaXJkIGNvbHVtbi4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy93cml0ZV9oYW5kbGVyMi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHdyaXRlX2hhbmRsZXIyLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorICAgICMgV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIGhhbmRsZXIgZm9yIGEgNyBkaWdpdCBJRCBudW1iZXIuCisgICAgIyBJdCBhZGRzIGFuIGFkZGl0aW9uYWwgY29uc3RyYWludCB0byB0aGUgd3JpdGVfaGFuZGxlcjEucGwgaW4gdGhhdCBpdCBvbmx5CisgICAgIyBmaWx0ZXJzIGRhdGEgdGhhdCBpc24ndCBpbiB0aGUgdGhpcmQgY29sdW1uLgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVfaGFuZGxlcjIueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEFkZCBhIGhhbmRsZXIgZm9yIDcgZGlnaXQgaWQgbnVtYmVycy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCBhIHN0cmluZworICAgICMgc3VjaCBhcyAwMDAwMDAxIHdyaXR0ZW4gYXMgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIG51bWJlciBhbmQgdGh1cyBwcmVzZXJ2ZQorICAgICMgdGhlIGxlYWRpbmcgemVyb2VzLgorICAgICMKKyAgICAjIE5vdGU6IHlvdSBjYW4gZ2V0IHRoZSBzYW1lIGVmZmVjdCB1c2luZyB0aGUga2VlcF9sZWFkaW5nX3plcm9zKCkgbWV0aG9kIGJ1dAorICAgICMgdGhpcyBzZXJ2ZXMgYXMgYSBzaW1wbGUgZXhhbXBsZS4KKyAgICAjCisgICAgJHdvcmtzaGVldC0+YWRkX3dyaXRlX2hhbmRsZXIocXJbXlxkezd9JF0sIFwmd3JpdGVfbXlfaWQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgZGF0YSB3aGVuIGEgbWF0Y2ggaXMgZm91bmQuIFRoZSBoYW5kbGVyCisgICAgIyBpcyBzZXQgdXAgc28gdGhhdCBpdCBvbmx5IGZpbHRlcnMgZGF0YSBpZiBpdCBpcyBpbiB0aGUgdGhpcmQgY29sdW1uLgorICAgICMKKyAgICBzdWIgd3JpdGVfbXlfaWQgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gc2hpZnQ7CisgICAgICAgIG15ICRjb2wgICAgICAgPSAkX1sxXTsKKyAgICAKKyAgICAgICAgIyBjb2wgaXMgemVybyBiYXNlZAorICAgICAgICBpZiAoJGNvbCAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKEBfKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgUmVqZWN0IHRoZSBtYXRjaCBhbmQgcmV0dXJuIGNvbnRyb2wgdG8gd3JpdGUoKQorICAgICAgICAgICAgcmV0dXJuIHVuZGVmOworICAgICAgICB9CisgICAgCisgICAgfQorICAgIAorICAgIAorICAgICMgVGhpcyBmb3JtYXQgbWFpbnRhaW5zIHRoZSBjZWxsIGFzIHRleHQgZXZlbiBpZiBpdCBpcyBlZGl0ZWQuCisgICAgbXkgJGlkX2Zvcm1hdCAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ0AnKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgbnVtYmVycyBpbiB0aGUgdXNlciBkZWZpbmVkIGZvcm1hdAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICcwMDAwMDAwJywgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJzAwMDAwMDEnLCAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzEnLCAnMDAwMDAwMicsICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMScsICcwMDAwMDAzJywgJGlkX2Zvcm1hdCk7CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy93cml0ZV9oYW5kbGVyMi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHdyaXRlX2hhbmRsZXIzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBhZGQgYSB1c2VyIGRlZmluZWQgZGF0YSBoYW5kbGVyIHRvIHRoZSBTcHJlYWRzaGVldDo6CitXcml0ZUV4Y2VsIHdyaXRlKCkgbWV0aG9kLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIGhhbmRsZXIgZm9yIGRhdGVzIGluIGEgc3BlY2lmaWMKK2Zvcm1hdC4KKworU2VlIHdyaXRlX2hhbmRsZXI0LnBsIGZvciBhIG1vcmUgcmlnb3JvdXMgZXhhbXBsZSB3aXRoIGVycm9yIGhhbmRsaW5nLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy93cml0ZV9oYW5kbGVyMy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHdyaXRlX2hhbmRsZXIzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorICAgICMgV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIGhhbmRsZXIgZm9yIGRhdGVzIGluIGEgc3BlY2lmaWMKKyAgICAjIGZvcm1hdC4KKyAgICAjCisgICAgIyBTZWUgd3JpdGVfaGFuZGxlcjQucGwgZm9yIGEgbW9yZSByaWdvcm91cyBleGFtcGxlIHdpdGggZXJyb3IgaGFuZGxpbmcuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIndyaXRlX2hhbmRsZXIzLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRkYXRlX2Zvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICdkZC9tbS95eScpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGQgYSBoYW5kbGVyIHRvIG1hdGNoIGRhdGVzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiBkL20veXl5eQorICAgICMKKyAgICAjIFRoZSBkYXkgYW5kIG1vbnRoIGNhbiBiZSBzaW5nbGUgb3IgZG91YmxlIGRpZ2l0cy4KKyAgICAjCisgICAgJHdvcmtzaGVldC0+YWRkX3dyaXRlX2hhbmRsZXIocXJbXlxkezEsMn0vXGR7MSwyfS9cZHs0fSRdLCBcJndyaXRlX215X2RhdGUpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgZGF0YSB3aGVuIGEgbWF0Y2ggaXMgZm91bmQuCisgICAgIyBTZWUgd3JpdGVfaGFuZGxlcjQucGwgZm9yIGEgbW9yZSByaWdvcm91cyBleGFtcGxlIHdpdGggZXJyb3IgaGFuZGxpbmcuCisgICAgIworICAgIHN1YiB3cml0ZV9teV9kYXRlIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9IHNoaWZ0OworICAgICAgICBteSBAYXJncyAgICAgID0gQF87CisgICAgCisgICAgICAgIG15ICR0b2tlbiAgICAgPSAkYXJnc1syXTsKKyAgICAgICAgICAgJHRva2VuICAgICA9fiBxclteKFxkezEsMn0pLyhcZHsxLDJ9KS8oXGR7NH0pJF07CisgICAgCisgICAgICAgICMgQ2hhbmdlIHRvIHRoZSBkYXRlIGZvcm1hdCByZXF1aXJlZCBieSB3cml0ZV9kYXRlX3RpbWUoKS4KKyAgICAgICAgbXkgJGRhdGUgPSBzcHJpbnRmICIlNGQtJTAyZC0lMDJkVCIsICQzLCAkMiwgJDE7CisgICAgCisgICAgICAgICRhcmdzWzJdID0gJGRhdGU7CisgICAgCisgICAgICAgIHJldHVybiAkd29ya3NoZWV0LT53cml0ZV9kYXRlX3RpbWUoQGFyZ3MpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgZGF0ZXMgaW4gdGhlIHVzZXIgZGVmaW5lZCBmb3JtYXQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnMjIvMTIvMjAwNCcsICRkYXRlX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJzEvMS8xOTk1JywgICAkZGF0ZV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICcwMS8wMS8xOTk1JywgJGRhdGVfZm9ybWF0KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX2hhbmRsZXIzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogd3JpdGVfaGFuZGxlcjQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKK1dyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgaGFuZGxlciBmb3IgZGF0ZXMgaW4gYSBzcGVjaWZpYworZm9ybWF0LgorCitUaGlzIGlzIGEgbW9yZSByaWdvcm91cyB2ZXJzaW9uIG9mIHdyaXRlX2hhbmRsZXIzLnBsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy93cml0ZV9oYW5kbGVyNC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHdyaXRlX2hhbmRsZXI0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorICAgICMgV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIGhhbmRsZXIgZm9yIGRhdGVzIGluIGEgc3BlY2lmaWMKKyAgICAjIGZvcm1hdC4KKyAgICAjCisgICAgIyBUaGlzIGlzIGEgbW9yZSByaWdvcm91cyB2ZXJzaW9uIG9mIHdyaXRlX2hhbmRsZXIzLnBsLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ3cml0ZV9oYW5kbGVyNC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkZGF0ZV9mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnZGQvbW0veXknKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQWRkIGEgaGFuZGxlciB0byBtYXRjaCBkYXRlcyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6IGQvbS95eSwgZC9tL3l5eXkKKyAgICAjCisgICAgIyBUaGUgZGF5IGFuZCBtb250aCBjYW4gYmUgc2luZ2xlIG9yIGRvdWJsZSBkaWdpdHMgYW5kIHRoZSB5ZWFyIGNhbiBiZSAgMiBvciA0CisgICAgIyBkaWdpdHMuCisgICAgIworICAgICR3b3Jrc2hlZXQtPmFkZF93cml0ZV9oYW5kbGVyKHFyW15cZHsxLDJ9L1xkezEsMn0vXGR7Miw0fSRdLCBcJndyaXRlX215X2RhdGUpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHByb2Nlc3NlcyB0aGUgZGF0YSB3aGVuIGEgbWF0Y2ggaXMgZm91bmQuCisgICAgIworICAgIHN1YiB3cml0ZV9teV9kYXRlIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9IHNoaWZ0OworICAgICAgICBteSBAYXJncyAgICAgID0gQF87CisgICAgCisgICAgICAgIG15ICR0b2tlbiAgICAgPSAkYXJnc1syXTsKKyAgICAKKyAgICAgICAgaWYgKCR0b2tlbiA9fiAgcXJbXihcZHsxLDJ9KS8oXGR7MSwyfSkvKFxkezIsNH0pJF0pIHsKKyAgICAKKyAgICAgICAgICAgIG15ICRkYXkgID0gJDE7CisgICAgICAgICAgICBteSAkbW9uICA9ICQyOworICAgICAgICAgICAgbXkgJHllYXIgPSAkMzsKKyAgICAKKyAgICAgICAgICAgICMgVXNlIGEgd2luZG93IGZvciAyIGRpZ2l0IGRhdGVzLiBUaGlzIHdpbGwga2VlcCBzb21lIHJhZ2dlZCBQZXJsCisgICAgICAgICAgICAjIHByb2dyYW1tZXIgZW1wbG95ZWQgaW4gdGhpcnR5IHllYXJzIHRpbWUuIDotKQorICAgICAgICAgICAgaWYgKGxlbmd0aCAkeWVhciA9PSAyKSB7CisgICAgICAgICAgICAgICAgaWYgKCR5ZWFyIDwgNTApIHsKKyAgICAgICAgICAgICAgICAgICAgJHllYXIgKz0gMjAwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICR5ZWFyICs9IDE5MDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgbXkgJGRhdGUgPSBzcHJpbnRmICIlNGQtJTAyZC0lMDJkVCIsICR5ZWFyLCAkbW9uLCAkZGF5OworICAgIAorICAgICAgICAgICAgIyBDb252ZXJ0IHRoZSBJU08gSVNPODYwMSBzdHlsZSBzdHJpbmcgdG8gYW4gRXhjZWwgZGF0ZQorICAgICAgICAgICAgJGRhdGUgPSAkd29ya3NoZWV0LT5jb252ZXJ0X2RhdGVfdGltZSgkZGF0ZSk7CisgICAgCisgICAgICAgICAgICBpZiAoZGVmaW5lZCAkZGF0ZSkgeworICAgICAgICAgICAgICAgICMgRGF0ZSB3YXMgdmFsaWQKKyAgICAgICAgICAgICAgICAkYXJnc1syXSA9ICRkYXRlOworICAgICAgICAgICAgICAgIHJldHVybiAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIoQGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBOb3QgYSB2YWxpZCBkYXRlIHRoZXJlZm9yZSB3cml0ZSBhcyBhIHN0cmluZworICAgICAgICAgICAgICAgIHJldHVybiAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoQGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBTaG91bGRuJ3QgaGFwcGVuIGlmIHRoZSBzYW1lIG1hdGNoIGlzIHVzZWQgaW4gdGhlIHJlIGFuZCBzdWIuCisgICAgICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIGRhdGVzIGluIHRoZSB1c2VyIGRlZmluZWQgZm9ybWF0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJzIyLzEyLzIwMDQnLCAkZGF0ZV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICcyMi8xMi8wNCcsICAgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAnMi8xMi8wNCcsICAgICRkYXRlX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E0JywgJzIvNS8wNCcsICAgICAkZGF0ZV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICcyLzUvOTUnLCAgICAgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTYnLCAnMi81LzE5OTUnLCAgICRkYXRlX2Zvcm1hdCk7CisgICAgCisgICAgIyBTb21lIGVycm9uZW91cyBkYXRlcworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOCcsICcyLzUvMTg5NScsICAgJGRhdGVfZm9ybWF0KTsgIyBEYXRlIG91dCBvZiBFeGNlbCByYW5nZQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOScsICcyOS8yLzIwMDMnLCAgJGRhdGVfZm9ybWF0KTsgIyBJbnZhbGlkIGxlYXAgZGF5CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMCcsJzUwLzUwLzUwJywgICAkZGF0ZV9mb3JtYXQpOyAjIE1hdGNoZXMgYnV0IGlzbid0IGEgZGF0ZQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd3JpdGVfaGFuZGxlcjQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZV90b19zY2FsYXIucGwKKworCisKK0FuIGV4YW1wbGUgb2Ygd3JpdGluZyBhbiBFeGNlbCBmaWxlIHRvIGEgUGVybCBzY2FsYXIgdXNpbmcgU3ByZWFkc2hlZXQ6OgorV3JpdGVFeGNlbCBhbmQgdGhlIG5ldyBmZWF0dXJlcyBvZiBwZXJsIDUuOC4KKworRm9yIGFuIGV4YW1wbGVzIG9mIGhvdyB0byB3cml0ZSB0byBhIHNjYWxhciBpbiB2ZXJzaW9ucyBwcmlvciB0byBwZXJsIDUuOAorc2VlIHRoZSBmaWxlaGFuZGxlLnBsIHByb2dyYW0gYW5kIElPOlNjYWxhci4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBbiBleGFtcGxlIG9mIHdyaXRpbmcgYW4gRXhjZWwgZmlsZSB0byBhIFBlcmwgc2NhbGFyIHVzaW5nIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgYW5kIHRoZSBuZXcgZmVhdHVyZXMgb2YgcGVybCA1LjguCisgICAgIworICAgICMgRm9yIGFuIGV4YW1wbGVzIG9mIGhvdyB0byB3cml0ZSB0byBhIHNjYWxhciBpbiB2ZXJzaW9ucyBwcmlvciB0byBwZXJsIDUuOAorICAgICMgc2VlIHRoZSBmaWxlaGFuZGxlLnBsIHByb2dyYW0gYW5kIElPOlNjYWxhci4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICAKKyAgICAjIFVzZSBwZXJsIDUuOCdzIGZlYXR1cmUgb2YgdXNpbmcgYSBzY2FsYXIgYXMgYSBmaWxlaGFuZGxlLgorICAgIG15ICAgJGZoOworICAgIG15ICAgJHN0ciA9ICcnOworICAgIG9wZW4gJGZoLCAnPicsIFwkc3RyIG9yIGRpZSAiRmFpbGVkIHRvIG9wZW4gZmlsZWhhbmRsZTogJCEiOzsKKyAgICAKKyAgICAKKyAgICAjIE9yIHJlcGxhY2UgdGhlIHByZXZpb3VzIHRocmVlIGxpbmVzIHdpdGggdGhpczoKKyAgICAjIG9wZW4gbXkgJGZoLCAnPicsIFxteSAkc3RyIG9yIGRpZSAiRmFpbGVkIHRvIG9wZW4gZmlsZWhhbmRsZTogJCEiOworICAgIAorICAgIAorICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZSBhY2NlcHRzIGZpbGVoYW5kbGUgYXMgd2VsbCBhcyBmaWxlIG5hbWVzLgorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCRmaCk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICAiSGkgRXhjZWwhIik7CisgICAgCisgICAgJHdvcmtib29rLT5jbG9zZSgpOworICAgIAorICAgIAorICAgICMgVGhlIEV4Y2VsIGZpbGUgaW4gbm93IGluICRzdHIuIFJlbWVtYmVyIHRvIGJpbm1vZGUoKSB0aGUgb3V0cHV0CisgICAgIyBmaWxlaGFuZGxlIGJlZm9yZSBwcmludGluZyBpdC4KKyAgICBiaW5tb2RlIFNURE9VVDsKKyAgICBwcmludCAkc3RyOworICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd3JpdGVfdG9fc2NhbGFyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV91dGYxNi5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiB3cml0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgZXhhbXBsZSBzaG93cyBVVEYxNiBlbmNvZGluZy4gV2l0aCBwZXJsIDUuOCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZQordXRmOCB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV91dGYxNi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfdXRmMTYucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2Ygd3JpdGluZyBzb21lIFVuaWNvZGUgdGV4dCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBzaG93cyBVVEYxNiBlbmNvZGluZy4gV2l0aCBwZXJsIDUuOCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZQorICAgICMgdXRmOCB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1heSAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ3VuaWNvZGVfdXRmMTYueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIFVuaWNvZGUgc21pbGV5IGZhY2UgKHdpdGggaW5jcmVhc2VkIGZvbnQgZm9yIGxlZ2liaWxpdHkpCisgICAgbXkgJHNtaWxleSAgICA9IHBhY2sgIm4iLCAweDI2M2E7CisgICAgbXkgJGJpZ19mb250ICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChzaXplID0+IDQwKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQTMnLCAkc21pbGV5LCAkYmlnX2ZvbnQpOworICAgIAorICAgIAorICAgICMgV3JpdGUgYSBwaHJhc2UgaW4gQ3lyaWxsaWMKKyAgICBteSAkdW5pX3N0ciA9IHBhY2sgIkgqIiwgIjA0MmQwNDQyMDQzZTAwMjAwNDQ0MDQ0MDA0MzAwNDM3MDQzMDAwMjAwNCIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzZDA0MzAwMDIwMDQ0MDA0NDMwNDQxMDQ0MTA0M2EwNDNlMDQzYzAwMjEiOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBNScsICR1bmlfc3RyKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQTcnLCBwYWNrICJIKiIsICIwMDc0MDA2NTAwNzMwMDc0Iik7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX3V0ZjE2LnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV91dGYxNl9qYXBhbi5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiB3cml0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgY3JlYXRlcyBhbiBFeGNlbCBmaWxlIHdpdGggdGhlIHdvcmQgTmlwcG9uIGluIDMgY2hhcmFjdGVyIHNldHMuCisKK1RoaXMgZXhhbXBsZSBzaG93cyBVVEYxNiBlbmNvZGluZy4gV2l0aCBwZXJsIDUuOCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZQordXRmOCB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKworU2VlIGFsc28gdGhlIHVuaWNvZGVfMjAyMl9qcC5wbCBhbmQgdW5pY29kZV9zaGlmdF9qaXMucGwgZXhhbXBsZXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfdXRmMTZfamFwYW4uanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX3V0ZjE2X2phcGFuLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIHdyaXRpbmcgc29tZSBVbmljb2RlIHRleHQgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBUaGlzIGNyZWF0ZXMgYW4gRXhjZWwgZmlsZSB3aXRoIHRoZSB3b3JkIE5pcHBvbiBpbiAzIGNoYXJhY3RlciBzZXRzLgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBzaG93cyBVVEYxNiBlbmNvZGluZy4gV2l0aCBwZXJsIDUuOCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZQorICAgICMgdXRmOCB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAgICAjCisgICAgIyBTZWUgYWxzbyB0aGUgdW5pY29kZV8yMDIyX2pwLnBsIGFuZCB1bmljb2RlX3NoaWZ0X2ppcy5wbCBleGFtcGxlcy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1heSAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ3VuaWNvZGVfdXRmMTZfamFwYW4ueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgU2V0IGEgVW5pY29kZSBmb250LgorICAgIG15ICR1bmlfZm9udCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoZm9udCA9PiAnQXJpYWwgVW5pY29kZSBNUycpOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIHNvbWUgVVRGLTE2QkUgVW5pY29kZSB0ZXh0LgorICAgIG15ICRrYW5qaSAgICAgPSBwYWNrICduKicsIDB4NjVlNSwgMHg2NzJjOworICAgIG15ICRrYXRha2FuYSAgPSBwYWNrICduKicsIDB4ZmY4NiwgMHhmZjhlLCAweGZmOWQ7CisgICAgbXkgJGhpcmFnYW5hICA9IHBhY2sgJ24qJywgMHgzMDZiLCAweDMwN2IsIDB4MzA5MzsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQTEnLCAka2FuamksICAgICR1bmlfZm9udCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0EyJywgJGthdGFrYW5hLCAkdW5pX2ZvbnQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBMycsICRoaXJhZ2FuYSwgJHVuaV9mb250KTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjEnLCAnS2FuamknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjInLCAnS2F0YWthbmEnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAnSGlyYWdhbmEnKTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfdXRmMTZfamFwYW4ucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2N5cmlsbGljLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIHdyaXRpbmcgc29tZSBSdXNzaWFuIGN5cmlsbGljIHRleHQgdXNpbmcKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV9jeXJpbGxpYy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfY3lyaWxsaWMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2Ygd3JpdGluZyBzb21lIFJ1c3NpYW4gY3lyaWxsaWMgdGV4dCB1c2luZworICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwNSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICAjIEluIHRoaXMgZXhhbXBsZSB3ZSBnZW5lcmF0ZSB1dGY4IHN0cmluZ3MgZnJvbSBjaGFyYWN0ZXIgZGF0YSBidXQgaW4gYQorICAgICMgcmVhbCBhcHBsaWNhdGlvbiB3ZSB3b3VsZCBleHBlY3QgdGhlbSB0byBjb21lIGZyb20gYW4gZXh0ZXJuYWwgc291cmNlLgorICAgICMKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIFJ1c3NpYW4gd29ya3NoZWV0IG5hbWUgaW4gdXRmOC4KKyAgICBteSAkc2hlZXQgICA9IHBhY2sgIlUqIiwgMHgwNDIxLCAweDA0NDIsIDB4MDQ0MCwgMHgwNDMwLCAweDA0M0QsIDB4MDQzOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDQ2LCAweDA0MzA7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBSdXNzaWFuIHN0cmluZy4KKyAgICBteSAkc3RyICAgICA9IHBhY2sgIlUqIiwgMHgwNDE3LCAweDA0MzQsIDB4MDQ0MCwgMHgwNDMwLCAweDA0MzIsIDB4MDQ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDQyLCAweDA0MzIsIDB4MDQ0MywgMHgwNDM5LCAweDAwMjAsIDB4MDQxQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDM4LCAweDA0NDAsIDB4MDAyMTsKKyAgICAKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV9jeXJpbGxpYy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCRzaGVldCAuICcxJyk7CisgICAgCisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMTgpOworICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICRzdHIpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9jeXJpbGxpYy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfbGlzdC5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byBkaXNwbGF5IGFsbCBhdmFpbGFibGUKK1VuaWNvZGUgY2hhcmFjdGVycyBpbiBhIGZvbnQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfbGlzdC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfbGlzdC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byBkaXNwbGF5IGFsbCBhdmFpbGFibGUKKyAgICAjIFVuaWNvZGUgY2hhcmFjdGVycyBpbiBhIGZvbnQuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd1bmljb2RlX2xpc3QueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgU2V0IGEgVW5pY29kZSBmb250LgorICAgIG15ICR1bmlfZm9udCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoZm9udCA9PiAnQXJpYWwgVW5pY29kZSBNUycpOworICAgIAorICAgICMgQXNjaWkgZm9udCBmb3IgbGFiZWxzLgorICAgIG15ICRjb3VyaWVyICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoZm9udCA9PiAnQ291cmllciBOZXcnKTsKKyAgICAKKyAgICAKKyAgICBteSAkY2hhciA9IDA7CisgICAgCisgICAgIyBMb29wIHRocm91Z2ggYWxsIDMyNzY4IFVURi0xNkJFIGNoYXJhY3RlcnMuCisgICAgIworICAgIGZvciBteSAkcm93ICgwIC4uIDIgKiogMTIgLTEpIHsKKyAgICAgICAgZm9yIG15ICRjb2wgKDAgLi4gMzEpIHsKKyAgICAKKyAgICAgICAgICAgIGxhc3QgaWYgJGNoYXIgPT0gMHhmZmZmOworICAgIAorICAgICAgICAgICAgaWYgKCRjb2wgJSAyID09IDApeworICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZygkcm93LCAkY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCcweCUwNFgnLCAkY2hhciksICRjb3VyaWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCRyb3csICRjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrKCduJywgJGNoYXIrKyksICR1bmlfZm9udCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX2xpc3QucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlXzIwMjJfanAucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBKYXBhbmVzZSBmcm9tIGEgZmlsZSB3aXRoIElTTy0yMDIyLUpQCitlbmNvZGVkIHRleHQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfMjAyMl9qcC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfMjAyMl9qcC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgSmFwYW5lc2UgZnJvbSBhIGZpbGUgd2l0aCBJU08tMjAyMi1KUAorICAgICMgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfMjAyMl9qcC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfMjAyMl9qcC50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGlzby0yMDIyLWpwKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlXzIwMjJfanAucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlXzg4NTlfMTEucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBUaGFpIGZyb20gYSBmaWxlIHdpdGggSVNPLTg4NTktMTEgZW5jb2RlZCB0ZXh0LgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfODg1OV8xMS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfODg1OV8xMS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgVGhhaSBmcm9tIGEgZmlsZSB3aXRoIElTTy04ODU5LTExIGVuY29kZWQgdGV4dC4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV84ODU5XzExLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgCisgICAgCisgICAgbXkgJGZpbGUgPSAndW5pY29kZV84ODU5XzExLnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2RpbmcoaXNvLTg4NTktMTEpJywgJGZpbGUgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZTogJCFcbiI7CisgICAgCisgICAgbXkgJHJvdyA9IDA7CisgICAgCisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgbmV4dCBpZiAvXiMvOyAjIElnbm9yZSB0aGUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBmaWxlLgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfODg1OV8xMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfODg1OV83LnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgR3JlZWsgZnJvbSBhIGZpbGUgd2l0aCBJU08tODg1OS03IGVuY29kZWQgdGV4dC4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlXzg4NTlfNy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfODg1OV83LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBHcmVlayBmcm9tIGEgZmlsZSB3aXRoIElTTy04ODU5LTcgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlXzg4NTlfNy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfODg1OV83LnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2RpbmcoaXNvLTg4NTktNyknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV84ODU5XzcucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2JpZzUucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBDaGluZXNlIGZyb20gYSBmaWxlIHdpdGggQklHNSBlbmNvZGVkIHRleHQuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV9iaWc1LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9iaWc1LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBDaGluZXNlIGZyb20gYSBmaWxlIHdpdGggQklHNSBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfYmlnNS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgODApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfYmlnNS50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGJpZzUpJywgJGZpbGUgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZTogJCFcbiI7CisgICAgCisgICAgbXkgJHJvdyA9IDA7CisgICAgCisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgbmV4dCBpZiAvXiMvOyAjIElnbm9yZSB0aGUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBmaWxlLgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfYmlnNS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfY3AxMjUxLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgUnVzc2lhbiBmcm9tIGEgZmlsZSB3aXRoIENQMTI1MSBlbmNvZGVkIHRleHQuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV9jcDEyNTEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX2NwMTI1MS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgUnVzc2lhbiBmcm9tIGEgZmlsZSB3aXRoIENQMTI1MSBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfY3AxMjUxLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgCisgICAgCisgICAgbXkgJGZpbGUgPSAndW5pY29kZV9jcDEyNTEudHh0JzsKKyAgICAKKyAgICBvcGVuIEZILCAnPDplbmNvZGluZyhjcDEyNTEpJywgJGZpbGUgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZTogJCFcbiI7CisgICAgCisgICAgbXkgJHJvdyA9IDA7CisgICAgCisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgbmV4dCBpZiAvXiMvOyAjIElnbm9yZSB0aGUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBmaWxlLgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfY3AxMjUxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV9jcDEyNTYucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBBcmFiaWMgdGV4dCBmcm9tIGEgQ1AtMTI1NiBlbmNvZGVkIGZpbGUuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV9jcDEyNTYuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX2NwMTI1Ni5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgQXJhYmljIHRleHQgZnJvbSBhIENQLTEyNTYgZW5jb2RlZCBmaWxlLgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX2NwMTI1Ni54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfY3AxMjU2LnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2RpbmcoY3AxMjU2KScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX2NwMTI1Ni5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfa29pOHIucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBSdXNzaWFuIGZyb20gYSBmaWxlIHdpdGggS09JOC1SIGVuY29kZWQgdGV4dC4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX2tvaThyLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9rb2k4ci5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgUnVzc2lhbiBmcm9tIGEgZmlsZSB3aXRoIEtPSTgtUiBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfa29pOHIueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX2tvaThyLnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2Rpbmcoa29pOC1yKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX2tvaThyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV9wb2xpc2hfdXRmOC5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKworVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFBvbGlzaCBmcm9tIGEgZmlsZSB3aXRoIFVURjggZW5jb2RlZCB0ZXh0LgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfcG9saXNoX3V0ZjguanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX3BvbGlzaF91dGY4LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBQb2xpc2ggZnJvbSBhIGZpbGUgd2l0aCBVVEY4IGVuY29kZWQgdGV4dC4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV9wb2xpc2hfdXRmOC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfcG9saXNoX3V0ZjgudHh0JzsKKyAgICAKKyAgICBvcGVuIEZILCAnPDplbmNvZGluZyh1dGY4KScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX3BvbGlzaF91dGY4LnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV9zaGlmdF9qaXMucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBKYXBlbmVzZSB0ZXh0IGZyb20gYSBmaWxlIHdpdGggU2hpZnQtSklTCitlbmNvZGVkIHRleHQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfc2hpZnRfamlzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9zaGlmdF9qaXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIEphcGVuZXNlIHRleHQgZnJvbSBhIGZpbGUgd2l0aCBTaGlmdC1KSVMKKyAgICAjIGVuY29kZWQgdGV4dC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX3NoaWZ0X2ppcy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfc2hpZnRfamlzLnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2Rpbmcoc2hpZnRqaXMpJywgJGZpbGUgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZTogJCFcbiI7CisgICAgCisgICAgbXkgJHJvdyA9IDA7CisgICAgCisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgbmV4dCBpZiAvXiMvOyAjIElnbm9yZSB0aGUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBmaWxlLgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfc2hpZnRfamlzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY3N2Mnhscy5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZQorCitTaW1wbGUgcHJvZ3JhbSB0byBjb252ZXJ0IGEgQ1NWIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZSBmaWxlIHRvIGFuIEV4Y2VsIGZpbGUuCitUaGlzIGlzIG1vcmUgb3IgbGVzcyBhbiBub24tb3Agc2luY2UgRXhjZWwgY2FuIHJlYWQgQ1NWIGZpbGVzLgorVGhlIHByb2dyYW0gdXNlcyBUZXh0OjpDU1ZfWFMgdG8gcGFyc2UgdGhlIENTVi4KKworVXNhZ2U6IGNzdjJ4bHMucGwgZmlsZS5jc3YgbmV3ZmlsZS54bHMKKworCitOT1RFOiBUaGlzIGlzIG9ubHkgYSBzaW1wbGUgY29udmVyc2lvbiB1dGlsaXR5IGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMuCitGb3IgY29udmVydGluZyBhIENTViBvciBUYWIgc2VwYXJhdGVkIG9yIGFueSBvdGhlciB0eXBlIG9mIGRlbGltaXRlZAordGV4dCBmaWxlIHRvIEV4Y2VsIEkgcmVjb21tZW5kIHRoZSBtb3JlIHJpZ29yb3VzIGNzdjJ4bHMgcHJvZ3JhbSB0aGF0IGlzCitwYXJ0IG9mIEguTWVyaWpuIEJyYW5kJ3MgVGV4dDo6Q1NWX1hTIG1vZHVsZSBkaXN0cm8uCisKK1NlZSB0aGUgZXhhbXBsZXMvY3N2MnhscyBsaW5rIGhlcmU6CisgICAgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35obWJyYW5kL1RleHQtQ1NWX1hTL01BTklGRVNUPgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFdyaXRlRXhjZWwgbW9kdWxlCisgICAgIworICAgICMgU2ltcGxlIHByb2dyYW0gdG8gY29udmVydCBhIENTViBjb21tYS1zZXBhcmF0ZWQgdmFsdWUgZmlsZSB0byBhbiBFeGNlbCBmaWxlLgorICAgICMgVGhpcyBpcyBtb3JlIG9yIGxlc3MgYW4gbm9uLW9wIHNpbmNlIEV4Y2VsIGNhbiByZWFkIENTViBmaWxlcy4KKyAgICAjIFRoZSBwcm9ncmFtIHVzZXMgVGV4dDo6Q1NWX1hTIHRvIHBhcnNlIHRoZSBDU1YuCisgICAgIworICAgICMgVXNhZ2U6IGNzdjJ4bHMucGwgZmlsZS5jc3YgbmV3ZmlsZS54bHMKKyAgICAjCisgICAgIworICAgICMgTk9URTogVGhpcyBpcyBvbmx5IGEgc2ltcGxlIGNvbnZlcnNpb24gdXRpbGl0eSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorICAgICMgRm9yIGNvbnZlcnRpbmcgYSBDU1Ygb3IgVGFiIHNlcGFyYXRlZCBvciBhbnkgb3RoZXIgdHlwZSBvZiBkZWxpbWl0ZWQKKyAgICAjIHRleHQgZmlsZSB0byBFeGNlbCBJIHJlY29tbWVuZCB0aGUgbW9yZSByaWdvcm91cyBjc3YyeGxzIHByb2dyYW0gdGhhdCBpcworICAgICMgcGFydCBvZiBILk1lcmlqbiBCcmFuZCdzIFRleHQ6OkNTVl9YUyBtb2R1bGUgZGlzdHJvLgorICAgICMKKyAgICAjIFNlZSB0aGUgZXhhbXBsZXMvY3N2MnhscyBsaW5rIGhlcmU6CisgICAgIyAgICAgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35obWJyYW5kL1RleHQtQ1NWX1hTL01BTklGRVNUPgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIHVzZSBUZXh0OjpDU1ZfWFM7CisgICAgCisgICAgIyBDaGVjayBmb3IgdmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgIGlmICgoJCNBUkdWIDwgMSkgfHwgKCQjQVJHViA+IDIpKSB7CisgICAgICAgZGllKCJVc2FnZTogY3N2MnhscyBjc3ZmaWxlLnR4dCBuZXdmaWxlLnhsc1xuIik7CisgICAgfTsKKyAgICAKKyAgICAjIE9wZW4gdGhlIENvbW1hIFNlcGFyYXRlZCBWYXJpYWJsZSBmaWxlCisgICAgb3BlbiAoQ1NWRklMRSwgJEFSR1ZbMF0pIG9yIGRpZSAiJEFSR1ZbMF06ICQhIjsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyBFeGNlbCB3b3JrYm9vaworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCRBUkdWWzFdKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgQ1NWIHBhcnNpbmcgb2JqZWN0CisgICAgbXkgJGNzdiA9IFRleHQ6OkNTVl9YUy0+bmV3OworICAgIAorICAgICMgUm93IGFuZCBjb2x1bW4gYXJlIHplcm8gaW5kZXhlZAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIAorICAgIHdoaWxlICg8Q1NWRklMRT4pIHsKKyAgICAgICAgaWYgKCRjc3YtPnBhcnNlKCRfKSkgeworICAgICAgICAgICAgbXkgQEZsZCA9ICRjc3YtPmZpZWxkczsKKyAgICAKKyAgICAgICAgICAgIG15ICRjb2wgPSAwOworICAgICAgICAgICAgZm9yZWFjaCBteSAkdG9rZW4gKEBGbGQpIHsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAkY29sLCAkdG9rZW4pOworICAgICAgICAgICAgICAgICRjb2wrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRyb3crKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG15ICRlcnIgPSAkY3N2LT5lcnJvcl9pbnB1dDsKKyAgICAgICAgICAgIHByaW50ICJUZXh0OjpDU1ZfWFMgcGFyc2UoKSBmYWlsZWQgb24gYXJndW1lbnQ6ICIsICRlcnIsICJcbiI7CisgICAgICAgIH0KKyAgICB9CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NzdjJ4bHMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB0YWIyeGxzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFdyaXRlRXhjZWwgbW9kdWxlCisKK1RoZSBmb2xsb3dpbmcgY29udmVydHMgYSB0YWIgc2VwYXJhdGVkIGZpbGUgaW50byBhbiBFeGNlbCBmaWxlCisKK1VzYWdlOiB0YWIyeGxzLnBsIHRhYmZpbGUudHh0IG5ld2ZpbGUueGxzCisKKworTk9URTogVGhpcyBpcyBvbmx5IGEgc2ltcGxlIGNvbnZlcnNpb24gdXRpbGl0eSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorRm9yIGNvbnZlcnRpbmcgYSBDU1Ygb3IgVGFiIHNlcGFyYXRlZCBvciBhbnkgb3RoZXIgdHlwZSBvZiBkZWxpbWl0ZWQKK3RleHQgZmlsZSB0byBFeGNlbCBJIHJlY29tbWVuZCB0aGUgbW9yZSByaWdvcm91cyBjc3YyeGxzIHByb2dyYW0gdGhhdCBpcworcGFydCBvZiBILk1lcmlqbiBCcmFuZCdzIFRleHQ6OkNTVl9YUyBtb2R1bGUgZGlzdHJvLgorCitTZWUgdGhlIGV4YW1wbGVzL2NzdjJ4bHMgbGluayBoZXJlOgorICAgIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZQorICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgY29udmVydHMgYSB0YWIgc2VwYXJhdGVkIGZpbGUgaW50byBhbiBFeGNlbCBmaWxlCisgICAgIworICAgICMgVXNhZ2U6IHRhYjJ4bHMucGwgdGFiZmlsZS50eHQgbmV3ZmlsZS54bHMKKyAgICAjCisgICAgIworICAgICMgTk9URTogVGhpcyBpcyBvbmx5IGEgc2ltcGxlIGNvbnZlcnNpb24gdXRpbGl0eSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorICAgICMgRm9yIGNvbnZlcnRpbmcgYSBDU1Ygb3IgVGFiIHNlcGFyYXRlZCBvciBhbnkgb3RoZXIgdHlwZSBvZiBkZWxpbWl0ZWQKKyAgICAjIHRleHQgZmlsZSB0byBFeGNlbCBJIHJlY29tbWVuZCB0aGUgbW9yZSByaWdvcm91cyBjc3YyeGxzIHByb2dyYW0gdGhhdCBpcworICAgICMgcGFydCBvZiBILk1lcmlqbiBCcmFuZCdzIFRleHQ6OkNTVl9YUyBtb2R1bGUgZGlzdHJvLgorICAgICMKKyAgICAjIFNlZSB0aGUgZXhhbXBsZXMvY3N2MnhscyBsaW5rIGhlcmU6CisgICAgIyAgICAgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35obWJyYW5kL1RleHQtQ1NWX1hTL01BTklGRVNUPgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgICMgQ2hlY2sgZm9yIHZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMKKyAgICBpZiAoKCQjQVJHViA8IDEpIHx8ICgkI0FSR1YgPiAyKSkgeworICAgICAgICBkaWUoIlVzYWdlOiB0YWIyeGxzIHRhYmZpbGUudHh0IG5ld2ZpbGUueGxzXG4iKTsKKyAgICB9OworICAgIAorICAgIAorICAgICMgT3BlbiB0aGUgdGFiIGRlbGltaXRlZCBmaWxlCisgICAgb3BlbiAoVEFCRklMRSwgJEFSR1ZbMF0pIG9yIGRpZSAiJEFSR1ZbMF06ICQhIjsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyBFeGNlbCB3b3JrYm9vaworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCRBUkdWWzFdKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBSb3cgYW5kIGNvbHVtbiBhcmUgemVybyBpbmRleGVkCisgICAgbXkgJHJvdyA9IDA7CisgICAgCisgICAgd2hpbGUgKDxUQUJGSUxFPikgeworICAgICAgICBjaG9tcDsKKyAgICAgICAgIyBTcGxpdCBvbiBzaW5nbGUgdGFiCisgICAgICAgIG15IEBGbGQgPSBzcGxpdCgnXHQnLCAkXyk7CisgICAgCisgICAgICAgIG15ICRjb2wgPSAwOworICAgICAgICBmb3JlYWNoIG15ICR0b2tlbiAoQEZsZCkgeworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgJGNvbCwgJHRva2VuKTsKKyAgICAgICAgICAgICRjb2wrKzsKKyAgICAgICAgfQorICAgICAgICAkcm93Kys7CisgICAgfQorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy90YWIyeGxzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGF0ZWNhbGMxLnBsCisKKworCitOT1RFOiBBbiBlYXNpZXIgd2F5IG9mIHdyaXRpbmcgZGF0ZXMgYW5kIHRpbWVzIGlzIHRvIHVzZSB0aGUgbmV3ZXIKKyAgICAgIHdyaXRlX2RhdGVfdGltZSgpIFdvcmtzaGVldCBtZXRob2QuIFNlZSB0aGUgZGF0ZV90aW1lLnBsIGV4YW1wbGUuCisKKworCitEZW1vbnN0cmF0aW9uIG9mIHdyaXRpbmcgZGF0ZS90aW1lIGNlbGxzIHRvIEV4Y2VsIHNwcmVhZHNoZWV0cywKK3VzaW5nIFVOSVgvUGVybCB0aW1lIGFzIHNvdXJjZSBvZiBkYXRlL3RpbWUuCisKKworCitVTklYL1BlcmwgdGltZSBpcyB0aGUgdGltZSBzaW5jZSB0aGUgRXBvY2ggKDAwOjAwOjAwIEdNVCwgMSBKYW4gMTk3MCkKK21lYXN1cmVkIGluIHNlY29uZHMuCisKK0FuIEV4Y2VsIGZpbGUgY2FuIHVzZSBleGFjdGx5IG9uZSBvZiB0d28gZGlmZmVyZW50IGRhdGUvdGltZSBzeXN0ZW1zLgorSW4gdGhlc2Ugc3lzdGVtcywgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRheXMKKyhhbmQgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgZGF5KSBzaW5jZSBhIHN0YXJ0IHBvaW50LiBUaGUgZmxvYXRpbmcgcG9pbnQKK251bWJlciBpcyByZWZlcnJlZCB0byBhcyBhICdzZXJpYWwnLgorCitUaGUgdHdvIHN5c3RlbXMgKCcxOTAwJyBhbmQgJzE5MDQnKSB1c2UgZGlmZmVyZW50IHN0YXJ0aW5nIHBvaW50czoKKworICcxOTAwJzsgJzEuMDAnIGlzIDEgSmFuIDE5MDAgQlVUIDE5MDAgaXMgZXJyb25lb3VzbHkgcmVnYXJkZWQgYXMKKyAgICAgICAgIGEgbGVhcCB5ZWFyIC0gc2VlOgorICAgICAgICAgICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL3N1cHBvcnQva2IvYXJ0aWNsZXMvUTE4MS8zLzcwLmFzcAorICAgICAgICAgZm9yIHRoZSBleGN1c2VeSF5IXkheSF5IXkhyZWFzb24uCisgJzE5MDQnOyAnMS4wMCcgaXMgMiBKYW4gMTkwNC4KKworVGhlICcxOTA0JyBzeXN0ZW0gaXMgdGhlIGRlZmF1bHQgZm9yIEFwcGxlIE1hY3MuIFdpbmRvd3MgdmVyc2lvbnMgb2YKK0V4Y2VsIGhhdmUgdGhlIG9wdGlvbiB0byB1c2UgdGhlICcxOTA0JyBzeXN0ZW0uCisKK05vdGUgdGhhdCBWaXN1YWwgQmFzaWMncyAiRGF0ZVNlcmlhbCIgZnVuY3Rpb24gZG9lcyBOT1QgZXJyb25lb3VzbHkKK3JlZ2FyZCAxOTAwIGFzIGEgbGVhcCB5ZWFyLCBhbmQgdGh1cyBpdHMgc2VyaWFscyBkbyBub3QgYWdyZWUgd2l0aAordGhlIDE5MDAgc2VyaWFscyBvZiBFeGNlbCBmb3IgZGF0ZXMgYmVmb3JlIDEgTWFyIDE5MDAuCisKK05vdGUgdGhhdCBTdGFyT2ZmaWNlIChhdCBsZWFzdCBhdCB2ZXJzaW9uIDUuMikgZG9lcyBOT1QgZXJyb25lb3VzbHkKK3JlZ2FyZCAxOTAwIGFzIGEgbGVhcCB5ZWFyLCBhbmQgdGh1cyBpdHMgc2VyaWFscyBkbyBub3QgYWdyZWUgd2l0aAordGhlIDE5MDAgc2VyaWFscyBvZiBFeGNlbCBmb3IgZGF0ZXMgYmVmb3JlIDEgTWFyIDE5MDAuCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBOT1RFOiBBbiBlYXNpZXIgd2F5IG9mIHdyaXRpbmcgZGF0ZXMgYW5kIHRpbWVzIGlzIHRvIHVzZSB0aGUgbmV3ZXIKKyAgICAjICAgICAgIHdyaXRlX2RhdGVfdGltZSgpIFdvcmtzaGVldCBtZXRob2QuIFNlZSB0aGUgZGF0ZV90aW1lLnBsIGV4YW1wbGUuCisgICAgIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0aW9uIG9mIHdyaXRpbmcgZGF0ZS90aW1lIGNlbGxzIHRvIEV4Y2VsIHNwcmVhZHNoZWV0cywKKyAgICAjIHVzaW5nIFVOSVgvUGVybCB0aW1lIGFzIHNvdXJjZSBvZiBkYXRlL3RpbWUuCisgICAgIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBVTklYL1BlcmwgdGltZSBpcyB0aGUgdGltZSBzaW5jZSB0aGUgRXBvY2ggKDAwOjAwOjAwIEdNVCwgMSBKYW4gMTk3MCkKKyAgICAjIG1lYXN1cmVkIGluIHNlY29uZHMuCisgICAgIworICAgICMgQW4gRXhjZWwgZmlsZSBjYW4gdXNlIGV4YWN0bHkgb25lIG9mIHR3byBkaWZmZXJlbnQgZGF0ZS90aW1lIHN5c3RlbXMuCisgICAgIyBJbiB0aGVzZSBzeXN0ZW1zLCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZGF5cworICAgICMgKGFuZCBmcmFjdGlvbmFsIHBhcnRzIG9mIHRoZSBkYXkpIHNpbmNlIGEgc3RhcnQgcG9pbnQuIFRoZSBmbG9hdGluZyBwb2ludAorICAgICMgbnVtYmVyIGlzIHJlZmVycmVkIHRvIGFzIGEgJ3NlcmlhbCcuCisgICAgIworICAgICMgVGhlIHR3byBzeXN0ZW1zICgnMTkwMCcgYW5kICcxOTA0JykgdXNlIGRpZmZlcmVudCBzdGFydGluZyBwb2ludHM6CisgICAgIworICAgICMgICcxOTAwJzsgJzEuMDAnIGlzIDEgSmFuIDE5MDAgQlVUIDE5MDAgaXMgZXJyb25lb3VzbHkgcmVnYXJkZWQgYXMKKyAgICAjICAgICAgICAgIGEgbGVhcCB5ZWFyIC0gc2VlOgorICAgICMgICAgICAgICAgICBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL3N1cHBvcnQva2IvYXJ0aWNsZXMvUTE4MS8zLzcwLmFzcAorICAgICMgICAgICAgICAgZm9yIHRoZSBleGN1c2VeSF5IXkheSF5IXkhyZWFzb24uCisgICAgIyAgJzE5MDQnOyAnMS4wMCcgaXMgMiBKYW4gMTkwNC4KKyAgICAjCisgICAgIyBUaGUgJzE5MDQnIHN5c3RlbSBpcyB0aGUgZGVmYXVsdCBmb3IgQXBwbGUgTWFjcy4gV2luZG93cyB2ZXJzaW9ucyBvZgorICAgICMgRXhjZWwgaGF2ZSB0aGUgb3B0aW9uIHRvIHVzZSB0aGUgJzE5MDQnIHN5c3RlbS4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgVmlzdWFsIEJhc2ljJ3MgIkRhdGVTZXJpYWwiIGZ1bmN0aW9uIGRvZXMgTk9UIGVycm9uZW91c2x5CisgICAgIyByZWdhcmQgMTkwMCBhcyBhIGxlYXAgeWVhciwgYW5kIHRodXMgaXRzIHNlcmlhbHMgZG8gbm90IGFncmVlIHdpdGgKKyAgICAjIHRoZSAxOTAwIHNlcmlhbHMgb2YgRXhjZWwgZm9yIGRhdGVzIGJlZm9yZSAxIE1hciAxOTAwLgorICAgICMKKyAgICAjIE5vdGUgdGhhdCBTdGFyT2ZmaWNlIChhdCBsZWFzdCBhdCB2ZXJzaW9uIDUuMikgZG9lcyBOT1QgZXJyb25lb3VzbHkKKyAgICAjIHJlZ2FyZCAxOTAwIGFzIGEgbGVhcCB5ZWFyLCBhbmQgdGh1cyBpdHMgc2VyaWFscyBkbyBub3QgYWdyZWUgd2l0aAorICAgICMgdGhlIDE5MDAgc2VyaWFscyBvZiBFeGNlbCBmb3IgZGF0ZXMgYmVmb3JlIDEgTWFyIDE5MDAuCisgICAgIworICAgIAorICAgICMgQ29weXJpZ2h0IDIwMDAsIEFuZHJldyBCZW5oYW0sIGFkc2JAYmlnZm9vdC5jb20KKyAgICAjCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIENhbGN1bGF0aW9uIGRlc2NyaXB0aW9uCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PQorICAgICMKKyAgICAjIDE5MDAgc3lzdGVtCisgICAgIyAtLS0tLS0tLS0tLQorICAgICMgVW5peCB0aW1lIGlzICcwJyBhdCAwMDowMDowMCBHTVQgMSBKYW4gMTk3MCwgaS5lLiA3MCB5ZWFycyBhZnRlciAxIEphbiAxOTAwLgorICAgICMgT2YgdGhvc2UgNzAgeWVhcnMsIDE3ICgxOTA0LDA4LDEyLDE2LDIwLDI0LDI4LDMyLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0LDY4KQorICAgICMgd2VyZSBsZWFwIHllYXJzIHdpdGggYW4gZXh0cmEgZGF5LgorICAgICMgVGh1cyB0aGVyZSB3ZXJlIDE3ICsgNzAqMzY1IGRheXMgPSAyNTU2NyBkYXlzIGJldHdlZW4gMSBKYW4gMTkwMCBhbmQKKyAgICAjIDEgSmFuIDE5NzAuCisgICAgIyBJbiB0aGUgMTkwMCBzeXN0ZW0sICcxJyBpcyAxIEphbiAxOTAwLCBidXQgYXMgMTkwMCB3YXMgbm90IGEgbGVhcCB5ZWFyCisgICAgIyAxIEphbiAxOTAwIHNob3VsZCByZWFsbHkgYmUgJzInLCBzbyAxIEphbiAxOTcwIGlzICcyNTU2OScuCisgICAgIworICAgICMgMTkwNCBzeXN0ZW0KKyAgICAjIC0tLS0tLS0tLS0tCisgICAgIyBVbml4IHRpbWUgaXMgJzAnIGF0IDAwOjAwOjAwIEdNVCAxIEphbiAxOTcwLCBpLmUuIDY2IHllYXJzIGFmdGVyIDEgSmFuIDE5MDQuCisgICAgIyBPZiB0aG9zZSA2NiB5ZWFycywgMTcgKDE5MDQsMDgsMTIsMTYsMjAsMjQsMjgsMzIsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjQsNjgpCisgICAgIyB3ZXJlIGxlYXAgeWVhcnMgd2l0aCBhbiBleHRyYSBkYXkuCisgICAgIyBUaHVzIHRoZXJlIHdlcmUgMTcgKyA2NiozNjUgZGF5cyA9IDI0MTA3IGRheXMgYmV0d2VlbiAxIEphbiAxOTA0IGFuZAorICAgICMgMSBKYW4gMTk3MC4KKyAgICAjIEluIHRoZSAxOTA0IHN5c3RlbSwgMiBKYW4gMTkwNCBiZWluZyAnMScsIDEgSmFuIDE5NzAgaXMgJzI0MTA3Jy4KKyAgICAjCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIENvcHlyaWdodCAoYykgMjAwMCwgQW5kcmV3IEJlbmhhbS4KKyAgICAjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IKKyAgICAjIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorICAgICMKKyAgICAjIEFuZHJldyBCZW5oYW0sIGFkc2JAYmlnZm9vdC5jb20KKyAgICAjIExvbmRvbiwgVW5pdGVkIEtpbmdkb20KKyAgICAjIDExIE5vdiAyMDAwCisgICAgIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICB1c2UgVGltZTo6TG9jYWw7CisgICAgCisgICAgdXNlIHZhcnMgcXcvJERBVEVfU1lTVEVNLzsKKyAgICAKKyAgICAjIFVzZSAxOTAwIGRhdGUgc3lzdGVtIG9uIGFsbCBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBBcHBsZSBNYWMgKGZvciB3aGljaAorICAgICMgdXNlIDE5MDQgZGF0ZSBzeXN0ZW0pLgorICAgICREQVRFX1NZU1RFTSA9ICgkXk8gZXEgJ01hY09TJykgPyAxIDogMDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJkYXRlcy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgbXkgJGZvcm1hdF9kYXRlID0gICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXRfZGF0ZS0+c2V0X251bV9mb3JtYXQoJ2QgbW1tbSB5eXknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsMSwyMSk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nICgwLDAsIlRoZSBlcG9jaCAoR01UKSIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX251bWJlciAoMCwxLCZjYWxjX3NlcmlhbCgwLDEpLDB4MTYpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyAoMSwwLCJUaGUgZXBvY2ggKGxvY2FsdGltZSkiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIgKDEsMSwmY2FsY19zZXJpYWwoMCwwKSwweDE2KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcgKDIsMCwiVG9kYXkiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIgKDIsMSwmY2FsY19zZXJpYWwoKSwkZm9ybWF0X2RhdGUpOworICAgIAorICAgIG15ICRjaHJpc3RtYXMyMDAwID0gdGltZWxvY2FsKDAsMCwwLDI1LDExLDEwMCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nICgzLDAsIkNocmlzdG1hcyAyMDAwIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfbnVtYmVyICgzLDEsJmNhbGNfc2VyaWFsKCRjaHJpc3RtYXMyMDAwKSwkZm9ybWF0X2RhdGUpOworICAgIAorICAgICR3b3JrYm9vay0+Y2xvc2UoKTsKKyAgICAKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGNhbGNfc2VyaWFsKCkKKyAgICAjCisgICAgIyBDYWxsZWQgd2l0aCAodXAgdG8pIDIgcGFyYW1ldGVycy4KKyAgICAjICAgMS4gIFVuaXggdGltZXN0YW1wLiAgSWYgb21pdHRlZCwgdXNlcyBjdXJyZW50IHRpbWUuCisgICAgIyAgIDIuICBHTVQgZmxhZy4gU2V0IHRvICcxJyB0byByZXR1cm4gc2VyaWFsIGluIEdNVC4KKyAgICAjICAgICAgIElmIG9taXR0ZWQsIHJldHVybnMgc2VyaWFsIGluIGFwcHJvcHJpYXRlIHRpbWV6b25lLgorICAgICMKKyAgICAjIFJldHVybnMgZGF0ZS90aW1lIHNlcmlhbCBhY2NvcmRpbmcgdG8gJERBVEVfU1lTVEVNIHNlbGVjdGVkCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc3ViIGNhbGNfc2VyaWFsIHsKKyAgICAJbXkgJHRpbWUgPSAoZGVmaW5lZCAkX1swXSkgPyAkX1swXSA6IHRpbWUoKTsKKyAgICAJbXkgJGdtdGZsYWcgPSAoZGVmaW5lZCAkX1sxXSkgPyAkX1sxXSA6IDA7CisgICAgCisgICAgCSMgRGl2aWRlIHRpbWVzdGFtcCBieSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhIGRheS4KKyAgICAJIyBUaGlzIGdpdmVzIGEgZGF0ZSBzZXJpYWwgd2l0aCAnMCcgb24gMSBKYW4gMTk3MC4KKyAgICAJbXkgJHNlcmlhbCA9ICR0aW1lIC8gODY0MDA7CisgICAgCisgICAgCSMgQWRqdXN0IHRoZSBkYXRlIHNlcmlhbCBieSB0aGUgb2Zmc2V0IGFwcHJvcHJpYXRlIHRvIHRoZQorICAgIAkjIGN1cnJlbnRseSBzZWxlY3RlZCBzeXN0ZW0gKDE5MDAvMTkwNCkuCisgICAgCWlmICgkREFURV9TWVNURU0gPT0gMCkgewkjIHVzZSAxOTAwIHN5c3RlbQorICAgIAkJJHNlcmlhbCArPSAyNTU2OTsKKyAgICAJfSBlbHNlIHsJCQkjIHVzZSAxOTA0IHN5c3RlbQorICAgIAkJJHNlcmlhbCArPSAyNDEwNzsKKyAgICAJfQorICAgIAorICAgIAl1bmxlc3MgKCRnbXRmbGFnKSB7CisgICAgCQkjIE5vdyBoYXZlIGEgJ3Jhdycgc2VyaWFsIHdpdGggdGhlIHJpZ2h0IG9mZnNldC4gQnV0IHRoaXMKKyAgICAJCSMgZ2l2ZXMgYSBzZXJpYWwgaW4gR01ULCB3aGljaCBpcyBmYWxzZSB1bmxlc3MgdGhlIHRpbWV6b25lCisgICAgCQkjIGlzIEdNVC4gV2UgbmVlZCB0byBhZGp1c3QgdGhlIHNlcmlhbCBieSB0aGUgYXBwcm9wcmlhdGUKKyAgICAJCSMgdGltZXpvbmUgb2Zmc2V0LgorICAgIAkJIyBDYWxjdWxhdGUgdGhlIGFwcHJvcHJpYXRlIHRpbWV6b25lIG9mZnNldCBieSBzZWVpbmcgd2hhdAorICAgIAkJIyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBsb2NhbHRpbWUgYW5kIGdtdGltZSBmb3IgdGhlIGdpdmVuCisgICAgCQkjIHRpbWUgYXJlLgorICAgIAorICAgIAkJbXkgQGdtdGltZSA9IGdtdGltZSgkdGltZSk7CisgICAgCQlteSBAbHRpbWUgID0gbG9jYWx0aW1lKCR0aW1lKTsKKyAgICAKKyAgICAJCSMgRm9yIHRoZSBmaXJzdCA3IGVsZW1lbnRzIG9mIHRoZSB0d28gYXJyYXlzLCBhZGp1c3QgdGhlCisgICAgCQkjIGRhdGUgc2VyaWFsIHdoZXJlIHRoZSBlbGVtZW50cyBkaWZmZXIuCisgICAgCQlmb3IgKDAgLi4gNikgeworICAgIAkJCW15ICRkaWZmID0gJGx0aW1lWyRfXSAtICRnbXRpbWVbJF9dOworICAgIAkJCWlmICgkZGlmZikgeworICAgIAkJCQkkc2VyaWFsICs9IF9hZGp1c3RtZW50KCRkaWZmLCRfKTsKKyAgICAJCQl9CisgICAgCQl9CisgICAgCX0KKyAgICAKKyAgICAJIyBQZXJwZXR1YXRlIHRoZSBlcnJvciB0aGF0IDE5MDAgd2FzIGEgbGVhcCB5ZWFyIGJ5IGRlY3JlbWVudGluZworICAgIAkjIHRoZSBzZXJpYWwgaWYgd2UncmUgdXNpbmcgdGhlIDE5MDAgc3lzdGVtIGFuZCB0aGUgZGF0ZSBpcyBwcmlvciB0bworICAgIAkjIDEgTWFyIDE5MDAuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgbWFraW5nIHNlcmlhbCB2YWx1ZSAnNjAnCisgICAgCSMgMjkgRmViIDE5MDAuCisgICAgCisgICAgCSMgVGhpcyBmaXggb25seSBoYXMgYW55IGVmZmVjdCBpZiBVTklYL1BlcmwgdGltZSBvbiB0aGUgcGxhdGZvcm0KKyAgICAJIyBjYW4gcmVwcmVzZW50IDE5MDAuIE1hbnkgY2FuJ3QuCisgICAgCisgICAgCXVubGVzcyAoJERBVEVfU1lTVEVNKSB7CisgICAgCQkkc2VyaWFsLS0gaWYgKCRzZXJpYWwgPCA2MSk7CSMgJzYxJyBpcyAxIE1hciAxOTAwCisgICAgCX0KKyAgICAJcmV0dXJuICRzZXJpYWw7CisgICAgfQorICAgIAorICAgIHN1YiBfYWRqdXN0bWVudCB7CisgICAgCSMgQmFzZWQgb24gdGhlIGRpZmZlcmVuY2UgaW4gdGhlIGxvY2FsdGltZS9nbXRpbWUgYXJyYXkgZWxlbWVudHMKKyAgICAJIyBudW1iZXIsIHJldHVybiB0aGUgYWRqdXN0bWVudCByZXF1aXJlZCB0byB0aGUgc2VyaWFsLgorICAgIAorICAgIAkjIFdlIG9ubHkgbG9vayBhdCBzb21lIGVsZW1lbnRzIG9mIHRoZSBsb2NhbHRpbWUvZ210aW1lIGFycmF5czoKKyAgICAJIyAgICBzZWNvbmRzICAgIHVubGlrZWx5IHRvIGJlIGRpZmZlcmVudCBhcyBhbGwga25vd24gdGltZXpvbmVzCisgICAgCSMgICAgICAgICAgICAgICBoYXZlIGFuIG9mZnNldCBvZiBpbnRlZ3JhbCBtdWx0aXBsZXMgb2YgMTUgbWludXRlcywKKyAgICAJIwkJYnV0IGl0J3MgZWFzeSB0byBkby4KKyAgICAJIyAgICBtaW51dGVzICAgIHdpbGwgYmUgZGlmZmVyZW50IGZvciB0aW1lem9uZSBvZmZzZXRzIHdoaWNoIGFyZQorICAgIAkjCQlub3QgYW4gZXhhY3QgbnVtYmVyIG9mIGhvdXJzLgorICAgIAkjICAgIGhvdXJzCXZlcnkgbGlrZWx5IHRvIGJlIGRpZmZlcmVudC4KKyAgICAJIyAgICB3ZWVrZGF5CXdpbGwgZGlmZmVyIHdoZW4gbG9jYWx0aW1lL2dtdGltZSBkaWZmZXJlbmNlCisgICAgCSMJCXN0cmFkZGxlcyBtaWRuaWdodC4KKyAgICAJIworICAgIAkjIEFzc3VtZSB0aGF0IGRpZmZlcmVuY2UgYmV0d2VlbiBsb2NhbHRpbWUgYW5kIGdtdGltZSBpcyBsZXNzIHRoYW4KKyAgICAJIyA1IGRheXMsIHRoZW4gZG9uJ3QgaGF2ZSB0byBkbyBtYXRocyBmb3IgZGF5IG9mIG1vbnRoLCBtb250aCBudW1iZXIsCisgICAgCSMgeWVhciBudW1iZXIsIGV0Yy4uLgorICAgIAorICAgIAlteSAoJGRlbHRhLCRlbGVtZW50KSA9IEBfOworICAgIAlteSAkYWRqdXN0ID0gMDsKKyAgICAKKyAgICAJaWYgKCRlbGVtZW50ID09IDApIHsJCSMgU2Vjb25kcworICAgIAkJJGFkanVzdCA9ICRkZWx0YS84NjQwMDsJCSMgNjAgKiA2MCAqIDI0CisgICAgCX0gZWxzaWYgKCRlbGVtZW50ID09IDEpIHsJIyBNaW51dGVzCisgICAgCQkkYWRqdXN0ID0gJGRlbHRhLzE0NDA7CQkjIDYwICogMjQKKyAgICAJfSBlbHNpZiAoJGVsZW1lbnQgPT0gMikgewkjIEhvdXJzCisgICAgCQkkYWRqdXN0ID0gJGRlbHRhLzI0OwkJIyAyNAorICAgIAl9IGVsc2lmICgkZWxlbWVudCA9PSA2KSB7CSMgRGF5IG9mIHdlZWsgbnVtYmVyCisgICAgCQkjIENhdGNoIGRpZmZlcmVuY2Ugc3RyYWRkbGluZyBTYXQvU3VuIGluIGVpdGhlciBkaXJlY3Rpb24KKyAgICAJCSRkZWx0YSArPSA3IGlmICgkZGVsdGEgPCAtNCk7CisgICAgCQkkZGVsdGEgLT0gNyBpZiAoJGRlbHRhID4gNCk7CisgICAgCisgICAgCQkkYWRqdXN0ID0gJGRlbHRhOworICAgIAl9CisgICAgCXJldHVybiAkYWRqdXN0OworICAgIH0KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZGF0ZWNhbGMxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGF0ZWNhbGMyLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2luZyB0aGUgRGF0ZTo6Q2FsYyBtb2R1bGUgdG8gY2FsY3VsYXRlIEV4Y2VsIGRhdGVzLgorCitOT1RFOiBBbiBlYXNpZXIgd2F5IG9mIHdyaXRpbmcgZGF0ZXMgYW5kIHRpbWVzIGlzIHRvIHVzZSB0aGUgbmV3ZXIKKyAgICAgIHdyaXRlX2RhdGVfdGltZSgpIFdvcmtzaGVldCBtZXRob2QuIFNlZSB0aGUgZGF0ZV90aW1lLnBsIGV4YW1wbGUuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzaW5nIHRoZSBEYXRlOjpDYWxjIG1vZHVsZSB0byBjYWxjdWxhdGUgRXhjZWwgZGF0ZXMuCisgICAgIworICAgICMgTk9URTogQW4gZWFzaWVyIHdheSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyBpcyB0byB1c2UgdGhlIG5ld2VyCisgICAgIyAgICAgICB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLiBTZWUgdGhlIGRhdGVfdGltZS5wbCBleGFtcGxlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgSnVuZSAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgdXNlIERhdGU6OkNhbGMgcXcoRGVsdGFfREhNUyk7ICMgWW91IG1heSBuZWVkIHRvIGluc3RhbGwgdGhpcyBtb2R1bGUuCisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImV4Y2VsX2RhdGUyLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIEV4cGFuZCB0aGUgZmlyc3QgY29sdW1uIHNvIHRoYXQgdGhlIGRhdGUgaXMgdmlzaWJsZS4KKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCJBOkEiLCAyNSk7CisgICAgCisgICAgCisgICAgIyBBZGQgYSBmb3JtYXQgZm9yIHRoZSBkYXRlCisgICAgbXkgJGZvcm1hdCA9ICAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfbnVtX2Zvcm1hdCgnZCBtbW1tIHl5eSBISDpNTTpTUycpOworICAgIAorICAgIAorICAgIG15ICRkYXRlOworICAgIAorICAgICMgV3JpdGUgc29tZSBkYXRlcyBhbmQgdGltZXMKKyAgICAkZGF0ZSA9ICBleGNlbF9kYXRlKDE5MDAsIDEsIDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCJBMSIsICRkYXRlLCAkZm9ybWF0KTsKKyAgICAKKyAgICAkZGF0ZSA9ICBleGNlbF9kYXRlKDIwMDAsIDEsIDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCJBMiIsICRkYXRlLCAkZm9ybWF0KTsKKyAgICAKKyAgICAkZGF0ZSA9ICBleGNlbF9kYXRlKDIwMDAsIDQsIDE3LCAxNCwgMzMsIDE1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgiQTMiLCAkZGF0ZSwgJGZvcm1hdCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGV4Y2VsX2RhdGUoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpCisgICAgIworICAgICMgQ3JlYXRlIGFuIEV4Y2VsIGRhdGUgaW4gdGhlIDE5MDAgZm9ybWF0LiBBbGwgb2YgdGhlIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwKKyAgICAjIGJ1dCB5b3Ugc2hvdWxkIGF0IGxlYXN0IGFkZCAkeWVhcnMuCisgICAgIworICAgICMgQ29ycmVjdHMgZm9yIEV4Y2VsJ3MgbWlzc2luZyBsZWFwIGRheSBpbiAxOTAwLiBTZWUgZXhjZWxfdGltZTEucGwgZm9yIGFuCisgICAgIyBleHBsYW5hdGlvbi4KKyAgICAjCisgICAgc3ViIGV4Y2VsX2RhdGUgeworICAgIAorICAgICAgICBteSAkeWVhcnMgICA9ICRfWzBdIHx8IDE5MDA7CisgICAgICAgIG15ICRtb250aHMgID0gJF9bMV0gfHwgMTsKKyAgICAgICAgbXkgJGRheXMgICAgPSAkX1syXSB8fCAxOworICAgICAgICBteSAkaG91cnMgICA9ICRfWzNdIHx8IDA7CisgICAgICAgIG15ICRtaW51dGVzID0gJF9bNF0gfHwgMDsKKyAgICAgICAgbXkgJHNlY29uZHMgPSAkX1s1XSB8fCAwOworICAgIAorICAgICAgICBteSBAZGF0ZSA9ICgkeWVhcnMsICRtb250aHMsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcyk7CisgICAgICAgIG15IEBlcG9jaCA9ICgxODk5LCAxMiwgMzEsIDAsIDAsIDApOworICAgIAorICAgICAgICAoJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKSA9IERlbHRhX0RITVMoQGVwb2NoLCBAZGF0ZSk7CisgICAgCisgICAgICAgIG15ICRkYXRlID0gJGRheXMgKyAoJGhvdXJzKjM2MDAgKyRtaW51dGVzKjYwICskc2Vjb25kcykvKDI0KjYwKjYwKTsKKyAgICAKKyAgICAgICAgIyBBZGQgYSBkYXkgZm9yIEV4Y2VsJ3MgbWlzc2luZyBsZWFwIGRheSBpbiAxOTAwCisgICAgICAgICRkYXRlKysgaWYgKCRkYXRlID4gNTkpOworICAgIAorICAgICAgICByZXR1cm4gJGRhdGU7CisgICAgfQorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBleGNlbF9kYXRlKCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKQorICAgICMKKyAgICAjIENyZWF0ZSBhbiBFeGNlbCBkYXRlIGluIHRoZSAxOTA0IGZvcm1hdC4gQWxsIG9mIHRoZSBhcmd1bWVudHMgYXJlIG9wdGlvbmFsCisgICAgIyBidXQgeW91IHNob3VsZCBhdCBsZWFzdCBhZGQgJHllYXJzLgorICAgICMKKyAgICAjIFlvdSB3aWxsIGFsc28gbmVlZCB0byBjYWxsICR3b3JrYm9vay0+c2V0XzE5MDQoKSBmb3IgdGhpcyBmb3JtYXQgdG8gYmUgdmFsaWQuCisgICAgIworICAgIHN1YiBleGNlbF9kYXRlXzE5MDQgeworICAgIAorICAgICAgICBteSAkeWVhcnMgICA9ICRfWzBdIHx8IDE5MDA7CisgICAgICAgIG15ICRtb250aHMgID0gJF9bMV0gfHwgMTsKKyAgICAgICAgbXkgJGRheXMgICAgPSAkX1syXSB8fCAxOworICAgICAgICBteSAkaG91cnMgICA9ICRfWzNdIHx8IDA7CisgICAgICAgIG15ICRtaW51dGVzID0gJF9bNF0gfHwgMDsKKyAgICAgICAgbXkgJHNlY29uZHMgPSAkX1s1XSB8fCAwOworICAgIAorICAgICAgICBteSBAZGF0ZSA9ICgkeWVhcnMsICRtb250aHMsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcyk7CisgICAgICAgIG15IEBlcG9jaCA9ICgxOTA0LCAxLCAxLCAwLCAwLCAwKTsKKyAgICAKKyAgICAgICAgKCRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykgPSBEZWx0YV9ESE1TKEBlcG9jaCwgQGRhdGUpOworICAgIAorICAgICAgICBteSAkZGF0ZSA9ICRkYXlzICsgKCRob3VycyozNjAwICskbWludXRlcyo2MCArJHNlY29uZHMpLygyNCo2MCo2MCk7CisgICAgCisgICAgICAgIHJldHVybiAkZGF0ZTsKKyAgICB9CisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2RhdGVjYWxjMi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGxlY3hlLnBsCisKKworVXRpbGl0eSBwcm9ncmFtIHRvIGNvbnZlcnQgYW4gRXhjZWwgZmlsZSBpbnRvIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKK3Byb2dyYW0gdXNpbmcgV2luMzI6Ok9MRQorCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjCisgICAgIyBVdGlsaXR5IHByb2dyYW0gdG8gY29udmVydCBhbiBFeGNlbCBmaWxlIGludG8gYSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorICAgICMgcHJvZ3JhbSB1c2luZyBXaW4zMjo6T0xFCisgICAgIworICAgIAorICAgICMKKyAgICAjIGxlY3hlIHByb2dyYW0KKyAgICAjIGJ5IHQwbWFzQG5ldGxvcmRzLm5ldAorICAgICMKKyAgICAjIFZlcnNpb24gIDAuMDFhICAgIEluaXRpYWwgcmVsZWFzZSAoYWxwaGEpCisgICAgCisgICAgCisgICAgIyBNb2R1bGVzCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgV2luMzI6Ok9MRTsKKyAgICB1c2UgV2luMzI6Ok9MRTo6Q29uc3Q7CisgICAgdXNlIEdldG9wdDo6U3RkOworICAgIAorICAgIAorICAgICMgVmFycworICAgIHVzZSB2YXJzIHF3KCVvcHRzKTsKKyAgICAKKyAgICAKKyAgICAjIEdldCBvcHRpb25zCisgICAgZ2V0b3B0cygnaTpvOnYnLFwlb3B0cyk7CisgICAgCisgICAgCisgICAgIyBOb3QgZW5vdWdoIG9wdGlvbnMKKyAgICBleGl0ICZ1c2FnZSB1bmxlc3MgKCRvcHRze2l9ICYmICRvcHRze299KTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBFeGNlbCBvYmplY3QKKyAgICBteSAkRXhjZWwgPSBuZXcgV2luMzI6Ok9MRSgiRXhjZWwuQXBwbGljYXRpb24iLCJRdWl0Iikgb3IKKyAgICAgICAgICAgIGRpZSAiQ2FuJ3Qgc3RhcnQgZXhjZWw6ICQhIjsKKyAgICAKKyAgICAKKyAgICAjIEdldCBjb25zdGFudHMKKyAgICBteSAkRXhjZWxDb25zdD1XaW4zMjo6T0xFOjpDb25zdC0+TG9hZCgiTWljcm9zb2Z0IEV4Y2VsIik7CisgICAgCisgICAgCisgICAgIyBTaG93IEV4Y2VsCisgICAgJEV4Y2VsLT57VmlzaWJsZX0gPSAxIGlmICgkb3B0c3t2fSk7CisgICAgCisgICAgCisgICAgIyBPcGVuIGluZmlsZQorICAgIG15ICRXb3JrYm9vayA9ICRFeGNlbC0+V29ya2Jvb2tzLT5PcGVuKHtGaWxlbmFtZT0+JG9wdHN7aX19KTsKKyAgICAKKyAgICAKKyAgICAjIE9wZW4gb3V0ZmlsZQorICAgIG9wZW4gKE9VVEZJTEUsIj4kb3B0c3tvfSIpIG9yIGRpZSAiQ2FuJ3Qgb3BlbiBvdXRmaWxlICRvcHRze299OiAkISI7CisgICAgCisgICAgCisgICAgIyBQcmludCBoZWFkZXIgZm9yIG91dGZpbGUKKyAgICBwcmludCBPVVRGSUxFIDw8J0VPSCc7CisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgdXNlIHZhcnMgcXcoJHdvcmtib29rICV3b3Jrc2hlZXRzICVmb3JtYXRzKTsKKyAgICAKKyAgICAKKyAgICAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJfY2hhbmdlX21lXy54bHMiKTsKKyAgICAKKyAgICAKKyAgICBFT0gKKyAgICAKKyAgICAKKyAgICAjIExvb3AgYWxsIHNoZWV0cworICAgIGZvcmVhY2ggbXkgJHNoZWV0bnVtICgxLi4kRXhjZWwtPldvcmtib29rcygxKS0+V29ya3NoZWV0cy0+Q291bnQpIHsKKyAgICAKKyAgICAKKyAgICAgICAgICAgICMgRm9ybWF0IHNoZWV0CisgICAgICAgICAgICBteSAkbmFtZT0kRXhjZWwtPldvcmtib29rcygxKS0+V29ya3NoZWV0cygkc2hlZXRudW0pLT5OYW1lOworICAgICAgICAgICAgcHJpbnQgIlNoZWV0ICRuYW1lXG4iIGlmICgkb3B0c3t2fSk7CisgICAgICAgICAgICBwcmludCBPVVRGSUxFICIjIFNoZWV0ICRuYW1lXG4iOworICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiXCR3b3Jrc2hlZXRzeyckbmFtZSd9ID0gXCR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnJG5hbWUnKTtcbiI7CisgICAgCisgICAgCisgICAgICAgICAgICAjIEdldCB1c2VkcmFuZ2Ugb2YgY2VsbHMgaW4gd29ya3NoZWV0CisgICAgICAgICAgICBteSAkdXNlZHJhbmdlPSRFeGNlbC0+V29ya2Jvb2tzKDEpLT5Xb3Jrc2hlZXRzKCRzaGVldG51bSktPlVzZWRSYW5nZTsKKyAgICAKKyAgICAKKyAgICAgICAgICAgICMgTG9vcCBhbGwgY29sdW1ucyBpbiB1c2VkIHJhbmdlCisgICAgICAgICAgICBmb3JlYWNoIG15ICRqICgxLi4kdXNlZHJhbmdlLT5Db2x1bW5zLT5Db3VudCl7CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICMgRm9ybWF0IGNvbHVtbgorICAgICAgICAgICAgICAgICAgICBwcmludCAiQ29sICRqXG4iIGlmICgkb3B0c3t2fSk7CisgICAgICAgICAgICAgICAgICAgIG15ICgkY29sd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAkY29sd2lkdGg9JHVzZWRyYW5nZS0+Q29sdW1ucygkaiktPkNvbHVtbldpZHRoOworICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICIjIENvbHVtbiAkalxuIjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiXCR3b3Jrc2hlZXRzeyckbmFtZSd9LT5zZXRfY29sdW1uKCIuKCRqLTEpLiIsIi4oJGotMSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgJGNvbHdpZHRoKTtcbiI7CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICMgTG9vcCBhbGwgcm93cyBpbiB1c2VkIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJGkgKDEuLiR1c2VkcmFuZ2UtPlJvd3MtPkNvdW50KXsKKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZvcm1hdCByb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiUm93ICRpXG4iIGlmICgkb3B0c3t2fSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiIyBSb3cgJGlcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCRyb3doZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvd2hlaWdodD0kdXNlZHJhbmdlLT5Sb3dzKCRpKS0+Um93SGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiXCR3b3Jrc2hlZXRzeyckbmFtZSd9LT5zZXRfcm93KCIuKCRpLTEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAkcm93aGVpZ2h0KTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBpZiAoJGo9PTEpOworICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgY3JlYXRpbmcgY2VsbCBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkZm5hbWU9IlwkZm9ybWF0c3snIi4kbmFtZS4nUicuJGkuJ0MnLiRqLiInfSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGZvcm1hdD0iJGZuYW1lPVwkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHByaW50X2Zvcm1hdD0wOworICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGJvcmRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAYmZuYW1lcz1xdyhsZWZ0IHJpZ2h0IHRvcCBib3R0b20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJGsgKDEuLiR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+Qm9yZGVycy0+Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRsc3R5bGU9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Cb3JkZXJzKCRrKS0+TGluZVN0eWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsc3R5bGUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfIi4kYmZuYW1lc1skay0xXS4iKCRsc3R5bGUpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBmb250CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCRmb250YXR0ciwkcHJvcCwkZnVuYywlZm9udHNldHMsJGZvbnRDb2xvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWZvbnRzZXRzPShOYW1lPT4nc2V0X2ZvbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemU9PidzZXRfc2l6ZScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoJHByb3AsJGZ1bmMpID0gZWFjaCAlZm9udHNldHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb250YXR0cj0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkZvbnQtPiRwcm9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmb250YXR0ciBuZSAiIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+JGZ1bmMoJyRmb250YXR0cicpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZm9udHNldHM9KEJvbGQ9PidzZXRfYm9sZCgxKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRhbGljPT4nc2V0X2l0YWxpYygxKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZXJsaW5lPT4nc2V0X3VuZGVybGluZSgxKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWtldGhyb3VnaD0+J3NldF9zdHJpa2VvdXQoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cGVyc2NyaXB0PT4nc2V0X3NjcmlwdCgxKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0PT4nc2V0X3NjcmlwdCgyKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0bGluZUZvbnQ9PidzZXRfb3V0bGluZSgxKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhZG93PT4nc2V0X3NoYWRvdygxKScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoJHByb3AsJGZ1bmMpID0gZWFjaCAlZm9udHNldHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb250YXR0cj0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkZvbnQtPiRwcm9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmb250YXR0cj09MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+JGZ1bmM7XG4iIDsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9udENvbG9yPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+Rm9udC0+Q29sb3JJbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZm9udENvbG9yPjAmJiRmb250Q29sb3IhPSRFeGNlbENvbnN0LT57eGxDb2xvckluZGV4QXV0b21hdGljfSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9jb2xvcigiLigkZm9udENvbG9yKzcpLiIpO1xuIiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGV4dCBhbGlnbm1lbnQsIG1lcmdpbmcgYW5kIHdyYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCRoYWxpZ24sJHZhbGlnbiwkbWVyZ2UsJHdyYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoYWxpZ249JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Ib3Jpem9udGFsQWxpZ25tZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVoQWxpZ25zPSgkRXhjZWxDb25zdC0+e3hsSEFsaWduQ2VudGVyfT0+IidjZW50ZXInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxIQWxpZ25KdXN0aWZ5fT0+IidqdXN0aWZ5JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsSEFsaWduTGVmdH09PiInbGVmdCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4Y2VsQ29uc3QtPnt4bEhBbGlnblJpZ2h0fT0+IidyaWdodCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4Y2VsQ29uc3QtPnt4bEhBbGlnbkZpbGx9PT4iJ2ZpbGwnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxIQWxpZ25DZW50ZXJBY3Jvc3NTZWxlY3Rpb259PT4iJ21lcmdlJyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaGFsaWduIT0kRXhjZWxDb25zdC0+e3hsSEFsaWduR2VuZXJhbH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfYWxpZ24oJGhBbGlnbnN7JGhhbGlnbn0pO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbGlnbj0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPlZlcnRpY2FsQWxpZ25tZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICV2QWxpZ25zPSgkRXhjZWxDb25zdC0+e3hsVkFsaWduQm90dG9tfT0+Iidib3R0b20nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxWQWxpZ25DZW50ZXJ9PT4iJ3ZjZW50ZXInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxWQWxpZ25KdXN0aWZ5fT0+Iid2anVzdGlmeSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4Y2VsQ29uc3QtPnt4bFZBbGlnblRvcH09PiIndG9wJyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdmFsaWduKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X2FsaWduKCR2QWxpZ25zeyR2YWxpZ259KTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXJnZT0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPk1lcmdlQ2VsbHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtZXJnZT09MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9tZXJnZSgpO1xuIjsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdyYXA9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5XcmFwVGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHdyYXA9PTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfdGV4dF93cmFwKDEpO1xuIjsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBwYXR0ZXJucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkcGF0dGVybiwlcGF0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXBhdHM9KC00MTQyPT4wLC00MTI1PT4yLC00MTI2PT4zLC00MTI0PT40LC00MTI4PT41LC00MTY2PT42LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDEyMT0+NywtNDE2Mj0+OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhdHRlcm49JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5JbnRlcmlvci0+UGF0dGVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHBhdHRlcm4mJiRwYXR0ZXJuIT0kRXhjZWxDb25zdC0+e3hsUGF0dGVybkF1dG9tYXRpY30pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuPSRwYXRzeyRwYXR0ZXJufSBpZiAoJHBhdHRlcm48MCAmJiBkZWZpbmVkICRwYXRzeyRwYXR0ZXJufSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X3BhdHRlcm4oJHBhdHRlcm4pO1xuIjsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ29sb3JzIGZnL2JnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJGNJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY0luZGV4PSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+SW50ZXJpb3ItPlBhdHRlcm5Db2xvckluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjSW5kZXg+MCYmJGNJbmRleCE9JEV4Y2VsQ29uc3QtPnt4bENvbG9ySW5kZXhBdXRvbWF0aWN9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfYmdfY29sb3IoIi4oJGNJbmRleCs3KS4iKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY0luZGV4PSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+SW50ZXJpb3ItPkNvbG9ySW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGNJbmRleD4wJiYkY0luZGV4IT0kRXhjZWxDb25zdC0+e3hsQ29sb3JJbmRleEF1dG9tYXRpY30pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9mZ19jb2xvcigiLigkY0luZGV4KzcpLiIpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgbnVtYmVyIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkbnVtX2Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG51bV9mb3JtYXQ9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5OdW1iZXJGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRudW1fZm9ybWF0IG5lICIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X251bV9mb3JtYXQoJyRudW1fZm9ybWF0Jyk7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBjb250ZW50cyAodGV4dCBvciBmb3JtdWxhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkY29udGVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50cz0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkZvcm11bGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRzPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+VGV4dCBpZiAoJGNvbnRlbnRzIGVxICIiKTsKKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFByaW50IGNlbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbnRlbnRzIG5lICIiIG9yICRwcmludF9mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIiMgQ2VsbCgkaSwkailcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICRmb3JtYXQgaWYgKCRwcmludF9mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiXCR3b3Jrc2hlZXRzeyckbmFtZSd9LT53cml0ZSgiLigkaS0xKS4iLCIuKCRqLTEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCckY29udGVudHMnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIiwkZm5hbWUiIGlmICgkcHJpbnRfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIik7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIEZhbW91cyBsYXN0IHdvcmRzLi4uCisgICAgcHJpbnQgT1VURklMRSAiXCR3b3JrYm9vay0+Y2xvc2UoKTtcbiI7CisgICAgCisgICAgCisgICAgIyBDbG9zZSBvdXRmaWxlCisgICAgY2xvc2UgKE9VVEZJTEUpIG9yIGRpZSAiQ2FuJ3QgY2xvc2Ugb3V0ZmlsZSAkb3B0c3tvfTogJCEiOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgc3ViIHVzYWdlIHsKKyAgICAgICAgICAgIHByaW50ZiBTVERFUlIgInVzYWdlOiAkMCBbb3B0aW9uc11cbiIuCisgICAgICAgICAgICAgICAgICAgICJcdE9wdGlvbnM6XG4iLgorICAgICAgICAgICAgICAgICAgICAiXHRcdC12ICAgICAgIFx0dmVyYm9zZSBtb2RlXG4iIC4KKyAgICAgICAgICAgICAgICAgICAgIlx0XHQtaSA8bmFtZT5cdG5hbWUgb2YgaW5wdXQgZmlsZVxuIiAuCisgICAgICAgICAgICAgICAgICAgICJcdFx0LW8gPG5hbWU+XHRuYW1lIG9mIG91dHB1dCBmaWxlXG4iOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHN1YiBFTkQgeworICAgICAgICAgICAgIyBRdWl0IGV4Y2VsCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICRFeGNlbC0+e0Rpc3BsYXlBbGVydHN9ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJEV4Y2VsLT5RdWl0OworICAgICAgICAgICAgfSBpZiAoZGVmaW5lZCAkRXhjZWwpOworICAgIH0KKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisgICAgCisgICAgPWhlYWQxIE5BTUUKKyAgICAKKyAgICAKKyAgICBsZWN4ZSAtIEEgRXhjZWwgZmlsZSB0byBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjb2RlIGNvbnZlcnRlcgorICAgIAorICAgIAorICAgID1oZWFkMSBERVNDUklQVElPTgorICAgIAorICAgIAorICAgIFRoaXMgcHJvZ3JhbSB0YWtlcyBhbiBNUyBFeGNlbCB3b3JrYm9vayBmaWxlIGFzIGlucHV0IGFuZCBmcm9tCisgICAgdGhhdCBmaWxlLCBwcm9kdWNlcyBhbiBvdXRwdXQgZmlsZSB3aXRoIFBlcmwgY29kZSB0aGF0IHVzZXMgdGhlCisgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHJlcHJvZHVjZSB0aGUgb3JpZ2luYWwKKyAgICBmaWxlLgorICAgIAorICAgIAorICAgID1oZWFkMSBTVFVGRgorICAgIAorICAgIAorICAgIEFkZGl0aW9uYWwgaGFuZHMtb24gZWRpdGluZyBvZiB0aGUgb3V0cHV0IGZpbGUgbWlnaHQgYmUgbmVjY2VjYXJ5CisgICAgYXM6CisgICAgCisgICAgCisgICAgKiBUaGlzIHByb2dyYW0gYWx3YXlzIG5hbWVzIHRoZSBmaWxlIHByb2R1Y2VkIGJ5IG91dHB1dCBzY3JpcHQKKyAgICAgIF9jaGFuZ2VfbWVfLnhscworICAgIAorICAgIAorICAgICogVXNlcnMgb2YgaW50ZXJuYXRpb25hbCBFeGNlbCB2ZXJzaW9ucyB3aWxsIGhhdmUgc29tIHdvcmsgdG8gZG8KKyAgICAgIG9uIGxpc3Qgc2VwYXJhdG9ycyBhbmQgbnVtZXJpYyBwdW5jdGF0aW9uIGNoYXJhY3RlcnMuCisgICAgCisgICAgCisgICAgPWhlYWQxIFNFRSBBTFNPCisgICAgCisgICAgCisgICAgTDxXaW4zMjo6T0xFPiwgTDxXaW4zMjo6T0xFOjpWYXJpYW50PiwgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4KKyAgICAKKyAgICAKKyAgICA9aGVhZDEgQlVHUworICAgIAorICAgIAorICAgICogUGlja3Mgd3JvbmcgY29sb3Igb24gY2VsbHMgc29tZXRpbWVzLgorICAgIAorICAgIAorICAgICogUHJvYmFibHkgYSBmZXcgb3RoZXIuLi4KKyAgICAKKyAgICAKKyAgICA9aGVhZDEgRElTQ0xBSU1FUgorICAgIAorICAgIAorICAgIEkgZG8gbm90IGd1YXJhbnRlZSBCPEFOWVRISU5HPiB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgeW91IHVzZSBpdCB5b3UKKyAgICBhcmUgZG9pbmcgc28gQjxBVCBZT1VSIE9XTiBSSVNLPiEgSSBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IHRoaXMKKyAgICBkZXBlbmRpbmcgb24gbXkgdGltZSBzY2hlZHVsZS4uLgorICAgIAorICAgIAorICAgID1oZWFkMSBBVVRIT1IKKyAgICAKKyAgICAKKyAgICB0MG1hc0BuZXRsb3Jkcy5uZXQKKyAgICAKKyAgICAKKyAgICA9aGVhZDEgQ09QWVJJR0hUCisgICAgCisgICAgCisgICAgQ29weXJpZ2h0IDIwMDEsIHQwbWFzQG5ldGxvcmRzLm5ldAorICAgIAorICAgIAorICAgIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2xlY3hlLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY29udmVydEExLnBsCisKKworCitUaGlzIHByb2dyYW0gY29udGFpbnMgaGVscGVyIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggdGhlIEV4Y2VsIEExIGNlbGwKK3JlZmVyZW5jZSAgbm90YXRpb24uCisKK1RoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gc3VwZXJzZWRlZCBieSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5Pi4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBwcm9ncmFtIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIHRoZSBFeGNlbCBBMSBjZWxsCisgICAgIyByZWZlcmVuY2UgIG5vdGF0aW9uLgorICAgICMKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gc3VwZXJzZWRlZCBieSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5Pi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIAorICAgIHByaW50ICJcbiI7CisgICAgcHJpbnQgIkNlbGwgQjcgICBpcyBlcXVpdmFsZW50IHRvICgiOworICAgIHByaW50IGpvaW4gIiAiLCBjZWxsX3RvX3Jvd2NvbCgnQjcnKTsKKyAgICBwcmludCAiKSBpbiByb3cgY29sdW1uIG5vdGF0aW9uLlxuIjsKKyAgICAKKyAgICBwcmludCAiQ2VsbCBcJEI3ICBpcyBlcXVpdmFsZW50IHRvICgiOworICAgIHByaW50IGpvaW4gIiAiLCBjZWxsX3RvX3Jvd2NvbCgnJEI3Jyk7CisgICAgcHJpbnQgIikgaW4gcm93IGNvbHVtbiBub3RhdGlvbi5cbiI7CisgICAgCisgICAgcHJpbnQgIkNlbGwgQlwkNyAgaXMgZXF1aXZhbGVudCB0byAoIjsKKyAgICBwcmludCBqb2luICIgIiwgY2VsbF90b19yb3djb2woJ0IkNycpOworICAgIHByaW50ICIpIGluIHJvdyBjb2x1bW4gbm90YXRpb24uXG4iOworICAgIAorICAgIHByaW50ICJDZWxsIFwkQlwkNyBpcyBlcXVpdmFsZW50IHRvICgiOworICAgIHByaW50IGpvaW4gIiAiLCBjZWxsX3RvX3Jvd2NvbCgnJEIkNycpOworICAgIHByaW50ICIpIGluIHJvdyBjb2x1bW4gbm90YXRpb24uXG5cbiI7CisgICAgCisgICAgcHJpbnQgIlJvdyBhbmQgY29sdW1uICgxOTk5LCAyOSkgICAgICAgYXJlIGVxdWl2YWxlbnQgdG8gIjsKKyAgICBwcmludCByb3djb2xfdG9fY2VsbCgxOTk5LCAyOSksICAgIi5cbiI7CisgICAgCisgICAgcHJpbnQgIlJvdyBhbmQgY29sdW1uICgxOTk5LCAyOSwgMCwgMSkgYXJlIGVxdWl2YWxlbnQgdG8gIjsKKyAgICBwcmludCByb3djb2xfdG9fY2VsbCgxOTk5LCAyOSwgMCwgMSksICAgIi5cblxuIjsKKyAgICAKKyAgICBwcmludCAiVGhlIGJhc2UgY2VsbCBpczogICAgIFo3XG4iOworICAgIHByaW50ICJJbmNyZW1lbnQgdGhlIHJvdzogICAgIiwgaW5jX2NlbGxfcm93KCdaNycpLCAiXG4iOworICAgIHByaW50ICJEZWNyZW1lbnQgdGhlIHJvdzogICAgIiwgZGVjX2NlbGxfcm93KCdaNycpLCAiXG4iOworICAgIHByaW50ICJJbmNyZW1lbnQgdGhlIGNvbHVtbjogIiwgaW5jX2NlbGxfY29sKCdaNycpLCAiXG4iOworICAgIHByaW50ICJEZWNyZW1lbnQgdGhlIGNvbHVtbjogIiwgZGVjX2NlbGxfY29sKCdaNycpLCAiXG5cbiI7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIHJvd2NvbF90b19jZWxsKCRyb3csICRjb2wsICRyb3dfYWJzb2x1dGUsICRjb2xfYWJzb2x1dGUpCisgICAgIworICAgICMgQ29udmVydCBhIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4gcmVmZXJlbmNlIHRvIGEgQTEgcmVmZXJlbmNlLiBGb3IgZXhhbXBsZQorICAgICMgKDAsIDIpIHRvIEMxLiAkcm93X2Fic29sdXRlLCAkY29sX2Fic29sdXRlIGFyZSBvcHRpb25hbC4gVGhleSBhcmUgYm9vbGVhbgorICAgICMgdmFsdWVzIHVzZWQgdG8gaW5kaWNhdGUgaWYgdGhlIHJvdyBvciBjb2x1bW4gdmFsdWUgaXMgYWJzb2x1dGUsIGkuZS4gaWYgaXQgaXMKKyAgICAjIHByZWZpeGVkIGJ5IGEgJCBzaWduOiBlZy4gKDAsIDIsIDAsIDEpIGNvbnZlcnRzIHRvICRDMS4KKyAgICAjCisgICAgIyBSZXR1cm5zOiBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZy4KKyAgICAjCisgICAgc3ViIHJvd2NvbF90b19jZWxsIHsKKyAgICAKKyAgICAgICAgbXkgJHJvdyAgICAgPSAkX1swXTsKKyAgICAgICAgbXkgJGNvbCAgICAgPSAkX1sxXTsKKyAgICAgICAgbXkgJHJvd19hYnMgPSAkX1syXSB8fCAwOworICAgICAgICBteSAkY29sX2FicyA9ICRfWzNdIHx8IDA7CisgICAgCisgICAgCisgICAgICAgIGlmICgkcm93X2FicykgeworICAgICAgICAgICAgJHJvd19hYnMgPSAnJCcKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRyb3dfYWJzID0gJycKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiAoJGNvbF9hYnMpIHsKKyAgICAgICAgICAgICRjb2xfYWJzID0gJyQnCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkY29sX2FicyA9ICcnCisgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgbXkgJGludCAgPSBpbnQgKCRjb2wgLyAyNik7CisgICAgICAgIG15ICRmcmFjID0gJGNvbCAlIDI2ICsxOworICAgIAorICAgICAgICBteSAkY2hyMSA9Jyc7CisgICAgICAgIG15ICRjaHIyID0nJzsKKyAgICAKKyAgICAKKyAgICAgICAgaWYgKCRmcmFjICE9IDApIHsKKyAgICAgICAgICAgICRjaHIyID0gY2hyIChvcmQoJ0EnKSArICRmcmFjIC0xKTs7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKCRpbnQgPiAwKSB7CisgICAgICAgICAgICAkY2hyMSA9IGNociAob3JkKCdBJykgKyAkaW50ICAtMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHJvdysrOyAgICAgIyBaZXJvIGluZGV4IHRvIDEtaW5kZXgKKyAgICAKKyAgICAgICAgcmV0dXJuICRjb2xfYWJzIC4gJGNocjEgLiAkY2hyMiAuICRyb3dfYWJzLiAkcm93OworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgY2VsbF90b19yb3djb2woJGNlbGxfcmVmKQorICAgICMKKyAgICAjIENvbnZlcnQgYW4gRXhjZWwgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gdG8gYSB6ZXJvIGJhc2VkIHJvdyBhbmQgY29sdW1uCisgICAgIyByZWZlcmVuY2U7IGNvbnZlcnRzIEMxIHRvICgwLCAyLCAwLCAwKS4KKyAgICAjCisgICAgIyBSZXR1cm5zOiByb3csIGNvbHVtbiwgcm93X2lzX2Fic29sdXRlLCBjb2x1bW5faXNfYWJzb2x1dGUKKyAgICAjCisgICAgIworICAgIHN1YiBjZWxsX3RvX3Jvd2NvbCB7CisgICAgCisgICAgICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgCisgICAgICAgICRjZWxsID1+IC8oXCQ/KShbQS1JXT9bQS1aXSkoXCQ/KShcZCspLzsKKyAgICAKKyAgICAgICAgbXkgJGNvbF9hYnMgPSAkMSBlcSAiIiA/IDAgOiAxOworICAgICAgICBteSAkY29sICAgICA9ICQyOworICAgICAgICBteSAkcm93X2FicyA9ICQzIGVxICIiID8gMCA6IDE7CisgICAgICAgIG15ICRyb3cgICAgID0gJDQ7CisgICAgCisgICAgICAgICMgQ29udmVydCBiYXNlMjYgY29sdW1uIHN0cmluZyB0byBudW1iZXIKKyAgICAgICAgIyBBbGwgeW91ciBCYXNlIGFyZSBiZWxvbmcgdG8gdXMuCisgICAgICAgIG15IEBjaGFycyAgPSBzcGxpdCAvLywgJGNvbDsKKyAgICAgICAgbXkgJGV4cG4gICA9IDA7CisgICAgICAgICRjb2wgICAgICAgPSAwOworICAgIAorICAgICAgICB3aGlsZSAoQGNoYXJzKSB7CisgICAgICAgICAgICBteSAkY2hhciA9IHBvcChAY2hhcnMpOyAjIExTIGNoYXIgZmlyc3QKKyAgICAgICAgICAgICRjb2wgKz0gKG9yZCgkY2hhcikgLW9yZCgnQScpICsxKSAqICgyNioqJGV4cG4pOworICAgICAgICAgICAgJGV4cG4rKzsKKyAgICAgICAgfQorICAgIAorICAgICAgICAjIENvbnZlcnQgMS1pbmRleCB0byB6ZXJvLWluZGV4CisgICAgICAgICRyb3ctLTsKKyAgICAgICAgJGNvbC0tOworICAgIAorICAgICAgICByZXR1cm4gJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgaW5jX2NlbGxfcm93KCRjZWxsX3JlZikKKyAgICAjCisgICAgIyBJbmNyZW1lbnRzIHRoZSByb3cgbnVtYmVyIG9mIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uLgorICAgICMgRm9yIGV4YW1wbGUgQzMgdG8gQzQKKyAgICAjCisgICAgIyBSZXR1cm5zOiBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZy4KKyAgICAjCisgICAgc3ViIGluY19jZWxsX3JvdyB7CisgICAgCisgICAgICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgICAgIG15ICgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpID0gY2VsbF90b19yb3djb2woJGNlbGwpOworICAgIAorICAgICAgICAkcm93Kys7CisgICAgCisgICAgICAgIHJldHVybiByb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgZGVjX2NlbGxfcm93KCRjZWxsX3JlZikKKyAgICAjCisgICAgIyBEZWNyZW1lbnRzIHRoZSByb3cgbnVtYmVyIG9mIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uLgorICAgICMgRm9yIGV4YW1wbGUgQzQgdG8gQzMKKyAgICAjCisgICAgIyBSZXR1cm5zOiBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZy4KKyAgICAjCisgICAgc3ViIGRlY19jZWxsX3JvdyB7CisgICAgCisgICAgICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgICAgIG15ICgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpID0gY2VsbF90b19yb3djb2woJGNlbGwpOworICAgIAorICAgICAgICAkcm93LS07CisgICAgCisgICAgICAgIHJldHVybiByb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgaW5jX2NlbGxfY29sKCRjZWxsX3JlZikKKyAgICAjCisgICAgIyBJbmNyZW1lbnRzIHRoZSBjb2x1bW4gbnVtYmVyIG9mIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uLgorICAgICMgRm9yIGV4YW1wbGUgQzMgdG8gRDMKKyAgICAjCisgICAgIyBSZXR1cm5zOiBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZy4KKyAgICAjCisgICAgc3ViIGluY19jZWxsX2NvbCB7CisgICAgCisgICAgICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgICAgIG15ICgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpID0gY2VsbF90b19yb3djb2woJGNlbGwpOworICAgIAorICAgICAgICAkY29sKys7CisgICAgCisgICAgICAgIHJldHVybiByb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgZGVjX2NlbGxfY29sKCRjZWxsX3JlZikKKyAgICAjCisgICAgIyBEZWNyZW1lbnRzIHRoZSBjb2x1bW4gbnVtYmVyIG9mIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uLgorICAgICMgRm9yIGV4YW1wbGUgRDMgdG8gQzMKKyAgICAjCisgICAgIyBSZXR1cm5zOiBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZy4KKyAgICAjCisgICAgc3ViIGRlY19jZWxsX2NvbCB7CisgICAgCisgICAgICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgICAgIG15ICgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpID0gY2VsbF90b19yb3djb2woJGNlbGwpOworICAgIAorICAgICAgICAkY29sLS07CisgICAgCisgICAgICAgIHJldHVybiByb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworICAgIH0KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY29udmVydEExLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZnVuY3Rpb25fbG9jYWxlLnBsCisKKworCitHZW5lcmF0ZSBmdW5jdGlvbiBuYW1lcyBmb3IgZGlmZmVyZW50IGxvY2FsZXMuCisKK1RoaXMgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaGFzaCBvZiBrbm93biBmdW5jdGlvbnMgZm9yIHVzZSBpbgordGhlIEZvcm11bGEucG0gbW9kdWxlLiBCeSBkZWZhdWx0IHRoZSBmdW5jdGlvbiBuYW1lcyBhcmUgaW4gRW5nbGlzaCBidXQgeW91CitjYW4gYWxzbyBjaG9vc2UgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nIGxhbmd1YWdlczogR2VybWFuLCBGcmVuY2gsIFNwYW5pc2gsCitQb3J0dWd1ZXNlLCBEdXRjaCwgRmlubmlzaCwgSXRhbGlhbiBhbmQgU3dlZGlzaC4KKworVGhpcyB3b3VsZCBhbGxvdyB5b3UgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJz1TVU0oQzE6QzMpJyAgKTsKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICc9U1VNTUUoQzE6QzMpJyk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAwLCAnPVNPTU1FKEMxOkMzKScpOworICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgJz1TVU1BKEMxOkMzKScgKTsKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsIDAsICc9U09NQShDMTpDMyknICk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAwLCAnPVNPTShDMTpDMyknICApOworICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNiwgMCwgJz1TVU1NQShDMTpDMyknKTsKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsIDAsICc9U09NTUEoQzE6QzMpJyk7CisKK1VuZm9ydHVuYXRlbHksIGlmIHlvdSB3aXNoIHRvIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBsYW5ndWFnZSB0aGVyZSBhcmUgc29tZQorY29uZmxpY3RzIGJldHdlZW4gZnVuY3Rpb24gbmFtZXM6CisKKyAgICAgIEZ1bmN0aW9uICAgICAgICBMYW5ndWFnZSAxICAgICAgICAgICAgICBMYW5ndWFnZSAyCisgICAgICA9PT09PT09PSAgICAgICAgPT09PT09PT09PSAgICAgICAgICAgICAgPT09PT09PT09PQorICAgICAgTkIgICAgICAgICAgICAgIEZyZW5jaCAgICAgICAgICAgICAgICAgIER1dGNoCisgICAgICBOQSAgICAgICAgICAgICAgRW5nbGlzaC9GcmVuY2ggICAgICAgICAgRmlubmlzaAorICAgICAgVFJJTSAgICAgICAgICAgIEZyZW5jaCAgICAgICAgICAgICAgICAgIEVuZ2xpc2gKKyAgICAgIERJQSAgICAgICAgICAgICBTcGFuaXNoL1BvcnR1Z3Vlc2UgICAgICBHZXJtYW4KKworVGhlcmVmb3JlLCBpZiB5b3UgdHJ5IHRvIGdlbmVyYXRlIGEgaGFzaCBvZiBmdW5jdGlvbiBuYW1lcyB0byBzdXBwb3J0IGJvdGgKK0ZyZW5jaCBhbmQgRW5nbGlzaCB0aGVuIHRoZSBmdW5jdGlvbiBUUklNIHdpbGwgYmUgYXNzaWduZWQgdGhlIG1lYW5pbmcgb2YgdGhlCitmaXJzdCBsYW5ndWFnZSB0aGF0IGRlZmluZXMgaXQsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBGcmVuY2guIFlvdSBjYW4gZ2V0Cithcm91bmQgdGhpcyBieSByZW5hbWluZyB0aGUgZnVuY3Rpb24gZm9yIG9uZSBvZiB0aGUgbGFuZ3VhZ2VzIGFuZCBkb2N1bWVudGluZwordGhlIGNoYW5nZSwgZm9yIGV4YW1wbGU6IFRSSU0uRU4gb3IgVFJJTS5GUi4KKworUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG9ubHkgcGFydGlhbGx5IHNvbHZlcyB0aGUgcHJvYmxlbSBvZiBsb2NhbGlzYXRpb24uCitUaGVyZSBhcmUgYWxzbyBudW1iZXIgZm9ybWF0cyB0byBjb25zaWRlciAoMS41ID09IDEsNSkgYW5kIHRoZSBmYWN0IHRoYXQgdGhlCitsaXN0IHNlcGFyYXRvciAiLCIgYW5kIHRoZSBhcnJheSBzZXBhcmF0b3IgIjsiIGFyZSBpbnRlcmNoYW5nZWQgaW4gZGlmZmVyZW50Citsb2NhbGVzLgorCitUaGUgbG9uZ2VzdCBmdW5jdGlvbiBuYW1lIGlzIExPSS5OT1JNQUxFLlNUQU5EQVJELklOVkVSU0UgKDI5IGNoYXJzKSBmb2xsb3dlZAorYnkgTk9STS5KQUtBVU1BLk5PUk1JVC5LxMROVCAoMjUgY2hhcnMpLgorVGhlIHNob3J0ZXN0IGZ1bmN0aW9uIG5hbWUgaW4gYWxsIGxhbmd1YWdlcyBpcyBULgorCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEdlbmVyYXRlIGZ1bmN0aW9uIG5hbWVzIGZvciBkaWZmZXJlbnQgbG9jYWxlcy4KKyAgICAjCisgICAgIyBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhhc2ggb2Yga25vd24gZnVuY3Rpb25zIGZvciB1c2UgaW4KKyAgICAjIHRoZSBGb3JtdWxhLnBtIG1vZHVsZS4gQnkgZGVmYXVsdCB0aGUgZnVuY3Rpb24gbmFtZXMgYXJlIGluIEVuZ2xpc2ggYnV0IHlvdQorICAgICMgY2FuIGFsc28gY2hvb3NlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6IEdlcm1hbiwgRnJlbmNoLCBTcGFuaXNoLAorICAgICMgUG9ydHVndWVzZSwgRHV0Y2gsIEZpbm5pc2gsIEl0YWxpYW4gYW5kIFN3ZWRpc2guCisgICAgIworICAgICMgVGhpcyB3b3VsZCBhbGxvdyB5b3UgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnPVNVTShDMTpDMyknICApOworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMCwgJz1TVU1NRShDMTpDMyknKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICc9U09NTUUoQzE6QzMpJyk7CisgICAgIyAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAwLCAnPVNVTUEoQzE6QzMpJyApOworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgJz1TT01BKEMxOkMzKScgKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDAsICc9U09NKEMxOkMzKScgICk7CisgICAgIyAgICAgICAkd29ya3NoZWV0LT53cml0ZSg2LCAwLCAnPVNVTU1BKEMxOkMzKScpOworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgMCwgJz1TT01NQShDMTpDMyknKTsKKyAgICAjCisgICAgIyBVbmZvcnR1bmF0ZWx5LCBpZiB5b3Ugd2lzaCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2UgdGhlcmUgYXJlIHNvbWUKKyAgICAjIGNvbmZsaWN0cyBiZXR3ZWVuIGZ1bmN0aW9uIG5hbWVzOgorICAgICMKKyAgICAjICAgICAgIEZ1bmN0aW9uICAgICAgICBMYW5ndWFnZSAxICAgICAgICAgICAgICBMYW5ndWFnZSAyCisgICAgIyAgICAgICA9PT09PT09PSAgICAgICAgPT09PT09PT09PSAgICAgICAgICAgICAgPT09PT09PT09PQorICAgICMgICAgICAgTkIgICAgICAgICAgICAgIEZyZW5jaCAgICAgICAgICAgICAgICAgIER1dGNoCisgICAgIyAgICAgICBOQSAgICAgICAgICAgICAgRW5nbGlzaC9GcmVuY2ggICAgICAgICAgRmlubmlzaAorICAgICMgICAgICAgVFJJTSAgICAgICAgICAgIEZyZW5jaCAgICAgICAgICAgICAgICAgIEVuZ2xpc2gKKyAgICAjICAgICAgIERJQSAgICAgICAgICAgICBTcGFuaXNoL1BvcnR1Z3Vlc2UgICAgICBHZXJtYW4KKyAgICAjCisgICAgIyBUaGVyZWZvcmUsIGlmIHlvdSB0cnkgdG8gZ2VuZXJhdGUgYSBoYXNoIG9mIGZ1bmN0aW9uIG5hbWVzIHRvIHN1cHBvcnQgYm90aAorICAgICMgRnJlbmNoIGFuZCBFbmdsaXNoIHRoZW4gdGhlIGZ1bmN0aW9uIFRSSU0gd2lsbCBiZSBhc3NpZ25lZCB0aGUgbWVhbmluZyBvZiB0aGUKKyAgICAjIGZpcnN0IGxhbmd1YWdlIHRoYXQgZGVmaW5lcyBpdCwgd2hpY2ggaW4gdGhpcyBjYXNlIGlzIEZyZW5jaC4gWW91IGNhbiBnZXQKKyAgICAjIGFyb3VuZCB0aGlzIGJ5IHJlbmFtaW5nIHRoZSBmdW5jdGlvbiBmb3Igb25lIG9mIHRoZSBsYW5ndWFnZXMgYW5kIGRvY3VtZW50aW5nCisgICAgIyB0aGUgY2hhbmdlLCBmb3IgZXhhbXBsZTogVFJJTS5FTiBvciBUUklNLkZSLgorICAgICMKKyAgICAjIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBvbmx5IHBhcnRpYWxseSBzb2x2ZXMgdGhlIHByb2JsZW0gb2YgbG9jYWxpc2F0aW9uLgorICAgICMgVGhlcmUgYXJlIGFsc28gbnVtYmVyIGZvcm1hdHMgdG8gY29uc2lkZXIgKDEuNSA9PSAxLDUpIGFuZCB0aGUgZmFjdCB0aGF0IHRoZQorICAgICMgbGlzdCBzZXBhcmF0b3IgIiwiIGFuZCB0aGUgYXJyYXkgc2VwYXJhdG9yICI7IiBhcmUgaW50ZXJjaGFuZ2VkIGluIGRpZmZlcmVudAorICAgICMgbG9jYWxlcy4KKyAgICAjCisgICAgIyBUaGUgbG9uZ2VzdCBmdW5jdGlvbiBuYW1lIGlzIExPSS5OT1JNQUxFLlNUQU5EQVJELklOVkVSU0UgKDI5IGNoYXJzKSBmb2xsb3dlZAorICAgICMgYnkgTk9STS5KQUtBVU1BLk5PUk1JVC5LxMROVCAoMjUgY2hhcnMpLgorICAgICMgVGhlIHNob3J0ZXN0IGZ1bmN0aW9uIG5hbWUgaW4gYWxsIGxhbmd1YWdlcyBpcyBULgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyk7IEpvaG4gTWNOYW1hcmEsIE1hcmNoIDIwMDEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIAorICAgIAorICAgICMKKyAgICAjIE1vZGlmeSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyB0byBhZGQgdGhlIGxhbmd1YWdlIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGhhc2gKKyAgICAjCisgICAgbXkgJGVuZ2xpc2ggICAgPSAxOworICAgIG15ICRnZXJtYW4gICAgID0gMDsKKyAgICBteSAkZnJlbmNoICAgICA9IDA7CisgICAgbXkgJHNwYW5pc2ggICAgPSAwOworICAgIG15ICRwb3J0dWd1ZXNlID0gMDsKKyAgICBteSAkZHV0Y2ggICAgICA9IDA7CisgICAgbXkgJGZpbm5pc2ggICAgPSAwOworICAgIG15ICRpdGFsaWFuICAgID0gMDsKKyAgICBteSAkc3dlZGlzaCAgICA9IDA7CisgICAgCisgICAgbXkgJWZ1bmNzOworICAgIAorICAgICMgSWdub3JlIHRoZSBoZWFkaW5ncworICAgIDxEQVRBPjsKKyAgICAKKyAgICAjIFByaW50IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhhc2ggZGVmaW5pdGlvbgorICAgIHByaW50ICIgICAgJWZ1bmN0aW9ucyAgPSAoXG4iOworICAgIHByaW50ICIgICAgICAgICMiIC4gIiAiIHggMzcgOworICAgIHByaW50ICJwdGcgIGFyZ3MgIGNsYXNzICB2b2xcbiI7CisgICAgCisgICAgd2hpbGUgKDxEQVRBPil7CisgICAgICAgIG15IEBGID0gc3BsaXQgIiAiOworICAgICAgICBteSAkdmFsdWUgPSAkRlswXTsKKyAgICAgICAgbXkgJGFyZ3MgID0gJEZbMV07CisgICAgICAgIG15ICRyZWYgICA9ICRGWzJdOworICAgICAgICBteSAkdm9sICAgPSAkRlszXTsKKyAgICAKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbNF0sICAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkZW5nbGlzaDsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbNV0sICAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkZ2VybWFuOworICAgICAgICBwcmludF9mdW5jdGlvbigkRls2XSwgICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRmcmVuY2g7CisgICAgICAgIHByaW50X2Z1bmN0aW9uKCRGWzddLCAgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCkgaWYgJHNwYW5pc2g7CisgICAgICAgIHByaW50X2Z1bmN0aW9uKCRGWzhdLCAgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCkgaWYgJHBvcnR1Z3Vlc2U7CisgICAgICAgIHByaW50X2Z1bmN0aW9uKCRGWzldLCAgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCkgaWYgJGR1dGNoOworICAgICAgICBwcmludF9mdW5jdGlvbigkRlsxMF0sICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRmaW5uaXNoOworICAgICAgICBwcmludF9mdW5jdGlvbigkRlsxMV0sICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRpdGFsaWFuOworICAgICAgICBwcmludF9mdW5jdGlvbigkRlsxMl0sICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRzd2VkaXNoOworICAgIH0KKyAgICAjIFByaW50IHRoZSBlbmQgb2YgdGhlIGhhc2ggZGVmaW5pdGlvbgorICAgIHByaW50ICIgICAgKTtcbiI7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEZ1bmN0aW9uIHRvIHByaW50IHRoZSBmdW5jdGlvbiBuYW1lcy4gSXQgcHJpbnRzIGEgd2FybmluZyBpZiB0aGVyZSBpcyBhCisgICAgIyBjbGFzaC4KKyAgICAjCisgICAgc3ViIHByaW50X2Z1bmN0aW9uIHsKKyAgICAKKyAgICAgICAgbXkgJGZ1bmMgID0gc2hpZnQ7CisgICAgICAgIG15ICR2YWx1ZSA9IHNoaWZ0OworICAgICAgICBteSAkYXJncyAgPSBzaGlmdDsKKyAgICAgICAgbXkgJHJlZiAgID0gc2hpZnQ7CisgICAgICAgIG15ICR2b2wgICA9IHNoaWZ0OworICAgIAorICAgICAgICAkZnVuYyA9ICInJGZ1bmMnIjsKKyAgICAKKyAgICAgICAgaWYgKG5vdCBleGlzdHMgJGZ1bmNzeyRmdW5jfSkgeworICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICUtMzFzID0+IFslNGQsICU0ZCwgJTRkLCAlNGQgXSxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYywgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCk7CisgICAgICAgICAgICAkZnVuY3N7JGZ1bmN9ID0gJHZhbHVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCRmdW5jc3skZnVuY30gIT0gJHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgICAgICAgIyBXYXJuaW5nICI7CisgICAgICAgICAgICAgICAgcHJpbnQgJGZ1bmMsICIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGFub3RoZXIgbGFuZ3VhZ2VcbiI7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgICAgICMlLTMxcyA9PiBbJTRkLCAlNGQsICU0ZCwgJTRkIF0sXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYywgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyBOb3RlOiBUaGUgZm9sbG93aW5nIGRhdGEgY29udGFpbnMgdGhlIGZ1bmN0aW9uIG5hbWVzIGluIHRoZSB2YXJpb3VzCisgICAgIyBsYW5ndWFnZXMuIFRoZXNlIGxpbmVzIGFyZSBMT05HLgorICAgIAorICAgIF9fREFUQV9fCisgICAgVmFsdWUgICBBcmdzICAgIFJlZmNsYXNzICAgVm9sYXRpbGUgICBFbmdsaXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlcm1hbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlbmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFuaXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnR1Z3Vlc2UgICAgICAgICAgICAgICAgICAgICAgICAgRHV0Y2ggICAgICAgICAgICAgICAgICAgICAgICBGaW5uaXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0YWxpYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dlZGlzaAorICAgIDAgICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTlpBSEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ULk7aTSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBTlRBTCAgICAgICAgICAgICAgICAgICAgICAgTEFTS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05UQS5OVU1FUkkgICAgICAgICAgICAgICAgICAgICAgIEFOVEFMCisgICAgMSAgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFTk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxTICAgICAgICAgICAgICAgICAgICAgICAgICBKT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT00KKyAgICAyICAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1ROQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTTk9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyS5Ow08uRElTUCAgICAgICAgICAgICAgICAgICAgICAgICBJU05CICAgICAgICAgICAgICAgICAgICAgICAgIE9OUFVVVFRVVSAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLk5PTi5ESVNQICAgICAgICAgICAgICAgICAgICAgICDEUlNBS05BRAorICAgIDMgICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVNFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RGRUhMRVIgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEVSUkVVUiAgICAgICAgICAgICAgICAgICAgICAgICAgRVNFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICDJRVJST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRk9VVCAgICAgICAgICAgICAgICAgICAgICAgT05WSVJIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuRVJST1JFICAgICAgICAgICAgICAgICAgICAgICAgIMRSRkVMCisgICAgNCAgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09NICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUEKKyAgICA1ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEFWRVJBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlUVEVMV0VSVCAgICAgICAgICAgICAgICAgICAgICAgICBNT1lFTk5FICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST01FRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgTclESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU1JRERFTERFICAgICAgICAgICAgICAgICAgIEtFU0tJQVJWTyAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURFTAorICAgIDYgICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNzU5JTU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTgorICAgIDcgICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNwVhJTU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWAorICAgIDggICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUk9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRUlMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJR05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJSiAgICAgICAgICAgICAgICAgICAgICAgICAgUklWSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUYuUklHQSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBRAorICAgIDkgICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQ09MVU1OICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFMVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9OTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtPTE9NICAgICAgICAgICAgICAgICAgICAgICAgU0FSQUtFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUYuQ09MT05OQSAgICAgICAgICAgICAgICAgICAgICAgIEtPTFVNTgorICAgIDEwICAgICAgIDAgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOw08uRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVVVFRVVSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT04uRElTUCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBS05BUworICAgIDExICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTlBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5IVyAgICAgICAgICAgICAgICAgICAgICAgICAgTk5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVE5VVsRSREUKKyAgICAxMiAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFNUREVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0FSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVlBBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERFViAgICAgICAgICAgICAgICAgICAgICAgIEtFU0tJSEFKT05UQSAgICAgICAgICAgICAgICAgICAgICAgREVWLlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERBVgorICAgIDEzICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRE9MTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ORURBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0VEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdVTERFTiAgICAgICAgICAgICAgICAgICAgICAgVkFMVVVUVEEgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVUQQorICAgIDE0ICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDSU1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUYuTtpNLkRFQyAgICAgICAgICAgICAgICAgICAgICAgIFZBU1QgICAgICAgICAgICAgICAgICAgICAgICAgS0lJTlRFxCAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNTTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBU1RUQUwKKyAgICAxNSAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU4gICAgICAgICAgICAgICAgICAgICAgICAgIFNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU4KKyAgICAxNiAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1MKKyAgICAxNyAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU4KKyAgICAxOCAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEFUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09HVEFOICAgICAgICAgICAgICAgICAgICAgIEFUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNUQU4KKyAgICAxOSAgICAgICAwICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkuR1JFQ08gICAgICAgICAgICAgICAgICAgICAgICAgICBQSQorICAgIDIwICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU1FSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXVVJaRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBQ0lORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFJWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQUlaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUlRFTCAgICAgICAgICAgICAgICAgICAgICAgTkVMSdZKVVVSSSAgICAgICAgICAgICAgICAgICAgICAgICBSQURRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPVAorICAgIDIxICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUCAgICAgICAgICAgICAgICAgICAgICAgICAgRUtTUE9ORU5UVEkgICAgICAgICAgICAgICAgICAgICAgICBFWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUAorICAgIDIyICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOICAgICAgICAgICAgICAgICAgICAgICAgICAgTFVPTk5MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICBMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOCisgICAgMjMgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HMTAKKyAgICAyNCAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEFCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMgICAgICAgICAgICAgICAgICAgICAgICAgIElUU0VJU0FSVk8gICAgICAgICAgICAgICAgICAgICAgICAgQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMKKyAgICAyNSAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FOWlpBSEwgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVEVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFR0VSICAgICAgICAgICAgICAgICAgICAgIEtPS09OQUlTTFVLVSAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUxUQUwKKyAgICAyNiAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNJR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk9SWkVJQ0hFTiAgICAgICAgICAgICAgICAgICAgICAgICBTSUdORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJR05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1MuTkVHICAgICAgICAgICAgICAgICAgICAgIEVUVU1FUktLSSAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUNLRU4KKyAgICAyNyAgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlVOREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJPTkRJICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRE9OREVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRlJPTkRFTiAgICAgICAgICAgICAgICAgICAgIFBZ1lJJU1TEICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJST1RPTkRBICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJVTkRBCisgICAgMjggICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBMT09LVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUldFSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDSEVSQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNDQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9FS0VOICAgICAgICAgICAgICAgICAgICAgICBIQUtVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFUkNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVUQVVQUAorICAgIDI5ICAgICAgLTEgICAgICAwICAgICAgICAgIDEgICAgICAgICAgSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICDNTkRJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOREVYICAgICAgICAgICAgICAgICAgICAgICAgSU5ERUtTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOREVYCisgICAgMzAgICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBSRVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJRURFUkhPTEVOICAgICAgICAgICAgICAgICAgICAgICAgUkVQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBFVElSICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUEVUSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVSSEFMSU5HICAgICAgICAgICAgICAgICAgICBUT0lTVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJUEVUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQCisgICAgMzEgICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBNSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVC5URVhUTyAgICAgICAgICAgICAgICAgICAgICAgICAgREVFTCAgICAgICAgICAgICAgICAgICAgICAgICBQT0lNSS5URUtTVEkgICAgICAgICAgICAgICAgICAgICAgIFNUUklOR0EuRVNUUkFJICAgICAgICAgICAgICAgICAgICAgRVhURVhUCisgICAgMzIgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEzETkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJDQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVJHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE7aTS5DQVJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgTEVOR1RFICAgICAgICAgICAgICAgICAgICAgICBQSVRVVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExVTkdIRVpaQSAgICAgICAgICAgICAgICAgICAgICAgICAgTMROR0QKKyAgICAzMyAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUFSREUgICAgICAgICAgICAgICAgICAgICAgIEFSVk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUTlVNCisgICAgMzQgICAgICAgMCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBSFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlJBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJEQURFUk8gICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkRBREVJUk8gICAgICAgICAgICAgICAgICAgICAgICAgV0FBUiAgICAgICAgICAgICAgICAgICAgICAgICBUT1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FOVAorICAgIDM1ICAgICAgIDAgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OV0FBUiAgICAgICAgICAgICAgICAgICAgICAgRVDEVE9TSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNLVAorICAgIDM2ICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgSkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DSAorICAgIDM3ICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVMTEVSCisgICAgMzggICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBOT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JQ0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE7DTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklFVCAgICAgICAgICAgICAgICAgICAgICAgICBFSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNLRQorICAgIDM5ICAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTSURVTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU1QgICAgICAgICAgICAgICAgICAgICAgICAgSkFLT0ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU1QKKyAgICA0MCAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERDT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJBTlpBSEwgICAgICAgICAgICAgICAgICAgICAgICAgICBCRE5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEQ09OVEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRDT05UQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkFBTlRBTCAgICAgICAgICAgICAgICAgICAgIFRMQVNLRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREIuQ09OVEEuTlVNRVJJICAgICAgICAgICAgICAgICAgICBEQU5UQUwKKyAgICA0MSAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERTVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJTVU1NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFNPTU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEU1VNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRTT01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlNPTSAgICAgICAgICAgICAgICAgICAgICAgIFRTVU1NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREIuU09NTUEgICAgICAgICAgICAgICAgICAgICAgICAgICBEU1VNTUEKKyAgICA0MiAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERBVkVSQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgREJNSVRURUxXRVJUICAgICAgICAgICAgICAgICAgICAgICBCRE1PWUVOTkUgICAgICAgICAgICAgICAgICAgICAgICAgIEJEUFJPTUVESU8gICAgICAgICAgICAgICAgICAgICAgICAgQkRNyURJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdFTUlEREVMREUgICAgICAgICAgICAgICAgIFRLRVNLSUFSVk8gICAgICAgICAgICAgICAgICAgICAgICAgREIuTUVESUEgICAgICAgICAgICAgICAgICAgICAgICAgICBETUVERUwKKyAgICA0MyAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRNzU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQk1JTiAgICAgICAgICAgICAgICAgICAgICAgIFRNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREIuTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUlOCisgICAgNDQgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBETUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRNQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETcFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJNQVggICAgICAgICAgICAgICAgICAgICAgICBUTUFLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLk1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BWAorICAgIDQ1ICAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRFNUREVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlNUREFCVyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJERUNBUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgQkRERVNWRVNUICAgICAgICAgICAgICAgICAgICAgICAgICBCREVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCU1RERVYgICAgICAgICAgICAgICAgICAgICAgVEtFU0tJSEFKT05UQSAgICAgICAgICAgICAgICAgICAgICBEQi5ERVYuU1QgICAgICAgICAgICAgICAgICAgICAgICAgIERTVERBVgorICAgIDQ2ICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQU5aICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBTlMKKyAgICA0NyAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERWQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJWQVJJQU5aICAgICAgICAgICAgICAgICAgICAgICAgICBCRFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlZBUiAgICAgICAgICAgICAgICAgICAgICAgIFRWQVJJQU5TU0kgICAgICAgICAgICAgICAgICAgICAgICAgREIuVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVkFSSUFOUworICAgIDQ4ICAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFS1NUICAgICAgICAgICAgICAgICAgICAgICAgVEVLU1RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQKKyAgICA0OSAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIExJTkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUk9JVEVSRUcgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVElNQUNJT04uTElORUFMICAgICAgICAgICAgICAgICAgUFJPSi5MSU4gICAgICAgICAgICAgICAgICAgICAgICAgICBMSUpOU0NIICAgICAgICAgICAgICAgICAgICAgIExJTlJFR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHUi5MSU4gICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdSCisgICAgNTAgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBUUkVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVOREFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICBURU5ERU5DSUEgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTkTKTkNJQSAgICAgICAgICAgICAgICAgICAgICAgICAgVFJFTkQgICAgICAgICAgICAgICAgICAgICAgICBTVVVOVEFVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTkRFTlpBICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJFTkQKKyAgICA1MSAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIExPR0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUktQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dSRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVElNQUNJT04uTE9HQVJJVE1JQ0EgICAgICAgICAgICAgUFJPSi5MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dTQ0ggICAgICAgICAgICAgICAgICAgICAgIExPR1JFR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHUi5MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBSRUdSCisgICAgNTIgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBHUk9XVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JPSVNTQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICBDUkVDSU1JRU5UTyAgICAgICAgICAgICAgICAgICAgICAgIENSRVNDSU1FTlRPICAgICAgICAgICAgICAgICAgICAgICAgR1JPRUkgICAgICAgICAgICAgICAgICAgICAgICBLQVNWVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRVNDSVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQVFJFTkQKKyAgICA1NiAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVVbEUkRFCisgICAgNTcgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFcgICAgICAgICAgICAgICAgICAgICAgICAgICBUVUxFVkEuQVJWTyAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5GVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xVVFbEUkRFCisgICAgNTggICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBOUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpaUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5QRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlBFUiAgICAgICAgICAgICAgICAgICAgICAgICBOSkFLU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTS5SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSSU9ERVIKKyAgICA1OSAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk1aICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEdUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVQgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS1NVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBTE5JTkcKKyAgICA2MCAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWklOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFYQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU5URSAgICAgICAgICAgICAgICAgICAgICAgIEtPUktPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFTU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSxE5UQQorICAgIDYxICAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTUlSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRSUtWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVElSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJUiAgICAgICAgICAgICAgICAgICAgICAgICAgTVNJU8RJTkVOICAgICAgICAgICAgICAgICAgICAgICAgICBUSVIuVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRElSCisgICAgNjIgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBJUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElLViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVIgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVPESU5FTi5LT1JLTyAgICAgICAgICAgICAgICAgICAgIFRJUi5DT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgSVIKKyAgICA2MyAgICAgICAwICAgICAgMSAgICAgICAgICAxICAgICAgICAgIFJBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlVGQUxMU1pBSEwgICAgICAgICAgICAgICAgICAgICAgICBBTEVBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMRUFUT1JJTyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxFQVTTUklPICAgICAgICAgICAgICAgICAgICAgICAgICBBU0VMRUNUICAgICAgICAgICAgICAgICAgICAgIFNBVFVOTkFJU0xVS1UgICAgICAgICAgICAgICAgICAgICAgQ0FTVUFMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTFVNUAorICAgIDY0ICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJHTEVJQ0ggICAgICAgICAgICAgICAgICAgICAgICAgIEVRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JTkNJRElSICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JSRVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUkdFTElKS0VOICAgICAgICAgICAgICAgICAgVkFTVElORSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GUk9OVEEgICAgICAgICAgICAgICAgICAgICAgICAgIFBBU1NBCisgICAgNjUgICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVFVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRUNIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUVU0gICAgICAgICAgICAgICAgICAgICAgICBQxElWxFlTICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUVU0KKyAgICA2NiAgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSE9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUpEICAgICAgICAgICAgICAgICAgICAgICAgIEFJS0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JBUklPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTE9DS1NMQUcKKyAgICA2NyAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKT1VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcgICAgICAgICAgICAgICAgICAgICAgICAgIFDESVbEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0lPUk5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUcKKyAgICA2OCAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE1PTlRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9OQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0lTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTcpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUFORCAgICAgICAgICAgICAgICAgICAgICAgIEtVVUtBVVNJICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNxU5BRAorICAgIDY5ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgWUVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQUhSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOTkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQdFPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBQVIgICAgICAgICAgICAgICAgICAgICAgICAgVlVPU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMVSCisgICAgNzAgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBXRUVLREFZICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPQ0hFTlRBRyAgICAgICAgICAgICAgICAgICAgICAgICAgSk9VUlNFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUFTRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQS5EQS5TRU1BTkEgICAgICAgICAgICAgICAgICAgICAgV0VFS0RBRyAgICAgICAgICAgICAgICAgICAgICBWSUlLT05QxElWxCAgICAgICAgICAgICAgICAgICAgICAgIEdJT1JOTy5TRVRUSU1BTkEgICAgICAgICAgICAgICAgICAgVkVDS09EQUcKKyAgICA3MSAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEhPVVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RVTkRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVVIgICAgICAgICAgICAgICAgICAgICAgICAgIFRVTk5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1NRQorICAgIDcyICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTUlOVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVVVCAgICAgICAgICAgICAgICAgICAgICAgTUlOVVVUSVQgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVUCisgICAgNzMgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBTRUNPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFS1VOREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDT05ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdVTkRPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1VORE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDT05ERSAgICAgICAgICAgICAgICAgICAgICBTRUtVTk5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ09ORE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VLVU5ECisgICAgNzQgICAgICAgMCAgICAgIDEgICAgICAgICAgMSAgICAgICAgICBOT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpFVFpUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFJTlRFTkFOVCAgICAgICAgICAgICAgICAgICAgICAgICBBSE9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHT1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlUgICAgICAgICAgICAgICAgICAgICAgICAgICBOWVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFERVNTTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlUKKyAgICA3NSAgICAgICAxICAgICAgMCAgICAgICAgICAxICAgICAgICAgIEFSRUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVSRUlDSEUgICAgICAgICAgICAgICAgICAgICAgICAgICBaT05FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgwVJFQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVJFSUtFTiAgICAgICAgICAgICAgICAgICAgIEFMVUVFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVLFREVOCisgICAgNzYgICAgICAgMSAgICAgIDAgICAgICAgICAgMSAgICAgICAgICBST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFSUxFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElHTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklKRU4gICAgICAgICAgICAgICAgICAgICAgICBSSVZJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJR0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFERVIKKyAgICA3NyAgICAgICAxICAgICAgMCAgICAgICAgICAxICAgICAgICAgIENPTFVNTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBTFRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPTk5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTkFTICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLT0xPTU1FTiAgICAgICAgICAgICAgICAgICAgIFNBUkFLS0VFVCAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT05ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICBLT0xVTU5FUgorICAgIDc4ICAgICAgLTEgICAgICAwICAgICAgICAgIDEgICAgICAgICAgT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVJFSUNILlZFUlNDSElFQkVOICAgICAgICAgICAgICAgIERFQ0FMRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNMT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNDSFVJVklORyAgICAgICAgICAgICAgICAgU0lJUlRZTcQgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FSVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEbWUlNLSlVUTklORworICAgIDgyICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU0VBUkNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUNIRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRVJDSEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NBTElaQVIgICAgICAgICAgICAgICAgICAgICAgICAgIFZJTkQuU1BFQyAgICAgICAgICAgICAgICAgICAgS8RZLkzEUEkgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUNFUkNBICAgICAgICAgICAgICAgICAgICAgICAgICAgIFPWSworICAgIDgzICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVFJBTlNQT1NFICAgICAgICAgICAgICAgICAgICAgICAgICBNVFJBTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT05FUiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9ORVJFTiAgICAgICAgICAgICAgICAgVFJBTlNQT05PSSAgICAgICAgICAgICAgICAgICAgICAgICBNQVRSLlRSQVNQT1NUQSAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9ORVJBCisgICAgODYgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJUE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICBUWVlQUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJUE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVsRSREVUWVAKKyAgICA5NyAgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEFUQU4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09HVEFOMiAgICAgICAgICAgICAgICAgICAgIEFUQU4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOLjIgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNUQU4yCisgICAgOTggICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBU0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0VOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1NJTiAgICAgICAgICAgICAgICAgICAgICBBU0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDU0lOCisgICAgOTkgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR0NPUyAgICAgICAgICAgICAgICAgICAgICBBQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDQ09TCisgICAgMTAwICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDSE9PU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBSEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSVNJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEVHSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQ09MSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgS0lFWkVOICAgICAgICAgICAgICAgICAgICAgICBWQUxJVFNFLklOREVLU0kgICAgICAgICAgICAgICAgICAgIFNDRUdMSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVsRMSgorICAgIDEwMSAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgSExPT0tVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBXVkVSV0VJUyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0hFUkNIRUggICAgICAgICAgICAgICAgICAgICAgICAgQlVTQ0FSSCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPUklaLlpPRUtFTiAgICAgICAgICAgICAgICAgVkhBS1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRVJDQS5PUklaWiAgICAgICAgICAgICAgICAgICAgICAgIExFVEFLT0xVTU4KKyAgICAxMDIgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFZMT09LVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZFUldFSVMgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNIRVJDSEVWICAgICAgICAgICAgICAgICAgICAgICAgIEJVU0NBUlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJULlpPRUtFTiAgICAgICAgICAgICAgICAgIFBIQUtVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VSQ0EuVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICBMRVRBUkFECisgICAgMTA1ICAgICAgMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBJU1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVEJFWlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMlSRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNWRVJXSUpaSU5HICAgICAgICAgICAgICAgICBPTlZJSVRUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5SSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgxFJSRUYKKyAgICAxMDkgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cKKyAgICAxMTEgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVJQ0hFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUkFDVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUtFTiAgICAgICAgICAgICAgICAgICAgICAgIE1FUktLSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESUNFLkNBUkFUVCAgICAgICAgICAgICAgICAgICAgICBURUNLRU5LT0QKKyAgICAxMTIgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIExPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xFSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VU0NVTEUgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlO2lNDVUxBICAgICAgICAgICAgICAgICAgICAgICAgICBLTEVJTkUuTEVUVEVSUyAgICAgICAgICAgICAgIFBJRU5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU1FTkVSCisgICAgMTEzICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBVUFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdST1NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFKVVNDVUxFICAgICAgICAgICAgICAgICAgICAgICAgICBNQVlVU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSdpTQ1VMQSAgICAgICAgICAgICAgICAgICAgICAgICAgSE9PRkRMRVRURVJTICAgICAgICAgICAgICAgICBJU09UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSVVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0FMRVIKKyAgICAxMTQgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBST1BFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JPU1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT01QUk9QUkUgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTVBST1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJLk1BSdpTQ1VMQSAgICAgICAgICAgICAgICAgICAgICBCRUdJTkxFVFRFUlMgICAgICAgICAgICAgICAgIEVSSVNOSU1JICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFJVVNDLklOSVogICAgICAgICAgICAgICAgICAgICAgICBJTklUSUFMCisgICAgMTE1ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FVQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWlFVSUVSREEgICAgICAgICAgICAgICAgICAgICAgICAgIEVTUVVFUkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgTElOS1MgICAgICAgICAgICAgICAgICAgICAgICBWQVNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTklTVFJBICAgICAgICAgICAgICAgICAgICAgICAgICAgVsROU1RFUgorICAgIDExNiAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNIVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST0lURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVSRUNIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFSVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0hUUyAgICAgICAgICAgICAgICAgICAgICAgT0lLRUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNUUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEjWR0VSCisgICAgMTE3ICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBFWEFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERU5USVNDSCAgICAgICAgICAgICAgICAgICAgICAgICAgRVhBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1VBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VMSUpLICAgICAgICAgICAgICAgICAgICAgICBWRVJUQUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERU5USUNPICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhBS1QKKyAgICAxMTggICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRSSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0zEVFRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQUkVTUEFDRSAgICAgICAgICAgICAgICAgICAgICAgIEVTUEFDSU9TICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSVU1BUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFUSUVTLldJU1NFTiAgICAgICAgICAgICAgIFBPSVNUQS5WxExJVCAgICAgICAgICAgICAgICAgICAgICAgQU5OVUxMQS5TUEFaSSAgICAgICAgICAgICAgICAgICAgICBSRU5TQQorICAgIDExOSAgICAgIDQgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlNFVFpFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTVBMQUNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgUkVFTVBMQVpBUiAgICAgICAgICAgICAgICAgICAgICAgICBNVURBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlZBTkdFTiAgICAgICAgICAgICAgICAgICAgS09SVkFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSU1QSUFaWkEgICAgICAgICAgICAgICAgICAgICAgICAgIEVSU8RUVAorICAgIDEyMCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU1VCU1RJVFVURSAgICAgICAgICAgICAgICAgICAgICAgICBXRUNIU0VMTiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlNUSVRVRSAgICAgICAgICAgICAgICAgICAgICAgICAgU1VTVElUVUlSICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVElUVUlSICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlNUSVRVRVJFTiAgICAgICAgICAgICAgICAgVkFJSERBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1NUSVRVSVNDSSAgICAgICAgICAgICAgICAgICAgICAgIEJZVC5VVAorICAgIDEyMSAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESUdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBD00RJR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPREUgICAgICAgICAgICAgICAgICAgICAgICAgS09PREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtPRAorICAgIDEyNCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRklORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSU5ERU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRST1VWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5DT05UUkFSICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DVVJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJTkQuQUxMRVMgICAgICAgICAgICAgICAgICAgRVRTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUk9WQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJVFRBCisgICAgMTI1ICAgICAtMSAgICAgIDAgICAgICAgICAgMSAgICAgICAgICBDRUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFTExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTFVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEPJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMICAgICAgICAgICAgICAgICAgICAgICAgICBTT0xVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTExBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTAorICAgIDEyNiAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVNFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RGRUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDJRVJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRk9VVDIgICAgICAgICAgICAgICAgICAgICAgT05WSVJIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgIMRSRgorICAgIDEyNyAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVNURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVFRFWFRFICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNURVhUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICDJVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVEVLU1QgICAgICAgICAgICAgICAgICAgICAgT05URUtTVEkgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuVEVTVE8gICAgICAgICAgICAgICAgICAgICAgICAgIMRSVEVYVAorICAgIDEyOCAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVNOVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RaQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVE5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNOVU1FUk8gICAgICAgICAgICAgICAgICAgICAgICAgICDJTtpNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTR0VUQUwgICAgICAgICAgICAgICAgICAgICAgT05MVUtVICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuTlVNRVJPICAgICAgICAgICAgICAgICAgICAgICAgIMRSVEFMCisgICAgMTI5ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJU0JMQU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVExFRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUVklERSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0JMQU5DTyAgICAgICAgICAgICAgICAgICAgICAgICAgIMlDyUwuVkFaSUEgICAgICAgICAgICAgICAgICAgICAgICAgSVNMRUVHICAgICAgICAgICAgICAgICAgICAgICBPTlRZSErEICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5WVU9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgxFJUT00KKyAgICAxMzAgICAgICAxICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUCisgICAgMTMxICAgICAgMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTgorICAgIDE0MCAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgREFURVZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRXRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVDSEFOVU1FUk8gICAgICAgICAgICAgICAgICAgICAgICBEQVRBLlZBTE9SICAgICAgICAgICAgICAgICAgICAgICAgIERBVFVNV0FBUkRFICAgICAgICAgICAgICAgICAgUMRJVsRZU0FSVk8gICAgICAgICAgICAgICAgICAgICAgICBEQVRBLlZBTE9SRSAgICAgICAgICAgICAgICAgICAgICAgIERBVFVNVsRSREUKKyAgICAxNDEgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRJTUVWQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgWkVJVFdFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICBURU1QU1ZBTCAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPUkFOVU1FUk8gICAgICAgICAgICAgICAgICAgICAgICAgVkFMT1IuVEVNUE8gICAgICAgICAgICAgICAgICAgICAgICBUSUpEV0FBUkRFICAgICAgICAgICAgICAgICAgIEFJS0FfQVJWTyAgICAgICAgICAgICAgICAgICAgICAgICAgT1JBUklPLlZBTE9SRSAgICAgICAgICAgICAgICAgICAgICBUSURWxFJERQorICAgIDE0MiAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU0xOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNT1JMSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTi5BRlNDSFIgICAgICAgICAgICAgICAgICAgU1RQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTU1PUlQuQ09TVCAgICAgICAgICAgICAgICAgICAgICAgIExJTkFWU0tSCisgICAgMTQzICAgICAgNCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBTWUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lEICAgICAgICAgICAgICAgICAgICAgICAgICBWVU9TSVBPSVNUTyAgICAgICAgICAgICAgICAgICAgICAgIEFNTU9SVC5BTk5VTyAgICAgICAgICAgICAgICAgICAgICAgxVJTQVZTS1IKKyAgICAxNDQgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEREQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEREQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgIEREQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1NT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUdBVlNLUgorICAgIDE0OCAgICAgLTEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgSU5ESVJFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVLVCAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElSRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJFQ1RPICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElSRUNUICAgICAgICAgICAgICAgICAgICAgRVDEU1VPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVUVE8gICAgICAgICAgICAgICAgICAgICAgICAgIElORElSRUtUCisgICAgMTUwICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRlJVRkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9OQ1RJT04uQVBQRUxBTlRFICAgICAgICAgICAgICAgICBMTEFNQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU1BUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9FUEVOICAgICAgICAgICAgICAgICAgICAgICBLVVRTVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJQ0hJQU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ST1BBCisgICAgMTYyICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFPEVUJFUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVBVUkFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU1QSUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJUkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lTU0VOLkNPTlRST0wgICAgICAgICAgICAgICBTSUlWT0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQkVSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1TEREEKKyAgICAxNjMgICAgICAxICAgICAgMiAgICAgICAgICAwICAgICAgICAgIE1ERVRFUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTURFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVRFUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ERVRFUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUklaLkRFVEVSTSAgICAgICAgICAgICAgICAgICAgICBERVRFUk1JTkFOVE1BVCAgICAgICAgICAgICAgIE1ERVRFUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUi5ERVRFUk0gICAgICAgICAgICAgICAgICAgICAgICBNREVURVJNCisgICAgMTY0ICAgICAgMSAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBNSU5WRVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRVJTRU1BVCAgICAgICAgICAgICAgICAgICAgICAgICBNSU5WRVJTQSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVFJJWi5JTlZFUlNPICAgICAgICAgICAgICAgICAgICAgSU5WRVJTRU1BVCAgICAgICAgICAgICAgICAgICBNS8TETlRFSU5FTiAgICAgICAgICAgICAgICAgICAgICAgIE1BVFIuSU5WRVJTQSAgICAgICAgICAgICAgICAgICAgICAgTUlOVkVSVAorICAgIDE2NSAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgTU1VTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVSVRNQVQgICAgICAgICAgICAgICAgICAgICAgICAgTU1VTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRSSVouTVVMVCAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVS1RNQVQgICAgICAgICAgICAgICAgICAgTUtFUlJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRSLlBST0RPVFRPICAgICAgICAgICAgICAgICAgICAgIE1NVUxUCisgICAgMTY3ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJUE1UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpJTlNaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdPSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQR1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJFVCAgICAgICAgICAgICAgICAgICAgICAgICBJUE1UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSRVNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgUkJFVEFMTklORworICAgIDE2OCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUFBNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLQVBaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU5DUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHT1BSSU4gICAgICAgICAgICAgICAgICAgICAgICAgICBQUEdUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBCRVQgICAgICAgICAgICAgICAgICAgICAgICAgUFBNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQLlJBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNT1JUCisgICAgMTY5ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBDT1VOVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWkFITDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05UQVJBICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlQuVkFMT1JFUyAgICAgICAgICAgICAgICAgICAgICAgQUFOVEFMQVJHICAgICAgICAgICAgICAgICAgICBMQVNLRS5BICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRBLlZBTE9SSSAgICAgICAgICAgICAgICAgICAgICAgQU5UQUxWCisgICAgMTgzICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBQUk9EVUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVS1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRFVJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUNUTyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRFVLVCAgICAgICAgICAgICAgICAgICAgICBUVUxPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RPVFRPICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRFVLVAorICAgIDE4NCAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUtVTFTEVCAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRPUklBTCAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBQ1VMVEVJVCAgICAgICAgICAgICAgICAgICAgS0VSVE9NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVRUT1JJQUxFICAgICAgICAgICAgICAgICAgICAgICAgIEZBS1VMVEVUCisgICAgMTg5ICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEUFJPRFVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIERCUFJPRFVLVCAgICAgICAgICAgICAgICAgICAgICAgICAgQkRQUk9EVUlUICAgICAgICAgICAgICAgICAgICAgICAgICBCRFBST0RVQ1RPICAgICAgICAgICAgICAgICAgICAgICAgIEJETVVMVElQTCAgICAgICAgICAgICAgICAgICAgICAgICAgREJQUk9EVUtUICAgICAgICAgICAgICAgICAgICBUVFVMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLlBST0RPVFRPICAgICAgICAgICAgICAgICAgICAgICAgRFBST0RVS1QKKyAgICAxOTAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTTk9OVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUS1RFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1ROT05URVhURSAgICAgICAgICAgICAgICAgICAgICAgIEVTTk9URVhUTyAgICAgICAgICAgICAgICAgICAgICAgICAgyS5Ow08uVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICBJU0dFRU5URUtTVCAgICAgICAgICAgICAgICAgIE9ORUlfVEVLU1RJICAgICAgICAgICAgICAgICAgICAgICAgVkFMLk5PTi5URVNUTyAgICAgICAgICAgICAgICAgICAgICDEUkVKVEVYVAorICAgIDE5MyAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgU1RERVZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFCV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDQVJUWVBFUCAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVkVTVFAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNWUEFEUCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUREVWUCAgICAgICAgICAgICAgICAgICAgICAgS0VTS0lIQUpPTlRBUCAgICAgICAgICAgICAgICAgICAgICBERVYuU1QuUE9QICAgICAgICAgICAgICAgICAgICAgICAgIFNUREFWUAorICAgIDE5NCAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQU5aRU4gICAgICAgICAgICAgICAgICAgICAgICAgIFZBUi5QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIuUE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBTlNQCisgICAgMTk1ICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEU1RERVZQICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCU1REQUJXTiAgICAgICAgICAgICAgICAgICAgICAgICAgQkRFQ0FSVFlQRVAgICAgICAgICAgICAgICAgICAgICAgICBCRERFU1ZFU1RQICAgICAgICAgICAgICAgICAgICAgICAgIEJEREVTVlBBICAgICAgICAgICAgICAgICAgICAgICAgICAgREJTVERFVlAgICAgICAgICAgICAgICAgICAgICBUS0VTS0lIQUpPTlRBUCAgICAgICAgICAgICAgICAgICAgIERCLkRFVi5TVC5QT1AgICAgICAgICAgICAgICAgICAgICAgRFNUREFWUAorICAgIDE5NiAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlZBUklBTlpFTiAgICAgICAgICAgICAgICAgICAgICAgIEJEVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVkFSUCAgICAgICAgICAgICAgICAgICAgICAgVFZBUklBTlNTSVAgICAgICAgICAgICAgICAgICAgICAgICBEQi5WQVIuUE9QICAgICAgICAgICAgICAgICAgICAgICAgIERWQVJJQU5TUAorICAgIDE5NyAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVFJVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBL3FJaRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRST05RVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVTkNBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVOQ0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFSEVFTCAgICAgICAgICAgICAgICAgICAgICAgS0FUS0FJU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBUUk9OQ0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWS09SVEEKKyAgICAxOTggICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTTE9HSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RMT0dJUVVFICAgICAgICAgICAgICAgICAgICAgICAgIEVTTE9HSUNPICAgICAgICAgICAgICAgICAgICAgICAgICAgyUzTR0lDTyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0xPR0lTQ0ggICAgICAgICAgICAgICAgICAgIE9OVE9UVVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLkxPR0lDTyAgICAgICAgICAgICAgICAgICAgICAgICDEUkxPR0lTSworICAgIDE5OSAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRENPVU5UQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkFOWkFITDIgICAgICAgICAgICAgICAgICAgICAgICAgIEJETkJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRDT05UQVJBICAgICAgICAgICAgICAgICAgICAgICAgICBCRENPTlRBUkEgICAgICAgICAgICAgICAgICAgICAgICAgIERCQUFOVEFMQyAgICAgICAgICAgICAgICAgICAgVExBU0tFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQi5DT05UQS5WQUxPUkkgICAgICAgICAgICAgICAgICAgIERBTlRBTFYKKyAgICAyMTIgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJPVU5EVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVGUlVOREVOICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJPTkRJLlNVUCAgICAgICAgICAgICAgICAgICAgICAgIFJFRE9OREVBUi5NQVMgICAgICAgICAgICAgICAgICAgICAgQVJSRURPTkRBUi5QQVJBLkNJTUEgICAgICAgICAgICAgICBBRlJPTkRFTi5OQUFSLkJPVkVOICAgICAgICAgIFBZ1lJJU1TELkRFUy5ZTNZTICAgICAgICAgICAgICAgICAgQVJST1RPTkRBLlBFUi5FQ0MgICAgICAgICAgICAgICAgICBBVlJVTkRBLlVQUMVUCisgICAgMjEzICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBST1VORERPV04gICAgICAgICAgICAgICAgICAgICAgICAgIEFCUlVOREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJST05ESS5JTkYgICAgICAgICAgICAgICAgICAgICAgICBSRURPTkRFQVIuTUVOT1MgICAgICAgICAgICAgICAgICAgIEFSUkVET05EQVIuUEFSQS5CQUlYTyAgICAgICAgICAgICAgQUZST05ERU4uTkFBUi5CRU5FREVOICAgICAgICBQWdZSSVNUxC5ERVMuQUxBUyAgICAgICAgICAgICAgICAgIEFSUk9UT05EQS5QRVIuRElGICAgICAgICAgICAgICAgICAgQVZSVU5EQS5ORUTFVAorICAgIDIxNiAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUkFOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkVSQVJRVUlBICAgICAgICAgICAgICAgICAgICAgICAgICBPUkRFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBTkcgICAgICAgICAgICAgICAgICAgICAgICAgQVJWT04uTVVLQUFOICAgICAgICAgICAgICAgICAgICAgICBSQU5HTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBTkcKKyAgICAyMTkgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEFERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURSRVNTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRFJFU1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDQ0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgRU5ERVJFx08gICAgICAgICAgICAgICAgICAgICAgICAgICBBRFJFUyAgICAgICAgICAgICAgICAgICAgICAgIE9TT0lURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJJWlpPICAgICAgICAgICAgICAgICAgICAgICAgICBBRFJFU1MKKyAgICAyMjAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERBWVMzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHRTM2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBKT1VSUzM2MCAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQVMzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBUzM2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdFTjM2MCAgICAgICAgICAgICAgICAgICAgIFDESVbEVDM2MCAgICAgICAgICAgICAgICAgICAgICAgICAgR0lPUk5PMzYwICAgICAgICAgICAgICAgICAgICAgICAgICBEQUdBUjM2MAorICAgIDIyMSAgICAgIDAgICAgICAxICAgICAgICAgIDEgICAgICAgICAgVE9EQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVSk9VUkRIVUkgICAgICAgICAgICAgICAgICAgICAgICAgSE9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT0pFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTkRBQUcgICAgICAgICAgICAgICAgICAgICAgVMRNxC5QxElWxCAgICAgICAgICAgICAgICAgICAgICAgICBPR0dJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEQUcKKyAgICAyMjIgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERWUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWREIgICAgICAgICAgICAgICAgICAgICAgICAgIFZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1NT1JULlZBUiAgICAgICAgICAgICAgICAgICAgICAgICBWREVHUkFWU0tSCisgICAgMjI3ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBNRURJQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFORSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFBTiAgICAgICAgICAgICAgICAgICAgICBNRURJQUFOSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFOCisgICAgMjI4ICAgICAtMSAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBTVU1QUk9EVUNUICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1FTlBST0RVS1QgICAgICAgICAgICAgICAgICAgICAgU09NTUVQUk9EICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1BUFJPRFVDVE8gICAgICAgICAgICAgICAgICAgICAgIFNPTUFSUFJPRFVUTyAgICAgICAgICAgICAgICAgICAgICAgU09NUFJPRFVLVCAgICAgICAgICAgICAgICAgICBUVUxPSkVOLlNVTU1BICAgICAgICAgICAgICAgICAgICAgIE1BVFIuU09NTUEuUFJPRE9UVE8gICAgICAgICAgICAgICAgUFJPRFVLVFNVTU1BCisgICAgMjI5ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBTSU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkhZUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5PSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICBTSU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOSAorICAgIDIzMCAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NIWVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPU0gKKyAgICAyMzEgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSFlQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU5ICisgICAgMjMyICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NJTkhZUCAgICAgICAgICAgICAgICAgICAgICAgICAgQVNJTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0VOT0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTRU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1NJTkggICAgICAgICAgICAgICAgICAgICBBU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NFTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDU0lOSAorICAgIDIzMyAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQUNPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1NIWVAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0dDT1NIICAgICAgICAgICAgICAgICAgICAgQUNPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0NPU0gKKyAgICAyMzQgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEFUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOSFlQICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09HVEFOSCAgICAgICAgICAgICAgICAgICAgIEFUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNUQU5ICisgICAgMjM1ICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBER0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCQVVTWlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRMSVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCREVYVFJBRVIgICAgICAgICAgICAgICAgICAgICAgICAgIEJERVhUUkFJUiAgICAgICAgICAgICAgICAgICAgICAgICAgREJMRVpFTiAgICAgICAgICAgICAgICAgICAgICBUTk9VREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLlZBTE9SSSAgICAgICAgICAgICAgICAgICAgICAgICAgREjETVRBCisgICAgMjQ0ICAgICAgMSAgICAgIDEgICAgICAgICAgMSAgICAgICAgICBJTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9STUHHw08gICAgICAgICAgICAgICAgICAgICAgICAgSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICBLVVZBVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNQklFTlRFLklORk8gICAgICAgICAgICAgICAgICAgICAgSU5GTworICAgIDI0NyAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHREEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTU1PUlQuRklTU08gICAgICAgICAgICAgICAgICAgICAgIERCCisgICAgMjUyICAgICAgMiAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBGUkVRVUVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgIEjEVUZJR0tFSVQgICAgICAgICAgICAgICAgICAgICAgICAgRlJFUVVFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICBGUkVDVUVOQ0lBICAgICAgICAgICAgICAgICAgICAgICAgIEZSRVHcyk5DSUEgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICBUQUFKVVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSRVFVRU5aQSAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFS1ZFTlMKKyAgICAyNjEgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEVSUk9SLlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgRkVITEVSLlRZUCAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFLkVSUkVVUiAgICAgICAgICAgICAgICAgICAgICAgIFRJUE8uREUuRVJST1IgICAgICAgICAgICAgICAgICAgICAgVElQTy5FUlJPICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFLkZPVVQgICAgICAgICAgICAgICAgICAgIFZJUkhFRU4uTEFKSSAgICAgICAgICAgICAgICAgICAgICAgRVJST1JFLlRJUE8gICAgICAgICAgICAgICAgICAgICAgICBGRUwuVFlQCisgICAgMjY3ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBSRUdJU1RFUi5JRCAgICAgICAgICAgICAgICAgICAgICAgIFJFR0lTVEVSLktFTk5VTU1FUiAgICAgICAgICAgICAgICAgUkVHSVNUUkUuTlVNRVJPICAgICAgICAgICAgICAgICAgICBJRC5SRUdJU1RSTyAgICAgICAgICAgICAgICAgICAgICAgIElERU5ULlJFR0lTVFJPICAgICAgICAgICAgICAgICAgICAgUkVHSVNUUkFUSUUuSUQgICAgICAgICAgICAgICBSRUtJU1RFUkkuVFVOTlVTICAgICAgICAgICAgICAgICAgIElERU5USUZJQ0FUT1JFLlJFR0lTVFJPICAgICAgICAgICAgUkVHSVNUUkVSQS5JRAorICAgIDI2OSAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQVZFREVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVRURUxBQlcgICAgICAgICAgICAgICAgICAgICAgICAgIEVDQVJULk1PWUVOICAgICAgICAgICAgICAgICAgICAgICAgREVTVlBST00gICAgICAgICAgICAgICAgICAgICAgICAgICBERVNWLk3JRElPICAgICAgICAgICAgICAgICAgICAgICAgIEdFTS5ERVZJQVRJRSAgICAgICAgICAgICAgICAgS0VTS0lQT0lLS0VBTUEgICAgICAgICAgICAgICAgICAgICBNRURJQS5ERVYgICAgICAgICAgICAgICAgICAgICAgICAgIE1FREVMQVZWCisgICAgMjcwICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBCRVRBRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEFWRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkJFVEEgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5CRVRBICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RCRVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQS5WRVJEICAgICAgICAgICAgICAgICAgICBCRUVUQUpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuQkVUQSAgICAgICAgICAgICAgICAgICAgICAgQkVUQUbWUkQKKyAgICAyNzEgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEdBTU1BTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUFMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTkdBTU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTU1BLkxOICAgICAgICAgICAgICAgICAgICAgICAgICAgTE5HQU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQU1NQS5MTiAgICAgICAgICAgICAgICAgICAgIEdBTU1BTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4uR0FNTUEgICAgICAgICAgICAgICAgICAgICAgICAgICBHQU1NQUxOCisgICAgMjcyICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBCRVRBSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEFJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQS5JTlZFUlNFICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5CRVRBLklOViAgICAgICAgICAgICAgICAgICAgIEJFVEEuQUNVTS5JTlYgICAgICAgICAgICAgICAgICAgICAgQkVUQS5JTlYgICAgICAgICAgICAgICAgICAgICBCRUVUQUpBS0FVTUEuS8TETlQgICAgICAgICAgICAgICAgIElOVi5CRVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQUlOVgorICAgIDI3MyAgICAgIDQgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQklOT01ESVNUICAgICAgICAgICAgICAgICAgICAgICAgICBCSU5PTVZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5CSU5PTUlBTEUgICAgICAgICAgICAgICAgICAgICAgRElTVFIuQklOT00gICAgICAgICAgICAgICAgICAgICAgICBESVNUUkJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgIEJJTk9NSUFMRS5WRVJEICAgICAgICAgICAgICAgQklOT01JSkFLQVVNQSAgICAgICAgICAgICAgICAgICAgICBESVNUUklCLkJJTk9NICAgICAgICAgICAgICAgICAgICAgIEJJTk9NRtZSRAorICAgIDI3NCAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0hJRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElWRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5LSElERVVYICAgICAgICAgICAgICAgICAgICAgICAgRElTVFIuQ0hJICAgICAgICAgICAgICAgICAgICAgICAgICBESVNULlFVSSAgICAgICAgICAgICAgICAgICAgICAgICAgIENISS5LV0FEUkFBVCAgICAgICAgICAgICAgICAgQ0hJSkFLQVVNQSAgICAgICAgICAgICAgICAgICAgICAgICBESVNUUklCLkNISSAgICAgICAgICAgICAgICAgICAgICAgIENISTJG1lJECisgICAgMjc1ICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDSElJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0hJREVVWC5JTlZFUlNFICAgICAgICAgICAgICAgICAgICBQUlVFQkEuQ0hJLklOViAgICAgICAgICAgICAgICAgICAgIElOVi5RVUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJLktXQURSQUFULklOViAgICAgICAgICAgICBDSElKQUtBVU1BLkvExE5UICAgICAgICAgICAgICAgICAgIElOVi5DSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJMklOVgorICAgIDI3NiAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ09NQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLT01CSU5BVElPTkVOICAgICAgICAgICAgICAgICAgICAgIENPTUJJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NQklOQVQgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTUJJTkFUSUVTICAgICAgICAgICAgICAgICAgS09NQklOQUFUSU8gICAgICAgICAgICAgICAgICAgICAgICBDT01CSU5BWklPTkUgICAgICAgICAgICAgICAgICAgICAgIEtPTUJJTgorICAgIDI3NyAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ09ORklERU5DRSAgICAgICAgICAgICAgICAgICAgICAgICBLT05GSURFTlogICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSVkFMTEUuQ09ORklBTkNFICAgICAgICAgICAgICAgSU5URVJWQUxPLkNPTkZJQU5aQSAgICAgICAgICAgICAgICBJTlQuQ09ORklBTsdBICAgICAgICAgICAgICAgICAgICAgIEJFVFJPVVdCQUFSSEVJRCAgICAgICAgICAgICAgTFVPVFRBTVVTVsRMSSAgICAgICAgICAgICAgICAgICAgICBDT05GSURFTlpBICAgICAgICAgICAgICAgICAgICAgICAgIEtPTkZJREVOUworICAgIDI3OCAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ1JJVEJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgICBLUklUQklOT00gICAgICAgICAgICAgICAgICAgICAgICAgIENSSVRFUkUuTE9JLkJJTk9NSUFMRSAgICAgICAgICAgICAgQklOT00uQ1JJVCAgICAgICAgICAgICAgICAgICAgICAgICBDUklULkJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgIENSSVQuQklOT00gICAgICAgICAgICAgICAgICAgQklOT01JSkFLQVVNQS5LUklUICAgICAgICAgICAgICAgICBDUklULkJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgIEtSSVRCSU5PTQorICAgIDI3OSAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRVZFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVJBREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVET05ERUEuUEFSICAgICAgICAgICAgICAgICAgICAgICBQQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU4gICAgICAgICAgICAgICAgICAgICAgICAgUEFSSUxMSU5FTiAgICAgICAgICAgICAgICAgICAgICAgICBQQVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIErETU4KKyAgICAyODAgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEVYUE9ORElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQT05WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuRVhQT05FTlRJRUxMRSAgICAgICAgICAgICAgICAgIERJU1RSLkVYUCAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVEVYUE9OICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBPTi5WRVJEICAgICAgICAgICAgICAgICAgIEVLU1BPTkVOVElBQUxJSkFLQVVNQSAgICAgICAgICAgICAgRElTVFJJQi5FWFAgICAgICAgICAgICAgICAgICAgICAgICBFWFBPTkbWUkQKKyAgICAyODEgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZESVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLlZFUkRFTElORyAgICAgICAgICAgICAgICAgIEZKQUtBVU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5GICAgICAgICAgICAgICAgICAgICAgICAgICBGRtZSRAorICAgIDI4MiAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRklOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkVSU0UuTE9JLkYgICAgICAgICAgICAgICAgICAgICAgRElTVFIuRi5JTlYgICAgICAgICAgICAgICAgICAgICAgICBJTlZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYuSU5WRVJTRSAgICAgICAgICAgICAgICAgICAgRkpBS0FVTUEuS8TETlQgICAgICAgICAgICAgICAgICAgICBJTlYuRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTlYKKyAgICAyODMgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIKKyAgICAyODQgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJU0hFUklOViAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSSU5WICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIuSU5WRVJTRSAgICAgICAgICAgICAgICAgICAgIFBSVUVCQS5GSVNIRVIuSU5WICAgICAgICAgICAgICAgICAgRklTSEVSSU5WICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIuSU5WICAgICAgICAgICAgICAgICAgIEZJU0hFUi5LxMROVCAgICAgICAgICAgICAgICAgICAgICAgSU5WLkZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVJJTlYKKyAgICAyODUgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZMT09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5URVJHUkVOWkUgICAgICAgICAgICAgICAgICAgICAgICBQTEFOQ0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJUExPLklORkVSSU9SICAgICAgICAgICAgICAgICAgQVJSRURNVUxUQiAgICAgICAgICAgICAgICAgICAgICAgICBBRlJPTkRFTi5CRU5FREVOICAgICAgICAgICAgIFBZ1lJJU1TELktFUlIuQUxBUyAgICAgICAgICAgICAgICAgQVJST1RPTkRBLkRJRkVUVE8gICAgICAgICAgICAgICAgICBSVU5EQS5ORVIKKyAgICAyODYgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEdBTU1BRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUFWRVJUICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuR0FNTUEgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkdBTU1BICAgICAgICAgICAgICAgICAgICAgICAgRElTVEdBTUEgICAgICAgICAgICAgICAgICAgICAgICAgICBHQU1NQS5WRVJEICAgICAgICAgICAgICAgICAgIEdBTU1BSkFLQVVNQSAgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5HQU1NQSAgICAgICAgICAgICAgICAgICAgICBHQU1NQUbWUkQKKyAgICAyODcgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEdBTU1BSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUFJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuR0FNTUEuSU5WRVJTRSAgICAgICAgICAgICAgICAgIERJU1RSLkdBTU1BLklOViAgICAgICAgICAgICAgICAgICAgSU5WR0FNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQU1NQS5JTlYgICAgICAgICAgICAgICAgICAgIEdBTU1BSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgICAgSU5WLkdBTU1BICAgICAgICAgICAgICAgICAgICAgICAgICBHQU1NQUlOVgorICAgIDI4OCAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0VJTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQkVSR1JFTlpFICAgICAgICAgICAgICAgICAgICAgICAgIFBMQUZPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVElQTE8uU1VQRVJJT1IgICAgICAgICAgICAgICAgICBURVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGUk9OREVOLkJPVkVOICAgICAgICAgICAgICAgUFnWUklTVMQuS0VSUi5ZTNZTICAgICAgICAgICAgICAgICBBUlJPVE9OREEuRUNDRVNTTyAgICAgICAgICAgICAgICAgIFJVTkRBLlVQUAorICAgIDI4OSAgICAgIDQgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSFlQR0VPTURJU1QgICAgICAgICAgICAgICAgICAgICAgICBIWVBHRU9NVkVSVCAgICAgICAgICAgICAgICAgICAgICAgIExPSS5IWVBFUkdFT01FVFJJUVVFICAgICAgICAgICAgICAgRElTVFIuSElQRVJHRU9NICAgICAgICAgICAgICAgICAgICBESVNULkhJUEVSR0VPTSAgICAgICAgICAgICAgICAgICAgIEhZUEVSR0VPLlZFUkQgICAgICAgICAgICAgICAgSFlQRVJHRU9NLkpBS0FVTUEgICAgICAgICAgICAgICAgICBESVNUUklCLklQRVJHRU9NICAgICAgICAgICAgICAgICAgIEhZUEdFT01G1lJECisgICAgMjkwICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT0dOT1JNRElTVCAgICAgICAgICAgICAgICAgICAgICAgIExPR05PUk1WRVJUICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkxPR05PUk1BTEUgICAgICAgICAgICAgICAgICAgICBESVNUUi5MT0cuTk9STSAgICAgICAgICAgICAgICAgICAgIERJU1QuTE9HTk9STUFMICAgICAgICAgICAgICAgICAgICAgTE9HLk5PUk0uVkVSRCAgICAgICAgICAgICAgICBMT0dOT1JNLkpBS0FVTUEgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuTE9HTk9STSAgICAgICAgICAgICAgICAgICAgTE9HTk9STUbWUkQKKyAgICAyOTEgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIExPR0lOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuTE9HTk9STUFMRS5JTlZFUlNFICAgICAgICAgICAgIERJU1RSLkxPRy5JTlYgICAgICAgICAgICAgICAgICAgICAgSU5WTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cuTk9STS5JTlYgICAgICAgICAgICAgICAgIExPR05PUk0uSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgSU5WLkxPR05PUk0gICAgICAgICAgICAgICAgICAgICAgICBMT0dJTlYKKyAgICAyOTIgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5FR0JJTk9NRElTVCAgICAgICAgICAgICAgICAgICAgICAgTkVHQklOT01WRVJUICAgICAgICAgICAgICAgICAgICAgICBMT0kuQklOT01JQUxFLk5FRyAgICAgICAgICAgICAgICAgIE5FR0JJTk9NRElTVCAgICAgICAgICAgICAgICAgICAgICAgRElTVC5CSU4uTkVHICAgICAgICAgICAgICAgICAgICAgICBORUcuQklOT00uVkVSRCAgICAgICAgICAgICAgIEJJTk9NSUpBS0FVTUEuTkVHICAgICAgICAgICAgICAgICAgRElTVFJJQi5CSU5PTS5ORUcgICAgICAgICAgICAgICAgICBORUdCSU5PTUbWUkQKKyAgICAyOTMgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5PUk1ESVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STVZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuTk9STUFMRSAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSLk5PUk0gICAgICAgICAgICAgICAgICAgICAgICAgRElTVC5OT1JNICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNLlZFUkQgICAgICAgICAgICAgICAgICAgIE5PUk0uSkFLQVVNQSAgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5OT1JNICAgICAgICAgICAgICAgICAgICAgICBOT1JNRtZSRAorICAgIDI5NCAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTk9STVNESVNUICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFORE5PUk1WRVJUICAgICAgICAgICAgICAgICAgICAgIExPSS5OT1JNQUxFLlNUQU5EQVJEICAgICAgICAgICAgICAgRElTVFIuTk9STS5FU1RBTkQgICAgICAgICAgICAgICAgICBESVNULk5PUk1QICAgICAgICAgICAgICAgICAgICAgICAgIFNUQU5ELk5PUk0uVkVSRCAgICAgICAgICAgICAgTk9STS5KQUtBVU1BLk5PUk1JVCAgICAgICAgICAgICAgICBESVNUUklCLk5PUk0uU1QgICAgICAgICAgICAgICAgICAgIE5PUk1TRtZSRAorICAgIDI5NSAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTk9STUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5OT1JNQUxFLklOVkVSU0UgICAgICAgICAgICAgICAgRElTVFIuTk9STS5JTlYgICAgICAgICAgICAgICAgICAgICBJTlYuTk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk0uSU5WICAgICAgICAgICAgICAgICAgICAgTk9STS5KQUtBVU1BLkvExE5UICAgICAgICAgICAgICAgICBJTlYuTk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1JTlYKKyAgICAyOTYgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5PUk1TSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkROT1JNSU5WICAgICAgICAgICAgICAgICAgICAgICBMT0kuTk9STUFMRS5TVEFOREFSRC5JTlZFUlNFICAgICAgIERJU1RSLk5PUk0uRVNUQU5ELklOViAgICAgICAgICAgICAgSU5WLk5PUk1QICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFORC5OT1JNLklOViAgICAgICAgICAgICAgIE5PUk0uSkFLQVVNQS5OT1JNSVQuS8TETlQgICAgICAgICAgSU5WLk5PUk0uU1QgICAgICAgICAgICAgICAgICAgICAgICBOT1JNU0lOVgorICAgIDI5NyAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU1RBTkRBUkRJWkUgICAgICAgICAgICAgICAgICAgICAgICBTVEFOREFSRElTSUVSVU5HICAgICAgICAgICAgICAgICAgIENFTlRSRUUuUkVEVUlURSAgICAgICAgICAgICAgICAgICAgTk9STUFMSVpBQ0lPTiAgICAgICAgICAgICAgICAgICAgICBQQURST05JWkFSICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1BTElTRVJFTiAgICAgICAgICAgICAgICAgTk9STUlUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNQUxJWlpBICAgICAgICAgICAgICAgICAgICAgICAgIFNUQU5EQVJESVNFUkEKKyAgICAyOTggICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE9ERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5HRVJBREUgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBBSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRE9OREVBLklNUEFSICAgICAgICAgICAgICAgICAgICAgzU1QQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkVWRU4gICAgICAgICAgICAgICAgICAgICAgIFBBUklUT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTUEFSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRERBCisgICAgMjk5ICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQRVJNVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBVElPTkVOICAgICAgICAgICAgICAgICAgICAgICAgUEVSTVVUQVRJT04gICAgICAgICAgICAgICAgICAgICAgICBQRVJNVVRBQ0lPTkVTICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSTVVUQVRJRVMgICAgICAgICAgICAgICAgICBQRVJNVVRBQVRJTyAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVEFaSU9ORSAgICAgICAgICAgICAgICAgICAgICAgUEVSTVVUCisgICAgMzAwICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSVNTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLlBPSVNTT04gICAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSVNTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9JU1NPTiAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSVNTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9JU1NPTgorICAgIDMwMSAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVERJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5TVFVERU5UICAgICAgICAgICAgICAgICAgICAgICAgRElTVFIuVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNUVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQuVkVSRCAgICAgICAgICAgICAgICAgICAgICAgVEpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNUUklCLlQgICAgICAgICAgICAgICAgICAgICAgICAgIFRG1lJECisgICAgMzAyICAgICAgNCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFSUJVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLldFSUJVTEwgICAgICAgICAgICAgICAgICAgICAgICBESVNULldFSUJVTEwgICAgICAgICAgICAgICAgICAgICAgIFdFSUJVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VJQlVMTCAgICAgICAgICAgICAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFSUJVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VJQlVMTAorICAgIDMwMyAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgU1VNWE1ZMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NRVhNWTIgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1FLlhNWTIgICAgICAgICAgICAgICAgICAgICAgICAgU1VNQVhNRU5PU1kyICAgICAgICAgICAgICAgICAgICAgICBTT01BWE1ZMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTS5YTUlOWS4yICAgICAgICAgICAgICAgICAgRVJPVFVTVEVOLk5FTEnWU1VNTUEgICAgICAgICAgICAgICBTT01NQS5RLkRJRkYgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BWE1ZMgorICAgIDMwNCAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgU1VNWDJNWTIgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NRVgyTVkyICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1FLlgyTVkyICAgICAgICAgICAgICAgICAgICAgICAgU1VNQVgyTUVOT1NZMiAgICAgICAgICAgICAgICAgICAgICBTT01BWDJEWTIgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTS5YMk1JTlkyICAgICAgICAgICAgICAgICAgTkVMSdZTVU1NSUVOLkVST1RVUyAgICAgICAgICAgICAgICBTT01NQS5ESUZGLlEgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BWDJNWTIKKyAgICAzMDUgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFNVTVgyUFkyICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUVYMlBZMiAgICAgICAgICAgICAgICAgICAgICAgICBTT01NRS5YMlBZMiAgICAgICAgICAgICAgICAgICAgICAgIFNVTUFYMk1BU1kyICAgICAgICAgICAgICAgICAgICAgICAgU09NQVgyU1kyICAgICAgICAgICAgICAgICAgICAgICAgICBTT00uWDJQTFVTWTIgICAgICAgICAgICAgICAgIE5FTEnWU1VNTUlFTi5TVU1NQSAgICAgICAgICAgICAgICAgU09NTUEuU09NTUEuUSAgICAgICAgICAgICAgICAgICAgICBTVU1NQVgyUFkyCisgICAgMzA2ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBDSElURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISVRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVC5LSElERVVYICAgICAgICAgICAgICAgICAgICAgICBQUlVFQkEuQ0hJICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RFLlFVSSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJLlRPRVRTICAgICAgICAgICAgICAgICAgICBDSElURVNUSSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuQ0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJMlRFU1QKKyAgICAzMDcgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIENPUlJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09SUkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0VGRklDSUVOVC5DT1JSRUxBVElPTiAgICAgICAgICAgIENPRUYuREUuQ09SUkVMICAgICAgICAgICAgICAgICAgICAgQ09SUkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1JSRUxBVElFICAgICAgICAgICAgICAgICAgIEtPUlJFTEFBVElPICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVMQVpJT05FICAgICAgICAgICAgICAgICAgICAgICBLT1JSRUwKKyAgICAzMDggICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIENPVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09WQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1ZBUklBTkNFICAgICAgICAgICAgICAgICAgICAgICAgIENPVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09WQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1ZBUklBTlRJRSAgICAgICAgICAgICAgICAgIEtPVkFSSUFOU1NJICAgICAgICAgICAgICAgICAgICAgICAgQ09WQVJJQU5aQSAgICAgICAgICAgICAgICAgICAgICAgICBLT1ZBUgorICAgIDMwOSAgICAgIDMgICAgICAyICAgICAgICAgIDAgICAgICAgICAgRk9SRUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0jEVFpFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVZJU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPTk9TVElDTyAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSVPDTyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPT1JTUEVMTEVOICAgICAgICAgICAgICAgICAgRU5OVVNURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSVNJT05FICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJS1RJT04KKyAgICAzMTAgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIEZURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSVUVCQS5GICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVEVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLlRPRVRTICAgICAgICAgICAgICAgICAgICAgIEZURVNUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVC5GICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVEVTVAorICAgIDMxMSAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgSU5URVJDRVBUICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0hTRU5BQlNDSE5JVFQgICAgICAgICAgICAgICAgICAgIE9SRE9OTkVFLk9SSUdJTkUgICAgICAgICAgICAgICAgICAgSU5URVJTRUNDSU9OICAgICAgICAgICAgICAgICAgICAgICBJTlRFUkNFUMfDTyAgICAgICAgICAgICAgICAgICAgICAgIFNOSUpQVU5UICAgICAgICAgICAgICAgICAgICAgTEVJS0tBVVNQSVNURSAgICAgICAgICAgICAgICAgICAgICBJTlRFUkNFVFRBICAgICAgICAgICAgICAgICAgICAgICAgIFNLxFJOSU5HU1BVTktUCisgICAgMzEyICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVBUlNPTgorICAgIDMxMyAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgUlNRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVNUSU1NVEhFSVRTTUFTUyAgICAgICAgICAgICAgICAgIENPRUZGSUNJRU5ULkRFVEVSTUlOQVRJT04gICAgICAgICAgQ09FRklDSUVOVEUuUjIgICAgICAgICAgICAgICAgICAgICBSUVVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuS1dBRFJBQVQgICAgICAgICAgICAgICAgICAgUEVBUlNPTi5ORUxJ1iAgICAgICAgICAgICAgICAgICAgICBSUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJLVgorICAgIDMxNCAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgU1RFWVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEZFSExFUllYICAgICAgICAgICAgICAgICAgICAgICAgIEVSUkVVUi5UWVBFLlhZICAgICAgICAgICAgICAgICAgICAgRVJST1IuVElQSUNPLlhZICAgICAgICAgICAgICAgICAgICBFUEFEWVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQU5ELkZPVVQuWVggICAgICAgICAgICAgICAgS0VTS0lWSVJIRSAgICAgICAgICAgICAgICAgICAgICAgICBFUlIuU1RELllYICAgICAgICAgICAgICAgICAgICAgICAgIFNUREZFTFlYCisgICAgMzE1ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBTTE9QRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURUlHVU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVOVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRU5ESUVOVEUgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xJTkHHw08gICAgICAgICAgICAgICAgICAgICAgICAgUklDSFRJTkcgICAgICAgICAgICAgICAgICAgICBLVUxNQUtFUlJPSU4gICAgICAgICAgICAgICAgICAgICAgIFBFTkRFTlpBICAgICAgICAgICAgICAgICAgICAgICAgICAgTFVUTklORworICAgIDMxNiAgICAgIDQgICAgICAyICAgICAgICAgIDAgICAgICAgICAgVFRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuU1RVREVOVCAgICAgICAgICAgICAgICAgICAgICAgUFJVRUJBLlQgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNURVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQuVE9FVFMgICAgICAgICAgICAgICAgICAgICAgVFRFU1RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRURVNUCisgICAgMzE3ICAgICAtMSAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBQUk9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBSFJTQ0hCRVJFSUNIICAgICAgICAgICAgICAgICAgICAgUFJPQkFCSUxJVEUgICAgICAgICAgICAgICAgICAgICAgICBQUk9CQUJJTElEQUQgICAgICAgICAgICAgICAgICAgICAgIFBST0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FOUyAgICAgICAgICAgICAgICAgICAgICAgICBUT0RFTk7ES9ZJU1lZUyAgICAgICAgICAgICAgICAgICAgIFBST0JBQklMSVTAICAgICAgICAgICAgICAgICAgICAgICAgU0FOTk9MSUtIRVQKKyAgICAzMTggICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERFVlNRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNUVVBREFCVyAgICAgICAgICAgICAgICAgICAgICAgICBTT01NRS5DQVJSRVMuRUNBUlRTICAgICAgICAgICAgICAgIERFU1ZJQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVYuS1dBRCAgICAgICAgICAgICAgICAgICAgIE9JS0FJU1RVLk5FTEnWU1VNTUEgICAgICAgICAgICAgICAgREVWLlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVkFEQVZWCisgICAgMzE5ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBHRU9NRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFT01JVFRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ZRU5ORS5HRU9NRVRSSVFVRSAgICAgICAgICAgICAgICBNRURJQS5HRU9NICAgICAgICAgICAgICAgICAgICAgICAgIE3JRElBLkdFT03JVFJJQ0EgICAgICAgICAgICAgICAgICAgTUVFVEsuR0VNICAgICAgICAgICAgICAgICAgICBLRVNLSUFSVk8uR0VPTSAgICAgICAgICAgICAgICAgICAgIE1FRElBLkdFT01FVFJJQ0EgICAgICAgICAgICAgICAgICAgR0VPTUVERUwKKyAgICAzMjAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEhBUk1FQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFSTUlUVEVMICAgICAgICAgICAgICAgICAgICAgICAgICBNT1lFTk5FLkhBUk1PTklRVUUgICAgICAgICAgICAgICAgIE1FRElBLkFSTU8gICAgICAgICAgICAgICAgICAgICAgICAgTclESUEuSEFSTdROSUNBICAgICAgICAgICAgICAgICAgICBIQVJNLkdFTSAgICAgICAgICAgICAgICAgICAgIEtFU0tJQVJWTy5IQVJNICAgICAgICAgICAgICAgICAgICAgTUVESUEuQVJNT05JQ0EgICAgICAgICAgICAgICAgICAgICBIQVJNTUVERUwKKyAgICAzMjEgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFNVTVNRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRFJBVEVTVU1NRSAgICAgICAgICAgICAgICAgICAgICBTT01NRS5DQVJSRVMgICAgICAgICAgICAgICAgICAgICAgIFNVTUEuQ1VBRFJBRE9TICAgICAgICAgICAgICAgICAgICAgU09NQVFVQUQgICAgICAgICAgICAgICAgICAgICAgICAgICBLV0FEUkFURU5TT00gICAgICAgICAgICAgICAgIE5FTEnWU1VNTUEgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUEuUSAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVkFEUkFUU1VNTUEKKyAgICAzMjIgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEtVUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVVJUT1NJUyAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUlRPU0lTICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVVJUT1NJUyAgICAgICAgICAgICAgICAgICAgIEtVUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSVE9TSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1BQSUdIRVQKKyAgICAzMjMgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFNLRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NISUVGRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0VGRklDSUVOVC5BU1lNRVRSSUUgICAgICAgICAgICAgIENPRUZJQ0lFTlRFLkFTSU1FVFJJQSAgICAgICAgICAgICAgRElTVE9Sx8NPICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hFRUZIRUlEICAgICAgICAgICAgICAgICAgIEpBS0FVTUFOLlZJTk9VUyAgICAgICAgICAgICAgICAgICAgQVNJTU1FVFJJQSAgICAgICAgICAgICAgICAgICAgICAgICBTTkVESEVUCisgICAgMzI0ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBaVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVC5aICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlVFQkEuWiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RFWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWi5UT0VUUyAgICAgICAgICAgICAgICAgICAgICBaVEVTVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlRFU1QKKyAgICAzMjUgICAgICAyICAgICAgMCAgICAgICAgICAwICAgICAgICAgIExBUkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0dS1lNTVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFOREUuVkFMRVVSICAgICAgICAgICAgICAgICAgICAgIEsuRVNJTU8uTUFZT1IgICAgICAgICAgICAgICAgICAgICAgTUFJT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9PVFNURSAgICAgICAgICAgICAgICAgICAgIFNVVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTkRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVNZSU1RBCisgICAgMzI2ICAgICAgMiAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTTUFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtLTEVJTlNURSAgICAgICAgICAgICAgICAgICAgICAgICAgUEVUSVRFLlZBTEVVUiAgICAgICAgICAgICAgICAgICAgICBLLkVTSU1PLk1FTk9SICAgICAgICAgICAgICAgICAgICAgIE1FTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xFSU5TVEUgICAgICAgICAgICAgICAgICAgICBQSUVOSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJQ0NPTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOU1RBCisgICAgMzI3ICAgICAgMiAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBRVUFSVElMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQVJUSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBUlRJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICBDVUFSVElMICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQVJUSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dBUlRJRUwgICAgICAgICAgICAgICAgICAgICBORUxKxE5ORVMgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQVJUSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgS1ZBUlRJTAorICAgIDMyOCAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUEVSQ0VOVElMRSAgICAgICAgICAgICAgICAgICAgICAgICBRVUFOVElMICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTlRJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSQ0VOVElMICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJDRU5USUwgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUkNFTlRJRUwgICAgICAgICAgICAgICAgICAgUFJPU0VOVFRJUElTVEUgICAgICAgICAgICAgICAgICAgICBQRVJDRU5USUxFICAgICAgICAgICAgICAgICAgICAgICAgIFBFUkNFTlRJTAorICAgIDMyOSAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUEVSQ0VOVFJBTksgICAgICAgICAgICAgICAgICAgICAgICBRVUFOVElMU1JBTkcgICAgICAgICAgICAgICAgICAgICAgIFJBTkcuUE9VUkNFTlRBR0UgICAgICAgICAgICAgICAgICAgUkFOR08uUEVSQ0VOVElMICAgICAgICAgICAgICAgICAgICBPUkRFTS5QT1JDRU5UVUFMICAgICAgICAgICAgICAgICAgIFBFUkNFTlQuUkFORyAgICAgICAgICAgICAgICAgUFJPU0VOVFRJSsRSSkVTVFlTICAgICAgICAgICAgICAgICBQRVJDRU5ULlJBTkdPICAgICAgICAgICAgICAgICAgICAgIFBST0NFTlRSQU5HCisgICAgMzMwICAgICAtMSAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PREFMV0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVVMgICAgICAgICAgICAgICAgICAgICAgICBNT09ESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQVsRSREUKKyAgICAzMzEgICAgICAyICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFRSSU1NRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VTVFVUWlRNSVRURUwgICAgICAgICAgICAgICAgICAgICBNT1lFTk5FLlJFRFVJVEUgICAgICAgICAgICAgICAgICAgIE1FRElBLkFDT1RBREEgICAgICAgICAgICAgICAgICAgICAgTclESUEuSU5URVJOQSAgICAgICAgICAgICAgICAgICAgICBHRVRSSU1ELkdFTSAgICAgICAgICAgICAgICAgIEtFU0tJQVJWTy5UQVNBVFRVICAgICAgICAgICAgICAgICAgTUVESUEuVFJPTkNBVEEgICAgICAgICAgICAgICAgICAgICBUUklNTUVERUwKKyAgICAzMzIgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuU1RVREVOVC5JTlZFUlNFICAgICAgICAgICAgICAgIERJU1RSLlQuSU5WICAgICAgICAgICAgICAgICAgICAgICAgSU5WVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULklOViAgICAgICAgICAgICAgICAgICAgICAgIFRKQUtBVU1BLkvExE5UICAgICAgICAgICAgICAgICAgICAgSU5WLlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU5WCisgICAgMzM2ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDT05DQVRFTkFURSAgICAgICAgICAgICAgICAgICAgICAgIFZFUktFVFRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OQ0FURU5FUiAgICAgICAgICAgICAgICAgICAgICAgICBDT05DQVRFTkFSICAgICAgICAgICAgICAgICAgICAgICAgIENPTkNBVEVOQVIgICAgICAgICAgICAgICAgICAgICAgICAgVEVLU1QuU0FNRU5WT0VHRU4gICAgICAgICAgICBLRVRKVVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTkNBVEVOQSAgICAgICAgICAgICAgICAgICAgICAgICAgU0FNTUFORk9HQQorICAgIDMzNyAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1RFTlogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVSVNTQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgUE9URU5DSUEgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1TKTkNJQSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ0hUICAgICAgICAgICAgICAgICAgICAgICAgUE9URU5TU0kgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1RFTlpBICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQUEjWSlQuVElMTAorICAgIDM0MiAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUkFESUFOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBRElBTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESUFORVMgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQU5PUyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBRElBTEVOICAgICAgICAgICAgICAgICAgICAgUkFESUFBTklUICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQU5USSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBRElBTkVSCisgICAgMzQzICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBERUdSRUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVHUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFET1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBREVOICAgICAgICAgICAgICAgICAgICAgICBBU1RFRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQURJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBREVSCisgICAgMzQ0ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVUJUT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFSUxFUkdFQk5JUyAgICAgICAgICAgICAgICAgICAgICAgU09VUy5UT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUT1RBTEVTICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRPVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCVE9UQUFMICAgICAgICAgICAgICAgICAgICBWxExJU1VNTUEgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRPVEFMRSAgICAgICAgICAgICAgICAgICAgICAgICAgREVMU1VNTUEKKyAgICAzNDUgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFNVTUlGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUVXRU5OICAgICAgICAgICAgICAgICAgICAgICAgICBTT01NRS5TSSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTUFSLlNJICAgICAgICAgICAgICAgICAgICAgICAgICAgU09NQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT00uQUxTICAgICAgICAgICAgICAgICAgICAgIFNVTU1BLkpPUyAgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUEuU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQS5PTQorICAgIDM0NiAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQ09VTlRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICBaxEhMRU5XRU5OICAgICAgICAgICAgICAgICAgICAgICAgIE5CLlNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEFSLlNJICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ULlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBTlRBTC5BTFMgICAgICAgICAgICAgICAgICAgTEFTS0UuSk9TICAgICAgICAgICAgICAgICAgICAgICAgICBDT05UQS5TRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOVEFMLk9NCisgICAgMzQ3ICAgICAgMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBDT1VOVEJMQU5LICAgICAgICAgICAgICAgICAgICAgICAgIEFOWkFITExFRVJFWkVMTEVOICAgICAgICAgICAgICAgICAgTkIuVklERSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05UQVIuQkxBTkNPICAgICAgICAgICAgICAgICAgICAgIENPTlRBUi5WQVpJTyAgICAgICAgICAgICAgICAgICAgICAgQUFOVEFMLkxFR0UuQ0VMTEVOICAgICAgICAgICBMQVNLRS5UWUhKxFQgICAgICAgICAgICAgICAgICAgICAgIENPTlRBLlZVT1RFICAgICAgICAgICAgICAgICAgICAgICAgQU5UQUwuVE9NTUEKKyAgICAzNTQgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJPTUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUtZNSVNDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICBST01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTUVSTy5ST01BTk8gICAgICAgICAgICAgICAgICAgICAgUk9NQU5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST01FSU5TICAgICAgICAgICAgICAgICAgICAgIFJPTUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NQU5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST01FUlNLCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2Z1bmN0aW9uX2xvY2FsZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHdyaXRlQTEucGwKKworCisKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gZXh0ZW5kIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisKK0NvZGUgaXMgYXBwZW5kZWQgdG8gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQgbW9kdWxlIGJ5IHJldXNpbmcKK3RoZSBwYWNrYWdlIG5hbWUuIFRoZSBuZXcgY29kZSBwcm92aWRlcyBhIHdyaXRlKCkgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0bwordXNlIEV4Y2VscyBBMSBzdHlsZSBjZWxsIHJlZmVyZW5jZXMuICBUaGlzIGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsIGJ1dCBpdAorc2VydmVzIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBtb2R1bGUgY2FuIGJlIGV4dGVuZGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZQorY29kZSBkaXJlY3RseS4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBleHRlbmQgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4KKyAgICAjCisgICAgIyBDb2RlIGlzIGFwcGVuZGVkIHRvIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0IG1vZHVsZSBieSByZXVzaW5nCisgICAgIyB0aGUgcGFja2FnZSBuYW1lLiBUaGUgbmV3IGNvZGUgcHJvdmlkZXMgYSB3cml0ZSgpIG1ldGhvZCB0aGF0IGFsbG93cyB5b3UgdG8KKyAgICAjIHVzZSBFeGNlbHMgQTEgc3R5bGUgY2VsbCByZWZlcmVuY2VzLiAgVGhpcyBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bCBidXQgaXQKKyAgICAjIHNlcnZlcyBhcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgbW9kdWxlIGNhbiBiZSBleHRlbmRlZCB3aXRob3V0IG1vZGlmeWluZyB0aGUKKyAgICAjIGNvZGUgZGlyZWN0bHkuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgY2FsbGVkIHNpbXBsZS54bHMgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ3cml0ZUExLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIFdyaXRlIG51bWJlcnMgb3IgdGV4dAorICAgICR3b3Jrc2hlZXQtPndyaXRlICAoMCwgMCwgIkhlbGxvIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVBMSgiQTMiLCAiQTMiICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZUExKCJBNSIsIDEuMjM0NSApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQKKyAgICAjIHBhY2thZ2UuCisgICAgIworICAgIAorICAgIHBhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgd3JpdGVBMSgkY2VsbCwgJHRva2VuLCAkZm9ybWF0KQorICAgICMKKyAgICAjIENvbnZlcnQgJGNlbGwgZnJvbSBFeGNlbCBBMSBub3RhdGlvbiB0byAkcm93LCAkY29sIG5vdGF0aW9uIGFuZAorICAgICMgY2FsbCB3cml0ZSgpIG9uICR0b2tlbi4KKyAgICAjCisgICAgIyBSZXR1cm5zOiByZXR1cm4gdmFsdWUgb2YgY2FsbGVkIHN1YnJvdXRpbmUgb3IgLTQgZm9yIGludmFsaWQgY2VsbAorICAgICMgcmVmZXJlbmNlLgorICAgICMKKyAgICBzdWIgd3JpdGVBMSB7CisgICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgICAgIG15ICRjb2w7CisgICAgICAgIG15ICRyb3c7CisgICAgCisgICAgICAgIGlmICgkY2VsbCA9fiAvKFtBLXpdKykoXGQrKS8pIHsKKyAgICAgICAgICAgKCRyb3csICRjb2wpID0gX2NvbnZlcnRBMSgkMiwgJDEpOworICAgICAgICAgICAkc2VsZi0+d3JpdGUoJHJvdywgJGNvbCwgQF8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC00OworICAgICAgICB9CisgICAgfQorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBfY29udmVydEExKCRyb3csICRjb2wpCisgICAgIworICAgICMgQ29udmVydCBFeGNlbCBBMSBub3RhdGlvbiB0byAkcm93LCAkY29sIG5vdGF0aW9uLiBDb252ZXJ0IGJhc2UyNiBjb2x1bW4KKyAgICAjIHN0cmluZyB0byBhIG51bWJlci4KKyAgICAjCisgICAgc3ViIF9jb252ZXJ0QTEgeworICAgICAgICBteSAkcm93ICAgID0gJF9bMF07CisgICAgICAgIG15ICRjb2wgICAgPSAkX1sxXTsgIyBTdHJpbmcgaW4gQUEgbm90YXRpb24KKyAgICAKKyAgICAgICAgbXkgQGNoYXJzICA9IHNwbGl0IC8vLCAkY29sOworICAgICAgICBteSAkZXhwbiAgID0gMDsKKyAgICAgICAgJGNvbCAgICAgICA9IDA7CisgICAgCisgICAgICAgIHdoaWxlIChAY2hhcnMpIHsKKyAgICAgICAgICAgIG15ICRjaGFyID0gdWMocG9wKEBjaGFycykpOyAjIExTIGNoYXIgZmlyc3QKKyAgICAgICAgICAgICRjb2wgKz0gKG9yZCgkY2hhcikgLW9yZCgnQScpICsxKSAqICgyNioqJGV4cG4pOworICAgICAgICAgICAgJGV4cG4rKzsKKyAgICAgICAgfQorICAgIAorICAgICAgICAjIENvbnZlcnQgMSBpbmRleCB0byAwIGluZGV4CisgICAgICAgICRyb3ctLTsKKyAgICAgICAgJGNvbC0tOworICAgIAorICAgICAgICByZXR1cm4oJHJvdywgJGNvbCk7CisgICAgfQorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy93cml0ZUExLnBsPgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK0NvbnRyaWJ1dGVkIGV4YW1wbGVzIGNvbnRhaW4gdGhlIG9yaWdpbmFsIGF1dGhvcidzIG5hbWUuCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0Zvcm1hdC5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRm9ybWF0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMTVmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0Zvcm1hdC5wbQpAQCAtMCwwICsxLDgxMyBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEZvcm1hdCAtIEEgY2xhc3MgZm9yIGRlZmluaW5nIEV4Y2VsIGZvcm1hdHRpbmcuCisjCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKKworCisKKworCisKK3VzZSB2YXJzIHF3KCRBVVRPTE9BRCAkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyAgPSBzaGlmdDsKKworICAgIG15ICRzZWxmICAgPSB7CisgICAgICAgICAgICAgICAgICAgIF94Zl9pbmRleCAgICAgICA9PiBzaGlmdCB8fCAwLAorCisgICAgICAgICAgICAgICAgICAgIF90eXBlICAgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9pbmRleCAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnQgICAgICAgICAgID0+ICdBcmlhbCcsCisgICAgICAgICAgICAgICAgICAgIF9zaXplICAgICAgICAgICA9PiAxMCwKKyAgICAgICAgICAgICAgICAgICAgX2JvbGQgICAgICAgICAgID0+IDB4MDE5MCwKKyAgICAgICAgICAgICAgICAgICAgX2l0YWxpYyAgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9jb2xvciAgICAgICAgICA9PiAweDdGRkYsCisgICAgICAgICAgICAgICAgICAgIF91bmRlcmxpbmUgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9zdHJpa2VvdXQgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfb3V0bGluZSAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250X3NoYWRvdyAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9zY3JpcHQgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfZmFtaWx5ICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250X2NoYXJzZXQgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9lbmNvZGluZyAgPT4gMCwKKworICAgICAgICAgICAgICAgICAgICBfbnVtX2Zvcm1hdCAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX251bV9mb3JtYXRfZW5jID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2hpZGRlbiAgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9sb2NrZWQgICAgICAgICA9PiAxLAorCisgICAgICAgICAgICAgICAgICAgIF90ZXh0X2hfYWxpZ24gICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfdGV4dF93cmFwICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3RleHRfdl9hbGlnbiAgID0+IDIsCisgICAgICAgICAgICAgICAgICAgIF90ZXh0X2p1c3RsYXN0ICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfcm90YXRpb24gICAgICAgPT4gMCwKKworICAgICAgICAgICAgICAgICAgICBfZmdfY29sb3IgICAgICAgPT4gMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgX2JnX2NvbG9yICAgICAgID0+IDB4NDEsCisKKyAgICAgICAgICAgICAgICAgICAgX3BhdHRlcm4gICAgICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2JvdHRvbSAgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF90b3AgICAgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfbGVmdCAgICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3JpZ2h0ICAgICAgICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2JvdHRvbV9jb2xvciAgID0+IDB4NDAsCisgICAgICAgICAgICAgICAgICAgIF90b3BfY29sb3IgICAgICA9PiAweDQwLAorICAgICAgICAgICAgICAgICAgICBfbGVmdF9jb2xvciAgICAgPT4gMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgX3JpZ2h0X2NvbG9yICAgID0+IDB4NDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2luZGVudCAgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9zaHJpbmsgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfbWVyZ2VfcmFuZ2UgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3JlYWRpbmdfb3JkZXIgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2RpYWdfdHlwZSAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9kaWFnX2NvbG9yICAgICA9PiAweDQwLAorICAgICAgICAgICAgICAgICAgICBfZGlhZ19ib3JkZXIgICAgPT4gMCwKKworICAgICAgICAgICAgICAgICAgICBfZm9udF9vbmx5ICAgICAgPT4gMCwKKworICAgICAgICAgICAgICAgICAgICAjIFRlbXAgY29kZSB0byBwcmV2ZW50IG1lcmdlZCBmb3JtYXRzIGluIG5vbi1tZXJnZWQgY2VsbHMuCisgICAgICAgICAgICAgICAgICAgIF91c2VkX21lcmdlICAgICA9PiAwLAorCisgICAgICAgICAgICAgICAgIH07CisKKyAgICBibGVzcyAgJHNlbGYsICRjbGFzczsKKworICAgICMgU2V0IHByb3BlcnRpZXMgcGFzc2VkIHRvIFdvcmtib29rOjphZGRfZm9ybWF0KCkKKyAgICAkc2VsZi0+c2V0X2Zvcm1hdF9wcm9wZXJ0aWVzKEBfKSBpZiBAXzsKKworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNvcHkoJGZvcm1hdCkKKyMKKyMgQ29weSB0aGUgYXR0cmlidXRlcyBvZiBhbm90aGVyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQgb2JqZWN0LgorIworc3ViIGNvcHkgeworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRvdGhlciA9ICRfWzBdOworCisgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRvdGhlcjsKKyAgICByZXR1cm4gdW5sZXNzIChyZWYoJHNlbGYpIGVxIHJlZigkb3RoZXIpKTsKKworICAgICMgU3RvcmUgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZSBkb24ndCB3YW50IG92ZXJ3cml0dGVuLgorICAgIG15ICR4ZiAgICAgICAgICAgICAgICAgID0gJHNlbGYtPntfeGZfaW5kZXh9OworICAgIG15ICRtZXJnZV9yYW5nZSAgICAgICAgID0gJHNlbGYtPntfbWVyZ2VfcmFuZ2V9OworICAgIG15ICR1c2VkX21lcmdlICAgICAgICAgID0gJHNlbGYtPntfdXNlZF9tZXJnZX07CisKKyAgICAlJHNlbGYgICAgICAgICAgICAgICAgICA9ICUkb3RoZXI7ICMgQ29weSBwcm9wZXJ0aWVzCisKKyAgICAjIFJlc3RvcmUgc2F2ZWQgcHJvcGVydGllcy4KKyAgICAkc2VsZi0+e194Zl9pbmRleH0gICAgICA9ICR4ZjsKKyAgICAkc2VsZi0+e19tZXJnZV9yYW5nZX0gICA9ICRtZXJnZV9yYW5nZTsKKyAgICAkc2VsZi0+e191c2VkX21lcmdlfSAgICA9ICR1c2VkX21lcmdlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X3hmKCRzdHlsZSkKKyMKKyMgR2VuZXJhdGUgYW4gRXhjZWwgQklGRiBYRiByZWNvcmQuCisjCitzdWIgZ2V0X3hmIHsKKworICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYCisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZDsgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaWZudDsgICAgICAgIyBJbmRleCB0byBGT05UIHJlY29yZAorICAgIG15ICRpZm10OyAgICAgICAjIEluZGV4IHRvIEZPUk1BVCByZWNvcmQKKyAgICBteSAkc3R5bGU7ICAgICAgIyBTdHlsZSBhbmQgb3RoZXIgb3B0aW9ucworICAgIG15ICRhbGlnbjsgICAgICAjIEFsaWdubWVudAorICAgIG15ICRpbmRlbnQ7ICAgICAjCisgICAgbXkgJGljdjsgICAgICAgICMgZmcgYW5kIGJnIHBhdHRlcm4gY29sb3JzCisgICAgbXkgJGJvcmRlcjE7ICAgICMgQm9yZGVyIGxpbmUgb3B0aW9ucworICAgIG15ICRib3JkZXIyOyAgICAjIEJvcmRlciBsaW5lIG9wdGlvbnMKKyAgICBteSAkYm9yZGVyMzsgICAgIyBCb3JkZXIgbGluZSBvcHRpb25zCisKKworICAgICMgU2V0IHRoZSB0eXBlIG9mIHRoZSBYRiByZWNvcmQgYW5kIHNvbWUgb2YgdGhlIGF0dHJpYnV0ZXMuCisgICAgaWYgKCRzZWxmLT57X3R5cGV9ID09IDB4RkZGNSkgeworICAgICAgICAkc3R5bGUgPSAweEZGRjU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc3R5bGUgICA9ICRzZWxmLT57X2xvY2tlZH07CisgICAgICAgICRzdHlsZSAgfD0gJHNlbGYtPntfaGlkZGVufSA8PCAxOworICAgIH0KKworCisgICAgIyBGbGFncyB0byBpbmRpY2F0ZSBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQuCisgICAgbXkgJGF0cl9udW0gICAgID0gKCRzZWxmLT57X251bV9mb3JtYXR9ICAgICAhPSAwKTsKKworICAgIG15ICRhdHJfZm50ICAgICA9ICgkc2VsZi0+e19mb250X2luZGV4fSAgICAgIT0gMCk7CisKKyAgICBteSAkYXRyX2FsYyAgICAgPSAoJHNlbGYtPntfdGV4dF9oX2FsaWdufSAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RleHRfdl9hbGlnbn0gICAhPSAyICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19zaHJpbmt9ICAgICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfbWVyZ2VfcmFuZ2V9ICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RleHRfd3JhcH0gICAgICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19pbmRlbnR9ICAgICAgICAgIT0gMCkgPyAxIDogMDsKKworICAgIG15ICRhdHJfYmRyICAgICA9ICgkc2VsZi0+e19ib3R0b219ICAgICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfdG9wfSAgICAgICAgICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X2xlZnR9ICAgICAgICAgICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19yaWdodH0gICAgICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfZGlhZ190eXBlfSAgICAgICE9IDApID8gMTogMDsKKworICAgIG15ICRhdHJfcGF0ICAgICA9ICgkc2VsZi0+e19mZ19jb2xvcn0gICAgICAgIT0gMHg0MCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfYmdfY29sb3J9ICAgICAgICE9IDB4NDEgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3BhdHRlcm59ICAgICAgICAhPSAweDAwKSA/IDEgOiAwOworCisgICAgbXkgJGF0cl9wcm90ICAgID0gKCRzZWxmLT57X2hpZGRlbn0gICAgICAgICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19sb2NrZWR9ICAgICAgICAgIT0gMSkgPyAxIDogMDsKKworCisgICAgIyBTZXQgYXR0cmlidXRlIGNoYW5nZWQgZmxhZ3MgZm9yIHRoZSBzdHlsZSBmb3JtYXRzLgorICAgIGlmICgkc2VsZi0+e194Zl9pbmRleH0gIT0gMCBhbmQgJHNlbGYtPntfdHlwZX0gPT0gMHhGRkY1KSB7CisKKyAgICAgICAgaWYgKCRzZWxmLT57X3hmX2luZGV4fSA+PSAxNikgeworICAgICAgICAgICAgJGF0cl9udW0gICAgPSAwOworICAgICAgICAgICAgJGF0cl9mbnQgICAgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJGF0cl9udW0gICAgPSAxOworICAgICAgICAgICAgJGF0cl9mbnQgICAgPSAwOworICAgICAgICB9CisKKyAgICAgICAgJGF0cl9hbGMgICAgPSAxOworICAgICAgICAkYXRyX2JkciAgICA9IDE7CisgICAgICAgICRhdHJfcGF0ICAgID0gMTsKKyAgICAgICAgJGF0cl9wcm90ICAgPSAxOworICAgIH0KKworCisgICAgIyBTZXQgYSBkZWZhdWx0IGRpYWdvbmFsIGJvcmRlciBzdHlsZSBpZiBub25lIHdhcyBzcGVjaWZpZWQuCisgICAgJHNlbGYtPntfZGlhZ19ib3JkZXJ9ID0gMSBpZiAhJHNlbGYtPntfZGlhZ19ib3JkZXJ9IGFuZCAkc2VsZi0+e19kaWFnX3R5cGV9OworCisKKyAgICAjIFJlc2V0IHRoZSBkZWZhdWx0IGNvbG91cnMgZm9yIHRoZSBub24tZm9udCBwcm9wZXJ0aWVzCisgICAgJHNlbGYtPntfZmdfY29sb3J9ICAgICA9IDB4NDAgaWYgJHNlbGYtPntfZmdfY29sb3J9ICAgICA9PSAweDdGRkY7CisgICAgJHNlbGYtPntfYmdfY29sb3J9ICAgICA9IDB4NDEgaWYgJHNlbGYtPntfYmdfY29sb3J9ICAgICA9PSAweDdGRkY7CisgICAgJHNlbGYtPntfYm90dG9tX2NvbG9yfSA9IDB4NDAgaWYgJHNlbGYtPntfYm90dG9tX2NvbG9yfSA9PSAweDdGRkY7CisgICAgJHNlbGYtPntfdG9wX2NvbG9yfSAgICA9IDB4NDAgaWYgJHNlbGYtPntfdG9wX2NvbG9yfSAgICA9PSAweDdGRkY7CisgICAgJHNlbGYtPntfbGVmdF9jb2xvcn0gICA9IDB4NDAgaWYgJHNlbGYtPntfbGVmdF9jb2xvcn0gICA9PSAweDdGRkY7CisgICAgJHNlbGYtPntfcmlnaHRfY29sb3J9ICA9IDB4NDAgaWYgJHNlbGYtPntfcmlnaHRfY29sb3J9ICA9PSAweDdGRkY7CisgICAgJHNlbGYtPntfZGlhZ19jb2xvcn0gICA9IDB4NDAgaWYgJHNlbGYtPntfZGlhZ19jb2xvcn0gICA9PSAweDdGRkY7CisKKworICAgICMgWmVybyB0aGUgZGVmYXVsdCBib3JkZXIgY29sb3VyIGlmIHRoZSBib3JkZXIgaGFzIG5vdCBiZWVuIHNldC4KKyAgICAkc2VsZi0+e19ib3R0b21fY29sb3J9ID0gMCBpZiAkc2VsZi0+e19ib3R0b219ICAgID09IDA7CisgICAgJHNlbGYtPntfdG9wX2NvbG9yfSAgICA9IDAgaWYgJHNlbGYtPntfdG9wfSAgICAgICA9PSAwOworICAgICRzZWxmLT57X3JpZ2h0X2NvbG9yfSAgPSAwIGlmICRzZWxmLT57X3JpZ2h0fSAgICAgPT0gMDsKKyAgICAkc2VsZi0+e19sZWZ0X2NvbG9yfSAgID0gMCBpZiAkc2VsZi0+e19sZWZ0fSAgICAgID09IDA7CisgICAgJHNlbGYtPntfZGlhZ19jb2xvcn0gICA9IDAgaWYgJHNlbGYtPntfZGlhZ190eXBlfSA9PSAwOworCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgMiBsb2dpY2FsIHN0YXRlbWVudHMgdGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZXMgaW4gcmVsYXRpb24KKyAgICAjIHRvIGNlbGwgY29sb3VycyBhbmQgcGF0dGVybnM6CisgICAgIyAxLiBGb3IgYSBzb2xpZCBmaWxsIChfcGF0dGVybiA9PSAxKSBFeGNlbCByZXZlcnNlcyB0aGUgcm9sZSBvZiBmb3JlZ3JvdW5kCisgICAgIyAgICBhbmQgYmFja2dyb3VuZCBjb2xvdXJzLgorICAgICMgMi4gSWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEgZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kIGNvbG91ciB3aXRob3V0IGEKKyAgICAjICAgIHBhdHRlcm4gdGhleSBwcm9iYWJseSB3YW50ZWQgYSBzb2xpZCBmaWxsLCBzbyB3ZSBmaWxsIGluIHRoZSBkZWZhdWx0cy4KKyAgICAjCisgICAgaWYgKCRzZWxmLT57X3BhdHRlcm59ICA8PSAweDAxIGFuZAorICAgICAgICAkc2VsZi0+e19iZ19jb2xvcn0gIT0gMHg0MSBhbmQKKyAgICAgICAgJHNlbGYtPntfZmdfY29sb3J9ID09IDB4NDAgICAgKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntfZmdfY29sb3J9ID0gJHNlbGYtPntfYmdfY29sb3J9OworICAgICAgICAkc2VsZi0+e19iZ19jb2xvcn0gPSAweDQwOworICAgICAgICAkc2VsZi0+e19wYXR0ZXJufSAgPSAxOworICAgIH0KKworICAgIGlmICgkc2VsZi0+e19wYXR0ZXJufSAgPD0gMHgwMSBhbmQKKyAgICAgICAgJHNlbGYtPntfYmdfY29sb3J9ID09IDB4NDEgYW5kCisgICAgICAgICRzZWxmLT57X2ZnX2NvbG9yfSAhPSAweDQwICAgICkKKyAgICB7CisgICAgICAgICRzZWxmLT57X2JnX2NvbG9yfSA9IDB4NDA7CisgICAgICAgICRzZWxmLT57X3BhdHRlcm59ICA9IDE7CisgICAgfQorCisKKyAgICAjIFNldCBkZWZhdWx0IGFsaWdubWVudCBpZiBpbmRlbnQgaXMgc2V0LgorICAgICRzZWxmLT57X3RleHRfaF9hbGlnbn0gPSAxIGlmICRzZWxmLT57X2luZGVudH0gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfdGV4dF9oX2FsaWdufSA9PSAwOworCisKKyAgICAkcmVjb3JkICAgICAgICAgPSAweDAwRTA7CisgICAgJGxlbmd0aCAgICAgICAgID0gMHgwMDE0OworCisgICAgJGlmbnQgICAgICAgICAgID0gJHNlbGYtPntfZm9udF9pbmRleH07CisgICAgJGlmbXQgICAgICAgICAgID0gJHNlbGYtPntfbnVtX2Zvcm1hdH07CisKKworICAgICRhbGlnbiAgICAgICAgICA9ICRzZWxmLT57X3RleHRfaF9hbGlnbn07CisgICAgJGFsaWduICAgICAgICAgfD0gJHNlbGYtPntfdGV4dF93cmFwfSAgICAgPDwgMzsKKyAgICAkYWxpZ24gICAgICAgICB8PSAkc2VsZi0+e190ZXh0X3ZfYWxpZ259ICA8PCA0OworICAgICRhbGlnbiAgICAgICAgIHw9ICRzZWxmLT57X3RleHRfanVzdGxhc3R9IDw8IDc7CisgICAgJGFsaWduICAgICAgICAgfD0gJHNlbGYtPntfcm90YXRpb259ICAgICAgPDwgODsKKworCisKKyAgICAkaW5kZW50ICAgICAgICAgPSAkc2VsZi0+e19pbmRlbnR9OworICAgICRpbmRlbnQgICAgICAgIHw9ICRzZWxmLT57X3Nocmlua30gICAgICAgIDw8IDQ7CisgICAgJGluZGVudCAgICAgICAgfD0gJHNlbGYtPntfbWVyZ2VfcmFuZ2V9ICAgPDwgNTsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkc2VsZi0+e19yZWFkaW5nX29yZGVyfSA8PCA2OworICAgICRpbmRlbnQgICAgICAgIHw9ICRhdHJfbnVtICAgICAgICAgICAgICAgIDw8IDEwOworICAgICRpbmRlbnQgICAgICAgIHw9ICRhdHJfZm50ICAgICAgICAgICAgICAgIDw8IDExOworICAgICRpbmRlbnQgICAgICAgIHw9ICRhdHJfYWxjICAgICAgICAgICAgICAgIDw8IDEyOworICAgICRpbmRlbnQgICAgICAgIHw9ICRhdHJfYmRyICAgICAgICAgICAgICAgIDw8IDEzOworICAgICRpbmRlbnQgICAgICAgIHw9ICRhdHJfcGF0ICAgICAgICAgICAgICAgIDw8IDE0OworICAgICRpbmRlbnQgICAgICAgIHw9ICRhdHJfcHJvdCAgICAgICAgICAgICAgIDw8IDE1OworCisKKyAgICAkYm9yZGVyMSAgICAgICAgPSAkc2VsZi0+e19sZWZ0fTsKKyAgICAkYm9yZGVyMSAgICAgICB8PSAkc2VsZi0+e19yaWdodH0gICAgICAgICA8PCA0OworICAgICRib3JkZXIxICAgICAgIHw9ICRzZWxmLT57X3RvcH0gICAgICAgICAgIDw8IDg7CisgICAgJGJvcmRlcjEgICAgICAgfD0gJHNlbGYtPntfYm90dG9tfSAgICAgICAgPDwgMTI7CisKKyAgICAkYm9yZGVyMiAgICAgICAgPSAkc2VsZi0+e19sZWZ0X2NvbG9yfTsKKyAgICAkYm9yZGVyMiAgICAgICB8PSAkc2VsZi0+e19yaWdodF9jb2xvcn0gICA8PCA3OworICAgICRib3JkZXIyICAgICAgIHw9ICRzZWxmLT57X2RpYWdfdHlwZX0gICAgIDw8IDE0OworCisKKyAgICAkYm9yZGVyMyAgICAgICAgPSAkc2VsZi0+e190b3BfY29sb3J9OworICAgICRib3JkZXIzICAgICAgIHw9ICRzZWxmLT57X2JvdHRvbV9jb2xvcn0gIDw8IDc7CisgICAgJGJvcmRlcjMgICAgICAgfD0gJHNlbGYtPntfZGlhZ19jb2xvcn0gICAgPDwgMTQ7CisgICAgJGJvcmRlcjMgICAgICAgfD0gJHNlbGYtPntfZGlhZ19ib3JkZXJ9ICAgPDwgMjE7CisgICAgJGJvcmRlcjMgICAgICAgfD0gJHNlbGYtPntfcGF0dGVybn0gICAgICAgPDwgMjY7CisKKyAgICAkaWN2ICAgICAgICAgICAgPSAkc2VsZi0+e19mZ19jb2xvcn07CisgICAgJGljdiAgICAgICAgICAgfD0gJHNlbGYtPntfYmdfY29sb3J9ICAgICAgPDwgNzsKKworCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2dnZ2dnZ2VnYiLCAkaWZudCwgJGlmbXQsICRzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWxpZ24sICRpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJvcmRlcjEsICRib3JkZXIyLCAkYm9yZGVyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaWN2KTsKKworICAgIHJldHVybigkaGVhZGVyIC4gJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTm90ZSB0byBwb3J0ZXJzLiBUaGUgbWFqb3JpdHkgb2YgdGhlIHNldF9wcm9wZXJ0eSgpIG1ldGhvZHMgYXJlIGNyZWF0ZWQKKyMgZHluYW1pY2FsbHkgdmlhIFBlcmwnIEFVVE9MT0FEIHN1Yiwgc2VlIGJlbG93LiBZb3UgbWF5IHByZWZlci9oYXZlIHRvIHNwZWNpZnkKKyMgdGhlbSBleHBsaWNpdGx5IGluIG90aGVyIGltcGxlbWVudGF0aW9uIGxhbmd1YWdlcy4KKyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9mb250KCkKKyMKKyMgR2VuZXJhdGUgYW4gRXhjZWwgQklGRiBGT05UIHJlY29yZC4KKyMKK3N1YiBnZXRfZm9udCB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkOyAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAjIFJlY29yZCBsZW5ndGgKKworICAgIG15ICRkeUhlaWdodDsgICAjIEhlaWdodCBvZiBmb250ICgxLzIwIG9mIGEgcG9pbnQpCisgICAgbXkgJGdyYml0OyAgICAgICMgRm9udCBhdHRyaWJ1dGVzCisgICAgbXkgJGljdjsgICAgICAgICMgSW5kZXggdG8gY29sb3IgcGFsZXR0ZQorICAgIG15ICRibHM7ICAgICAgICAjIEJvbGQgc3R5bGUKKyAgICBteSAkc3NzOyAgICAgICAgIyBTdXBlcnNjcmlwdC9zdWJzY3JpcHQKKyAgICBteSAkdWxzOyAgICAgICAgIyBVbmRlcmxpbmUKKyAgICBteSAkYkZhbWlseTsgICAgIyBGb250IGZhbWlseQorICAgIG15ICRiQ2hhclNldDsgICAjIENoYXJhY3RlciBzZXQKKyAgICBteSAkcmVzZXJ2ZWQ7ICAgIyBSZXNlcnZlZAorICAgIG15ICRjY2g7ICAgICAgICAjIExlbmd0aCBvZiBmb250IG5hbWUKKyAgICBteSAkcmdjaDsgICAgICAgIyBGb250IG5hbWUKKyAgICBteSAkZW5jb2Rpbmc7ICAgIyBGb250IG5hbWUgY2hhcmFjdGVyIGVuY29kaW5nCisKKworICAgICRkeUhlaWdodCAgID0gJHNlbGYtPntfc2l6ZX0gKiAyMDsKKyAgICAkaWN2ICAgICAgICA9ICRzZWxmLT57X2NvbG9yfTsKKyAgICAkYmxzICAgICAgICA9ICRzZWxmLT57X2JvbGR9OworICAgICRzc3MgICAgICAgID0gJHNlbGYtPntfZm9udF9zY3JpcHR9OworICAgICR1bHMgICAgICAgID0gJHNlbGYtPntfdW5kZXJsaW5lfTsKKyAgICAkYkZhbWlseSAgICA9ICRzZWxmLT57X2ZvbnRfZmFtaWx5fTsKKyAgICAkYkNoYXJTZXQgICA9ICRzZWxmLT57X2ZvbnRfY2hhcnNldH07CisgICAgJHJnY2ggICAgICAgPSAkc2VsZi0+e19mb250fTsKKyAgICAkZW5jb2RpbmcgICA9ICRzZWxmLT57X2ZvbnRfZW5jb2Rpbmd9OworCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRyZ2NoKSkgeworICAgICAgICAgICAgJHJnY2ggPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkcmdjaCk7CisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgJGNjaCA9IGxlbmd0aCAkcmdjaDsKKworICAgICMgSGFuZGxlIFVuaWNvZGUgZm9udCBuYW1lcy4KKyAgICBpZiAoJGVuY29kaW5nID09IDEpIHsKKyAgICAgICAgY3JvYWsgIlVuZXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gVW5pY29kZSBmb250IG5hbWUiIGlmICRjY2ggJSAyOworICAgICAgICAkY2NoICAvPSAyIGlmICRlbmNvZGluZzsKKyAgICAgICAgJHJnY2ggID0gcGFjayAndionLCB1bnBhY2sgJ24qJywgJHJnY2g7CisgICAgfQorCisgICAgJHJlY29yZCAgICAgPSAweDMxOworICAgICRsZW5ndGggICAgID0gMHgxMCArIGxlbmd0aCAkcmdjaDsKKyAgICAkcmVzZXJ2ZWQgICA9IDB4MDA7CisKKyAgICAkZ3JiaXQgICAgICA9IDB4MDA7CisgICAgJGdyYml0ICAgICB8PSAweDAyIGlmICRzZWxmLT57X2l0YWxpY307CisgICAgJGdyYml0ICAgICB8PSAweDA4IGlmICRzZWxmLT57X2ZvbnRfc3RyaWtlb3V0fTsKKyAgICAkZ3JiaXQgICAgIHw9IDB4MTAgaWYgJHNlbGYtPntfZm9udF9vdXRsaW5lfTsKKyAgICAkZ3JiaXQgICAgIHw9IDB4MjAgaWYgJHNlbGYtPntfZm9udF9zaGFkb3d9OworCisKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgICAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnZ2dkNDQ0NDQyIsICRkeUhlaWdodCwgJGdyYml0LCAkaWN2LCAkYmxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3NzLCAkdWxzLCAkYkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJDaGFyU2V0LCAkcmVzZXJ2ZWQsICRjY2gsICRlbmNvZGluZyk7CisKKyAgICByZXR1cm4oJGhlYWRlciAuICRkYXRhIC4gJHJnY2gpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9mb250X2tleSgpCisjCisjIFJldHVybnMgYSB1bmlxdWUgaGFzaCBrZXkgZm9yIGEgZm9udC4gVXNlZCBieSBXb3JrYm9vay0+X3N0b3JlX2FsbF9mb250cygpCisjCitzdWIgZ2V0X2ZvbnRfa2V5IHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICAjIFRoZSBmb2xsb3dpbmcgZWxlbWVudHMgYXJlIGFycmFuZ2VkIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSBvZgorICAgICMgZ2VuZXJhdGluZyBhIHVuaXF1ZSBrZXkuIEVsZW1lbnRzIHRoYXQgaG9sZCBhIGxhcmdlIHJhbmdlIG9mIG51bWJlcnMKKyAgICAjIGUuZy4gX2NvbG9yIGFyZSBwbGFjZWQgYmV0d2VlbiB0d28gYmluYXJ5IGVsZW1lbnRzIHN1Y2ggYXMgX2l0YWxpYworICAgICMKKyAgICBteSAka2V5ID0gIiRzZWxmLT57X2ZvbnR9JHNlbGYtPntfc2l6ZX0iOworICAgICRrZXkgICAuPSAiJHNlbGYtPntfZm9udF9zY3JpcHR9JHNlbGYtPntfdW5kZXJsaW5lfSI7CisgICAgJGtleSAgIC49ICIkc2VsZi0+e19mb250X3N0cmlrZW91dH0kc2VsZi0+e19ib2xkfSRzZWxmLT57X2ZvbnRfb3V0bGluZX0iOworICAgICRrZXkgICAuPSAiJHNlbGYtPntfZm9udF9mYW1pbHl9JHNlbGYtPntfZm9udF9jaGFyc2V0fSI7CisgICAgJGtleSAgIC49ICIkc2VsZi0+e19mb250X3NoYWRvd30kc2VsZi0+e19jb2xvcn0kc2VsZi0+e19pdGFsaWN9IjsKKyAgICAka2V5ICAgLj0gIiRzZWxmLT57X2ZvbnRfZW5jb2Rpbmd9IjsKKyAgICAka2V5ICAgID1+IHMvIC9fL2c7ICMgQ29udmVydCB0aGUga2V5IHRvIGEgc2luZ2xlIHdvcmQKKworICAgIHJldHVybiAka2V5OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X3hmX2luZGV4KCkKKyMKKyMgUmV0dXJucyB0aGUgdXNlZCBieSBXb3Jrc2hlZXQtPl9YRigpCisjCitzdWIgZ2V0X3hmX2luZGV4IHsKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfeGZfaW5kZXh9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9jb2xvcigpCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc2V0X3h4eF9jb2xvciBtZXRob2RzIHRvIGNvbnZlcnQgYSBjb2xvcgorIyBzdHJpbmcgaW50byBhIG51bWJlci4gQ29sb3IgcmFuZ2UgaXMgMC4uNjMgYnV0IHdlIHdpbGwgcmVzdHJpY3QgaXQKKyMgdG8gOC4uNjMgdG8gY29tcGx5IHdpdGggR251bWVyaWMuIENvbG9ycyAwLi43IGFyZSByZXBlYXRlZCBpbiA4Li4xNS4KKyMKK3N1YiBfZ2V0X2NvbG9yIHsKKworICAgIG15ICVjb2xvcnMgPSAoCisgICAgICAgICAgICAgICAgICAgIGFxdWEgICAgPT4gMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgY3lhbiAgICA9PiAweDBGLAorICAgICAgICAgICAgICAgICAgICBibGFjayAgID0+IDB4MDgsCisgICAgICAgICAgICAgICAgICAgIGJsdWUgICAgPT4gMHgwQywKKyAgICAgICAgICAgICAgICAgICAgYnJvd24gICA9PiAweDEwLAorICAgICAgICAgICAgICAgICAgICBtYWdlbnRhID0+IDB4MEUsCisgICAgICAgICAgICAgICAgICAgIGZ1Y2hzaWEgPT4gMHgwRSwKKyAgICAgICAgICAgICAgICAgICAgZ3JheSAgICA9PiAweDE3LAorICAgICAgICAgICAgICAgICAgICBncmV5ICAgID0+IDB4MTcsCisgICAgICAgICAgICAgICAgICAgIGdyZWVuICAgPT4gMHgxMSwKKyAgICAgICAgICAgICAgICAgICAgbGltZSAgICA9PiAweDBCLAorICAgICAgICAgICAgICAgICAgICBuYXZ5ICAgID0+IDB4MTIsCisgICAgICAgICAgICAgICAgICAgIG9yYW5nZSAgPT4gMHgzNSwKKyAgICAgICAgICAgICAgICAgICAgcGluayAgICA9PiAweDIxLAorICAgICAgICAgICAgICAgICAgICBwdXJwbGUgID0+IDB4MTQsCisgICAgICAgICAgICAgICAgICAgIHJlZCAgICAgPT4gMHgwQSwKKyAgICAgICAgICAgICAgICAgICAgc2lsdmVyICA9PiAweDE2LAorICAgICAgICAgICAgICAgICAgICB3aGl0ZSAgID0+IDB4MDksCisgICAgICAgICAgICAgICAgICAgIHllbGxvdyAgPT4gMHgwRCwKKyAgICAgICAgICAgICAgICAgKTsKKworICAgICMgUmV0dXJuIHRoZSBkZWZhdWx0IGNvbG9yLCAweDdGRkYsIGlmIHVuZGVmLAorICAgIHJldHVybiAweDdGRkYgdW5sZXNzIGRlZmluZWQgJF9bMF07CisKKyAgICAjIG9yIHRoZSBjb2xvciBzdHJpbmcgY29udmVydGVkIHRvIGFuIGludGVnZXIsCisgICAgcmV0dXJuICRjb2xvcnN7bGMoJF9bMF0pfSBpZiBleGlzdHMgJGNvbG9yc3tsYygkX1swXSl9OworCisgICAgIyBvciB0aGUgZGVmYXVsdCBjb2xvciBpZiBzdHJpbmcgaXMgdW5yZWNvZ25pc2VkLAorICAgIHJldHVybiAweDdGRkYgaWYgKCRfWzBdID1+IG0vXEQvKTsKKworICAgICMgb3IgYW4gaW5kZXggPCA4IG1hcHBlZCBpbnRvIHRoZSBjb3JyZWN0IHJhbmdlLAorICAgIHJldHVybiAkX1swXSArIDggaWYgJF9bMF0gPCA4OworCisgICAgIyBvciB0aGUgZGVmYXVsdCBjb2xvciBpZiBhcmcgaXMgb3V0c2lkZSByYW5nZSwKKyAgICByZXR1cm4gMHg3RkZGIGlmICRfWzBdID4gNjM7CisKKyAgICAjIG9yIGFuIGludGVnZXIgaW4gdGhlIHZhbGlkIHJhbmdlCisgICAgcmV0dXJuICRfWzBdOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3R5cGUoKQorIworIyBTZXQgdGhlIFhGIG9iamVjdCB0eXBlIGFzIDAgPSBjZWxsIFhGIG9yIDB4RkZGNSA9IHN0eWxlIFhGLgorIworc3ViIHNldF90eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHR5cGUgPSAkX1swXTsKKworICAgIGlmIChkZWZpbmVkICRfWzBdIGFuZCAkX1swXSBlcSAwKSB7CisgICAgICAgICRzZWxmLT57X3R5cGV9ID0gMHgwMDAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfdHlwZX0gPSAweEZGRjU7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2FsaWduKCkKKyMKKyMgU2V0IGNlbGwgYWxpZ25tZW50LgorIworc3ViIHNldF9hbGlnbiB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkbG9jYXRpb24gPSAkX1swXTsKKworICAgIHJldHVybiBpZiBub3QgZGVmaW5lZCAkbG9jYXRpb247ICAjIE5vIGRlZmF1bHQKKyAgICByZXR1cm4gaWYgJGxvY2F0aW9uID1+IG0vXGQvOyAgICAgIyBJZ25vcmUgbnVtYmVycworCisgICAgJGxvY2F0aW9uID0gbGMoJGxvY2F0aW9uKTsKKworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDEpIGlmICgkbG9jYXRpb24gZXEgJ2xlZnQnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbigyKSBpZiAoJGxvY2F0aW9uIGVxICdjZW50cmUnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbigyKSBpZiAoJGxvY2F0aW9uIGVxICdjZW50ZXInKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbigzKSBpZiAoJGxvY2F0aW9uIGVxICdyaWdodCcpOworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDQpIGlmICgkbG9jYXRpb24gZXEgJ2ZpbGwnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig1KSBpZiAoJGxvY2F0aW9uIGVxICdqdXN0aWZ5Jyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNikgaWYgKCRsb2NhdGlvbiBlcSAnY2VudGVyX2Fjcm9zcycpOworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDYpIGlmICgkbG9jYXRpb24gZXEgJ2NlbnRyZV9hY3Jvc3MnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig2KSBpZiAoJGxvY2F0aW9uIGVxICdtZXJnZScpOyAgICAgICAgIyBTOldFIG5hbWUKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig3KSBpZiAoJGxvY2F0aW9uIGVxICdkaXN0cmlidXRlZCcpOworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDcpIGlmICgkbG9jYXRpb24gZXEgJ2VxdWFsX3NwYWNlJyk7ICAjIFBhcnNlRXhjZWwKKworCisgICAgJHNlbGYtPnNldF90ZXh0X3ZfYWxpZ24oMCkgaWYgKCRsb2NhdGlvbiBlcSAndG9wJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X3ZfYWxpZ24oMSkgaWYgKCRsb2NhdGlvbiBlcSAndmNlbnRyZScpOworICAgICRzZWxmLT5zZXRfdGV4dF92X2FsaWduKDEpIGlmICgkbG9jYXRpb24gZXEgJ3ZjZW50ZXInKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbigyKSBpZiAoJGxvY2F0aW9uIGVxICdib3R0b20nKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbigzKSBpZiAoJGxvY2F0aW9uIGVxICd2anVzdGlmeScpOworICAgICRzZWxmLT5zZXRfdGV4dF92X2FsaWduKDQpIGlmICgkbG9jYXRpb24gZXEgJ3ZkaXN0cmlidXRlZCcpOworICAgICRzZWxmLT5zZXRfdGV4dF92X2FsaWduKDQpIGlmICgkbG9jYXRpb24gZXEgJ3ZlcXVhbF9zcGFjZScpOyAjIFBhcnNlRXhjZWwKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF92YWxpZ24oKQorIworIyBTZXQgdmVydGljYWwgY2VsbCBhbGlnbm1lbnQuIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHNldF9mb3JtYXRfcHJvcGVydGllcygpCisjIG1ldGhvZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHByb3BlcnRpZXMuCisjCitzdWIgc2V0X3ZhbGlnbiB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgICRzZWxmLT5zZXRfYWxpZ24oQF8pOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2NlbnRlcl9hY3Jvc3MoKQorIworIyBJbXBsZW1lbnRzIHRoZSBFeGNlbDUgc3R5bGUgIm1lcmdlIi4KKyMKK3N1YiBzZXRfY2VudGVyX2Fjcm9zcyB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDYpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21lcmdlKCkKKyMKKyMgVGhpcyB3YXMgdGhlIHdheSB0byBpbXBsZW1lbnQgYSBtZXJnZSBpbiBFeGNlbDUuIEhvd2V2ZXIgaXQgc2hvdWxkIGhhdmUgYmVlbgorIyBjYWxsZWQgImNlbnRlcl9hY3Jvc3MiIGFuZCBub3QgIm1lcmdlIi4KKyMgVGhpcyBpcyBub3cgZGVwcmVjYXRlZC4gVXNlIHNldF9jZW50ZXJfYWNyb3NzKCkgb3IgYmV0dGVyIG1lcmdlX3JhbmdlKCkuCisjCisjCitzdWIgc2V0X21lcmdlIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworCisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNik7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfYm9sZCgpCisjCisjIEJvbGQgaGFzIGEgcmFuZ2UgMHg2NC4uMHgzRTguCisjIDB4MTkwIGlzIG5vcm1hbC4gMHgyQkMgaXMgYm9sZC4gU28gaXMgYW4gZXhjZXNzaXZlIHVzZSBvZiBBVVRPTE9BRC4KKyMKK3N1YiBzZXRfYm9sZCB7CisKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisgICAgbXkgJHdlaWdodCA9ICRfWzBdOworCisgICAgJHdlaWdodCA9IDB4MkJDIGlmIG5vdCBkZWZpbmVkICR3ZWlnaHQ7ICMgQm9sZCB0ZXh0CisgICAgJHdlaWdodCA9IDB4MkJDIGlmICR3ZWlnaHQgPT0gMTsgICAgICAgICMgQm9sZCB0ZXh0CisgICAgJHdlaWdodCA9IDB4MTkwIGlmICR3ZWlnaHQgPT0gMDsgICAgICAgICMgTm9ybWFsIHRleHQKKyAgICAkd2VpZ2h0ID0gMHgxOTAgaWYgJHdlaWdodCA8ICAweDA2NDsgICAgIyBMb3dlciBib3VuZAorICAgICR3ZWlnaHQgPSAweDE5MCBpZiAkd2VpZ2h0ID4gIDB4M0U4OyAgICAjIFVwcGVyIGJvdW5kCisKKyAgICAkc2VsZi0+e19ib2xkfSA9ICR3ZWlnaHQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfYm9yZGVyKCRzdHlsZSkKKyMKKyMgU2V0IGNlbGxzIGJvcmRlcnMgdG8gdGhlIHNhbWUgc3R5bGUKKyMKK3N1YiBzZXRfYm9yZGVyIHsKKworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRzdHlsZSA9ICRfWzBdOworCisgICAgJHNlbGYtPnNldF9ib3R0b20oJHN0eWxlKTsKKyAgICAkc2VsZi0+c2V0X3RvcCgkc3R5bGUpOworICAgICRzZWxmLT5zZXRfbGVmdCgkc3R5bGUpOworICAgICRzZWxmLT5zZXRfcmlnaHQoJHN0eWxlKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9ib3JkZXJfY29sb3IoJGNvbG9yKQorIworIyBTZXQgY2VsbHMgYm9yZGVyIHRvIHRoZSBzYW1lIGNvbG9yCisjCitzdWIgc2V0X2JvcmRlcl9jb2xvciB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkY29sb3IgPSAkX1swXTsKKworICAgICRzZWxmLT5zZXRfYm90dG9tX2NvbG9yKCRjb2xvcik7CisgICAgJHNlbGYtPnNldF90b3BfY29sb3IoJGNvbG9yKTsKKyAgICAkc2VsZi0+c2V0X2xlZnRfY29sb3IoJGNvbG9yKTsKKyAgICAkc2VsZi0+c2V0X3JpZ2h0X2NvbG9yKCRjb2xvcik7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfcm90YXRpb24oJGFuZ2xlKQorIworIyBTZXQgdGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSB0ZXh0LiBBbiBhbGlnbm1lbnQgcHJvcGVydHkuCisjCitzdWIgc2V0X3JvdGF0aW9uIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRyb3RhdGlvbiA9ICRfWzBdOworCisgICAgIyBBcmd1bWVudCBzaG91bGQgYmUgYSBudW1iZXIKKyAgICByZXR1cm4gaWYgJHJvdGF0aW9uICF+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvOworCisgICAgIyBUaGUgYXJnIHR5cGUgY2FuIGJlIGEgZG91YmxlIGJ1dCB0aGUgRXhjZWwgZGlhbG9nIG9ubHkgYWxsb3dzIGludGVnZXJzLgorICAgICRyb3RhdGlvbiA9IGludCAkcm90YXRpb247CisKKyAgICBpZiAoJHJvdGF0aW9uID09IDI3MCkgeworICAgICAgICAkcm90YXRpb24gPSAyNTU7CisgICAgfQorICAgIGVsc2lmICgkcm90YXRpb24gPj0gLTkwIG9yICRyb3RhdGlvbiA8PSA5MCkgeworICAgICAgICAkcm90YXRpb24gPSAtJHJvdGF0aW9uICs5MCBpZiAkcm90YXRpb24gPCAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2FycCAiUm90YXRpb24gJHJvdGF0aW9uIG91dHNpZGUgcmFuZ2U6IC05MCA8PSBhbmdsZSA8PSA5MCI7CisgICAgICAgICRyb3RhdGlvbiA9IDA7CisgICAgfQorCisgICAgJHNlbGYtPntfcm90YXRpb259ID0gJHJvdGF0aW9uOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2Zvcm1hdF9wcm9wZXJ0aWVzKCkKKyMKKyMgQ29udmVydCBoYXNoZXMgb2YgcHJvcGVydGllcyB0byBtZXRob2QgY2FsbHMuCisjCitzdWIgc2V0X2Zvcm1hdF9wcm9wZXJ0aWVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAlcHJvcGVydGllcyA9IEBfOyAjIE1lcmdlIG11bHRpcGxlIGhhc2hlcyBpbnRvIG9uZQorCisgICAgd2hpbGUgKG15KCRrZXksICR2YWx1ZSkgPSBlYWNoKCVwcm9wZXJ0aWVzKSkgeworCisgICAgICAgICMgU3RyaXAgbGVhZGluZyAiLSIgZnJvbSBUayBzdHlsZSBwcm9wZXJ0aWVzIGUuZy4gLWNvbG9yID0+ICdyZWQnLgorICAgICAgICAka2V5ID1+IHMvXi0vLzsKKworICAgICAgICAjIENyZWF0ZSBhIHN1YiB0byBzZXQgdGhlIHByb3BlcnR5LgorICAgICAgICBteSAkc3ViID0gXCZ7InNldF8ka2V5In07CisgICAgICAgICRzdWItPigkc2VsZiwgJHZhbHVlKTsKKyAgIH0KK30KKworIyBSZW5hbWVkIHJhcmVseSB1c2VkIHNldF9wcm9wZXJ0aWVzKCkgdG8gc2V0X2Zvcm1hdF9wcm9wZXJ0aWVzKCkgdG8gYXZvaWQKKyMgY29uZnVzaW9uIHdpdGggV29ya2Jvb2sgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUuIFRoZSBmb2xsb3dpbmcgYWN0cyBhcyBhbgorIyBhbGlhcyBmb3IgYW55IGNvZGUgdGhhdCB1c2VzIHRoZSBvbGQgbmFtZS4KKypzZXRfcHJvcGVydGllcyA9ICpzZXRfZm9ybWF0X3Byb3BlcnRpZXM7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBBVVRPTE9BRC4gRGV1cyBleCBtYWNoaW5hLgorIworIyBEeW5hbWljYWxseSBjcmVhdGUgc2V0IG1ldGhvZHMgdGhhdCBhcmVuJ3QgYWxyZWFkeSBkZWZpbmVkLgorIworc3ViIEFVVE9MT0FEIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIElnbm9yZSBjYWxscyB0byBERVNUUk9ZCisgICAgcmV0dXJuIGlmICRBVVRPTE9BRCA9fiAvOjpERVNUUk9ZJC87CisKKyAgICAjIENoZWNrIGZvciBhIHZhbGlkIG1ldGhvZCBuYW1lcywgaS5lLiAic2V0X3h4eF95eXkiLgorICAgICRBVVRPTE9BRCA9fiAvLio6OnNldChcdyspLyBvciBkaWUgIlVua25vd24gbWV0aG9kOiAkQVVUT0xPQURcbiI7CisKKyAgICAjIE1hdGNoIHRoZSBhdHRyaWJ1dGUsIGkuZS4gIl94eHhfeXl5Ii4KKyAgICBteSAkYXR0cmlidXRlID0gJDE7CisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGF0dHJpYnV0ZSBleGlzdHMKKyAgICBleGlzdHMgJHNlbGYtPnskYXR0cmlidXRlfSAgb3IgZGllICJVbmtub3duIG1ldGhvZDogJEFVVE9MT0FEXG4iOworCisgICAgIyBUaGUgYXR0cmlidXRlIHZhbHVlCisgICAgbXkgJHZhbHVlOworCisKKyAgICAjIFRoZXJlIGFyZSB0d28gdHlwZXMgb2Ygc2V0IG1ldGhvZHM6IHNldF9wcm9wZXJ0eSgpIGFuZAorICAgICMgc2V0X3Byb3BlcnR5X2NvbG9yKCkuIFdoZW4gYSBtZXRob2QgaXMgQVVUT0xPQURFRCB3ZSBzdG9yZSBhIG5ldyBhbm9ueW1vdXMKKyAgICAjIHN1YiBpbiB0aGUgYXBwcm9wcmlhdGUgc2xvdCBpbiB0aGUgc3ltYm9sIHRhYmxlLiBUaGUgc3BlZWRzIHVwIHN1YnNlcXVlbnQKKyAgICAjIGNhbGxzIHRvIHRoZSBzYW1lIG1ldGhvZC4KKyAgICAjCisgICAgbm8gc3RyaWN0ICdyZWZzJzsgIyBUbyBhbGxvdyBzeW1ib2wgdGFibGUgaGFja2VyeQorCisgICAgaWYgKCRBVVRPTE9BRCA9fiAvLio6OnNldFx3K2NvbG9yJC8pIHsKKyAgICAgICAgIyBGb3IgInNldF9wcm9wZXJ0eV9jb2xvciIgbWV0aG9kcworICAgICAgICAkdmFsdWUgPSAgX2dldF9jb2xvcigkX1swXSk7CisKKyAgICAgICAgKnskQVVUT0xPQUR9ID0gc3ViIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnskYXR0cmlidXRlfSA9IF9nZXRfY29sb3IoJF9bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgJHZhbHVlID0gJF9bMF07CisgICAgICAgICR2YWx1ZSA9IDEgaWYgbm90IGRlZmluZWQgJHZhbHVlOyAjIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFsd2F5cyAxCisKKyAgICAgICAgKnskQVVUT0xPQUR9ID0gc3ViIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICR2YWx1ZSA9IHNoaWZ0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IDEgaWYgbm90IGRlZmluZWQgJHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+eyRhdHRyaWJ1dGV9ID0gJHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgfQorCisKKyAgICAkc2VsZi0+eyRhdHRyaWJ1dGV9ID0gJHZhbHVlOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK0Zvcm1hdCAtIEEgY2xhc3MgZm9yIGRlZmluaW5nIEV4Y2VsIGZvcm1hdHRpbmcuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtdWxhLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtdWxhLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTgzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0Zvcm11bGEucG0KQEAgLTAsMCArMSwxNDg1IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtdWxhOw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBGb3JtdWxhIC0gQSBjbGFzcyBmb3IgZ2VuZXJhdGluZyBFeGNlbCBmb3JtdWxhcy4NCisjDQorIw0KKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsDQorIw0KKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnDQorIw0KKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fDQorIw0KKw0KK3VzZSBFeHBvcnRlcjsNCit1c2Ugc3RyaWN0Ow0KK3VzZSBDYXJwOw0KKw0KKw0KKw0KKw0KKw0KKw0KK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOw0KK0BJU0EgPSBxdyhFeHBvcnRlcik7DQorDQorJFZFUlNJT04gPSAnMi4zNyc7DQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIENsYXNzIGRhdGEuDQorIw0KK215ICRwYXJzZXI7DQorbXkgJXB0ZzsNCitteSAlZnVuY3Rpb25zOw0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBGb3IgZGVidWdnaW5nLg0KKyMNCitteSAkX2RlYnVnID0gMDsNCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgbmV3KCkNCisjDQorIyBDb25zdHJ1Y3Rvcg0KKyMNCitzdWIgbmV3IHsNCisNCisgICAgbXkgJGNsYXNzICA9ICRfWzBdOw0KKw0KKyAgICBteSAkc2VsZiAgID0gew0KKyAgICAgICAgICAgICAgICAgICAgX2J5dGVfb3JkZXIgICAgID0+ICRfWzFdLA0KKyAgICAgICAgICAgICAgICAgICAgX3dvcmtib29rICAgICAgID0+ICIiLA0KKyAgICAgICAgICAgICAgICAgICAgX2V4dF9zaGVldHMgICAgID0+IHt9LA0KKyAgICAgICAgICAgICAgICAgICAgX2V4dF9yZWZzICAgICAgID0+IHt9LA0KKyAgICAgICAgICAgICAgICAgICAgX2V4dF9yZWZfY291bnQgID0+IDAsDQorICAgICAgICAgICAgICAgICAgICBfZXh0X25hbWVzICAgICAgPT4ge30sDQorICAgICAgICAgICAgICAgICB9Ow0KKw0KKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOw0KKyAgICByZXR1cm4gJHNlbGY7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfaW5pdF9wYXJzZXIoKQ0KKyMNCisjIFRoZXJlIGlzIGEgc21hbGwgb3ZlcmhlYWQgaW52b2x2ZWQgaW4gZ2VuZXJhdGluZyB0aGUgcGFyc2VyLiBUaGVyZWZvcmUsIHRoZQ0KKyMgaW5pdGlhbGlzYXRpb24gaXMgZGVsYXllZCB1bnRpbCBhIGZvcm11bGEgaXMgcmVxdWlyZWQuDQorIyBUT0RPOiB1c2UgYSBwcmUtY29tcGlsZWQgZ3JhbW1hci4NCisjDQorIyBQb3J0ZXJzIHRha2Ugbm90ZSwgYSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgaXNuJ3QgbWFuZGF0b3J5LiBBIGZ1dHVyZQ0KKyMgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgdXNlIGEgWUFDQyBiYXNlZCBwYXJzZXIgaW5zdGVhZC4NCisjDQorc3ViIF9pbml0X3BhcnNlciB7DQorDQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorDQorICAgICMgRGVsYXkgbG9hZGluZyBQYXJzZTo6UmVjRGVzY2VudCB0byByZWR1Y2UgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMuDQorICAgIGV2YWwgeyByZXF1aXJlIFBhcnNlOjpSZWNEZXNjZW50IH07DQorICAgIGRpZSAgIlRoZSBQYXJzZTo6UmVjRGVzY2VudCBtb2R1bGUgbXVzdCBiZSBpbnN0YWxsZWQgaW4gb3JkZXIgIi4NCisgICAgICAgICAidG8gd3JpdGUgYW4gRXhjZWwgZm9ybXVsYVxuIiBpZiAkQDsNCisNCisgICAgJHNlbGYtPl9pbml0aWFsaXplX2hhc2hlcygpOw0KKw0KKyAgICAjIFRoZSBwYXJzaW5nIGdyYW1tYXIuDQorICAgICMNCisgICAgIyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgaW50ZXJuYXRpb25hbCB2ZXJzaW9ucyBvZiBFeGNlbA0KKyAgICAjDQorICAgICRwYXJzZXIgPSBQYXJzZTo6UmVjRGVzY2VudC0+bmV3KDw8J0VuZEdyYW1tYXInKTsNCisNCisgICAgICAgIGV4cHI6ICAgICAgICAgICBsaXN0DQorDQorICAgICAgICAjIE1hdGNoIGFyZyBsaXN0cyBzdWNoIGFzIFNVTSgxLDIsIDMpDQorICAgICAgICBsaXN0OiAgICAgICAgICAgPGxlZnRvcDogYWRkaXRpb24gJywnIGFkZGl0aW9uPg0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWyAkaXRlbVsxXSwgJ19hcmcnLCBzY2FsYXIgQHskaXRlbVsxXX0gXSB9DQorDQorICAgICAgICBhZGRpdGlvbjogICAgICAgPGxlZnRvcDogbXVsdGlwbGljYXRpb24gYWRkX29wIG11bHRpcGxpY2F0aW9uPg0KKw0KKyAgICAgICAgIyBUT0RPOiBUaGUgYWRkX29wIG9wZXJhdG9ycyBkb24ndCBoYXZlIGVxdWFsIHByZWNlZGVuY2UuDQorICAgICAgICBhZGRfb3A6ICAgICAgICAgYWRkIHwgIHN1YiB8IGNvbmNhdA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgZXEgfCBuZSB8IGxlIHwgZ2UgfCBsdCB8IGd0ICAgIyBPcmRlciBpcyBpbXBvcnRhbnQNCisNCisgICAgICAgIGFkZDogICAgICAgICAgICAnKycgIHsgJ3B0Z0FkZCcgICAgfQ0KKyAgICAgICAgc3ViOiAgICAgICAgICAgICctJyAgeyAncHRnU3ViJyAgICB9DQorICAgICAgICBjb25jYXQ6ICAgICAgICAgJyYnICB7ICdwdGdDb25jYXQnIH0NCisgICAgICAgIGVxOiAgICAgICAgICAgICAnPScgIHsgJ3B0Z0VRJyAgICAgfQ0KKyAgICAgICAgbmU6ICAgICAgICAgICAgICc8PicgeyAncHRnTkUnICAgICB9DQorICAgICAgICBsZTogICAgICAgICAgICAgJzw9JyB7ICdwdGdMRScgICAgIH0NCisgICAgICAgIGdlOiAgICAgICAgICAgICAnPj0nIHsgJ3B0Z0dFJyAgICAgfQ0KKyAgICAgICAgbHQ6ICAgICAgICAgICAgICc8JyAgeyAncHRnTFQnICAgICB9DQorICAgICAgICBndDogICAgICAgICAgICAgJz4nICB7ICdwdGdHVCcgICAgIH0NCisNCisNCisgICAgICAgIG11bHRpcGxpY2F0aW9uOiA8bGVmdG9wOiBleHBvbmVudGlvbiBtdWx0X29wIGV4cG9uZW50aW9uPg0KKw0KKyAgICAgICAgbXVsdF9vcDogICAgICAgIG11bHQgIHwgZGl2DQorICAgICAgICBtdWx0OiAgICAgICAgICAgJyonIHsgJ3B0Z011bCcgfQ0KKyAgICAgICAgZGl2OiAgICAgICAgICAgICcvJyB7ICdwdGdEaXYnIH0NCisNCisgICAgICAgICMgTGVmdCBhc3NvY2lhdGl2ZSAoYXBwYXJlbnRseSkNCisgICAgICAgIGV4cG9uZW50aW9uOiAgICA8bGVmdG9wOiBmYWN0b3IgZXhwX29wIGZhY3Rvcj4NCisNCisgICAgICAgIGV4cF9vcDogICAgICAgICAnXicgeyAncHRnUG93ZXInIH0NCisNCisgICAgICAgIGZhY3RvcjogICAgICAgICBudW1iZXIgICAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgcmFuZ2UyZA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgcmFuZ2UzZA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJ1ZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgZmFsc2UNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHJlZjJkDQorICAgICAgICAgICAgICAgICAgICAgICAgfCByZWYzZA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24NCisgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWUNCisgICAgICAgICAgICAgICAgICAgICAgICB8ICcoJyBleHByICcpJyAgeyBbJGl0ZW1bMl0sICdwdGdQYXJlbiddIH0NCisNCisgICAgICAgICMgTWF0Y2ggYSBzdHJpbmcuDQorICAgICAgICAjIFJlZ2V4IGJ5IG1lcmx5bi4gU2VlIGh0dHA6Ly93d3cucGVybG1vbmtzLm9yZy9pbmRleC5wbD9ub2RlX2lkPTMzMDI4MA0KKyAgICAgICAgIw0KKyAgICAgICAgc3RyaW5nOiAgICAgICAgICAgLyIoW14iXXwiIikqIi8gICAgICMiIEZvciBlZGl0b3JzDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbICdfc3RyJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggZmxvYXQgb3IgaW50ZWdlcg0KKyAgICAgICAgbnVtYmVyOiAgICAgICAgICAgLyhbKy1dPykoPz1cZHxcLlxkKVxkKihcLlxkKik/KFtFZV0oWystXT9cZCspKT8vDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19udW0nLCAkaXRlbVsxXV0gfQ0KKw0KKyAgICAgICAgIyBOb3RlOiBUaGUgaGlnaGVzdCBjb2x1bW4gdmFsdWVzIGlzIElWLiBUaGUgZm9sbG93aW5nIHJlZ2V4ZXMgbWF0Y2gNCisgICAgICAgICMgdXAgdG8gSVouIE91dCBvZiByYW5nZSB2YWx1ZXMgYXJlIGNhdWdodCBpbiB0aGUgY29kZS4NCisgICAgICAgICMNCisgICAgICAgICMgTm90ZTogc2hlZXRuYW1lcyB3aXRoIHdoaXRlc3BhY2UsIGNvbW1hcywgb3IgcGFyZW50aGVzZXMgbXVzdCBiZSBpbg0KKyAgICAgICAgIyBzaW5nbGUgcXVvdGVzLiBBcHBsaWVzIHRvIHJlZjNkIGFuZCByYW5nZTNkDQorICAgICAgICAjDQorDQorICAgICAgICAjIE1hdGNoIEExLCAkQTEsIEEkMSBvciAkQSQxLg0KKyAgICAgICAgcmVmMmQ6ICAgICAgICAgICAgL1wkP1tBLUldP1tBLVpdXCQ/XGQrLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWydfcmVmMmQnLCAkaXRlbVsxXV0gfQ0KKw0KKyAgICAgICAgIyBNYXRjaCBhbiBleHRlcm5hbCBzaGVldCByZWZlcmVuY2U6IFNoZWV0MSFBMSBvciAnU2hlZXQgKDEpJyFBMQ0KKyAgICAgICAgcmVmM2Q6ICAgICAgICAgICAgL1teISgsXSshXCQ/W0EtSV0/W0EtWl1cJD9cZCsvDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19yZWYzZCcsICRpdGVtWzFdXSB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfCAvJ1teJ10rJyFcJD9bQS1JXT9bQS1aXVwkP1xkKy8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX3JlZjNkJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggQTE6QzUsICRBMTokQzUgb3IgQTpDIGV0Yy4NCisgICAgICAgIHJhbmdlMmQ6ICAgICAgICAgIC9cJD9bQS1JXT9bQS1aXVwkPyhcZCspPzpcJD9bQS1JXT9bQS1aXVwkPyhcZCspPy8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX3JhbmdlMmQnLCAkaXRlbVsxXV0gfQ0KKw0KKyAgICAgICAgIyBNYXRjaCBhbiBleHRlcm5hbCBzaGVldCByYW5nZS4gJ1NoZWV0IDE6U2hlZXQgMichQjI6QzUNCisgICAgICAgIHJhbmdlM2Q6ICAgICAgICAgIC9bXiEoLF0rIVwkP1tBLUldP1tBLVpdXCQ/KFxkKyk/OlwkP1tBLUldP1tBLVpdXCQ/KFxkKyk/Lw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWydfcmFuZ2UzZCcsICRpdGVtWzFdXSB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfCAvJ1teJ10rJyFcJD9bQS1JXT9bQS1aXVwkPyhcZCspPzpcJD9bQS1JXT9bQS1aXVwkPyhcZCspPy8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX3JhbmdlM2QnLCAkaXRlbVsxXV0gfQ0KKw0KKyAgICAgICAgIyBNYXRjaCBhIGZ1bmN0aW9uIG5hbWUuDQorICAgICAgICBmdW5jdGlvbjogICAgICAgICAvW0EtWjAtOcAt3F8uXSsvICcoKScNCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX2Z1bmMnLCAkaXRlbVsxXV0gfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgL1tBLVowLTnALdxfLl0rLyAnKCcgZXhwciAnKScNCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX2NsYXNzJywgJGl0ZW1bMV0sICRpdGVtWzNdLCAnX2Z1bmMnLCAkaXRlbVsxXV0gfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgL1tBLVowLTnALdxfLl0rLyAnKCcgbGlzdCAnKScNCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX2NsYXNzJywgJGl0ZW1bMV0sICRpdGVtWzNdLCAnX2Z1bmMnLCAkaXRlbVsxXV0gfQ0KKw0KKyAgICAgICAgIyBNYXRjaCBhIGRlZmluZWQgbmFtZS4NCisgICAgICAgIG5hbWU6ICAgICAgICAgICAvW0EtWmEtel9dXHcrLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWydfbmFtZScsICRpdGVtWzFdXSB9DQorDQorICAgICAgICAjIEJvb2xlYW4gdmFsdWVzLg0KKyAgICAgICAgdHJ1ZTogICAgICAgICAgICdUUlVFJyAgeyBbICdwdGdCb29sJywgMSBdIH0NCisNCisgICAgICAgIGZhbHNlOiAgICAgICAgICAnRkFMU0UnIHsgWyAncHRnQm9vbCcsIDAgXSB9DQorDQorRW5kR3JhbW1hcg0KKw0KK3ByaW50ICJJbml0X3BhcnNlci5cblxuIiBpZiAkX2RlYnVnOw0KK30NCisNCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgcGFyc2VfZm9ybXVsYSgpDQorIw0KKyMgVGFrZXMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGEgZm9ybXVsYSBhbmQgcmV0dXJucyBhIFJQTiBlbmNvZGVkIGJ5dGUNCisjIHN0cmluZy4NCisjDQorc3ViIHBhcnNlX2Zvcm11bGEgew0KKw0KKyAgICBteSAkc2VsZj0gc2hpZnQ7DQorDQorICAgICMgSW5pdGlhbGlzZSB0aGUgcGFyc2VyIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwNCisgICAgJHNlbGYtPl9pbml0X3BhcnNlcigpIGlmIG5vdCBkZWZpbmVkICRwYXJzZXI7DQorDQorICAgIG15ICRmb3JtdWxhID0gc2hpZnQgQF87DQorICAgIG15ICR0b2tlbnM7DQorDQorICAgIHByaW50ICRmb3JtdWxhLCAiXG4iIGlmICRfZGVidWc7DQorDQorICAgICMgQnVpbGQgdGhlIHBhcnNlIHRyZWUgZm9yIHRoZSBmb3JtdWxhDQorICAgIG15ICRwYXJzZXRyZWUgPSRwYXJzZXItPmV4cHIoJGZvcm11bGEpOw0KKw0KKyAgICAjIENoZWNrIGlmIHBhcnNpbmcgd29ya2VkLg0KKyAgICBpZiAoZGVmaW5lZCAkcGFyc2V0cmVlKSB7DQorICAgICAgICBteSBAdG9rZW5zID0gJHNlbGYtPl9yZXZlcnNlX3RyZWUoQCRwYXJzZXRyZWUpOw0KKw0KKyAgICAgICAgIyBBZGQgYSB2b2xhdGlsZSB0b2tlbiBpZiB0aGUgZm9ybXVsYSBjb250YWlucyBhIHZvbGF0aWxlIGZ1bmN0aW9uLg0KKyAgICAgICAgIyBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBsaXN0DQorICAgICAgICAjDQorICAgICAgICB1bnNoaWZ0IEB0b2tlbnMsICdfdm9sJyBpZiAkc2VsZi0+X2NoZWNrX3ZvbGF0aWxlKEB0b2tlbnMpOw0KKw0KKyAgICAgICAgIyBUaGUgcmV0dXJuIHZhbHVlIGRlcGVuZHMgb24gd2hpY2ggV29ya3NoZWV0LnBtIG1ldGhvZCBpcyB0aGUgY2FsbGVyDQorICAgICAgICBpZiAod2FudGFycmF5KSB7DQorICAgICAgICAgICAgIyBQYXJzZSBmb3JtdWxhIHRvIHNlZSBpZiBpdCB0aHJvd3MgYW55IGVycm9ycyBhbmQgdGhlbg0KKyAgICAgICAgICAgICMgcmV0dXJuIHJhdyB0b2tlbnMgdG8gV29ya3NoZWV0OjpzdG9yZV9mb3JtdWxhKCkNCisgICAgICAgICAgICAjDQorICAgICAgICAgICAgJHNlbGYtPnBhcnNlX3Rva2VucyhAdG9rZW5zKTsNCisgICAgICAgICAgICByZXR1cm4gQHRva2VuczsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2V7DQorICAgICAgICAgICAgIyBSZXR1cm4gYnl0ZSBzdHJlYW0gdG8gV29ya3NoZWV0Ojp3cml0ZV9mb3JtdWxhKCkNCisgICAgICAgICAgICByZXR1cm4gJHNlbGYtPnBhcnNlX3Rva2VucyhAdG9rZW5zKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAgIGRpZSAiQ291bGRuJ3QgcGFyc2UgZm9ybXVsYTogPSRmb3JtdWxhXG4iOw0KKyAgICB9DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBwYXJzZV90b2tlbnMoKQ0KKyMNCisjIENvbnZlcnQgZWFjaCB0b2tlbiBvciB0b2tlbiBwYWlyIHRvIGl0cyBFeGNlbCAncHRnJyBlcXVpdmFsZW50Lg0KKyMNCitzdWIgcGFyc2VfdG9rZW5zIHsNCisNCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7DQorICAgIG15ICRwYXJzZV9zdHIgICA9ICcnOw0KKyAgICBteSAkbGFzdF90eXBlICAgPSAnJzsNCisgICAgbXkgJG1vZGlmaWVyICAgID0gJyc7DQorICAgIG15ICRudW1fYXJncyAgICA9IDA7DQorICAgIG15ICRjbGFzcyAgICAgICA9IDA7DQorICAgIG15IEBjbGFzcyAgICAgICA9IDE7DQorICAgIG15IEB0b2tlbnMgICAgICA9IEBfOw0KKw0KKw0KKyAgICAjIEEgbm90ZSBhYm91dCB0aGUgY2xhc3MgbW9kaWZpZXJzIHVzZWQgYmVsb3cuIEluIGdlbmVyYWwgdGhlIGNsYXNzLA0KKyAgICAjICJyZWZlcmVuY2UiIG9yICJ2YWx1ZSIsIG9mIGEgZnVuY3Rpb24gaXMgYXBwbGllZCB0byBhbGwgb2YgaXRzIG9wZXJhbmRzLg0KKyAgICAjIEhvd2V2ZXIsIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyB0aGUgb3BlcmFuZHMgY2FuIGhhdmUgbWl4ZWQgY2xhc3NlcywNCisgICAgIyBlLmcuID1WTE9PS1VQIHdpdGggZXh0ZXJuYWwgcmVmZXJlbmNlcy4gVGhlc2Ugd2lsbCBldmVudHVhbGx5IGJlIGRlYWx0DQorICAgICMgd2l0aCBieSB0aGUgcGFyc2VyLiBIb3dldmVyLCBhcyBhIHdvcmthcm91bmQgdGhlIGNsYXNzIHR5cGUgb2YgYSB0b2tlbg0KKyAgICAjIGNhbiBiZSBjaGFuZ2VkIHZpYSB0aGUgcmVwZWF0X2Zvcm11bGEgaW50ZXJmYWNlLiBUaHVzLCBhIF9yZWYyZCB0b2tlbiBjYW4NCisgICAgIyBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHRvIF9yZWYyZEEgb3IgX3JlZjJkUiB0byBjaGFuZ2UgaXRzIHRva2VuIGNsYXNzLg0KKyAgICAjDQorICAgIHdoaWxlIChAXykgew0KKyAgICAgICAgbXkgJHRva2VuID0gc2hpZnQgQF87DQorDQorICAgICAgICBpZiAoJHRva2VuIGVxICdfYXJnJykgew0KKyAgICAgICAgICAgICRudW1fYXJncyA9IHNoaWZ0IEBfOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiBlcSAnX2NsYXNzJykgew0KKyAgICAgICAgICAgICR0b2tlbiA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRjbGFzcyA9ICRmdW5jdGlvbnN7JHRva2VufVsyXTsNCisgICAgICAgICAgICAjIElmICRjbGFzcyBpcyB1bmRlZiB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIGlzbid0IHZhbGlkLg0KKyAgICAgICAgICAgIGRpZSAiVW5rbm93biBmdW5jdGlvbiAkdG9rZW4oKSBpbiBmb3JtdWxhXG4iIHVubGVzcyBkZWZpbmVkICRjbGFzczsNCisgICAgICAgICAgICBwdXNoIEBjbGFzcywgJGNsYXNzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiBlcSAnX3ZvbCcpIHsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyICAuPSAkc2VsZi0+X2NvbnZlcnRfdm9sYXRpbGUoKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ3B0Z0Jvb2wnKSB7DQorICAgICAgICAgICAgJHRva2VuID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfYm9vbCgkdG9rZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiBlcSAnX251bScpIHsNCisgICAgICAgICAgICAkdG9rZW4gPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49ICRzZWxmLT5fY29udmVydF9udW1iZXIoJHRva2VuKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ19zdHInKSB7DQorICAgICAgICAgICAgJHRva2VuID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfc3RyaW5nKCR0b2tlbik7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuID1+IC9eX3JlZjJkLykgew0KKyAgICAgICAgICAgICgkbW9kaWZpZXIgID0gJHRva2VuKSA9fiBzL19yZWYyZC8vOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gJGNsYXNzWy0xXTsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDAgaWYgJG1vZGlmaWVyIGVxICdSJzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDEgaWYgJG1vZGlmaWVyIGVxICdWJzsNCisgICAgICAgICAgICAkdG9rZW4gICAgICA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X3JlZjJkKCR0b2tlbiwgJGNsYXNzKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gPX4gL15fcmVmM2QvKSB7DQorICAgICAgICAgICAgKCRtb2RpZmllciAgPSAkdG9rZW4pID1+IHMvX3JlZjNkLy87DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAkY2xhc3NbLTFdOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMCBpZiAkbW9kaWZpZXIgZXEgJ1InOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMSBpZiAkbW9kaWZpZXIgZXEgJ1YnOw0KKyAgICAgICAgICAgICR0b2tlbiAgICAgID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfcmVmM2QoJHRva2VuLCAkY2xhc3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiA9fiAvXl9yYW5nZTJkLykgew0KKyAgICAgICAgICAgICgkbW9kaWZpZXIgID0gJHRva2VuKSA9fiBzL19yYW5nZTJkLy87DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAkY2xhc3NbLTFdOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMCBpZiAkbW9kaWZpZXIgZXEgJ1InOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMSBpZiAkbW9kaWZpZXIgZXEgJ1YnOw0KKyAgICAgICAgICAgICR0b2tlbiAgICAgID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfcmFuZ2UyZCgkdG9rZW4sICRjbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuID1+IC9eX3JhbmdlM2QvKSB7DQorICAgICAgICAgICAgKCRtb2RpZmllciAgPSAkdG9rZW4pID1+IHMvX3JhbmdlM2QvLzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9ICRjbGFzc1stMV07DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAwIGlmICRtb2RpZmllciBlcSAnUic7DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAxIGlmICRtb2RpZmllciBlcSAnVic7DQorICAgICAgICAgICAgJHRva2VuICAgICAgPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49ICRzZWxmLT5fY29udmVydF9yYW5nZTNkKCR0b2tlbiwgJGNsYXNzKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gPX4gL15fbmFtZS8pIHsNCisgICAgICAgICAgICAoJG1vZGlmaWVyICA9ICR0b2tlbikgPX4gcy9fbmFtZS8vOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gJGNsYXNzWy0xXTsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDAgaWYgJG1vZGlmaWVyIGVxICdSJzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDEgaWYgJG1vZGlmaWVyIGVxICdWJzsNCisgICAgICAgICAgICAkdG9rZW4gPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49ICRzZWxmLT5fY29udmVydF9uYW1lKCR0b2tlbiwgJGNsYXNzKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ19mdW5jJykgew0KKyAgICAgICAgICAgICR0b2tlbiA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X2Z1bmN0aW9uKCR0b2tlbiwgJG51bV9hcmdzKTsNCisgICAgICAgICAgICBwb3AgQGNsYXNzOw0KKyAgICAgICAgICAgICRudW1fYXJncyA9IDA7ICMgUmVzZXQgYWZ0ZXIgdXNlDQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoZXhpc3RzICRwdGd7JHRva2VufSkgew0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gcGFjaygiQyIsICRwdGd7JHRva2VufSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAjIFVucmVjb2duaXNlZCB0b2tlbg0KKyAgICAgICAgICAgIHJldHVybiB1bmRlZjsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKw0KKyAgICBpZiAoJF9kZWJ1Zykgew0KKyAgICAgICAgcHJpbnQgam9pbigiICIsIG1hcCB7IHNwcmludGYgIiUwMlgiLCAkXyB9IHVucGFjaygiQyoiLCRwYXJzZV9zdHIpKTsNCisgICAgICAgIHByaW50ICJcblxuIjsNCisgICAgICAgIHByaW50IGpvaW4oIiAiLCBAdG9rZW5zKSwgIlxuXG4iOw0KKyAgICB9DQorDQorICAgIHJldHVybiAkcGFyc2Vfc3RyOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgIF9yZXZlcnNlX3RyZWUoKQ0KKyMNCisjIFRoaXMgZnVuY3Rpb24gZGVzY2VuZHMgcmVjdXJzaXZlbHkgdGhyb3VnaCB0aGUgcGFyc2UgdHJlZS4gQXQgZWFjaCBsZXZlbCBpdA0KKyMgc3dhcHMgdGhlIG9yZGVyIG9mIGFuIG9wZXJhdG9yIGZvbGxvd2VkIGJ5IGFuIG9wZXJhbmQuDQorIyBGb3IgZXhhbXBsZSwgMSsyKjMgd291bGQgYmUgY29udmVydGVkIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6DQorIyAgICAgICAgICAgICAgIDEgKyAyICogMw0KKyMgICAgICAgICAgICAgICAxICsgKDIgKiAzKQ0KKyMgICAgICAgICAgICAgICAxICsgKDIgMyAqKQ0KKyMgICAgICAgICAgICAgICAxICgyIDMgKikgKw0KKyMgICAgICAgICAgICAgICAxIDIgMyAqICsNCisjDQorc3ViIF9yZXZlcnNlX3RyZWUNCit7DQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorDQorICAgIG15IEB0b2tlbnM7DQorICAgIG15IEBleHByZXNzaW9uID0gQF87DQorICAgIG15IEBzdGFjazsNCisNCisgICAgd2hpbGUgKEBleHByZXNzaW9uKSB7DQorICAgICAgICBteSAkdG9rZW4gPSBzaGlmdCBAZXhwcmVzc2lvbjsNCisNCisgICAgICAgICMgSWYgdGhlIHRva2VuIGlzIGFuIG9wZXJhdG9yIHN3YXAgaXQgd2l0aCB0aGUgZm9sbG93aW5nIG9wZXJhbmQNCisgICAgICAgIGlmICggICAgJHRva2VuIGVxICdwdGdBZGQnICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdTdWInICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdDb25jYXQnICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdNdWwnICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdEaXYnICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdQb3dlcicgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdFUScgICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdORScgICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdMRScgICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdHRScgICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdMVCcgICAgICAgfHwNCisgICAgICAgICAgICAgICAgJHRva2VuIGVxICdwdGdHVCcpDQorICAgICAgICB7DQorICAgICAgICAgICAgbXkgJG9wZXJhbmQgPSBzaGlmdCBAZXhwcmVzc2lvbjsNCisgICAgICAgICAgICBwdXNoIEBzdGFjaywgJG9wZXJhbmQ7DQorICAgICAgICB9DQorDQorICAgICAgICBwdXNoIEBzdGFjaywgJHRva2VuOw0KKyAgICB9DQorDQorICAgICMgUmVjdXJzZSB0aHJvdWdoIHRoZSBwYXJzZSB0cmVlDQorICAgIGZvcmVhY2ggbXkgJHRva2VuIChAc3RhY2spIHsNCisgICAgICAgIGlmIChyZWYoJHRva2VuKSkgew0KKyAgICAgICAgICAgIHB1c2ggQHRva2VucywgJHNlbGYtPl9yZXZlcnNlX3RyZWUoQCR0b2tlbik7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBwdXNoIEB0b2tlbnMsICR0b2tlbjsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gIEB0b2tlbnM7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyAgX2NoZWNrX3ZvbGF0aWxlKCkNCisjDQorIyBDaGVjayBpZiB0aGUgZm9ybXVsYSBjb250YWlucyBhIHZvbGF0aWxlIGZ1bmN0aW9uLCBpLmUuIGEgZnVuY3Rpb24gdGhhdCBtdXN0DQorIyBiZSByZWNhbGN1bGF0ZWQgZWFjaCB0aW1lIGEgY2VsbCBpcyB1cGRhdGVkLiBUaGVzZSBmb3JtdWxhcyByZXF1aXJlIGEgcHRnQXR0cg0KKyMgd2l0aCB0aGUgdm9sYXRpbGUgZmxhZyBzZXQgYXMgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBwYXJzZWQgZXhwcmVzc2lvbi4NCisjDQorIyBFeGFtcGxlcyBvZiB2b2xhdGlsZSBmdW5jdGlvbnM6IFJBTkQoKSwgTk9XKCksIFRPREFZKCkNCisjDQorc3ViIF9jaGVja192b2xhdGlsZSB7DQorDQorICAgIG15ICRzZWxmICAgICA9IHNoaWZ0Ow0KKyAgICBteSBAdG9rZW5zICAgPSBAXzsNCisgICAgbXkgJHZvbGF0aWxlID0gMDsNCisNCisgICAgZm9yIG15ICRpICgwLi5AdG9rZW5zLTEpIHsNCisgICAgICAgICMgSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBmdW5jdGlvbiBjaGVjayBpZiBpdCBpcyB2b2xhdGlsZS4NCisgICAgICAgIGlmICgkdG9rZW5zWyRpXSBlcSAnX2Z1bmMnIGFuZCAkZnVuY3Rpb25zeyR0b2tlbnNbJGkrMV19WzNdKSB7DQorICAgICAgICAgICAgJHZvbGF0aWxlID0gMTsNCisgICAgICAgICAgICBsYXN0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAkdm9sYXRpbGU7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF92b2xhdGlsZSgpDQorIw0KKyMgQ29udmVydCBfdm9sIHRvIGEgcHRnQXR0ciB0YWcgZm9ybWF0dGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZvcm11bGEgY29udGFpbnMNCisjIGEgdm9sYXRpbGUgZnVuY3Rpb24uIFNlZSBfY2hlY2tfdm9sYXRpbGUoKQ0KKyMNCitzdWIgX2NvbnZlcnRfdm9sYXRpbGUgew0KKw0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKyAgICAjIFNldCBiaXRGYXR0clNlbWkgZmxhZyB0byBpbmRpY2F0ZSB2b2xhdGlsZSBmdW5jdGlvbiwgInciIGlzIHNldCB0byB6ZXJvLg0KKyAgICByZXR1cm4gcGFjaygiQ0N2IiwgJHB0Z3twdGdBdHRyfSwgMHgxLCAweDApOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NvbnZlcnRfYm9vbCgpDQorIw0KKyMgQ29udmVydCBhIGJvb2xlYW4gdG9rZW4gdG8gcHRnQm9vbA0KKyMNCitzdWIgX2NvbnZlcnRfYm9vbCB7DQorDQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIG15ICRib29sID0gc2hpZnQ7DQorDQorICAgIHJldHVybiBwYWNrKCJDQyIsICRwdGd7cHRnQm9vbH0sICRib29sKTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X251bWJlcigpDQorIw0KKyMgQ29udmVydCBhIG51bWJlciB0b2tlbiB0byBwdGdJbnQgb3IgcHRnTnVtDQorIw0KK3N1YiBfY29udmVydF9udW1iZXIgew0KKw0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBteSAkbnVtICA9IHNoaWZ0Ow0KKw0KKyAgICAjIEludGVnZXIgaW4gdGhlIHJhbmdlIDAuLjIqKjE2LTENCisgICAgaWYgKCgkbnVtID1+IC9eXGQrJC8pICYmICgkbnVtIDw9IDY1NTM1KSkgew0KKyAgICAgICAgcmV0dXJuIHBhY2soIkN2IiwgJHB0Z3twdGdJbnR9LCAkbnVtKTsNCisgICAgfQ0KKyAgICBlbHNlIHsgIyBBIGZsb2F0DQorICAgICAgICAkbnVtID0gcGFjaygiZCIsICRudW0pOw0KKyAgICAgICAgJG51bSA9IHJldmVyc2UgJG51bSBpZiAkc2VsZi0+e19ieXRlX29yZGVyfTsNCisgICAgICAgIHJldHVybiBwYWNrKCJDIiwgJHB0Z3twdGdOdW19KSAuICRudW07DQorICAgIH0NCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3N0cmluZygpDQorIw0KKyMgQ29udmVydCBhIHN0cmluZyB0byBhIHB0ZyBTdHIuDQorIw0KK3N1YiBfY29udmVydF9zdHJpbmcgew0KKw0KKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsNCisgICAgbXkgJHN0ciAgICAgID0gc2hpZnQ7DQorICAgIG15ICRlbmNvZGluZyA9IDA7DQorDQorICAgICRzdHIgPX4gcy9eIi8vOyAgICMgUmVtb3ZlIGxlYWRpbmcgICINCisgICAgJHN0ciA9fiBzLyIkLy87ICAgIyBSZW1vdmUgdHJhaWxpbmcgIg0KKyAgICAkc3RyID1+IHMvIiIvIi9nOyAjIFN1YnN0aXR1dGUgRXhjZWwncyBlc2NhcGVkIGRvdWJsZSBxdW90ZSAiIiBmb3IgIg0KKw0KKyAgICBteSAkbGVuZ3RoID0gbGVuZ3RoKCRzdHIpOw0KKw0KKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguDQorICAgIGlmICgkXSA+PSA1LjAwOCkgew0KKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7DQorDQorICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRzdHIpKSB7DQorICAgICAgICAgICAgJHN0ciA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZMRSIsICRzdHIpOw0KKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgZGllICJTdHJpbmcgaW4gZm9ybXVsYSBoYXMgbW9yZSB0aGFuIDI1NSBjaGFyc1xuIiBpZiAkbGVuZ3RoID4gMjU1Ow0KKw0KKyAgICByZXR1cm4gcGFjaygiQ0NDIiwgJHB0Z3twdGdTdHJ9LCAkbGVuZ3RoLCAkZW5jb2RpbmcpIC4gJHN0cjsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3JlZjJkKCkNCisjDQorIyBDb252ZXJ0IGFuIEV4Y2VsIHJlZmVyZW5jZSBzdWNoIGFzIEExLCAkQjIsIEMkMyBvciAkRCQ0IHRvIGEgcHRnUmVmVi4NCisjDQorc3ViIF9jb252ZXJ0X3JlZjJkIHsNCisNCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7DQorICAgIG15ICRjZWxsICA9IHNoaWZ0Ow0KKyAgICBteSAkY2xhc3MgPSBzaGlmdDsNCisgICAgbXkgJHB0Z1JlZjsNCisNCisgICAgIyBDb252ZXJ0IHRoZSBjZWxsIHJlZmVyZW5jZQ0KKyAgICBteSAoJHJvdywgJGNvbCkgPSAkc2VsZi0+X2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkY2VsbCk7DQorDQorICAgICMgVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLg0KKyAgICBpZiAgICAoJGNsYXNzID09IDApIHsNCisgICAgICAgICRwdGdSZWYgPSBwYWNrKCJDIiwgJHB0Z3twdGdSZWZ9KTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDEpIHsNCisgICAgICAgICRwdGdSZWYgPSBwYWNrKCJDIiwgJHB0Z3twdGdSZWZWfSk7DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAyKSB7DQorICAgICAgICAkcHRnUmVmID0gcGFjaygiQyIsICRwdGd7cHRnUmVmQX0pOw0KKyAgICB9DQorICAgIGVsc2V7DQorICAgICAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gY2xhc3MgaW4gZm9ybXVsYVxuIjsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHB0Z1JlZiAuICRyb3cgLiAkY29sOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NvbnZlcnRfcmVmM2QNCisjDQorIyBDb252ZXJ0IGFuIEV4Y2VsIDNkIHJlZmVyZW5jZSBzdWNoIGFzICJTaGVldDEhQTEiIG9yICJTaGVldDE6U2hlZXQyIUExIiB0byBhDQorIyBwdGdSZWYzZFYuDQorIw0KK3N1YiBfY29udmVydF9yZWYzZCB7DQorDQorICAgIG15ICRzZWxmICA9IHNoaWZ0Ow0KKyAgICBteSAkdG9rZW4gPSBzaGlmdDsNCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7DQorICAgIG15ICRwdGdSZWY7DQorDQorICAgICMgU3BsaXQgdGhlIHJlZiBhdCB0aGUgISBzeW1ib2wNCisgICAgbXkgKCRleHRfcmVmLCAkY2VsbCkgPSBzcGxpdCAnIScsICR0b2tlbjsNCisNCisgICAgIyBDb252ZXJ0IHRoZSBleHRlcm5hbCByZWZlcmVuY2UgcGFydA0KKyAgICAkZXh0X3JlZiA9ICRzZWxmLT5fcGFja19leHRfcmVmKCRleHRfcmVmKTsNCisNCisgICAgIyBDb252ZXJ0IHRoZSBjZWxsIHJlZmVyZW5jZSBwYXJ0DQorICAgIG15ICgkcm93LCAkY29sKSA9ICRzZWxmLT5fY2VsbF90b19wYWNrZWRfcm93Y29sKCRjZWxsKTsNCisNCisgICAgIyBUaGUgcHRnIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNsYXNzIG9mIHRoZSBwdGcuDQorICAgIGlmICAgICgkY2xhc3MgPT0gMCkgew0KKyAgICAgICAgJHB0Z1JlZiA9IHBhY2soIkMiLCAkcHRne3B0Z1JlZjNkfSk7DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAxKSB7DQorICAgICAgICAkcHRnUmVmID0gcGFjaygiQyIsICRwdGd7cHRnUmVmM2RWfSk7DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAyKSB7DQorICAgICAgICAkcHRnUmVmID0gcGFjaygiQyIsICRwdGd7cHRnUmVmM2RBfSk7DQorICAgIH0NCisgICAgZWxzZXsNCisgICAgICAgIGRpZSAiVW5rbm93biBmdW5jdGlvbiBjbGFzcyBpbiBmb3JtdWxhXG4iOw0KKyAgICB9DQorDQorICAgIHJldHVybiAkcHRnUmVmIC4gJGV4dF9yZWYuICRyb3cgLiAkY29sOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NvbnZlcnRfcmFuZ2UyZCgpDQorIw0KKyMgQ29udmVydCBhbiBFeGNlbCByYW5nZSBzdWNoIGFzIEExOkQ0IG9yIEE6RCB0byBhIHB0Z1JlZlYuDQorIw0KK3N1YiBfY29udmVydF9yYW5nZTJkIHsNCisNCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7DQorICAgIG15ICRyYW5nZSA9IHNoaWZ0Ow0KKyAgICBteSAkY2xhc3MgPSBzaGlmdDsNCisgICAgbXkgJHB0Z0FyZWE7DQorDQorICAgICMgU3BsaXQgdGhlIHJhbmdlIGludG8gMiBjZWxsIHJlZnMNCisgICAgbXkgKCRjZWxsMSwgJGNlbGwyKSA9IHNwbGl0ICc6JywgJHJhbmdlOw0KKw0KKyAgICAjIEEgcmFuZ2Ugc3VjaCBhcyBBOkQgaXMgZXF1aXZhbGVudCB0byBBMTpENjU1MzYsIHNvIGFkZCByb3dzIGFzIHJlcXVpcmVkDQorICAgICRjZWxsMSAuPSAnMScgICAgIGlmICRjZWxsMSAhfiAvXGQvOw0KKyAgICAkY2VsbDIgLj0gJzY1NTM2JyBpZiAkY2VsbDIgIX4gL1xkLzsNCisNCisgICAgIyBDb252ZXJ0IHRoZSBjZWxsIHJlZmVyZW5jZXMNCisgICAgbXkgKCRyb3cxLCAkY29sMSkgPSAkc2VsZi0+X2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkY2VsbDEpOw0KKyAgICBteSAoJHJvdzIsICRjb2wyKSA9ICRzZWxmLT5fY2VsbF90b19wYWNrZWRfcm93Y29sKCRjZWxsMik7DQorDQorICAgICMgVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLg0KKyAgICBpZiAgICAoJGNsYXNzID09IDApIHsNCisgICAgICAgICRwdGdBcmVhID0gcGFjaygiQyIsICRwdGd7cHRnQXJlYX0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMSkgew0KKyAgICAgICAgJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHB0Z3twdGdBcmVhVn0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMikgew0KKyAgICAgICAgJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHB0Z3twdGdBcmVhQX0pOw0KKyAgICB9DQorICAgIGVsc2V7DQorICAgICAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gY2xhc3MgaW4gZm9ybXVsYVxuIjsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHB0Z0FyZWEgLiAkcm93MSAuICRyb3cyIC4gJGNvbDEuICRjb2wyOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NvbnZlcnRfcmFuZ2UzZA0KKyMNCisjIENvbnZlcnQgYW4gRXhjZWwgM2QgcmFuZ2Ugc3VjaCBhcyAiU2hlZXQxIUExOkQ0IiBvciAiU2hlZXQxOlNoZWV0MiFBMTpENCIgdG8NCisjIGEgcHRnQXJlYTNkVi4NCisjDQorc3ViIF9jb252ZXJ0X3JhbmdlM2Qgew0KKw0KKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7DQorICAgIG15ICR0b2tlbiAgICAgPSBzaGlmdDsNCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7DQorICAgIG15ICRwdGdBcmVhOw0KKw0KKyAgICAjIFNwbGl0IHRoZSByZWYgYXQgdGhlICEgc3ltYm9sDQorICAgIG15ICgkZXh0X3JlZiwgJHJhbmdlKSA9IHNwbGl0ICchJywgJHRva2VuOw0KKw0KKyAgICAjIENvbnZlcnQgdGhlIGV4dGVybmFsIHJlZmVyZW5jZSBwYXJ0DQorICAgICRleHRfcmVmID0gJHNlbGYtPl9wYWNrX2V4dF9yZWYoJGV4dF9yZWYpOw0KKw0KKyAgICAjIFNwbGl0IHRoZSByYW5nZSBpbnRvIDIgY2VsbCByZWZzDQorICAgIG15ICgkY2VsbDEsICRjZWxsMikgPSBzcGxpdCAnOicsICRyYW5nZTsNCisNCisgICAgIyBBIHJhbmdlIHN1Y2ggYXMgQTpEIGlzIGVxdWl2YWxlbnQgdG8gQTE6RDY1NTM2LCBzbyBhZGQgcm93cyBhcyByZXF1aXJlZA0KKyAgICAkY2VsbDEgLj0gJzEnICAgICBpZiAkY2VsbDEgIX4gL1xkLzsNCisgICAgJGNlbGwyIC49ICc2NTUzNicgaWYgJGNlbGwyICF+IC9cZC87DQorDQorICAgICMgQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2VzDQorICAgIG15ICgkcm93MSwgJGNvbDEpID0gJHNlbGYtPl9jZWxsX3RvX3BhY2tlZF9yb3djb2woJGNlbGwxKTsNCisgICAgbXkgKCRyb3cyLCAkY29sMikgPSAkc2VsZi0+X2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkY2VsbDIpOw0KKw0KKyAgICAjIFRoZSBwdGcgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY2xhc3Mgb2YgdGhlIHB0Zy4NCisgICAgaWYgICAgKCRjbGFzcyA9PSAwKSB7DQorICAgICAgICAkcHRnQXJlYSA9IHBhY2soIkMiLCAkcHRne3B0Z0FyZWEzZH0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMSkgew0KKyAgICAgICAgJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHB0Z3twdGdBcmVhM2RWfSk7DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAyKSB7DQorICAgICAgICAkcHRnQXJlYSA9IHBhY2soIkMiLCAkcHRne3B0Z0FyZWEzZEF9KTsNCisgICAgfQ0KKyAgICBlbHNlew0KKyAgICAgICAgZGllICJVbmtub3duIGZ1bmN0aW9uIGNsYXNzIGluIGZvcm11bGFcbiI7DQorICAgIH0NCisNCisgICAgcmV0dXJuICRwdGdBcmVhIC4gJGV4dF9yZWYgLiAkcm93MSAuICRyb3cyIC4gJGNvbDEuICRjb2wyOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX3BhY2tfZXh0X3JlZigpDQorIw0KKyMgQ29udmVydCB0aGUgc2hlZXQgbmFtZSBwYXJ0IG9mIGFuIGV4dGVybmFsIHJlZmVyZW5jZSwgZm9yIGV4YW1wbGUgIlNoZWV0MSIgb3INCisjICJTaGVldDE6U2hlZXQyIiwgdG8gYSBwYWNrZWQgc3RydWN0dXJlLg0KKyMNCitzdWIgX3BhY2tfZXh0X3JlZiB7DQorDQorICAgIG15ICRzZWxmICAgID0gc2hpZnQ7DQorICAgIG15ICRleHRfcmVmID0gc2hpZnQ7DQorICAgIG15ICRzaGVldDE7DQorICAgIG15ICRzaGVldDI7DQorDQorICAgICRleHRfcmVmID1+IHMvXicvLzsgICAjIFJlbW92ZSBsZWFkaW5nICAnIGlmIGFueS4NCisgICAgJGV4dF9yZWYgPX4gcy8nJC8vOyAgICMgUmVtb3ZlIHRyYWlsaW5nICcgaWYgYW55Lg0KKw0KKyAgICAjIENoZWNrIGlmIHRoZXJlIGlzIGEgc2hlZXQgcmFuZ2UgZWcuLCBTaGVldDE6U2hlZXQyLg0KKyAgICBpZiAoJGV4dF9yZWYgPX4gLzovKSB7DQorICAgICAgICAoJHNoZWV0MSwgJHNoZWV0MikgPSBzcGxpdCAnOicsICRleHRfcmVmOw0KKw0KKyAgICAgICAgJHNoZWV0MSA9ICRzZWxmLT5fZ2V0X3NoZWV0X2luZGV4KCRzaGVldDEpOw0KKyAgICAgICAgJHNoZWV0MiA9ICRzZWxmLT5fZ2V0X3NoZWV0X2luZGV4KCRzaGVldDIpOw0KKw0KKyAgICAgICAgIyBSZXZlcnNlIG1heCBhbmQgbWluIHNoZWV0IG51bWJlcnMgaWYgbmVjZXNzYXJ5DQorICAgICAgICBpZiAoJHNoZWV0MSA+ICRzaGVldDIpIHsNCisgICAgICAgICAgICAoJHNoZWV0MSwgJHNoZWV0MikgPSAoJHNoZWV0MiwgJHNoZWV0MSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICAjIFNpbmdsZSBzaGVldCBuYW1lIG9ubHkuDQorICAgICAgICAoJHNoZWV0MSwgJHNoZWV0MikgPSAoJGV4dF9yZWYsICRleHRfcmVmKTsNCisNCisgICAgICAgICRzaGVldDEgPSAkc2VsZi0+X2dldF9zaGVldF9pbmRleCgkc2hlZXQxKTsNCisgICAgICAgICRzaGVldDIgPSAkc2hlZXQxOw0KKyAgICB9DQorDQorICAgIG15ICRrZXkgPSAiJHNoZWV0MTokc2hlZXQyIjsNCisgICAgbXkgJGluZGV4Ow0KKw0KKyAgICBpZiAoZXhpc3RzICRzZWxmLT57X2V4dF9yZWZzfS0+eyRrZXl9KSB7DQorICAgICAgICAkaW5kZXggPSAkc2VsZi0+e19leHRfcmVmc30tPnska2V5fTsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAgICRpbmRleCA9ICRzZWxmLT57X2V4dF9yZWZfY291bnR9Ow0KKyAgICAgICAgJHNlbGYtPntfZXh0X3JlZnN9LT57JGtleX0gPSAkaW5kZXg7DQorICAgICAgICAkc2VsZi0+e19leHRfcmVmX2NvdW50fSsrOw0KKyAgICB9DQorDQorICAgIHJldHVybiBwYWNrKCJ2IiwkaW5kZXgpOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2dldF9zaGVldF9pbmRleCgpDQorIw0KKyMgTG9vayB1cCB0aGUgaW5kZXggdGhhdCBjb3JyZXNwb25kcyB0byBhbiBleHRlcm5hbCBzaGVldCBuYW1lLiBUaGUgaGFzaCBvZg0KKyMgc2hlZXQgbmFtZXMgaXMgdXBkYXRlZCBieSB0aGUgYWRkX3dvcmtzaGVldCgpIG1ldGhvZCBvZiB0aGUgV29ya2Jvb2sgY2xhc3MuDQorIw0KK3N1YiBfZ2V0X3NoZWV0X2luZGV4IHsNCisNCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7DQorICAgIG15ICRzaGVldF9uYW1lICA9IHNoaWZ0Ow0KKw0KKyAgICAjIEhhbmRsZSB1dGY4IHNoZWV0bmFtZXMgaW4gcGVybCA1LjguDQorICAgIGlmICgkXSA+PSA1LjAwOCkgew0KKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7DQorDQorICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRzaGVldF9uYW1lKSkgew0KKyAgICAgICAgICAgICRzaGVldF9uYW1lID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkJFIiwgJHNoZWV0X25hbWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorDQorICAgIGlmIChub3QgZXhpc3RzICRzZWxmLT57X2V4dF9zaGVldHN9LT57JHNoZWV0X25hbWV9KSB7DQorICAgICAgICBkaWUgIlVua25vd24gc2hlZXQgbmFtZSAkc2hlZXRfbmFtZSBpbiBmb3JtdWxhXG4iOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgcmV0dXJuICRzZWxmLT57X2V4dF9zaGVldHN9LT57JHNoZWV0X25hbWV9Ow0KKyAgICB9DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBzZXRfZXh0X3NoZWV0cygpDQorIw0KKyMgVGhpcyBzZW1pLXB1YmxpYyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGhhc2ggb2Ygc2hlZXQgbmFtZXMuIEl0IGlzDQorIyB1cGRhdGVkIGJ5IHRoZSBhZGRfd29ya3NoZWV0KCkgbWV0aG9kIG9mIHRoZSBXb3JrYm9vayBjbGFzcy4NCisjDQorc3ViIHNldF9leHRfc2hlZXRzIHsNCisNCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7DQorICAgIG15ICR3b3Jrc2hlZXQgICA9IHNoaWZ0Ow0KKyAgICBteSAkaW5kZXggICAgICAgPSBzaGlmdDsNCisNCisgICAgIyBUaGUgX2V4dF9zaGVldHMgaGFzaCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIHdvcmtzaGVldCBuYW1lcw0KKyAgICAjIGFuZCB0aGVpciBpbmRleA0KKyAgICAkc2VsZi0+e19leHRfc2hlZXRzfS0+eyR3b3Jrc2hlZXR9ID0gJGluZGV4Ow0KKw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgZ2V0X2V4dF9zaGVldHMoKQ0KKyMNCisjIFRoaXMgc2VtaS1wdWJsaWMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSB3b3Jrc2hlZXQgcmVmZXJlbmNlcyB0aGF0IHdlcmUNCisjIHVzZWQgaW4gZm9ybXVsYXMgZm9yIGluY2x1c2lvbiBpbiB0aGUgRVhURVJOU0hFRVQgV29ya2Jvb2sgcmVjb3JkLg0KKyMNCitzdWIgZ2V0X2V4dF9zaGVldHMgew0KKw0KKyAgICBteSAkc2VsZiAgPSBzaGlmdDsNCisNCisgICAgcmV0dXJuICV7JHNlbGYtPntfZXh0X3JlZnN9fTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIGdldF9leHRfcmVmX2NvdW50KCkNCisjDQorIyBUaGlzIHNlbWktcHVibGljIG1ldGhvZCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgaGFzaCBvZiBzaGVldCBuYW1lcy4gSXQgaXMNCisjIHVwZGF0ZWQgYnkgdGhlIGFkZF93b3Jrc2hlZXQoKSBtZXRob2Qgb2YgdGhlIFdvcmtib29rIGNsYXNzLg0KKyMNCitzdWIgZ2V0X2V4dF9yZWZfY291bnQgew0KKw0KKyAgICBteSAkc2VsZiAgPSBzaGlmdDsNCisNCisgICAgcmV0dXJuICRzZWxmLT57X2V4dF9yZWZfY291bnR9Ow0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2dldF9uYW1lX2luZGV4KCkNCisjDQorIyBMb29rIHVwIHRoZSBpbmRleCB0aGF0IGNvcnJlc3BvbmRzIHRvIGFuIGV4dGVybmFsIGRlZmluZWQgbmFtZS4gVGhlIGhhc2ggb2YNCisjIGRlZmluZWQgbmFtZXMgaXMgdXBkYXRlZCBieSB0aGUgZGVmaW5lX25hbWUoKSBtZXRob2QgaW4gdGhlIFdvcmtib29rIGNsYXNzLg0KKyMNCitzdWIgX2dldF9uYW1lX2luZGV4IHsNCisNCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7DQorICAgIG15ICRuYW1lICAgICAgICA9IHNoaWZ0Ow0KKw0KKyAgICBpZiAobm90IGV4aXN0cyAkc2VsZi0+e19leHRfbmFtZXN9LT57JG5hbWV9KSB7DQorICAgICAgICBkaWUgIlVua25vd24gZGVmaW5lZCBuYW1lICRuYW1lIGluIGZvcm11bGFcbiI7DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICByZXR1cm4gJHNlbGYtPntfZXh0X25hbWVzfS0+eyRuYW1lfTsNCisgICAgfQ0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgc2V0X2V4dF9uYW1lKCkNCisjDQorIyBUaGlzIHNlbWktcHVibGljIG1ldGhvZCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgaGFzaCBvZiBkZWZpbmVkIG5hbWVzLg0KKyMNCitzdWIgc2V0X2V4dF9uYW1lIHsNCisNCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7DQorICAgIG15ICRuYW1lICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkaW5kZXggICAgICAgPSBzaGlmdDsNCisNCisgICAgJHNlbGYtPntfZXh0X25hbWVzfS0+eyRuYW1lfSA9ICRpbmRleDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X2Z1bmN0aW9uKCkNCisjDQorIyBDb252ZXJ0IGEgZnVuY3Rpb24gdG8gYSBwdGdGdW5jIG9yIHB0Z0Z1bmNWYXJWIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mDQorIyBhcmdzIHRoYXQgaXQgdGFrZXMuDQorIw0KK3N1YiBfY29udmVydF9mdW5jdGlvbiB7DQorDQorICAgIG15ICRzZWxmICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkdG9rZW4gICAgPSBzaGlmdDsNCisgICAgbXkgJG51bV9hcmdzID0gc2hpZnQ7DQorDQorICAgIGRpZSAiVW5rbm93biBmdW5jdGlvbiAkdG9rZW4oKSBpbiBmb3JtdWxhXG4iDQorICAgICAgICB1bmxlc3MgZGVmaW5lZCAkZnVuY3Rpb25zeyR0b2tlbn1bMF07DQorDQorICAgIG15ICRhcmdzID0gJGZ1bmN0aW9uc3skdG9rZW59WzFdOw0KKw0KKyAgICAjIEZpeGVkIG51bWJlciBvZiBhcmdzIGVnLiBUSU1FKCRpLCRqLCRrKS4NCisgICAgaWYgKCRhcmdzID49IDApIHsNCisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3MgaXMgdmFsaWQuDQorICAgICAgICBpZiAoJGFyZ3MgIT0gJG51bV9hcmdzKSB7DQorICAgICAgICAgICAgZGllICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgJHRva2VuKCkgaW4gZm9ybXVsYVxuIjsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBwYWNrKCJDdiIsICRwdGd7cHRnRnVuY1Z9LCAkZnVuY3Rpb25zeyR0b2tlbn1bMF0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgICMgVmFyaWFibGUgbnVtYmVyIG9mIGFyZ3MgZWcuIFNVTSgkaSwkaiwkaywgLi4pLg0KKyAgICBpZiAoJGFyZ3MgPT0gLTEpIHsNCisgICAgICAgIHJldHVybiBwYWNrICJDQ3YiLCAkcHRne3B0Z0Z1bmNWYXJWfSwgJG51bV9hcmdzLCAkZnVuY3Rpb25zeyR0b2tlbn1bMF07DQorICAgIH0NCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X25hbWUoKQ0KKyMNCisjIENvbnZlcnQgYSBzeW1ib2xpYyBuYW1lIGludG8gYSBuYW1lIHJlZmVyZW5jZS4NCisjDQorc3ViIF9jb252ZXJ0X25hbWUgew0KKw0KKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsNCisgICAgbXkgJG5hbWUgICAgID0gc2hpZnQ7DQorICAgIG15ICRjbGFzcyAgICA9IHNoaWZ0Ow0KKw0KKyAgICBteSAkcHRnTmFtZTsNCisNCisgICAgbXkgJG5hbWVfaW5kZXggPSAkc2VsZi0+X2dldF9uYW1lX2luZGV4KCRuYW1lKTsNCisNCisgICAgIyBUaGUgcHRnIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNsYXNzIG9mIHRoZSBwdGcuDQorICAgIGlmICAgICgkY2xhc3MgPT0gMCkgew0KKyAgICAgICAgJHB0Z05hbWUgPSAkcHRne3B0Z05hbWV9Ow0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMSkgew0KKyAgICAgICAgJHB0Z05hbWUgPSAkcHRne3B0Z05hbWVWfTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDIpIHsNCisgICAgICAgICRwdGdOYW1lID0gJHB0Z3twdGdOYW1lQX07DQorICAgIH0NCisNCisNCisgICAgcmV0dXJuIHBhY2sgJ0NWJywgJHB0Z05hbWUsICRuYW1lX2luZGV4Ow0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NlbGxfdG9fcm93Y29sKCRjZWxsX3JlZikNCisjDQorIyBDb252ZXJ0IGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIHN1Y2ggYXMgQTEgb3IgJEIyIG9yIEMkMyBvciAkRCQ0IHRvIGEgemVybw0KKyMgaW5kZXhlZCByb3cgYW5kIGNvbHVtbiBudW1iZXIuIEFsc28gcmV0dXJucyB0d28gYm9vbGVhbiB2YWx1ZXMgdG8gaW5kaWNhdGUNCisjIHdoZXRoZXIgdGhlIHJvdyBvciBjb2x1bW4gYXJlIHJlbGF0aXZlIHJlZmVyZW5jZXMuDQorIyBUT0RPIHVzZSBmdW5jdGlvbiBpbiBVdGlsaXR5LnBtDQorIw0KK3N1YiBfY2VsbF90b19yb3djb2wgew0KKw0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBteSAkY2VsbCA9IHNoaWZ0Ow0KKw0KKyAgICAkY2VsbCA9fiAvKFwkPykoW0EtSV0/W0EtWl0pKFwkPykoXGQrKS87DQorDQorICAgIG15ICRjb2xfcmVsID0gJDEgZXEgIiIgPyAxIDogMDsNCisgICAgbXkgJGNvbCAgICAgPSAkMjsNCisgICAgbXkgJHJvd19yZWwgPSAkMyBlcSAiIiA/IDEgOiAwOw0KKyAgICBteSAkcm93ICAgICA9ICQ0Ow0KKw0KKyAgICAjIENvbnZlcnQgYmFzZTI2IGNvbHVtbiBzdHJpbmcgdG8gYSBudW1iZXIuDQorICAgICMgQWxsIHlvdXIgQmFzZSBhcmUgYmVsb25nIHRvIHVzLg0KKyAgICBteSBAY2hhcnMgID0gc3BsaXQgLy8sICRjb2w7DQorICAgIG15ICRleHBuICAgPSAwOw0KKyAgICAkY29sICAgICAgID0gMDsNCisNCisgICAgd2hpbGUgKEBjaGFycykgew0KKyAgICAgICAgbXkgJGNoYXIgPSBwb3AoQGNoYXJzKTsgIyBMUyBjaGFyIGZpcnN0DQorICAgICAgICAkY29sICs9IChvcmQoJGNoYXIpIC0gb3JkKCdBJykgKyAxKSAqICgyNioqJGV4cG4pOw0KKyAgICAgICAgJGV4cG4rKzsNCisgICAgfQ0KKw0KKyAgICAjIENvbnZlcnQgMS1pbmRleCB0byB6ZXJvLWluZGV4DQorICAgICRyb3ctLTsNCisgICAgJGNvbC0tOw0KKw0KKyAgICByZXR1cm4gJHJvdywgJGNvbCwgJHJvd19yZWwsICRjb2xfcmVsOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkcm93LCAkY29sLCAkcm93X3JlbCwgJGNvbF9yZWwpDQorIw0KKyMgcGFjaygpIHJvdyBhbmQgY29sdW1uIGludG8gdGhlIHJlcXVpcmVkIDMgYnl0ZSBmb3JtYXQuDQorIw0KK3N1YiBfY2VsbF90b19wYWNrZWRfcm93Y29sIHsNCisNCisgICAgdXNlIGludGVnZXI7ICAgICMgQXZvaWQgPDwgc2hpZnQgYnVnIGluIFBlcmwgNS42LjAgb24gSFAtVVgNCisNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJGNlbGwgPSBzaGlmdDsNCisNCisgICAgbXkgKCRyb3csICRjb2wsICRyb3dfcmVsLCAkY29sX3JlbCkgPSAkc2VsZi0+X2NlbGxfdG9fcm93Y29sKCRjZWxsKTsNCisNCisgICAgZGllICJDb2x1bW4gJGNlbGwgZ3JlYXRlciB0aGFuIElWIGluIGZvcm11bGFcbiIgaWYgJGNvbCA+PSAyNTY7DQorICAgIGRpZSAiUm93ICRjZWxsIGdyZWF0ZXIgdGhhbiA2NTUzNiBpbiBmb3JtdWxhXG4iIGlmICRyb3cgPj0gNjU1MzY7DQorDQorICAgICMgU2V0IHRoZSBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgaWYgcm93IG9yIGNvbCBhcmUgcmVsYXRpdmUuDQorICAgICRjb2wgICAgfD0gJGNvbF9yZWwgPDwgMTQ7DQorICAgICRjb2wgICAgfD0gJHJvd19yZWwgPDwgMTU7DQorDQorICAgICRyb3cgICAgID0gcGFjaygndicsICRyb3cpOw0KKyAgICAkY29sICAgICA9IHBhY2soJ3YnLCAkY29sKTsNCisNCisgICAgcmV0dXJuICgkcm93LCAkY29sKTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9pbml0aWFsaXplX2hhc2hlcygpDQorIw0KK3N1YiBfaW5pdGlhbGl6ZV9oYXNoZXMgew0KKw0KKyAgICAjIFRoZSBFeGNlbCBwdGcgaW5kaWNlcw0KKyAgICAlcHRnID0gKA0KKyAgICAgICAgJ3B0Z0V4cCcgICAgICAgICAgICA9PiAweDAxLA0KKyAgICAgICAgJ3B0Z1RibCcgICAgICAgICAgICA9PiAweDAyLA0KKyAgICAgICAgJ3B0Z0FkZCcgICAgICAgICAgICA9PiAweDAzLA0KKyAgICAgICAgJ3B0Z1N1YicgICAgICAgICAgICA9PiAweDA0LA0KKyAgICAgICAgJ3B0Z011bCcgICAgICAgICAgICA9PiAweDA1LA0KKyAgICAgICAgJ3B0Z0RpdicgICAgICAgICAgICA9PiAweDA2LA0KKyAgICAgICAgJ3B0Z1Bvd2VyJyAgICAgICAgICA9PiAweDA3LA0KKyAgICAgICAgJ3B0Z0NvbmNhdCcgICAgICAgICA9PiAweDA4LA0KKyAgICAgICAgJ3B0Z0xUJyAgICAgICAgICAgICA9PiAweDA5LA0KKyAgICAgICAgJ3B0Z0xFJyAgICAgICAgICAgICA9PiAweDBBLA0KKyAgICAgICAgJ3B0Z0VRJyAgICAgICAgICAgICA9PiAweDBCLA0KKyAgICAgICAgJ3B0Z0dFJyAgICAgICAgICAgICA9PiAweDBDLA0KKyAgICAgICAgJ3B0Z0dUJyAgICAgICAgICAgICA9PiAweDBELA0KKyAgICAgICAgJ3B0Z05FJyAgICAgICAgICAgICA9PiAweDBFLA0KKyAgICAgICAgJ3B0Z0lzZWN0JyAgICAgICAgICA9PiAweDBGLA0KKyAgICAgICAgJ3B0Z1VuaW9uJyAgICAgICAgICA9PiAweDEwLA0KKyAgICAgICAgJ3B0Z1JhbmdlJyAgICAgICAgICA9PiAweDExLA0KKyAgICAgICAgJ3B0Z1VwbHVzJyAgICAgICAgICA9PiAweDEyLA0KKyAgICAgICAgJ3B0Z1VtaW51cycgICAgICAgICA9PiAweDEzLA0KKyAgICAgICAgJ3B0Z1BlcmNlbnQnICAgICAgICA9PiAweDE0LA0KKyAgICAgICAgJ3B0Z1BhcmVuJyAgICAgICAgICA9PiAweDE1LA0KKyAgICAgICAgJ3B0Z01pc3NBcmcnICAgICAgICA9PiAweDE2LA0KKyAgICAgICAgJ3B0Z1N0cicgICAgICAgICAgICA9PiAweDE3LA0KKyAgICAgICAgJ3B0Z0F0dHInICAgICAgICAgICA9PiAweDE5LA0KKyAgICAgICAgJ3B0Z1NoZWV0JyAgICAgICAgICA9PiAweDFBLA0KKyAgICAgICAgJ3B0Z0VuZFNoZWV0JyAgICAgICA9PiAweDFCLA0KKyAgICAgICAgJ3B0Z0VycicgICAgICAgICAgICA9PiAweDFDLA0KKyAgICAgICAgJ3B0Z0Jvb2wnICAgICAgICAgICA9PiAweDFELA0KKyAgICAgICAgJ3B0Z0ludCcgICAgICAgICAgICA9PiAweDFFLA0KKyAgICAgICAgJ3B0Z051bScgICAgICAgICAgICA9PiAweDFGLA0KKyAgICAgICAgJ3B0Z0FycmF5JyAgICAgICAgICA9PiAweDIwLA0KKyAgICAgICAgJ3B0Z0Z1bmMnICAgICAgICAgICA9PiAweDIxLA0KKyAgICAgICAgJ3B0Z0Z1bmNWYXInICAgICAgICA9PiAweDIyLA0KKyAgICAgICAgJ3B0Z05hbWUnICAgICAgICAgICA9PiAweDIzLA0KKyAgICAgICAgJ3B0Z1JlZicgICAgICAgICAgICA9PiAweDI0LA0KKyAgICAgICAgJ3B0Z0FyZWEnICAgICAgICAgICA9PiAweDI1LA0KKyAgICAgICAgJ3B0Z01lbUFyZWEnICAgICAgICA9PiAweDI2LA0KKyAgICAgICAgJ3B0Z01lbUVycicgICAgICAgICA9PiAweDI3LA0KKyAgICAgICAgJ3B0Z01lbU5vTWVtJyAgICAgICA9PiAweDI4LA0KKyAgICAgICAgJ3B0Z01lbUZ1bmMnICAgICAgICA9PiAweDI5LA0KKyAgICAgICAgJ3B0Z1JlZkVycicgICAgICAgICA9PiAweDJBLA0KKyAgICAgICAgJ3B0Z0FyZWFFcnInICAgICAgICA9PiAweDJCLA0KKyAgICAgICAgJ3B0Z1JlZk4nICAgICAgICAgICA9PiAweDJDLA0KKyAgICAgICAgJ3B0Z0FyZWFOJyAgICAgICAgICA9PiAweDJELA0KKyAgICAgICAgJ3B0Z01lbUFyZWFOJyAgICAgICA9PiAweDJFLA0KKyAgICAgICAgJ3B0Z01lbU5vTWVtTicgICAgICA9PiAweDJGLA0KKyAgICAgICAgJ3B0Z05hbWVYJyAgICAgICAgICA9PiAweDM5LA0KKyAgICAgICAgJ3B0Z1JlZjNkJyAgICAgICAgICA9PiAweDNBLA0KKyAgICAgICAgJ3B0Z0FyZWEzZCcgICAgICAgICA9PiAweDNCLA0KKyAgICAgICAgJ3B0Z1JlZkVycjNkJyAgICAgICA9PiAweDNDLA0KKyAgICAgICAgJ3B0Z0FyZWFFcnIzZCcgICAgICA9PiAweDNELA0KKyAgICAgICAgJ3B0Z0FycmF5VicgICAgICAgICA9PiAweDQwLA0KKyAgICAgICAgJ3B0Z0Z1bmNWJyAgICAgICAgICA9PiAweDQxLA0KKyAgICAgICAgJ3B0Z0Z1bmNWYXJWJyAgICAgICA9PiAweDQyLA0KKyAgICAgICAgJ3B0Z05hbWVWJyAgICAgICAgICA9PiAweDQzLA0KKyAgICAgICAgJ3B0Z1JlZlYnICAgICAgICAgICA9PiAweDQ0LA0KKyAgICAgICAgJ3B0Z0FyZWFWJyAgICAgICAgICA9PiAweDQ1LA0KKyAgICAgICAgJ3B0Z01lbUFyZWFWJyAgICAgICA9PiAweDQ2LA0KKyAgICAgICAgJ3B0Z01lbUVyclYnICAgICAgICA9PiAweDQ3LA0KKyAgICAgICAgJ3B0Z01lbU5vTWVtVicgICAgICA9PiAweDQ4LA0KKyAgICAgICAgJ3B0Z01lbUZ1bmNWJyAgICAgICA9PiAweDQ5LA0KKyAgICAgICAgJ3B0Z1JlZkVyclYnICAgICAgICA9PiAweDRBLA0KKyAgICAgICAgJ3B0Z0FyZWFFcnJWJyAgICAgICA9PiAweDRCLA0KKyAgICAgICAgJ3B0Z1JlZk5WJyAgICAgICAgICA9PiAweDRDLA0KKyAgICAgICAgJ3B0Z0FyZWFOVicgICAgICAgICA9PiAweDRELA0KKyAgICAgICAgJ3B0Z01lbUFyZWFOVicgICAgICA9PiAweDRFLA0KKyAgICAgICAgJ3B0Z01lbU5vTWVtTicgICAgICA9PiAweDRGLA0KKyAgICAgICAgJ3B0Z0Z1bmNDRVYnICAgICAgICA9PiAweDU4LA0KKyAgICAgICAgJ3B0Z05hbWVYVicgICAgICAgICA9PiAweDU5LA0KKyAgICAgICAgJ3B0Z1JlZjNkVicgICAgICAgICA9PiAweDVBLA0KKyAgICAgICAgJ3B0Z0FyZWEzZFYnICAgICAgICA9PiAweDVCLA0KKyAgICAgICAgJ3B0Z1JlZkVycjNkVicgICAgICA9PiAweDVDLA0KKyAgICAgICAgJ3B0Z0FyZWFFcnIzZCcgICAgICA9PiAweDVELA0KKyAgICAgICAgJ3B0Z0FycmF5QScgICAgICAgICA9PiAweDYwLA0KKyAgICAgICAgJ3B0Z0Z1bmNBJyAgICAgICAgICA9PiAweDYxLA0KKyAgICAgICAgJ3B0Z0Z1bmNWYXJBJyAgICAgICA9PiAweDYyLA0KKyAgICAgICAgJ3B0Z05hbWVBJyAgICAgICAgICA9PiAweDYzLA0KKyAgICAgICAgJ3B0Z1JlZkEnICAgICAgICAgICA9PiAweDY0LA0KKyAgICAgICAgJ3B0Z0FyZWFBJyAgICAgICAgICA9PiAweDY1LA0KKyAgICAgICAgJ3B0Z01lbUFyZWFBJyAgICAgICA9PiAweDY2LA0KKyAgICAgICAgJ3B0Z01lbUVyckEnICAgICAgICA9PiAweDY3LA0KKyAgICAgICAgJ3B0Z01lbU5vTWVtQScgICAgICA9PiAweDY4LA0KKyAgICAgICAgJ3B0Z01lbUZ1bmNBJyAgICAgICA9PiAweDY5LA0KKyAgICAgICAgJ3B0Z1JlZkVyckEnICAgICAgICA9PiAweDZBLA0KKyAgICAgICAgJ3B0Z0FyZWFFcnJBJyAgICAgICA9PiAweDZCLA0KKyAgICAgICAgJ3B0Z1JlZk5BJyAgICAgICAgICA9PiAweDZDLA0KKyAgICAgICAgJ3B0Z0FyZWFOQScgICAgICAgICA9PiAweDZELA0KKyAgICAgICAgJ3B0Z01lbUFyZWFOQScgICAgICA9PiAweDZFLA0KKyAgICAgICAgJ3B0Z01lbU5vTWVtTicgICAgICA9PiAweDZGLA0KKyAgICAgICAgJ3B0Z0Z1bmNDRUEnICAgICAgICA9PiAweDc4LA0KKyAgICAgICAgJ3B0Z05hbWVYQScgICAgICAgICA9PiAweDc5LA0KKyAgICAgICAgJ3B0Z1JlZjNkQScgICAgICAgICA9PiAweDdBLA0KKyAgICAgICAgJ3B0Z0FyZWEzZEEnICAgICAgICA9PiAweDdCLA0KKyAgICAgICAgJ3B0Z1JlZkVycjNkQScgICAgICA9PiAweDdDLA0KKyAgICAgICAgJ3B0Z0FyZWFFcnIzZCcgICAgICA9PiAweDdELA0KKyAgICApOw0KKw0KKyAgICAjIFRoYW5rcyB0byBNaWNoYWVsIE1lZWtzIGFuZCBHbnVtZXJpYyBmb3IgdGhlIGluaXRpYWwgYXJnIHZhbHVlcy4NCisgICAgIw0KKyAgICAjIFRoZSBmb2xsb3dpbmcgaGFzaCB3YXMgZ2VuZXJhdGVkIGJ5ICJmdW5jdGlvbl9sb2NhbGUucGwiIGluIHRoZSBkaXN0cm8uDQorICAgICMgUmVmZXIgdG8gZnVuY3Rpb25fbG9jYWxlLnBsIGZvciBub24tRW5nbGlzaCBmdW5jdGlvbiBuYW1lcy4NCisgICAgIw0KKyAgICAjIFRoZSBhcnJheSBlbGVtZW50cyBhcmUgYXMgZm9sbG93Og0KKyAgICAjIHB0ZzogICBUaGUgRXhjZWwgZnVuY3Rpb24gcHRnIGNvZGUuDQorICAgICMgYXJnczogIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoYXQgdGhlIGZ1bmN0aW9uIHRha2VzOg0KKyAgICAjICAgICAgICAgICA+PTAgaXMgYSBmaXhlZCBudW1iZXIgb2YgYXJndW1lbnRzLg0KKyAgICAjICAgICAgICAgICAtMSAgaXMgYSB2YXJpYWJsZSAgbnVtYmVyIG9mIGFyZ3VtZW50cy4NCisgICAgIyBjbGFzczogVGhlIHJlZmVyZW5jZSwgdmFsdWUgb3IgYXJyYXkgY2xhc3Mgb2YgdGhlIGZ1bmN0aW9uIGFyZ3MuDQorICAgICMgdm9sOiAgIFRoZSBmdW5jdGlvbiBpcyB2b2xhdGlsZS4NCisgICAgIw0KKyAgICAlZnVuY3Rpb25zICA9ICgNCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRnICBhcmdzICBjbGFzcyAgdm9sDQorICAgICAgICAnQ09VTlQnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICAwLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnSUYnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICAxLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSVNOQScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICAyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSVNFUlJPUicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICAzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1VNJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICA0LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnQVZFUkFHRScgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICA1LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTUlOJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICA2LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTUFYJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICA3LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUk9XJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICA4LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnQ09MVU1OJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgICA5LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTkEnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDEwLCAgICAwLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTlBWJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDExLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1RERVYnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDEyLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRE9MTEFSJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDEzLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRklYRUQnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDE0LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU0lOJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDE1LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ09TJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDE2LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVEFOJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDE3LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQVRBTicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDE4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUEknICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDE5LCAgICAwLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1FSVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDIwLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRVhQJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDIxLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTE4nICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDIyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTE9HMTAnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDIzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQUJTJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDI0LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSU5UJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDI1LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU0lHTicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDI2LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUk9VTkQnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDI3LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTE9PS1VQJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDI4LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnSU5ERVgnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDI5LCAgIC0xLCAgICAwLCAgICAxIF0sDQorICAgICAgICAnUkVQVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDMwLCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTUlEJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDMxLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTEVOJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDMyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVkFMVUUnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDMzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVFJVRScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDM0LCAgICAwLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRkFMU0UnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDM1LCAgICAwLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQU5EJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDM2LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnT1InICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDM3LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTk9UJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDM4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTU9EJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDM5LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRENPVU5UJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQwLCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRFNVTScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQxLCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnREFWRVJBR0UnICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQyLCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRE1JTicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQzLCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRE1BWCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQ0LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRFNUREVWJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQ1LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnVkFSJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQ2LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRFZBUicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQ3LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnVEVYVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQ4LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTElORVNUJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDQ5LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnVFJFTkQnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDUwLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTE9HRVNUJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDUxLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnR1JPV1RIJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDUyLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUFYnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDU2LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRlYnICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDU3LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTlBFUicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDU4LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUE1UJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDU5LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUkFURScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDYwLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTUlSUicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDYxLCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnSVJSJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDYyLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUkFORCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDYzLCAgICAwLCAgICAxLCAgICAxIF0sDQorICAgICAgICAnTUFUQ0gnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDY0LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnREFURScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDY1LCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVElNRScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDY2LCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnREFZJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDY3LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTU9OVEgnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDY4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnWUVBUicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDY5LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnV0VFS0RBWScgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDcwLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSE9VUicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDcxLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTUlOVVRFJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDcyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU0VDT05EJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDczLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTk9XJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDc0LCAgICAwLCAgICAxLCAgICAxIF0sDQorICAgICAgICAnQVJFQVMnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDc1LCAgICAxLCAgICAwLCAgICAxIF0sDQorICAgICAgICAnUk9XUycgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDc2LCAgICAxLCAgICAwLCAgICAxIF0sDQorICAgICAgICAnQ09MVU1OUycgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDc3LCAgICAxLCAgICAwLCAgICAxIF0sDQorICAgICAgICAnT0ZGU0VUJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDc4LCAgIC0xLCAgICAwLCAgICAxIF0sDQorICAgICAgICAnU0VBUkNIJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDgyLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVFJBTlNQT1NFJyAgICAgICAgICAgICAgICAgICAgID0+IFsgIDgzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVFlQRScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDg2LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQVRBTjInICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDk3LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQVNJTicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDk4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQUNPUycgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgIDk5LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ0hPT1NFJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTAwLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSExPT0tVUCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTAxLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnVkxPT0tVUCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTAyLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnSVNSRUYnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTA1LCAgICAxLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTE9HJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTA5LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ0hBUicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTExLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTE9XRVInICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTEyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVVBQRVInICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTEzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUFJPUEVSJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTE0LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTEVGVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTE1LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUklHSFQnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTE2LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRVhBQ1QnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTE3LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVFJJTScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTE4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUkVQTEFDRScgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTE5LCAgICA0LCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1VCU1RJVFVURScgICAgICAgICAgICAgICAgICAgID0+IFsgMTIwLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ09ERScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTIxLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRklORCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTI0LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ0VMTCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTI1LCAgIC0xLCAgICAwLCAgICAxIF0sDQorICAgICAgICAnSVNFUlInICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTI2LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSVNURVhUJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTI3LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSVNOVU1CRVInICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTI4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSVNCTEFOSycgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTI5LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTMwLCAgICAxLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTicgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTMxLCAgICAxLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnREFURVZBTFVFJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMTQwLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVElNRVZBTFVFJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMTQxLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU0xOJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTQyLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1lEJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTQzLCAgICA0LCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRERCJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTQ0LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSU5ESVJFQ1QnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTQ4LCAgIC0xLCAgICAxLCAgICAxIF0sDQorICAgICAgICAnQ0FMTCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTUwLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ0xFQU4nICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTYyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTURFVEVSTScgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTYzLCAgICAxLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnTUlOVkVSU0UnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTY0LCAgICAxLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnTU1VTFQnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTY1LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnSVBNVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTY3LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUFBNVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTY4LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ09VTlRBJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTY5LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUFJPRFVDVCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTgzLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRkFDVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTg0LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRFBST0RVQ1QnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTg5LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnSVNOT05URVhUJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMTkwLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1RERVZQJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTkzLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnVkFSUCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTk0LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRFNUREVWUCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTk1LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRFZBUlAnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTk2LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnVFJVTkMnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTk3LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSVNMT0dJQ0FMJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMTk4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRENPVU5UQScgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMTk5LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUk9VTkRVUCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjEyLCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUk9VTkRET1dOJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjEzLCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUkFOSycgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjE2LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnQUREUkVTUycgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjE5LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnREFZUzM2MCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjIwLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVE9EQVknICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjIxLCAgICAwLCAgICAxLCAgICAxIF0sDQorICAgICAgICAnVkRCJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjIyLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTUVESUFOJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjI3LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnU1VNUFJPRFVDVCcgICAgICAgICAgICAgICAgICAgID0+IFsgMjI4LCAgIC0xLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnU0lOSCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjI5LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ09TSCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjMwLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVEFOSCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjMxLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQVNJTkgnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjMyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQUNPU0gnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjMzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQVRBTkgnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjM0LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnREdFVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjM1LCAgICAzLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnSU5GTycgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjQ0LCAgICAxLCAgICAxLCAgICAxIF0sDQorICAgICAgICAnREInICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjQ3LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRlJFUVVFTkNZJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjUyLCAgICAyLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnRVJST1IuVFlQRScgICAgICAgICAgICAgICAgICAgID0+IFsgMjYxLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUkVHSVNURVIuSUQnICAgICAgICAgICAgICAgICAgID0+IFsgMjY3LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQVZFREVWJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjY5LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnQkVUQURJU1QnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjcwLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnR0FNTUFMTicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjcxLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQkVUQUlOVicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjcyLCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQklOT01ESVNUJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjczLCAgICA0LCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ0hJRElTVCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjc0LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ0hJSU5WJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjc1LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ09NQklOJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjc2LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ09ORklERU5DRScgICAgICAgICAgICAgICAgICAgID0+IFsgMjc3LCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ1JJVEJJTk9NJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjc4LCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRVZFTicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjc5LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRVhQT05ESVNUJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjgwLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRkRJU1QnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjgxLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRklOVicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjgyLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRklTSEVSJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjgzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRklTSEVSSU5WJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjg0LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnRkxPT1InICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjg1LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnR0FNTUFESVNUJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjg2LCAgICA0LCAgICAxLCAgICAwIF0sDQorICAgICAgICAnR0FNTUFJTlYnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjg3LCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ0VJTElORycgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjg4LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnSFlQR0VPTURJU1QnICAgICAgICAgICAgICAgICAgID0+IFsgMjg5LCAgICA0LCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTE9HTk9STURJU1QnICAgICAgICAgICAgICAgICAgID0+IFsgMjkwLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTE9HSU5WJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjkxLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTkVHQklOT01ESVNUJyAgICAgICAgICAgICAgICAgID0+IFsgMjkyLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTk9STURJU1QnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjkzLCAgICA0LCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTk9STVNESVNUJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMjk0LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTk9STUlOVicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjk1LCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnTk9STVNJTlYnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjk2LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1RBTkRBUkRJWkUnICAgICAgICAgICAgICAgICAgID0+IFsgMjk3LCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnT0REJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjk4LCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUEVSTVVUJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMjk5LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUE9JU1NPTicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzAwLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnVERJU1QnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzAxLCAgICAzLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnV0VJQlVMTCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzAyLCAgICA0LCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1VNWE1ZMicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzAzLCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnU1VNWDJNWTInICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzA0LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnU1VNWDJQWTInICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzA1LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnQ0hJVEVTVCcgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzA2LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnQ09SUkVMJyAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzA3LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnQ09WQVInICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzA4LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnRk9SRUNBU1QnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzA5LCAgICAzLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnRlRFU1QnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzEwLCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnSU5URVJDRVBUJyAgICAgICAgICAgICAgICAgICAgID0+IFsgMzExLCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnUEVBUlNPTicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzEyLCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnUlNRJyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzEzLCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnU1RFWVgnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzE0LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnU0xPUEUnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzE1LCAgICAyLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnVFRFU1QnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzE2LCAgICA0LCAgICAyLCAgICAwIF0sDQorICAgICAgICAnUFJPQicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzE3LCAgIC0xLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnREVWU1EnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzE4LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnR0VPTUVBTicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzE5LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnSEFSTUVBTicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzIwLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnU1VNU1EnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzIxLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnS1VSVCcgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzIyLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnU0tFVycgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzIzLCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnWlRFU1QnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzI0LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTEFSR0UnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzI1LCAgICAyLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnU01BTEwnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzI2LCAgICAyLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUVVBUlRJTEUnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzI3LCAgICAyLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUEVSQ0VOVElMRScgICAgICAgICAgICAgICAgICAgID0+IFsgMzI4LCAgICAyLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUEVSQ0VOVFJBTksnICAgICAgICAgICAgICAgICAgID0+IFsgMzI5LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnTU9ERScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzMwLCAgIC0xLCAgICAyLCAgICAwIF0sDQorICAgICAgICAnVFJJTU1FQU4nICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzMxLCAgICAyLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnVElOVicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzMyLCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnQ09OQ0FURU5BVEUnICAgICAgICAgICAgICAgICAgID0+IFsgMzM2LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUE9XRVInICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzM3LCAgICAyLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnUkFESUFOUycgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzQyLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnREVHUkVFUycgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzQzLCAgICAxLCAgICAxLCAgICAwIF0sDQorICAgICAgICAnU1VCVE9UQUwnICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzQ0LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnU1VNSUYnICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzQ1LCAgIC0xLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnQ09VTlRJRicgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzQ2LCAgICAyLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnQ09VTlRCTEFOSycgICAgICAgICAgICAgICAgICAgID0+IFsgMzQ3LCAgICAxLCAgICAwLCAgICAwIF0sDQorICAgICAgICAnUk9NQU4nICAgICAgICAgICAgICAgICAgICAgICAgID0+IFsgMzU0LCAgIC0xLCAgICAxLCAgICAwIF0sDQorICAgICk7DQorDQorfQ0KKw0KKw0KKw0KKw0KKzE7DQorDQorDQorX19FTkRfXw0KKw0KKw0KKz1oZWFkMSBOQU1FDQorDQorRm9ybXVsYSAtIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgRXhjZWwgZm9ybXVsYXMNCisNCis9aGVhZDEgU1lOT1BTSVMNCisNCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsDQorDQorPWhlYWQxIERFU0NSSVBUSU9ODQorDQorVGhpcyBtb2R1bGUgaXMgdXNlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4gWW91IGRvIG5vdCBuZWVkIHRvIHVzZSBpdCBkaXJlY3RseS4NCisNCisNCis9aGVhZDEgTk9URVMNCisNCitUaGUgZm9sbG93aW5nIG5vdGVzIGFyZSB0byBoZWxwIGRldmVsb3BlcnMgYW5kIG1haW50YWluZXJzIHVuZGVyc3RhbmQgdGhlIHNlcXVlbmNlIG9mIG9wZXJhdGlvbi4gVGhleSBhcmUgYWxzbyBpbnRlbmRlZCBhcyBhIHByby1tZW1vcmlhIGZvciB0aGUgYXV0aG9yLiA7LSkNCisNCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybXVsYSBjb252ZXJ0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBmb3JtdWxhIGludG8gdGhlIHByZS1wYXJzZWQgYmluYXJ5IGZvcm1hdCB0aGF0IEV4Y2VsIHVzZXMgdG8gc3RvcmUgZm9ybXVsYXMuIEZvciBleGFtcGxlIEM8MSsyKjM+IGlzIHN0b3JlZCBhcyBmb2xsb3dzOiBDPDFFIDAxIDAwIDFFIDAyIDAwIDFFIDAzIDAwIDA1IDAzPi4NCisNCitUaGlzIHN0cmluZyBpcyBjb21wcmlzZWQgb2Ygb3BlcmF0b3JzIGFuZCBvcGVyYW5kcyBhcnJhbmdlZCBpbiBhIHJldmVyc2UtUG9saXNoIGZvcm1hdC4gVGhlIG1lYW5pbmcgb2YgdGhlIHRva2VucyBpbiB0aGUgYWJvdmUgZXhhbXBsZSBpcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOg0KKw0KKyAgICBUb2tlbiAgIE5hbWUgICAgICAgIFZhbHVlDQorICAgIDFFICAgICAgcHRnSW50ICAgICAgMDAwMSAgIChzdG9yZWQgYXMgMDEgMDApDQorICAgIDFFICAgICAgcHRnSW50ICAgICAgMDAwMiAgIChzdG9yZWQgYXMgMDIgMDApDQorICAgIDFFICAgICAgcHRnSW50ICAgICAgMDAwMyAgIChzdG9yZWQgYXMgMDMgMDApDQorICAgIDA1ICAgICAgcHRnTXVsDQorICAgIDAzICAgICAgcHRnQWRkDQorDQorVGhlIHRva2VucyBhbmQgdG9rZW4gbmFtZXMgYXJlIGRlZmluZWQgaW4gdGhlICJFeGNlbCBEZXZlbG9wZXIncyBLaXQiIGZyb20gTWljcm9zb2Z0IFByZXNzLiBDPHB0Zz4gc3RhbmRzIGZvciBQYXJzZSBUaGluRyAoYXMgaW4gIlRoYXQgbGV4ZXIgY2FuJ3QgZ3JvayBpdCwgaXQncyBhIHBhcnNlIHRoYW5nLiIpDQorDQorSW4gZ2VuZXJhbCB0aGUgdG9rZW5zIGZhbGwgaW50byB0d28gY2F0ZWdvcmllczogb3BlcmF0b3JzIHN1Y2ggYXMgQzxwdGdNdWw+IGFuZCBvcGVyYW5kcyBzdWNoIGFzIEM8cHRnSW50Pi4gV2hlbiB0aGUgZm9ybXVsYSBpcyBldmFsdWF0ZWQgYnkgRXhjZWwgdGhlIG9wZXJhbmQgdG9rZW5zIHB1c2ggdmFsdWVzIG9udG8gYSBzdGFjay4gVGhlIG9wZXJhdG9yIHRva2VucyB0aGVuIHBvcCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIG9wZXJhbmRzIG9mZiBvZiB0aGUgc3RhY2ssIHBlcmZvcm0gYW4gb3BlcmF0aW9uIGFuZCBwdXNoIHRoZSByZXN1bHRpbmcgdmFsdWUgYmFjayBvbnRvIHRoZSBzdGFjay4gVGhpcyBtZXRob2RvbG9neSBpcyBzaW1pbGFyIHRvIHRoZSBiYXNpYyBvcGVyYXRpb24gb2YgYSByZXZlcnNlLVBvbGlzaCAoUlBOKSBjYWxjdWxhdG9yLg0KKw0KK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtdWxhIHBhcnNlcyBhIGZvcm11bGEgdXNpbmcgYSBDPFBhcnNlOjpSZWNEZXNjZW50PiBwYXJzZXIgKGF0IGEgbGF0ZXIgc3RhZ2UgaXQgbWF5IHVzZSBhIEM8UGFyc2U6OllhcHA+IHBhcnNlciBvciBDPFBhcnNlOjpGYXN0RGVzY2VudD4pLg0KKw0KK1RoZSBwYXJzZXIgY29udmVydHMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBmb3JtdWxhIGludG8gYSBwYXJzZSB0cmVlLiBUaHVzLCBDPDErMiozPiBpcyBjb252ZXJ0ZWQgaW50byBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nLCBDPGU+IHN0YW5kcyBmb3IgZXhwcmVzc2lvbjoNCisNCisgICAgICAgICAgICAgZQ0KKyAgICAgICAgICAgLyB8IFwNCisgICAgICAgICAxICAgKyAgIGUNCisgICAgICAgICAgICAgICAvIHwgXA0KKyAgICAgICAgICAgICAyICAgKiAgIDMNCisNCisNCitUaGUgZnVuY3Rpb24gQzxfcmV2ZXJzZV90cmVlKCk+IHJlY3Vyc2VzIGRvd24gdGhyb3VnaCB0aGlzIHN0cnVjdHVyZSBzd2FwcGluZyB0aGUgb3JkZXIgb2Ygb3BlcmF0b3JzIGZvbGxvd2VkIGJ5IG9wZXJhbmRzIHRvIHByb2R1Y2UgYSByZXZlcnNlLVBvbGlzaCB0cmVlLiBJbiBvdGhlciB3b3JkcyB0aGUgZm9ybXVsYSBpcyBjb252ZXJ0ZWQgZnJvbSBpbi1maXggbm90YXRpb24gdG8gcG9zdC1maXguIEZvbGxvd2luZyB0aGUgYWJvdmUgZXhhbXBsZSB0aGUgcmVzdWx0aW5nIHRyZWUgd291bGQgbG9vayBsaWtlIHRoaXM6DQorDQorDQorICAgICAgICAgICAgIGUNCisgICAgICAgICAgIC8gfCBcDQorICAgICAgICAgMSAgIGUgICArDQorICAgICAgICAgICAvIHwgXA0KKyAgICAgICAgIDIgICAzICAgKg0KKw0KK1RoZSByZXN1bHQgb2YgdGhlIHJlY3Vyc2lvbiBpcyBhIHNpbmdsZSBhcnJheSBvZiB0b2tlbnMuIEluIG91ciBleGFtcGxlIHRoZSBzaW1wbGlmaWVkIGZvcm0gd291bGQgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6DQorDQorICAgICgxLCAyLCAzLCAqLCArKQ0KKw0KK1RoZSBhY3R1YWwgcmV0dXJuIHZhbHVlIGNvbnRhaW5zIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBoZWxwIGluIHRoZSBzZWNvbmRhcnkgcGFyc2luZyBzdGFnZToNCisNCisgICAgKF9udW0sIDEsIF9udW0sIDIsIF9udW0sIDMsIHB0Z011bCwgcHRnQWRkLCBfYXJnLCAxKQ0KKw0KK1RoZSBhZGRpdGlvbmFsIHRva2VucyBhcmU6DQorDQorICAgIFRva2VuICAgICAgIE1lYW5pbmcNCisgICAgX251bSAgICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSBudW1iZXINCisgICAgX3N0ciAgICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSBzdHJpbmcNCisgICAgX3JlZjJkICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSAyZCBjZWxsIHJlZmVyZW5jZQ0KKyAgICBfcmVmM2QgICAgICBUaGUgbmV4dCB0b2tlbiBpcyBhIDNkIGNlbGwgcmVmZXJlbmNlDQorICAgIF9yYW5nZTJkICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgMmQgcmFuZ2UNCisgICAgX3JhbmdlM2QgICAgVGhlIG5leHQgdG9rZW4gaXMgYSAzZCByYW5nZQ0KKyAgICBfZnVuYyAgICAgICBUaGUgbmV4dCB0b2tlbiBpcyBhIGZ1bmN0aW9uDQorICAgIF9hcmcgICAgICAgIFRoZSBuZXh0IHRva2VuIGlzIHRoZSBudW1iZXIgb2YgYXJncyBmb3IgYSBmdW5jdGlvbg0KKyAgICBfY2xhc3MgICAgICBUaGUgbmV4dCB0b2tlbiBpcyBhIGZ1bmN0aW9uIG5hbWUNCisgICAgX3ZvbCAgICAgICAgVGhlIGZvcm11bGEgY29udGFpbnMgYSB2b2x0aWxlIGZ1bmN0aW9uDQorDQorVGhlIEM8X2FyZz4gdG9rZW4gaXMgZ2VuZXJhdGVkIGZvciBhbGwgbGlzdHMgYnV0IGlzIG9ubHkgdXNlZCBmb3IgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuDQorDQorVGhlIEM8X2NsYXNzPiB0b2tlbiBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgdGhlIHBvc3QtcHJvY2Vzc29yIHRvIGRlY2lkZSB0aGUgImNsYXNzIiBvZiB0aGUgcmVmIGFuZCByYW5nZSBhcmd1bWVudHMgdGhhdCB0aGUgZnVuY3Rpb24gdGFrZXMuIFRoZSBjbGFzcyBjYW4gYmUgcmVmZXJlbmNlLCB2YWx1ZSBvciBhcnJheS4gU2luY2UgZnVuY3Rpb24gY2FsbHMgY2FuIGJlIG5lc3RlZCwgdGhlIGNsYXNzIHZhcmlhYmxlIGlzIHN0b3JlZCBvbiBhIHN0YWNrIGluIHRoZSBDPEBjbGFzcz4gYXJyYXkuIFRoZSBjbGFzcyBvZiB0aGUgcmVmIG9yIHJhbmdlIGlzIHRoZW4gcmVhZCBhcyB0aGUgdG9wIGVsZW1lbnQgb2YgdGhlIHN0YWNrIEM8JGNsYXNzWy0xXT4uIFdoZW4gYSBDPF9mdW5jPiBpcyByZWFkIGl0IHBvcHMgdGhlIGNsYXNzIHZhbHVlLg0KKw0KK0NlcnRhaW4gRXhjZWwgZnVuY3Rpb25zIHN1Y2ggYXMgUkFORCgpIGFuZCBOT1coKSBhcmUgZGVzaWduYXRlZCBhcyB2b2xhdGlsZSBhbmQgbXVzdCBiZSByZWNhbGN1bGF0ZWQgYnkgRXhjZWwgZXZlcnkgdGltZSB0aGF0IGEgY2VsbCBpcyB1cGRhdGVkLiBBbnkgZm9ybXVsYXMgdGhhdCBjb250YWluIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMgaGFzIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBDPHB0Z0F0dHI+IHRhZyBwcmVwZW5kZWQgdG8gaXQgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyB2b2xhdGlsZS4NCisNCitBIHNlY29uZGFyeSBwYXJzaW5nIHN0YWdlIGlzIGNhcnJpZWQgb3V0IGJ5IEM8cGFyc2VfdG9rZW5zKCk+IHdoaWNoIGNvbnZlcnRzIHRoZXNlIHRva2VucyBpbnRvIGEgYmluYXJ5IHN0cmluZy4gRm9yIHRoZSBDPDErMiozPiBleGFtcGxlIHRoaXMgd291bGQgZ2l2ZToNCisNCisgICAgMUUgMDEgMDAgMUUgMDIgMDAgMUUgMDMgMDAgMDUgMDMNCisNCitUaGlzIHR3by1wYXNzIG1ldGhvZCBjb3VsZCBwcm9iYWJseSBoYXZlIGJlZW4gcmVkdWNlZCB0byBhIHNpbmdsZSBwYXNzIHRocm91Z2ggdGhlIEM8UGFyc2U6OlJlY0Rlc2NlbnQ+IHBhcnNlci4gSG93ZXZlciwgaXQgd2FzIGVhc2llciB0byBkZXZlbG9wIGFuZCBkZWJ1ZyB0aGlzIHdheS4NCisNCitUaGUgdG9rZW4gdmFsdWVzIGFuZCBmb3JtdWxhIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBDPCVwdGc+IGFuZCBDPCVmdW5jdGlvbnM+IGhhc2hlcy4gVGhlc2UgaGFzaGVzIGFuZCB0aGUgcGFyc2VyIG9iamVjdCBDPCRwYXJzZXI+IGFyZSBleHBvc2VkIGFzIGdsb2JhbCBkYXRhLiBUaGlzIGJyZWFrcyB0aGUgT08gZW5jYXBzdWxhdGlvbiwgYnV0IG1lYW5zIHRoYXQgdGhleSBjYW4gYmUgc2hhcmVkIGJ5IHNldmVyYWwgaW5zdGFuY2VzIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHByb2dyYW0uDQorDQorTm9uLUVuZ2xpc2ggZnVuY3Rpb24gbmFtZXMgY2FuIGJlIGFkZGVkIHRvIHRoZSBDPCVmdW5jdGlvbnM+IGhhc2ggdXNpbmcgdGhlIEM8ZnVuY3Rpb25fbG9jYWxlLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4gVGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOiBHZXJtYW4sIEZyZW5jaCwgU3BhbmlzaCwgUG9ydHVndWVzZSwgRHV0Y2gsIEZpbm5pc2gsIEl0YWxpYW4gYW5kIFN3ZWRpc2guIFRoZXNlIGxhbmd1YWdlcyBhcmUgbm90IGFkZGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGVyZSBhcmUgY29uZmxpY3RzIGJldHdlZW4gZnVuY3Rpb25zIG5hbWVzIGluIGRpZmZlcmVudCBsYW5ndWFnZXMuDQorDQorVGhlIHBhcnNlciBpcyBpbml0aWFsaXNlZCBieSBDPF9pbml0X3BhcnNlcigpPi4gVGhlIGluaXRpYWxpc2F0aW9uIGlzIGRlbGF5ZWQgdW50aWwgdGhlIGZpcnN0IGZvcm11bGEgaXMgcGFyc2VkLiBUaGlzIGVsaW1pbmF0ZXMgdGhlIG92ZXJoZWFkIG9mIGdlbmVyYXRpbmcgdGhlIHBhcnNlciBpbiBwcm9ncmFtcyB0aGF0IGFyZSBub3QgcHJvY2Vzc2luZyBmb3JtdWxhcy4gKFRoZSBwYXJzZXIgc2hvdWxkIHJlYWxseSBiZSBwcmUtY29tcGlsZWQsIHRoaXMgaXMgdG8tZG8gd2hlbiB0aGUgZ3JhbW1hciBzdGFiaWxpc2VzKS4NCisNCisNCisNCisNCis9aGVhZDEgQVVUSE9SDQorDQorSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcNCisNCis9aGVhZDEgQ09QWVJJR0hUDQorDQorqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuDQorDQorQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLg0KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvT0xFd3JpdGVyLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9PTEV3cml0ZXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiYjQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvT0xFd3JpdGVyLnBtCkBAIC0wLDAgKzEsNDQ5IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpPTEV3cml0ZXI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgT0xFd3JpdGVyIC0gQSB3cml0ZXIgY2xhc3MgdG8gc3RvcmUgQklGRiBkYXRhIGluIGEgT0xFIGNvbXBvdW5kIHN0b3JhZ2UgZmlsZS4KKyMKKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIEV4cG9ydGVyOwordXNlIHN0cmljdDsKK3VzZSBDYXJwOwordXNlIEZpbGVIYW5kbGU7CisKKworCisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIyBDb25zdHJ1Y3RvcgorIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICA9IHsKKyAgICAgICAgICAgICAgICAgICAgX29sZWZpbGVuYW1lICAgPT4gJF9bMF0sCisgICAgICAgICAgICAgICAgICAgIF9maWxlaGFuZGxlICAgID0+ICIiLAorICAgICAgICAgICAgICAgICAgICBfZmlsZWNsb3NlZCAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfaW50ZXJuYWxfZmggICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfYmlmZl9vbmx5ICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfc2l6ZV9hbGxvd2VkICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfYmlmZnNpemUgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfYm9va3NpemUgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfYmlnX2Jsb2NrcyAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfbGlzdF9ibG9ja3MgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfcm9vdF9zdGFydCAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfYmxvY2tfY291bnQgICA9PiA0LAorICAgICAgICAgICAgICAgICB9OworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgICAkc2VsZi0+X2luaXRpYWxpemUoKTsKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfaW5pdGlhbGl6ZSgpCisjCisjIENyZWF0ZSBhIG5ldyBmaWxlaGFuZGxlIG9yIHVzZSB0aGUgcHJvdmlkZWQgZmlsZWhhbmRsZS4KKyMKK3N1YiBfaW5pdGlhbGl6ZSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRvbGVmaWxlID0gJHNlbGYtPntfb2xlZmlsZW5hbWV9OworICAgIG15ICRmaDsKKworICAgICMgSWYgdGhlIGZpbGVuYW1lIGlzIGEgcmVmZXJlbmNlIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBpcyBhIHZhbGlkCisgICAgIyBmaWxlaGFuZGxlLCBpZiBub3Qgd2UgY3JlYXRlIGEgZmlsZWhhbmRsZS4KKyAgICAjCisgICAgaWYgKHJlZigkb2xlZmlsZSkpIHsKKyAgICAgICAgJGZoID0gJG9sZWZpbGU7CisgICAgfQorICAgIGVsc2V7CisKKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgZmlsZSwgb3BlbiBmb3Igd3JpdGluZworICAgICAgICAkZmggPSBGaWxlSGFuZGxlLT5uZXcoIj4gJG9sZWZpbGUiKTsKKworICAgICAgICAjIFdvcmtib29rLnBtIGFsc28gY2hlY2tzIHRoaXMgYnV0IHNvbWV0aGluZyBtYXkgaGF2ZSBoYXBwZW5lZCBzaW5jZQorICAgICAgICAjIHRoZW4uCisgICAgICAgIGlmIChub3QgZGVmaW5lZCAkZmgpIHsKKyAgICAgICAgICAgIGNyb2FrICJDYW4ndCBvcGVuICRvbGVmaWxlLiBJdCBtYXkgYmUgaW4gdXNlIG9yIHByb3RlY3RlZC5cbiI7CisgICAgICAgIH0KKworICAgICAgICAjIGJpbm1vZGUgZmlsZSB3aGV0aGVyIHBsYXRmb3JtIHJlcXVpcmVzIGl0IG9yIG5vdAorICAgICAgICBiaW5tb2RlKCRmaCk7CisKKyAgICAgICAgJHNlbGYtPntfaW50ZXJuYWxfZmh9ID0gMTsKKyAgICB9CisKKyAgICAjIFN0b3JlIGZpbGVoYW5kbGUKKyAgICAkc2VsZi0+e19maWxlaGFuZGxlfSA9ICRmaDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9zaXplKCRiaWZmc2l6ZSkKKyMKKyMgU2V0IHRoZSBzaXplIG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIE9MRSBzdHJlYW0KKyMKKyMgICAkYmlnX2Jsb2NrcyA9ICgxMDkgZGVwb3QgYmxvY2sgeCAoMTI4IC0xIG1hcmtlciB3b3JkKQorIyAgICAgICAgICAgICAgICAgLSAoMSB4IGVuZCB3b3JkcykpID0gMTM4NDIKKyMgICAkbWF4c2l6ZSAgICA9ICRiaWdfYmxvY2tzICogNTEyIGJ5dGVzID0gNzA4NzEwNAorIworc3ViIHNldF9zaXplIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJG1heHNpemUgPSA3XzA4N18xMDQ7ICMgVXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCaWcgdG8gZXhjZWVkIHRoaXMKKworICAgIGlmICgkX1swXSA+ICRtYXhzaXplKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+e19zaXplX2FsbG93ZWR9ID0gMDsKKyAgICB9CisKKyAgICAkc2VsZi0+e19iaWZmc2l6ZX0gPSAkX1swXTsKKworICAgICMgU2V0IHRoZSBtaW4gZmlsZSBzaXplIHRvIDRrIHRvIGF2b2lkIGhhdmluZyB0byB1c2Ugc21hbGwgYmxvY2tzCisgICAgaWYgKCRfWzBdID4gNDA5NikgeworICAgICAgICAkc2VsZi0+e19ib29rc2l6ZX0gPSAkX1swXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X2Jvb2tzaXplfSA9IDQwOTY7CisgICAgfQorCisgICAgcmV0dXJuICRzZWxmLT57X3NpemVfYWxsb3dlZH0gPSAxOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY3VsYXRlX3NpemVzKCkKKyMKKyMgQ2FsY3VsYXRlIHZhcmlvdXMgc2l6ZXMgbmVlZGVkIGZvciB0aGUgT0xFIHN0cmVhbQorIworc3ViIF9jYWxjdWxhdGVfc2l6ZXMgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJGRhdGFzaXplID0gJHNlbGYtPntfYm9va3NpemV9OworCisgICAgaWYgKCRkYXRhc2l6ZSAlIDUxMiA9PSAwKSB7CisgICAgICAgICRzZWxmLT57X2JpZ19ibG9ja3N9ID0gJGRhdGFzaXplLzUxMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X2JpZ19ibG9ja3N9ID0gaW50KCRkYXRhc2l6ZS81MTIpICsxOworICAgIH0KKyAgICAjIFRoZXJlIGFyZSAxMjcgbGlzdCBibG9ja3MgYW5kIDEgbWFya2VyIGJsb2NrcyBmb3IgZWFjaCBiaWcgYmxvY2sKKyAgICAjIGRlcG90ICsgMSBlbmQgb2YgY2hhaW4gYmxvY2sKKyAgICAkc2VsZi0+e19saXN0X2Jsb2Nrc30gPSBpbnQoKCRzZWxmLT57X2JpZ19ibG9ja3N9KS8xMjcpICsxOworICAgICRzZWxmLT57X3Jvb3Rfc3RhcnR9ICA9ICRzZWxmLT57X2JpZ19ibG9ja3N9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgY2xvc2UoKQorIworIyBXcml0ZSByb290IGVudHJ5LCBiaWcgYmxvY2sgbGlzdCBhbmQgY2xvc2UgdGhlIGZpbGVoYW5kbGUuCisjIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgY2xvc2UgdGhlIG9wZW4gZmlsZWhhbmRsZSB3aXRob3V0CisjIGhhdmluZyB0byB3YWl0IGZvciBERVNUUk9ZLgorIworc3ViIGNsb3NlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gaWYgbm90ICRzZWxmLT57X3NpemVfYWxsb3dlZH07CisKKyAgICAkc2VsZi0+X3dyaXRlX3BhZGRpbmcoKSAgICAgICAgICBpZiBub3QgJHNlbGYtPntfYmlmZl9vbmx5fTsKKyAgICAkc2VsZi0+X3dyaXRlX3Byb3BlcnR5X3N0b3JhZ2UoKSBpZiBub3QgJHNlbGYtPntfYmlmZl9vbmx5fTsKKyAgICAkc2VsZi0+X3dyaXRlX2JpZ19ibG9ja19kZXBvdCgpICBpZiBub3QgJHNlbGYtPntfYmlmZl9vbmx5fTsKKworICAgIG15ICRjbG9zZSA9IDE7ICMgRGVmYXVsdCB0byBubyBlcnJvciBmb3IgZXh0ZXJuYWwgZmlsZWhhbmRsZXMuCisKKyAgICAjIENsb3NlIHRoZSBmaWxlaGFuZGxlIGlmIGl0IHdhcyBjcmVhdGVkIGludGVybmFsbHkuCisgICAgJGNsb3NlID0gQ09SRTo6Y2xvc2UoJHNlbGYtPntfZmlsZWhhbmRsZX0pIGlmICRzZWxmLT57X2ludGVybmFsX2ZofTsKKworICAgICRzZWxmLT57X2ZpbGVjbG9zZWR9ID0gMTsKKworICAgIHJldHVybiAkY2xvc2U7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBERVNUUk9ZKCkKKyMKKyMgQ2xvc2UgdGhlIGZpbGVoYW5kbGUgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBleHBsaWNpdGx5IGNsb3NlZC4KKyMKK3N1YiBERVNUUk9ZIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBsb2NhbCAoJEAsICQhLCAkXkUsICQ/KTsKKworICAgICRzZWxmLT5jbG9zZSgpIHVubGVzcyAkc2VsZi0+e19maWxlY2xvc2VkfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlKCRkYXRhKQorIworIyBXcml0ZSBCSUZGIGRhdGEgdG8gT0xFIGZpbGUuCisjCitzdWIgd3JpdGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgUHJvdGVjdCBwcmludCgpIGZyb20gLWwgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBsb2NhbCAkXCA9IHVuZGVmOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gJF9bMF07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9oZWFkZXIoKQorIworIyBXcml0ZSBPTEUgaGVhZGVyIGJsb2NrLgorIworc3ViIHdyaXRlX2hlYWRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gaWYgJHNlbGYtPntfYmlmZl9vbmx5fTsKKyAgICAkc2VsZi0+X2NhbGN1bGF0ZV9zaXplcygpOworCisgICAgbXkgJHJvb3Rfc3RhcnQgICAgICA9ICRzZWxmLT57X3Jvb3Rfc3RhcnR9OworICAgIG15ICRudW1fbGlzdHMgICAgICAgPSAkc2VsZi0+e19saXN0X2Jsb2Nrc307CisKKyAgICBteSAkaWQgICAgICAgICAgICAgID0gcGFjaygiTk4iLCAgIDB4RDBDRjExRTAsIDB4QTFCMTFBRTEpOworICAgIG15ICR1bmtub3duMSAgICAgICAgPSBwYWNrKCJWVlZWIiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCk7CisgICAgbXkgJHVua25vd24yICAgICAgICA9IHBhY2soInZ2IiwgICAweDNFLCAweDAzKTsKKyAgICBteSAkdW5rbm93bjMgICAgICAgID0gcGFjaygidiIsICAgIC0yKTsKKyAgICBteSAkdW5rbm93bjQgICAgICAgID0gcGFjaygidiIsICAgIDB4MDkpOworICAgIG15ICR1bmtub3duNSAgICAgICAgPSBwYWNrKCJWVlYiLCAgMHgwNiwgMHgwMCwgMHgwMCk7CisgICAgbXkgJG51bV9iYmRfYmxvY2tzICA9IHBhY2soIlYiLCAgICAkbnVtX2xpc3RzKTsKKyAgICBteSAkcm9vdF9zdGFydGJsb2NrID0gcGFjaygiViIsICAgICRyb290X3N0YXJ0KTsKKyAgICBteSAkdW5rbm93bjYgICAgICAgID0gcGFjaygiVlYiLCAgIDB4MDAsIDB4MTAwMCk7CisgICAgbXkgJHNiZF9zdGFydGJsb2NrICA9IHBhY2soIlYiLCAgICAtMik7CisgICAgbXkgJHVua25vd243ICAgICAgICA9IHBhY2soIlZWViIsICAweDAwLCAtMiAsMHgwMCk7CisgICAgbXkgJHVudXNlZCAgICAgICAgICA9IHBhY2soIlYiLCAgICAtMSk7CisKKyAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgbG9jYWwgJFwgPSB1bmRlZjsKKworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRpZDsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkdW5rbm93bjE7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd24yOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duMzsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkdW5rbm93bjQ7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd241OworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRudW1fYmJkX2Jsb2NrczsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcm9vdF9zdGFydGJsb2NrOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duNjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkc2JkX3N0YXJ0YmxvY2s7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd243OworCisgICAgZm9yICgxLi4kbnVtX2xpc3RzKSB7CisgICAgICAgICRyb290X3N0YXJ0Kys7CisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gIHBhY2soIlYiLCAkcm9vdF9zdGFydCk7CisgICAgfQorCisgICAgZm9yICgkbnVtX2xpc3RzLi4xMDgpIHsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVudXNlZDsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfd3JpdGVfYmlnX2Jsb2NrX2RlcG90KCkKKyMKKyMgV3JpdGUgYmlnIGJsb2NrIGRlcG90LgorIworc3ViIF93cml0ZV9iaWdfYmxvY2tfZGVwb3QgeworCisgICAgbXkgJHNlbGYgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRudW1fYmxvY2tzICAgPSAkc2VsZi0+e19iaWdfYmxvY2tzfTsKKyAgICBteSAkbnVtX2xpc3RzICAgID0gJHNlbGYtPntfbGlzdF9ibG9ja3N9OworICAgIG15ICR0b3RhbF9ibG9ja3MgPSAkbnVtX2xpc3RzICoxMjg7CisgICAgbXkgJHVzZWRfYmxvY2tzICA9ICRudW1fYmxvY2tzICsgJG51bV9saXN0cyArMjsKKworICAgIG15ICRtYXJrZXIgICAgICAgPSBwYWNrKCJWIiwgLTMpOworICAgIG15ICRlbmRfb2ZfY2hhaW4gPSBwYWNrKCJWIiwgLTIpOworICAgIG15ICR1bnVzZWQgICAgICAgPSBwYWNrKCJWIiwgLTEpOworCisKKyAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgbG9jYWwgJFwgPSB1bmRlZjsKKworICAgIGZvciBteSAkaSAoMS4uJG51bV9ibG9ja3MtMSkgeworICAgICAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICBwYWNrKCJWIiwkaSk7CisgICAgfQorCisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJGVuZF9vZl9jaGFpbjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkZW5kX29mX2NoYWluOworCisgICAgZm9yICgxLi4kbnVtX2xpc3RzKSB7CisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRtYXJrZXI7CisgICAgfQorCisgICAgZm9yICgkdXNlZF9ibG9ja3MuLiR0b3RhbF9ibG9ja3MpIHsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVudXNlZDsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfd3JpdGVfcHJvcGVydHlfc3RvcmFnZSgpCisjCisjIFdyaXRlIHByb3BlcnR5IHN0b3JhZ2UuIFRPRE86IGFkZCBzdW1tYXJ5IHNoZWV0cworIworc3ViIF93cml0ZV9wcm9wZXJ0eV9zdG9yYWdlIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJvb3RzaXplID0gLTI7CisgICAgbXkgJGJvb2tzaXplID0gJHNlbGYtPntfYm9va3NpemV9OworCisgICAgIyMjIyMjIyMjIyMjIyMjIyMgIG5hbWUgICAgICAgICB0eXBlICAgZGlyIHN0YXJ0IHNpemUKKyAgICAkc2VsZi0+X3dyaXRlX3BwcygnUm9vdCBFbnRyeScsIDB4MDUsICAgMSwgICAtMiwgMHgwMCk7CisgICAgJHNlbGYtPl93cml0ZV9wcHMoJ1dvcmtib29rJywgICAweDAyLCAgLTEsIDB4MDAsICRib29rc2l6ZSk7CisgICAgJHNlbGYtPl93cml0ZV9wcHMoJycsICAgICAgICAgICAweDAwLCAgLTEsIDB4MDAsIDB4MDAwMCk7CisgICAgJHNlbGYtPl93cml0ZV9wcHMoJycsICAgICAgICAgICAweDAwLCAgLTEsIDB4MDAsIDB4MDAwMCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfd3JpdGVfcHBzKCkKKyMKKyMgV3JpdGUgcHJvcGVydHkgc2hlZXQgaW4gcHJvcGVydHkgc3RvcmFnZQorIworc3ViIF93cml0ZV9wcHMgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJG5hbWUgICAgICAgICAgICA9ICRfWzBdOworICAgIG15IEBuYW1lICAgICAgICAgICAgPSAoKTsKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMDsKKworICAgIGlmICgkbmFtZSBuZSAnJykgeworICAgICAgICAkbmFtZSAgID0gJF9bMF0gLiAiXDAiOworICAgICAgICAjIFNpbXVsYXRlIGEgVW5pY29kZSBzdHJpbmcKKyAgICAgICAgQG5hbWUgICA9IG1hcChvcmQsIHNwbGl0KCcnLCAkbmFtZSkpOworICAgICAgICAkbGVuZ3RoID0gbGVuZ3RoKCRuYW1lKSAqIDI7CisgICAgfQorCisgICAgbXkgJHJhd25hbWUgICAgICAgICA9IHBhY2soInYqIiwgQG5hbWUpOworICAgIG15ICR6ZXJvICAgICAgICAgICAgPSBwYWNrKCJDIiwgIDApOworCisgICAgbXkgJHBwc19zaXplb2ZuYW1lICA9IHBhY2soInYiLCAgJGxlbmd0aCk7ICAgICMweDQwCisgICAgbXkgJHBwc190eXBlICAgICAgICA9IHBhY2soInYiLCAgJF9bMV0pOyAgICAgICMweDQyCisgICAgbXkgJHBwc19wcmV2ICAgICAgICA9IHBhY2soIlYiLCAgLTEpOyAgICAgICAgICMweDQ0CisgICAgbXkgJHBwc19uZXh0ICAgICAgICA9IHBhY2soIlYiLCAgLTEpOyAgICAgICAgICMweDQ4CisgICAgbXkgJHBwc19kaXIgICAgICAgICA9IHBhY2soIlYiLCAgJF9bMl0pOyAgICAgICMweDRjCisKKyAgICBteSAkdW5rbm93bjEgICAgICAgID0gcGFjaygiViIsICAwKTsKKworICAgIG15ICRwcHNfdHMxcyAgICAgICAgPSBwYWNrKCJWIiwgIDApOyAgICAgICAgICAjMHg2NAorICAgIG15ICRwcHNfdHMxZCAgICAgICAgPSBwYWNrKCJWIiwgIDApOyAgICAgICAgICAjMHg2OAorICAgIG15ICRwcHNfdHMycyAgICAgICAgPSBwYWNrKCJWIiwgIDApOyAgICAgICAgICAjMHg2YworICAgIG15ICRwcHNfdHMyZCAgICAgICAgPSBwYWNrKCJWIiwgIDApOyAgICAgICAgICAjMHg3MAorICAgIG15ICRwcHNfc2IgICAgICAgICAgPSBwYWNrKCJWIiwgICRfWzNdKTsgICAgICAjMHg3NAorICAgIG15ICRwcHNfc2l6ZSAgICAgICAgPSBwYWNrKCJWIiwgICRfWzRdKTsgICAgICAjMHg3OAorCisKKyAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgbG9jYWwgJFwgPSB1bmRlZjsKKworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRyYXduYW1lOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR6ZXJvIHggKDY0IC0kbGVuZ3RoKTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3NpemVvZm5hbWU7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc190eXBlOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfcHJldjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX25leHQ7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19kaXI7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd24xIHggNTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3RzMXM7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc190czFkOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfdHMyZDsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3RzMmQ7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19zYjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3NpemU7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd24xOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3BhZGRpbmcoKQorIworIyBQYWQgdGhlIGVuZCBvZiB0aGUgZmlsZQorIworc3ViIF93cml0ZV9wYWRkaW5nIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRiaWZmc2l6ZSA9ICRzZWxmLT57X2JpZmZzaXplfTsKKyAgICBteSAkbWluX3NpemU7CisKKyAgICBpZiAoJGJpZmZzaXplIDwgNDA5NikgeworICAgICAgICAkbWluX3NpemUgPSA0MDk2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJG1pbl9zaXplID0gNTEyOworICAgIH0KKworICAgICMgUHJvdGVjdCBwcmludCgpIGZyb20gLWwgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBsb2NhbCAkXCA9IHVuZGVmOworCisgICAgaWYgKCRiaWZmc2l6ZSAlICRtaW5fc2l6ZSAhPSAwKSB7CisgICAgICAgIG15ICRwYWRkaW5nICA9ICRtaW5fc2l6ZSAtICgkYmlmZnNpemUgJSAkbWluX3NpemUpOworICAgICAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAiXDAiIHggJHBhZGRpbmc7CisgICAgfQorfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK09MRXdyaXRlciAtIEEgd3JpdGVyIGNsYXNzIHRvIHN0b3JlIEJJRkYgZGF0YSBpbiBhIE9MRSBjb21wb3VuZCBzdG9yYWdlIGZpbGUuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Qcm9wZXJ0aWVzLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Qcm9wZXJ0aWVzLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYzkzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1Byb3BlcnRpZXMucG0KQEAgLTAsMCArMSwzNTIgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlByb3BlcnRpZXM7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUHJvcGVydGllcyAtIEEgbW9kdWxlIGZvciBjcmVhdGluZyBFeGNlbCBwcm9wZXJ0eSBzZXRzLgorIworIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYS4KKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKK3VzZSBQT1NJWCAnZm1vZCc7Cit1c2UgVGltZTo6TG9jYWwgJ3RpbWVsb2NhbCc7CisKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EgQEVYUE9SVCBARVhQT1JUX09LICVFWFBPUlRfVEFHUyk7CitASVNBICAgICAgICA9IHF3KEV4cG9ydGVyKTsKKworJFZFUlNJT04gICAgPSAnMi4zNyc7CisKKyMgU2V0IHVwIHRoZSBleHBvcnRzLgorbXkgQGFsbF9mdW5jdGlvbnMgPSBxdygKKyAgICBjcmVhdGVfc3VtbWFyeV9wcm9wZXJ0eV9zZXQKKyAgICBjcmVhdGVfZG9jX3N1bW1hcnlfcHJvcGVydHlfc2V0CisgICAgX3BhY2tfcHJvcGVydHlfZGF0YQorICAgIF9wYWNrX1ZUX0kyCisgICAgX3BhY2tfVlRfTFBTVFIKKyAgICBfcGFja19WVF9GSUxFVElNRQorKTsKKworbXkgQHBwc19zdW1tYXJpZXMgPSBxdygKKyAgICBjcmVhdGVfc3VtbWFyeV9wcm9wZXJ0eV9zZXQKKyAgICBjcmVhdGVfZG9jX3N1bW1hcnlfcHJvcGVydHlfc2V0CispOworCitARVhQT1JUICAgICAgICAgPSAoKTsKK0BFWFBPUlRfT0sgICAgICA9IChAYWxsX2Z1bmN0aW9ucyk7CislRVhQT1JUX1RBR1MgICAgPSAodGVzdGluZyAgICAgICAgICA9PiBcQGFsbF9mdW5jdGlvbnMsCisgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfc2V0cyAgICA9PiBcQHBwc19zdW1tYXJpZXMsCisgICAgICAgICAgICAgICAgICApOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgY3JlYXRlX3N1bW1hcnlfcHJvcGVydHlfc2V0KCkuCisjCisjIENyZWF0ZSB0aGUgU3VtbWFyeUluZm9ybWF0aW9uIHByb3BlcnR5IHNldC4gVGhpcyBpcyBtYWlubHkgdXNlZCBmb3IgdGhlCisjIFRpdGxlLCBTdWJqZWN0LCBBdXRob3IsIEtleXdvcmRzLCBDb21tZW50cywgTGFzdCBhdXRob3Iga2V5d29yZHMgYW5kIHRoZQorIyBjcmVhdGlvbiBkYXRlLgorIworc3ViIGNyZWF0ZV9zdW1tYXJ5X3Byb3BlcnR5X3NldCB7CisKKyAgICBteSBAcHJvcGVydGllcyAgICAgICAgICA9IEB7JF9bMF19OworCisgICAgbXkgJGJ5dGVfb3JkZXIgICAgICAgICAgPSBwYWNrICd2JywgIDB4RkZGRTsKKyAgICBteSAkdmVyc2lvbiAgICAgICAgICAgICA9IHBhY2sgJ3YnLCAgMHgwMDAwOworICAgIG15ICRzeXN0ZW1faWQgICAgICAgICAgID0gcGFjayAnVicsICAweDAwMDIwMTA1OworICAgIG15ICRjbGFzc19pZCAgICAgICAgICAgID0gcGFjayAnSConLCAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnOworICAgIG15ICRudW1fcHJvcGVydHlfc2V0cyAgID0gcGFjayAnVicsICAweDAwMDE7CisgICAgbXkgJGZvcm1hdF9pZCAgICAgICAgICAgPSBwYWNrICdIKicsICdFMDg1OUZGMkY5NEY2ODEwQUI5MTA4MDAyQjI3QjNEOSc7CisgICAgbXkgJG9mZnNldCAgICAgICAgICAgICAgPSBwYWNrICdWJywgIDB4MDAzMDsKKyAgICBteSAkbnVtX3Byb3BlcnR5ICAgICAgICA9IHBhY2sgJ1YnLCAgc2NhbGFyIEBwcm9wZXJ0aWVzOworICAgIG15ICRwcm9wZXJ0eV9vZmZzZXRzICAgID0gJyc7CisKKyAgICAjIENyZWF0ZSB0aGUgcHJvcGVydHkgc2V0IGRhdGEgYmxvY2sgYW5kIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0cyBpbnRvIGl0LgorICAgIG15ICgkcHJvcGVydHlfZGF0YSwgJG9mZnNldHMpID0gX3BhY2tfcHJvcGVydHlfZGF0YShcQHByb3BlcnRpZXMpOworCisgICAgIyBDcmVhdGUgdGhlIHByb3BlcnR5IHR5cGUgYW5kIG9mZnNldHMgYmFzZWQgb24gdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uLgorICAgIGZvciBteSAkaSAoMCAuLiBAcHJvcGVydGllcyAtMSkgeworICAgICAgICAkcHJvcGVydHlfb2Zmc2V0cyAuPSBwYWNrKCdWVicsICRwcm9wZXJ0aWVzWyRpXS0+WzBdLCAkb2Zmc2V0cy0+WyRpXSk7CisgICAgfQorCisgICAgIyBTaXplIG9mICRzaXplICg0IGJ5dGVzKSArICAkbnVtX3Byb3BlcnR5ICg0IGJ5dGVzKSArIHRoZSBkYXRhIHN0cnVjdHVyZXMuCisgICAgbXkgJHNpemUgPSA4ICsgbGVuZ3RoKCRwcm9wZXJ0eV9vZmZzZXRzKSArIGxlbmd0aCgkcHJvcGVydHlfZGF0YSk7CisgICAgICAgJHNpemUgPSBwYWNrICdWJywgICRzaXplOworCisKKyAgICByZXR1cm4gICRieXRlX29yZGVyICAgICAgICAgLgorICAgICAgICAgICAgJHZlcnNpb24gICAgICAgICAgICAuCisgICAgICAgICAgICAkc3lzdGVtX2lkICAgICAgICAgIC4KKyAgICAgICAgICAgICRjbGFzc19pZCAgICAgICAgICAgLgorICAgICAgICAgICAgJG51bV9wcm9wZXJ0eV9zZXRzICAuCisgICAgICAgICAgICAkZm9ybWF0X2lkICAgICAgICAgIC4KKyAgICAgICAgICAgICRvZmZzZXQgICAgICAgICAgICAgLgorICAgICAgICAgICAgJHNpemUgICAgICAgICAgICAgICAuCisgICAgICAgICAgICAkbnVtX3Byb3BlcnR5ICAgICAgIC4KKyAgICAgICAgICAgICRwcm9wZXJ0eV9vZmZzZXRzICAgLgorICAgICAgICAgICAgJHByb3BlcnR5X2RhdGE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDcmVhdGUgdGhlIERvY1N1bW1hcnlJbmZvcm1hdGlvbiBwcm9wZXJ0eSBzZXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgZm9yIHRoZQorIyBNYW5hZ2VyLCBDb21wYW55IGFuZCBDYXRlZ29yeSBrZXl3b3Jkcy4KKyMKKyMgVGhlIERvY1N1bW1hcnkgYWxzbyBjb250YWlucyBhIHN0cmVhbSBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMuIEhvd2V2ZXIKKyMgdGhpcyBpcyBhIGxpdHRsZSBhcmNhbmUgYW5kIHByb2JhYmx5IG5vdCB3b3J0aCB0aGUgaW1wbGVtZW50YXRpb24gZWZmb3J0LgorIworc3ViIGNyZWF0ZV9kb2Nfc3VtbWFyeV9wcm9wZXJ0eV9zZXQgeworCisgICAgbXkgQHByb3BlcnRpZXMgICAgICAgICAgPSBAeyRfWzBdfTsKKworICAgIG15ICRieXRlX29yZGVyICAgICAgICAgID0gcGFjayAndicsICAweEZGRkU7CisgICAgbXkgJHZlcnNpb24gICAgICAgICAgICAgPSBwYWNrICd2JywgIDB4MDAwMDsKKyAgICBteSAkc3lzdGVtX2lkICAgICAgICAgICA9IHBhY2sgJ1YnLCAgMHgwMDAyMDEwNTsKKyAgICBteSAkY2xhc3NfaWQgICAgICAgICAgICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJzsKKyAgICBteSAkbnVtX3Byb3BlcnR5X3NldHMgICA9IHBhY2sgJ1YnLCAgMHgwMDAyOworCisgICAgbXkgJGZvcm1hdF9pZF8wICAgICAgICAgPSBwYWNrICdIKicsICcwMkQ1Q0RENTlDMkUxQjEwOTM5NzA4MDAyQjJDRjlBRSc7CisgICAgbXkgJGZvcm1hdF9pZF8xICAgICAgICAgPSBwYWNrICdIKicsICcwNUQ1Q0RENTlDMkUxQjEwOTM5NzA4MDAyQjJDRjlBRSc7CisgICAgbXkgJG9mZnNldF8wICAgICAgICAgICAgPSBwYWNrICdWJywgIDB4MDA0NDsKKyAgICBteSAkbnVtX3Byb3BlcnR5XzAgICAgICA9IHBhY2sgJ1YnLCAgc2NhbGFyIEBwcm9wZXJ0aWVzOworICAgIG15ICRwcm9wZXJ0eV9vZmZzZXRzXzAgID0gJyc7CisKKyAgICAjIENyZWF0ZSB0aGUgcHJvcGVydHkgc2V0IGRhdGEgYmxvY2sgYW5kIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0cyBpbnRvIGl0LgorICAgIG15ICgkcHJvcGVydHlfZGF0YV8wLCAkb2Zmc2V0cykgPSBfcGFja19wcm9wZXJ0eV9kYXRhKFxAcHJvcGVydGllcyk7CisKKyAgICAjIENyZWF0ZSB0aGUgcHJvcGVydHkgdHlwZSBhbmQgb2Zmc2V0cyBiYXNlZCBvbiB0aGUgcHJldmlvdXMgY2FsY3VsYXRpb24uCisgICAgZm9yIG15ICRpICgwIC4uIEBwcm9wZXJ0aWVzIC0xKSB7CisgICAgICAgICRwcm9wZXJ0eV9vZmZzZXRzXzAgLj0gcGFjaygnVlYnLCAkcHJvcGVydGllc1skaV0tPlswXSwgJG9mZnNldHMtPlskaV0pOworICAgIH0KKworICAgICMgU2l6ZSBvZiAkc2l6ZSAoNCBieXRlcykgKyAgJG51bV9wcm9wZXJ0eSAoNCBieXRlcykgKyB0aGUgZGF0YSBzdHJ1Y3R1cmVzLgorICAgIG15ICRkYXRhX2xlbiA9IDggKyBsZW5ndGgoJHByb3BlcnR5X29mZnNldHNfMCkgKyBsZW5ndGgoJHByb3BlcnR5X2RhdGFfMCk7CisgICAgbXkgJHNpemVfMCAgID0gcGFjayAnVicsICAkZGF0YV9sZW47CisKKworICAgICMgVGhlIHNlY29uZCBwcm9wZXJ0eSBzZXQgb2Zmc2V0IGlzIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IHByb3BlcnR5IHNldC4KKyAgICBteSAkb2Zmc2V0XzEgPSBwYWNrICdWJywgIDB4MDA0NCArICRkYXRhX2xlbjsKKworICAgICMgV2Ugd2lsbCB1c2UgYSBzdGF0aWMgcHJvcGVydHkgc2V0IHN0cmVhbSByYXRoZXIgdGhhbiB0cnkgdG8gZ2VuZXJhdGUgaXQuCisgICAgbXkgJHByb3BlcnR5X2RhdGFfMSA9IHBhY2sgJ0gqJywgam9pbiAnJywgcXcgKAorICAgICAgICA5OCAwMCAwMCAwMCAwMyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAyMCAwMCAwMCAwMAorICAgICAgICAwMSAwMCAwMCAwMCAzNiAwMCAwMCAwMCAwMiAwMCAwMCAwMCAzRSAwMCAwMCAwMAorICAgICAgICAwMSAwMCAwMCAwMCAwMiAwMCAwMCAwMCAwQSAwMCAwMCAwMCA1RiA1MCA0OSA0NAorICAgICAgICA1RiA0NyA1NSA0OSA0NCAwMCAwMiAwMCAwMCAwMCBFNCAwNCAwMCAwMCA0MSAwMAorICAgICAgICAwMCAwMCA0RSAwMCAwMCAwMCA3QiAwMCAzMSAwMCAzNiAwMCA0MyAwMCAzNCAwMAorICAgICAgICA0MiAwMCAzOCAwMCAzMyAwMCA0MiAwMCAyRCAwMCAzOSAwMCAzNiAwMCAzNSAwMAorICAgICAgICA0NiAwMCAyRCAwMCAzNCAwMCA0MiAwMCAzMiAwMCAzMSAwMCAyRCAwMCAzOSAwMAorICAgICAgICAzMCAwMCAzMyAwMCA0NCAwMCAyRCAwMCAzOSAwMCAzMSAwMCAzMCAwMCA0NiAwMAorICAgICAgICA0MSAwMCA0NCAwMCA0NiAwMCA0MSAwMCAzNyAwMCAzMCAwMCAzMSAwMCA0MiAwMAorICAgICAgICA3RCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAyRCAwMCAzOSAwMCAzMCAwMCAzMyAwMAorICAgICk7CisKKworICAgIHJldHVybiAgJGJ5dGVfb3JkZXIgICAgICAgICAuCisgICAgICAgICAgICAkdmVyc2lvbiAgICAgICAgICAgIC4KKyAgICAgICAgICAgICRzeXN0ZW1faWQgICAgICAgICAgLgorICAgICAgICAgICAgJGNsYXNzX2lkICAgICAgICAgICAuCisgICAgICAgICAgICAkbnVtX3Byb3BlcnR5X3NldHMgIC4KKyAgICAgICAgICAgICRmb3JtYXRfaWRfMCAgICAgICAgLgorICAgICAgICAgICAgJG9mZnNldF8wICAgICAgICAgICAuCisgICAgICAgICAgICAkZm9ybWF0X2lkXzEgICAgICAgIC4KKyAgICAgICAgICAgICRvZmZzZXRfMSAgICAgICAgICAgLgorCisgICAgICAgICAgICAkc2l6ZV8wICAgICAgICAgICAgIC4KKyAgICAgICAgICAgICRudW1fcHJvcGVydHlfMCAgICAgLgorICAgICAgICAgICAgJHByb3BlcnR5X29mZnNldHNfMCAuCisgICAgICAgICAgICAkcHJvcGVydHlfZGF0YV8wICAgIC4KKworICAgICAgICAgICAgJHByb3BlcnR5X2RhdGFfMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX3Byb3BlcnR5X2RhdGEoKS4KKyMKKyMgQ3JlYXRlIGEgcGFja2VkIHByb3BlcnR5IHNldCBzdHJ1Y3R1cmUuIFN0cmluZ3MgYXJlIG51bGwgdGVybWluYXRlZCBhbmQKKyMgcGFkZGVkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LiBXZSBhbHNvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGtlZXAgdHJhY2sgb2YgdGhlCisjIHByb3BlcnR5IG9mZnNldHMgd2l0aGluIHRoZSBkYXRhIHN0cnVjdHVyZS4gVGhlc2Ugb2Zmc2V0cyBhcmUgdXNlZCBieSB0aGUKKyMgY2FsbGluZyBmdW5jdGlvbnMuIEN1cnJlbnRseSB3ZSBvbmx5IG5lZWQgdG8gaGFuZGxlIDQgcHJvcGVydHkgdHlwZXM6CisjIFZUX0kyLCBWVF9MUFNUUiwgVlRfRklMRVRJTUUuCisjCitzdWIgX3BhY2tfcHJvcGVydHlfZGF0YSB7CisKKyAgICBteSBAcHJvcGVydGllcyAgICAgICAgICA9IEB7JF9bMF19OworICAgIG15ICRvZmZzZXQgICAgICAgICAgICAgID0gJF9bMV0gfHwgMDsKKyAgICBteSAkcGFja2VkX3Byb3BlcnR5ICAgICA9ICcnOworICAgIG15ICRkYXRhICAgICAgICAgICAgICAgID0gJyc7CisgICAgbXkgQG9mZnNldHM7CisKKyAgICAjIEdldCB0aGUgc3RyaW5ncyBjb2RlcGFnZSBmcm9tIHRoZSBmaXJzdCBwcm9wZXJ0eS4KKyAgICBteSAkY29kZXBhZ2UgPSAkcHJvcGVydGllc1swXS0+WzJdOworCisgICAgIyBUaGUgcHJvcGVydGllcyBzdGFydCBhZnRlciA4IGJ5dGVzIGZvciBzaXplICsgbnVtX3Byb3BlcnRpZXMgKyA4IGJ5dGVzCisgICAgIyBmb3IgZWFjaCBwcm9wZXR5IHR5cGUvb2Zmc2V0IHBhaXIuCisgICAgJG9mZnNldCArPSA4ICogKEBwcm9wZXJ0aWVzICsgMSk7CisKKyAgICBmb3IgbXkgJHByb3BlcnR5IChAcHJvcGVydGllcykgeworICAgICAgICBwdXNoIEBvZmZzZXRzLCAkb2Zmc2V0OworCisgICAgICAgIG15ICRwcm9wZXJ0eV90eXBlID0gJHByb3BlcnR5LT5bMV07CisKKyAgICAgICAgaWYgICAgKCRwcm9wZXJ0eV90eXBlIGVxICdWVF9JMicpIHsKKyAgICAgICAgICAgICRwYWNrZWRfcHJvcGVydHkgPSBfcGFja19WVF9JMigkcHJvcGVydHktPlsyXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRwcm9wZXJ0eV90eXBlIGVxICdWVF9MUFNUUicpIHsKKyAgICAgICAgICAgICRwYWNrZWRfcHJvcGVydHkgPSBfcGFja19WVF9MUFNUUigkcHJvcGVydHktPlsyXSwgJGNvZGVwYWdlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJHByb3BlcnR5X3R5cGUgZXEgJ1ZUX0ZJTEVUSU1FJykgeworICAgICAgICAgICAgJHBhY2tlZF9wcm9wZXJ0eSA9IF9wYWNrX1ZUX0ZJTEVUSU1FKCRwcm9wZXJ0eS0+WzJdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNyb2FrICJVbmtub3duIHByb3BlcnR5IHR5cGU6ICRwcm9wZXJ0eV90eXBlXG4iOworICAgICAgICB9CisKKyAgICAgICAgJG9mZnNldCArPSBsZW5ndGggJHBhY2tlZF9wcm9wZXJ0eTsKKyAgICAgICAgJGRhdGEgICAuPSAkcGFja2VkX3Byb3BlcnR5OworICAgIH0KKworICAgIHJldHVybiAkZGF0YSwgXEBvZmZzZXRzOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfVlRfSTIoKS4KKyMKKyMgUGFjayBhbiBPTEUgcHJvcGVydHkgdHlwZTogVlRfSTIsIDE2LWJpdCBzaWduZWQgaW50ZWdlci4KKyMKK3N1YiBfcGFja19WVF9JMiB7CisKKyAgICBteSAkdHlwZSAgICA9IDB4MDAwMjsKKyAgICBteSAkdmFsdWUgICA9ICRfWzBdOworCisgICAgbXkgJGRhdGEgPSBwYWNrICdWVicsICR0eXBlLCAkdmFsdWU7CisKKyAgICByZXR1cm4gJGRhdGE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19WVF9MUFNUUigpLgorIworIyBQYWNrIGFuIE9MRSBwcm9wZXJ0eSB0eXBlOiBWVF9MUFNUUiwgU3RyaW5nIGluIHRoZSBDb2RlcGFnZSBlbmNvZGluZy4KKyMgVGhlIHN0cmluZ3MgYXJlIG51bGwgdGVybWluYXRlZCBhbmQgcGFkZGVkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgorIworc3ViIF9wYWNrX1ZUX0xQU1RSIHsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4MDAxRTsKKyAgICBteSAkc3RyaW5nICAgICAgPSAkX1swXSAuICJcMCI7CisgICAgbXkgJGNvZGVwYWdlICAgID0gJF9bMV07CisgICAgbXkgJGxlbmd0aDsKKyAgICBteSAkYnl0ZV9zdHJpbmc7CisKKyAgICBpZiAoJGNvZGVwYWdlID09IDB4MDRFNCkgeworICAgICAgICAjIExhdGluMQorICAgICAgICAkYnl0ZV9zdHJpbmcgPSAkc3RyaW5nOworICAgICAgICAkbGVuZ3RoICAgICAgPSBsZW5ndGggJGJ5dGVfc3RyaW5nOworICAgIH0KKyAgICBlbHNpZiAoJGNvZGVwYWdlID09IDB4RkRFOSkgeworICAgICAgICAjIFVURi04CisgICAgICAgIGlmICggJF0gPiA1LjAwOCApIHsKKyAgICAgICAgICAgIHJlcXVpcmUgRW5jb2RlOworICAgICAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyaW5nKSkgeworICAgICAgICAgICAgICAgICRieXRlX3N0cmluZyA9IEVuY29kZTo6ZW5jb2RlX3V0ZjgoJHN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkYnl0ZV9zdHJpbmcgPSAkc3RyaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJGJ5dGVfc3RyaW5nID0gJHN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgICRsZW5ndGggPSBsZW5ndGggJGJ5dGVfc3RyaW5nOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY3JvYWsgIlVua25vd24gY29kZXBhZ2U6ICRjb2RlcGFnZVxuIjsKKyAgICB9CisKKyAgICAjIFBhY2sgdGhlIGRhdGEuCisgICAgbXkgJGRhdGEgID0gcGFjayAnVlYnLCAkdHlwZSwgJGxlbmd0aDsKKyAgICAgICAkZGF0YSAuPSAkYnl0ZV9zdHJpbmc7CisKKyAgICAjIFRoZSBwYWNrZWQgZGF0YSBoYXMgdG8gbnVsbCBwYWRkZWQgdG8gYSA0IGJ5dGUgYm91bmRhcnkuCisgICAgaWYgKG15ICRleHRyYSA9ICRsZW5ndGggJSA0KSB7CisgICAgICAgICRkYXRhIC49ICJcMCIgeCAoNCAtICRleHRyYSk7CisgICAgfQorCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfVlRfRklMRVRJTUUoKS4KKyMKKyMgUGFjayBhbiBPTEUgcHJvcGVydHkgdHlwZTogVlRfRklMRVRJTUUuCisjCitzdWIgX3BhY2tfVlRfRklMRVRJTUUgeworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHgwMDQwOworICAgIG15ICRsb2NhbHRpbWUgICA9ICRfWzBdOworCisgICAgIyBDb252ZXJ0IGZyb20gbG9jYWx0aW1lIHRvIHNlY29uZHMuCisgICAgbXkgJHNlY29uZHMgPSBUaW1lOjpMb2NhbDo6dGltZWxvY2FsKEB7JGxvY2FsdGltZX0pOworCisgICAgIyBBZGQgdGhlIG51bWJlciBvZiBzZWNvbmRzIGJldHdlZW4gdGhlIDE2MDEgYW5kIDE5NzAgZXBvY2hzLgorICAgICRzZWNvbmRzICs9IDExNjQ0NDczNjAwOworCisgICAgIyBUaGUgRklMRVRJTUUgc2Vjb25kcyBhcmUgaW4gdW5pdHMgb2YgMTAwIG5hbm9zZWNvbmRzLgorICAgIG15ICRuYW5vc2Vjb25kcyA9ICRzZWNvbmRzICogMUU3OworCisgICAgIyBQYWNrIHRoZSB0b3RhbCBuYW5vc2Vjb25kcyBpbnRvIDY0IGJpdHMuCisgICAgbXkgJHRpbWVfaGkgPSBpbnQoJG5hbm9zZWNvbmRzIC8gMioqMzIpOworICAgIG15ICR0aW1lX2xvID0gUE9TSVg6OmZtb2QoJG5hbm9zZWNvbmRzLCAyKiozMik7CisKKyAgICBteSAkZGF0YSA9IHBhY2sgJ1ZWVicsICR0eXBlLCAkdGltZV9sbywgJHRpbWVfaGk7CisKKyAgICByZXR1cm4gJGRhdGE7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworUHJvcGVydGllcyAtIEEgbW9kdWxlIGZvciBjcmVhdGluZyBFeGNlbCBwcm9wZXJ0eSBzZXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBDPHNldF9wcm9wZXJ0aWVzKCk+IG1ldGhvZCBpbiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbi4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1V0aWxpdHkucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1V0aWxpdHkucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MTdlNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvVXRpbGl0eS5wbQpAQCAtMCwwICsxLDkzOCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBVdGlsaXR5IC0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OwordXNlIGF1dG91c2UgJ0RhdGU6OkNhbGMnICA9PiBxdyhEZWx0YV9ESE1TIERlY29kZV9EYXRlX0VVIERlY29kZV9EYXRlX1VTKTsKK3VzZSBhdXRvdXNlICdEYXRlOjpNYW5pcCcgPT4gcXcoUGFyc2VEYXRlIERhdGVfSW5pdCk7CisKKworIyBEbyBhbGwgb2YgdGhlIGV4cG9ydCBwcmVwYXJhdGlvbgordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSBARVhQT1JUIEBFWFBPUlRfT0sgJUVYUE9SVF9UQUdTKTsKKworIyBSb3cgYW5kIGNvbHVtbiBmdW5jdGlvbnMKK215IEByb3djb2wgICAgICA9IHF3KAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfcm93Y29sX3RvX2NlbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX2NlbGxfdG9fcm93Y29sCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9yYW5nZV9mb3JtdWxhCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9pbmNfcm93CisgICAgICAgICAgICAgICAgICAgICAgICB4bF9kZWNfcm93CisgICAgICAgICAgICAgICAgICAgICAgICB4bF9pbmNfY29sCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9kZWNfY29sCisgICAgICAgICAgICAgICAgICAgICk7CisKKyMgRGF0ZSBhbmQgVGltZSBmdW5jdGlvbnMKK215IEBkYXRlcyAgICAgICA9IHF3KAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGF0ZV9saXN0CisgICAgICAgICAgICAgICAgICAgICAgICB4bF9kYXRlXzE5MDQKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX3BhcnNlX3RpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX3BhcnNlX2RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX3BhcnNlX2RhdGVfaW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGVjb2RlX2RhdGVfRVUKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX2RlY29kZV9kYXRlX1VTCisgICAgICAgICAgICAgICAgICAgICk7CisKKworQElTQSAgICAgICAgICAgID0gcXcoRXhwb3J0ZXIpOworQEVYUE9SVF9PSyAgICAgID0gICAoKTsKK0BFWFBPUlQgICAgICAgICA9ICAgKEByb3djb2wsIEBkYXRlcyk7CislRVhQT1JUX1RBR1MgICAgPSAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd2NvbCAgPT4gXEByb3djb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRlcyAgID0+IFxAZGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgKTsKKworJFZFUlNJT04gICAgICAgID0gJzIuMzcnOworCisKKworCis9aGVhZDEgTkFNRQorCitVdGlsaXR5IC0gSGVscGVyIGZ1bmN0aW9ucyBmb3IgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9aGVhZDEgU1lOT1BTSVMKKworRnVuY3Rpb25zIHRvIGhlbHAgd2l0aCBzb21lIGNvbW1vbiB0YXNrcyB3aGVuIHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitUaGVzZSBmdW5jdGlvbnMgbWFpbmx5IHJlbGF0ZSB0byBkZWFsaW5nIHdpdGggcm93cyBhbmQgY29sdW1ucyBpbiBBMSBub3RhdGlvbiBhbmQgdG8gaGFuZGxpbmcgZGF0ZXMgYW5kIHRpbWVzLgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OyAgICAgICAgICAgICAgICMgSW1wb3J0IGV2ZXJ5dGhpbmcKKworICAgICgkcm93LCAkY29sKSAgICA9IHhsX2NlbGxfdG9fcm93Y29sKCdDMicpOyAgICAgICAgICAjICgxLCAyKQorICAgICRzdHIgICAgICAgICAgICA9IHhsX3Jvd2NvbF90b19jZWxsKDEsIDIpOyAgICAgICAgICAjIEMyCisgICAgJHN0ciAgICAgICAgICAgID0geGxfaW5jX2NvbCgnWjEnICApOyAgICAgICAgICAgICAgICMgQUExCisgICAgJHN0ciAgICAgICAgICAgID0geGxfZGVjX2NvbCgnQUExJyApOyAgICAgICAgICAgICAgICMgWjEKKworICAgICRkYXRlICAgICAgICAgICA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAxKTsgICAgICAgICAjIDM3MjU3CisgICAgJGRhdGUgICAgICAgICAgID0geGxfcGFyc2VfZGF0ZSgiMTEgSnVseSAxOTk3Iik7ICAgICMgMzU2MjIKKyAgICAkdGltZSAgICAgICAgICAgPSB4bF9wYXJzZV90aW1lKCczOjIxOjM2IFBNJyk7ICAgICAgIyAwLjY0CisgICAgJGRhdGUgICAgICAgICAgID0geGxfZGVjb2RlX2RhdGVfRVUoIjEzIE1heSAyMDAyIik7ICMgMzczODkKKworCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyB0byBoZWxwIHdpdGggc29tZSBjb21tb24gdGFza3MgZW5jb3VudGVyZWQgd2hlbiB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLiBUaGUgdHdvIG1haW4gY2F0ZWdvcmllcyBvZiBmdW5jdGlvbiBhcmU6CisKK1JvdyBhbmQgY29sdW1uIGZ1bmN0aW9uczogdGhlc2UgYXJlIHVzZWQgdG8gZGVhbCB3aXRoIEV4Y2VsJ3MgQTEgcmVwcmVzZW50YXRpb24gb2YgY2VsbHMuIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBjYXRlZ29yeSBhcmU6CisKKyAgICB4bF9yb3djb2xfdG9fY2VsbAorICAgIHhsX2NlbGxfdG9fcm93Y29sCisgICAgeGxfcmFuZ2VfZm9ybXVsYQorICAgIHhsX2luY19yb3cKKyAgICB4bF9kZWNfcm93CisgICAgeGxfaW5jX2NvbAorICAgIHhsX2RlY19jb2wKKworRGF0ZSBhbmQgVGltZSBmdW5jdGlvbnM6IHRoZXNlIGFyZSB1c2VkIHRvIGNvbnZlcnQgZGF0ZXMgYW5kIHRpbWVzIHRvIHRoZSBudW1lcmljIGZvcm1hdCB1c2VkIGJ5IEV4Y2VsLiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgY2F0ZWdvcnkgYXJlOgorCisgICAgeGxfZGF0ZV9saXN0CisgICAgeGxfZGF0ZV8xOTA0CisgICAgeGxfcGFyc2VfdGltZQorICAgIHhsX3BhcnNlX2RhdGUKKyAgICB4bF9wYXJzZV9kYXRlX2luaXQKKyAgICB4bF9kZWNvZGVfZGF0ZV9FVQorICAgIHhsX2RlY29kZV9kYXRlX1VTCisKK0FsbCBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsIHlvdSBjYW4gdXNlIGltcG9ydCBsaXN0cyBpZiB5b3Ugd2lzaCB0byBsaW1pdCB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGltcG9ydGVkOgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OyAgICAgICAgICAgICAgICAgICMgSW1wb3J0IGV2ZXJ5dGhpbmcKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHkgcXcoeGxfZGF0ZV9saXN0KTsgIyB4bF9kYXRlX2xpc3Qgb25seQorICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eSBxdyg6cm93Y29sKTsgICAgICAjIFJvdy9jb2wgZnVuY3Rpb25zCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5IHF3KDpkYXRlcyk7ICAgICAgICMgRGF0ZSBmdW5jdGlvbnMKKworCisKKz1oZWFkMSBST1cgQU5EIENPTFVNTiBGVU5DVElPTlMKKworCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBzdXBwb3J0cyB0d28gZm9ybXMgb2Ygbm90YXRpb24gdG8gZGVzaWduYXRlIHRoZSBwb3NpdGlvbiBvZiBjZWxsczogUm93LWNvbHVtbiBub3RhdGlvbiBhbmQgQTEgbm90YXRpb24uCisKK1Jvdy1jb2x1bW4gbm90YXRpb24gdXNlcyBhIHplcm8gYmFzZWQgaW5kZXggZm9yIGJvdGggcm93IGFuZCBjb2x1bW4gd2hpbGUgQTEgbm90YXRpb24gdXNlcyB0aGUgc3RhbmRhcmQgRXhjZWwgYWxwaGFudW1lcmljIHNlcXVlbmNlIG9mIGNvbHVtbiBsZXR0ZXIgYW5kIDEtYmFzZWQgcm93LiBDb2x1bW5zIHJhbmdlIGZyb20gQSB0byBJViBpLmUuIDAgdG8gMjU1LCByb3dzIHJhbmdlIGZyb20gMSB0byAxNjM4NCBpbiBFeGNlbCA1IGFuZCA2NTUzNiBpbiBFeGNlbCA5Ny4gRm9yIGV4YW1wbGU6CisKKyAgICAoMCwgMCkgICAgICAjIFRoZSB0b3AgbGVmdCBjZWxsIGluIHJvdy1jb2x1bW4gbm90YXRpb24uCisgICAgKCdBMScpICAgICAgIyBUaGUgdG9wIGxlZnQgY2VsbCBpbiBBMSBub3RhdGlvbi4KKworICAgICgxOTk5LCAyOSkgICMgUm93LWNvbHVtbiBub3RhdGlvbi4KKyAgICAoJ0FEMjAwMCcpICAjIFRoZSBzYW1lIGNlbGwgaW4gQTEgbm90YXRpb24uCisKK1Jvdy1jb2x1bW4gbm90YXRpb24gaXMgdXNlZnVsIGlmIHlvdSBhcmUgcmVmZXJyaW5nIHRvIGNlbGxzIHByb2dyYW1tYXRpY2FsbHk6CisKKyAgICBmb3IgbXkgJGkgKDAgLi4gOSkgeworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkaSwgMCwgJ0hlbGxvJyk7ICMgQ2VsbHMgQTEgdG8gQTEwCisgICAgfQorCitBMSBub3RhdGlvbiBpcyB1c2VmdWwgZm9yIHNldHRpbmcgdXAgYSB3b3Jrc2hlZXQgbWFudWFsbHkgYW5kIGZvciB3b3JraW5nIHdpdGggZm9ybXVsYXM6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDEnLCAyMDApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdIMicsICc9SDcrMScpOworCitUaGUgZnVuY3Rpb25zIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgY2FuIGJlIHVzZWQgZm9yIGRlYWxpbmcgd2l0aCBBMSBub3RhdGlvbiwgZm9yIGV4YW1wbGU6CisKKyAgICAoJHJvdywgJGNvbCkgICAgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnQzInKTsgICMgKDEsIDIpCisgICAgJHN0ciAgICAgICAgICAgID0geGxfcm93Y29sX3RvX2NlbGwoMSwgMik7ICAjIEMyCisKKworQ2VsbCByZWZlcmVuY2VzIGluIEV4Y2VsIGNhbiBiZSBlaXRoZXIgcmVsYXRpdmUgb3IgYWJzb2x1dGUuIEFic29sdXRlIHJlZmVyZW5jZXMgYXJlIHByZWZpeGVkIGJ5IHRoZSBkb2xsYXIgc3ltYm9sIGFzIHNob3duIGJlbG93OgorCisgICAgQTEgICAgICAjIENvbHVtbiBhbmQgcm93IGFyZSByZWxhdGl2ZQorICAgICRBMSAgICAgIyBDb2x1bW4gaXMgYWJzb2x1dGUgYW5kIHJvdyBpcyByZWxhdGl2ZQorICAgIEEkMSAgICAgIyBDb2x1bW4gaXMgcmVsYXRpdmUgYW5kIHJvdyBpcyBhYnNvbHV0ZQorICAgICRBJDEgICAgIyBDb2x1bW4gYW5kIHJvdyBhcmUgYWJzb2x1dGUKKworQW4gYWJzb2x1dGUgcmVmZXJlbmNlIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGUgY2VsbCBpcyBjb3BpZWQuIFJlZmVyIHRvIHRoZSBFeGNlbCBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHMuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzdXBwb3J0IGFic29sdXRlIHJlZmVyZW5jZXMuCisKKz1jdXQKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnNvbHV0ZSwgJGNvbF9hYnNvbHV0ZSkKKworICAgIFBhcmFtZXRlcnM6ICRyb3c6ICAgICAgICAgICBJbnRlZ2VyCisgICAgICAgICAgICAgICAgJGNvbDogICAgICAgICAgIEludGVnZXIKKyAgICAgICAgICAgICAgICAkcm93X2Fic29sdXRlOiAgQm9vbGVhbiAoMS8wKSBbb3B0aW9uYWwsIGRlZmF1bHQgaXMgMF0KKyAgICAgICAgICAgICAgICAkY29sX2Fic29sdXRlOiAgQm9vbGVhbiAoMS8wKSBbb3B0aW9uYWwsIGRlZmF1bHQgaXMgMF0KKworICAgIFJldHVybnM6ICAgIEEgc3RyaW5nIGluIEExIGNlbGwgbm90YXRpb24KKworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgemVybyBiYXNlZCByb3cgYW5kIGNvbHVtbiBjZWxsIHJlZmVyZW5jZSB0byBhIEExIHN0eWxlIHN0cmluZzoKKworICAgICRzdHIgPSB4bF9yb3djb2xfdG9fY2VsbCgwLCAwKTsgIyBBMQorICAgICRzdHIgPSB4bF9yb3djb2xfdG9fY2VsbCgwLCAxKTsgIyBCMQorICAgICRzdHIgPSB4bF9yb3djb2xfdG9fY2VsbCgxLCAwKTsgIyBBMgorCisKK1RoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIEM8JHJvd19hYnNvbHV0ZT4gYW5kIEM8JGNvbF9hYnNvbHV0ZT4gY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgaWYgdGhlIHJvdyBvciBjb2x1bW4gaXMgYWJzb2x1dGU6CisKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMCwgMCwgMCwgMSk7ICMgJEExCisgICAgJHN0ciA9IHhsX3Jvd2NvbF90b19jZWxsKDAsIDAsIDEsIDApOyAjIEEkMQorICAgICRzdHIgPSB4bF9yb3djb2xfdG9fY2VsbCgwLCAwLCAxLCAxKTsgIyAkQSQxCisKK1NlZSBMPFJPVyBBTkQgQ09MVU1OIEZVTkNUSU9OUz4gZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGFic29sdXRlIGNlbGwgcmVmZXJlbmNlcy4KKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX3Jvd2NvbF90b19jZWxsKCRyb3csICRjb2wsICRyb3dfYWJzb2x1dGUsICRjb2xfYWJzb2x1dGUpCisjCitzdWIgeGxfcm93Y29sX3RvX2NlbGwgeworCisgICAgbXkgJHJvdyAgICAgPSAkX1swXTsKKyAgICBteSAkY29sICAgICA9ICRfWzFdOworICAgIG15ICRyb3dfYWJzID0gJF9bMl0gPyAnJCcgOiAnJzsKKyAgICBteSAkY29sX2FicyA9ICRfWzNdID8gJyQnIDogJyc7CisKKworICAgIG15ICRpbnQgID0gaW50ICgkY29sIC8gMjYpOworICAgIG15ICRmcmFjID0gJGNvbCAlIDI2OworCisgICAgbXkgJGNocjEgPScnOyAjIE1vc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyIGluIEFBMQorCisgICAgaWYgKCRpbnQgPiAwKSB7CisgICAgICAgICRjaHIxID0gY2hyKCBvcmQoJ0EnKSArICRpbnQgIC0xICk7CisgICAgfQorCisgICAgbXkgJGNocjIgPSBjaHIoIG9yZCgnQScpICsgJGZyYWMgKTsKKworICAgICMgWmVybyBpbmRleCB0byAxLWluZGV4CisgICAgJHJvdysrOworCisgICAgcmV0dXJuICRjb2xfYWJzIC4gJGNocjEgLiAkY2hyMiAuICRyb3dfYWJzLiAkcm93OworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9jZWxsX3RvX3Jvd2NvbCgkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nICAgICAgICAgU3RyaW5nIGluIEExIGZvcm1hdAorCisgICAgUmV0dXJuczogICAgTGlzdCAgICAgICAgICAgICgkcm93LCAkY29sKQorCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIHRvIGEgemVybyBiYXNlZCByb3cgYW5kIGNvbHVtbi4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbi4KKworICAgIG15ICgkcm93LCAkY29sKSA9IHhsX2NlbGxfdG9fcm93Y29sKCdBMScpOyAgICAgIyAoMCwgMCkKKyAgICBteSAoJHJvdywgJGNvbCkgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnQjEnKTsgICAgICMgKDAsIDEpCisgICAgbXkgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJ0MyJyk7ICAgICAjICgxLCAyKQorICAgIG15ICgkcm93LCAkY29sKSA9IHhsX2NlbGxfdG9fcm93Y29sKCckQzInICk7ICAgIyAoMSwgMikKKyAgICBteSAoJHJvdywgJGNvbCkgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnQyQyJyApOyAgICMgKDEsIDIpCisgICAgbXkgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJyRDJDInKTsgICAjICgxLCAyKQorCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2NlbGxfdG9fcm93Y29sKCRzdHJpbmcpCisjCisjIFJldHVybnM6ICgkcm93LCAkY29sLCAkcm93X2Fic29sdXRlLCAkY29sX2Fic29sdXRlKQorIworIyBUaGUgJHJvd19hYnNvbHV0ZSBhbmQgJGNvbF9hYnNvbHV0ZSBwYXJhbWV0ZXJzIGFyZW4ndCBkb2N1bWVudGVkIGJlY2F1c2UgdGhleQorIyBtYWlubHkgdXNlZCBpbnRlcm5hbGx5IGFuZCBhcmVuJ3QgdmVyeSB1c2VmdWwgdG8gdGhlIHVzZXIuCisjCitzdWIgeGxfY2VsbF90b19yb3djb2wgeworCisgICAgbXkgJGNlbGwgPSBzaGlmdDsKKworICAgICRjZWxsID1+IC8oXCQ/KShbQS1JXT9bQS1aXSkoXCQ/KShcZCspLzsKKworICAgIG15ICRjb2xfYWJzID0gJDEgZXEgIiIgPyAwIDogMTsKKyAgICBteSAkY29sICAgICA9ICQyOworICAgIG15ICRyb3dfYWJzID0gJDMgZXEgIiIgPyAwIDogMTsKKyAgICBteSAkcm93ICAgICA9ICQ0OworCisgICAgIyBDb252ZXJ0IGJhc2UyNiBjb2x1bW4gc3RyaW5nIHRvIG51bWJlcgorICAgICMgQWxsIHlvdXIgQmFzZSBhcmUgYmVsb25nIHRvIHVzLgorICAgIG15IEBjaGFycyAgPSBzcGxpdCAvLywgJGNvbDsKKyAgICBteSAkZXhwbiAgID0gMDsKKyAgICAkY29sICAgICAgID0gMDsKKworICAgIHdoaWxlIChAY2hhcnMpIHsKKyAgICAgICAgbXkgJGNoYXIgPSBwb3AoQGNoYXJzKTsgIyBMUyBjaGFyIGZpcnN0CisgICAgICAgICRjb2wgKz0gKG9yZCgkY2hhcikgLW9yZCgnQScpICsxKSAqICgyNioqJGV4cG4pOworICAgICAgICAkZXhwbisrOworICAgIH0KKworICAgICMgQ29udmVydCAxLWluZGV4IHRvIHplcm8taW5kZXgKKyAgICAkcm93LS07CisgICAgJGNvbC0tOworCisgICAgcmV0dXJuICRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FiczsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfcmFuZ2VfZm9ybXVsYSgkc2hlZXRuYW1lLCAkcm93XzEsICRyb3dfMiwgJGNvbF8xLCAkY29sXzIpCisKKyAgICBQYXJhbWV0ZXJzOiAkc2hlZXRuYW1lICAgICAgU3RyaW5nCisgICAgICAgICAgICAgICAgJHJvd18xOiAgICAgICAgIEludGVnZXIKKyAgICAgICAgICAgICAgICAkcm93XzI6ICAgICAgICAgSW50ZWdlcgorICAgICAgICAgICAgICAgICRjb2xfMTogICAgICAgICBJbnRlZ2VyCisgICAgICAgICAgICAgICAgJGNvbF8yOiAgICAgICAgIEludGVnZXIKKworICAgIFJldHVybnM6ICAgIEEgd29ya3NoZWV0IHJhbmdlIGZvcm11bGEgYXMgYSBzdHJpbmcuCisKK1RoaXMgZnVuY3Rpb24gY29udmVydHMgemVybyBiYXNlZCByb3cgYW5kIGNvbHVtbiBjZWxsIHJlZmVyZW5jZXMgdG8gYW4gQTEgc3R5bGUgZm9ybXVsYSBzdHJpbmc6CisKKyAgICBteSAkc3RyID0geGxfcmFuZ2VfZm9ybXVsYSgnU2hlZXQxJywgICAwLCAgOSwgMCwgMCk7ICMgPVNoZWV0MSEkQSQxOiRBJDEwCisgICAgbXkgJHN0ciA9IHhsX3JhbmdlX2Zvcm11bGEoJ1NoZWV0MicsICAgNiwgNjUsIDEsIDEpOyAjID1TaGVldDIhJEIkNzokQiQ2NgorICAgIG15ICRzdHIgPSB4bF9yYW5nZV9mb3JtdWxhKCdOZXcgZGF0YScsIDEsICA4LCAyLCAyKTsgIyA9J05ldyBkYXRhJyEkQyQyOiRDJDkKKworCitUaGlzIGlzIHVzZWZ1bCBmb3Igc2V0dGluZyByYW5nZXMgaW4gQ2hhcnQgb2JqZWN0czoKKworCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzICAgID0+IHhsX3JhbmdlX2Zvcm11bGEoJ1NoZWV0MScsIDEsIDksIDAsIDApLAorICAgICAgICB2YWx1ZXMgICAgICAgID0+IHhsX3JhbmdlX2Zvcm11bGEoJ1NoZWV0MScsIDEsIDksIDEsIDEpOywKKyAgICApOworCisgICAgIyBXaGljaCBpcyB0aGUgc2FtZSBhczoKKworICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyAgICA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJywKKyAgICApOworCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfcmFuZ2VfZm9ybXVsYSgkc2hlZXRuYW1lLCAkcm93XzEsICRyb3dfMiwgJGNvbF8xLCAkY29sXzIpCisjCitzdWIgeGxfcmFuZ2VfZm9ybXVsYSB7CisKKyAgICBteSAoJHNoZWV0bmFtZSwgJHJvd18xLCAkcm93XzIsICRjb2xfMSwgJGNvbF8yKSA9IEBfOworCisgICAgIyBVc2UgRXhjZWwncyBjb252ZW50aW9ucyBhbmQgcXVvdGUgdGhlIHNoZWV0IG5hbWUgaWYgaXQgY29udGFpbnMgYW55CisgICAgIyBub24td29yZCBjaGFyYWN0ZXIgb3IgaWYgaXQgaXNuJ3QgYWxyZWFkeSBxdW90ZWQuCisgICAgaWYgKCRzaGVldG5hbWUgPX4gL1xXLyAmJiAkc2hlZXRuYW1lICF+IC9eJy8pIHsKKyAgICAgICAgJHNoZWV0bmFtZSA9IHEoJykgLiAkc2hlZXRuYW1lIC4gcSgnKTsKKyAgICB9CisKKyAgICBteSAkcmFuZ2UxID0geGxfcm93Y29sX3RvX2NlbGwoJHJvd18xLCAkY29sXzEsIDEsIDEpOworICAgIG15ICRyYW5nZTIgPSB4bF9yb3djb2xfdG9fY2VsbCgkcm93XzIsICRjb2xfMiwgMSwgMSk7CisKKyAgICByZXR1cm4gJz0nIC4gJHNoZWV0bmFtZSAuICchJyAuICRyYW5nZTEgLiAnOicgLiAkcmFuZ2UyOworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9pbmNfcm93KCRzdHJpbmcpCisKKworICAgIFBhcmFtZXRlcnM6ICRzdHJpbmcsIGEgc3RyaW5nIGluIEExIGZvcm1hdAorCisgICAgUmV0dXJuczogICAgSW5jcmVtZW50ZWQgc3RyaW5nIGluIEExIGZvcm1hdAorCitUaGlzIGZ1bmN0aW9ucyB0YWtlcyBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZyBpbiBBMSBub3RhdGlvbiBhbmQgaW5jcmVtZW50cyB0aGUgcm93LiBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvIGhhbmRsZSBFeGNlbCdzIGFic29sdXRlLCBDPCQ+LCBjZWxsIG5vdGF0aW9uOgorCisgICAgbXkgJHN0ciA9IHhsX2luY19yb3coJ0ExJyAgKTsgIyBBMgorICAgIG15ICRzdHIgPSB4bF9pbmNfcm93KCdCJDInICk7ICMgQiQzCisgICAgbXkgJHN0ciA9IHhsX2luY19yb3coJyRDMycgKTsgIyAkQzQKKyAgICBteSAkc3RyID0geGxfaW5jX3JvdygnJEQkNCcpOyAjICREJDUKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2luY19yb3coJHN0cmluZykKKyMKK3N1YiB4bF9pbmNfcm93IHsKKworICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgbXkgKCRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FicykgPSB4bF9jZWxsX3RvX3Jvd2NvbCgkY2VsbCk7CisKKyAgICByZXR1cm4geGxfcm93Y29sX3RvX2NlbGwoKyskcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9kZWNfcm93KCRzdHJpbmcpCisKKworICAgIFBhcmFtZXRlcnM6ICRzdHJpbmcsIGEgc3RyaW5nIGluIEExIGZvcm1hdAorCisgICAgUmV0dXJuczogICAgRGVjcmVtZW50ZWQgc3RyaW5nIGluIEExIGZvcm1hdAorCitUaGlzIGZ1bmN0aW9ucyB0YWtlcyBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZyBpbiBBMSBub3RhdGlvbiBhbmQgZGVjcmVtZW50cyB0aGUgcm93LiBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvIGhhbmRsZSBFeGNlbCdzIGFic29sdXRlLCBDPCQ+LCBjZWxsIG5vdGF0aW9uOgorCisgICAgbXkgJHN0ciA9IHhsX2RlY19yb3coJ0EyJyAgKTsgIyBBMQorICAgIG15ICRzdHIgPSB4bF9kZWNfcm93KCdCJDMnICk7ICMgQiQyCisgICAgbXkgJHN0ciA9IHhsX2RlY19yb3coJyRDNCcgKTsgIyAkQzMKKyAgICBteSAkc3RyID0geGxfZGVjX3JvdygnJEQkNScpOyAjICREJDQKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2RlY19yb3coJHN0cmluZykKKyMKKyMgRGVjcmVtZW50cyB0aGUgcm93IG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyMgRm9yIGV4YW1wbGUgQzQgdG8gQzMKKyMKKyMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisjCitzdWIgeGxfZGVjX3JvdyB7CisKKyAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgIG15ICgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpID0geGxfY2VsbF90b19yb3djb2woJGNlbGwpOworCisgICAgcmV0dXJuIHhsX3Jvd2NvbF90b19jZWxsKC0tJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfaW5jX2NvbCgkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIEluY3JlbWVudGVkIHN0cmluZyBpbiBBMSBmb3JtYXQKKworVGhpcyBmdW5jdGlvbnMgdGFrZXMgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgaW4gQTEgbm90YXRpb24gYW5kIGluY3JlbWVudHMgdGhlIGNvbHVtbi4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbjoKKworICAgIG15ICRzdHIgPSB4bF9pbmNfY29sKCdBMScgICk7ICMgQjEKKyAgICBteSAkc3RyID0geGxfaW5jX2NvbCgnWjEnICApOyAjIEFBMQorICAgIG15ICRzdHIgPSB4bF9pbmNfY29sKCckQjEnICk7ICMgJEMxCisgICAgbXkgJHN0ciA9IHhsX2luY19jb2woJyREJDUnKTsgIyAkRSQ1CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9pbmNfY29sKCRzdHJpbmcpCisjCisjIEluY3JlbWVudHMgdGhlIGNvbHVtbiBudW1iZXIgb2YgYW4gRXhjZWwgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24uCisjIEZvciBleGFtcGxlIEMzIHRvIEQzCisjCisjIFJldHVybnM6IGEgY2VsbCByZWZlcmVuY2Ugc3RyaW5nLgorIworc3ViIHhsX2luY19jb2wgeworCisgICAgbXkgJGNlbGwgPSBzaGlmdDsKKyAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IHhsX2NlbGxfdG9fcm93Y29sKCRjZWxsKTsKKworICAgIHJldHVybiB4bF9yb3djb2xfdG9fY2VsbCgkcm93LCArKyRjb2wsICRyb3dfYWJzLCAkY29sX2Ficyk7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX2RlY19jb2woJHN0cmluZykKKworICAgIFBhcmFtZXRlcnM6ICRzdHJpbmcsIGEgc3RyaW5nIGluIEExIGZvcm1hdAorCisgICAgUmV0dXJuczogICAgRGVjcmVtZW50ZWQgc3RyaW5nIGluIEExIGZvcm1hdAorCitUaGlzIGZ1bmN0aW9ucyB0YWtlcyBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZyBpbiBBMSBub3RhdGlvbiBhbmQgZGVjcmVtZW50cyB0aGUgY29sdW1uLiBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvIGhhbmRsZSBFeGNlbCdzIGFic29sdXRlLCBDPCQ+LCBjZWxsIG5vdGF0aW9uOgorCisgICAgbXkgJHN0ciA9IHhsX2RlY19jb2woJ0IxJyAgKTsgIyBBMQorICAgIG15ICRzdHIgPSB4bF9kZWNfY29sKCdBQTEnICk7ICMgWjEKKyAgICBteSAkc3RyID0geGxfZGVjX2NvbCgnJEMxJyApOyAjICRCMQorICAgIG15ICRzdHIgPSB4bF9kZWNfY29sKCckRSQ1Jyk7ICMgJEQkNQorCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfZGVjX2NvbCgkc3RyaW5nKQorIworc3ViIHhsX2RlY19jb2wgeworCisgICAgbXkgJGNlbGwgPSBzaGlmdDsKKyAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IHhsX2NlbGxfdG9fcm93Y29sKCRjZWxsKTsKKworICAgIHJldHVybiB4bF9yb3djb2xfdG9fY2VsbCgkcm93LCAtLSRjb2wsICRyb3dfYWJzLCAkY29sX2Ficyk7Cit9CisKKworCisKKz1oZWFkMSBUSU1FIEFORCBEQVRFIEZVTkNUSU9OUworCisKK0RhdGVzIGFuZCB0aW1lcyBpbiBFeGNlbCBhcmUgcmVwcmVzZW50ZWQgYnkgcmVhbCBudW1iZXJzLCBmb3IgZXhhbXBsZSAiSmFuIDEgMjAwMSAxMjozMCBBTSIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIG51bWJlciAzNjg5Mi41MjEuCisKK1RoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlIG51bWJlciBzdG9yZXMgdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBlcG9jaCBhbmQgdGhlIGZyYWN0aW9uYWwgcGFydCBzdG9yZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGRheSBpbiBzZWNvbmRzLgorCitUaGUgZXBvY2ggY2FuIGJlIGVpdGhlciAxOTAwIG9yIDE5MDQuIEV4Y2VsIGZvciBXaW5kb3dzIHVzZXMgMTkwMCBhbmQgRXhjZWwgZm9yIE1hY2ludG9zaCB1c2VzIDE5MDQuIFRoZSBlcG9jaHMgYXJlOgorCisgICAgMTkwMDogMCBKYW51YXJ5IDE5MDAgaS5lLiAzMSBEZWNlbWJlciAxODk5CisgICAgMTkwNDogMSBKYW51YXJ5IDE5MDQKKworRXhjZWwgb24gV2luZG93cyBhbmQgdGhlIE1hY2ludG9zaCB3aWxsIGNvbnZlcnQgYXV0b21hdGljYWxseSBiZXR3ZWVuIG9uZSBzeXN0ZW0gYW5kIHRoZSBvdGhlci4gQnkgZGVmYXVsdCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB1c2VzIHRoZSAxOTAwIGZvcm1hdC4gVG8gdXNlIHRoZSAxOTA0IGVwb2NoIHlvdSBtdXN0IHVzZSB0aGUgQzxzZXRfMTkwNCgpPiB3b3JrYm9vayBtZXRob2QsIHNlZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbi4KKworVGhlcmUgYXJlIHR3byB0aGluZ3MgdG8gbm90ZSBhYm91dCB0aGUgMTkwMCBkYXRlIGZvcm1hdC4gVGhlIGZpcnN0IGlzIHRoYXQgdGhlIGVwb2NoIHN0YXJ0cyBvbiAwIEphbnVhcnkgMTkwMC4gVGhlIHNlY29uZCBpcyB0aGF0IHRoZSB5ZWFyIDE5MDAgaXMgZXJyb25lb3VzbHkgYnV0IGRlbGliZXJhdGVseSB0cmVhdGVkIGFzIGEgbGVhcCB5ZWFyLiBUaGVyZWZvcmUgeW91IG11c3QgYWRkIGFuIGV4dHJhIGRheSB0byBkYXRlcyBhZnRlciAyOCBGZWJydWFyeSAxOTAwLiBUaGUgZnVuY3Rpb25zIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiB3aWxsIGRlYWwgd2l0aCB0aGVzZSBpc3N1ZXMgYXV0b21hdGljYWxseS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBhbm9tYWx5IGlzIGV4cGxhaW5lZCBhdCBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL3N1cHBvcnQva2IvYXJ0aWNsZXMvUTE4MS8zLzcwLmFzcAorCitOb3RlLCBhIGRhdGUgb3IgdGltZSBpbiBFeGNlbCBpcyBsaWtlIGFueSBvdGhlciBudW1iZXIuIFRvIGRpc3BsYXkgdGhlIG51bWJlciBhcyBhIGRhdGUgeW91IG11c3QgYXBwbHkgYSBudW1iZXIgZm9ybWF0IHRvIGl0OiBSZWZlciB0byB0aGUgQzxzZXRfbnVtX2Zvcm1hdCgpPiBtZXRob2QgaW4gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb246CisKKyAgICAkZGF0ZSA9IHhsX2RhdGVfbGlzdCgyMDAxLCAxLCAxLCAxMiwgMzApOworICAgICRmb3JtYXQtPnNldF9udW1fZm9ybWF0KCdtbW0gZCB5eXl5IGhoOm1tIEFNL1BNJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJGRhdGUgLCAkZm9ybWF0KTsgIyBKYW4gMSAyMDAxIDEyOjMwIEFNCisKK1RvIHVzZSB0aGVzZSBmdW5jdGlvbnMgeW91IG11c3QgaW5zdGFsbCB0aGUgQzxEYXRlOjpNYW5pcD4gYW5kIEM8RGF0ZTo6Q2FsYz4gbW9kdWxlcy4gU2VlIEw8UkVRVUlSRU1FTlRTPiBhbmQgdGhlIGluZGl2aWR1YWwgcmVxdWlyZW1lbnRzIG9mIGVhY2ggZnVuY3Rpb25zLgorCitTZWUgYWxzbyB0aGUgRGF0ZVRpbWU6OkZvcm1hdDo6RXhjZWwgbW9kdWxlLGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP2Rpc3Q9RGF0ZVRpbWUtRm9ybWF0LUV4Y2VsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIERhdGVUaW1lIHByb2plY3QgYW5kIHdoaWNoIGRlYWxzIHNwZWNpZmljYWxseSB3aXRoIGNvbnZlcnRpbmcgZGF0ZXMgYW5kIHRpbWVzIHRvIGFuZCBmcm9tIEV4Y2VsJ3MgZm9ybWF0LgorCisKKz1jdXQKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9kYXRlX2xpc3QoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpCisKKworICAgIFBhcmFtZXRlcnM6ICR5ZWFyczogICAgICAgICBJbnRlZ2VyCisgICAgICAgICAgICAgICAgJG1vbnRoczogICAgICAgIEludGVnZXIgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDFdCisgICAgICAgICAgICAgICAgJGRheXM6ICAgICAgICAgIEludGVnZXIgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDFdCisgICAgICAgICAgICAgICAgJGhvdXJzOiAgICAgICAgIEludGVnZXIgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDBdCisgICAgICAgICAgICAgICAgJG1pbnV0ZXM6ICAgICAgIEludGVnZXIgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDBdCisgICAgICAgICAgICAgICAgJHNlY29uZHM6ICAgICAgIEZsb2F0ICAgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDBdCisKKyAgICBSZXR1cm5zOiAgICBBIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZQorICAgICAgICAgICAgICAgIG9yIHVuZGVmIGZvciBhbiBpbnZhbGlkIGRhdGUuCisKKyAgICBSZXF1aXJlczogICBEYXRlOjpDYWxjCisKK1RoaXMgZnVuY3Rpb24gY29udmVydHMgYW4gYXJyYXkgb2YgZGF0YSBpbnRvIGEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyBhbiBFeGNlbCBkYXRlLiBBbGwgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIGV4Y2VwdCBmb3IgQzwkeWVhcnM+LgorCisgICAgJGRhdGUxID0geGxfZGF0ZV9saXN0KDIwMDIsIDEsIDIpOyAgICAgICAgICAgICAgIyAyIEphbiAyMDAyCisgICAgJGRhdGUyID0geGxfZGF0ZV9saXN0KDIwMDIsIDEsIDIsIDEyKTsgICAgICAgICAgIyAyIEphbiAyMDAyIDEyOjAwIHBtCisgICAgJGRhdGUzID0geGxfZGF0ZV9saXN0KDIwMDIsIDEsIDIsIDEyLCAzMCk7ICAgICAgIyAyIEphbiAyMDAyIDEyOjMwIHBtCisgICAgJGRhdGU0ID0geGxfZGF0ZV9saXN0KDIwMDIsIDEsIDIsIDEyLCAzMCwgNDUpOyAgIyAyIEphbiAyMDAyIDEyOjMwOjQ1IHBtCisKK1RoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBmdW5jdGlvbnMgdGhhdCBwYXJzZSBkYXRlIGFuZCB0aW1lIHN0cmluZ3MuIEluIGZhY3QgaXQgaXMgdXNlZCBpbiBtb3N0IG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLgorCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfZGF0ZV9saXN0KCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKQorIworc3ViIHhsX2RhdGVfbGlzdCB7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIEBfOworCisgICAgbXkgJHllYXJzICAgPSAkX1swXTsKKyAgICBteSAkbW9udGhzICA9ICRfWzFdIHx8IDE7CisgICAgbXkgJGRheXMgICAgPSAkX1syXSB8fCAxOworICAgIG15ICRob3VycyAgID0gJF9bM10gfHwgMDsKKyAgICBteSAkbWludXRlcyA9ICRfWzRdIHx8IDA7CisgICAgbXkgJHNlY29uZHMgPSAkX1s1XSB8fCAwOworCisgICAgbXkgQGRhdGUgPSAoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpOworICAgIG15IEBlcG9jaCA9ICgxODk5LCAxMiwgMzEsIDAsIDAsIDApOworCisgICAgKCRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykgPSBEZWx0YV9ESE1TKEBlcG9jaCwgQGRhdGUpOworCisgICAgbXkgJGRhdGUgPSAkZGF5cyArICgkaG91cnMqMzYwMCArJG1pbnV0ZXMqNjAgKyRzZWNvbmRzKS8oMjQqNjAqNjApOworCisgICAgIyBBZGQgYSBkYXkgZm9yIEV4Y2VsJ3MgbWlzc2luZyBsZWFwIGRheSBpbiAxOTAwCisgICAgJGRhdGUrKyBpZiAoJGRhdGUgPiA1OSk7CisKKyAgICByZXR1cm4gJGRhdGU7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfcGFyc2VfdGltZSgkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgYSB0aW1lCisKKyAgICBSZXR1cm5zOiAgICBBIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgdGltZQorICAgICAgICAgICAgICAgIG9yIHVuZGVmIGZvciBhbiBpbnZhbGlkIHRpbWUuCisKK1RoaXMgZnVuY3Rpb24gY29udmVydHMgYSB0aW1lIHN0cmluZyBpbnRvIGEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyBhbiBFeGNlbCB0aW1lLiBUaGUgZm9sbG93aW5nIHRpbWUgZm9ybWF0cyBhcmUgdmFsaWQ6CisKKyAgICBoaDptbSAgICAgICBbQU18UE1dCisgICAgaGg6bW0gICAgICAgW0FNfFBNXQorICAgIGhoOm1tOnNzICAgIFtBTXxQTV0KKyAgICBoaDptbTpzcy5zcyBbQU18UE1dCisKKworVGhlIG1lcmlkaWFuLCBBTSBvciBQTSwgaXMgb3B0aW9uYWwgYW5kIGNhc2UgaW5zZW5zaXRpdmUuIEEgMjQgaG91ciB0aW1lIGlzIGFzc3VtZWQgaWYgdGhlIG1lcmlkaWFuIGlzIG9taXR0ZWQKKworICAgICR0aW1lMSA9IHhsX3BhcnNlX3RpbWUoJzEyOjE4Jyk7CisgICAgJHRpbWUyID0geGxfcGFyc2VfdGltZSgnMTI6MTg6MTQnKTsKKyAgICAkdGltZTMgPSB4bF9wYXJzZV90aW1lKCcxMjoxODoxNCBBTScpOworICAgICR0aW1lNCA9IHhsX3BhcnNlX3RpbWUoJzE6MTg6MTQgQU0nKTsKKworVGltZSBpbiBFeGNlbCBpcyBleHByZXNzZWQgYXMgYSBmcmFjdGlvbiBvZiB0aGUgZGF5IGluIHNlY29uZHMuIFRoZXJlZm9yZSB5b3UgY2FuIGNhbGN1bGF0ZSBhbiBFeGNlbCB0aW1lIGFzIGZvbGxvd3M6CisKKyAgICAkdGltZSA9ICgkaG91cnMqMzYwMCArJG1pbnV0ZXMqNjAgKyRzZWNvbmRzKS8oMjQqNjAqNjApOworCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfcGFyc2VfdGltZSgkc3RyaW5nKQorIworc3ViIHhsX3BhcnNlX3RpbWUgeworCisgICAgbXkgJHRpbWUgPSBzaGlmdDsKKworICAgIGlmICgkdGltZSA9fiAvKFxkezEsMn0pOihcZFxkKTo/KCg/OlxkXGQpKD86XC5cZCspPyk/KD86XHMrKT8oYW18cG0pPy9pKSB7CisKKyAgICAgICAgbXkgJGhvdXJzICAgICAgID0gJDE7CisgICAgICAgIG15ICRtaW51dGVzICAgICA9ICQyOworICAgICAgICBteSAkc2Vjb25kcyAgICAgPSAkMyAgICAgfHwgMDsKKyAgICAgICAgbXkgJG1lcmlkaWFuICAgID0gbGMoJDQpIHx8ICcnOworCisgICAgICAgICMgTm9ybWFsaXNlIG1pZG5pZ2h0IGFuZCBtaWRkYXkKKyAgICAgICAgJGhvdXJzID0gMCBpZiAoJGhvdXJzID09IDEyICYmICRtZXJpZGlhbiBuZSAnJyk7CisKKyAgICAgICAgIyBBZGQgMTIgaG91cnMgdG8gdGhlIHBtIHRpbWVzLiBOb3RlOiAxMi4wMCBwbSBoYXMgYmVlbiBzZXQgdG8gMC4wMC4KKyAgICAgICAgJGhvdXJzICs9IDEyIGlmICRtZXJpZGlhbiBlcSAncG0nOworCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSB0aW1lIGFzIGEgZnJhY3Rpb24gb2YgMjQgaG91cnMgaW4gc2Vjb25kcworICAgICAgICByZXR1cm4gKCRob3VycyozNjAwICskbWludXRlcyo2MCArJHNlY29uZHMpLygyNCo2MCo2MCk7CisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiB1bmRlZjsgIyBOb3QgYSB2YWxpZCB0aW1lIHN0cmluZworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9wYXJzZV9kYXRlKCRzdHJpbmcpCisKKworICAgIFBhcmFtZXRlcnM6ICRzdHJpbmcsIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUgYW5kIHRpbWUKKworICAgIFJldHVybnM6ICAgIEEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyBhbiBFeGNlbCBkYXRlCisgICAgICAgICAgICAgICAgb3IgdW5kZWYgZm9yIGFuIGludmFsaWQgZGF0ZS4KKworICAgIFJlcXVpcmVzOiAgIERhdGU6Ok1hbmlwIGFuZCBEYXRlOjpDYWxjCisKK1RoaXMgZnVuY3Rpb24gY29udmVydHMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyBpbnRvIGEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyBhbiBFeGNlbCBkYXRlLgorCitUaGUgcGFyc2luZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEM8UGFyc2VEYXRlKCk+IGZ1bmN0aW9uIG9mIHRoZSBEYXRlOjpNYW5pcCBtb2R1bGUuIFJlZmVyIHRvIHRoZSBEYXRlOjpNYW5pcCBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIGFuZCB0aW1lIGZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkLiBJbiBvcmRlciB0byB1c2UgdGhpcyBmdW5jdGlvbiB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIGluaXRpYWxpc2Ugc29tZSBEYXRlOjpNYW5pcCB2YXJpYWJsZXMgdmlhIHRoZSBDPHhsX3BhcnNlX2RhdGVfaW5pdCgpPiBmdW5jdGlvbiwgc2VlIGJlbG93LgorCisgICAgeGxfcGFyc2VfZGF0ZV9pbml0KCJUWj1HTVQiLCJEYXRlRm9ybWF0PW5vbi1VUyIpOworCisgICAgJGRhdGUxID0geGxfcGFyc2VfZGF0ZSgiMTEvNy85NyIpOworICAgICRkYXRlMiA9IHhsX3BhcnNlX2RhdGUoIkZyaWRheSAxMSBKdWx5IDE5OTciKTsKKyAgICAkZGF0ZTMgPSB4bF9wYXJzZV9kYXRlKCIxMDozMCBBTSBGcmlkYXkgMTEgSnVseSAxOTk3Iik7CisgICAgJGRhdGU0ID0geGxfcGFyc2VfZGF0ZSgiVG9kYXkiKTsKKyAgICAkZGF0ZTUgPSB4bF9wYXJzZV9kYXRlKCJZZXN0ZXJkYXkiKTsKKworTm90ZSwgaWYgeW91IHBhcnNlIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIHRpbWUgYnV0IG5vdCBhIGRhdGUgdGhpcyBmdW5jdGlvbiB3aWxsIGFkZCB0aGUgY3VycmVudCBkYXRlLiBJZiB5b3Ugd2FudCB0aGUgdGltZSB3aXRob3V0IHRoZSBkYXRlIHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICAgICR0aW1lICA9IHhsX3BhcnNlX2RhdGUoIjEwOjMwIEFNIik7CisgICAgJHRpbWUgLT0gaW50KCR0aW1lKTsKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX3BhcnNlX2RhdGUoJHN0cmluZykKKyMKK3N1YiB4bF9wYXJzZV9kYXRlIHsKKworICAgIG15ICRkYXRlID0gUGFyc2VEYXRlKCRfWzBdKTsKKworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkZGF0ZTsKKworICAgICMgVW5wYWNrIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBQYXJzZURhdGUoKQorICAgIG15ICAgICgkeWVhcnMsICRtb250aHMsICRkYXlzLCAkaG91cnMsIHVuZGVmLCAkbWludXRlcywgdW5kZWYsICRzZWNvbmRzKSA9CisgICAgdW5wYWNrKCJBNCAgICAgQTIgICAgICAgQTIgICAgIEEyICAgICAgQyAgICAgIEEyICAgICAgICBDICAgICAgQTIiLCAkZGF0ZSk7CisKKyAgICAjIENvbnZlcnQgdG8gRXhjZWwgZGF0ZQorICAgIHJldHVybiB4bF9kYXRlX2xpc3QoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpOworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9wYXJzZV9kYXRlX2luaXQoInZhcmlhYmxlPXZhbHVlIiwgLi4uKQorCisKKyAgICBQYXJhbWV0ZXJzOiBBIGxpc3Qgb2YgRGF0ZTo6TWFuaXAgdmFyaWFibGUgc3RyaW5ncworCisgICAgUmV0dXJuczogICAgQSBsaXN0IG9mIGFsbCB0aGUgRGF0ZTo6TWFuaXAgc3RyaW5ncworCisgICAgUmVxdWlyZXM6ICAgRGF0ZTo6TWFuaXAKKworVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpc2UgdmFyaWFibGVzIHJlcXVpcmVkIGJ5IHRoZSBEYXRlOjpNYW5pcCBtb2R1bGUuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIEM8eGxfcGFyc2VfZGF0ZSgpPi4gSXQgbmVlZCBvbmx5IGJlIGNhbGxlZCBvbmNlLgorCitUaGlzIGZ1bmN0aW9uIGlzIGEgdGhpbiB3cmFwcGVyIGZvciB0aGUgQzxEYXRlOjpNYW5pcDo6RGF0ZV9Jbml0KCk+IGZ1bmN0aW9uLiBZb3UgY2FuIHVzZSBDPERhdGVfSW5pdCgpPiAgZGlyZWN0bHkgaWYgeW91IHdpc2guIFJlZmVyIHRvIHRoZSBEYXRlOjpNYW5pcCBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCisgICAgeGxfcGFyc2VfZGF0ZV9pbml0KCJUWj1NU1QiLCJEYXRlRm9ybWF0PVVTIik7CisgICAgJGRhdGUxID0geGxfcGFyc2VfZGF0ZSgiMTEvNy85NyIpOyAgIyBOb3ZlbWJlciA3dGggMTk5NworCisgICAgeGxfcGFyc2VfZGF0ZV9pbml0KCJUWj1HTVQiLCJEYXRlRm9ybWF0PW5vbi1VUyIpOworICAgICRkYXRlMSA9IHhsX3BhcnNlX2RhdGUoIjExLzcvOTciKTsgICMgSnVseSAxMXRoIDE5OTcKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX3BhcnNlX2RhdGVfaW5pdCgidmFyaWFibGU9dmFsdWUiLCAuLi4pCisjCitzdWIgeGxfcGFyc2VfZGF0ZV9pbml0IHsKKworICAgIERhdGVfSW5pdChAXyk7ICMgSG93IGxhenkgaXMgdGhhdC4KK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGVjb2RlX2RhdGVfRVUoJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZywgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZGF0ZSBhbmQgdGltZQorCisgICAgUmV0dXJuczogICAgQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIGRhdGUKKyAgICAgICAgICAgICAgICBvciB1bmRlZiBmb3IgYW4gaW52YWxpZCBkYXRlLgorCisgICAgUmVxdWlyZXM6ICAgRGF0ZTo6Q2FsYworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZS4KKworVGhlIGRhdGUgcGFyc2luZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEM8RGVjb2RlX0RhdGVfRVUoKT4gZnVuY3Rpb24gb2YgdGhlIERhdGU6OkNhbGMgbW9kdWxlLiBSZWZlciB0byB0aGUgRGF0ZTo6Q2FsYyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC4gQWxzbyBub3RlIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgRGF0ZTo6Q2FsYyBkb2N1bWVudGF0aW9uOgorCisiSWYgdGhlIHllYXIgaXMgZ2l2ZW4gYXMgb25lIG9yIHR3byBkaWdpdHMgb25seSAoaS5lLiwgaWYgdGhlIHllYXIgaXMgbGVzcyB0aGFuIDEwMCksIGl0IGlzIG1hcHBlZCB0byB0aGUgd2luZG93IDE5NzAgLTIwNjkgYXMgZm9sbG93cyI6CisKKyAgICAgMCBFPGx0Pj0gJHllYXIgRTxsdD4gIDcwICA9PT4gICR5ZWFyICs9IDIwMDA7CisgICAgNzAgRTxsdD49ICR5ZWFyIEU8bHQ+IDEwMCAgPT0+ICAkeWVhciArPSAxOTAwOworCitUaGUgdGltZSBwb3J0aW9uIG9mIHRoZSBzdHJpbmcgaXMgcGFyc2VkIHVzaW5nIHRoZSBDPHhsX3BhcnNlX3RpbWUoKT4gZnVuY3Rpb24gZGVzY3JpYmVkIGFib3ZlLgorCitOb3RlOiB0aGUgRVUgaW4gdGhlIGZ1bmN0aW9uIG5hbWUgbWVhbnMgdGhhdCBhIEV1cm9wZWFuIGRhdGUgZm9ybWF0IGlzIGFzc3VtZWQgaWYgaXQgaXMgbm90IGNsZWFyIGZyb20gdGhlIHN0cmluZy4gU2VlIHRoZSBmaXJzdCBleGFtcGxlIGJlbG93LgorCisgICAgJGRhdGUxID0geGxfZGVjb2RlX2RhdGVfRVUoIjExLzcvOTciKTsgIzExIEp1bHkgMTk5NworICAgICRkYXRlMiA9IHhsX2RlY29kZV9kYXRlX0VVKCJTYXQgMTIgU2VwdCAxOTk4Iik7CisgICAgJGRhdGUzID0geGxfZGVjb2RlX2RhdGVfRVUoIjQ6MzAgQU0gU2F0IDEyIFNlcHQgMTk5OCIpOworCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfZGVjb2RlX2RhdGVfRVUoJHN0cmluZykKKyMKK3N1YiB4bF9kZWNvZGVfZGF0ZV9FVSB7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIEBfOworCisgICAgbXkgJGRhdGUgPSBzaGlmdDsKKyAgICBteSBAZGF0ZTsKKyAgICBteSAkdGltZSA9IDA7CisKKyAgICAjIFJlbW92ZSBhbmQgZGVjb2RlIHRoZSB0aW1lIHBvcnRpb24gb2YgdGhlIHN0cmluZworICAgIGlmICgkZGF0ZSA9fiBzLyhcZHsxLDJ9OlxkXGQ6PyhcZFxkKFwuXGQrKT8pPyhccyspPyhhbXxwbSk/KS8vaSkgeworICAgICAgICAkdGltZSA9IHhsX3BhcnNlX3RpbWUoJDEpOworICAgICAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJHRpbWU7CisgICAgfQorCisgICAgIyBSZXR1cm4gaWYgdGhlIHN0cmluZyBpcyBub3cgYmxhbmssIGkuZS4gaXQgY29udGFpbmVkIGEgdGltZSBvbmx5LgorICAgIHJldHVybiAkdGltZSBpZiAkZGF0ZSA9fiAvXlxzKiQvOworCisgICAgIyBEZWNvZGUgdGhlIGRhdGUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nCisgICAgQGRhdGUgPSBEZWNvZGVfRGF0ZV9FVSgkZGF0ZSk7CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBAZGF0ZTsKKworICAgIHJldHVybiB4bF9kYXRlX2xpc3QoQGRhdGUpICsgJHRpbWU7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9kZWNvZGVfZGF0ZV9VUygkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRlIGFuZCB0aW1lCisKKyAgICBSZXR1cm5zOiAgICBBIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZQorICAgICAgICAgICAgICAgIG9yIHVuZGVmIGZvciBhbiBpbnZhbGlkIGRhdGUuCisKKyAgICBSZXF1aXJlczogICBEYXRlOjpDYWxjCisKK1RoaXMgZnVuY3Rpb24gY29udmVydHMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyBpbnRvIGEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyBhbiBFeGNlbCBkYXRlLgorCitUaGUgZGF0ZSBwYXJzaW5nIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgQzxEZWNvZGVfRGF0ZV9VUygpPiBmdW5jdGlvbiBvZiB0aGUgRGF0ZTo6Q2FsYyBtb2R1bGUuIFJlZmVyIHRvIHRoZSBEYXRlOjpDYWxjIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIGZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkLiBBbHNvIG5vdGUgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSBEYXRlOjpDYWxjIGRvY3VtZW50YXRpb246CisKKyJJZiB0aGUgeWVhciBpcyBnaXZlbiBhcyBvbmUgb3IgdHdvIGRpZ2l0cyBvbmx5IChpLmUuLCBpZiB0aGUgeWVhciBpcyBsZXNzIHRoYW4gMTAwKSwgaXQgaXMgbWFwcGVkIHRvIHRoZSB3aW5kb3cgMTk3MCAtMjA2OSBhcyBmb2xsb3dzIjoKKworICAgICAwIDw9ICR5ZWFyIDwgIDcwICA9PT4gICR5ZWFyICs9IDIwMDA7CisgICAgNzAgPD0gJHllYXIgPCAxMDAgID09PiAgJHllYXIgKz0gMTkwMDsKKworVGhlIHRpbWUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIGlzIHBhcnNlZCB1c2luZyB0aGUgQzx4bF9wYXJzZV90aW1lKCk+IGZ1bmN0aW9uIGRlc2NyaWJlZCBhYm92ZS4KKworTm90ZTogdGhlIFVTIGluIHRoZSBmdW5jdGlvbiBuYW1lIG1lYW5zIHRoYXQgYW4gQW1lcmljYW4gZGF0ZSBmb3JtYXQgaXMgYXNzdW1lZCBpZiBpdCBpcyBub3QgY2xlYXIgZnJvbSB0aGUgc3RyaW5nLiBTZWUgdGhlIGZpcnN0IGV4YW1wbGUgYmVsb3cuCisKKyAgICAkZGF0ZTEgPSB4bF9kZWNvZGVfZGF0ZV9VUygiMTEvNy85NyIpOyAjIDcgTm92ZW1iZXIgMTk5NworICAgICRkYXRlMiA9IHhsX2RlY29kZV9kYXRlX1VTKCIxMiBTZXB0IFNhdHVyZGF5IDE5OTgiKTsKKyAgICAkZGF0ZTMgPSB4bF9kZWNvZGVfZGF0ZV9VUygiNDozMCBBTSAxMiBTZXB0IFNhdCAxOTk4Iik7CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9kZWNvZGVfZGF0ZV9VUygkc3RyaW5nKQorIworc3ViIHhsX2RlY29kZV9kYXRlX1VTIHsKKworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgQF87CisKKyAgICBteSAkZGF0ZSA9IHNoaWZ0OworICAgIG15IEBkYXRlOworICAgIG15ICR0aW1lID0gMDsKKworICAgICMgUmVtb3ZlIGFuZCBkZWNvZGUgdGhlIHRpbWUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nCisgICAgaWYgKCRkYXRlID1+IHMvKFxkezEsMn06XGRcZDo/KFxkXGQoXC5cZCspPyk/KFxzKyk/KGFtfHBtKT8pLy9pKSB7CisgICAgICAgICR0aW1lID0geGxfcGFyc2VfdGltZSgkMSk7CisgICAgICAgIHJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkdGltZTsKKyAgICB9CisKKyAgICAjIFJldHVybiBpZiB0aGUgc3RyaW5nIGlzIG5vdyBibGFuaywgaS5lLiBpdCBjb250YWluZWQgYSB0aW1lIG9ubHkuCisgICAgcmV0dXJuICR0aW1lIGlmICRkYXRlID1+IC9eXHMqJC87CisKKyAgICAjIERlY29kZSB0aGUgZGF0ZSBwb3J0aW9uIG9mIHRoZSBzdHJpbmcKKyAgICBAZGF0ZSA9IERlY29kZV9EYXRlX1VTKCRkYXRlKTsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIEBkYXRlOworCisgICAgcmV0dXJuIHhsX2RhdGVfbGlzdChAZGF0ZSkgKyAkdGltZTsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGF0ZV8xOTA0KCRkYXRlKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkZGF0ZSwgYW4gRXhjZWwgZGF0ZSB3aXRoIGEgMTkwMCBlcG9jaAorCisgICAgUmV0dXJuczogICAgYW4gRXhjZWwgZGF0ZSB3aXRoIGEgMTkwNCBlcG9jaCBvciB6ZXJvIGlmCisgICAgICAgICAgICAgICAgdGhlICRkYXRlIGlzIGJlZm9yZSAxOTA0CisKKworVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBFeGNlbCBkYXRlIGJhc2VkIG9uIHRoZSAxOTAwIGVwb2NoIGludG8gYSBkYXRlIGJhc2VkIG9uIHRoZSAxOTA0IGVwb2NoLgorCisKKyAgICAkZGF0ZTEgPSB4bF9kYXRlX2xpc3QoMjAwMiwgMSwgMTMpOyAjIDEzIEphbiAyMDAyLCAxOTAwIGVwb2NoCisgICAgJGRhdGUyID0geGxfZGF0ZV8xOTA0KCRkYXRlMSk7ICAgICAgIyAxMyBKYW4gMjAwMiwgMTkwNCBlcG9jaAorCisKK1NlZSBhbHNvIHRoZSBDPHNldF8xOTA0KCk+IHdvcmtib29rIG1ldGhvZCBpbiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbi4KKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9kZWNvZGVfZGF0ZV9VUygkc3RyaW5nKQorIworc3ViIHhsX2RhdGVfMTkwNCB7CisKKyAgICBteSAkZGF0ZSA9ICRfWzBdIHx8IDA7CisKKyAgICBpZiAoJGRhdGUgPCAxNDYyKSB7CisgICAgICAgICMgYmVmb3JlIDE5MDQKKyAgICAgICAgJGRhdGUgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGRhdGUgLT0gMTQ2MjsKKyAgICB9CisKKyAgICByZXR1cm4gJGRhdGU7Cit9CisKKworCisKKworPWhlYWQxIFJFUVVJUkVNRU5UUworCitUaGUgZGF0ZSBhbmQgdGltZSBmdW5jdGlvbnMgcmVxdWlyZSBmdW5jdGlvbnMgZnJvbSB0aGUgQzxEYXRlOjpNYW5pcD4gYW5kIEM8RGF0ZTo6Q2FsYz4gbW9kdWxlcy4gVGhlIHJlcXVpcmVkIGZ1bmN0aW9ucyBhcmUgImF1dG91c2VkIiBmcm9tIHRoZXNlIG1vZHVsZXMgc28gdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gaW5zdGFsbCB0aGVtIHVubGVzcyB5b3Ugd2lzaCB0byB1c2UgdGhlIGRhdGUgYW5kIHRpbWUgcm91dGluZXMuIFRoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIHJvdyBhbmQgY29sdW1uIGZ1bmN0aW9ucyB3aXRob3V0IGhhdmluZyBDPERhdGU6Ok1hbmlwPiBhbmQgQzxEYXRlOjpDYWxjPiBpbnN0YWxsZWQuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0ICJhdXRvdXNpbmciIHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBDPGF1dG91c2U+IHByYWdtYS4KKworCisKKz1oZWFkMSBCVUdTCisKK1doZW4gdXNpbmcgdGhlIGF1dG91c2VkIGZ1bmN0aW9ucyBmcm9tIEM8RGF0ZTo6TWFuaXA+IGFuZCBDPERhdGU6OkNhbGM+IG9uIFBlcmwgNS42LjAgd2l0aCBDPC13PiB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIGxpa2UgdGhpczoKKworICAgICJTdWJyb3V0aW5lIHh4eCByZWRlZmluZWQgLi4uIgorCitUaGUgY3VycmVudCB3b3JrYXJvdW5kIGZvciB0aGlzIGlzIHRvIHB1dCBDPHVzZSB3YXJuaW5nczs+IG5lYXIgdGhlIGJlZ2lubmluZyBvZiB5b3VyIHByb2dyYW0uCisKKworCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKworCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKworPWN1dAorCisKKworMTsKKworCitfX0VORF9fCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvV29ya2Jvb2sucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtib29rLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzZiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtib29rLnBtCkBAIC0wLDAgKzEsMzYzOCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya2Jvb2s7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgV29ya2Jvb2sgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgV29ya2Jvb2tzLgorIworIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIwordXNlIEV4cG9ydGVyOwordXNlIHN0cmljdDsKK3VzZSBDYXJwOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpPTEV3cml0ZXI7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6UHJvcGVydGllcyAnOnByb3BlcnR5X3NldHMnOworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlciBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgbmV3IFdvcmtib29rIG9iamVjdCBmcm9tIGEgQklGRndyaXRlciBvYmplY3QuCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyAgICAgICA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyLT5uZXcoKTsKKyAgICBteSAkYnl0ZV9vcmRlciAgPSAkc2VsZi0+e19ieXRlX29yZGVyfTsKKyAgICBteSAkcGFyc2VyICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybXVsYS0+bmV3KCRieXRlX29yZGVyKTsKKworICAgICRzZWxmLT57X2ZpbGVuYW1lfSAgICAgICAgICAgICAgPSAkX1swXSB8fCAnJzsKKyAgICAkc2VsZi0+e19wYXJzZXJ9ICAgICAgICAgICAgICAgID0gJHBhcnNlcjsKKyAgICAkc2VsZi0+e190ZW1wZGlyfSAgICAgICAgICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfMTkwNH0gICAgICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfYWN0aXZlc2hlZXR9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZmlyc3RzaGVldH0gICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfc2VsZWN0ZWR9ICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfeGZfaW5kZXh9ICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZmlsZWNsb3NlZH0gICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfYmlmZnNpemV9ICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfc2hlZXRfbmFtZX0gICAgICAgICAgICAgPSAnU2hlZXQnOworICAgICRzZWxmLT57X2NoYXJ0X25hbWV9ICAgICAgICAgICAgID0gJ0NoYXJ0JzsKKyAgICAkc2VsZi0+e19zaGVldF9jb3VudH0gICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19jaGFydF9jb3VudH0gICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e191cmxfZm9ybWF0fSAgICAgICAgICAgID0gJyc7CisgICAgJHNlbGYtPntfY29kZXBhZ2V9ICAgICAgICAgICAgICA9IDB4MDRFNDsKKyAgICAkc2VsZi0+e19jb3VudHJ5fSAgICAgICAgICAgICAgID0gMTsKKyAgICAkc2VsZi0+e193b3Jrc2hlZXRzfSAgICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfc2hlZXRuYW1lc30gICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X2Zvcm1hdHN9ICAgICAgICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19wYWxldHRlfSAgICAgICAgICAgICAgID0gW107CisKKyAgICAkc2VsZi0+e191c2luZ190bXBmaWxlfSAgICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19maWxlaGFuZGxlfSAgICAgICAgICAgID0gIiI7CisgICAgJHNlbGYtPntfdGVtcF9maWxlfSAgICAgICAgICAgICA9ICIiOworICAgICRzZWxmLT57X2ludGVybmFsX2ZofSAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZoX291dH0gICAgICAgICAgICAgICAgPSAiIjsKKworICAgICRzZWxmLT57X3N0cl90b3RhbH0gICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3N0cl91bmlxdWV9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3N0cl90YWJsZX0gICAgICAgICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19zdHJfYXJyYXl9ICAgICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfc3RyX2Jsb2NrX3NpemVzfSAgICAgICA9IFtdOworICAgICRzZWxmLT57X2V4dHNzdF9vZmZzZXRzfSAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19leHRzc3RfYnVja2V0c30gICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19leHRzc3RfYnVja2V0X3NpemV9ICAgID0gMDsKKworICAgICRzZWxmLT57X2V4dF9yZWZfY291bnR9ICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2V4dF9yZWZzfSAgICAgICAgICAgICAgPSB7fTsKKworICAgICRzZWxmLT57X21zb19jbHVzdGVyc30gICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19tc29fc2l6ZX0gICAgICAgICAgICAgID0gMDsKKworICAgICRzZWxmLT57X2hpZGVvYmp9ICAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2NvbXBhdGliaWxpdHl9ICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfYWRkX2RvY19wcm9wZXJ0aWVzfSAgICA9IDA7CisgICAgJHNlbGYtPntfbG9jYWx0aW1lfSAgICAgICAgICAgICA9IFtsb2NhbHRpbWUoKV07CisKKyAgICAkc2VsZi0+e19kZWZpbmVkX25hbWVzfSAgICAgICAgID0gW107CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworCisKKyAgICAjIEFkZCB0aGUgaW4tYnVpbHQgc3R5bGUgZm9ybWF0cyBhbmQgdGhlIGRlZmF1bHQgY2VsbCBmb3JtYXQuCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDAgTm9ybWFsCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDEgUm93TGV2ZWwgMQorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICAyIFJvd0xldmVsIDIKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgMyBSb3dMZXZlbCAzCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDQgUm93TGV2ZWwgNAorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICA1IFJvd0xldmVsIDUKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgNiBSb3dMZXZlbCA2CisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDcgUm93TGV2ZWwgNworICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICA4IENvbExldmVsIDEKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgOSBDb2xMZXZlbCAyCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgMTAgQ29sTGV2ZWwgMworICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjIDExIENvbExldmVsIDQKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAxMiBDb2xMZXZlbCA1CisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgMTMgQ29sTGV2ZWwgNgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjIDE0IENvbExldmVsIDcKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxNSBDZWxsIFhGCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxLCBudW1fZm9ybWF0ID0+IDB4MkIpOyAgICMgMTYgQ29tbWEKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEsIG51bV9mb3JtYXQgPT4gMHgyOSk7ICAgIyAxNyBDb21tYVswXQorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSwgbnVtX2Zvcm1hdCA9PiAweDJDKTsgICAjIDE4IEN1cnJlbmN5CisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxLCBudW1fZm9ybWF0ID0+IDB4MkEpOyAgICMgMTkgQ3VycmVuY3lbMF0KKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEsIG51bV9mb3JtYXQgPT4gMHgwOSk7ICAgIyAyMCBQZXJjZW50CisKKworICAgICMgQWRkIHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgaHlwZXJsaW5rcworICAgICRzZWxmLT57X3VybF9mb3JtYXR9ID0gJHNlbGYtPmFkZF9mb3JtYXQoY29sb3IgPT4gJ2JsdWUnLCB1bmRlcmxpbmUgPT4gMSk7CisKKworICAgICMgQ2hlY2sgZm9yIGEgZmlsZW5hbWUgdW5sZXNzIGl0IGlzIGFuIGV4aXN0aW5nIGZpbGVoYW5kbGUKKyAgICBpZiAobm90IHJlZiAkc2VsZi0+e19maWxlbmFtZX0gYW5kICRzZWxmLT57X2ZpbGVuYW1lfSBlcSAnJykgeworICAgICAgICBjYXJwICdGaWxlbmFtZSByZXF1aXJlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCknOworICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorCisKKyAgICAjIENvbnZlcnQgdGhlIGZpbGVuYW1lIHRvIGEgZmlsZWhhbmRsZSB0byBwYXNzIHRvIHRoZSBPTEUgd3JpdGVyIHdoZW4gdGhlCisgICAgIyBmaWxlIGlzIGNsb3NlZC4gSWYgdGhlIGZpbGVuYW1lIGlzIGEgcmVmZXJlbmNlIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBpcworICAgICMgYSB2YWxpZCBmaWxlaGFuZGxlLgorICAgICMKKyAgICBpZiAobm90IHJlZiAkc2VsZi0+e19maWxlbmFtZX0pIHsKKworICAgICAgICBteSAkZmggPSBGaWxlSGFuZGxlLT5uZXcoJz4nLiAkc2VsZi0+e19maWxlbmFtZX0pOworCisgICAgICAgIGlmIChub3QgZGVmaW5lZCAkZmgpIHsKKyAgICAgICAgICAgIGNhcnAgIkNhbid0IG9wZW4gIiAuCisgICAgICAgICAgICAgICAgICAkc2VsZi0+e19maWxlbmFtZX0gLgorICAgICAgICAgICAgICAgICAgIi4gSXQgbWF5IGJlIGluIHVzZSBvciBwcm90ZWN0ZWQiOworICAgICAgICAgICAgcmV0dXJuIHVuZGVmOworICAgICAgICB9CisKKyAgICAgICAgIyBiaW5tb2RlIGZpbGUgd2hldGhlciBwbGF0Zm9ybSByZXF1aXJlcyBpdCBvciBub3QKKyAgICAgICAgYmlubW9kZSgkZmgpOworICAgICAgICAkc2VsZi0+e19pbnRlcm5hbF9maH0gPSAxOworICAgICAgICAkc2VsZi0+e19maF9vdXR9ICAgICAgPSAkZmg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19pbnRlcm5hbF9maH0gPSAwOworICAgICAgICAkc2VsZi0+e19maF9vdXR9ICAgICAgPSAkc2VsZi0+e19maWxlbmFtZX07CisKKyAgICB9CisKKworICAgICMgU2V0IGNvbG91ciBwYWxldHRlLgorICAgICRzZWxmLT5zZXRfcGFsZXR0ZV94bDk3KCk7CisKKyAgICAjIExvYWQgRW5jb2RlIGlmIHdlIGNhbi4KKyAgICByZXF1aXJlIEVuY29kZSBpZiAkXSA+PSA1LjAwODsKKworICAgICRzZWxmLT5faW5pdGlhbGl6ZSgpOworICAgICRzZWxmLT5fZ2V0X2NoZWNrc3VtX21ldGhvZCgpOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9pbml0aWFsaXplKCkKKyMKKyMgT3BlbiBhIHRtcCBmaWxlIHRvIHN0b3JlIHRoZSBtYWpvcml0eSBvZiB0aGUgV29ya3NoZWV0IGRhdGEuIElmIHRoaXMgZmFpbHMsCisjIGZvciBleGFtcGxlIGR1ZSB0byB3cml0ZSBwZXJtaXNzaW9ucywgc3RvcmUgdGhlIGRhdGEgaW4gbWVtb3J5LiBUaGlzIGNhbiBiZQorIyBzbG93IGZvciBsYXJnZSBmaWxlcy4KKyMKKyMgVE9ETzogTW92ZSB0aGlzIGFuZCBvdGhlciBtZXRob2RzIHNoYXJlZCB3aXRoIFdvcmtzaGVldCB1cCBpbnRvIEJJRkZ3cml0ZXIuCisjCitzdWIgX2luaXRpYWxpemUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmg7CisgICAgbXkgJHRtcF9kaXI7CisKKyAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBjb21wbGljYXRlZCBieSBXaW5kb3dzIGxpbWl0YXRpb25zLiBQb3J0ZXJzIGNhbgorICAgICMgY2hvb3NlIGEgbW9yZSBkaXJlY3QgbWV0aG9kLgorCisKKworICAgICMgSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSB1c2UgSU86OkZpbGUtPm5ld190bXBmaWxlKCkuIFRoaXMgbWF5IGZhaWwsIGluCisgICAgIyBwYXJ0aWN1bGFyIHdpdGggSUlTIG9uIFdpbmRvd3MsIHNvIHdlIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYSB0ZW1wCisgICAgIyBkaXJlY3RvcnkgdmlhIEZpbGU6OlRlbXAuCisgICAgIworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X3RlbXBkaXJ9KSB7CisKKyAgICAgICAgIyBEZWxheSBsb2FkaW5nIEZpbGU6VGVtcCB0byByZWR1Y2UgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMuCisgICAgICAgIGV2YWwgeyByZXF1aXJlIEZpbGU6OlRlbXAgfTsKKyAgICAgICAgZGllICJUaGUgRmlsZTo6VGVtcCBtb2R1bGUgbXVzdCBiZSBpbnN0YWxsZWQgaW4gb3JkZXIgIi4KKyAgICAgICAgICAgICJ0byBjYWxsIHNldF90ZW1wZGlyKCkuXG4iIGlmICRAOworCisKKyAgICAgICAgIyBUcmFwIGJ1dCBpZ25vcmUgRmlsZTo6VGVtcCBlcnJvcnMuCisgICAgICAgIGV2YWwgeyAkZmggPSBGaWxlOjpUZW1wOjp0ZW1wZmlsZShESVIgPT4gJHNlbGYtPntfdGVtcGRpcn0pIH07CisKKyAgICAgICAgIyBTdG9yZSB0aGUgZmFpbGVkIHRtcCBkaXIgaW4gY2FzZSBvZiBlcnJvcnMuCisgICAgICAgICR0bXBfZGlyID0gJHNlbGYtPntfdGVtcGRpcn0gfHwgRmlsZTo6U3BlYy0+dG1wZGlyIGlmIG5vdCAkZmg7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICRmaCA9IElPOjpGaWxlLT5uZXdfdG1wZmlsZSgpOworCisgICAgICAgICMgU3RvcmUgdGhlIGZhaWxlZCB0bXAgZGlyIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgICAgICAkdG1wX2RpciA9ICJQT1NJWDo6dG1wbmFtKCkgZGlyZWN0b3J5IiBpZiBub3QgJGZoOworICAgIH0KKworCisgICAgIyBDaGVjayBpZiB0aGUgdGVtcCBmaWxlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLiBFbHNlIHN0b3JlIGRhdGEgaW4gbWVtb3J5LgorICAgIGlmICgkZmgpIHsKKworICAgICAgICAjIGJpbm1vZGUgZmlsZSB3aGV0aGVyIHBsYXRmb3JtIHJlcXVpcmVzIGl0IG9yIG5vdC4KKyAgICAgICAgYmlubW9kZSgkZmgpOworCisgICAgICAgICMgU3RvcmUgZmlsZWhhbmRsZQorICAgICAgICAkc2VsZi0+e19maWxlaGFuZGxlfSA9ICRmaDsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBTZXQgZmxhZyB0byBzdG9yZSBkYXRhIGluIG1lbW9yeSBpZiBYWDo6dGVtcGZpbGUoKSBmYWlsZWQuCisgICAgICAgICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9ID0gMDsKKworICAgICAgICBpZiAoJF5XKSB7CisgICAgICAgICAgICBteSAkZGlyID0gJHNlbGYtPntfdGVtcGRpcn0gfHwgRmlsZTo6U3BlYy0+dG1wZGlyKCk7CisKKyAgICAgICAgICAgIHdhcm4gIlVuYWJsZSB0byBjcmVhdGUgdGVtcCBmaWxlcyBpbiAkdG1wX2Rpci4gRGF0YSB3aWxsIGJlICIuCisgICAgICAgICAgICAgICAgICJzdG9yZWQgaW4gbWVtb3J5LiBSZWZlciB0byBzZXRfdGVtcGRpcigpIGluIHRoZSAiLgorICAgICAgICAgICAgICAgICAiU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbi5cbiIgOworICAgICAgICB9CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9jaGVja3N1bV9tZXRob2QuCisjCisjIENoZWNrIGZvciBtb2R1bGVzIGF2YWlsYWJsZSB0byBjYWxjdWxhdGUgaW1hZ2UgY2hlY2tzdW0uIEV4Y2VsIHVzZXMgTUQ0IGJ1dAorIyBNRDUgd2lsbCBhbHNvIHdvcmsuCisjCitzdWIgX2dldF9jaGVja3N1bV9tZXRob2QgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGV2YWwgeyByZXF1aXJlIERpZ2VzdDo6TUQ0fTsKKyAgICBpZiAobm90ICRAKSB7CisgICAgICAgICRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPSAxOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBldmFsIHsgcmVxdWlyZSBEaWdlc3Q6OlBlcmw6Ok1ENH07CisgICAgaWYgKG5vdCAkQCkgeworICAgICAgICAkc2VsZi0+e19jaGVja3N1bV9tZXRob2R9ID0gMjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgZXZhbCB7IHJlcXVpcmUgRGlnZXN0OjpNRDV9OworICAgIGlmIChub3QgJEApIHsKKyAgICAgICAgJHNlbGYtPntfY2hlY2tzdW1fbWV0aG9kfSA9IDM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAjIERlZmF1bHQuCisgICAgJHNlbGYtPntfY2hlY2tzdW1fbWV0aG9kfSA9IDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfYXBwZW5kKCksIG92ZXJyaWRkZW4uCisjCisjIFN0b3JlIFdvcmtzaGVldCBkYXRhIGluIG1lbW9yeSB1c2luZyB0aGUgYmFzZSBjbGFzcyBfYXBwZW5kKCkgb3IgdG8gYQorIyB0ZW1wb3JhcnkgZmlsZSwgdGhlIGRlZmF1bHQuCisjCitzdWIgX2FwcGVuZCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRkYXRhID0gJyc7CisKKyAgICBpZiAoJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0pIHsKKyAgICAgICAgJGRhdGEgPSBqb2luKCcnLCBAXyk7CisKKyAgICAgICAgIyBBZGQgQ09OVElOVUUgcmVjb3JkcyBpZiBuZWNlc3NhcnkKKyAgICAgICAgJGRhdGEgPSAkc2VsZi0+X2FkZF9jb250aW51ZSgkZGF0YSkgaWYgbGVuZ3RoKCRkYXRhKSA+ICRzZWxmLT57X2xpbWl0fTsKKworICAgICAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAkZGF0YTsKKyAgICAgICAgJHNlbGYtPntfZGF0YXNpemV9ICs9IGxlbmd0aCgkZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkZGF0YSA9ICRzZWxmLT5TVVBFUjo6X2FwcGVuZChAXyk7CisgICAgfQorCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2RhdGEoKS4KKyMKKyMgUmV0cmlldmVzIGRhdGEgZnJvbSBtZW1vcnkgaW4gb25lIGNodW5rLCBvciBmcm9tIGRpc2sgaW4gJGJ1ZmZlcgorIyBzaXplZCBjaHVua3MuCisjCitzdWIgZ2V0X2RhdGEgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICRidWZmZXIgPSA0MDk2OworICAgIG15ICR0bXA7CisKKyAgICAjIFJldHVybiBkYXRhIHN0b3JlZCBpbiBtZW1vcnkKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e19kYXRhfSkgeworICAgICAgICAkdG1wICAgICAgICAgICA9ICRzZWxmLT57X2RhdGF9OworICAgICAgICAkc2VsZi0+e19kYXRhfSA9IHVuZGVmOworICAgICAgICBteSAkZmggICAgICAgICA9ICRzZWxmLT57X2ZpbGVoYW5kbGV9OworICAgICAgICBzZWVrKCRmaCwgMCwgMCkgaWYgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX07CisgICAgICAgIHJldHVybiAkdG1wOworICAgIH0KKworICAgICMgUmV0dXJuIGRhdGEgc3RvcmVkIG9uIGRpc2sKKyAgICBpZiAoJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0pIHsKKyAgICAgICAgcmV0dXJuICR0bXAgaWYgcmVhZCgkc2VsZi0+e19maWxlaGFuZGxlfSwgJHRtcCwgJGJ1ZmZlcik7CisgICAgfQorCisgICAgIyBObyBkYXRhIHRvIHJldHVybgorICAgIHJldHVybiB1bmRlZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNsb3NlKCkKKyMKKyMgQ2FsbHMgZmluYWxpemF0aW9uIG1ldGhvZHMgYW5kIGV4cGxpY2l0bHkgY2xvc2UgdGhlIE9MRXdyaXRlciBmaWxlCisjIGhhbmRsZS4KKyMKK3N1YiBjbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIGlmICRzZWxmLT57X2ZpbGVjbG9zZWR9OyAjIFByZXZlbnQgY2xvc2UoKSBmcm9tIGJlaW5nIGNhbGxlZCB0d2ljZS4KKworICAgICRzZWxmLT57X2ZpbGVjbG9zZWR9ID0gMTsKKworICAgIHJldHVybiAkc2VsZi0+X3N0b3JlX3dvcmtib29rKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBERVNUUk9ZKCkKKyMKKyMgQ2xvc2UgdGhlIHdvcmtib29rIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZXhwbGljaXRseSBjbG9zZWQuCisjCitzdWIgREVTVFJPWSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbG9jYWwgKCRALCAkISwgJF5FLCAkPyk7CisKKyAgICAkc2VsZi0+Y2xvc2UoKSBpZiBub3QgJHNlbGYtPntfZmlsZWNsb3NlZH07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzaGVldHMoc2xpY2UsLi4uKQorIworIyBBbiBhY2Nlc3NvciBmb3IgdGhlIF93b3Jrc2hlZXRzW10gYXJyYXkKKyMKKyMgUmV0dXJuczogYW4gb3B0aW9uYWxseSBzbGljZWQgbGlzdCBvZiB0aGUgd29ya3NoZWV0IG9iamVjdHMgaW4gYSB3b3JrYm9vay4KKyMKK3N1YiBzaGVldHMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmIChAXykgeworICAgICAgICAjIFJldHVybiBhIHNsaWNlIG9mIHRoZSBhcnJheQorICAgICAgICByZXR1cm4gQHskc2VsZi0+e193b3Jrc2hlZXRzfX1bQF9dOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBSZXR1cm4gdGhlIGVudGlyZSBsaXN0CisgICAgICAgIHJldHVybiBAeyRzZWxmLT57X3dvcmtzaGVldHN9fTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3b3Jrc2hlZXRzKCkKKyMKKyMgQW4gYWNjZXNzb3IgZm9yIHRoZSBfd29ya3NoZWV0c1tdIGFycmF5LgorIyBUaGlzIG1ldGhvZCBpcyBub3cgZGVwcmVjYXRlZC4gVXNlIHRoZSBzaGVldHMoKSBtZXRob2QgaW5zdGVhZC4KKyMKKyMgUmV0dXJuczogYW4gYXJyYXkgcmVmZXJlbmNlCisjCitzdWIgd29ya3NoZWV0cyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57X3dvcmtzaGVldHN9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgYWRkX3dvcmtzaGVldCgkbmFtZSwgJGVuY29kaW5nKQorIworIyBBZGQgYSBuZXcgd29ya3NoZWV0IHRvIHRoZSBFeGNlbCB3b3JrYm9vay4KKyMKKyMgUmV0dXJuczogcmVmZXJlbmNlIHRvIGEgd29ya3NoZWV0IG9iamVjdAorIworc3ViIGFkZF93b3Jrc2hlZXQgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJGluZGV4ICAgID0gQHskc2VsZi0+e193b3Jrc2hlZXRzfX07CisKKyAgICBteSAoJG5hbWUsICRlbmNvZGluZykgPSAkc2VsZi0+X2NoZWNrX3NoZWV0bmFtZSgkX1swXSwgJF9bMV0pOworCisKKyAgICAjIFBvcnRlcnMgdGFrZSBub3RlLCB0aGUgZm9sbG93aW5nIHNjaGVtZSBvZiBwYXNzaW5nIHJlZmVyZW5jZXMgdG8gV29ya2Jvb2sKKyAgICAjIGRhdGEgKGluIHRoZSBcJHNlbGYtPntfZm9vfSBjYXNlcykgaW5zdGVhZCBvZiBhIHJlZmVyZW5jZSB0byB0aGUgV29ya2Jvb2sKKyAgICAjIGl0c2VsZiBpcyBhIHdvcmthcm91bmQgdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIFdvcmtib29rIGFuZAorICAgICMgV29ya3NoZWV0IG9iamVjdHMuIEZlZWwgZnJlZSB0byBpbXBsZW1lbnQgdGhpcyBpbiBhbnkgd2F5IHRoZSBzdWl0cyB5b3VyCisgICAgIyBsYW5ndWFnZS4KKyAgICAjCisgICAgbXkgQGluaXRfZGF0YSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X2FjdGl2ZXNoZWV0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19maXJzdHNoZWV0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e191cmxfZm9ybWF0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19wYXJzZXJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RlbXBkaXJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl90b3RhbH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfc3RyX3VuaXF1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfc3RyX3RhYmxlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e18xOTA0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgIyBQYWxldHRlLiBOb3QgdXNlZCB5ZXQuIFNlZSBhZGRfY2hhcnQoKS4KKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIG15ICR3b3Jrc2hlZXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0LT5uZXcoQGluaXRfZGF0YSk7CisgICAgJHNlbGYtPntfd29ya3NoZWV0c30tPlskaW5kZXhdID0gJHdvcmtzaGVldDsgICAgICMgU3RvcmUgcmVmIGZvciBpdGVyYXRvcgorICAgICRzZWxmLT57X3NoZWV0bmFtZXN9LT5bJGluZGV4XSA9ICRuYW1lOyAgICAgICAgICAjIFN0b3JlIEVYVEVSTlNIRUVUIG5hbWVzCisgICAgJHNlbGYtPntfcGFyc2VyfS0+c2V0X2V4dF9zaGVldHMoJG5hbWUsICRpbmRleCk7ICMgU3RvcmUgbmFtZXMgaW4gRm9ybXVsYS5wbQorICAgIHJldHVybiAkd29ya3NoZWV0OworfQorCisjIE9sZGVyIG1ldGhvZCBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyphZGR3b3Jrc2hlZXQgPSAqYWRkX3dvcmtzaGVldDsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFkZF9jaGFydCglYXJncykKKyMKKyMgQ3JlYXRlIGEgY2hhcnQgZm9yIGVtYmVkZGluZyBvciBhcyBhcyBuZXcgc2hlZXQuCisjCisjCitzdWIgYWRkX2NoYXJ0IHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICVhcmcgICAgICA9IEBfOworICAgIG15ICRuYW1lICAgICA9ICcnOworICAgIG15ICRlbmNvZGluZyA9IDA7CisgICAgbXkgJGluZGV4ICAgID0gQHsgJHNlbGYtPntfd29ya3NoZWV0c30gfTsKKworICAgICMgVHlwZSBtdXN0IGJlIHNwZWNpZmllZCBzbyB3ZSBjYW4gY3JlYXRlIHRoZSByZXF1aXJlZCBjaGFydCBpbnN0YW5jZS4KKyAgICBteSAkdHlwZSA9ICRhcmd7dHlwZX07CisgICAgaWYgKCAhZGVmaW5lZCAkdHlwZSApIHsKKyAgICAgICAgY3JvYWsgIk11c3QgZGVmaW5lIGNoYXJ0IHR5cGUgaW4gYWRkX2NoYXJ0KCkiOworICAgIH0KKworICAgICMgRW5zdXJlIHRoYXQgdGhlIGNoYXJ0IGRlZmF1bHRzIHRvIG5vbiBlbWJlZGRlZC4KKyAgICBteSAkZW1iZWRkZWQgPSAkYXJne2VtYmVkZGVkfSB8fD0gMDsKKworICAgICMgQ2hlY2sgdGhlIHdvcmtzaGVldCBuYW1lIGZvciBub24tZW1iZWRkZWQgY2hhcnRzLgorICAgIGlmICggISRlbWJlZGRlZCApIHsKKyAgICAgICAgKCAkbmFtZSwgJGVuY29kaW5nICkgPQorICAgICAgICAgICRzZWxmLT5fY2hlY2tfc2hlZXRuYW1lKCAkYXJne25hbWV9LCAkYXJne25hbWVfZW5jb2Rpbmd9LCAxICk7CisgICAgfQorCisgICAgbXkgQGluaXRfZGF0YSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X2FjdGl2ZXNoZWV0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19maXJzdHNoZWV0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e191cmxfZm9ybWF0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19wYXJzZXJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RlbXBkaXJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl90b3RhbH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfc3RyX3VuaXF1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfc3RyX3RhYmxlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e18xOTA0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19wYWxldHRlfSwKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIG15ICRjaGFydCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+ZmFjdG9yeSggJHR5cGUsIEBpbml0X2RhdGEgKTsKKworICAgICMgSWYgdGhlIGNoYXJ0IGlzbid0IGVtYmVkZGVkIGxldCB0aGUgd29ya2Jvb2sgY29udHJvbCBpdC4KKyAgICBpZiAoICEkZW1iZWRkZWQgKSB7CisgICAgICAgICRzZWxmLT57X3dvcmtzaGVldHN9LT5bJGluZGV4XSA9ICRjaGFydDsgICAgIyBTdG9yZSByZWYgZm9yIGl0ZXJhdG9yCisgICAgICAgICRzZWxmLT57X3NoZWV0bmFtZXN9LT5bJGluZGV4XSA9ICRuYW1lOyAgICAgIyBTdG9yZSBFWFRFUk5TSEVFVCBuYW1lcworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBTZXQgaW5kZXggdG8gMCBzbyB0aGF0IHRoZSBhY3RpdmF0ZSgpIGFuZCBzZXRfZmlyc3Rfc2hlZXQoKSBtZXRob2RzCisgICAgICAgICMgcG9pbnQgYmFjayB0byB0aGUgZmlyc3Qgd29ya3NoZWV0IGlmIHVzZWQgZm9yIGVtYmVkZGVkIGNoYXJ0cy4KKyAgICAgICAgJGNoYXJ0LT57X2luZGV4fSA9IDA7CisKKyAgICAgICAgJGNoYXJ0LT5fc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhKCk7CisgICAgfQorCisgICAgcmV0dXJuICRjaGFydDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFkZF9jaGFydF9leHQoJGZpbGVuYW1lLCAkbmFtZSkKKyMKKyMgQWRkIGFuIGV4dGVybmFsbHkgY3JlYXRlZCBjaGFydC4KKyMKKyMKK3N1YiBhZGRfY2hhcnRfZXh0IHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9ICRfWzBdOworICAgIG15ICRpbmRleCAgICA9IEB7JHNlbGYtPntfd29ya3NoZWV0c319OworICAgIG15ICR0eXBlICAgICA9ICdleHRlcm5hbCc7CisKKyAgICBteSAoJG5hbWUsICRlbmNvZGluZykgPSAkc2VsZi0+X2NoZWNrX3NoZWV0bmFtZSgkX1sxXSwgJF9bMl0pOworCisKKyAgICBteSBAaW5pdF9kYXRhID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X2FjdGl2ZXNoZWV0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19maXJzdHNoZWV0fSwKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIG15ICRjaGFydCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+ZmFjdG9yeSgkdHlwZSwgQGluaXRfZGF0YSk7CisgICAgJHNlbGYtPntfd29ya3NoZWV0c30tPlskaW5kZXhdID0gJGNoYXJ0OyAgICAgICAgICMgU3RvcmUgcmVmIGZvciBpdGVyYXRvcgorICAgICRzZWxmLT57X3NoZWV0bmFtZXN9LT5bJGluZGV4XSA9ICRuYW1lOyAgICAgICAgICAjIFN0b3JlIEVYVEVSTlNIRUVUIG5hbWVzCisKKyAgICByZXR1cm4gJGNoYXJ0OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NoZWNrX3NoZWV0bmFtZSgkbmFtZSwgJGVuY29kaW5nKQorIworIyBDaGVjayBmb3IgdmFsaWQgd29ya3NoZWV0IG5hbWVzLiBXZSBjaGVjayB0aGUgbGVuZ3RoLCBpZiBpdCBjb250YWlucyBhbnkKKyMgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCBpZiB0aGUgbmFtZSBpcyB1bmlxdWUgaW4gdGhlIHdvcmtib29rLgorIworc3ViIF9jaGVja19zaGVldG5hbWUgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRuYW1lICAgICAgICAgICAgPSAkX1swXSB8fCAiIjsKKyAgICBteSAkZW5jb2RpbmcgICAgICAgID0gJF9bMV0gfHwgMDsKKyAgICBteSAkY2hhcnQgICAgICAgICAgID0gJF9bMl0gfHwgMDsKKyAgICBteSAkbGltaXQgICAgICAgICAgID0gJGVuY29kaW5nID8gNjIgOiAzMTsKKyAgICBteSAkaW52YWxpZF9jaGFyICAgID0gcXIoW1xbXF06Kj8vXFxdKTsKKworICAgICMgSW5jcmVtZW50IHRoZSBTaGVldC9DaGFydCBudW1iZXIgdXNlZCBmb3IgZGVmYXVsdCBzaGVldCBuYW1lcyBiZWxvdy4KKyAgICBpZiAoICRjaGFydCApIHsKKyAgICAgICAgJHNlbGYtPntfY2hhcnRfY291bnR9Kys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19zaGVldF9jb3VudH0rKzsKKyAgICB9CisKKyAgICAjIFN1cHBseSBkZWZhdWx0IFNoZWV0L0NoYXJ0IG5hbWUgaWYgbm9uZSBoYXMgYmVlbiBkZWZpbmVkLgorICAgIGlmICggJG5hbWUgZXEgIiIgKSB7CisgICAgICAgICRlbmNvZGluZyA9IDA7CisKKyAgICAgICAgaWYgKCAkY2hhcnQgKSB7CisgICAgICAgICAgICAkbmFtZSA9ICRzZWxmLT57X2NoYXJ0X25hbWV9IC4gJHNlbGYtPntfY2hhcnRfY291bnR9OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJG5hbWUgPSAkc2VsZi0+e19zaGVldF9uYW1lfSAuICRzZWxmLT57X3NoZWV0X2NvdW50fTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBDaGVjayB0aGF0IHNoZWV0bmFtZSBpcyA8PSAzMSAoMSBvciAyIGJ5dGUgY2hhcnMpLiBFeGNlbCBsaW1pdC4KKyAgICBjcm9hayAiU2hlZXRuYW1lICRuYW1lIG11c3QgYmUgPD0gMzEgY2hhcnMiIGlmIGxlbmd0aCAkbmFtZSA+ICRsaW1pdDsKKworICAgICMgQ2hlY2sgdGhhdCBVbmljb2RlIHNoZWV0bmFtZSBoYXMgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMKKyAgICBjcm9hayAnT2RkIG51bWJlciBvZiBieXRlcyBpbiBVbmljb2RlIHdvcmtzaGVldCBuYW1lOicgLiAkbmFtZQorICAgICAgICAgIGlmICRlbmNvZGluZyA9PSAxIGFuZCBsZW5ndGgoJG5hbWUpICUgMjsKKworCisgICAgIyBDaGVjayB0aGF0IHNoZWV0bmFtZSBkb2Vzbid0IGNvbnRhaW4gYW55IGludmFsaWQgY2hhcmFjdGVycworICAgIGlmICgkZW5jb2RpbmcgIT0gMSBhbmQgJG5hbWUgPX4gJGludmFsaWRfY2hhcikgeworICAgICAgICAjIENoZWNrIEFTQ0lJIG5hbWVzCisgICAgICAgIGNyb2FrICdJbnZhbGlkIGNoYXJhY3RlciBbXToqPy9cXCBpbiB3b3Jrc2hlZXQgbmFtZTogJyAuICRuYW1lOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBFeHRyYWN0IGFueSA4Yml0IGNsZWFuIGNoYXJzIGZyb20gdGhlIFVURjE2IG5hbWUgYW5kIHZhbGlkYXRlIHRoZW0uCisgICAgICAgIGZvciBteSAkd2NoYXIgKCRuYW1lID1+IC8uLi9zZykgeworICAgICAgICAgICAgbXkgKCRoaSwgJGxvKSA9IHVucGFjayAiYWEiLCAkd2NoYXI7CisgICAgICAgICAgICBpZiAoJGhpIGVxICJcMCIgYW5kICRsbyA9fiAkaW52YWxpZF9jaGFyKSB7CisgICAgICAgICAgICAgICAgY3JvYWsgJ0ludmFsaWQgY2hhcmFjdGVyIFtdOio/L1xcIGluIHdvcmtzaGVldCBuYW1lOiAnIC4gJG5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkbmFtZSkpIHsKKyAgICAgICAgICAgICRuYW1lID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkJFIiwgJG5hbWUpOworICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBDaGVjayB0aGF0IHRoZSB3b3Jrc2hlZXQgbmFtZSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgc2luY2UgdGhpcyBpcyBhIGZhdGFsCisgICAgIyBlcnJvciBpbiBFeGNlbCA5Ny4gVGhlIGNoZWNrIG11c3QgYWxzbyBleGNsdWRlIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hlcworICAgICMgc2luY2UgdGhlIG5hbWVzICdTaGVldDEnIGFuZCAnc2hlZXQxJyBhcmUgZXF1aXZhbGVudC4gVGhlIHRlc3RzIGFsc28gaGF2ZQorICAgICMgdG8gdGFrZSB0aGUgZW5jb2RpbmcgaW50byBhY2NvdW50LgorICAgICMKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgIG15ICRuYW1lX2EgID0gJG5hbWU7CisgICAgICAgIG15ICRlbmNkX2EgID0gJGVuY29kaW5nOworICAgICAgICBteSAkbmFtZV9iICA9ICR3b3Jrc2hlZXQtPntfbmFtZX07CisgICAgICAgIG15ICRlbmNkX2IgID0gJHdvcmtzaGVldC0+e19lbmNvZGluZ307CisgICAgICAgIG15ICRlcnJvciAgID0gMDsKKworICAgICAgICBpZiAgICAoJGVuY2RfYSA9PSAwIGFuZCAkZW5jZF9iID09IDApIHsKKyAgICAgICAgICAgICRlcnJvciAgPSAxIGlmIGxjKCRuYW1lX2EpIGVxIGxjKCRuYW1lX2IpOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZW5jZF9hID09IDAgYW5kICRlbmNkX2IgPT0gMSkgeworICAgICAgICAgICAgJG5hbWVfYSA9IHBhY2sgIm4qIiwgdW5wYWNrICJDKiIsICRuYW1lX2E7CisgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiBsYygkbmFtZV9hKSBlcSBsYygkbmFtZV9iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGVuY2RfYSA9PSAxIGFuZCAkZW5jZF9iID09IDApIHsKKyAgICAgICAgICAgICRuYW1lX2IgPSBwYWNrICJuKiIsIHVucGFjayAiQyoiLCAkbmFtZV9iOworICAgICAgICAgICAgJGVycm9yICA9IDEgaWYgbGMoJG5hbWVfYSkgZXEgbGMoJG5hbWVfYik7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRlbmNkX2EgPT0gMSBhbmQgJGVuY2RfYiA9PSAxKSB7CisgICAgICAgICAgICAjIFdlIGNhbiBkbyBhIHRydWUgY2FzZSBpbnNlbnNpdGl2ZSB0ZXN0IHdpdGggUGVybCA1LjggYW5kIHV0ZjguCisgICAgICAgICAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgICAgICAgICAkbmFtZV9hID0gRW5jb2RlOjpkZWNvZGUoIlVURi0xNkJFIiwgJG5hbWVfYSk7CisgICAgICAgICAgICAgICAgJG5hbWVfYiA9IEVuY29kZTo6ZGVjb2RlKCJVVEYtMTZCRSIsICRuYW1lX2IpOworICAgICAgICAgICAgICAgICRlcnJvciAgPSAxIGlmIGxjKCRuYW1lX2EpIGVxIGxjKCRuYW1lX2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFdlIGNhbid0IGVhc2lseSBkbyBhIGNhc2UgaW5zZW5zaXRpdmUgdGVzdCBvZiB0aGUgVVRGMTYgbmFtZXMuCisgICAgICAgICAgICAjIEFzIGEgc3BlY2lhbCBjYXNlIHdlIGNoZWNrIGlmIGFsbCBvZiB0aGUgaGlnaCBieXRlcyBhcmUgbnVsbHMgYW5kCisgICAgICAgICAgICAjIHRoZW4gZG8gYW4gQVNDSUkgc3R5bGUgY2FzZSBpbnNlbnNpdGl2ZSB0ZXN0LgorCisgICAgICAgICAgICAgICAgIyBTdHJpcCBvdXQgdGhlIGhpZ2ggYnl0ZXMgKGZ1bmtpbHkpLgorICAgICAgICAgICAgICAgIG15ICRoaV9hID0gZ3JlcCB7b3JkfSAkbmFtZV9hID1+IC8oLikuL3NnOworICAgICAgICAgICAgICAgIG15ICRoaV9iID0gZ3JlcCB7b3JkfSAkbmFtZV9iID1+IC8oLikuL3NnOworCisgICAgICAgICAgICAgICAgaWYgKCRoaV9hIG9yICRoaV9iKSB7CisgICAgICAgICAgICAgICAgICAgICRlcnJvciAgPSAxIGlmICAgICRuYW1lX2EgIGVxICAgICRuYW1lX2I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiBsYygkbmFtZV9hKSBlcSBsYygkbmFtZV9iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIElmIGFueSBvZiB0aGUgY2FzZXMgZmFpbGVkIHdlIHRocm93IHRoZSBlcnJvciBoZXJlLgorICAgICAgICBpZiAoJGVycm9yKSB7CisgICAgICAgICAgICBjcm9hayAiV29ya3NoZWV0IG5hbWUgJyRuYW1lJywgd2l0aCBjYXNlIGlnbm9yZWQsICIgLgorICAgICAgICAgICAgICAgICAgImlzIGFscmVhZHkgaW4gdXNlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoJG5hbWUsICAkZW5jb2RpbmcpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgYWRkX2Zvcm1hdCglcHJvcGVydGllcykKKyMKKyMgQWRkIGEgbmV3IGZvcm1hdCB0byB0aGUgRXhjZWwgd29ya2Jvb2suIFRoaXMgYWRkcyBhbiBYRiByZWNvcmQgYW5kCisjIGEgRk9OVCByZWNvcmQuIEFsc28sIHBhc3MgYW55IHByb3BlcnRpZXMgdG8gdGhlIEZvcm1hdDo6bmV3KCkuCisjCitzdWIgYWRkX2Zvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGZvcm1hdCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQtPm5ldygkc2VsZi0+e194Zl9pbmRleH0sIEBfKTsKKworICAgICRzZWxmLT57X3hmX2luZGV4fSArPSAxOworICAgIHB1c2ggQHskc2VsZi0+e19mb3JtYXRzfX0sICRmb3JtYXQ7ICMgU3RvcmUgZm9ybWF0IHJlZmVyZW5jZQorCisgICAgcmV0dXJuICRmb3JtYXQ7Cit9CisKKyMgT2xkZXIgbWV0aG9kIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorKmFkZGZvcm1hdCA9ICphZGRfZm9ybWF0OworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgY29tcGF0aWJpbGl0eV9tb2RlKCkKKyMKKyMgU2V0IHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisjCisjIEV4Y2VsIGRvZXNuJ3QgcmVxdWlyZSBldmVyeSBwb3NzaWJsZSBCaWZmIHJlY29yZCB0byBiZSBwcmVzZW50IGluIGEgZmlsZS4KKyMgSW4gcGFydGljdWxhciBpZiB0aGUgaW5kZXhpbmcgcmVjb3JkcyBJTkRFWCwgUk9XIGFuZCBEQkNFTEwgYXJlbid0IHByZXNlbnQKKyMgaXQganVzdCBpZ25vcmVzIHRoZSBmYWN0IGFuZCByZWFkcyB0aGUgY2VsbHMgYW55d2F5LiBUaGlzIGlzIGFsc28gdHJ1ZSBvZgorIyB0aGUgRVhUU1NUIHJlY29yZC4gR251bWVyaWMgYW5kIE9PbyBhbHNvIHRha2UgdGhpcyBhcHByb2FjaC4gVGhpcyBhbGxvd3MKKyMgV3JpdGVFeGNlbCB0byBpZ25vcmUgdGhlc2UgcmVjb3JkcyBpbiBvcmRlciB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGRhdGEKKyMgc3RvcmVkIGluIG1lbW9yeS4gSG93ZXZlciwgb3RoZXIgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIHRoYXQgcmVhZCBFeGNlbAorIyBmaWxlcyBvZnRlbiBleHBlY3QgdGhlc2UgcmVjb3JkcyB0byBiZSBwcmVzZW50LiBJbiAiY29tcGF0aWJpbGl0eSBtb2RlIgorIyBXcml0ZUV4Y2VsIHdyaXRlcyB0aGVzZSByZWNvcmRzIGFuZCB0cmllcyB0byBiZSBhcyBjbG9zZSB0byBhbiBFeGNlbAorIyBnZW5lcmF0ZWQgZmlsZSBhcyBwb3NzaWJsZS4KKyMKKyMgVGhpcyByZXF1aXJlcyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc3RvcmVkIGluIG1lbW9yeSB1bnRpbCB0aGUgZmlsZSBpcworIyBhYm91dCB0byBiZSB3cml0dGVuLiBUaGlzIGluY3VycyBhIG1lbW9yeSBhbmQgc3BlZWQgcGVuYWx0eSBhbmQgbWF5IG5vdCBiZQorIyBzdWl0YWJsZSBmb3IgdmVyeSBsYXJnZSBmaWxlcy4KKyMKK3N1YiBjb21wYXRpYmlsaXR5X21vZGUgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworCisgICAgY3JvYWsgImNvbXBhdGliaWxpdHlfbW9kZSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhZGRfd29ya3NoZWV0KCkiCisgICAgICAgICAgaWYgJHNlbGYtPnNoZWV0cygpOworCisgICAgaWYgKGRlZmluZWQoJF9bMF0pKSB7CisgICAgICAgICRzZWxmLT57X2NvbXBhdGliaWxpdHl9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0XzE5MDQoKQorIworIyBTZXQgdGhlIGRhdGUgc3lzdGVtOiAwID0gMTkwMCAodGhlIGRlZmF1bHQpLCAxID0gMTkwNAorIworc3ViIHNldF8xOTA0IHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIGNyb2FrICJzZXRfMTkwNCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhZGRfd29ya3NoZWV0KCkiCisgICAgICAgICAgaWYgJHNlbGYtPnNoZWV0cygpOworCisKKyAgICBpZiAoZGVmaW5lZCgkX1swXSkpIHsKKyAgICAgICAgJHNlbGYtPntfMTkwNH0gPSAkX1swXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57XzE5MDR9ID0gMTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfMTkwNCgpCisjCisjIFJldHVybiB0aGUgZGF0ZSBzeXN0ZW06IDAgPSAxOTAwLCAxID0gMTkwNAorIworc3ViIGdldF8xOTA0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfMTkwNH07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfY3VzdG9tX2NvbG9yKCkKKyMKKyMgQ2hhbmdlIHRoZSBSR0IgY29tcG9uZW50cyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbG91ciBwYWxldHRlLgorIworc3ViIHNldF9jdXN0b21fY29sb3IgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworCisgICAgIyBNYXRjaCBhIEhUTUwgI3h4eXl6eiBzdHlsZSBwYXJhbWV0ZXIKKyAgICBpZiAoZGVmaW5lZCAkX1sxXSBhbmQgJF9bMV0gPX4gL14jKFx3XHcpKFx3XHcpKFx3XHcpLyApIHsKKyAgICAgICAgQF8gPSAoJF9bMF0sIGhleCAkMSwgaGV4ICQyLCBoZXggJDMpOworICAgIH0KKworCisgICAgbXkgJGluZGV4ICAgPSAkX1swXSB8fCAwOworICAgIG15ICRyZWQgICAgID0gJF9bMV0gfHwgMDsKKyAgICBteSAkZ3JlZW4gICA9ICRfWzJdIHx8IDA7CisgICAgbXkgJGJsdWUgICAgPSAkX1szXSB8fCAwOworCisgICAgbXkgJGFyZWYgICAgPSAkc2VsZi0+e19wYWxldHRlfTsKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgY29sb3VyIGluZGV4IGlzIHRoZSByaWdodCByYW5nZQorICAgIGlmICgkaW5kZXggPCA4IG9yICRpbmRleCA+IDY0KSB7CisgICAgICAgIGNhcnAgIkNvbG9yIGluZGV4ICRpbmRleCBvdXRzaWRlIHJhbmdlOiA4IDw9IGluZGV4IDw9IDY0IjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgIyBDaGVjayB0aGF0IHRoZSBjb2xvdXIgY29tcG9uZW50cyBhcmUgaW4gdGhlIHJpZ2h0IHJhbmdlCisgICAgaWYgKCAoJHJlZCAgIDwgMCBvciAkcmVkICAgPiAyNTUpIHx8CisgICAgICAgICAoJGdyZWVuIDwgMCBvciAkZ3JlZW4gPiAyNTUpIHx8CisgICAgICAgICAoJGJsdWUgIDwgMCBvciAkYmx1ZSAgPiAyNTUpICkKKyAgICB7CisgICAgICAgIGNhcnAgIkNvbG9yIGNvbXBvbmVudCBvdXRzaWRlIHJhbmdlOiAwIDw9IGNvbG9yIDw9IDI1NSI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICRpbmRleCAtPTg7ICMgQWRqdXN0IGNvbG91ciBpbmRleCAod2luZ2xlc3MgZHJhZ29uZmx5KQorCisgICAgIyBTZXQgdGhlIFJHQiB2YWx1ZQorICAgICRhcmVmLT5bJGluZGV4XSA9IFskcmVkLCAkZ3JlZW4sICRibHVlLCAwXTsKKworICAgIHJldHVybiAkaW5kZXggKzg7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfcGFsZXR0ZV94bDk3KCkKKyMKKyMgU2V0cyB0aGUgY29sb3VyIHBhbGV0dGUgdG8gdGhlIEV4Y2VsIDk3KyBkZWZhdWx0LgorIworc3ViIHNldF9wYWxldHRlX3hsOTcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X3BhbGV0dGV9ID0gWworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDAwLCAweDAwLCAweDAwXSwgICAjIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHhmZiwgMHhmZiwgMHgwMF0sICAgIyA5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4MDAsIDB4MDAsIDB4MDBdLCAgICMgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHhmZiwgMHgwMCwgMHgwMF0sICAgIyAxMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDAwLCAweGZmLCAweDAwXSwgICAjIDEyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDBdLCAgICMgMTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHgwMCwgMHhmZiwgMHgwMF0sICAgIyAxNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweGZmLCAweGZmLCAweDAwXSwgICAjIDE1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDBdLCAgICMgMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHg4MCwgMHgwMCwgMHgwMF0sICAgIyAxNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDAwLCAweDgwLCAweDAwXSwgICAjIDE4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ODAsIDB4ODAsIDB4MDAsIDB4MDBdLCAgICMgMTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg4MCwgMHgwMCwgMHg4MCwgMHgwMF0sICAgIyAyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDgwLCAweDgwLCAweDAwXSwgICAjIDIxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4YzAsIDB4YzAsIDB4YzAsIDB4MDBdLCAgICMgMjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg4MCwgMHg4MCwgMHg4MCwgMHgwMF0sICAgIyAyMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk5LCAweDk5LCAweGZmLCAweDAwXSwgICAjIDI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4OTksIDB4MzMsIDB4NjYsIDB4MDBdLCAgICMgMjUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHhmZiwgMHhjYywgMHgwMF0sICAgIyAyNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGNjLCAweGZmLCAweGZmLCAweDAwXSwgICAjIDI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4NjYsIDB4MDAsIDB4NjYsIDB4MDBdLCAgICMgMjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHg4MCwgMHg4MCwgMHgwMF0sICAgIyAyOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDY2LCAweGNjLCAweDAwXSwgICAjIDMwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4Y2MsIDB4Y2MsIDB4ZmYsIDB4MDBdLCAgICMgMzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHg4MCwgMHgwMF0sICAgIyAzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweDAwLCAweGZmLCAweDAwXSwgICAjIDMzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDBdLCAgICMgMzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHhmZiwgMHhmZiwgMHgwMF0sICAgIyAzNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDgwLCAweDAwLCAweDgwLCAweDAwXSwgICAjIDM2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDBdLCAgICMgMzcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHg4MCwgMHg4MCwgMHgwMF0sICAgIyAzOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDAwLCAweGZmLCAweDAwXSwgICAjIDM5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4Y2MsIDB4ZmYsIDB4MDBdLCAgICMgNDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhjYywgMHhmZiwgMHhmZiwgMHgwMF0sICAgIyA0MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGNjLCAweGZmLCAweGNjLCAweDAwXSwgICAjIDQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ZmYsIDB4OTksIDB4MDBdLCAgICMgNDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg5OSwgMHhjYywgMHhmZiwgMHgwMF0sICAgIyA0NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweDk5LCAweGNjLCAweDAwXSwgICAjIDQ1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4Y2MsIDB4OTksIDB4ZmYsIDB4MDBdLCAgICMgNDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHhjYywgMHg5OSwgMHgwMF0sICAgIyA0NworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDMzLCAweDY2LCAweGZmLCAweDAwXSwgICAjIDQ4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MzMsIDB4Y2MsIDB4Y2MsIDB4MDBdLCAgICMgNDkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg5OSwgMHhjYywgMHgwMCwgMHgwMF0sICAgIyA1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweGNjLCAweDAwLCAweDAwXSwgICAjIDUxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4OTksIDB4MDAsIDB4MDBdLCAgICMgNTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHg2NiwgMHgwMCwgMHgwMF0sICAgIyA1MworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDY2LCAweDY2LCAweDk5LCAweDAwXSwgICAjIDU0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4OTYsIDB4OTYsIDB4OTYsIDB4MDBdLCAgICMgNTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgzMywgMHg2NiwgMHgwMF0sICAgIyA1NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDMzLCAweDk5LCAweDY2LCAweDAwXSwgICAjIDU3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4MzMsIDB4MDAsIDB4MDBdLCAgICMgNTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHgzMywgMHgwMCwgMHgwMF0sICAgIyA1OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk5LCAweDMzLCAweDAwLCAweDAwXSwgICAjIDYwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4OTksIDB4MzMsIDB4NjYsIDB4MDBdLCAgICMgNjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHgzMywgMHg5OSwgMHgwMF0sICAgIyA2MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDMzLCAweDMzLCAweDMzLCAweDAwXSwgICAjIDYzCisgICAgICAgICAgICAgICAgICAgICAgICBdOworCisgICAgcmV0dXJuIDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfdGVtcGRpcigpCisjCisjIENoYW5nZSB0aGUgZGVmYXVsdCB0ZW1wIGRpcmVjdG9yeSB1c2VkIGJ5IF9pbml0aWFsaXplKCkgaW4gV29ya3NoZWV0LnBtLgorIworc3ViIHNldF90ZW1wZGlyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIFdpbmRvd3Mgd29ya2Fyb3VuZC4gU2VlIFdvcmtzaGVldDo6X2luaXRpYWxpemUoKQorICAgIG15ICRkaXIgID0gc2hpZnQgfHwgJyc7CisKKyAgICBjcm9hayAiJGRpciBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkiICAgICAgIGlmICRkaXIgbmUgJycgYW5kIG5vdCAtZCAkZGlyOworICAgIGNyb2FrICJzZXRfdGVtcGRpciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWRkX3dvcmtzaGVldCIgaWYgJHNlbGYtPnNoZWV0cygpOworCisgICAgJHNlbGYtPntfdGVtcGRpcn0gPSAkZGlyIDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9jb2RlcGFnZSgpCisjCisjIFNlZSBhbHNvIHRoZSBfc3RvcmVfY29kZXBhZ2UgbWV0aG9kLiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGNvZGUgcGFnZSwgaS5lLgorIyB0aGUgY2hhcmFjdGVyIHNldCB1c2VkIGluIHRoZSB3b3JrYm9vay4KKyMKK3N1YiBzZXRfY29kZXBhZ2UgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkY29kZXBhZ2UgICAgPSAkX1swXSB8fCAxOworICAgICAgICRjb2RlcGFnZSAgICA9IDB4MDRFNCBpZiAkY29kZXBhZ2UgPT0gMTsKKyAgICAgICAkY29kZXBhZ2UgICAgPSAweDgwMDAgaWYgJGNvZGVwYWdlID09IDI7CisKKyAgICAkc2VsZi0+e19jb2RlcGFnZX0gPSAkY29kZXBhZ2U7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfY291bnRyeSgpCisjCisjIFNlZSBhbHNvIHRoZSBfc3RvcmVfY291bnRyeSBtZXRob2QuIFRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgY291bnRyeSBjb2RlLgorIyBTb21lIG5vbi1lbmdsaXNoIHZlcnNpb25zIG9mIEV4Y2VsIG1heSBuZWVkIHRoaXMgc2V0IHRvIHNvbWUgdmFsdWUgb3RoZXIKKyMgdGhhbiAxID0gIlVuaXRlZCBTdGF0ZXMiLiBJbiBnZW5lcmFsIHRoZSBjb3VudHJ5IGNvZGUgaXMgZXF1YWwgdG8gdGhlCisjIGludGVybmF0aW9uYWwgZGlhbGxpbmcgY29kZS4KKyMKK3N1YiBzZXRfY291bnRyeSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19jb3VudHJ5fSAgID0gJF9bMF0gfHwgMTsKK30KKworCisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBkZWZpbmVfbmFtZSgpCisjCisjIFRPRE8uCisjCitzdWIgZGVmaW5lX25hbWUgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGZvcm11bGEgICAgID0gc2hpZnQ7CisgICAgbXkgJGVuY29kaW5nICAgID0gc2hpZnQgfHwgMDsKKyAgICBteSAkc2hlZXRfaW5kZXggPSAwOworICAgIG15IEB0b2tlbnM7CisKKyAgICBteSAkZnVsbF9uYW1lICAgPSAkbmFtZTsKKworICAgIGlmICgkbmFtZSA9fiAvXiguKikhKC4qKSQvKSB7CisgICAgICAgIG15ICRzaGVldG5hbWUgICA9ICQxOworICAgICAgICAkbmFtZSAgICAgICAgICAgPSAkMjsKKyAgICAgICAgJHNoZWV0X2luZGV4ICAgID0gMSArICRzZWxmLT57X3BhcnNlcn0tPl9nZXRfc2hlZXRfaW5kZXgoJHNoZWV0bmFtZSk7CisgICAgfQorCisKKworICAgICMgU3RyaXAgdGhlID0gc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtdWxhIHN0cmluZworICAgICRmb3JtdWxhICAgID1+IHMoXj0pKCk7CisKKyAgICAjIFBhcnNlIHRoZSBmb3JtdWxhIHVzaW5nIHRoZSBwYXJzZXIgaW4gRm9ybXVsYS5wbQorICAgIG15ICRwYXJzZXIgID0gJHNlbGYtPntfcGFyc2VyfTsKKworICAgICMgSW4gb3JkZXIgdG8gcmFpc2UgZm9ybXVsYSBlcnJvcnMgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgY2FsbGluZworICAgICMgcHJvZ3JhbSB3ZSB1c2UgYW4gZXZhbCBibG9jayBhbmQgcmUtcmFpc2UgdGhlIGVycm9yIGZyb20gaGVyZS4KKyAgICAjCisgICAgZXZhbCB7IEB0b2tlbnMgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCRmb3JtdWxhKSB9OworCisgICAgaWYgKCRAKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpCisgICAgICAgIGNyb2FrICRAOyAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvcgorICAgIH0KKworICAgICMgRm9yY2UgMmQgcmFuZ2VzIHRvIGJlIGEgcmVmZXJlbmNlIGNsYXNzLgorICAgIHMvX3JlZjNkL19yZWYzZFIvICAgICBmb3IgQHRva2VuczsKKyAgICBzL19yYW5nZTNkL19yYW5nZTNkUi8gZm9yIEB0b2tlbnM7CisKKworICAgICMgUGFyc2UgdGhlIHRva2VucyBpbnRvIGEgZm9ybXVsYSBzdHJpbmcuCisgICAgJGZvcm11bGEgPSAkcGFyc2VyLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7CisKKworCisgICAgJGZ1bGxfbmFtZSA9IGxjICRmdWxsX25hbWU7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfZGVmaW5lZF9uYW1lc319LCAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAgICAgICAgPT4gJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nICAgID0+ICRlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXRfaW5kZXggPT4gJHNoZWV0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhICAgICA9PiAkZm9ybXVsYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgbXkgJGluZGV4ID0gc2NhbGFyIEB7JHNlbGYtPntfZGVmaW5lZF9uYW1lc319OworCisgICAgJHBhcnNlci0+c2V0X2V4dF9uYW1lKCRuYW1lLCAkaW5kZXgpOworfQorCisKKworCisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfcHJvcGVydGllcygpCisjCisjIFNldCB0aGUgZG9jdW1lbnQgcHJvcGVydGllcyBzdWNoIGFzIFRpdGxlLCBBdXRob3IgZXRjLiBUaGVzZSBhcmUgd3JpdHRlbiB0bworIyBwcm9wZXJ0eSBzZXRzIGluIHRoZSBPTEUgY29udGFpbmVyLgorIworc3ViIHNldF9wcm9wZXJ0aWVzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJXBhcmFtOworCisgICAgIyBJZ25vcmUgaWYgbm8gYXJncyB3ZXJlIHBhc3NlZC4KKyAgICByZXR1cm4gLTEgdW5sZXNzIEBfOworCisKKyAgICAjIEFsbG93IHRoZSBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCBhcyBhIGhhc2ggb3IgaGFzaCByZWYuCisgICAgaWYgKHJlZiAkX1swXSBlcSAnSEFTSCcpIHsKKyAgICAgICAgJXBhcmFtID0gJXskX1swXX07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAlcGFyYW0gPSBAXzsKKyAgICB9CisKKworICAgICMgTGlzdCBvZiB2YWxpZCBpbnB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICVwcm9wZXJ0aWVzID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcGFnZSAgICAgID0+IFsweDAwMDEsICdWVF9JMicgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSAgICAgICAgID0+IFsweDAwMDIsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0ICAgICAgID0+IFsweDAwMDMsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3IgICAgICAgID0+IFsweDAwMDQsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcyAgICAgID0+IFsweDAwMDUsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cyAgICAgID0+IFsweDAwMDYsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2F1dGhvciAgID0+IFsweDAwMDgsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkICAgICAgID0+IFsweDAwMEMsICdWVF9GSUxFVElNRSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSAgICAgID0+IFsweDAwMDIsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyICAgICAgID0+IFsweDAwMEUsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYW55ICAgICAgID0+IFsweDAwMEYsICdWVF9MUFNUUicgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1dGY4ICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlucHV0IHBhcmFtZXRlcnMuCisgICAgZm9yIG15ICRwYXJhbWV0ZXIgKGtleXMgJXBhcmFtKSB7CisgICAgICAgIGlmIChub3QgZXhpc3RzICRwcm9wZXJ0aWVzeyRwYXJhbWV0ZXJ9KSB7CisgICAgICAgICAgICBjYXJwICJVbmtub3duIHBhcmFtZXRlciAnJHBhcmFtZXRlcicgaW4gc2V0X3Byb3BlcnRpZXMoKSI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgU2V0IHRoZSBjcmVhdGlvbiB0aW1lIHVubGVzcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgICAgaWYgKCFleGlzdHMgJHBhcmFte2NyZWF0ZWR9KXsKKyAgICAgICAgJHBhcmFte2NyZWF0ZWR9ID0gJHNlbGYtPntfbG9jYWx0aW1lfTsKKyAgICB9CisKKworICAgICMKKyAgICAjIENyZWF0ZSB0aGUgU3VtbWFyeUluZm9ybWF0aW9uIHByb3BlcnR5IHNldC4KKyAgICAjCisKKyAgICAjIEdldCB0aGUgY29kZXBhZ2Ugb2YgdGhlIHN0cmluZ3MgaW4gdGhlIHByb3BlcnR5IHNldC4KKyAgICBteSBAc3RyaW5ncyAgICAgID0gcXcodGl0bGUgc3ViamVjdCBhdXRob3Iga2V5d29yZHMgY29tbWVudHMgbGFzdF9hdXRob3IpOworICAgICRwYXJhbXtjb2RlcGFnZX0gPSAkc2VsZi0+X2dldF9wcm9wZXJ0eV9zZXRfY29kZXBhZ2UoXCVwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxAc3RyaW5ncyk7CisKKyAgICAjIENyZWF0ZSBhbiBhcnJheSBvZiBwcm9wZXJ0eSBzZXQgdmFsdWVzLgorICAgIG15IEBwcm9wZXJ0eV9zZXRzOworCisgICAgZm9yIG15ICRwcm9wZXJ0eSAocXcoY29kZXBhZ2UgdGl0bGUgICAgc3ViamVjdCAgICAgYXV0aG9yCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMgY29tbWVudHMgbGFzdF9hdXRob3IgY3JlYXRlZCkpCisgICAgeworICAgICAgICBpZiAoZXhpc3RzICRwYXJhbXskcHJvcGVydHl9ICYmIGRlZmluZWQgJHBhcmFteyRwcm9wZXJ0eX0pIHsKKyAgICAgICAgICAgIHB1c2ggQHByb3BlcnR5X3NldHMsIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcm9wZXJ0aWVzeyRwcm9wZXJ0eX0tPlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcm9wZXJ0aWVzeyRwcm9wZXJ0eX0tPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXskcHJvcGVydHl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOworICAgICAgICB9CisgICAgfQorCisgICAgIyBQYWNrIHRoZSBwcm9wZXJ0eSBzZXRzLgorICAgICRzZWxmLT57c3VtbWFyeX0gPSBjcmVhdGVfc3VtbWFyeV9wcm9wZXJ0eV9zZXQoXEBwcm9wZXJ0eV9zZXRzKTsKKworCisgICAgIworICAgICMgQ3JlYXRlIHRoZSBEb2NTdW1tYXJ5SW5mb3JtYXRpb24gcHJvcGVydHkgc2V0LgorICAgICMKKworICAgICMgR2V0IHRoZSBjb2RlcGFnZSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgcHJvcGVydHkgc2V0LgorICAgIEBzdHJpbmdzICAgICAgICAgPSBxdyhjYXRlZ29yeSBtYW5hZ2VyIGNvbXBhbnkpOworICAgICRwYXJhbXtjb2RlcGFnZX0gPSAkc2VsZi0+X2dldF9wcm9wZXJ0eV9zZXRfY29kZXBhZ2UoXCVwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxAc3RyaW5ncyk7CisKKyAgICAjIENyZWF0ZSBhbiBhcnJheSBvZiBwcm9wZXJ0eSBzZXQgdmFsdWVzLgorICAgIEBwcm9wZXJ0eV9zZXRzID0gKCk7CisKKyAgICBmb3IgbXkgJHByb3BlcnR5IChxdyhjb2RlcGFnZSBjYXRlZ29yeSBtYW5hZ2VyIGNvbXBhbnkpKQorICAgIHsKKyAgICAgICAgaWYgKGV4aXN0cyAkcGFyYW17JHByb3BlcnR5fSAmJiBkZWZpbmVkICRwYXJhbXskcHJvcGVydHl9KSB7CisgICAgICAgICAgICBwdXNoIEBwcm9wZXJ0eV9zZXRzLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcGVydGllc3skcHJvcGVydHl9LT5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcGVydGllc3skcHJvcGVydHl9LT5bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW17JHByb3BlcnR5fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgUGFjayB0aGUgcHJvcGVydHkgc2V0cy4KKyAgICAkc2VsZi0+e2RvY19zdW1tYXJ5fSA9IGNyZWF0ZV9kb2Nfc3VtbWFyeV9wcm9wZXJ0eV9zZXQoXEBwcm9wZXJ0eV9zZXRzKTsKKworICAgICMgU2V0IGEgZmxhZyBmb3Igd2hlbiB0aGUgZmlsZXMgaXMgd3JpdHRlbi4KKyAgICAkc2VsZi0+e19hZGRfZG9jX3Byb3BlcnRpZXN9ID0gMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfcHJvcGVydHlfc2V0X2NvZGVwYWdlKCkKKyMKKyMgR2V0IHRoZSBjaGFyYWN0ZXIgY29kZXBhZ2UgdXNlZCBieSB0aGUgc3RyaW5ncyBpbiBhIHByb3BlcnR5IHNldC4gSWYgb25lIG9mCisjIHRoZSBzdHJpbmdzIHVzZWQgaXMgdXRmOCB0aGVuIHRoZSBjb2RlcGFnZSBpcyBtYXJrZWQgYXMgdXRmOC4gT3RoZXJ3aXNlCisjIExhdGluIDEgaXMgdXNlZCAoYWx0aG91Z2ggaW4gb3VyIGNhc2UgdGhpcyBpcyBsaW1pdGVkIHRvIDdiaXQgQVNDSUkpLgorIworc3ViIF9nZXRfcHJvcGVydHlfc2V0X2NvZGVwYWdlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHBhcmFtcyAgICAgID0gJF9bMF07CisgICAgbXkgJHN0cmluZ3MgICAgID0gJF9bMV07CisKKyAgICAjIEFsbG93IGZvciBtYW51YWxseSBtYXJrZWQgdXRmOCBzdHJpbmdzLgorICAgIHJldHVybiAweEZERTkgaWYgZGVmaW5lZCAkcGFyYW1zLT57dXRmOH07CisKKyAgICAjIENoZWNrIGZvciB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworICAgICAgICBmb3IgbXkgJHN0cmluZyAoQHskc3RyaW5ncyB9KSB7CisgICAgICAgICAgICBuZXh0IHVubGVzcyBleGlzdHMgJHBhcmFtcy0+eyRzdHJpbmd9OworICAgICAgICAgICAgcmV0dXJuIDB4RkRFOSBpZiBFbmNvZGU6OmlzX3V0ZjgoJHBhcmFtcy0+eyRzdHJpbmd9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAweDA0RTQ7ICMgRGVmYXVsdCBjb2RlcGFnZSwgTGF0aW4gMS4KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV93b3JrYm9vaygpCisjCisjIEFzc2VtYmxlIHdvcmtzaGVldHMgaW50byBhIHdvcmtib29rIGFuZCBzZW5kIHRoZSBCSUZGIGRhdGEgdG8gYW4gT0xFCisjIHN0b3JhZ2UuCisjCitzdWIgX3N0b3JlX3dvcmtib29rIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIEFkZCBhIGRlZmF1bHQgd29ya3NoZWV0IGlmIG5vbiBoYXZlIGJlZW4gYWRkZWQuCisgICAgJHNlbGYtPmFkZF93b3Jrc2hlZXQoKSBpZiBub3QgQHskc2VsZi0+e193b3Jrc2hlZXRzfX07CisKKyAgICAjIENhbGN1bGF0ZSBzaXplIHJlcXVpcmVkIGZvciBNU08gcmVjb3JkcyBhbmQgdXBkYXRlIHdvcmtzaGVldHMuCisgICAgJHNlbGYtPl9jYWxjX21zb19zaXplcygpOworCisgICAgIyBFbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgd29ya3NoZWV0IGhhcyBiZWVuIHNlbGVjdGVkLgorICAgIGlmICgkc2VsZi0+e19hY3RpdmVzaGVldH0gPT0gMCkgeworICAgICAgICBAeyRzZWxmLT57X3dvcmtzaGVldHN9fVswXS0+e19zZWxlY3RlZH0gPSAxOworICAgICAgICBAeyRzZWxmLT57X3dvcmtzaGVldHN9fVswXS0+e19oaWRkZW59ICAgPSAwOworICAgIH0KKworICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2VsZWN0ZWQgc2hlZXQgdGFicyBhbmQgc2V0IHRoZSBhY3RpdmUgc2hlZXQuCisgICAgZm9yZWFjaCBteSAkc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICRzZWxmLT57X3NlbGVjdGVkfSsrIGlmICRzaGVldC0+e19zZWxlY3RlZH07CisgICAgICAgICRzaGVldC0+e19hY3RpdmV9ID0gMSBpZiAkc2hlZXQtPntfaW5kZXh9ID09ICRzZWxmLT57X2FjdGl2ZXNoZWV0fTsKKyAgICB9CisKKyAgICAjIEFkZCBXb3JrYm9vayBnbG9iYWxzCisgICAgJHNlbGYtPl9zdG9yZV9ib2YoMHgwMDA1KTsKKyAgICAkc2VsZi0+X3N0b3JlX2NvZGVwYWdlKCk7CisgICAgJHNlbGYtPl9zdG9yZV93aW5kb3cxKCk7CisgICAgJHNlbGYtPl9zdG9yZV9oaWRlb2JqKCk7CisgICAgJHNlbGYtPl9zdG9yZV8xOTA0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9hbGxfZm9udHMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FsbF9udW1fZm9ybWF0cygpOworICAgICRzZWxmLT5fc3RvcmVfYWxsX3hmcygpOworICAgICRzZWxmLT5fc3RvcmVfYWxsX3N0eWxlcygpOworICAgICRzZWxmLT5fc3RvcmVfcGFsZXR0ZSgpOworCisgICAgIyBDYWxjdWxhdGUgdGhlIG9mZnNldHMgcmVxdWlyZWQgYnkgdGhlIEJPVU5EU0hFRVQgcmVjb3JkcworICAgICRzZWxmLT5fY2FsY19zaGVldF9vZmZzZXRzKCk7CisKKyAgICAjIEFkZCBCT1VORFNIRUVUIHJlY29yZHMuCisgICAgZm9yZWFjaCBteSAkc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfYm91bmRzaGVldCgkc2hlZXQtPntfbmFtZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hlZXQtPntfb2Zmc2V0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGVldC0+e19zaGVldF90eXBlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGVldC0+e19oaWRkZW59LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0LT57X2VuY29kaW5nfSk7CisgICAgfQorCisgICAgIyBOT1RFOiBJZiBhbnkgcmVjb3JkcyBhcmUgYWRkZWQgYmV0d2VlbiBoZXJlIGFuZCBFT0YgdGhlCisgICAgIyBfY2FsY19zaGVldF9vZmZzZXRzKCkgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gaW5jbHVkZSB0aGUgbmV3IGxlbmd0aC4KKyAgICAkc2VsZi0+X3N0b3JlX2NvdW50cnkoKTsKKyAgICBpZiAoJHNlbGYtPntfZXh0X3JlZl9jb3VudH0pIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zdXBib29rKCk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfZXh0ZXJuc2hlZXQoKTsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9uYW1lcygpOworICAgIH0KKyAgICAkc2VsZi0+X2FkZF9tc29fZHJhd2luZ19ncm91cCgpOworICAgICRzZWxmLT5fc3RvcmVfc2hhcmVkX3N0cmluZ3MoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2V4dHNzdCgpOworCisgICAgIyBFbmQgV29ya2Jvb2sgZ2xvYmFscworICAgICRzZWxmLT5fc3RvcmVfZW9mKCk7CisKKyAgICAjIFN0b3JlIHRoZSB3b3JrYm9vayBpbiBhbiBPTEUgY29udGFpbmVyCisgICAgcmV0dXJuICRzZWxmLT5fc3RvcmVfT0xFX2ZpbGUoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9PTEVfZmlsZSgpCisjCisjIFN0b3JlIHRoZSB3b3JrYm9vayBpbiBhbiBPTEUgY29udGFpbmVyIHVzaW5nIHRoZSBkZWZhdWx0IGhhbmRsZXIgb3IgdXNpbmcKKyMgT0xFOjpTdG9yYWdlX0xpdGUgaWYgdGhlIHdvcmtib29rIGRhdGEgaXMgPiB+IDdNQi4KKyMKK3N1YiBfc3RvcmVfT0xFX2ZpbGUgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkbWF4c2l6ZSA9IDdfMDg3XzEwNDsKKworICAgIGlmICghJHNlbGYtPntfYWRkX2RvY19wcm9wZXJ0aWVzfSAmJiAkc2VsZi0+e19iaWZmc2l6ZX0gPD0gJG1heHNpemUpIHsKKyAgICAgICAgIyBXcml0ZSB0aGUgT0xFIGZpbGUgdXNpbmcgT0xFd3JpdGVyIGlmIGRhdGEgPD0gN01CCisgICAgICAgIG15ICRPTEUgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Ok9MRXdyaXRlci0+bmV3KCRzZWxmLT57X2ZoX291dH0pOworCisgICAgICAgICMgV3JpdGUgdGhlIEJJRkYgZGF0YSB3aXRob3V0IHRoZSBPTEUgY29udGFpbmVyIGZvciB0ZXN0aW5nLgorICAgICAgICAkT0xFLT57X2JpZmZfb25seX0gPSAkc2VsZi0+e19iaWZmX29ubHl9OworCisgICAgICAgICMgSW5kaWNhdGUgdGhhdCB3ZSBjcmVhdGVkIHRoZSBmaWxlaGFuZGxlIGFuZCB3YW50IHRvIGNsb3NlIGl0LgorICAgICAgICAkT0xFLT57X2ludGVybmFsX2ZofSA9ICRzZWxmLT57X2ludGVybmFsX2ZofTsKKworICAgICAgICAkT0xFLT5zZXRfc2l6ZSgkc2VsZi0+e19iaWZmc2l6ZX0pOworICAgICAgICAkT0xFLT53cml0ZV9oZWFkZXIoKTsKKworICAgICAgICB3aGlsZSAobXkgJHRtcCA9ICRzZWxmLT5nZXRfZGF0YSgpKSB7CisgICAgICAgICAgICAkT0xFLT53cml0ZSgkdG1wKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcmVhY2ggbXkgJHdvcmtzaGVldCAoQHskc2VsZi0+e193b3Jrc2hlZXRzfX0pIHsKKyAgICAgICAgICAgIHdoaWxlIChteSAkdG1wID0gJHdvcmtzaGVldC0+Z2V0X2RhdGEoKSkgeworICAgICAgICAgICAgICAgICRPTEUtPndyaXRlKCR0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRPTEUtPmNsb3NlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAjIFdyaXRlIHRoZSBPTEUgZmlsZSB1c2luZyBPTEU6OlN0b3JhZ2VfTGl0ZSBpZiBkYXRhID4gN01CCisgICAgICAgIGV2YWwgeyByZXF1aXJlIE9MRTo6U3RvcmFnZV9MaXRlIH07CisKKyAgICAgICAgaWYgKG5vdCAkQCkgeworCisgICAgICAgICAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgICAgICBsb2NhbCAkXCA9IHVuZGVmOworCisgICAgICAgICAgICBteSBAc3RyZWFtczsKKworICAgICAgICAgICAgIyBDcmVhdGUgdGhlIFdvcmtib29rIHN0cmVhbS4KKyAgICAgICAgICAgIG15ICRzdHJlYW0gICA9IHBhY2sgJ3YqJywgdW5wYWNrICdDKicsICdXb3JrYm9vayc7CisgICAgICAgICAgICBteSAkd29ya2Jvb2sgPSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlLT5uZXdGaWxlKCRzdHJlYW0pOworCisgICAgICAgICAgICB3aGlsZSAobXkgJHRtcCA9ICRzZWxmLT5nZXRfZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgJHdvcmtib29rLT5hcHBlbmQoJHRtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJHdvcmtzaGVldCAoQHskc2VsZi0+e193b3Jrc2hlZXRzfX0pIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobXkgJHRtcCA9ICR3b3Jrc2hlZXQtPmdldF9kYXRhKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHdvcmtib29rLT5hcHBlbmQoJHRtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdXNoIEBzdHJlYW1zLCAkd29ya2Jvb2s7CisKKworICAgICAgICAgICAgIyBDcmVhdGUgdGhlIHByb3BlcnRpZXMgc3RyZWFtcywgaWYgYW55LgorICAgICAgICAgICAgaWYgKCRzZWxmLT57X2FkZF9kb2NfcHJvcGVydGllc30pIHsKKyAgICAgICAgICAgICAgICBteSAkc3RyZWFtOworICAgICAgICAgICAgICAgIG15ICRzdW1tYXJ5OworCisgICAgICAgICAgICAgICAgJHN0cmVhbSAgPSBwYWNrICd2KicsIHVucGFjayAnQyonLCAiXDVTdW1tYXJ5SW5mb3JtYXRpb24iOworICAgICAgICAgICAgICAgICRzdW1tYXJ5ID0gJHNlbGYtPntzdW1tYXJ5fTsKKyAgICAgICAgICAgICAgICAkc3VtbWFyeSA9IE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkZpbGUtPm5ldygkc3RyZWFtLCAkc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgcHVzaCBAc3RyZWFtcywgJHN1bW1hcnk7CisKKyAgICAgICAgICAgICAgICAkc3RyZWFtICA9IHBhY2sgJ3YqJywgdW5wYWNrICdDKicsICJcNURvY3VtZW50U3VtbWFyeUluZm9ybWF0aW9uIjsKKyAgICAgICAgICAgICAgICAkc3VtbWFyeSA9ICRzZWxmLT57ZG9jX3N1bW1hcnl9OworICAgICAgICAgICAgICAgICRzdW1tYXJ5ID0gT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6RmlsZS0+bmV3KCRzdHJlYW0sICRzdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICBwdXNoIEBzdHJlYW1zLCAkc3VtbWFyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBDcmVhdGUgdGhlIE9MRSByb290IGRvY3VtZW50IGFuZCBhZGQgdGhlIHN1YnN0cmVhbXMuCisgICAgICAgICAgICBteSBAbG9jYWx0aW1lID0gQHsgJHNlbGYtPntfbG9jYWx0aW1lfSB9OworICAgICAgICAgICAgc3BsaWNlKEBsb2NhbHRpbWUsIDYpOworCisgICAgICAgICAgICBteSAkb2xlX3Jvb3QgPSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpSb290LT5uZXcoXEBsb2NhbHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXEBsb2NhbHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXEBzdHJlYW1zKTsKKyAgICAgICAgICAgICRvbGVfcm9vdC0+c2F2ZSgkc2VsZi0+e19maWxlbmFtZX0pOworCisKKyAgICAgICAgICAgICMgQ2xvc2UgdGhlIGZpbGVoYW5kbGUgaWYgaXQgd2FzIGNyZWF0ZWQgaW50ZXJuYWxseS4KKyAgICAgICAgICAgIHJldHVybiBDT1JFOjpjbG9zZSgkc2VsZi0+e19maF9vdXR9KSBpZiAkc2VsZi0+e19pbnRlcm5hbF9maH07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIEZpbGUgaW4gZ3JlYXRlciB0aGFuIGxpbWl0LCBzZXQgJCEgdG8gIkZpbGUgdG9vIGxhcmdlIgorICAgICAgICAgICAgJCEgPSAyNzsgIyBQZXJsIGVycm9yIGNvZGUgIkZpbGUgdG9vIGxhcmdlIgorCisgICAgICAgICAgICBjcm9hayAiTWF4aW11bSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBmaWxlc2l6ZSwgJG1heHNpemUgYnl0ZXMsICIuCisgICAgICAgICAgICAgICAgICAiZXhjZWVkZWQuIFRvIGNyZWF0ZSBmaWxlcyBiaWdnZXIgdGhhbiB0aGlzIGxpbWl0IHBsZWFzZSAiICAuCisgICAgICAgICAgICAgICAgICAiaW5zdGFsbCBPTEU6OlN0b3JhZ2VfTGl0ZVxuIjsKKworICAgICAgICAgICAgIyByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jYWxjX3NoZWV0X29mZnNldHMoKQorIworIyBDYWxjdWxhdGUgV29ya3NoZWV0IEJPRiBvZmZzZXRzIHJlY29yZHMgZm9yIHVzZSBpbiB0aGUgQk9VTkRTSEVFVCByZWNvcmRzLgorIworc3ViIF9jYWxjX3NoZWV0X29mZnNldHMgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkQk9GICAgICA9IDEyOworICAgIG15ICRFT0YgICAgID0gNDsKKyAgICBteSAkb2Zmc2V0ICA9ICRzZWxmLT57X2RhdGFzaXplfTsKKworICAgICMgQWRkIHRoZSBsZW5ndGggb2YgdGhlIENPVU5UUlkgcmVjb3JkCisgICAgJG9mZnNldCArPSA4OworCisgICAgIyBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgU1NUIGFuZCBhc3NvY2lhdGVkIENPTlRJTlVFcworICAgICRvZmZzZXQgKz0gJHNlbGYtPl9jYWxjdWxhdGVfc2hhcmVkX3N0cmluZ19zaXplcygpOworCisgICAgIyBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgRVhUU1NUIHJlY29yZC4KKyAgICAkb2Zmc2V0ICs9ICRzZWxmLT5fY2FsY3VsYXRlX2V4dHNzdF9zaXplKCk7CisKKyAgICAjIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBTVVBCT09LLCBFWFRFUk5TSEVFVCBhbmQgTkFNRSByZWNvcmRzCisgICAgJG9mZnNldCArPSAkc2VsZi0+X2NhbGN1bGF0ZV9leHRlcm5fc2l6ZXMoKTsKKworICAgICMgQWRkIHRoZSBsZW5ndGggb2YgdGhlIE1TT0RSQVdJTkdHUk9VUCByZWNvcmRzIGluY2x1ZGluZyBhbiBleHRyYSA0IGJ5dGVzCisgICAgIyBmb3IgYW55IENPTlRJTlVFIGhlYWRlcnMuIFNlZSBfYWRkX21zb19kcmF3aW5nX2dyb3VwX2NvbnRpbnVlKCkuCisgICAgbXkgJG1zb19zaXplID0gJHNlbGYtPntfbXNvX3NpemV9OworICAgICRtc29fc2l6ZSArPSA0ICogaW50KCgkbXNvX3NpemUgLTEpIC8gJHNlbGYtPntfbGltaXR9KTsKKyAgICAkb2Zmc2V0ICAgKz0gJG1zb19zaXplIDsKKworICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICAkb2Zmc2V0ICs9ICRCT0YgKyBsZW5ndGgoJHNoZWV0LT57X25hbWV9KTsKKyAgICB9CisKKyAgICAkb2Zmc2V0ICs9ICRFT0Y7CisKKyAgICBmb3JlYWNoIG15ICRzaGVldCAoQHskc2VsZi0+e193b3Jrc2hlZXRzfX0pIHsKKyAgICAgICAgJHNoZWV0LT57X29mZnNldH0gPSAkb2Zmc2V0OworICAgICAgICAkc2hlZXQtPl9jbG9zZSgpOworICAgICAgICAkb2Zmc2V0ICs9ICRzaGVldC0+e19kYXRhc2l6ZX07CisgICAgfQorCisgICAgJHNlbGYtPntfYmlmZnNpemV9ID0gJG9mZnNldDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jYWxjX21zb19zaXplcygpCisjCisjIENhbGN1bGF0ZSB0aGUgTVNPRFJBV0lOR0dST1VQIHNpemVzIGFuZCB0aGUgaW5kZXhlcyBvZiB0aGUgV29ya3NoZWV0CisjIE1TT0RSQVdJTkcgcmVjb3Jkcy4KKyMKKyMgSW4gdGhlIGZvbGxvd2luZyBTUElEIGlzIHNoYXBlIGlkLCBhY2NvcmRpbmcgdG8gRXNjaGVyIG5vbWVuY2xhdHVyZS4KKyMKK3N1YiBfY2FsY19tc29fc2l6ZXMgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJG1zb19zaXplICAgICAgICA9IDA7ICAgICMgU2l6ZSBvZiB0aGUgTVNPRFJBV0lOR0dST1VQIHJlY29yZAorICAgIG15ICRzdGFydF9zcGlkICAgICAgPSAxMDI0OyAjIEluaXRpYWwgc3BpZCBmb3IgZWFjaCBzaGVldAorICAgIG15ICRtYXhfc3BpZCAgICAgICAgPSAxMDI0OyAjIHNwaWRNYXgKKyAgICBteSAkbnVtX2NsdXN0ZXJzICAgID0gMTsgICAgIyBjaWRjbAorICAgIG15ICRzaGFwZXNfc2F2ZWQgICAgPSAwOyAgICAjIGNzcFNhdmVkCisgICAgbXkgJGRyYXdpbmdzX3NhdmVkICA9IDA7ICAgICMgY2RnU2F2ZWQKKyAgICBteSBAY2x1c3RlcnMgICAgICAgID0gKCk7CisKKworICAgICRzZWxmLT5fcHJvY2Vzc19pbWFnZXMoKTsKKworICAgICMgQWRkIEJzdG9yZSBjb250YWluZXIgc2l6ZSBpZiB0aGVyZSBhcmUgaW1hZ2VzLgorICAgICRtc29fc2l6ZSArPSA4IGlmIEB7JHNlbGYtPntfaW1hZ2VzX2RhdGF9fTsKKworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIHdvcmtzaGVldHMsIGNhbGN1bGF0ZSB0aGUgTVNPRFJBV0lOR0dST1VQIHBhcmFtZXRlcnMKKyAgICAjIGFuZCBzcGFjZSByZXF1aXJlZCB0byBzdG9yZSB0aGUgcmVjb3JkIGFuZCB0aGUgTVNPRFJBV0lORyBwYXJhbWV0ZXJzCisgICAgIyByZXF1aXJlZCBieSBlYWNoIHdvcmtzaGVldC4KKyAgICAjCisgICAgZm9yZWFjaCBteSAkc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgIG5leHQgdW5sZXNzICRzaGVldC0+e19zaGVldF90eXBlfSA9PSAweDAwMDA7ICMgSWdub3JlIGNoYXJ0cy4KKworICAgICAgICBteSAkbnVtX2ltYWdlcyAgICAgPSAkc2hlZXQtPntfbnVtX2ltYWdlc30gfHwgMDsKKyAgICAgICAgbXkgJGltYWdlX21zb19zaXplID0gJHNoZWV0LT57X2ltYWdlX21zb19zaXplfSB8fCAwOworICAgICAgICBteSAkbnVtX2NvbW1lbnRzICAgPSAkc2hlZXQtPl9wcmVwYXJlX2NvbW1lbnRzKCk7CisgICAgICAgIG15ICRudW1fY2hhcnRzICAgICA9ICRzaGVldC0+X3ByZXBhcmVfY2hhcnRzKCk7CisgICAgICAgIG15ICRudW1fZmlsdGVycyAgICA9ICRzaGVldC0+e19maWx0ZXJfY291bnR9OworCisgICAgICAgIG5leHQgdW5sZXNzICRudW1faW1hZ2VzICsgJG51bV9jb21tZW50cyArICRudW1fY2hhcnRzICskbnVtX2ZpbHRlcnM7CisKKworICAgICAgICAjIEluY2x1ZGUgMSBwYXJlbnQgTVNPRFJBV0lORyBzaGFwZSwgcGVyIHNoZWV0LCBpbiB0aGUgc2hhcGUgY291bnQuCisgICAgICAgIG15ICRudW1fc2hhcGVzICAgKz0gMSArICRudW1faW1hZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICRudW1fY29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJG51bV9jaGFydHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJG51bV9maWx0ZXJzOworICAgICAgICAgICAkc2hhcGVzX3NhdmVkICs9ICRudW1fc2hhcGVzOworICAgICAgICAgICAkbXNvX3NpemUgICAgICs9ICRpbWFnZV9tc29fc2l6ZTsKKworCisgICAgICAgICMgQWRkIGEgZHJhd2luZyBvYmplY3QgZm9yIGVhY2ggc2hlZXQgd2l0aCBjb21tZW50cy4KKyAgICAgICAgJGRyYXdpbmdzX3NhdmVkKys7CisKKworICAgICAgICAjIEZvciBlYWNoIHNoZWV0IHN0YXJ0IHRoZSBzcGlkcyBhdCB0aGUgbmV4dCAxMDI0IGludGVydmFsLgorICAgICAgICAkbWF4X3NwaWQgICA9IDEwMjQgKiAoMSArIGludCgoJG1heF9zcGlkIC0xKS8xMDI0KSk7CisgICAgICAgICRzdGFydF9zcGlkID0gJG1heF9zcGlkOworCisKKyAgICAgICAgIyBNYXggc3BpZCBmb3IgZWFjaCBzaGVldCBhbmQgZXZlbnR1YWxseSBmb3IgdGhlIHdvcmtib29rLgorICAgICAgICAkbWF4X3NwaWQgICs9ICRudW1fc2hhcGVzOworCisKKyAgICAgICAgIyBTdG9yZSB0aGUgY2x1c3RlciBpZHMKKyAgICAgICAgZm9yIChteSAkaSA9ICRudW1fc2hhcGVzOyAkaSA+IDA7ICRpIC09IDEwMjQpIHsKKyAgICAgICAgICAgICRudW1fY2x1c3RlcnMgICs9IDE7CisgICAgICAgICAgICAkbXNvX3NpemUgICAgICArPSA4OworICAgICAgICAgICAgbXkgJHNpemUgICAgICAgID0gJGkgPiAxMDI0ID8gMTAyNCA6ICRpOworCisgICAgICAgICAgICBwdXNoIEBjbHVzdGVycywgWyRkcmF3aW5nc19zYXZlZCwgJHNpemVdOworICAgICAgICB9CisKKworICAgICAgICAjIFBhc3MgY2FsY3VsYXRlZCB2YWx1ZXMgYmFjayB0byB0aGUgd29ya3NoZWV0CisgICAgICAgICRzaGVldC0+e19vYmplY3RfaWRzfSA9IFskc3RhcnRfc3BpZCwgJGRyYXdpbmdzX3NhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW1fc2hhcGVzLCAkbWF4X3NwaWQgLTFdOworICAgIH0KKworCisgICAgIyBDYWxjdWxhdGUgdGhlIE1TT0RSQVdJTkdHUk9VUCBzaXplIGlmIHdlIGhhdmUgc3RvcmVkIHNvbWUgc2hhcGVzLgorICAgICRtc29fc2l6ZSAgICAgICAgICAgICAgKz0gODYgaWYgJG1zb19zaXplOyAjIFNtYWxsZXN0IHNpemUgaXMgODYrOD05NAorCisKKyAgICAkc2VsZi0+e19tc29fc2l6ZX0gICAgICA9ICRtc29fc2l6ZTsKKyAgICAkc2VsZi0+e19tc29fY2x1c3RlcnN9ICA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heF9zcGlkLCAkbnVtX2NsdXN0ZXJzLCAkc2hhcGVzX3NhdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZHJhd2luZ3Nfc2F2ZWQsIFtAY2x1c3RlcnNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJvY2Vzc19pbWFnZXMoKQorIworIyBXZSBuZWVkIHRvIHByb2Nlc3MgZWFjaCBpbWFnZSBpbiBlYWNoIHdvcmtzaGVldCBhbmQgZXh0cmFjdCBpbmZvcm1hdGlvbi4KKyMgU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBhbmQgdXNlZCBpbiB0aGUgV29ya2Jvb2sgYW5kIHNvbWUgaXMKKyMgcGFzc2VkIGJhY2sgaW50byBlYWNoIFdvcmtzaGVldC4gVGhlIG92ZXJhbGwgc2l6ZSBmb3IgdGhlIGltYWdlIHJlbGF0ZWQKKyMgQklGRiBzdHJ1Y3R1cmVzIGluIHRoZSBXb3JrYm9vayBpcyBjYWxjdWxhdGVkIGhlcmUuCisjCisjIE1TTyBzaXplID0gIDggYnl0ZXMgZm9yIGJzdG9yZV9jb250YWluZXIgKworIyAgICAgICAgICAgIDQ0IGJ5dGVzIGZvciBibGlwX3N0b3JlX2VudHJ5ICsKKyMgICAgICAgICAgICAyNSBieXRlcyBmb3IgYmxpcAorIyAgICAgICAgICA9IDc3ICsgaW1hZ2Ugc2l6ZS4KKyMKK3N1YiBfcHJvY2Vzc19pbWFnZXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICVpbWFnZXNfc2VlbjsKKyAgICBteSBAaW1hZ2VfZGF0YTsKKyAgICBteSBAcHJldmlvdXNfaW1hZ2VzOworICAgIG15ICRpbWFnZV9pZCAgICA9IDE7CisgICAgbXkgJGltYWdlc19zaXplID0gMDsKKworCisgICAgZm9yZWFjaCBteSAkc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgIG5leHQgdW5sZXNzICRzaGVldC0+e19zaGVldF90eXBlfSA9PSAweDAwMDA7ICMgSWdub3JlIGNoYXJ0cy4KKyAgICAgICAgbmV4dCB1bmxlc3MgJHNoZWV0LT5fcHJlcGFyZV9pbWFnZXMoKTsKKworICAgICAgICBteSAkbnVtX2ltYWdlcyAgICAgID0gMDsKKyAgICAgICAgbXkgJGltYWdlX21zb19zaXplICA9IDA7CisKKworICAgICAgICBmb3IgbXkgJGltYWdlX3JlZiAoQHskc2hlZXQtPntfaW1hZ2VzX2FycmF5fX0pIHsKKyAgICAgICAgICAgIG15ICRmaWxlbmFtZSA9ICRpbWFnZV9yZWYtPlsyXTsKKyAgICAgICAgICAgICRudW1faW1hZ2VzKys7CisKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRm9yIGVhY2ggV29ya3NoZWV0IGltYWdlIHdlIGdldCBhIHN0cnVjdHVyZSBsaWtlIHRoaXMKKyAgICAgICAgICAgICMgWworICAgICAgICAgICAgIyAgICRyb3csCisgICAgICAgICAgICAjICAgJGNvbCwKKyAgICAgICAgICAgICMgICAkbmFtZSwKKyAgICAgICAgICAgICMgICAkeF9vZmZzZXQsCisgICAgICAgICAgICAjICAgJHlfb2Zmc2V0LAorICAgICAgICAgICAgIyAgICRzY2FsZV94LAorICAgICAgICAgICAgIyAgICRzY2FsZV95LAorICAgICAgICAgICAgIyBdCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEFuZCB3ZSBhZGQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgICAkaW1hZ2VfaWQsCisgICAgICAgICAgICAjICAgJHR5cGUsCisgICAgICAgICAgICAjICAgJHdpZHRoLAorICAgICAgICAgICAgIyAgICRoZWlnaHQ7CisKKyAgICAgICAgICAgIGlmIChub3QgZXhpc3RzICRpbWFnZXNfc2VlbnskZmlsZW5hbWV9KSB7CisgICAgICAgICAgICAgICAgIyBUT0RPIHNob3VsZCBhbHNvIG1hdGNoIHNlZW4gaW1hZ2VzIGJhc2VkIG9uIGNoZWNrc3VtLgorCisgICAgICAgICAgICAgICAgIyBPcGVuIHRoZSBpbWFnZSBmaWxlIGFuZCBpbXBvcnQgdGhlIGRhdGEuCisgICAgICAgICAgICAgICAgbXkgJGZoID0gRmlsZUhhbmRsZS0+bmV3KCRmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgY3JvYWsgIkNvdWxkbid0IGltcG9ydCAkZmlsZW5hbWU6ICQhIiB1bmxlc3MgZGVmaW5lZCAkZmg7CisgICAgICAgICAgICAgICAgYmlubW9kZSAkZmg7CisKKyAgICAgICAgICAgICAgICAjIFNsdXJwIHRoZSBmaWxlIGludG8gYSBzdHJpbmcgYW5kIGRvIHNvbWUgc2l6ZSBjYWxjcy4KKyAgICAgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSBkbyB7bG9jYWwgJC87IDwkZmg+fTsKKyAgICAgICAgICAgICAgICBteSAkc2l6ZSAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICAgICAgbXkgJGNoZWNrc3VtMSAgID0gJHNlbGYtPl9pbWFnZV9jaGVja3N1bSgkZGF0YSwgJGltYWdlX2lkKTsKKyAgICAgICAgICAgICAgICBteSAkY2hlY2tzdW0yICAgPSAkY2hlY2tzdW0xOworICAgICAgICAgICAgICAgIG15ICRyZWZfY291bnQgICA9IDE7CisKKworICAgICAgICAgICAgICAgICMgUHJvY2VzcyB0aGUgaW1hZ2UgYW5kIGV4dHJhY3QgZGltZW5zaW9ucy4KKyAgICAgICAgICAgICAgICBteSAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAjIFRlc3QgZm9yIFBOR3MuLi4KKyAgICAgICAgICAgICAgICBpZiAgICAodW5wYWNrKCd4IEEzJywgJGRhdGEpIGVxICdQTkcnKSB7CisgICAgICAgICAgICAgICAgICAgICgkdHlwZSwgJHdpZHRoLCAkaGVpZ2h0KSA9ICRzZWxmLT5fcHJvY2Vzc19wbmcoJGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjIFRlc3QgZm9yIEpGSUYgYW5kIEV4aWYgSlBFR3MuLi4KKyAgICAgICAgICAgICAgICBlbHNpZiAoICh1bnBhY2soJ24nLCAkZGF0YSkgPT0gMHhGRkQ4KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKHVucGFjaygneDYgQTQnLCAkZGF0YSkgZXEgJ0pGSUYnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVucGFjaygneDYgQTQnLCAkZGF0YSkgZXEgJ0V4aWYnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCkgPSAkc2VsZi0+X3Byb2Nlc3NfanBnKCRkYXRhLCAkZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjIFRlc3QgZm9yIEJNUHMuLi4KKyAgICAgICAgICAgICAgICBlbHNpZiAodW5wYWNrKCdBMicsICAgJGRhdGEpIGVxICdCTScpIHsKKyAgICAgICAgICAgICAgICAgICAgKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpID0gJHNlbGYtPl9wcm9jZXNzX2JtcCgkZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICAjIFRoZSAxNCBieXRlIGhlYWRlciBvZiB0aGUgQk1QIGlzIHN0cmlwcGVkIG9mZi4KKyAgICAgICAgICAgICAgICAgICAgJGRhdGEgICAgICAgPSBzdWJzdHIgJGRhdGEsIDE0OworCisgICAgICAgICAgICAgICAgICAgICMgQSBjaGVja3N1bSBvZiB0aGUgbmV3IGltYWdlIGRhdGEgaXMgYWxzbyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgJGNoZWNrc3VtMiAgPSAkc2VsZi0+X2ltYWdlX2NoZWNrc3VtKCRkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltYWdlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltYWdlX2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgICAgICMgQWRqdXN0IHNpemUgLTE0IChoZWFkZXIpICsgMTYgKGV4dHJhIGNoZWNrc3VtKS4KKyAgICAgICAgICAgICAgICAgICAgJHNpemUgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNyb2FrICJVbnN1cHBvcnRlZCBpbWFnZSBmb3JtYXQgZm9yIGZpbGU6ICRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICMgUHVzaCB0aGUgbmV3IGRhdGEgYmFjayBpbnRvIHRoZSBXb3Jrc2hlZXQgYXJyYXk7CisgICAgICAgICAgICAgICAgcHVzaCBAJGltYWdlX3JlZiwgJGltYWdlX2lkLCAkdHlwZSwgJHdpZHRoLCAkaGVpZ2h0OworCisgICAgICAgICAgICAgICAgIyBBbHNvIHN0b3JlIG5ldyBkYXRhIGZvciB1c2UgaW4gZHVwbGljYXRlIGltYWdlcy4KKyAgICAgICAgICAgICAgICBwdXNoIEBwcmV2aW91c19pbWFnZXMsIFskaW1hZ2VfaWQsICR0eXBlLCAkd2lkdGgsICRoZWlnaHRdOworCisKKyAgICAgICAgICAgICAgICAjIFN0b3JlIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBXb3JrYm9vay4KKyAgICAgICAgICAgICAgICBwdXNoIEBpbWFnZV9kYXRhLCBbJHJlZl9jb3VudCwgJHR5cGUsICRkYXRhLCAkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoZWNrc3VtMSwgJGNoZWNrc3VtMl07CisKKyAgICAgICAgICAgICAgICAjIEtlZXAgdHJhY2sgb2Ygb3ZlcmFsbCBkYXRhIHNpemUuCisgICAgICAgICAgICAgICAgJGltYWdlc19zaXplICAgICAgICs9ICRzaXplICs2MTsgIyBTaXplIGZvciBic3RvcmUgY29udGFpbmVyLgorICAgICAgICAgICAgICAgICRpbWFnZV9tc29fc2l6ZSAgICArPSAkc2l6ZSArNjk7ICMgU2l6ZSBmb3IgZGdnIGNvbnRhaW5lci4KKworICAgICAgICAgICAgICAgICRpbWFnZXNfc2VlbnskZmlsZW5hbWV9ID0gJGltYWdlX2lkKys7CisgICAgICAgICAgICAgICAgJGZoLT5jbG9zZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICMgV2UndmUgcHJvY2Vzc2VkIHRoaXMgZmlsZSBhbHJlYWR5LgorICAgICAgICAgICAgICAgIG15ICRpbmRleCA9ICRpbWFnZXNfc2VlbnskZmlsZW5hbWV9IC0xOworCisgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSBpbWFnZSByZWZlcmVuY2UgY291bnQuCisgICAgICAgICAgICAgICAgJGltYWdlX2RhdGFbJGluZGV4XS0+WzBdKys7CisKKyAgICAgICAgICAgICAgICAjIEFkZCBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgZGF0YSBiYWNrIG9udG8gdGhlIFdvcmtzaGVldCBhcnJheS4KKyAgICAgICAgICAgICAgICAjICRpbWFnZV9pZCwgJHR5cGUsICR3aWR0aCwgJGhlaWdodAorICAgICAgICAgICAgICAgIG15ICRhX3JlZiA9ICRzaGVldC0+e19pbWFnZXNfYXJyYXl9LT5bJGluZGV4XTsKKyAgICAgICAgICAgICAgICBwdXNoIEAkaW1hZ2VfcmVmLCBAeyRwcmV2aW91c19pbWFnZXNbJGluZGV4XX07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIFN0b3JlIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBXb3Jrc2hlZXQuCisgICAgICAgICRzaGVldC0+e19udW1faW1hZ2VzfSAgICAgPSAkbnVtX2ltYWdlczsKKyAgICAgICAgJHNoZWV0LT57X2ltYWdlX21zb19zaXplfSA9ICRpbWFnZV9tc29fc2l6ZTsKKworICAgIH0KKworCisgICAgIyBTdG9yZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgV29ya2Jvb2suCisgICAgJHNlbGYtPntfaW1hZ2VzX3NpemV9ID0gJGltYWdlc19zaXplOworICAgICRzZWxmLT57X2ltYWdlc19kYXRhfSA9IFxAaW1hZ2VfZGF0YTsgIyBTdG9yZSB0aGUgZGF0YSBmb3IgTVNPRFJBV0lOR0dST1VQLgorCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfaW1hZ2VfY2hlY2tzdW0oKQorIworIyBHZW5lcmF0ZSBhIGNoZWNrc3VtIGZvciB0aGUgaW1hZ2UgdXNpbmcgd2hpY2hldmVyIG1vZHVsZSBpcyBhdmFpbGFibGUuLlRoZQorIyBhdmFpbGFibGUgbW9kdWxlcyBhcmUgY2hlY2tlZCBpbiBfZ2V0X2NoZWNrc3VtX21ldGhvZCgpLiBFeGNlbCB1c2VzIGFuIE1ENAorIyBjaGVja3N1bSBidXQgYW55IG90aGVyIHdpbGwgZG8uIEluIHRoZSBldmVudCBvZiBubyBjaGVja3N1bSBtb2R1bGUgYmVpbmcKKyMgYXZhaWxhYmxlIHdlIHNpbXVsYXRlIGEgY2hlY2tzdW0gdXNpbmcgdGhlIGltYWdlIGluZGV4LgorIworc3ViIF9pbWFnZV9jaGVja3N1bSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGRhdGEgICAgPSAkX1swXTsKKyAgICBteSAkaW5kZXgxICA9ICRfWzFdOworICAgIG15ICRpbmRleDIgID0gJF9bMl0gfHwgMDsKKworICAgIGlmICAgICgkc2VsZi0+e19jaGVja3N1bV9tZXRob2R9ID09IDEpIHsKKyAgICAgICAgIyBEaWdlc3Q6Ok1ENAorICAgICAgICByZXR1cm4gRGlnZXN0OjpNRDQ6Om1kNF9oZXgoJGRhdGEpOworICAgIH0KKyAgICBlbHNpZiAoJHNlbGYtPntfY2hlY2tzdW1fbWV0aG9kfSA9PSAyKSB7CisgICAgICAgICMgRGlnZXN0OjpQZXJsOjpNRDQKKyAgICAgICAgcmV0dXJuIERpZ2VzdDo6UGVybDo6TUQ0OjptZDRfaGV4KCRkYXRhKTsKKyAgICB9CisgICAgZWxzaWYgKCRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPT0gMykgeworICAgICAgICAjIERpZ2VzdDo6TUQ1CisgICAgICAgIHJldHVybiBEaWdlc3Q6Ok1ENTo6bWQ1X2hleCgkZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAjIERlZmF1bHQKKyAgICAgICAgcmV0dXJuIHNwcmludGYgJyUwMTZYJTAxNlgnLCAkaW5kZXgyLCAkaW5kZXgxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wcm9jZXNzX3BuZygpCisjCisjIEV4dHJhY3Qgd2lkdGggYW5kIGhlaWdodCBpbmZvcm1hdGlvbiBmcm9tIGEgUE5HIGZpbGUuCisjCitzdWIgX3Byb2Nlc3NfcG5nIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICA9IDY7ICMgRXhjZWwgQmxpcCB0eXBlIChNU09CTElQVFlQRSkuCisgICAgbXkgJHdpZHRoICAgPSB1bnBhY2sgIk4iLCBzdWJzdHIgJF9bMF0sIDE2LCA0OworICAgIG15ICRoZWlnaHQgID0gdW5wYWNrICJOIiwgc3Vic3RyICRfWzBdLCAyMCwgNDsKKworICAgIHJldHVybiAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJvY2Vzc19ibXAoKQorIworIyBFeHRyYWN0IHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gZnJvbSBhIEJNUCBmaWxlLgorIworIyBNb3N0IG9mIHRoZXNlIGNoZWNrcyBjYW1lIGZyb20gdGhlIG9sZCBXb3Jrc2hlZXQ6Ol9wcm9jZXNzX2JpdG1hcCgpIG1ldGhvZC4KKyMKK3N1YiBfcHJvY2Vzc19ibXAgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJGRhdGEgICAgID0gJF9bMF07CisgICAgbXkgJGZpbGVuYW1lID0gJF9bMV07CisgICAgbXkgJHR5cGUgICAgID0gNzsgIyBFeGNlbCBCbGlwIHR5cGUgKE1TT0JMSVBUWVBFKS4KKworCisgICAgIyBDaGVjayB0aGF0IHRoZSBmaWxlIGlzIGJpZyBlbm91Z2ggdG8gYmUgYSBiaXRtYXAuCisgICAgaWYgKGxlbmd0aCAkZGF0YSA8PSAweDM2KSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWUgZG9lc24ndCBjb250YWluIGVub3VnaCBkYXRhLiI7CisgICAgfQorCisKKyAgICAjIFJlYWQgdGhlIGJpdG1hcCB3aWR0aCBhbmQgaGVpZ2h0LiBWZXJpZnkgdGhlIHNpemVzLgorICAgIG15ICgkd2lkdGgsICRoZWlnaHQpID0gdW5wYWNrICJ4MTggVjIiLCAkZGF0YTsKKworICAgIGlmICgkd2lkdGggPiAweEZGRkYpIHsKKyAgICAgICAgY3JvYWsgIiRmaWxlbmFtZTogbGFyZ2VzdCBpbWFnZSB3aWR0aCAkd2lkdGggc3VwcG9ydGVkIGlzIDY1ay4iOworICAgIH0KKworICAgIGlmICgkaGVpZ2h0ID4gMHhGRkZGKSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IGxhcmdlc3QgaW1hZ2UgaGVpZ2h0IHN1cHBvcnRlZCBpcyA2NWsuIjsKKyAgICB9CisKKyAgICAjIFJlYWQgdGhlIGJpdG1hcCBwbGFuZXMgYW5kIGJwcCBkYXRhLiBWZXJpZnkgdGhlbS4KKyAgICBteSAoJHBsYW5lcywgJGJpdGNvdW50KSA9IHVucGFjayAieDI2IHYyIiwgJGRhdGE7CisKKyAgICBpZiAoJGJpdGNvdW50ICE9IDI0KSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWUgaXNuJ3QgYSAyNGJpdCB0cnVlIGNvbG9yIGJpdG1hcC4iOworICAgIH0KKworICAgIGlmICgkcGxhbmVzICE9IDEpIHsKKyAgICAgICAgY3JvYWsgIiRmaWxlbmFtZTogb25seSAxIHBsYW5lIHN1cHBvcnRlZCBpbiBiaXRtYXAgaW1hZ2UuIjsKKyAgICB9CisKKworICAgICMgUmVhZCB0aGUgYml0bWFwIGNvbXByZXNzaW9uLiBWZXJpZnkgY29tcHJlc3Npb24uCisgICAgbXkgJGNvbXByZXNzaW9uID0gdW5wYWNrICJ4MzAgViIsICRkYXRhOworCisgICAgaWYgKCRjb21wcmVzc2lvbiAhPSAwKSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IGNvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWQgaW4gYml0bWFwIGltYWdlLiI7CisgICAgfQorCisgICAgcmV0dXJuICgkdHlwZSwgJHdpZHRoLCAkaGVpZ2h0KTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wcm9jZXNzX2pwZygpCisjCisjIEV4dHJhY3Qgd2lkdGggYW5kIGhlaWdodCBpbmZvcm1hdGlvbiBmcm9tIGEgSlBFRyBmaWxlLgorIworc3ViIF9wcm9jZXNzX2pwZyB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkZGF0YSAgICAgPSAkX1swXTsKKyAgICBteSAkZmlsZW5hbWUgPSAkX1sxXTsKKyAgICBteSAkdHlwZSAgICAgPSA1OyAjIEV4Y2VsIEJsaXAgdHlwZSAoTVNPQkxJUFRZUEUpLgorICAgIG15ICR3aWR0aDsKKyAgICBteSAkaGVpZ2h0OworCisgICAgbXkgJG9mZnNldCA9IDI7CisgICAgbXkgJGRhdGFfbGVuZ3RoID0gbGVuZ3RoICRkYXRhOworCisgICAgIyBTZWFyY2ggdGhyb3VnaCB0aGUgaW1hZ2UgZGF0YSB0byBmaW5kIHRoZSAweEZGQzAgbWFya2VyLiBUaGUgaGVpZ2h0IGFuZAorICAgICMgd2lkdGggYXJlIGNvbnRhaW5lZCBpbiB0aGUgZGF0YSBmb3IgdGhhdCBzdWIgZWxlbWVudC4KKyAgICB3aGlsZSAoJG9mZnNldCA8ICRkYXRhX2xlbmd0aCkgeworCisgICAgICAgIG15ICRtYXJrZXIgID0gdW5wYWNrICJuIiwgc3Vic3RyICRkYXRhLCAkb2Zmc2V0LCAgICAyOworICAgICAgICBteSAkbGVuZ3RoICA9IHVucGFjayAibiIsIHN1YnN0ciAkZGF0YSwgJG9mZnNldCArMiwgMjsKKworICAgICAgICBpZiAoJG1hcmtlciA9PSAweEZGQzAgfHwgJG1hcmtlciA9PSAweEZGQzIpIHsKKyAgICAgICAgICAgICRoZWlnaHQgPSB1bnBhY2sgIm4iLCBzdWJzdHIgJGRhdGEsICRvZmZzZXQgKzUsIDI7CisgICAgICAgICAgICAkd2lkdGggID0gdW5wYWNrICJuIiwgc3Vic3RyICRkYXRhLCAkb2Zmc2V0ICs3LCAyOworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorCisgICAgICAgICRvZmZzZXQgPSAkb2Zmc2V0ICsgJGxlbmd0aCArIDI7CisgICAgICAgIGxhc3QgaWYgJG1hcmtlciA9PSAweEZGREE7CisgICAgfQorCisgICAgaWYgKG5vdCBkZWZpbmVkICRoZWlnaHQpIHsKKyAgICAgICAgY3JvYWsgIiRmaWxlbmFtZTogbm8gc2l6ZSBkYXRhIGZvdW5kIGluIGpwZWcgaW1hZ2UuXG4iOworICAgIH0KKworICAgIHJldHVybiAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYWxsX2ZvbnRzKCkKKyMKKyMgU3RvcmUgdGhlIEV4Y2VsIEZPTlQgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfYWxsX2ZvbnRzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkZm9ybWF0ICA9ICRzZWxmLT57X2Zvcm1hdHN9LT5bMTVdOyAjIFRoZSBkZWZhdWx0IGNlbGwgZm9ybWF0LgorICAgIG15ICRmb250ICAgID0gJGZvcm1hdC0+Z2V0X2ZvbnQoKTsKKworICAgICMgRm9udHMgYXJlIDAtaW5kZXhlZC4gQWNjb3JkaW5nIHRvIHRoZSBTREsgdGhlcmUgaXMgbm8gaW5kZXggNCwKKyAgICBmb3IgKDAuLjMpIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGZvbnQpOworICAgIH0KKworCisgICAgIyBBZGQgdGhlIGRlZmF1bHQgZm9udHMgZm9yIGNoYXJ0cyBhbmQgY29tbWVudHMuIFRoaXMgYXJlbid0IGNvbm5lY3RlZAorICAgICMgdG8gWEYgZm9ybWF0cy4gTm90ZSwgdGhlIGZvbnQgc2l6ZSwgYW5kIHNvbWUgb3RoZXIgcHJvcGVydGllcyBvZgorICAgICMgY2hhcnQgZm9udHMgYXJlIHNldCBpbiB0aGUgRkJJIHJlY29yZCBvZiB0aGUgY2hhcnQuCisgICAgbXkgJHRtcF9mb3JtYXQ7CisKKyAgICAjIEluZGV4IDUuIEF4aXMgbnVtYmVycy4KKyAgICAkdG1wX2Zvcm1hdCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQtPm5ldygKKyAgICAgICAgdW5kZWYsCisgICAgICAgIGZvbnRfb25seSA9PiAxLAorICAgICk7CisgICAgJHNlbGYtPl9hcHBlbmQoICR0bXBfZm9ybWF0LT5nZXRfZm9udCgpICk7CisKKyAgICAjIEluZGV4IDYuIFNlcmllcyBuYW1lcy4KKyAgICAkdG1wX2Zvcm1hdCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQtPm5ldygKKyAgICAgICAgdW5kZWYsCisgICAgICAgIGZvbnRfb25seSA9PiAxLAorICAgICk7CisgICAgJHNlbGYtPl9hcHBlbmQoICR0bXBfZm9ybWF0LT5nZXRfZm9udCgpICk7CisKKyAgICAjIEluZGV4IDcuIFRpdGxlLgorICAgICR0bXBfZm9ybWF0ID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdC0+bmV3KAorICAgICAgICB1bmRlZiwKKyAgICAgICAgZm9udF9vbmx5ID0+IDEsCisgICAgICAgIGJvbGQgICAgICA9PiAxLAorICAgICk7CisgICAgJHNlbGYtPl9hcHBlbmQoICR0bXBfZm9ybWF0LT5nZXRfZm9udCgpICk7CisKKyAgICAjIEluZGV4IDguIEF4ZXMuCisgICAgJHRtcF9mb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIHVuZGVmLAorICAgICAgICBmb250X29ubHkgPT4gMSwKKyAgICAgICAgYm9sZCAgICAgID0+IDEsCisgICAgKTsKKyAgICAkc2VsZi0+X2FwcGVuZCggJHRtcF9mb3JtYXQtPmdldF9mb250KCkgKTsKKworICAgICMgSW5kZXggOS4gQ29tbWVudHMuCisgICAgJHRtcF9mb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIHVuZGVmLAorICAgICAgICBmb250X29ubHkgPT4gMSwKKyAgICAgICAgZm9udCAgICAgID0+ICdUYWhvbWEnLAorICAgICAgICBzaXplICAgICAgPT4gOCwKKyAgICApOworICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wX2Zvcm1hdC0+Z2V0X2ZvbnQoKSApOworCisKKyAgICAjIEl0ZXJhdGUgdGhyb3VnaCB0aGUgWEYgb2JqZWN0cyBhbmQgd3JpdGUgYSBGT05UIHJlY29yZCBpZiBpdCBpc24ndCB0aGUKKyAgICAjIHNhbWUgYXMgdGhlIGRlZmF1bHQgRk9OVCBhbmQgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiB1c2VkLgorICAgICMKKyAgICBteSAlZm9udHM7CisgICAgbXkgJGtleTsKKyAgICBteSAkaW5kZXggPSAxMDsgICAgICAgICAgICAgICAgICAjIFRoZSBmaXJzdCB1c2VyIGRlZmluZWQgRk9OVAorCisgICAgJGtleSA9ICRmb3JtYXQtPmdldF9mb250X2tleSgpOyAjIFRoZSBkZWZhdWx0IGZvbnQgZm9yIGNlbGwgZm9ybWF0cy4KKyAgICAkZm9udHN7JGtleX0gPSAwOyAgICAgICAgICAgICAgICMgSW5kZXggb2YgdGhlIGRlZmF1bHQgZm9udAorCisgICAgIyBGb250cyB0aGF0IGFyZSBtYXJrZWQgYXMgJ19mb250X29ubHknIGFyZSBhbHdheXMgc3RvcmVkLiBUaGVzZSBhcmUgdXNlZAorICAgICMgbWFpbmx5IGZvciBjaGFydHMgYW5kIG1heSBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIFhGIHJlY29yZC4KKworICAgIGZvcmVhY2ggJGZvcm1hdCAoQHskc2VsZi0+e19mb3JtYXRzfX0pIHsKKyAgICAgICAgJGtleSA9ICRmb3JtYXQtPmdldF9mb250X2tleSgpOworCisgICAgICAgIGlmIChub3QgJGZvcm1hdC0+e19mb250X29ubHl9IGFuZCBleGlzdHMgJGZvbnRzeyRrZXl9KSB7CisgICAgICAgICAgICAjIEZPTlQgaGFzIGFscmVhZHkgYmVlbiB1c2VkCisgICAgICAgICAgICAkZm9ybWF0LT57X2ZvbnRfaW5kZXh9ID0gJGZvbnRzeyRrZXl9OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBBZGQgYSBuZXcgRk9OVCByZWNvcmQKKworICAgICAgICAgICAgaWYgKG5vdCAkZm9ybWF0LT57X2ZvbnRfb25seX0pIHsKKyAgICAgICAgICAgICAgICAkZm9udHN7JGtleX0gPSAkaW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRmb3JtYXQtPntfZm9udF9pbmRleH0gPSAkaW5kZXg7CisgICAgICAgICAgICAkaW5kZXgrKzsKKyAgICAgICAgICAgICRmb250ID0gJGZvcm1hdC0+Z2V0X2ZvbnQoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRmb250KTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9hbGxfbnVtX2Zvcm1hdHMoKQorIworIyBTdG9yZSB1c2VyIGRlZmluZWQgbnVtZXJpY2FsIGZvcm1hdHMgaS5lLiBGT1JNQVQgcmVjb3JkcworIworc3ViIF9zdG9yZV9hbGxfbnVtX2Zvcm1hdHMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICVudW1fZm9ybWF0czsKKyAgICBteSBAbnVtX2Zvcm1hdHM7CisgICAgbXkgJG51bV9mb3JtYXQ7CisgICAgbXkgJGluZGV4ID0gMTY0OyAjIFVzZXIgZGVmaW5lZCBGT1JNQVQgcmVjb3JkcyBzdGFydCBmcm9tIDB4QTQKKworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIFhGIG9iamVjdHMgYW5kIHdyaXRlIGEgRk9STUFUIHJlY29yZCBpZiBpdCBpc24ndCBhCisgICAgIyBidWlsdC1pbiBmb3JtYXQgdHlwZSBhbmQgaWYgdGhlIEZPUk1BVCBzdHJpbmcgaGFzbid0IGFscmVhZHkgYmVlbiB1c2VkLgorICAgICMKKyAgICBmb3JlYWNoIG15ICRmb3JtYXQgKEB7JHNlbGYtPntfZm9ybWF0c319KSB7CisgICAgICAgIG15ICRudW1fZm9ybWF0ID0gJGZvcm1hdC0+e19udW1fZm9ybWF0fTsKKyAgICAgICAgbXkgJGVuY29kaW5nICAgPSAkZm9ybWF0LT57X251bV9mb3JtYXRfZW5jfTsKKworICAgICAgICAjIENoZWNrIGlmICRudW1fZm9ybWF0IGlzIGFuIGluZGV4IHRvIGEgYnVpbHQtaW4gZm9ybWF0LgorICAgICAgICAjIEFsc28gY2hlY2sgZm9yIGEgc3RyaW5nIG9mIHplcm9zLCB3aGljaCBpcyBhIHZhbGlkIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgIyBidXQgd291bGQgZXZhbHVhdGUgdG8gemVyby4KKyAgICAgICAgIworICAgICAgICBpZiAoJG51bV9mb3JtYXQgIX4gbS9eMCtcZC8pIHsKKyAgICAgICAgICAgIG5leHQgaWYgJG51bV9mb3JtYXQgPX4gbS9eXGQrJC87ICMgYnVpbHQtaW4KKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGlzdHMoJG51bV9mb3JtYXRzeyRudW1fZm9ybWF0fSkpIHsKKyAgICAgICAgICAgICMgRk9STUFUIGhhcyBhbHJlYWR5IGJlZW4gdXNlZAorICAgICAgICAgICAgJGZvcm1hdC0+e19udW1fZm9ybWF0fSA9ICRudW1fZm9ybWF0c3skbnVtX2Zvcm1hdH07CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICMgQWRkIGEgbmV3IEZPUk1BVAorICAgICAgICAgICAgJG51bV9mb3JtYXRzeyRudW1fZm9ybWF0fSA9ICRpbmRleDsKKyAgICAgICAgICAgICRmb3JtYXQtPntfbnVtX2Zvcm1hdH0gICAgPSAkaW5kZXg7CisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX251bV9mb3JtYXQoJG51bV9mb3JtYXQsICRpbmRleCwgJGVuY29kaW5nKTsKKyAgICAgICAgICAgICRpbmRleCsrOworICAgICAgICB9CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FsbF94ZnMoKQorIworIyBXcml0ZSBhbGwgWEYgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfYWxsX3hmcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgZm9yZWFjaCBteSAkZm9ybWF0IChAeyRzZWxmLT57X2Zvcm1hdHN9fSkgeworICAgICAgICBteSAkeGYgPSAkZm9ybWF0LT5nZXRfeGYoKTsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJHhmKTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYWxsX3N0eWxlcygpCisjCisjIFdyaXRlIGFsbCBTVFlMRSByZWNvcmRzLgorIworc3ViIF9zdG9yZV9hbGxfc3R5bGVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIEV4Y2VsIGFkZHMgdGhlIGJ1aWx0LWluIHN0eWxlcyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCisgICAgbXkgQGJ1aWx0X2lucyA9ICgKKyAgICAgICAgWzB4MDMsIDE2XSwgIyBDb21tYQorICAgICAgICBbMHgwNiwgMTddLCAjIENvbW1hWzBdCisgICAgICAgIFsweDA0LCAxOF0sICMgQ3VycmVuY3kKKyAgICAgICAgWzB4MDcsIDE5XSwgIyBDdXJyZW5jeVswXQorICAgICAgICBbMHgwMCwgIDBdLCAjIE5vcm1hbAorICAgICAgICBbMHgwNSwgMjBdLCAjIFBlcmNlbnQKKworICAgICAgICAjIFdlIGRvbid0IGRlYWwgd2l0aCB0aGVzZSBzdHlsZXMgeWV0LgorICAgICAgICAjWzB4MDgsIDIxXSwgIyBIeXBlcmxpbmsKKyAgICAgICAgI1sweDAyLCAgOF0sICMgQ29sTGV2ZWxfbgorICAgICAgICAjWzB4MDEsICAxXSwgIyBSb3dMZXZlbF9uCisgICAgKTsKKworCisgICAgZm9yIG15ICRhcmVmIChAYnVpbHRfaW5zKSB7CisgICAgICAgIG15ICR0eXBlICAgICA9ICRhcmVmLT5bMF07CisgICAgICAgIG15ICR4Zl9pbmRleCA9ICRhcmVmLT5bMV07CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zdHlsZSgkdHlwZSwgJHhmX2luZGV4KTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbmFtZXMoKQorIworIyBXcml0ZSB0aGUgTkFNRSByZWNvcmQgdG8gZGVmaW5lIHRoZSBwcmludCBhcmVhIGFuZCB0aGUgcmVwZWF0IHJvd3MgYW5kIGNvbHMuCisjCitzdWIgX3N0b3JlX25hbWVzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRpbmRleDsKKyAgICBteSAlZXh0X3JlZnMgICAgPSAleyRzZWxmLT57X2V4dF9yZWZzfX07CisKKworICAgICMgQ3JlYXRlIHRoZSB1c2VyIGRlZmluZWQgbmFtZXMuCisgICAgZm9yIG15ICRkZWZpbmVkX25hbWUgKEB7JHNlbGYtPntfZGVmaW5lZF9uYW1lc319KSB7CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9uYW1lKAorICAgICAgICAgICAgJGRlZmluZWRfbmFtZS0+e25hbWV9LAorICAgICAgICAgICAgJGRlZmluZWRfbmFtZS0+e2VuY29kaW5nfSwKKyAgICAgICAgICAgICRkZWZpbmVkX25hbWUtPntzaGVldF9pbmRleH0sCisgICAgICAgICAgICAkZGVmaW5lZF9uYW1lLT57Zm9ybXVsYX0sCisgICAgICAgICk7CisgICAgfQorCisgICAgIyBTb3J0IHRoZSB3b3Jrc2hlZXRzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyIGJ5IG5hbWUuIFRoaXMgaXMgYQorICAgICMgcmVxdWlyZW1lbnQgZm9yIHNvbWUgbm9uLUVuZ2xpc2ggbGFuZ3VhZ2UgRXhjZWwgcGF0Y2ggbGV2ZWxzLgorICAgIG15IEB3b3Jrc2hlZXRzID0gQHskc2VsZi0+e193b3Jrc2hlZXRzfX07CisgICAgICAgQHdvcmtzaGVldHMgPSBzb3J0IHsgJGEtPntfbmFtZX0gY21wICRiLT57X25hbWV9IH0gQHdvcmtzaGVldHM7CisKKyAgICAjIENyZWF0ZSB0aGUgYXV0b2ZpbHRlciBOQU1FIHJlY29yZHMKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB3b3Jrc2hlZXRzKSB7CisgICAgICAgICRpbmRleCAgPSAkd29ya3NoZWV0LT57X2luZGV4fTsKKyAgICAgICAgbXkgJGtleSA9ICIkaW5kZXg6JGluZGV4IjsKKyAgICAgICAgbXkgJHJlZiA9ICRleHRfcmVmc3ska2V5fTsKKworICAgICAgICAjIFdyaXRlIGEgTmFtZSByZWNvcmQgaWYgQXV0b2ZpbHRlciBoYXMgYmVlbiBkZWZpbmVkCisgICAgICAgIGlmICgkd29ya3NoZWV0LT57X2ZpbHRlcl9jb3VudH0pIHsKKyAgICAgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZV9zaG9ydCgKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2luZGV4fSwKKyAgICAgICAgICAgICAgICAweDBELCAjIE5BTUUgdHlwZSA9IEZpbHRlciBEYXRhYmFzZQorICAgICAgICAgICAgICAgICRyZWYsCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19maWx0ZXJfYXJlYX0tPlswXSwKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2ZpbHRlcl9hcmVhfS0+WzFdLAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfZmlsdGVyX2FyZWF9LT5bMl0sCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19maWx0ZXJfYXJlYX0tPlszXSwKKyAgICAgICAgICAgICAgICAxLCAjIEhpZGRlbgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ3JlYXRlIHRoZSBwcmludCBhcmVhIE5BTUUgcmVjb3JkcworICAgIGZvcmVhY2ggbXkgJHdvcmtzaGVldCAoQHdvcmtzaGVldHMpIHsKKyAgICAgICAgJGluZGV4ICA9ICR3b3Jrc2hlZXQtPntfaW5kZXh9OworICAgICAgICBteSAka2V5ID0gIiRpbmRleDokaW5kZXgiOworICAgICAgICBteSAkcmVmID0gJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICMgV3JpdGUgYSBOYW1lIHJlY29yZCBpZiB0aGUgcHJpbnQgYXJlYSBoYXMgYmVlbiBkZWZpbmVkCisgICAgICAgIGlmIChkZWZpbmVkICR3b3Jrc2hlZXQtPntfcHJpbnRfcm93bWlufSkgeworICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9uYW1lX3Nob3J0KAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfaW5kZXh9LAorICAgICAgICAgICAgICAgIDB4MDYsICMgTkFNRSB0eXBlID0gUHJpbnRfQXJlYQorICAgICAgICAgICAgICAgICRyZWYsCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19wcmludF9yb3dtaW59LAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfcHJpbnRfcm93bWF4fSwKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X3ByaW50X2NvbG1pbn0sCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19wcmludF9jb2xtYXh9CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgIyBDcmVhdGUgdGhlIHByaW50IHRpdGxlIE5BTUUgcmVjb3JkcworICAgIGZvcmVhY2ggbXkgJHdvcmtzaGVldCAoQHdvcmtzaGVldHMpIHsKKyAgICAgICAgJGluZGV4ICA9ICR3b3Jrc2hlZXQtPntfaW5kZXh9OworCisgICAgICAgIG15ICRyb3dtaW4gPSAkd29ya3NoZWV0LT57X3RpdGxlX3Jvd21pbn07CisgICAgICAgIG15ICRyb3dtYXggPSAkd29ya3NoZWV0LT57X3RpdGxlX3Jvd21heH07CisgICAgICAgIG15ICRjb2xtaW4gPSAkd29ya3NoZWV0LT57X3RpdGxlX2NvbG1pbn07CisgICAgICAgIG15ICRjb2xtYXggPSAkd29ya3NoZWV0LT57X3RpdGxlX2NvbG1heH07CisgICAgICAgIG15ICRrZXkgICAgPSAiJGluZGV4OiRpbmRleCI7CisgICAgICAgIG15ICRyZWYgICAgPSAkZXh0X3JlZnN7JGtleX07CisKKyAgICAgICAgIyBEZXRlcm1pbmUgaWYgcm93ICsgY29sLCByb3csIGNvbCBvciBub3RoaW5nIGhhcyBiZWVuIGRlZmluZWQKKyAgICAgICAgIyBhbmQgd3JpdGUgdGhlIGFwcHJvcHJpYXRlIHJlY29yZAorICAgICAgICAjCisgICAgICAgIGlmIChkZWZpbmVkICRyb3dtaW4gJiYgZGVmaW5lZCAkY29sbWluKSB7CisgICAgICAgICAgICAjIFJvdyBhbmQgY29sdW1uIHRpdGxlcyBoYXZlIGJlZW4gZGVmaW5lZC4KKyAgICAgICAgICAgICMgUm93IHRpdGxlIGhhcyBiZWVuIGRlZmluZWQuCisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX25hbWVfbG9uZygKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2luZGV4fSwKKyAgICAgICAgICAgICAgICAweDA3LCAjIE5BTUUgdHlwZSA9IFByaW50X1RpdGxlcworICAgICAgICAgICAgICAgICRyZWYsCisgICAgICAgICAgICAgICAgJHJvd21pbiwKKyAgICAgICAgICAgICAgICAkcm93bWF4LAorICAgICAgICAgICAgICAgICRjb2xtaW4sCisgICAgICAgICAgICAgICAgJGNvbG1heAorICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2lmIChkZWZpbmVkICRyb3dtaW4pIHsKKyAgICAgICAgICAgICMgUm93IHRpdGxlIGhhcyBiZWVuIGRlZmluZWQuCisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX25hbWVfc2hvcnQoCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19pbmRleH0sCisgICAgICAgICAgICAgICAgMHgwNywgIyBOQU1FIHR5cGUgPSBQcmludF9UaXRsZXMKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgICRyb3dtaW4sCisgICAgICAgICAgICAgICAgJHJvd21heCwKKyAgICAgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgICAgIDB4ZmYKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKGRlZmluZWQgJGNvbG1pbikgeworICAgICAgICAgICAgIyBDb2x1bW4gdGl0bGUgaGFzIGJlZW4gZGVmaW5lZC4KKyAgICAgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZV9zaG9ydCgKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2luZGV4fSwKKyAgICAgICAgICAgICAgICAweDA3LCAjIE5BTUUgdHlwZSA9IFByaW50X1RpdGxlcworICAgICAgICAgICAgICAgICRyZWYsCisgICAgICAgICAgICAgICAgMHgwMDAwLAorICAgICAgICAgICAgICAgIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAkY29sbWluLAorICAgICAgICAgICAgICAgICRjb2xtYXgKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIE5vdGhpbmcgbGVmdCB0byBkbworICAgICAgICB9CisgICAgfQorfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJJRkYgUkVDT1JEUworIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3dpbmRvdzEoKQorIworIyBXcml0ZSBFeGNlbCBCSUZGIFdJTkRPVzEgcmVjb3JkLgorIworc3ViIF9zdG9yZV93aW5kb3cxIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAwM0Q7ICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICA9IDB4MDAxMjsgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHhXbiAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgICMgSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB3aW5kb3cKKyAgICBteSAkeVduICAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICAgIyBWZXJ0aWNhbCBwb3NpdGlvbiBvZiB3aW5kb3cKKyAgICBteSAkZHhXbiAgICAgID0gMHgzNTVDOyAgICAgICAgICAgICAgICAgIyBXaWR0aCBvZiB3aW5kb3cKKyAgICBteSAkZHlXbiAgICAgID0gMHgzMEVEOyAgICAgICAgICAgICAgICAgIyBIZWlnaHQgb2Ygd2luZG93CisKKyAgICBteSAkZ3JiaXQgICAgID0gMHgwMDM4OyAgICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkY3RhYnNlbCAgID0gJHNlbGYtPntfc2VsZWN0ZWR9OyAgICAgIyBOdW1iZXIgb2Ygd29ya2Jvb2sgdGFicyBzZWxlY3RlZAorICAgIG15ICR3VGFiUmF0aW8gPSAweDAyNTg7ICAgICAgICAgICAgICAgICAjIFRhYiB0byBzY3JvbGxiYXIgcmF0aW8KKworICAgIG15ICRpdGFiRmlyc3QgPSAkc2VsZi0+e19maXJzdHNoZWV0fTsgICAjIDFzdCBkaXNwbGF5ZWQgd29ya3NoZWV0CisgICAgbXkgJGl0YWJDdXIgICA9ICRzZWxmLT57X2FjdGl2ZXNoZWV0fTsgICMgQWN0aXZlIHdvcmtzaGVldAorCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2dnZ2dnZ2dnYiLCAkeFduLCAkeVduLCAkZHhXbiwgJGR5V24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRncmJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0YWJDdXIsICRpdGFiRmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdGFic2VsLCAkd1RhYlJhdGlvKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9ib3VuZHNoZWV0KCkKKyMKKyMgV3JpdGVzIEV4Y2VsIEJJRkYgQk9VTkRTSEVFVCByZWNvcmQuCisjCitzdWIgX3N0b3JlX2JvdW5kc2hlZXQgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MDA4NTsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICA9IDB4MDggKyBsZW5ndGgoJF9bMF0pOyAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRzaGVldG5hbWUgPSAkX1swXTsgICAgICAgICAgICAgICAgIyBXb3Jrc2hlZXQgbmFtZQorICAgIG15ICRvZmZzZXQgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgIyBMb2NhdGlvbiBvZiB3b3Jrc2hlZXQgQk9GCisgICAgbXkgJHR5cGUgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAjIFdvcmtzaGVldCB0eXBlCisgICAgbXkgJGhpZGRlbiAgICA9ICRfWzNdOyAgICAgICAgICAgICAgICAjIFdvcmtzaGVldCBoaWRkZW4gZmxhZworICAgIG15ICRlbmNvZGluZyAgPSAkX1s0XTsgICAgICAgICAgICAgICAgIyBTaGVldCBuYW1lIGVuY29kaW5nCisgICAgbXkgJGNjaCAgICAgICA9IGxlbmd0aCgkc2hlZXRuYW1lKTsgICAjIExlbmd0aCBvZiBzaGVldCBuYW1lCisKKyAgICBteSAkZ3JiaXQgICAgID0gJHR5cGUgfCAkaGlkZGVuOworCisgICAgIyBDaGFyYWN0ZXIgbGVuZ3RoIGlzIG51bSBvZiBjaGFycyBub3QgbnVtIG9mIGJ5dGVzCisgICAgJGNjaCAvPSAyIGlmICRlbmNvZGluZzsKKworICAgICMgQ2hhbmdlIHRoZSBVVEYtMTYgbmFtZSBmcm9tIEJFIHRvIExFCisgICAgJHNoZWV0bmFtZSA9IHBhY2sgJ24qJywgdW5wYWNrICd2KicsICRzaGVldG5hbWUgaWYgJGVuY29kaW5nOworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygiVnZDQyIsICRvZmZzZXQsICRncmJpdCwgJGNjaCwgJGVuY29kaW5nKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkc2hlZXRuYW1lKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zdHlsZSgpCisjCisjIFdyaXRlIEV4Y2VsIEJJRkYgU1RZTEUgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfc3R5bGUgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MDI5MzsgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMDQ7ICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkdHlwZSAgICAgID0gJF9bMF07ICAjIEJ1aWx0LWluIHN0eWxlCisgICAgbXkgJHhmX2luZGV4ICA9ICRfWzFdOyAgIyBJbmRleCB0byBzdHlsZSBYRgorICAgIG15ICRsZXZlbCAgICAgPSAweGZmOyAgICMgT3V0bGluZSBzdHlsZSBsZXZlbAorCisgICAgJHhmX2luZGV4ICAgIHw9IDB4ODAwMDsgIyBBZGQgZmxhZyB0byBpbmRpY2F0ZSBidWlsdC1pbiBzdHlsZS4KKworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2Q0MiLCAkeGZfaW5kZXgsICR0eXBlLCAkbGV2ZWwpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX251bV9mb3JtYXQoKQorIworIyBXcml0ZXMgRXhjZWwgRk9STUFUIHJlY29yZCBmb3Igbm9uICJidWlsdC1pbiIgbnVtZXJpY2FsIGZvcm1hdHMuCisjCitzdWIgX3N0b3JlX251bV9mb3JtYXQgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MDQxRTsgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmb3JtYXQgICAgPSAkX1swXTsgICAgICAgICAgIyBDdXN0b20gZm9ybWF0IHN0cmluZworICAgIG15ICRpZm10ICAgICAgPSAkX1sxXTsgICAgICAgICAgIyBGb3JtYXQgaW5kZXggY29kZQorICAgIG15ICRlbmNvZGluZyAgPSAkX1syXTsgICAgICAgICAgIyBDaGFyIGVuY29kaW5nIGZvciBmb3JtYXQgc3RyaW5nCisKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkZm9ybWF0KSkgeworICAgICAgICAgICAgJGZvcm1hdCA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRmb3JtYXQpOworICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBDaGFyIGxlbmd0aCBvZiBmb3JtYXQgc3RyaW5nCisgICAgbXkgJGNjaCA9IGxlbmd0aCAkZm9ybWF0OworCisKKyAgICAjIEhhbmRsZSBVbmljb2RlIGZvcm1hdCBzdHJpbmdzLgorICAgIGlmICgkZW5jb2RpbmcgPT0gMSkgeworICAgICAgICBjcm9hayAiVW5ldmVuIG51bWJlciBvZiBieXRlcyBpbiBVbmljb2RlIGZvbnQgbmFtZSIgaWYgJGNjaCAlIDI7CisgICAgICAgICRjY2ggICAgLz0gMiBpZiAkZW5jb2Rpbmc7CisgICAgICAgICRmb3JtYXQgID0gcGFjayAndionLCB1bnBhY2sgJ24qJywgJGZvcm1hdDsKKyAgICB9CisKKworICAgICMgU3BlY2lhbCBjYXNlIHRvIGhhbmRsZSBFdXJvIHN5bWJvbCwgMHg4MCwgaW4gbm9uLVVuaWNvZGUgc3RyaW5ncy4KKyAgICBpZiAoJGVuY29kaW5nID09IDAgYW5kICRmb3JtYXQgPX4gL1x4ODAvKSB7CisgICAgICAgICRmb3JtYXQgICA9ICBwYWNrICd2KicsIHVucGFjayAnQyonLCAkZm9ybWF0OworICAgICAgICAkZm9ybWF0ICAgPX4gcy9ceDgwXHgwMC9ceEFDXHgyMC9nOworICAgICAgICAkZW5jb2RpbmcgPSAgMTsKKyAgICB9CisKKyAgICAkbGVuZ3RoICAgICAgID0gMHgwNSArIGxlbmd0aCAkZm9ybWF0OworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soInZ2QyIsICRpZm10LCAkY2NoLCAkZW5jb2RpbmcpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEsICRmb3JtYXQpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlXzE5MDQoKQorIworIyBXcml0ZSBFeGNlbCAxOTA0IHJlY29yZCB0byBpbmRpY2F0ZSB0aGUgZGF0ZSBzeXN0ZW0gaW4gdXNlLgorIworc3ViIF9zdG9yZV8xOTA0IHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAwMjI7ICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMDI7ICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmMTkwNCAgICAgPSAkc2VsZi0+e18xOTA0fTsgIyBGbGFnIGZvciAxOTA0IGRhdGUgc3lzdGVtCisKKyAgICBteSAkaGVhZGVyICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soInYiLCAkZjE5MDQpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3N1cGJvb2soKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBTVVBCT09LIHRvIGluZGljYXRlIHRoYXQgdGhlIHdvcmtib29rIGNvbnRhaW5zIGV4dGVybmFsCisjIHJlZmVyZW5jZXMsIGluIG91ciBjYXNlLCBmb3JtdWxhLCBwcmludCBhcmVhIGFuZCBwcmludCB0aXRsZSByZWZzLgorIworc3ViIF9zdG9yZV9zdXBib29rIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMUFFOyAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA0OyAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRjdGFicyAgICAgICA9IEB7JHNlbGYtPntfd29ya3NoZWV0c319OyAgIyBOdW1iZXIgb2Ygd29ya3NoZWV0cworICAgIG15ICRTdFZpcnRQYXRoICA9IDB4MDQwMTsgICAgICAgICAgICAgICAgICAgIyBFbmNvZGVkIHdvcmtib29rIGZpbGVuYW1lCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZ2IiwgJGN0YWJzLCAkU3RWaXJ0UGF0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZXh0ZXJuc2hlZXQoKQorIworIyBXcml0ZXMgdGhlIEV4Y2VsIEJJRkYgRVhURVJOU0hFRVQgcmVjb3JkLiBUaGVzZSByZWZlcmVuY2VzIGFyZSB1c2VkIGJ5CisjIGZvcm11bGFzLiBUT0RPIE5BTUUgcmVjb3JkIGlzIHJlcXVpcmVkIHRvIGRlZmluZSB0aGUgcHJpbnQgYXJlYSBhbmQgdGhlCisjIHJlcGVhdCByb3dzIGFuZCBjb2x1bW5zLgorIworc3ViIF9zdG9yZV9leHRlcm5zaGVldCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxNzsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKworICAgICMgR2V0IHRoZSBleHRlcm5hbCByZWZzCisgICAgbXkgJWV4dF9yZWZzID0gJXskc2VsZi0+e19leHRfcmVmc319OworICAgIG15IEBleHRfcmVmcyA9IHNvcnQgeyRleHRfcmVmc3skYX0gPD0+ICRleHRfcmVmc3skYn19IGtleXMgJWV4dF9yZWZzOworCisgICAgIyBDaGFuZ2UgdGhlIGV4dGVybmFsIHJlZnMgZnJvbSBzdHJpbmdpZmllZCAiMToxIiB0byBbMSwgMV0KKyAgICBmb3JlYWNoIG15ICRyZWYgKEBleHRfcmVmcykgeworICAgICAgICAkcmVmID0gW3NwbGl0IC86LywgJHJlZl07CisgICAgfQorCisKKyAgICBteSAkY3h0aSAgICAgICAgPSBzY2FsYXIgQGV4dF9yZWZzOyAgICAgICAgICMgTnVtYmVyIG9mIEV4Y2VsIFhUSSBzdHJ1Y3R1cmVzCisgICAgbXkgJHJneHRpICAgICAgID0gJyc7ICAgICAgICAgICAgICAgICAgICAgICAjIEFycmF5IG9mIFhUSSBzdHJ1Y3R1cmVzCisKKyAgICAjIFdyaXRlIHRoZSBYVEkgc3RydWN0cworICAgIGZvcmVhY2ggbXkgJGV4dF9yZWYgKEBleHRfcmVmcykgeworICAgICAgICAkcmd4dGkgLj0gcGFjaygidnZ2IiwgMCwgJGV4dF9yZWYtPlswXSwgJGV4dF9yZWYtPlsxXSkKKyAgICB9CisKKworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInYiLCAkY3h0aSkgLiAkcmd4dGk7CisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCBsZW5ndGggJGRhdGEpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX25hbWUoKQorIworIworIyBTdG9yZSB0aGUgTkFNRSByZWNvcmQgdXNlZCBmb3Igc3RvcmluZyB0aGUgcHJpbnQgYXJlYSwgcmVwZWF0IHJvd3MsIHJlcGVhdAorIyBjb2x1bW5zLCBhdXRvZmlsdGVycyBhbmQgZGVmaW5lZCBuYW1lcy4KKyMKKyMgVE9ETy4gVGhpcyBpcyBhIG1vcmUgZ2VuZXJpYyB2ZXJzaW9uIHRoYXQgd2lsbCByZXBsYWNlIF9zdG9yZV9uYW1lX3Nob3J0KCkKKyMgICAgICAgYW5kIF9zdG9yZV9uYW1lX2xvbmcoKS4KKyMKK3N1YiBfc3RvcmVfbmFtZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDE4OyAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkbmFtZSAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGVuY29kaW5nICAgICAgICA9IHNoaWZ0OworICAgIG15ICRzaGVldF9pbmRleCAgICAgPSBzaGlmdDsKKyAgICBteSAkZm9ybXVsYSAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdGV4dF9sZW5ndGggICAgID0gbGVuZ3RoICRuYW1lOworICAgIG15ICRmb3JtdWxhX2xlbmd0aCAgPSBsZW5ndGggJGZvcm11bGE7CisKKyAgICAjIFVURi0xNiBzdHJpbmcgbGVuZ3RoIGlzIGluIGNoYXJhY3RlcnMgbm90IGJ5dGVzLgorICAgICR0ZXh0X2xlbmd0aCAgICAgICAvPSAyIGlmICRlbmNvZGluZzsKKworCisgICAgbXkgJGdyYml0ICAgICAgICAgICA9IDB4MDAwMDsgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkc2hvcnRjdXQgICAgICAgID0gMHgwMDsgICAgICAgICAjIEtleWJvYXJkIHNob3J0Y3V0CisgICAgbXkgJGl4YWxzICAgICAgICAgICA9IDB4MDAwMDsgICAgICAgIyBVbnVzZWQgaW5kZXguCisgICAgbXkgJG1lbnVfbGVuZ3RoICAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgY3VzdCBtZW51IHRleHQKKyAgICBteSAkZGVzY19sZW5ndGggICAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBkZXNjcmlwdGlvbiB0ZXh0CisgICAgbXkgJGhlbHBfbGVuZ3RoICAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgaGVscCB0b3BpYyB0ZXh0CisgICAgbXkgJHN0YXR1c19sZW5ndGggICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2Ygc3RhdHVzIGJhciB0ZXh0CisKKyAgICAjIFNldCBncmJpdCBidWlsdC1pbiBmbGFnIGFuZCB0aGUgaGlkZGVuIGZsYWcgZm9yIGF1dG9maWx0ZXJzLgorICAgIGlmICgkdGV4dF9sZW5ndGggPT0gMSkgeworICAgICAgICAkZ3JiaXQgPSAweDAwMjAgaWYgb3JkICRuYW1lID09IDB4MDY7ICMgUHJpbnQgYXJlYQorICAgICAgICAkZ3JiaXQgPSAweDAwMjAgaWYgb3JkICRuYW1lID09IDB4MDc7ICMgUHJpbnQgdGl0bGVzCisgICAgICAgICRncmJpdCA9IDB4MDAyMSBpZiBvcmQgJG5hbWUgPT0gMHgwRDsgIyBBdXRvZmlsdGVyCisgICAgfQorCisgICAgbXkgJGRhdGEgICAgICAgICAgICA9IHBhY2sgInYiLCAkZ3JiaXQ7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkc2hvcnRjdXQ7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkdGV4dF9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgInYiLCAkZm9ybXVsYV9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgInYiLCAkaXhhbHM7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgInYiLCAkc2hlZXRfaW5kZXg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkbWVudV9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkZGVzY19sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkaGVscF9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkc3RhdHVzX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjayAiQyIsICRlbmNvZGluZzsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gJG5hbWU7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49ICRmb3JtdWxhOworCisgICAgbXkgJGhlYWRlciAgICAgICAgICA9IHBhY2sgInZ2IiwgJHJlY29yZCwgbGVuZ3RoICRkYXRhOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX25hbWVfc2hvcnQoKQorIworIworIyBTdG9yZSB0aGUgTkFNRSByZWNvcmQgaW4gdGhlIHNob3J0IGZvcm1hdCB0aGF0IGlzIHVzZWQgZm9yIHN0b3JpbmcgdGhlIHByaW50CisjIGFyZWEsIHJlcGVhdCByb3dzIG9ubHkgYW5kIHJlcGVhdCBjb2x1bW5zIG9ubHkuCisjCitzdWIgX3N0b3JlX25hbWVfc2hvcnQgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDAxODsgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMWI7ICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGluZGV4ICAgICAgICAgICA9IHNoaWZ0OyAgICAgICAgIyBTaGVldCBpbmRleAorICAgIG15ICR0eXBlICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXh0X3JlZiAgICAgICAgID0gc2hpZnQ7ICAgICAgICAjIFRPRE8KKworICAgIG15ICRncmJpdCAgICAgICAgICAgPSAweDAwMjA7ICAgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJGNoS2V5ICAgICAgICAgICA9IDB4MDA7ICAgICAgICAgIyBLZXlib2FyZCBzaG9ydGN1dAorICAgIG15ICRjY2ggICAgICAgICAgICAgPSAweDAxOyAgICAgICAgICMgTGVuZ3RoIG9mIHRleHQgbmFtZQorICAgIG15ICRjY2UgICAgICAgICAgICAgPSAweDAwMGI7ICAgICAgICMgTGVuZ3RoIG9mIHRleHQgZGVmaW5pdGlvbgorICAgIG15ICR1bmtub3duMDEgICAgICAgPSAweDAwMDA7ICAgICAgICMKKyAgICBteSAkaXhhbHMgICAgICAgICAgID0gJGluZGV4ICsxOyAgICAjIFNoZWV0IGluZGV4CisgICAgbXkgJHVua25vd24wMiAgICAgICA9IDB4MDA7ICAgICAgICAgIworICAgIG15ICRjY2hDdXN0TWVudSAgICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGN1c3QgbWVudSB0ZXh0CisgICAgbXkgJGNjaERlc2NyaXB0aW9uICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgZGVzY3JpcHRpb24gdGV4dAorICAgIG15ICRjY2hIZWxwdG9waWMgICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGhlbHAgdG9waWMgdGV4dAorICAgIG15ICRjY2hTdGF0dXN0ZXh0ICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIHN0YXR1cyBiYXIgdGV4dAorICAgIG15ICRyZ2NoICAgICAgICAgICAgPSAkdHlwZTsgICAgICAgICMgQnVpbHQtaW4gbmFtZSB0eXBlCisgICAgbXkgJHVua25vd24wMyAgICAgICA9IDB4M2I7ICAgICAgICAgIworCisgICAgbXkgJHJvd21pbiAgICAgICAgICA9ICRfWzBdOyAgICAgICAgIyBTdGFydCByb3cKKyAgICBteSAkcm93bWF4ICAgICAgICAgID0gJF9bMV07ICAgICAgICAjIEVuZCByb3cKKyAgICBteSAkY29sbWluICAgICAgICAgID0gJF9bMl07ICAgICAgICAjIFN0YXJ0IGNvbHVtbgorICAgIG15ICRjb2xtYXggICAgICAgICAgPSAkX1szXTsgICAgICAgICMgZW5kIGNvbHVtbgorCisgICAgbXkgJGhpZGRlbiAgICAgICAgICA9ICRfWzRdOyAgICAgICAgIyBOYW1lIGlzIGhpZGRlbgorICAgICRncmJpdCAgICAgICAgICAgICAgPSAweDAwMjEgaWYgJGhpZGRlbjsKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICAgICAgPSBwYWNrKCJ2IiwgICRncmJpdCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNoS2V5KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY2NlKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkdW5rbm93bjAxKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkaXhhbHMpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDIpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2hDdXN0TWVudSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaERlc2NyaXB0aW9uKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoSGVscHRvcGljKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoU3RhdHVzdGV4dCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHJnY2gpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDMpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRleHRfcmVmKTsKKworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRyb3dtaW4pOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRyb3dtYXgpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRjb2xtaW4pOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRjb2xtYXgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX25hbWVfbG9uZygpCisjCisjCisjIFN0b3JlIHRoZSBOQU1FIHJlY29yZCBpbiB0aGUgbG9uZyBmb3JtYXQgdGhhdCBpcyB1c2VkIGZvciBzdG9yaW5nIHRoZSByZXBlYXQKKyMgcm93cyBhbmQgY29sdW1ucyB3aGVuIGJvdGggYXJlIHNwZWNpZmllZC4gVGhpcyBzaGFyZSBhIGxvdCBvZiBjb2RlIHdpdGgKKyMgX3N0b3JlX25hbWVfc2hvcnQoKSBidXQgd2UgdXNlIGEgc2VwYXJhdGUgbWV0aG9kIHRvIGtlZXAgdGhlIGNvZGUgY2xlYW4uCisjIENvZGUgYWJzdHJhY3Rpb24gZm9yIHJldXNlIGNhbiBiZSBjYXJyaWVkIHRvbyBmYXIsIGFuZCBJIHNob3VsZCBrbm93LiA7LSkKKyMKK3N1YiBfc3RvcmVfbmFtZV9sb25nIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwMTg7ICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDJhOyAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRpbmRleCAgICAgICAgICAgPSBzaGlmdDsgICAgICAgICMgU2hlZXQgaW5kZXgKKyAgICBteSAkdHlwZSAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGV4dF9yZWYgICAgICAgICA9IHNoaWZ0OyAgICAgICAgIyBUT0RPCisKKyAgICBteSAkZ3JiaXQgICAgICAgICAgID0gMHgwMDIwOyAgICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRjaEtleSAgICAgICAgICAgPSAweDAwOyAgICAgICAgICMgS2V5Ym9hcmQgc2hvcnRjdXQKKyAgICBteSAkY2NoICAgICAgICAgICAgID0gMHgwMTsgICAgICAgICAjIExlbmd0aCBvZiB0ZXh0IG5hbWUKKyAgICBteSAkY2NlICAgICAgICAgICAgID0gMHgwMDFhOyAgICAgICAjIExlbmd0aCBvZiB0ZXh0IGRlZmluaXRpb24KKyAgICBteSAkdW5rbm93bjAxICAgICAgID0gMHgwMDAwOyAgICAgICAjCisgICAgbXkgJGl4YWxzICAgICAgICAgICA9ICRpbmRleCArMTsgICAgIyBTaGVldCBpbmRleAorICAgIG15ICR1bmtub3duMDIgICAgICAgPSAweDAwOyAgICAgICAgICMKKyAgICBteSAkY2NoQ3VzdE1lbnUgICAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBjdXN0IG1lbnUgdGV4dAorICAgIG15ICRjY2hEZXNjcmlwdGlvbiAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGRlc2NyaXB0aW9uIHRleHQKKyAgICBteSAkY2NoSGVscHRvcGljICAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBoZWxwIHRvcGljIHRleHQKKyAgICBteSAkY2NoU3RhdHVzdGV4dCAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBzdGF0dXMgYmFyIHRleHQKKyAgICBteSAkcmdjaCAgICAgICAgICAgID0gJHR5cGU7ICAgICAgICAjIEJ1aWx0LWluIG5hbWUgdHlwZQorCisgICAgbXkgJHVua25vd24wMyAgICAgICA9IDB4Mjk7CisgICAgbXkgJHVua25vd24wNCAgICAgICA9IDB4MDAxNzsKKyAgICBteSAkdW5rbm93bjA1ICAgICAgID0gMHgzYjsKKworICAgIG15ICRyb3dtaW4gICAgICAgICAgPSAkX1swXTsgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJHJvd21heCAgICAgICAgICA9ICRfWzFdOyAgICAgICAgIyBFbmQgcm93CisgICAgbXkgJGNvbG1pbiAgICAgICAgICA9ICRfWzJdOyAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkY29sbWF4ICAgICAgICAgID0gJF9bM107ICAgICAgICAjIGVuZCBjb2x1bW4KKworCisgICAgbXkgJGhlYWRlciAgICAgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgICAgICA9IHBhY2soInYiLCAgJGdyYml0KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2hLZXkpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2gpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRjY2UpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICR1bmtub3duMDEpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRpeGFscyk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHVua25vd24wMik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaEN1c3RNZW51KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoRGVzY3JpcHRpb24pOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2hIZWxwdG9waWMpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2hTdGF0dXN0ZXh0KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkcmdjaCk7CisKKyAgICAjIENvbHVtbiBkZWZpbml0aW9uCisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHVua25vd24wMyk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJHVua25vd24wNCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHVua25vd24wNSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGV4dF9yZWYpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgIDB4MDAwMCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgMHhmZmZmKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY29sbWluKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY29sbWF4KTsKKworICAgICMgUm93IGRlZmluaXRpb24KKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkdW5rbm93bjA1KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkZXh0X3JlZik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJHJvd21pbik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJHJvd21heCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgMHgwMCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgMHhmZik7CisgICAgIyBFbmQgb2YgZGF0YQorICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgIDB4MTApOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3BhbGV0dGUoKQorIworIyBTdG9yZXMgdGhlIFBBTEVUVEUgYmlmZiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3BhbGV0dGUgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJGFyZWYgICAgICAgICAgICA9ICRzZWxmLT57X3BhbGV0dGV9OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDA5MjsgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMiArIDQgKiBAJGFyZWY7ICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJGNjdiAgICAgICAgICAgICA9ICAgICAgICAgQCRhcmVmOyAgICMgTnVtYmVyIG9mIFJHQiB2YWx1ZXMgdG8gZm9sbG93CisgICAgbXkgJGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIFJHQiBkYXRhCisKKyAgICAjIFBhY2sgdGhlIFJHQiBkYXRhCisgICAgJGRhdGEgLj0gcGFjayAiQ0NDQyIsIEAkXyBmb3IgQCRhcmVmOworCisgICAgbXkgJGhlYWRlciA9IHBhY2soInZ2diIsICAkcmVjb3JkLCAkbGVuZ3RoLCAkY2N2KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jb2RlcGFnZSgpCisjCisjIFN0b3JlcyB0aGUgQ09ERVBBR0UgYmlmZiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NvZGVwYWdlIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwNDI7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJGN2ICAgICAgICAgICAgICA9ICRzZWxmLT57X2NvZGVwYWdlfTsgICAjIFRoZSBjb2RlIHBhZ2UKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICAgICAgPSBwYWNrKCJ2IiwgICRjdik7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY291bnRyeSgpCisjCisjIFN0b3JlcyB0aGUgQ09VTlRSWSBiaWZmIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY291bnRyeSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDhDOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDA0OyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRjb3VudHJ5X2RlZmF1bHQgPSAkc2VsZi0+e19jb3VudHJ5fTsKKyAgICBteSAkY291bnRyeV93aW5faW5pID0gJHNlbGYtPntfY291bnRyeX07CisKKyAgICBteSAkaGVhZGVyICAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjaygidnYiLCAkY291bnRyeV9kZWZhdWx0LCAkY291bnRyeV93aW5faW5pKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9oaWRlb2JqKCkKKyMKKyMgU3RvcmVzIHRoZSBISURFT0JKIGJpZmYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9oaWRlb2JqIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwOEQ7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJGhpZGUgICAgICAgICAgICA9ICRzZWxmLT57X2hpZGVvYmp9OyAgICAjIE9wdGlvbiB0byBoaWRlIG9iamVjdHMKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICAgICAgPSBwYWNrKCJ2IiwgICRoaWRlKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jYWxjdWxhdGVfZXh0ZXJuX3NpemVzKCkKKyMKKyMgV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHNwYWNlIHJlcXVpcmVkIGJ5IHRoZSBTVVBCT09LLCBFWFRFUk5TSEVFVCBhbmQgTkFNRQorIyByZWNvcmRzIHNvIHRoYXQgaXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBCT1VORFNIRUVUIG9mZnNldHMuCisjCitzdWIgX2NhbGN1bGF0ZV9leHRlcm5fc2l6ZXMgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworCisKKyAgICBteSAlZXh0X3JlZnMgICAgICAgID0gJHNlbGYtPntfcGFyc2VyfS0+Z2V0X2V4dF9zaGVldHMoKTsKKyAgICBteSAkZXh0X3JlZl9jb3VudCAgID0gc2NhbGFyIGtleXMgJWV4dF9yZWZzOworICAgIG15ICRsZW5ndGggICAgICAgICAgPSAwOworICAgIG15ICRpbmRleCAgICAgICAgICAgPSAwOworCisKKyAgICBpZiAoQHskc2VsZi0+e19kZWZpbmVkX25hbWVzfX0pIHsKKyAgICAgICAgbXkgJGluZGV4ICAgPSAwOworICAgICAgICBteSAka2V5ICAgICA9ICIkaW5kZXg6JGluZGV4IjsKKworICAgICAgICBpZiAobm90IGV4aXN0cyAkZXh0X3JlZnN7JGtleX0pIHsKKyAgICAgICAgICAgICRleHRfcmVmc3ska2V5fSA9ICRleHRfcmVmX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgbXkgJGRlZmluZWRfbmFtZSAoQHskc2VsZi0+e19kZWZpbmVkX25hbWVzfX0pIHsKKyAgICAgICAgJGxlbmd0aCArPSAxOQorICAgICAgICAgICAgICAgICAgICsgbGVuZ3RoKCRkZWZpbmVkX25hbWUtPntuYW1lfSkKKyAgICAgICAgICAgICAgICAgICArIGxlbmd0aCgkZGVmaW5lZF9uYW1lLT57Zm9ybXVsYX0pOworICAgIH0KKworCisgICAgZm9yZWFjaCBteSAkd29ya3NoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworCisgICAgICAgIG15ICRyb3dtaW4gICAgICA9ICR3b3Jrc2hlZXQtPntfdGl0bGVfcm93bWlufTsKKyAgICAgICAgbXkgJGNvbG1pbiAgICAgID0gJHdvcmtzaGVldC0+e190aXRsZV9jb2xtaW59OworICAgICAgICBteSAkZmlsdGVyICAgICAgPSAkd29ya3NoZWV0LT57X2ZpbHRlcl9jb3VudH07CisgICAgICAgIG15ICRrZXkgICAgICAgICA9ICIkaW5kZXg6JGluZGV4IjsKKyAgICAgICAgJGluZGV4Kys7CisKKworICAgICAgICAjIEFkZCBhcmVhIE5BTUUgcmVjb3JkcworICAgICAgICAjCisgICAgICAgIGlmIChkZWZpbmVkICR3b3Jrc2hlZXQtPntfcHJpbnRfcm93bWlufSkgeworICAgICAgICAgICAgJGV4dF9yZWZzeyRrZXl9ID0gJGV4dF9yZWZfY291bnQrKyBpZiBub3QgZXhpc3RzICRleHRfcmVmc3ska2V5fTsKKworICAgICAgICAgICAgJGxlbmd0aCArPSAzMSA7CisgICAgICAgIH0KKworCisgICAgICAgICMgQWRkIHRpdGxlICBOQU1FIHJlY29yZHMKKyAgICAgICAgIworICAgICAgICBpZiAoZGVmaW5lZCAkcm93bWluIGFuZCBkZWZpbmVkICRjb2xtaW4pIHsKKyAgICAgICAgICAgICRleHRfcmVmc3ska2V5fSA9ICRleHRfcmVmX2NvdW50KysgaWYgbm90IGV4aXN0cyAkZXh0X3JlZnN7JGtleX07CisKKyAgICAgICAgICAgICRsZW5ndGggKz0gNDY7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKGRlZmluZWQgJHJvd21pbiBvciBkZWZpbmVkICRjb2xtaW4pIHsKKyAgICAgICAgICAgICRleHRfcmVmc3ska2V5fSA9ICRleHRfcmVmX2NvdW50KysgaWYgbm90IGV4aXN0cyAkZXh0X3JlZnN7JGtleX07CisKKyAgICAgICAgICAgICRsZW5ndGggKz0gMzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFRPRE8sIG1heSBuZWVkIHRoaXMgbGF0ZXIuCisgICAgICAgIH0KKworCisgICAgICAgICMgQWRkIEF1dG9maWx0ZXIgIE5BTUUgcmVjb3JkcworICAgICAgICAjCisgICAgICAgIGlmICgkZmlsdGVyKSB7CisgICAgICAgICAgICAkZXh0X3JlZnN7JGtleX0gPSAkZXh0X3JlZl9jb3VudCsrIGlmIG5vdCBleGlzdHMgJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICAgICAkbGVuZ3RoICs9IDMxOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjIFVwZGF0ZSB0aGUgcmVmIGNvdW50cy4KKyAgICAkc2VsZi0+e19leHRfcmVmX2NvdW50fSA9ICRleHRfcmVmX2NvdW50OworICAgICRzZWxmLT57X2V4dF9yZWZzfSAgICAgID0geyVleHRfcmVmc307CisKKworICAgICMgSWYgdGhlcmUgYXJlIG5vIGV4dGVybmFsIHJlZnMgdGhlbiB3ZSBkb24ndCB3cml0ZSwgU1VQQk9PSywgRVhURVJOU0hFRVQKKyAgICAjIGFuZCBOQU1FLiBUaGVyZWZvcmUgdGhlIGxlbmd0aCBpcyAwLgorCisgICAgcmV0dXJuICRsZW5ndGggPSAwIGlmICRleHRfcmVmX2NvdW50ID09IDA7CisKKworICAgICMgVGhlIFNVUEJPT0sgcmVjb3JkIGlzIDggYnl0ZXMKKyAgICAkbGVuZ3RoICs9IDg7CisKKyAgICAjIFRoZSBFWFRFUk5TSEVFVCByZWNvcmQgaXMgNiBieXRlcyArIDYgYnl0ZXMgZm9yIGVhY2ggZXh0ZXJuYWwgcmVmCisgICAgJGxlbmd0aCArPSA2ICogKDEgKyAkZXh0X3JlZl9jb3VudCk7CisKKyAgICByZXR1cm4gJGxlbmd0aDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jYWxjdWxhdGVfc2hhcmVkX3N0cmluZ19zaXplcygpCisjCisjIEhhbmRsaW5nIG9mIHRoZSBTU1QgY29udGludWUgYmxvY2tzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBuZWVkIHRvIGluY2x1ZGUgYW4KKyMgYWRkaXRpb25hbCBjb250aW51YXRpb24gYnl0ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc3RyaW5nIGlzIHNwbGl0IGJldHdlZW4KKyMgYmxvY2tzIG9yIHdoZXRoZXIgaXQgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLiAoVGhlcmUgYXJlIGFsc28KKyMgYWRkaXRpb25hbCBjb21wbGljYXRpb25zIHRoYXQgd2lsbCBhcmlzZSBsYXRlciB3aGVuL2lmIFJpY2ggU3RyaW5ncyBhcmUKKyMgc3VwcG9ydGVkKS4gQXMgc3VjaCB3ZSBjYW5ub3QgdXNlIHRoZSBzaW1wbGUgQ09OVElOVUUgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5CisjIHRoZSBfYWRkX2NvbnRpbnVlKCkgbWV0aG9kIGluIEJJRkZ3cml0ZXIucG0uIFRodXMgd2UgaGF2ZSB0byBtYWtlIHR3byBwYXNzZXMKKyMgdGhyb3VnaCB0aGUgc3RyaW5ncyBkYXRhLiBUaGUgZmlyc3QgaXMgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBibG9jayBzaXplcworIyBhbmQgdGhlIHNlY29uZCwgaW4gX3N0b3JlX3NoYXJlZF9zdHJpbmdzKCksIGlzIHRvIHdyaXRlIHRoZSBhY3R1YWwgc3RyaW5ncy4KKyMgVGhlIGZpcnN0IHBhc3MgdGhyb3VnaCB0aGUgZGF0YSBpcyBhbHNvIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBTU1QKKyMgYW5kIENPTlRJTlVFIHJlY29yZHMgZm9yIHVzZSBpbiBzZXR0aW5nIHRoZSBCT1VORFNIRUVUIHJlY29yZCBvZmZzZXRzLiBUaGUKKyMgZG93bnNpZGUgb2YgdGhpcyBpcyB0aGF0IHRoZSBzYW1lIGFsZ29yaXRobSByZXBlYXRlZCBpbiBfc3RvcmVfc2hhcmVkX3N0cmluZ3MuCisjCitzdWIgX2NhbGN1bGF0ZV9zaGFyZWRfc3RyaW5nX3NpemVzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSBAc3RyaW5nczsKKyAgICAkI3N0cmluZ3MgPSAkc2VsZi0+e19zdHJfdW5pcXVlfSAtMTsgIyBQcmUtZXh0ZW5kIGFycmF5CisKKyAgICB3aGlsZSAobXkgJGtleSA9IGVhY2ggJXskc2VsZi0+e19zdHJfdGFibGV9fSkgeworICAgICAgICAkc3RyaW5nc1skc2VsZi0+e19zdHJfdGFibGV9LT57JGtleX1dID0gJGtleTsKKyAgICB9CisKKyAgICAjIFRoZSBTU1QgZGF0YSBjb3VsZCBiZSB2ZXJ5IGxhcmdlLCBmcmVlIHNvbWUgbWVtb3J5IChtYXliZSkuCisgICAgJHNlbGYtPntfc3RyX3RhYmxlfSA9IHVuZGVmOworICAgICRzZWxmLT57X3N0cl9hcnJheX0gPSBbQHN0cmluZ3NdOworCisKKyAgICAjIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3RyaW5ncyB0byBjYWxjdWxhdGUgdGhlIENPTlRJTlVFIGJsb2NrIHNpemVzLgorICAgICMKKyAgICAjIFRoZSBTU1QgYmxvY2tzIHJlcXVpcmVzIGEgc3BlY2lhbGlzZWQgQ09OVElOVUUgYmxvY2ssIHNvIHdlIGhhdmUgdG8KKyAgICAjIGVuc3VyZSB0aGF0IHRoZSBtYXhpbXVtIGRhdGEgYmxvY2sgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGxpbWl0IHVzZWQgYnkKKyAgICAjIF9hZGRfY29udGludWUoKSBpbiBCSUZGd3JpdGVyLnBtLiBGb3Igc2ltcGxpY2l0eSB3ZSB1c2UgdGhlIHNhbWUgc2l6ZQorICAgICMgZm9yIHRoZSBTU1QgYW5kIENPTlRJTlVFIHJlY29yZHM6CisgICAgIyAgIDgyMjggOiBNYXhpbXVtIEV4Y2VsOTcgYmxvY2sgc2l6ZQorICAgICMgICAgIC00IDogTGVuZ3RoIG9mIGJsb2NrIGhlYWRlcgorICAgICMgICAgIC04IDogTGVuZ3RoIG9mIGFkZGl0aW9uYWwgU1NUIGhlYWRlciBpbmZvcm1hdGlvbgorICAgICMgICAgIC04IDogQXJiaXRyYXJ5IG51bWJlciB0byBrZWVwIHdpdGhpbiBfYWRkX2NvbnRpbnVlKCkgbGltaXQKKyAgICAjID0gODIwOAorICAgICMKKyAgICBteSAkY29udGludWVfbGltaXQgPSA4MjA4OworICAgIG15ICRibG9ja19sZW5ndGggICA9IDA7CisgICAgbXkgJHdyaXR0ZW4gICAgICAgID0gMDsKKyAgICBteSBAYmxvY2tfc2l6ZXM7CisgICAgbXkgJGNvbnRpbnVlICAgICAgID0gMDsKKworICAgIGZvciBteSAkc3RyaW5nIChAc3RyaW5ncykgeworCisgICAgICAgIG15ICRzdHJpbmdfbGVuZ3RoID0gbGVuZ3RoICRzdHJpbmc7CisgICAgICAgIG15ICRlbmNvZGluZyAgICAgID0gdW5wYWNrICJ4eCBDIiwgJHN0cmluZzsKKyAgICAgICAgbXkgJHNwbGl0X3N0cmluZyAgPSAwOworCisKKyAgICAgICAgIyBCbG9jayBsZW5ndGggaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyB0aGF0IHdpbGwgYmUKKyAgICAgICAgIyB3cml0dGVuIG91dCBpbiBhIHNpbmdsZSBTU1Qgb3IgQ09OVElOVUUgYmxvY2suCisgICAgICAgICMKKyAgICAgICAgJGJsb2NrX2xlbmd0aCArPSAkc3RyaW5nX2xlbmd0aDsKKworCisgICAgICAgICMgV2UgY2FuIHdyaXRlIHRoZSBzdHJpbmcgaWYgaXQgZG9lc24ndCBjcm9zcyBhIENPTlRJTlVFIGJvdW5kYXJ5CisgICAgICAgIGlmICgkYmxvY2tfbGVuZ3RoIDwgJGNvbnRpbnVlX2xpbWl0KSB7CisgICAgICAgICAgICAkd3JpdHRlbiArPSAkc3RyaW5nX2xlbmd0aDsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworCisgICAgICAgICMgRGVhbCB3aXRoIHRoZSBjYXNlcyB3aGVyZSB0aGUgbmV4dCBzdHJpbmcgdG8gYmUgd3JpdHRlbiB3aWxsIGV4Y2VlZAorICAgICAgICAjIHRoZSBDT05USU5VRSBib3VuZGFyeS4gSWYgdGhlIHN0cmluZyBpcyB2ZXJ5IGxvbmcgaXQgbWF5IG5lZWQgdG8gYmUKKyAgICAgICAgIyB3cml0dGVuIGluIG1vcmUgdGhhbiBvbmUgQ09OVElOVUUgcmVjb3JkLgorICAgICAgICAjCisgICAgICAgIHdoaWxlICgkYmxvY2tfbGVuZ3RoID49ICRjb250aW51ZV9saW1pdCkgeworCisgICAgICAgICAgICAjIFdlIG5lZWQgdG8gYXZvaWQgdGhlIGNhc2Ugd2hlcmUgYSBzdHJpbmcgaXMgY29udGludWVkIGluIHRoZSBmaXJzdAorICAgICAgICAgICAgIyBuIGJ5dGVzIHRoYXQgY29udGFpbiB0aGUgc3RyaW5nIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIG15ICRoZWFkZXJfbGVuZ3RoICAgPSAzOyAjIE1pbiBzdHJpbmcgKyBoZWFkZXIgc2l6ZSAtMQorICAgICAgICAgICAgbXkgJHNwYWNlX3JlbWFpbmluZyA9ICRjb250aW51ZV9saW1pdCAtJHdyaXR0ZW4gLSRjb250aW51ZTsKKworCisgICAgICAgICAgICAjIFVuaWNvZGUgZGF0YSBzaG91bGQgb25seSBiZSBzcGxpdCBvbiBjaGFyICgyIGJ5dGUpIGJvdW5kYXJpZXMuCisgICAgICAgICAgICAjIFRoZXJlZm9yZSwgaW4gc29tZSBjYXNlcyB3ZSBuZWVkIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZQorICAgICAgICAgICAgIyBzcGFjZSBieSAxIGJ5dGUgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IGFsaWdubWVudC4KKyAgICAgICAgICAgIG15ICRhbGlnbiA9IDA7CisKKyAgICAgICAgICAgICMgT25seSBhcHBsaWVzIHRvIFVuaWNvZGUgc3RyaW5ncworICAgICAgICAgICAgaWYgKCRlbmNvZGluZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgIyBNaW4gc3RyaW5nICsgaGVhZGVyIHNpemUgLTEKKyAgICAgICAgICAgICAgICAkaGVhZGVyX2xlbmd0aCA9IDQ7CisKKyAgICAgICAgICAgICAgICBpZiAoJHNwYWNlX3JlbWFpbmluZyA+ICRoZWFkZXJfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICMgU3RyaW5nIGNvbnRhaW5zIDMgYnl0ZSBoZWFkZXIgPT4gc3BsaXQgb24gb2RkIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChub3QgJHNwbGl0X3N0cmluZyBhbmQgJHNwYWNlX3JlbWFpbmluZyAlIDIgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNwYWNlX3JlbWFpbmluZy0tOworICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWduID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjIFNwbGl0IHNlY3Rpb24gd2l0aG91dCBoZWFkZXIgPT4gc3BsaXQgb24gZXZlbiBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICBlbHNpZiAoJHNwbGl0X3N0cmluZyBhbmQgJHNwYWNlX3JlbWFpbmluZyAlIDIgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNwYWNlX3JlbWFpbmluZy0tOworICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWduID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICRzcGxpdF9zdHJpbmcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoJHNwYWNlX3JlbWFpbmluZyA+ICRoZWFkZXJfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgIyBXcml0ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIG9mIHRoZSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgICAgICAkd3JpdHRlbiAgICAgICs9ICRzcGFjZV9yZW1haW5pbmc7CisKKyAgICAgICAgICAgICAgICAjIFJlZHVjZSB0aGUgY3VycmVudCBibG9jayBsZW5ndGggYnkgdGhlIGFtb3VudCB3cml0dGVuCisgICAgICAgICAgICAgICAgJGJsb2NrX2xlbmd0aCAtPSAkY29udGludWVfbGltaXQgLSRjb250aW51ZSAtJGFsaWduOworCisgICAgICAgICAgICAgICAgIyBTdG9yZSB0aGUgbWF4IHNpemUgZm9yIHRoaXMgYmxvY2sKKyAgICAgICAgICAgICAgICBwdXNoIEBibG9ja19zaXplcywgJGNvbnRpbnVlX2xpbWl0IC0kYWxpZ247CisKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBjdXJyZW50IHN0cmluZyB3YXMgc3BsaXQgdGhlbiB0aGUgbmV4dCBDT05USU5VRSBibG9jaworICAgICAgICAgICAgICAgICMgc2hvdWxkIGhhdmUgdGhlIHN0cmluZyBjb250aW51ZSBmbGFnIChncmJpdCkgc2V0IHVubGVzcyB0aGUKKyAgICAgICAgICAgICAgICAjIHNwbGl0IHN0cmluZyBmaXRzIGV4YWN0bHkgaW50byB0aGUgcmVtYWluaW5nIHNwYWNlLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJGNvbnRpbnVlID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIFN0b3JlIHRoZSBtYXggc2l6ZSBmb3IgdGhpcyBibG9jaworICAgICAgICAgICAgICAgIHB1c2ggQGJsb2NrX3NpemVzLCAkd3JpdHRlbiArJGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgIyBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0YXJ0IHRoZSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgICAgICAkYmxvY2tfbGVuZ3RoIC09ICRjb250aW51ZV9saW1pdCAtJHNwYWNlX3JlbWFpbmluZyAtJGNvbnRpbnVlOworICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBJZiB0aGUgc3RyaW5nIChvciBzdWJzdHIpIGlzIHNtYWxsIGVub3VnaCB3ZSBjYW4gd3JpdGUgaXQgaW4gdGhlCisgICAgICAgICAgICAjIG5ldyBDT05USU5VRSBibG9jay4gRWxzZSwgZ28gdGhyb3VnaCB0aGUgbG9vcCBhZ2FpbiB0byB3cml0ZSBpdCBpbgorICAgICAgICAgICAgIyBvbmUgb3IgbW9yZSBDT05USU5VRSBibG9ja3MKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGlmICgkYmxvY2tfbGVuZ3RoIDwgJGNvbnRpbnVlX2xpbWl0KSB7CisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSAkYmxvY2tfbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgIyBTdG9yZSB0aGUgbWF4IHNpemUgZm9yIHRoZSBsYXN0IGJsb2NrIHVubGVzcyBpdCBpcyBlbXB0eQorICAgIHB1c2ggQGJsb2NrX3NpemVzLCAkd3JpdHRlbiArJGNvbnRpbnVlIGlmICR3cml0dGVuICskY29udGludWU7CisKKworICAgICRzZWxmLT57X3N0cl9ibG9ja19zaXplc30gPSBbQGJsb2NrX3NpemVzXTsKKworCisgICAgIyBDYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgU1NUIGFuZCBhc3NvY2lhdGVkIENPTlRJTlVFcyAoaWYgYW55KS4KKyAgICAjIFRoZSBTU1QgcmVjb3JkIHdpbGwgaGF2ZSBhIGxlbmd0aCBldmVuIGlmIGl0IGNvbnRhaW5zIG5vIHN0cmluZ3MuCisgICAgIyBUaGlzIGxlbmd0aCBpcyByZXF1aXJlZCB0byBzZXQgdGhlIG9mZnNldHMgaW4gdGhlIEJPVU5EU0hFRVQgcmVjb3JkcyBzaW5jZQorICAgICMgdGhleSBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBTU1QgcmVjb3JkcworICAgICMKKyAgICBteSAkbGVuZ3RoICA9IDEyOworICAgICRsZW5ndGggICAgKz0gICAgIHNoaWZ0IEBibG9ja19zaXplcyBpZiAgICBAYmxvY2tfc2l6ZXM7ICMgU1NUCisgICAgJGxlbmd0aCAgICArPSA0ICsgc2hpZnQgQGJsb2NrX3NpemVzIHdoaWxlIEBibG9ja19zaXplczsgIyBDT05USU5VRXMKKworICAgIHJldHVybiAkbGVuZ3RoOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NoYXJlZF9zdHJpbmdzKCkKKyMKKyMgV3JpdGUgYWxsIG9mIHRoZSB3b3JrYm9va3Mgc3RyaW5ncyBpbnRvIGFuIGluZGV4ZWQgYXJyYXkuCisjCisjIFNlZSB0aGUgY29tbWVudHMgaW4gX2NhbGN1bGF0ZV9zaGFyZWRfc3RyaW5nX3NpemVzKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCisjIFdlIGFsc28gdXNlIHRoaXMgcm91dGluZSB0byByZWNvcmQgdGhlIG9mZnNldHMgcmVxdWlyZWQgYnkgdGhlIEVYVFNTVCB0YWJsZS4KKyMgSW4gb3JkZXIgdG8gZG8gdGhpcyB3ZSBmaXJzdCBpZGVudGlmeSB0aGUgZmlyc3Qgc3RyaW5nIGluIGFuIEVYVFNTVCBidWNrZXQKKyMgYW5kIHRoZW4gc3RvcmUgaXRzIGdsb2JhbCBhbmQgbG9jYWwgb2Zmc2V0IHdpdGhpbiB0aGUgU1NUIHRhYmxlLiBUaGUgb2Zmc2V0CisjIG9jY3VycyB3aGVyZXZlciB0aGUgc3RhcnQgb2YgdGhlIGJ1Y2tldCBzdHJpbmcgaXMgd3JpdHRlbiBvdXQgdmlhIGFwcGVuZCgpLgorIworc3ViIF9zdG9yZV9zaGFyZWRfc3RyaW5ncyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgQHN0cmluZ3MgPSBAeyRzZWxmLT57X3N0cl9hcnJheX19OworCisKKyAgICBteSAkcmVjb3JkICAgICAgICAgICAgICA9IDB4MDBGQzsgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICAgICAgPSAweDAwMDg7ICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJHRvdGFsICAgICAgICAgICAgICAgPSAweDAwMDA7CisKKyAgICAjIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3RyaW5ncyB0byBjYWxjdWxhdGUgdGhlIENPTlRJTlVFIGJsb2NrIHNpemVzCisgICAgbXkgJGNvbnRpbnVlX2xpbWl0ID0gODIwODsKKyAgICBteSAkYmxvY2tfbGVuZ3RoICAgPSAwOworICAgIG15ICR3cml0dGVuICAgICAgICA9IDA7CisgICAgbXkgJGNvbnRpbnVlICAgICAgID0gMDsKKworICAgICMgVGhlIFNTVCBhbmQgQ09OVElOVUUgYmxvY2sgc2l6ZXMgaGF2ZSBiZWVuIHByZS1jYWxjdWxhdGVkIGJ5CisgICAgIyBfY2FsY3VsYXRlX3NoYXJlZF9zdHJpbmdfc2l6ZXMoKQorICAgIG15IEBibG9ja19zaXplcyAgICA9IEB7JHNlbGYtPntfc3RyX2Jsb2NrX3NpemVzfX07CisKKworICAgICMgVGhlIFNTVCByZWNvcmQgaXMgcmVxdWlyZWQgZXZlbiBpZiBpdCBjb250YWlucyBubyBzdHJpbmdzLiBUaHVzIHdlIHdpbGwKKyAgICAjIGFsd2F5cyBoYXZlIGEgbGVuZ3RoCisgICAgIworICAgIGlmIChAYmxvY2tfc2l6ZXMpIHsKKyAgICAgICAgJGxlbmd0aCA9IDggKyBzaGlmdCBAYmxvY2tfc2l6ZXM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAjIE5vIHN0cmluZ3MKKyAgICAgICAgJGxlbmd0aCA9IDg7CisgICAgfQorCisKKyAgICAjIEluaXRpYWxpc2UgdmFyaWFibGVzIHVzZWQgdG8gdHJhY2sgRVhUU1NUIGJ1Y2tldCBvZmZzZXRzLgorICAgIG15ICRleHRzc3Rfc3RyX251bSAgPSAtMTsKKyAgICBteSAkc3N0X2Jsb2NrX3N0YXJ0ID0gJHNlbGYtPntfZGF0YXNpemV9OworCisKKyAgICAjIFdyaXRlIHRoZSBTU1QgYmxvY2sgaGVhZGVyIGluZm9ybWF0aW9uCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJWViIsICRzZWxmLT57X3N0cl90b3RhbH0sICRzZWxmLT57X3N0cl91bmlxdWV9KTsKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKworICAgICMgSXRlcmF0ZSB0aHJvdWdoIHRoZSBzdHJpbmdzIGFuZCB3cml0ZSB0aGVtIG91dAorICAgIGZvciBteSAkc3RyaW5nIChAc3RyaW5ncykgeworCisgICAgICAgIG15ICRzdHJpbmdfbGVuZ3RoID0gbGVuZ3RoICRzdHJpbmc7CisgICAgICAgIG15ICRlbmNvZGluZyAgICAgID0gdW5wYWNrICJ4eCBDIiwgJHN0cmluZzsKKyAgICAgICAgbXkgJHNwbGl0X3N0cmluZyAgPSAwOworICAgICAgICBteSAkYnVja2V0X3N0cmluZyA9IDA7ICMgVXNlZCB0byB0cmFjayBFWFRTU1QgYnVja2V0IG9mZnNldHMuCisKKworICAgICAgICAjIENoZWNrIGlmIHRoZSBzdHJpbmcgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgRVhUU1NUIGJ1Y2tldC4KKyAgICAgICAgaWYgKCsrJGV4dHNzdF9zdHJfbnVtICUgJHNlbGYtPntfZXh0c3N0X2J1Y2tldF9zaXplfSA9PSAwKSB7CisgICAgICAgICAgICAkYnVja2V0X3N0cmluZyA9IDE7CisgICAgICAgIH0KKworCisgICAgICAgICMgQmxvY2sgbGVuZ3RoIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHN0cmluZ3MgdGhhdCB3aWxsIGJlCisgICAgICAgICMgd3JpdHRlbiBvdXQgaW4gYSBzaW5nbGUgU1NUIG9yIENPTlRJTlVFIGJsb2NrLgorICAgICAgICAjCisgICAgICAgICRibG9ja19sZW5ndGggKz0gJHN0cmluZ19sZW5ndGg7CisKKworICAgICAgICAjIFdlIGNhbiB3cml0ZSB0aGUgc3RyaW5nIGlmIGl0IGRvZXNuJ3QgY3Jvc3MgYSBDT05USU5VRSBib3VuZGFyeQorICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA8ICRjb250aW51ZV9saW1pdCkgeworCisgICAgICAgICAgICAjIFN0b3JlIGxvY2F0aW9uIG9mIEVYVFNTVCBidWNrZXQgc3RyaW5nLgorICAgICAgICAgICAgaWYgKCRidWNrZXRfc3RyaW5nKSB7CisgICAgICAgICAgICAgICAgbXkgJGdsb2JhbF9vZmZzZXQgICA9ICRzZWxmLT57X2RhdGFzaXplfTsKKyAgICAgICAgICAgICAgICBteSAkbG9jYWxfb2Zmc2V0ICAgID0gJHNlbGYtPntfZGF0YXNpemV9IC0gJHNzdF9ibG9ja19zdGFydDsKKworICAgICAgICAgICAgICAgIHB1c2ggQHskc2VsZi0+e19leHRzc3Rfb2Zmc2V0c319LCBbJGdsb2JhbF9vZmZzZXQsICRsb2NhbF9vZmZzZXRdOworICAgICAgICAgICAgICAgICRidWNrZXRfc3RyaW5nID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJHN0cmluZyk7CisgICAgICAgICAgICAkd3JpdHRlbiArPSAkc3RyaW5nX2xlbmd0aDsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworCisgICAgICAgICMgRGVhbCB3aXRoIHRoZSBjYXNlcyB3aGVyZSB0aGUgbmV4dCBzdHJpbmcgdG8gYmUgd3JpdHRlbiB3aWxsIGV4Y2VlZAorICAgICAgICAjIHRoZSBDT05USU5VRSBib3VuZGFyeS4gSWYgdGhlIHN0cmluZyBpcyB2ZXJ5IGxvbmcgaXQgbWF5IG5lZWQgdG8gYmUKKyAgICAgICAgIyB3cml0dGVuIGluIG1vcmUgdGhhbiBvbmUgQ09OVElOVUUgcmVjb3JkLgorICAgICAgICAjCisgICAgICAgIHdoaWxlICgkYmxvY2tfbGVuZ3RoID49ICRjb250aW51ZV9saW1pdCkgeworCisgICAgICAgICAgICAjIFdlIG5lZWQgdG8gYXZvaWQgdGhlIGNhc2Ugd2hlcmUgYSBzdHJpbmcgaXMgY29udGludWVkIGluIHRoZSBmaXJzdAorICAgICAgICAgICAgIyBuIGJ5dGVzIHRoYXQgY29udGFpbiB0aGUgc3RyaW5nIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIG15ICRoZWFkZXJfbGVuZ3RoICAgPSAzOyAjIE1pbiBzdHJpbmcgKyBoZWFkZXIgc2l6ZSAtMQorICAgICAgICAgICAgbXkgJHNwYWNlX3JlbWFpbmluZyA9ICRjb250aW51ZV9saW1pdCAtJHdyaXR0ZW4gLSRjb250aW51ZTsKKworCisgICAgICAgICAgICAjIFVuaWNvZGUgZGF0YSBzaG91bGQgb25seSBiZSBzcGxpdCBvbiBjaGFyICgyIGJ5dGUpIGJvdW5kYXJpZXMuCisgICAgICAgICAgICAjIFRoZXJlZm9yZSwgaW4gc29tZSBjYXNlcyB3ZSBuZWVkIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZQorICAgICAgICAgICAgIyBzcGFjZSBieSAxIGJ5dGUgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IGFsaWdubWVudC4KKyAgICAgICAgICAgIG15ICRhbGlnbiA9IDA7CisKKyAgICAgICAgICAgICMgT25seSBhcHBsaWVzIHRvIFVuaWNvZGUgc3RyaW5ncworICAgICAgICAgICAgaWYgKCRlbmNvZGluZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgIyBNaW4gc3RyaW5nICsgaGVhZGVyIHNpemUgLTEKKyAgICAgICAgICAgICAgICAkaGVhZGVyX2xlbmd0aCA9IDQ7CisKKyAgICAgICAgICAgICAgICBpZiAoJHNwYWNlX3JlbWFpbmluZyA+ICRoZWFkZXJfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICMgU3RyaW5nIGNvbnRhaW5zIDMgYnl0ZSBoZWFkZXIgPT4gc3BsaXQgb24gb2RkIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgICAgIGlmIChub3QgJHNwbGl0X3N0cmluZyBhbmQgJHNwYWNlX3JlbWFpbmluZyAlIDIgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNwYWNlX3JlbWFpbmluZy0tOworICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWduID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjIFNwbGl0IHNlY3Rpb24gd2l0aG91dCBoZWFkZXIgPT4gc3BsaXQgb24gZXZlbiBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICBlbHNpZiAoJHNwbGl0X3N0cmluZyBhbmQgJHNwYWNlX3JlbWFpbmluZyAlIDIgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHNwYWNlX3JlbWFpbmluZy0tOworICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWduID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICRzcGxpdF9zdHJpbmcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpZiAoJHNwYWNlX3JlbWFpbmluZyA+ICRoZWFkZXJfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgIyBXcml0ZSBhcyBtdWNoIGFzIHBvc3NpYmxlIG9mIHRoZSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgICAgICBteSAkdG1wID0gc3Vic3RyICRzdHJpbmcsIDAsICRzcGFjZV9yZW1haW5pbmc7CisKKyAgICAgICAgICAgICAgICAjIFN0b3JlIGxvY2F0aW9uIG9mIEVYVFNTVCBidWNrZXQgc3RyaW5nLgorICAgICAgICAgICAgICAgIGlmICgkYnVja2V0X3N0cmluZykgeworICAgICAgICAgICAgICAgICAgICBteSAkZ2xvYmFsX29mZnNldCAgID0gJHNlbGYtPntfZGF0YXNpemV9OworICAgICAgICAgICAgICAgICAgICBteSAkbG9jYWxfb2Zmc2V0ICAgID0gJHNlbGYtPntfZGF0YXNpemV9IC0gJHNzdF9ibG9ja19zdGFydDsKKworICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHNlbGYtPntfZXh0c3N0X29mZnNldHN9fSwgWyRnbG9iYWxfb2Zmc2V0LCAkbG9jYWxfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgJGJ1Y2tldF9zdHJpbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCR0bXApOworCisKKyAgICAgICAgICAgICAgICAjIFRoZSByZW1haW5kZXIgd2lsbCBiZSB3cml0dGVuIGluIHRoZSBuZXh0IGJsb2NrKHMpCisgICAgICAgICAgICAgICAgJHN0cmluZyA9IHN1YnN0ciAkc3RyaW5nLCAkc3BhY2VfcmVtYWluaW5nOworCisgICAgICAgICAgICAgICAgIyBSZWR1Y2UgdGhlIGN1cnJlbnQgYmxvY2sgbGVuZ3RoIGJ5IHRoZSBhbW91bnQgd3JpdHRlbgorICAgICAgICAgICAgICAgICRibG9ja19sZW5ndGggLT0gJGNvbnRpbnVlX2xpbWl0IC0kY29udGludWUgLSRhbGlnbjsKKworICAgICAgICAgICAgICAgICMgSWYgdGhlIGN1cnJlbnQgc3RyaW5nIHdhcyBzcGxpdCB0aGVuIHRoZSBuZXh0IENPTlRJTlVFIGJsb2NrCisgICAgICAgICAgICAgICAgIyBzaG91bGQgaGF2ZSB0aGUgc3RyaW5nIGNvbnRpbnVlIGZsYWcgKGdyYml0KSBzZXQgdW5sZXNzIHRoZQorICAgICAgICAgICAgICAgICMgc3BsaXQgc3RyaW5nIGZpdHMgZXhhY3RseSBpbnRvIHRoZSByZW1haW5pbmcgc3BhY2UuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIGlmICgkYmxvY2tfbGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAkY29udGludWUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGNvbnRpbnVlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RhcnQgdGhlIHN0cmluZyBpbiB0aGUgY3VycmVudCBibG9jaworICAgICAgICAgICAgICAgICRibG9ja19sZW5ndGggLT0gJGNvbnRpbnVlX2xpbWl0IC0kc3BhY2VfcmVtYWluaW5nIC0kY29udGludWU7CisgICAgICAgICAgICAgICAgJGNvbnRpbnVlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBXcml0ZSB0aGUgQ09OVElOVUUgYmxvY2sgaGVhZGVyCisgICAgICAgICAgICBpZiAoQGJsb2NrX3NpemVzKSB7CisgICAgICAgICAgICAgICAgJHNzdF9ibG9ja19zdGFydD0gJHNlbGYtPntfZGF0YXNpemV9OyAjIFJlc2V0IEVYVFNTVCBvZmZzZXQuCisKKyAgICAgICAgICAgICAgICAkcmVjb3JkICAgICAgICAgPSAweDAwM0M7CisgICAgICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gc2hpZnQgQGJsb2NrX3NpemVzOworCisgICAgICAgICAgICAgICAgJGhlYWRlciAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAkaGVhZGVyICAgICAgICAuPSBwYWNrKCJDIiwgJGVuY29kaW5nKSBpZiAkY29udGludWU7CisKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBJZiB0aGUgc3RyaW5nIChvciBzdWJzdHIpIGlzIHNtYWxsIGVub3VnaCB3ZSBjYW4gd3JpdGUgaXQgaW4gdGhlCisgICAgICAgICAgICAjIG5ldyBDT05USU5VRSBibG9jay4gRWxzZSwgZ28gdGhyb3VnaCB0aGUgbG9vcCBhZ2FpbiB0byB3cml0ZSBpdCBpbgorICAgICAgICAgICAgIyBvbmUgb3IgbW9yZSBDT05USU5VRSBibG9ja3MKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGlmICgkYmxvY2tfbGVuZ3RoIDwgJGNvbnRpbnVlX2xpbWl0KSB7CisKKyAgICAgICAgICAgICAgICAjIFN0b3JlIGxvY2F0aW9uIG9mIEVYVFNTVCBidWNrZXQgc3RyaW5nLgorICAgICAgICAgICAgICAgIGlmICgkYnVja2V0X3N0cmluZykgeworICAgICAgICAgICAgICAgICAgICBteSAkZ2xvYmFsX29mZnNldCAgID0gJHNlbGYtPntfZGF0YXNpemV9OworICAgICAgICAgICAgICAgICAgICBteSAkbG9jYWxfb2Zmc2V0ICAgID0gJHNlbGYtPntfZGF0YXNpemV9IC0gJHNzdF9ibG9ja19zdGFydDsKKworICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHNlbGYtPntfZXh0c3N0X29mZnNldHN9fSwgWyRnbG9iYWxfb2Zmc2V0LCAkbG9jYWxfb2Zmc2V0XTsKKworICAgICAgICAgICAgICAgICAgICAkYnVja2V0X3N0cmluZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRzdHJpbmcpOworCisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSAkYmxvY2tfbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NhbGN1bGF0ZV9leHRzc3Rfc2l6ZQorIworIyBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgdXNlZCBpbiB0aGUgRVhUU1NUIGlzIGJldHdlZW4gMCBhbmQgMTI4LiBUaGUgbnVtYmVyIG9mCisjIHN0cmluZ3MgcGVyIGJ1Y2tldCAoYnVja2V0IHNpemUpIGhhcyBhIG1pbmltdW0gdmFsdWUgb2YgOCBhbmQgYSB0aGVvcmV0aWNhbAorIyBtYXhpbXVtIG9mIDJeMTYuIEZvciAibnVtYmVyIG9mIHN0cmluZ3MiIDwgMTAyNCB0aGVyZSBpcyBhIGNvbnN0YW50IGJ1Y2tldAorIyBzaXplIG9mIDguIFRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIGdlbmVyYXRlcyB0aGUgc2FtZSBzaXplL2J1Y2tldCByYXRpbworIyBhcyBFeGNlbC4KKyMKK3N1YiBfY2FsY3VsYXRlX2V4dHNzdF9zaXplIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR1bmlxdWVfc3RyaW5ncyAgPSAkc2VsZi0+e19zdHJfdW5pcXVlfTsKKworICAgIG15ICRidWNrZXRfc2l6ZTsKKyAgICBteSAkYnVja2V0czsKKworICAgIGlmICgkdW5pcXVlX3N0cmluZ3MgPCAxMDI0KSB7CisgICAgICAgICRidWNrZXRfc2l6ZSA9IDg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkYnVja2V0X3NpemUgPSAxICsgaW50KCR1bmlxdWVfc3RyaW5ncyAvIDEyOCk7CisgICAgfQorCisgICAgJGJ1Y2tldHMgPSBpbnQoKCR1bmlxdWVfc3RyaW5ncyArICRidWNrZXRfc2l6ZSAtMSkgIC8gJGJ1Y2tldF9zaXplKTsKKworCisgICAgJHNlbGYtPntfZXh0c3N0X2J1Y2tldHN9ICAgICAgICA9ICRidWNrZXRzIDsKKyAgICAkc2VsZi0+e19leHRzc3RfYnVja2V0X3NpemV9ICAgID0gJGJ1Y2tldF9zaXplOworCisKKyAgICByZXR1cm4gNiArIDggKiAkYnVja2V0czsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9leHRzc3QKKyMKKyMgV3JpdGUgRVhUU1NUIHRhYmxlIHVzaW5nIHRoZSBvZmZzZXRzIGNhbGN1bGF0ZWQgaW4gX3N0b3JlX3NoYXJlZF9zdHJpbmdzKCkuCisjCitzdWIgX3N0b3JlX2V4dHNzdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgQG9mZnNldHMgICAgID0gQHskc2VsZi0+e19leHRzc3Rfb2Zmc2V0c319OworICAgIG15ICRidWNrZXRfc2l6ZSA9ICRzZWxmLT57X2V4dHNzdF9idWNrZXRfc2l6ZX07CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRkY7ICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAyICsgOCAqIEBvZmZzZXRzOyAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrICd2dicsICAgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrICd2JywgICAgJGJ1Y2tldF9zaXplLDsKKworICAgIGZvciBteSAkb2Zmc2V0IChAb2Zmc2V0cykgeworICAgICAgICRkYXRhIC49IHBhY2sgJ1Z2dicsICRvZmZzZXQtPlswXSwgJG9mZnNldC0+WzFdLCAwOworICAgIH0KKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKworCisjCisjIE1ldGhvZHMgcmVsYXRlZCB0byBjb21tZW50cyBhbmQgTVNPIG9iamVjdHMuCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FkZF9tc29fZHJhd2luZ19ncm91cCgpCisjCisjIFdyaXRlIHRoZSBNU09EUkFXSU5HR1JPVVAgcmVjb3JkIHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIEVzY2hlciBkcmF3aW5nCisjIG9iamVjdHMgaW4gdGhlIGZpbGUgc3VjaCBhcyBpbWFnZXMsIGNvbW1lbnRzIGFuZCBmaWx0ZXJzLgorIworc3ViIF9hZGRfbXNvX2RyYXdpbmdfZ3JvdXAgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntfbXNvX3NpemV9OworCisgICAgbXkgJHJlY29yZCAgPSAweDAwRUI7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGRhdGEgICAgPSAkc2VsZi0+X3N0b3JlX21zb19kZ2dfY29udGFpbmVyKCk7CisgICAgICAgJGRhdGEgICAuPSAkc2VsZi0+X3N0b3JlX21zb19kZ2coQHskc2VsZi0+e19tc29fY2x1c3RlcnN9fSk7CisgICAgICAgJGRhdGEgICAuPSAkc2VsZi0+X3N0b3JlX21zb19ic3RvcmVfY29udGFpbmVyKCk7CisgICAgICAgJGRhdGEgICAuPSAkc2VsZi0+X3N0b3JlX21zb19pbWFnZXMoQCRfKSBmb3IgQHskc2VsZi0+e19pbWFnZXNfZGF0YX19OworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0KCk7CisgICAgICAgJGRhdGEgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGxpdF9tZW51X2NvbG9ycygpOworCisgICAgICAgJGxlbmd0aCAgPSBsZW5ndGggJGRhdGE7CisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9hZGRfbXNvX2RyYXdpbmdfZ3JvdXBfY29udGludWUoJGhlYWRlciAuICRkYXRhKTsKKworICAgIHJldHVybiAkaGVhZGVyIC4gJGRhdGE7ICMgRm9yIHRlc3Rpbmcgb25seS4KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9hZGRfbXNvX2RyYXdpbmdfZ3JvdXBfY29udGludWUoKQorIworIyBTZWUgZmlyc3QgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyOjpfYWRkX2NvbnRpbnVlKCkgbWV0aG9kLgorIworIyBBZGQgc3BlY2lhbGlzZWQgQ09OVElOVUUgaGVhZGVycyB0byBsYXJnZSBNU09EUkFXSU5HR1JPVVAgZGF0YSBibG9jay4KKyMgV2UgdXNlIHRoZSBFeGNlbCA5NyBtYXggYmxvY2sgc2l6ZSBvZiA4MjI4IC0gNCBieXRlcyBmb3IgdGhlIGhlYWRlciA9IDgyMjQuCisjCisjIFRoZSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBibG9jazoKKyMKKyMgICAgIENhc2UgMTogIDw9ICAgODIyNCBieXRlcyAgICAgIDEgTVNPRFJBV0lOR0dST1VQCisjICAgICBDYXNlIDI6ICA8PSAyKjgyMjQgYnl0ZXMgICAgICAxIE1TT0RSQVdJTkdHUk9VUCArIDEgQ09OVElOVUUKKyMgICAgIENhc2UgMzogID4gIDIqODIyNCBieXRlcyAgICAgIDIgTVNPRFJBV0lOR0dST1VQICsgbiBDT05USU5VRQorIworc3ViIF9hZGRfbXNvX2RyYXdpbmdfZ3JvdXBfY29udGludWUgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkZGF0YSAgICAgICAgPSAkX1swXTsKKyAgICBteSAkbGltaXQgICAgICAgPSA4MjI4IC00OworICAgIG15ICRtc29fZ3JvdXAgICA9IDB4MDBFQjsgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRjb250aW51ZSAgICA9IDB4MDAzQzsgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRibG9ja19jb3VudCA9IDE7CisgICAgbXkgJGhlYWRlcjsKKyAgICBteSAkdG1wOworCisgICAgIyBJZ25vcmUgdGhlIGJhc2UgY2xhc3MgX2FkZF9jb250aW51ZSgpIG1ldGhvZC4KKyAgICAkc2VsZi0+e19pZ25vcmVfY29udGludWV9ID0gMTsKKworICAgICMgQ2FzZSAxIGFib3ZlLiBKdXN0IHJldHVybiB0aGUgZGF0YSBhcyBpdCBpcy4KKyAgICBpZiAobGVuZ3RoICRkYXRhIDw9ICRsaW1pdCkgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkZGF0YSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAjIENoYW5nZSBsZW5ndGggZmllbGQgb2YgdGhlIGZpcnN0IE1TT0RSQVdJTkdHUk9VUCBibG9jay4gQ2FzZSAyIGFuZCAzLgorICAgICR0bXAgPSBzdWJzdHIoJGRhdGEsIDAsICRsaW1pdCArNCwgIiIpOworICAgIHN1YnN0cigkdG1wLCAyLCAyLCBwYWNrKCJ2IiwgJGxpbWl0KSk7CisgICAgJHNlbGYtPl9hcHBlbmQoJHRtcCk7CisKKworICAgICMgQWRkIE1TT0RSQVdJTkdHUk9VUCBhbmQgQ09OVElOVUUgYmxvY2tzIGZvciBDYXNlIDMgYWJvdmUuCisgICAgd2hpbGUgKGxlbmd0aCgkZGF0YSkgPiAkbGltaXQpIHsKKyAgICAgICAgaWYgKCRibG9ja19jb3VudCA9PSAxKSB7CisgICAgICAgICAgICAjIEFkZCBleHRyYSBNU09EUkFXSU5HR1JPVVAgYmxvY2sgaGVhZGVyLgorICAgICAgICAgICAgJGhlYWRlciA9IHBhY2soInZ2IiwgJG1zb19ncm91cCwgJGxpbWl0KTsKKyAgICAgICAgICAgICRibG9ja19jb3VudCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBBZGQgbm9ybWFsIENPTlRJTlVFIGhlYWRlci4KKyAgICAgICAgICAgICRoZWFkZXIgPSBwYWNrKCJ2diIsICRjb250aW51ZSwgJGxpbWl0KTsKKyAgICAgICAgfQorCisgICAgICAgICR0bXAgPSBzdWJzdHIoJGRhdGEsIDAsICRsaW1pdCwgIiIpOworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkdG1wKTsKKyAgICB9CisKKworICAgICMgTGFzdCBDT05USU5VRSBibG9jayBmb3IgcmVtYWluaW5nIGRhdGEuIENhc2UgMiBhbmQgMyBhYm92ZS4KKyAgICAkaGVhZGVyID0gcGFjaygidnYiLCAkY29udGludWUsIGxlbmd0aCgkZGF0YSkpOworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworCisgICAgIyBUdXJuIHRoZSBiYXNlIGNsYXNzIF9hZGRfY29udGludWUoKSBtZXRob2QgYmFjayBvbi4KKyAgICAkc2VsZi0+e19pZ25vcmVfY29udGludWV9ID0gMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fZGdnX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgRGdnQ29udGFpbmVyIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fZGdnX2NvbnRhaW5lciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwMDsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAxNTsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9ICRzZWxmLT57X21zb19zaXplfSAtMTI7ICMgLTQgKGJpZmYgaGVhZGVyKSAtOCAoZm9yIHRoaXMpLgorCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fZGdnKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBEZ2cgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HR1JPVVAuCisjCitzdWIgX3N0b3JlX21zb19kZ2cgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgICAgICA9IDB4RjAwNjsKKyAgICBteSAkdmVyc2lvbiAgICAgICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IHVuZGVmOyAjIENhbGN1bGF0ZSBhdXRvbWF0aWNhbGx5LgorCisgICAgbXkgJG1heF9zcGlkICAgICAgICA9ICRfWzBdOworICAgIG15ICRudW1fY2x1c3RlcnMgICAgPSAkX1sxXTsKKyAgICBteSAkc2hhcGVzX3NhdmVkICAgID0gJF9bMl07CisgICAgbXkgJGRyYXdpbmdzX3NhdmVkICA9ICRfWzNdOworICAgIG15ICRjbHVzdGVycyAgICAgICAgPSAkX1s0XTsKKworICAgICRkYXRhICAgICAgICAgICAgICAgPSBwYWNrICJWVlZWIiwgICRtYXhfc3BpZCwgICAgICRudW1fY2x1c3RlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNoYXBlc19zYXZlZCwgJGRyYXdpbmdzX3NhdmVkOworCisgICAgZm9yIG15ICRhcmVmIChAJGNsdXN0ZXJzKSB7CisgICAgICAgIG15ICRkcmF3aW5nX2lkICAgICAgPSAkYXJlZi0+WzBdOworICAgICAgICBteSAkc2hhcGVfaWRzX3VzZWQgID0gJGFyZWYtPlsxXTsKKworICAgICAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjayAiVlYiLCAgJGRyYXdpbmdfaWQsICRzaGFwZV9pZHNfdXNlZDsKKyAgICB9CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19ic3RvcmVfY29udGFpbmVyKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBCc3RvcmVDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HR1JPVVAuCisjCitzdWIgX3N0b3JlX21zb19ic3RvcmVfY29udGFpbmVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgcmV0dXJuICcnIHVubGVzcyAkc2VsZi0+e19pbWFnZXNfc2l6ZX07CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDE7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTU7CisgICAgbXkgJGluc3RhbmNlICAgID0gQHskc2VsZi0+e19pbWFnZXNfZGF0YX19OyAjIE51bWJlciBvZiBpbWFnZXMuCisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gJHNlbGYtPntfaW1hZ2VzX3NpemV9ICs4ICokaW5zdGFuY2U7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19pbWFnZXMoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIEJzdG9yZUNvbnRhaW5lciByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkdHUk9VUC4KKyMKK3N1YiBfc3RvcmVfbXNvX2ltYWdlcyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWZfY291bnQgICA9ICRfWzBdOworICAgIG15ICRpbWFnZV90eXBlICA9ICRfWzFdOworICAgIG15ICRpbWFnZSAgICAgICA9ICRfWzJdOworICAgIG15ICRzaXplICAgICAgICA9ICRfWzNdOworICAgIG15ICRjaGVja3N1bTEgICA9ICRfWzRdOworICAgIG15ICRjaGVja3N1bTIgICA9ICRfWzVdOworCisgICAgbXkgJGJsaXBfc3RvcmVfZW50cnkgPSAgJHNlbGYtPl9zdG9yZV9tc29fYmxpcF9zdG9yZV9lbnRyeSgkcmVmX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTEpOworCisgICAgbXkgJGJsaXAgICAgICAgICAgICAgPSAgJHNlbGYtPl9zdG9yZV9tc29fYmxpcCgkaW1hZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoZWNrc3VtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTIpOworCisgICAgcmV0dXJuICRibGlwX3N0b3JlX2VudHJ5IC4gJGJsaXA7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fYmxpcF9zdG9yZV9lbnRyeSgpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgQmxpcFN0b3JlRW50cnkgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HR1JPVVAuCisjCitzdWIgX3N0b3JlX21zb19ibGlwX3N0b3JlX2VudHJ5IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlZl9jb3VudCAgID0gJF9bMF07CisgICAgbXkgJGltYWdlX3R5cGUgID0gJF9bMV07CisgICAgbXkgJHNpemUgICAgICAgID0gJF9bMl07CisgICAgbXkgJGNoZWNrc3VtMSAgID0gJF9bM107CisKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwNzsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAyOworICAgIG15ICRpbnN0YW5jZSAgICA9ICRpbWFnZV90eXBlOworICAgIG15ICRsZW5ndGggICAgICA9ICRzaXplICs2MTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCdDJywgICRpbWFnZV90eXBlKSAgICMgV2luMzIKKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCdDJywgICRpbWFnZV90eXBlKSAgICMgTWFjCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnSConLCAkY2hlY2tzdW0xKSAgICAjIFVpZCBjaGVja3N1bQorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ3YnLCAgMHhGRikgICAgICAgICAgIyBUYWcKKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCdWJywgICRzaXplICsyNSkgICAgICMgTmV4dCBCbGlwIHNpemUKKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCdWJywgICRyZWZfY291bnQpICAgICMgSW1hZ2UgcmVmIGNvdW50CisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnVicsICAweDAwMDAwMDAwKSAgICAjIEZpbGUgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnQycsICAweDAwKSAgICAgICAgICAjIFVzYWdlCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnQycsICAweDAwKSAgICAgICAgICAjIE5hbWUgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnQycsICAweDAwKSAgICAgICAgICAjIFVudXNlZAorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0MnLCAgMHgwMCkgICAgICAgICAgIyBVbnVzZWQKKyAgICAgICAgICAgICAgICAgICAgOworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2JsaXAoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIEJsaXAgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HR1JPVVAuCisjCitzdWIgX3N0b3JlX21zb19ibGlwIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJGltYWdlX3R5cGUgID0gJF9bMF07CisgICAgbXkgJGltYWdlX2RhdGEgID0gJF9bMV07CisgICAgbXkgJHNpemUgICAgICAgID0gJF9bMl07CisgICAgbXkgJGNoZWNrc3VtMSAgID0gJF9bM107CisgICAgbXkgJGNoZWNrc3VtMiAgID0gJF9bNF07CisgICAgbXkgJGluc3RhbmNlOworCisgICAgJGluc3RhbmNlID0gMHgwNDZBIGlmICRpbWFnZV90eXBlID09IDU7ICMgSlBHCisgICAgJGluc3RhbmNlID0gMHgwNkUwIGlmICRpbWFnZV90eXBlID09IDY7ICMgUE5HCisgICAgJGluc3RhbmNlID0gMHgwN0E5IGlmICRpbWFnZV90eXBlID09IDc7ICMgQk1QCisKKyAgICAjIEJNUHMgY29udGFpbiBhbiBleHRyYSBjaGVja3N1bSBmb3IgdGhlIHN0cmlwcGVkIGRhdGEuCisgICAgaWYgKCAkaW1hZ2VfdHlwZSA9PSA3KSB7CisgICAgICAgICRjaGVja3N1bTEgPSAkY2hlY2tzdW0yIC4gJGNoZWNrc3VtMTsKKyAgICB9CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMTggKyAkaW1hZ2VfdHlwZTsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAweDAwMDA7CisgICAgbXkgJGxlbmd0aCAgICAgID0gJHNpemUgKzE3OworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soJ0gqJywgJGNoZWNrc3VtMSkgIyBVaWQgY2hlY2tzdW0KKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCdDJywgIDB4RkYpICAgICAgICMgVGFnCisgICAgICAgICAgICAgICAgICAgIC4gJGltYWdlX2RhdGEgICAgICAgICAgICAjIEltYWdlCisgICAgICAgICAgICAgICAgICAgIDsKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX29wdCgpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgT3B0IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fb3B0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBCOworICAgIG15ICR2ZXJzaW9uICAgICA9IDM7CisgICAgbXkgJGluc3RhbmNlICAgID0gMzsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAxODsKKworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgIkgqIiwgJ0JGMDAwODAwMDgwMDgxMDEwOTAwMDAwOEMwMDE0MDAwJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDAwOCc7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19zcGxpdF9tZW51X2NvbG9ycygpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgU3BsaXRNZW51Q29sb3JzIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fc3BsaXRfbWVudV9jb2xvcnMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYxMUU7CisgICAgbXkgJHZlcnNpb24gICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgPSA0OworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9IDE2OworCisgICAgJGRhdGEgICAgICAgICAgID0gcGFjayAiSCoiLCAnMEQwMDAwMDgwQzAwMDAwODE3MDAwMDA4RjcwMDAwMTAnOworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworV29ya2Jvb2sgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgV29ya2Jvb2tzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvV29ya3NoZWV0LnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Xb3Jrc2hlZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxNDJmNgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvV29ya3NoZWV0LnBtCkBAIC0wLDAgKzEsNzYzNCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFdvcmtzaGVldCAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBXb3Jrc2hlZXRzLgorIworIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OwordXNlIENhcnA7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkJJRkZ3cml0ZXI7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybXVsYTsKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBuZXcgV29ya3NoZWV0IG9iamVjdCBmcm9tIGEgQklGRndyaXRlciBvYmplY3QKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzICAgICAgICAgICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgICAgICAgICAgICAgICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyLT5uZXcoKTsKKyAgICBteSAkcm93bWF4ICAgICAgICAgICAgICAgICAgICA9IDY1NTM2OworICAgIG15ICRjb2xtYXggICAgICAgICAgICAgICAgICAgID0gMjU2OworICAgIG15ICRzdHJtYXggICAgICAgICAgICAgICAgICAgID0gMDsKKworICAgICRzZWxmLT57X25hbWV9ICAgICAgICAgICAgICAgID0gJF9bMF07CisgICAgJHNlbGYtPntfaW5kZXh9ICAgICAgICAgICAgICAgPSAkX1sxXTsKKyAgICAkc2VsZi0+e19lbmNvZGluZ30gICAgICAgICAgICA9ICRfWzJdOworICAgICRzZWxmLT57X2FjdGl2ZXNoZWV0fSAgICAgICAgID0gJF9bM107CisgICAgJHNlbGYtPntfZmlyc3RzaGVldH0gICAgICAgICAgPSAkX1s0XTsKKyAgICAkc2VsZi0+e191cmxfZm9ybWF0fSAgICAgICAgICA9ICRfWzVdOworICAgICRzZWxmLT57X3BhcnNlcn0gICAgICAgICAgICAgID0gJF9bNl07CisgICAgJHNlbGYtPntfdGVtcGRpcn0gICAgICAgICAgICAgPSAkX1s3XTsKKworICAgICRzZWxmLT57X3N0cl90b3RhbH0gICAgICAgICAgID0gJF9bOF07CisgICAgJHNlbGYtPntfc3RyX3VuaXF1ZX0gICAgICAgICAgPSAkX1s5XTsKKyAgICAkc2VsZi0+e19zdHJfdGFibGV9ICAgICAgICAgICA9ICRfWzEwXTsKKyAgICAkc2VsZi0+e18xOTA0fSAgICAgICAgICAgICAgICA9ICRfWzExXTsKKyAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSAgICAgICA9ICRfWzEyXTsKKyAgICAkc2VsZi0+e19wYWxldHRlfSAgICAgICAgICAgICA9ICRfWzEzXTsKKworICAgICRzZWxmLT57X3NoZWV0X3R5cGV9ICAgICAgICAgID0gMHgwMDAwOworICAgICRzZWxmLT57X2V4dF9zaGVldHN9ICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0gICAgICAgPSAxOworICAgICRzZWxmLT57X2ZpbGVoYW5kbGV9ICAgICAgICAgID0gIiI7CisgICAgJHNlbGYtPntfZmlsZWNsb3NlZH0gICAgICAgICAgPSAwOworICAgICRzZWxmLT57X29mZnNldH0gICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e194bHNfcm93bWF4fSAgICAgICAgICA9ICRyb3dtYXg7CisgICAgJHNlbGYtPntfeGxzX2NvbG1heH0gICAgICAgICAgPSAkY29sbWF4OworICAgICRzZWxmLT57X3hsc19zdHJtYXh9ICAgICAgICAgID0gJHN0cm1heDsKKyAgICAkc2VsZi0+e19kaW1fcm93bWlufSAgICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X2RpbV9yb3dtYXh9ICAgICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfZGltX2NvbG1pbn0gICAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19kaW1fY29sbWF4fSAgICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X2NvbGluZm99ICAgICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfc2VsZWN0aW9ufSAgICAgICAgICAgPSBbMCwgMF07CisgICAgJHNlbGYtPntfcGFuZXN9ICAgICAgICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19hY3RpdmVfcGFuZX0gICAgICAgICA9IDM7CisgICAgJHNlbGYtPntfZnJvemVufSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2Zyb3plbl9ub19zcGxpdH0gICAgID0gMTsKKyAgICAkc2VsZi0+e19zZWxlY3RlZH0gICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfaGlkZGVufSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2FjdGl2ZX0gICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e190YWJfY29sb3J9ICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19maXJzdF9yb3d9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZmlyc3RfY29sfSAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2Rpc3BsYXlfZm9ybXVsYXN9ICAgID0gMDsKKyAgICAkc2VsZi0+e19kaXNwbGF5X2hlYWRlcnN9ICAgICA9IDE7CisgICAgJHNlbGYtPntfZGlzcGxheV96ZXJvc30gICAgICAgPSAxOworICAgICRzZWxmLT57X2Rpc3BsYXlfYXJhYmljfSAgICAgID0gMDsKKworICAgICRzZWxmLT57X3BhcGVyX3NpemV9ICAgICAgICAgID0gMHgwOworICAgICRzZWxmLT57X29yaWVudGF0aW9ufSAgICAgICAgID0gMHgxOworICAgICRzZWxmLT57X2hlYWRlcn0gICAgICAgICAgICAgID0gJyc7CisgICAgJHNlbGYtPntfZm9vdGVyfSAgICAgICAgICAgICAgPSAnJzsKKyAgICAkc2VsZi0+e19oZWFkZXJfZW5jb2Rpbmd9ICAgICA9IDA7CisgICAgJHNlbGYtPntfZm9vdGVyX2VuY29kaW5nfSAgICAgPSAwOworICAgICRzZWxmLT57X2hjZW50ZXJ9ICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e192Y2VudGVyfSAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfbWFyZ2luX2hlYWRlcn0gICAgICAgPSAwLjUwOworICAgICRzZWxmLT57X21hcmdpbl9mb290ZXJ9ICAgICAgID0gMC41MDsKKyAgICAkc2VsZi0+e19tYXJnaW5fbGVmdH0gICAgICAgICA9IDAuNzU7CisgICAgJHNlbGYtPntfbWFyZ2luX3JpZ2h0fSAgICAgICAgPSAwLjc1OworICAgICRzZWxmLT57X21hcmdpbl90b3B9ICAgICAgICAgID0gMS4wMDsKKyAgICAkc2VsZi0+e19tYXJnaW5fYm90dG9tfSAgICAgICA9IDEuMDA7CisKKyAgICAkc2VsZi0+e190aXRsZV9yb3dtaW59ICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X3RpdGxlX3Jvd21heH0gICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfdGl0bGVfY29sbWlufSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e190aXRsZV9jb2xtYXh9ICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X3ByaW50X3Jvd21pbn0gICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfcHJpbnRfcm93bWF4fSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19wcmludF9jb2xtaW59ICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X3ByaW50X2NvbG1heH0gICAgICAgID0gdW5kZWY7CisKKyAgICAkc2VsZi0+e19wcmludF9ncmlkbGluZXN9ICAgICA9IDE7CisgICAgJHNlbGYtPntfc2NyZWVuX2dyaWRsaW5lc30gICAgPSAxOworICAgICRzZWxmLT57X3ByaW50X2hlYWRlcnN9ICAgICAgID0gMDsKKworICAgICRzZWxmLT57X3BhZ2Vfb3JkZXJ9ICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19ibGFja193aGl0ZX0gICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZHJhZnRfcXVhbGl0eX0gICAgICAgPSAwOworICAgICRzZWxmLT57X3ByaW50X2NvbW1lbnRzfSAgICAgID0gMDsKKyAgICAkc2VsZi0+e19wYWdlX3N0YXJ0fSAgICAgICAgICA9IDE7CisgICAgJHNlbGYtPntfY3VzdG9tX3N0YXJ0fSAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfZml0X3BhZ2V9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZpdF93aWR0aH0gICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19maXRfaGVpZ2h0fSAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19oYnJlYWtzfSAgICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3ZicmVha3N9ICAgICAgICAgICAgID0gW107CisKKyAgICAkc2VsZi0+e19wcm90ZWN0fSAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfcGFzc3dvcmR9ICAgICAgICAgICAgPSB1bmRlZjsKKworICAgICRzZWxmLT57X2NvbF9zaXplc30gICAgICAgICAgID0ge307CisgICAgJHNlbGYtPntfcm93X3NpemVzfSAgICAgICAgICAgPSB7fTsKKworICAgICRzZWxmLT57X2NvbF9mb3JtYXRzfSAgICAgICAgID0ge307CisgICAgJHNlbGYtPntfcm93X2Zvcm1hdHN9ICAgICAgICAgPSB7fTsKKworICAgICRzZWxmLT57X3pvb219ICAgICAgICAgICAgICAgID0gMTAwOworICAgICRzZWxmLT57X3ByaW50X3NjYWxlfSAgICAgICAgID0gMTAwOworICAgICRzZWxmLT57X3BhZ2Vfdmlld30gICAgICAgICAgID0gMDsKKworICAgICRzZWxmLT57X2xlYWRpbmdfemVyb3N9ICAgICAgID0gMDsKKworICAgICRzZWxmLT57X291dGxpbmVfcm93X2xldmVsfSAgID0gMDsKKyAgICAkc2VsZi0+e19vdXRsaW5lX3N0eWxlfSAgICAgICA9IDA7CisgICAgJHNlbGYtPntfb3V0bGluZV9iZWxvd30gICAgICAgPSAxOworICAgICRzZWxmLT57X291dGxpbmVfcmlnaHR9ICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19vdXRsaW5lX29ufSAgICAgICAgICA9IDE7CisKKyAgICAkc2VsZi0+e193cml0ZV9tYXRjaH0gICAgICAgICA9IFtdOworCisgICAgJHNlbGYtPntfb2JqZWN0X2lkc30gICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19pbWFnZXN9ICAgICAgICAgICAgICA9IHt9OworICAgICRzZWxmLT57X2ltYWdlc19hcnJheX0gICAgICAgID0gW107CisgICAgJHNlbGYtPntfY2hhcnRzfSAgICAgICAgICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19jaGFydHNfYXJyYXl9ICAgICAgICA9IFtdOworICAgICRzZWxmLT57X2NvbW1lbnRzfSAgICAgICAgICAgID0ge307CisgICAgJHNlbGYtPntfY29tbWVudHNfYXJyYXl9ICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19jb21tZW50c19hdXRob3J9ICAgICA9ICcnOworICAgICRzZWxmLT57X2NvbW1lbnRzX2F1dGhvcl9lbmN9ID0gMDsKKyAgICAkc2VsZi0+e19jb21tZW50c192aXNpYmxlfSAgICA9IDA7CisKKyAgICAkc2VsZi0+e19maWx0ZXJfYXJlYX0gICAgICAgICA9IFtdOworICAgICRzZWxmLT57X2ZpbHRlcl9jb3VudH0gICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19maWx0ZXJfb259ICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e193cml0aW5nX3VybH0gICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19kYl9pbmRpY2VzfSAgICAgICAgICA9IFtdOworCisgICAgJHNlbGYtPntfdmFsaWRhdGlvbnN9ICAgICAgICAgPSBbXTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9pbml0aWFsaXplKCk7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2luaXRpYWxpemUoKQorIworIyBPcGVuIGEgdG1wIGZpbGUgdG8gc3RvcmUgdGhlIG1ham9yaXR5IG9mIHRoZSBXb3Jrc2hlZXQgZGF0YS4gSWYgdGhpcyBmYWlscywKKyMgZm9yIGV4YW1wbGUgZHVlIHRvIHdyaXRlIHBlcm1pc3Npb25zLCBzdG9yZSB0aGUgZGF0YSBpbiBtZW1vcnkuIFRoaXMgY2FuIGJlCisjIHNsb3cgZm9yIGxhcmdlIGZpbGVzLgorIworc3ViIF9pbml0aWFsaXplIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZoOworICAgIG15ICR0bXBfZGlyOworCisgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgY29tcGxpY2F0ZWQgYnkgV2luZG93cyBsaW1pdGF0aW9ucy4gUG9ydGVycyBjYW4KKyAgICAjIGNob29zZSBhIG1vcmUgZGlyZWN0IG1ldGhvZC4KKworCisKKyAgICAjIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2UgdXNlIElPOjpGaWxlLT5uZXdfdG1wZmlsZSgpLiBUaGlzIG1heSBmYWlsLCBpbgorICAgICMgcGFydGljdWxhciB3aXRoIElJUyBvbiBXaW5kb3dzLCBzbyB3ZSBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgdGVtcAorICAgICMgZGlyZWN0b3J5IHZpYSBGaWxlOjpUZW1wLgorICAgICMKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e190ZW1wZGlyfSkgeworCisgICAgICAgICMgRGVsYXkgbG9hZGluZyBGaWxlOlRlbXAgdG8gcmVkdWNlIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzLgorICAgICAgICBldmFsIHsgcmVxdWlyZSBGaWxlOjpUZW1wIH07CisgICAgICAgIGRpZSAiVGhlIEZpbGU6OlRlbXAgbW9kdWxlIG11c3QgYmUgaW5zdGFsbGVkIGluIG9yZGVyICIuCisgICAgICAgICAgICAidG8gY2FsbCBzZXRfdGVtcGRpcigpLlxuIiBpZiAkQDsKKworCisgICAgICAgICMgVHJhcCBidXQgaWdub3JlIEZpbGU6OlRlbXAgZXJyb3JzLgorICAgICAgICBldmFsIHsgJGZoID0gRmlsZTo6VGVtcDo6dGVtcGZpbGUoRElSID0+ICRzZWxmLT57X3RlbXBkaXJ9KSB9OworCisgICAgICAgICMgU3RvcmUgdGhlIGZhaWxlZCB0bXAgZGlyIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgICAgICAkdG1wX2RpciA9ICRzZWxmLT57X3RlbXBkaXJ9IHx8IEZpbGU6OlNwZWMtPnRtcGRpciBpZiBub3QgJGZoOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAkZmggPSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUoKTsKKworICAgICAgICAjIFN0b3JlIHRoZSBmYWlsZWQgdG1wIGRpciBpbiBjYXNlIG9mIGVycm9ycy4KKyAgICAgICAgJHRtcF9kaXIgPSAiUE9TSVg6OnRtcG5hbSgpIGRpcmVjdG9yeSIgaWYgbm90ICRmaDsKKyAgICB9CisKKworICAgICMgQ2hlY2sgaWYgdGhlIHRlbXAgZmlsZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gRWxzZSBzdG9yZSBkYXRhIGluIG1lbW9yeS4KKyAgICBpZiAoJGZoKSB7CisKKyAgICAgICAgIyBiaW5tb2RlIGZpbGUgd2hldGhlciBwbGF0Zm9ybSByZXF1aXJlcyBpdCBvciBub3QuCisgICAgICAgIGJpbm1vZGUoJGZoKTsKKworICAgICAgICAjIFN0b3JlIGZpbGVoYW5kbGUKKyAgICAgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gPSAkZmg7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMgU2V0IGZsYWcgdG8gc3RvcmUgZGF0YSBpbiBtZW1vcnkgaWYgWFg6OnRlbXBmaWxlKCkgZmFpbGVkLgorICAgICAgICAkc2VsZi0+e191c2luZ190bXBmaWxlfSA9IDA7CisKKyAgICAgICAgaWYgKCRzZWxmLT57X2luZGV4fSA9PSAwICYmICReVykgeworICAgICAgICAgICAgbXkgJGRpciA9ICRzZWxmLT57X3RlbXBkaXJ9IHx8IEZpbGU6OlNwZWMtPnRtcGRpcigpOworCisgICAgICAgICAgICB3YXJuICJVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZXMgaW4gJHRtcF9kaXIuIERhdGEgd2lsbCBiZSAiLgorICAgICAgICAgICAgICAgICAic3RvcmVkIGluIG1lbW9yeS4gUmVmZXIgdG8gc2V0X3RlbXBkaXIoKSBpbiB0aGUgIi4KKyAgICAgICAgICAgICAgICAgIlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uXG4iIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jbG9zZSgpCisjCisjIEFkZCBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdvcmtib29rIChub3RlIHRoZSByZXZlcnNlIG9yZGVyKQorIyBhbmQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya2Jvb2suCisjCitzdWIgX2Nsb3NlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFByZXBlbmQgaW4gcmV2ZXJzZSBvcmRlciEhCisgICAgIworCisgICAgIyBQcmVwZW5kIHRoZSBzaGVldCBkaW1lbnNpb25zCisgICAgJHNlbGYtPl9zdG9yZV9kaW1lbnNpb25zKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIGF1dG9maWx0ZXIgZmlsdGVycy4KKyAgICAkc2VsZi0+X3N0b3JlX2F1dG9maWx0ZXJzOworCisgICAgIyBQcmVwZW5kIHRoZSBzaGVldCBhdXRvZmlsdGVyIGluZm8uCisgICAgJHNlbGYtPl9zdG9yZV9hdXRvZmlsdGVyaW5mbygpOworCisgICAgIyBQcmVwZW5kIHRoZSBzaGVldCBmaWx0ZXJtb2RlIHJlY29yZC4KKyAgICAkc2VsZi0+X3N0b3JlX2ZpbHRlcm1vZGUoKTsKKworICAgICMgUHJlcGVuZCB0aGUgQ09MSU5GTyByZWNvcmRzIGlmIHRoZXkgZXhpc3QKKyAgICBpZiAoQHskc2VsZi0+e19jb2xpbmZvfX0peworICAgICAgICBteSBAY29saW5mbyA9IEB7JHNlbGYtPntfY29saW5mb319OworICAgICAgICB3aGlsZSAoQGNvbGluZm8pIHsKKyAgICAgICAgICAgIG15ICRhcnJheXJlZiA9IHBvcCBAY29saW5mbzsKKyAgICAgICAgICAgICRzZWxmLT5fc3RvcmVfY29saW5mbyhAJGFycmF5cmVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgUHJlcGVuZCB0aGUgREVGQ09MV0lEVEggcmVjb3JkCisgICAgJHNlbGYtPl9zdG9yZV9kZWZjb2woKTsKKworICAgICMgUHJlcGVuZCB0aGUgc2hlZXQgcGFzc3dvcmQKKyAgICAkc2VsZi0+X3N0b3JlX3Bhc3N3b3JkKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHNoZWV0IHByb3RlY3Rpb24KKyAgICAkc2VsZi0+X3N0b3JlX3Byb3RlY3QoKTsKKyAgICAkc2VsZi0+X3N0b3JlX29ial9wcm90ZWN0KCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHBhZ2Ugc2V0dXAKKyAgICAkc2VsZi0+X3N0b3JlX3NldHVwKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIGJvdHRvbSBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9ib3R0b20oKTsKKworICAgICMgUHJlcGVuZCB0aGUgdG9wIG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX3RvcCgpOworCisgICAgIyBQcmVwZW5kIHRoZSByaWdodCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9yaWdodCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBsZWZ0IG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX2xlZnQoKTsKKworICAgICMgUHJlcGVuZCB0aGUgcGFnZSB2ZXJ0aWNhbCBjZW50ZXJpbmcKKyAgICAkc2VsZi0+X3N0b3JlX3ZjZW50ZXIoKTsKKworICAgICMgUHJlcGVuZCB0aGUgcGFnZSBob3Jpem9udGFsIGNlbnRlcmluZworICAgICRzZWxmLT5fc3RvcmVfaGNlbnRlcigpOworCisgICAgIyBQcmVwZW5kIHRoZSBwYWdlIGZvb3RlcgorICAgICRzZWxmLT5fc3RvcmVfZm9vdGVyKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHBhZ2UgaGVhZGVyCisgICAgJHNlbGYtPl9zdG9yZV9oZWFkZXIoKTsKKworICAgICMgUHJlcGVuZCB0aGUgdmVydGljYWwgcGFnZSBicmVha3MKKyAgICAkc2VsZi0+X3N0b3JlX3ZicmVhaygpOworCisgICAgIyBQcmVwZW5kIHRoZSBob3Jpem9udGFsIHBhZ2UgYnJlYWtzCisgICAgJHNlbGYtPl9zdG9yZV9oYnJlYWsoKTsKKworICAgICMgUHJlcGVuZCBXU0JPT0wKKyAgICAkc2VsZi0+X3N0b3JlX3dzYm9vbCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuCisgICAgJHNlbGYtPl9zdG9yZV9kZWZyb3coKTsKKworICAgICMgUHJlcGVuZCBHVVRTCisgICAgJHNlbGYtPl9zdG9yZV9ndXRzKCk7CisKKyAgICAjIFByZXBlbmQgR1JJRFNFVAorICAgICRzZWxmLT5fc3RvcmVfZ3JpZHNldCgpOworCisgICAgIyBQcmVwZW5kIFBSSU5UR1JJRExJTkVTCisgICAgJHNlbGYtPl9zdG9yZV9wcmludF9ncmlkbGluZXMoKTsKKworICAgICMgUHJlcGVuZCBQUklOVEhFQURFUlMKKyAgICAkc2VsZi0+X3N0b3JlX3ByaW50X2hlYWRlcnMoKTsKKworICAgICMKKyAgICAjIEVuZCBvZiBwcmVwZW5kLiBSZWFkIHVwd2FyZHMgZnJvbSBoZXJlLgorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgIyBBcHBlbmQKKyAgICAkc2VsZi0+X3N0b3JlX3RhYmxlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9pbWFnZXMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0cygpOworICAgICRzZWxmLT5fc3RvcmVfZmlsdGVycygpOworICAgICRzZWxmLT5fc3RvcmVfY29tbWVudHMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3dpbmRvdzIoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BhZ2VfdmlldygpOworICAgICRzZWxmLT5fc3RvcmVfem9vbSgpOworICAgICRzZWxmLT5fc3RvcmVfcGFuZXMoQHskc2VsZi0+e19wYW5lc319KSBpZiBAeyRzZWxmLT57X3BhbmVzfX07CisgICAgJHNlbGYtPl9zdG9yZV9zZWxlY3Rpb24oQHskc2VsZi0+e19zZWxlY3Rpb259fSk7CisgICAgJHNlbGYtPl9zdG9yZV92YWxpZGF0aW9uX2NvdW50KCk7CisgICAgJHNlbGYtPl9zdG9yZV92YWxpZGF0aW9ucygpOworICAgICRzZWxmLT5fc3RvcmVfdGFiX2NvbG9yKCk7CisgICAgJHNlbGYtPl9zdG9yZV9lb2YoKTsKKworICAgICMgUHJlcGVuZCB0aGUgQk9GIGFuZCBJTkRFWCByZWNvcmRzCisgICAgJHNlbGYtPl9zdG9yZV9pbmRleCgpOworICAgICRzZWxmLT5fc3RvcmVfYm9mKDB4MDAxMCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY29tcGF0aWJpbGl0eV9tb2RlKCkKKyMKKyMgU2V0IHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisjCisjIFNlZSB0aGUgZXhwbGFuYXRpb24gaW4gV29ya2Jvb2s6OmNvbXBhdGliaWxpdHlfbW9kZSgpLiBUaGlzIHByaXZhdGUgbWV0aG9kCisjIGlzIG1haW5seSB1c2VkIGZvciB0ZXN0IHB1cnBvc2VzLgorIworc3ViIF9jb21wYXRpYmlsaXR5X21vZGUgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworCisgICAgaWYgKGRlZmluZWQoJF9bMF0pKSB7CisgICAgICAgICRzZWxmLT57X2NvbXBhdGliaWxpdHl9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X25hbWUoKS4KKyMKKyMgUmV0cmlldmUgdGhlIHdvcmtzaGVldCBuYW1lLgorIworIyBOb3RlLCB0aGVyZSBpcyBubyBzZXRfbmFtZSgpIG1ldGhvZCBiZWNhdXNlIG5hbWVzIGFyZSB1c2VkIGluIGZvcm11bGFzIGFuZAorIyBjb252ZXJ0ZWQgdG8gaW50ZXJuYWwgaW5kaWNlcy4gQWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hhbmdlIHNoZWV0IG5hbWVzCisjIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIHNldCBpbiBhZGRfd29ya3NoZWV0KCkgaXMgYXNraW5nIGZvciB0cm91YmxlLgorIworc3ViIGdldF9uYW1lIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfbmFtZX07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZGF0YSgpLgorIworIyBSZXRyaWV2ZXMgZGF0YSBmcm9tIG1lbW9yeSBpbiBvbmUgY2h1bmssIG9yIGZyb20gZGlzayBpbiAkYnVmZmVyCisjIHNpemVkIGNodW5rcy4KKyMKK3N1YiBnZXRfZGF0YSB7CisKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisgICAgbXkgJGJ1ZmZlciA9IDQwOTY7CisgICAgbXkgJHRtcDsKKworICAgICMgUmV0dXJuIGRhdGEgc3RvcmVkIGluIG1lbW9yeQorICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RhdGF9KSB7CisgICAgICAgICR0bXAgICAgICAgICAgID0gJHNlbGYtPntfZGF0YX07CisgICAgICAgICRzZWxmLT57X2RhdGF9ID0gdW5kZWY7CisgICAgICAgIG15ICRmaCAgICAgICAgID0gJHNlbGYtPntfZmlsZWhhbmRsZX07CisgICAgICAgIHNlZWsoJGZoLCAwLCAwKSBpZiAkc2VsZi0+e191c2luZ190bXBmaWxlfTsKKyAgICAgICAgcmV0dXJuICR0bXA7CisgICAgfQorCisgICAgIyBSZXR1cm4gZGF0YSBzdG9yZWQgb24gZGlzaworICAgIGlmICgkc2VsZi0+e191c2luZ190bXBmaWxlfSkgeworICAgICAgICByZXR1cm4gJHRtcCBpZiByZWFkKCRzZWxmLT57X2ZpbGVoYW5kbGV9LCAkdG1wLCAkYnVmZmVyKTsKKyAgICB9CisKKyAgICAjIE5vIGRhdGEgdG8gcmV0dXJuCisgICAgcmV0dXJuIHVuZGVmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2VsZWN0KCkKKyMKKyMgU2V0IHRoaXMgd29ya3NoZWV0IGFzIGEgc2VsZWN0ZWQgd29ya3NoZWV0LCBpLmUuIHRoZSB3b3Jrc2hlZXQgaGFzIGl0cyB0YWIKKyMgaGlnaGxpZ2h0ZWQuCisjCitzdWIgc2VsZWN0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19oaWRkZW59ICAgICAgICAgPSAwOyAjIFNlbGVjdGVkIHdvcmtzaGVldCBjYW4ndCBiZSBoaWRkZW4uCisgICAgJHNlbGYtPntfc2VsZWN0ZWR9ICAgICAgID0gMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFjdGl2YXRlKCkKKyMKKyMgU2V0IHRoaXMgd29ya3NoZWV0IGFzIHRoZSBhY3RpdmUgd29ya3NoZWV0LCBpLmUuIHRoZSB3b3Jrc2hlZXQgdGhhdCBpcworIyBkaXNwbGF5ZWQgd2hlbiB0aGUgd29ya2Jvb2sgaXMgb3BlbmVkLiBBbHNvIHNldCBpdCBhcyBzZWxlY3RlZC4KKyMKK3N1YiBhY3RpdmF0ZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfaGlkZGVufSAgICAgICAgID0gMDsgIyBBY3RpdmUgd29ya3NoZWV0IGNhbid0IGJlIGhpZGRlbi4KKyAgICAkc2VsZi0+e19zZWxlY3RlZH0gICAgICAgPSAxOworICAgICR7JHNlbGYtPntfYWN0aXZlc2hlZXR9fSA9ICRzZWxmLT57X2luZGV4fTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGhpZGUoKQorIworIyBIaWRlIHRoaXMgd29ya3NoZWV0LgorIworc3ViIGhpZGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2hpZGRlbn0gICAgICAgICA9IDE7CisKKyAgICAjIEEgaGlkZGVuIHdvcmtzaGVldCBzaG91bGRuJ3QgYmUgYWN0aXZlIG9yIHNlbGVjdGVkLgorICAgICRzZWxmLT57X3NlbGVjdGVkfSAgICAgICA9IDA7CisgICAgJHskc2VsZi0+e19hY3RpdmVzaGVldH19ID0gMDsKKyAgICAkeyRzZWxmLT57X2ZpcnN0c2hlZXR9fSAgPSAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2ZpcnN0X3NoZWV0KCkKKyMKKyMgU2V0IHRoaXMgd29ya3NoZWV0IGFzIHRoZSBmaXJzdCB2aXNpYmxlIHNoZWV0LiBUaGlzIGlzIG5lY2Vzc2FyeQorIyB3aGVuIHRoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiB3b3Jrc2hlZXRzIGFuZCB0aGUgYWN0aXZhdGVkCisjIHdvcmtzaGVldCBpcyBub3QgdmlzaWJsZSBvbiB0aGUgc2NyZWVuLgorIworc3ViIHNldF9maXJzdF9zaGVldCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfaGlkZGVufSAgICAgICAgID0gMDsgIyBBY3RpdmUgd29ya3NoZWV0IGNhbid0IGJlIGhpZGRlbi4KKyAgICAkeyRzZWxmLT57X2ZpcnN0c2hlZXR9fSAgPSAkc2VsZi0+e19pbmRleH07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwcm90ZWN0KCRwYXNzd29yZCkKKyMKKyMgU2V0IHRoZSB3b3Jrc2hlZXQgcHJvdGVjdGlvbiBmbGFnIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24gYW5kIHRvCisjIGhpZGUgZm9ybXVsYXMgaWYgdGhlIGxvY2tlZCBhbmQgaGlkZGVuIGZvcm1hdCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzZXQuCisjCitzdWIgcHJvdGVjdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfcHJvdGVjdH0gICA9IDE7CisgICAgJHNlbGYtPntfcGFzc3dvcmR9ICA9ICRzZWxmLT5fZW5jb2RlX3Bhc3N3b3JkKCRfWzBdKSBpZiBkZWZpbmVkICRfWzBdOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfY29sdW1uKCRmaXJzdGNvbCwgJGxhc3Rjb2wsICR3aWR0aCwgJGZvcm1hdCwgJGhpZGRlbiwgJGxldmVsKQorIworIyBTZXQgdGhlIHdpZHRoIG9mIGEgc2luZ2xlIGNvbHVtbiBvciBhIHJhbmdlIG9mIGNvbHVtbnMuCisjIFNlZSBhbHNvOiBfc3RvcmVfY29saW5mbworIworc3ViIHNldF9jb2x1bW4geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSBAZGF0YSA9IEBfOworICAgIG15ICRjZWxsID0gJGRhdGFbMF07CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRjZWxsID1+IC9eXEQvKSB7CisgICAgICAgIEBkYXRhID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworCisgICAgICAgICMgUmV0dXJuZWQgdmFsdWVzICRyb3cxIGFuZCAkcm93MiBhcmVuJ3QgcmVxdWlyZWQgaGVyZS4gUmVtb3ZlIHRoZW0uCisgICAgICAgIHNoaWZ0ICBAZGF0YTsgICAgICAgIyAkcm93MQorICAgICAgICBzcGxpY2UgQGRhdGEsIDEsIDE7ICMgJHJvdzIKKyAgICB9CisKKyAgICByZXR1cm4gaWYgQGRhdGEgPCAzOyAjIEVuc3VyZSBhdCBsZWFzdCAkZmlyc3Rjb2wsICRsYXN0Y29sIGFuZCAkd2lkdGgKKyAgICByZXR1cm4gaWYgbm90IGRlZmluZWQgJGRhdGFbMF07ICMgQ29sdW1ucyBtdXN0IGJlIGRlZmluZWQuCisgICAgcmV0dXJuIGlmIG5vdCBkZWZpbmVkICRkYXRhWzFdOworCisgICAgIyBBc3N1bWUgc2Vjb25kIGNvbHVtbiBpcyB0aGUgc2FtZSBhcyBmaXJzdCBpZiAwLiBBdm9pZHMgS0I5MTg0MTkgYnVnLgorICAgICRkYXRhWzFdID0gJGRhdGFbMF0gaWYgJGRhdGFbMV0gPT0gMDsKKworICAgICMgRW5zdXJlIDJuZCBjb2wgaXMgbGFyZ2VyIHRoYW4gZmlyc3QuIEFsc28gZm9yIEtCOTE4NDE5IGJ1Zy4KKyAgICAoJGRhdGFbMF0sICRkYXRhWzFdKSA9ICgkZGF0YVsxXSwgJGRhdGFbMF0pIGlmICRkYXRhWzBdID4gJGRhdGFbMV07CisKKyAgICAjIExpbWl0IGNvbHVtbnMgdG8gRXhjZWwgbWF4IG9mIDI1NS4KKyAgICAkZGF0YVswXSA9IDI1NSBpZiAkZGF0YVswXSA+IDI1NTsKKyAgICAkZGF0YVsxXSA9IDI1NSBpZiAkZGF0YVsxXSA+IDI1NTsKKworICAgIHB1c2ggQHskc2VsZi0+e19jb2xpbmZvfX0sIFsgQGRhdGEgXTsKKworCisgICAgIyBTdG9yZSB0aGUgY29sIHNpemVzIGZvciB1c2Ugd2hlbiBjYWxjdWxhdGluZyBpbWFnZSB2ZXJ0aWNlcyB0YWtpbmcKKyAgICAjIGhpZGRlbiBjb2x1bW5zIGludG8gYWNjb3VudC4gQWxzbyBzdG9yZSB0aGUgY29sdW1uIGZvcm1hdHMuCisgICAgIworICAgIG15ICR3aWR0aCAgPSAkZGF0YVs0XSA/IDAgOiAkZGF0YVsyXTsgIyBTZXQgd2lkdGggdG8gemVybyBpZiBjb2wgaXMgaGlkZGVuCisgICAgICAgJHdpZHRoICB8fD0gMDsgICAgICAgICAgICAgICAgICAgICAjIEVuc3VyZSB3aWR0aCBpc24ndCB1bmRlZi4KKyAgICBteSAkZm9ybWF0ID0gJGRhdGFbM107CisKKyAgICBteSAoJGZpcnN0Y29sLCAkbGFzdGNvbCkgPSBAZGF0YTsKKworICAgIGZvcmVhY2ggbXkgJGNvbCAoJGZpcnN0Y29sIC4uICRsYXN0Y29sKSB7CisgICAgICAgICRzZWxmLT57X2NvbF9zaXplc30tPnskY29sfSAgID0gJHdpZHRoOworICAgICAgICAkc2VsZi0+e19jb2xfZm9ybWF0c30tPnskY29sfSA9ICRmb3JtYXQgaWYgZGVmaW5lZCAkZm9ybWF0OworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9zZWxlY3Rpb24oKQorIworIyBTZXQgd2hpY2ggY2VsbCBvciBjZWxscyBhcmUgc2VsZWN0ZWQgaW4gYSB3b3Jrc2hlZXQ6IHNlZSBhbHNvIHRoZQorIyBzdWIgX3N0b3JlX3NlbGVjdGlvbgorIworc3ViIHNldF9zZWxlY3Rpb24geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgJHNlbGYtPntfc2VsZWN0aW9ufSA9IFsgQF8gXTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGZyZWV6ZV9wYW5lcygpCisjCisjIFNldCBwYW5lcyBhbmQgbWFyayB0aGVtIGFzIGZyb3plbi4gU2VlIGFsc28gX3N0b3JlX3BhbmVzKCkuCisjCitzdWIgZnJlZXplX3BhbmVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgRXh0cmEgZmxhZyBpbmRpY2F0ZWQgYSBzcGxpdCBhbmQgZnJlZXplLgorICAgICRzZWxmLT57X2Zyb3plbl9ub19zcGxpdH0gPSAwIGlmICRfWzRdOworCisgICAgJHNlbGYtPntfZnJvemVufSA9IDE7CisgICAgJHNlbGYtPntfcGFuZXN9ICA9IFsgQF8gXTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNwbGl0X3BhbmVzKCkKKyMKKyMgU2V0IHBhbmVzIGFuZCBtYXJrIHRoZW0gYXMgc3BsaXQuIFNlZSBhbHNvIF9zdG9yZV9wYW5lcygpLgorIworc3ViIHNwbGl0X3BhbmVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19mcm96ZW59ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2Zyb3plbl9ub19zcGxpdH0gICA9IDA7CisgICAgJHNlbGYtPntfcGFuZXN9ICAgICAgICAgICAgID0gWyBAXyBdOworfQorCisjIE9sZGVyIG1ldGhvZCBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyp0aGF3X3BhbmVzID0gKnNwbGl0X3BhbmVzOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3BvcnRyYWl0KCkKKyMKKyMgU2V0IHRoZSBwYWdlIG9yaWVudGF0aW9uIGFzIHBvcnRyYWl0LgorIworc3ViIHNldF9wb3J0cmFpdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfb3JpZW50YXRpb259ID0gMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9sYW5kc2NhcGUoKQorIworIyBTZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gYXMgbGFuZHNjYXBlLgorIworc3ViIHNldF9sYW5kc2NhcGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X29yaWVudGF0aW9ufSA9IDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfcGFnZV92aWV3KCkKKyMKKyMgU2V0IHRoZSBwYWdlIHZpZXcgbW9kZSBmb3IgTWFjIEV4Y2VsLgorIworc3ViIHNldF9wYWdlX3ZpZXcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X3BhZ2Vfdmlld30gPSBkZWZpbmVkICRfWzBdID8gJF9bMF0gOiAxOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3RhYl9jb2xvcigpCisjCisjIFNldCB0aGUgY29sb3VyIG9mIHRoZSB3b3Jrc2hlZXQgY29sb3VyLgorIworc3ViIHNldF90YWJfY29sb3IgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisKKyAgICBteSAkY29sb3IgPSAmU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdDo6X2dldF9jb2xvcigkX1swXSk7CisgICAgICAgJGNvbG9yID0gMCBpZiAkY29sb3IgPT0gMHg3RkZGOyAjIERlZmF1bHQgY29sb3IuCisKKyAgICAkc2VsZi0+e190YWJfY29sb3J9ID0gJGNvbG9yOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3BhcGVyKCkKKyMKKyMgU2V0IHRoZSBwYXBlciB0eXBlLiBFeC4gMSA9IFVTIExldHRlciwgOSA9IEE0CisjCitzdWIgc2V0X3BhcGVyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19wYXBlcl9zaXplfSA9ICRfWzBdIHx8IDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfaGVhZGVyKCkKKyMKKyMgU2V0IHRoZSBwYWdlIGhlYWRlciBjYXB0aW9uIGFuZCBvcHRpb25hbCBtYXJnaW4uCisjCitzdWIgc2V0X2hlYWRlciB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkc3RyaW5nICAgPSAkX1swXSB8fCAnJzsKKyAgICBteSAkbWFyZ2luICAgPSAkX1sxXSB8fCAwLjUwOworICAgIG15ICRlbmNvZGluZyA9ICRfWzJdIHx8IDA7CisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBteSAkbGltaXQgICAgPSAkZW5jb2RpbmcgPyAyNTUgKjIgOiAyNTU7CisKKyAgICBpZiAobGVuZ3RoICRzdHJpbmcgPj0gJGxpbWl0KSB7CisgICAgICAgIGNhcnAgJ0hlYWRlciBzdHJpbmcgbXVzdCBiZSBsZXNzIHRoYW4gMjU1IGNoYXJhY3RlcnMnOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgJHNlbGYtPntfaGVhZGVyfSAgICAgICAgICA9ICRzdHJpbmc7CisgICAgJHNlbGYtPntfbWFyZ2luX2hlYWRlcn0gICA9ICRtYXJnaW47CisgICAgJHNlbGYtPntfaGVhZGVyX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9mb290ZXIoKQorIworIyBTZXQgdGhlIHBhZ2UgZm9vdGVyIGNhcHRpb24gYW5kIG9wdGlvbmFsIG1hcmdpbi4KKyMKK3N1YiBzZXRfZm9vdGVyIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRzdHJpbmcgICA9ICRfWzBdIHx8ICcnOworICAgIG15ICRtYXJnaW4gICA9ICRfWzFdIHx8IDAuNTA7CisgICAgbXkgJGVuY29kaW5nID0gJF9bMl0gfHwgMDsKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyaW5nKSkgeworICAgICAgICAgICAgJHN0cmluZyA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRzdHJpbmcpOworICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG15ICRsaW1pdCAgICA9ICRlbmNvZGluZyA/IDI1NSAqMiA6IDI1NTsKKworCisgICAgaWYgKGxlbmd0aCAkc3RyaW5nID49ICRsaW1pdCkgeworICAgICAgICBjYXJwICdGb290ZXIgc3RyaW5nIG11c3QgYmUgbGVzcyB0aGFuIDI1NSBjaGFyYWN0ZXJzJzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICRzZWxmLT57X2Zvb3Rlcn0gICAgICAgICAgPSAkc3RyaW5nOworICAgICRzZWxmLT57X21hcmdpbl9mb290ZXJ9ICAgPSAkbWFyZ2luOworICAgICRzZWxmLT57X2Zvb3Rlcl9lbmNvZGluZ30gPSAkZW5jb2Rpbmc7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjZW50ZXJfaG9yaXpvbnRhbGx5KCkKKyMKKyMgQ2VudGVyIHRoZSBwYWdlIGhvcml6b250YWxseS4KKyMKK3N1YiBjZW50ZXJfaG9yaXpvbnRhbGx5IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoZGVmaW5lZCAkX1swXSkgeworICAgICAgICAkc2VsZi0+e19oY2VudGVyfSA9ICRfWzBdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfaGNlbnRlcn0gPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNlbnRlcl92ZXJ0aWNhbGx5KCkKKyMKKyMgQ2VudGVyIHRoZSBwYWdlIGhvcml6b250YWxseS4KKyMKK3N1YiBjZW50ZXJfdmVydGljYWxseSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKGRlZmluZWQgJF9bMF0pIHsKKyAgICAgICAgJHNlbGYtPntfdmNlbnRlcn0gPSAkX1swXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X3ZjZW50ZXJ9ID0gMTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbWFyZ2lucygpCisjCisjIFNldCBhbGwgdGhlIHBhZ2UgbWFyZ2lucyB0byB0aGUgc2FtZSB2YWx1ZSBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbnMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5zZXRfbWFyZ2luX2xlZnQoJF9bMF0pOworICAgICRzZWxmLT5zZXRfbWFyZ2luX3JpZ2h0KCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl90b3AoJF9bMF0pOworICAgICRzZWxmLT5zZXRfbWFyZ2luX2JvdHRvbSgkX1swXSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbWFyZ2luc19MUigpCisjCisjIFNldCB0aGUgbGVmdCBhbmQgcmlnaHQgbWFyZ2lucyB0byB0aGUgc2FtZSB2YWx1ZSBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbnNfTFIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5zZXRfbWFyZ2luX2xlZnQoJF9bMF0pOworICAgICRzZWxmLT5zZXRfbWFyZ2luX3JpZ2h0KCRfWzBdKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5zX1RCKCkKKyMKKyMgU2V0IHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIHRvIHRoZSBzYW1lIHZhbHVlIGluIGluY2hlcy4KKyMKK3N1YiBzZXRfbWFyZ2luc19UQiB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPnNldF9tYXJnaW5fdG9wKCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9ib3R0b20oJF9bMF0pOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21hcmdpbl9sZWZ0KCkKKyMKKyMgU2V0IHRoZSBsZWZ0IG1hcmdpbiBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbl9sZWZ0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19tYXJnaW5fbGVmdH0gPSBkZWZpbmVkICRfWzBdID8gJF9bMF0gOiAwLjc1OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21hcmdpbl9yaWdodCgpCisjCisjIFNldCB0aGUgcmlnaHQgbWFyZ2luIGluIGluY2hlcy4KKyMKK3N1YiBzZXRfbWFyZ2luX3JpZ2h0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19tYXJnaW5fcmlnaHR9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMC43NTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5fdG9wKCkKKyMKKyMgU2V0IHRoZSB0b3AgbWFyZ2luIGluIGluY2hlcy4KKyMKK3N1YiBzZXRfbWFyZ2luX3RvcCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbWFyZ2luX3RvcH0gPSBkZWZpbmVkICRfWzBdID8gJF9bMF0gOiAxLjAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21hcmdpbl9ib3R0b20oKQorIworIyBTZXQgdGhlIGJvdHRvbSBtYXJnaW4gaW4gaW5jaGVzLgorIworc3ViIHNldF9tYXJnaW5fYm90dG9tIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19tYXJnaW5fYm90dG9tfSA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDEuMDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyByZXBlYXRfcm93cygkZmlyc3Rfcm93LCAkbGFzdF9yb3cpCisjCisjIFNldCB0aGUgcm93cyB0byByZXBlYXQgYXQgdGhlIHRvcCBvZiBlYWNoIHByaW50ZWQgcGFnZS4gU2VlIGFsc28gdGhlCisjIF9zdG9yZV9uYW1lX3h4eHgoKSBtZXRob2RzIGluIFdvcmtib29rLnBtLgorIworc3ViIHJlcGVhdF9yb3dzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e190aXRsZV9yb3dtaW59ICA9ICRfWzBdOworICAgICRzZWxmLT57X3RpdGxlX3Jvd21heH0gID0gJF9bMV0gfHwgJF9bMF07ICMgU2Vjb25kIHJvdyBpcyBvcHRpb25hbAorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcmVwZWF0X2NvbHVtbnMoJGZpcnN0X2NvbCwgJGxhc3RfY29sKQorIworIyBTZXQgdGhlIGNvbHVtbnMgdG8gcmVwZWF0IGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBlYWNoIHByaW50ZWQgcGFnZS4KKyMgU2VlIGFsc28gdGhlIF9zdG9yZV9uYW1lcygpIG1ldGhvZHMgaW4gV29ya2Jvb2sucG0uCisjCitzdWIgcmVwZWF0X2NvbHVtbnMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisKKyAgICAgICAgIyBSZXR1cm5lZCB2YWx1ZXMgJHJvdzEgYW5kICRyb3cyIGFyZW4ndCByZXF1aXJlZCBoZXJlLiBSZW1vdmUgdGhlbS4KKyAgICAgICAgc2hpZnQgIEBfOyAgICAgICAjICRyb3cxCisgICAgICAgIHNwbGljZSBAXywgMSwgMTsgIyAkcm93MgorICAgIH0KKworICAgICRzZWxmLT57X3RpdGxlX2NvbG1pbn0gID0gJF9bMF07CisgICAgJHNlbGYtPntfdGl0bGVfY29sbWF4fSAgPSAkX1sxXSB8fCAkX1swXTsgIyBTZWNvbmQgY29sIGlzIG9wdGlvbmFsCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwcmludF9hcmVhKCRmaXJzdF9yb3csICRmaXJzdF9jb2wsICRsYXN0X3JvdywgJGxhc3RfY29sKQorIworIyBTZXQgdGhlIGFyZWEgb2YgZWFjaCB3b3Jrc2hlZXQgdGhhdCB3aWxsIGJlIHByaW50ZWQuIFNlZSBhbHNvIHRoZQorIyBfc3RvcmVfbmFtZXMoKSBtZXRob2RzIGluIFdvcmtib29rLnBtLgorIworc3ViIHByaW50X2FyZWEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgcmV0dXJuIGlmIEBfICE9IDQ7ICMgUmVxdWlyZSA0IHBhcmFtZXRlcnMKKworICAgICRzZWxmLT57X3ByaW50X3Jvd21pbn0gPSAkX1swXTsKKyAgICAkc2VsZi0+e19wcmludF9jb2xtaW59ID0gJF9bMV07CisgICAgJHNlbGYtPntfcHJpbnRfcm93bWF4fSA9ICRfWzJdOworICAgICRzZWxmLT57X3ByaW50X2NvbG1heH0gPSAkX1szXTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGF1dG9maWx0ZXIoJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wpCisjCisjIFNldCB0aGUgYXV0b2ZpbHRlciBhcmVhIGluIHRoZSB3b3Jrc2hlZXQuCisjCitzdWIgYXV0b2ZpbHRlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWYgQF8gIT0gNDsgIyBSZXF1aXJlIDQgcGFyYW1ldGVycworCisgICAgbXkgKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyKSA9IEBfOworCisgICAgIyBSZXZlcnNlIG1heCBhbmQgbWluIHZhbHVlcyBpZiBuZWNlc3NhcnkuCisgICAgKCRyb3cxLCAkcm93MikgPSAoJHJvdzIsICRyb3cxKSBpZiAkcm93MiA8ICRyb3cxOworICAgICgkY29sMSwgJGNvbDIpID0gKCRjb2wyLCAkY29sMSkgaWYgJGNvbDIgPCAkY29sMTsKKworICAgICMgU3RvcmUgdGhlIEF1dG9maWx0ZXIgaW5mb3JtYXRpb24KKyAgICAkc2VsZi0+e19maWx0ZXJfYXJlYX0gID0gWyRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyXTsKKyAgICAkc2VsZi0+e19maWx0ZXJfY291bnR9ID0gMSsgJGNvbDIgLSRjb2wxOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZmlsdGVyX2NvbHVtbigkY29sdW1uLCAkY3JpdGVyaWEsIC4uLikKKyMKKyMgU2V0IHRoZSBjb2x1bW4gZmlsdGVyIGNyaXRlcmlhLgorIworc3ViIGZpbHRlcl9jb2x1bW4geworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGNvbCAgICAgICAgID0gJF9bMF07CisgICAgbXkgJGV4cHJlc3Npb24gID0gJF9bMV07CisKKworICAgIGNyb2FrICJNdXN0IGNhbGwgYXV0b2ZpbHRlcigpIGJlZm9yZSBmaWx0ZXJfY29sdW1uKCkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzICRzZWxmLT57X2ZpbHRlcl9jb3VudH07CisgICAgY3JvYWsgIkluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGZpbHRlcl9jb2x1bW4oKSIgdW5sZXNzIEBfID09IDI7CisKKworICAgICMgQ2hlY2sgZm9yIGEgY29sdW1uIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZS4KKyAgICBpZiAoJGNvbCA9fiAvXlxELykgeworICAgICAgICAjIENvbnZlcnQgY29sIHJlZiB0byBhIGNlbGwgcmVmIGFuZCB0aGVuIHRvIGEgY29sIG51bWJlci4KKyAgICAgICAgKHVuZGVmLCAkY29sKSA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKCRjb2wgLiAnMScpOworICAgIH0KKworICAgIG15ICh1bmRlZiwgdW5kZWYsICRjb2xfZmlyc3QsICRjb2xfbGFzdCkgPSBAeyRzZWxmLT57X2ZpbHRlcl9hcmVhfX07CisKKyAgICAjIFJlamVjdCBjb2x1bW4gaWYgaXQgaXMgb3V0c2lkZSBmaWx0ZXIgcmFuZ2UuCisgICAgaWYgKCRjb2wgPCAkY29sX2ZpcnN0IG9yICRjb2wgPiAkY29sX2xhc3QpIHsKKyAgICAgICAgY3JvYWsgIkNvbHVtbiAnJGNvbCcgb3V0c2lkZSBhdXRvZmlsdGVyKCkgY29sdW1uIHJhbmdlICIgLgorICAgICAgICAgICAgICAiKCRjb2xfZmlyc3QgLi4gJGNvbF9sYXN0KSI7CisgICAgfQorCisKKyAgICBteSBAdG9rZW5zID0gJHNlbGYtPl9leHRyYWN0X2ZpbHRlcl90b2tlbnMoJGV4cHJlc3Npb24pOworCisgICAgY3JvYWsgIkluY29ycmVjdCBudW1iZXIgb2YgdG9rZW5zIGluIGV4cHJlc3Npb24gJyRleHByZXNzaW9uJyIKKyAgICAgICAgICB1bmxlc3MgKEB0b2tlbnMgPT0gMyBvciBAdG9rZW5zID09IDcpOworCisKKyAgICBAdG9rZW5zID0gJHNlbGYtPl9wYXJzZV9maWx0ZXJfZXhwcmVzc2lvbigkZXhwcmVzc2lvbiwgQHRva2Vucyk7CisKKyAgICAkc2VsZi0+e19maWx0ZXJfY29sc30tPnskY29sfSA9IFtAdG9rZW5zXTsKKyAgICAkc2VsZi0+e19maWx0ZXJfb259ICAgICAgICAgICA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZXh0cmFjdF9maWx0ZXJfdG9rZW5zKCRleHByZXNzaW9uKQorIworIyBFeHRyYWN0IHRoZSB0b2tlbnMgZnJvbSB0aGUgZmlsdGVyIGV4cHJlc3Npb24uIFRoZSB0b2tlbnMgYXJlIG1haW5seSBub24tCisjIHdoaXRlc3BhY2UgZ3JvdXBzLiBUaGUgb25seSB0cmlja3kgcGFydCBpcyB0byBleHRyYWN0IHN0cmluZyB0b2tlbnMgdGhhdAorIyBjb250YWluIHdoaXRlc3BhY2UgYW5kL29yIHF1b3RlZCBkb3VibGUgcXVvdGVzIChFeGNlbCdzIGVzY2FwZWQgcXVvdGVzKS4KKyMKKyMgRXhhbXBsZXM6ICd4IDwgIDIwMDAnCisjICAgICAgICAgICAneCA+ICAyMDAwIGFuZCB4IDwgIDUwMDAnCisjICAgICAgICAgICAneCA9ICJmb28iJworIyAgICAgICAgICAgJ3ggPSAiZm9vIGJhciInCisjICAgICAgICAgICAneCA9ICJmb28gIiIgYmFyIicKKyMKK3N1YiBfZXh0cmFjdF9maWx0ZXJfdG9rZW5zIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRleHByZXNzaW9uICA9ICRfWzBdOworCisgICAgcmV0dXJuIHVubGVzcyAkZXhwcmVzc2lvbjsKKworICAgIG15IEB0b2tlbnMgPSAoJGV4cHJlc3Npb24gID1+IC8iKD86W14iXXwiIikqInxcUysvZyk7ICMiCisKKyAgICAjIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBxdW90ZXMgYW5kIHVuZXNjYXBlIG90aGVyIHF1b3RlcworICAgIGZvciAoQHRva2VucykgeworICAgICAgICBzL14iLy87ICAgICAjIgorICAgICAgICBzLyIkLy87ICAgICAjIgorICAgICAgICBzLyIiLyIvZzsgICAjIgorICAgIH0KKworICAgIHJldHVybiBAdG9rZW5zOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhcnNlX2ZpbHRlcl9leHByZXNzaW9uKEB0b2tlbikKKyMKKyMgQ29udmVydHMgdGhlIHRva2VucyBvZiBhIHBvc3NpYmx5IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaW50byAxIG9yIDIKKyMgc3ViIGV4cHJlc3Npb25zIGZvciBmdXJ0aGVyIHBhcnNpbmcuCisjCisjIEV4YW1wbGVzOgorIyAgICAgICAgICAoJ3gnLCAnPT0nLCAyMDAwKSAtPiBleHAxCisjICAgICAgICAgICgneCcsICc+JywgIDIwMDAsICdhbmQnLCAneCcsICc8JywgNTAwMCkgLT4gZXhwMSBhbmQgZXhwMgorIworc3ViIF9wYXJzZV9maWx0ZXJfZXhwcmVzc2lvbiB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXhwcmVzc2lvbiAgPSBzaGlmdDsKKyAgICBteSBAdG9rZW5zICAgICAgPSBAXzsKKworICAgICMgVGhlIG51bWJlciBvZiB0b2tlbnMgd2lsbCBiZSBlaXRoZXIgMyAoZm9yIDEgZXhwcmVzc2lvbikKKyAgICAjIG9yIDcgKGZvciAyICBleHByZXNzaW9ucykuCisgICAgIworICAgIGlmIChAdG9rZW5zID09IDcpIHsKKworICAgICAgICBteSAkY29uZGl0aW9uYWwgPSAkdG9rZW5zWzNdOworCisgICAgICAgIGlmICAgICgkY29uZGl0aW9uYWwgPX4gL14oYW5kfCYmKSQvKSB7CisgICAgICAgICAgICAkY29uZGl0aW9uYWwgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkY29uZGl0aW9uYWwgPX4gL14ob3J8XHxcfCkkLykgeworICAgICAgICAgICAgJGNvbmRpdGlvbmFsID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNyb2FrICJUb2tlbiAnJGNvbmRpdGlvbmFsJyBpcyBub3QgYSB2YWxpZCBjb25kaXRpb25hbCAiIC4KKyAgICAgICAgICAgICAgICAgICJpbiBmaWx0ZXIgZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nIjsKKyAgICAgICAgfQorCisgICAgICAgIG15IEBleHByZXNzaW9uXzEgPSAkc2VsZi0+X3BhcnNlX2ZpbHRlcl90b2tlbnMoJGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHRva2Vuc1swLCAxLCAyXSk7CisgICAgICAgIG15IEBleHByZXNzaW9uXzIgPSAkc2VsZi0+X3BhcnNlX2ZpbHRlcl90b2tlbnMoJGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHRva2Vuc1s0LCA1LCA2XSk7CisKKyAgICAgICAgcmV0dXJuIChAZXhwcmVzc2lvbl8xLCAkY29uZGl0aW9uYWwsIEBleHByZXNzaW9uXzIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT5fcGFyc2VfZmlsdGVyX3Rva2VucygkZXhwcmVzc2lvbiwgQHRva2Vucyk7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhcnNlX2ZpbHRlcl90b2tlbnMoQHRva2VuKQorIworIyBQYXJzZSB0aGUgMyB0b2tlbnMgb2YgYSBmaWx0ZXIgZXhwcmVzc2lvbiBhbmQgcmV0dXJuIHRoZSBvcGVyYXRvciBhbmQgdG9rZW4uCisjCitzdWIgX3BhcnNlX2ZpbHRlcl90b2tlbnMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGV4cHJlc3Npb24gID0gc2hpZnQ7CisgICAgbXkgQHRva2VucyAgICAgID0gQF87CisKKyAgICBteSAlb3BlcmF0b3JzID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgJz09JyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgJz0nICA9PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgJz1+JyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2VxJyA9PiAyLAorCisgICAgICAgICAgICAgICAgICAgICAgICAnIT0nID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAnIX4nID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAnbmUnID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAnPD4nID0+IDUsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICc8JyAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICc8PScgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICc+JyAgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICc+PScgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIG15ICRvcGVyYXRvciA9ICRvcGVyYXRvcnN7JHRva2Vuc1sxXX07CisgICAgbXkgJHRva2VuICAgID0gJHRva2Vuc1syXTsKKworCisgICAgIyBTcGVjaWFsIGhhbmRsaW5nIG9mICJUb3AiIGZpbHRlciBleHByZXNzaW9ucy4KKyAgICBpZiAoJHRva2Vuc1swXSA9fiAvXnRvcHxib3R0b20kL2kpIHsKKworICAgICAgICBteSAkdmFsdWUgPSAkdG9rZW5zWzFdOworCisgICAgICAgIGlmICgkdmFsdWUgPX4gL1xELyBvcgorICAgICAgICAgICAgJHZhbHVlIDwgMSAgICAgb3IKKyAgICAgICAgICAgICR2YWx1ZSA+IDUwMCkKKyAgICAgICAgeworICAgICAgICAgICAgY3JvYWsgIlRoZSB2YWx1ZSAnJHZhbHVlJyBpbiBleHByZXNzaW9uICckZXhwcmVzc2lvbicgIiAuCisgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgaW4gdGhlIHJhbmdlIDEgdG8gNTAwIjsKKyAgICAgICAgfQorCisgICAgICAgICR0b2tlbiA9IGxjICR0b2tlbjsKKworICAgICAgICBpZiAoJHRva2VuIG5lICdpdGVtcycgYW5kICR0b2tlbiBuZSAnJScpIHsKKyAgICAgICAgICAgIGNyb2FrICJUaGUgdHlwZSAnJHRva2VuJyBpbiBleHByZXNzaW9uICckZXhwcmVzc2lvbicgIiAuCisgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgZWl0aGVyICdpdGVtcycgb3IgJyUnIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdG9rZW5zWzBdID1+IC9edG9wJC9pKSB7CisgICAgICAgICAgICAkb3BlcmF0b3IgPSAzMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRvcGVyYXRvciA9IDMyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0b2tlbnNbMl0gZXEgJyUnKSB7CisgICAgICAgICAgICAkb3BlcmF0b3IrKzsKKyAgICAgICAgfQorCisgICAgICAgICR0b2tlbiAgICA9ICR2YWx1ZTsKKyAgICB9CisKKworICAgIGlmIChub3QgJG9wZXJhdG9yIGFuZCAkdG9rZW5zWzBdKSB7CisgICAgICAgIGNyb2FrICJUb2tlbiAnJHRva2Vuc1sxXScgaXMgbm90IGEgdmFsaWQgb3BlcmF0b3IgIiAuCisgICAgICAgICAgICAgICJpbiBmaWx0ZXIgZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nIjsKKyAgICB9CisKKworICAgICMgU3BlY2lhbCBoYW5kbGluZyBmb3IgQmxhbmtzL05vbkJsYW5rcy4KKyAgICBpZiAoJHRva2VuID1+IC9eYmxhbmtzfG5vbmJsYW5rcyQvaSkgeworCisgICAgICAgICMgT25seSBhbGxvdyBFcXVhbHMgb3IgTm90RXF1YWwgaW4gdGhpcyBjb250ZXh0LgorICAgICAgICBpZiAoJG9wZXJhdG9yICE9IDIgYW5kICRvcGVyYXRvciAhPSA1KSB7CisgICAgICAgICAgICBjcm9hayAiVGhlIG9wZXJhdG9yICckdG9rZW5zWzFdJyBpbiBleHByZXNzaW9uICckZXhwcmVzc2lvbicgIiAuCisgICAgICAgICAgICAgICAgICAgImlzIG5vdCB2YWxpZCBpbiByZWxhdGlvbiB0byBCbGFua3MvTm9uQmxhbmtzJyI7CisgICAgICAgIH0KKworICAgICAgICAkdG9rZW4gPSBsYyAkdG9rZW47CisKKyAgICAgICAgIyBUaGUgb3BlcmF0b3Igc2hvdWxkIGFsd2F5cyBiZSAyICg9KSB0byBmbGFnIGEgInNpbXBsZSIgZXF1YWxpdHkgaW4KKyAgICAgICAgIyB0aGUgYmluYXJ5IHJlY29yZC4gVGhlcmVmb3JlIHdlIGNvbnZlcnQgPD4gdG8gPS4KKyAgICAgICAgaWYgKCR0b2tlbiBlcSAnYmxhbmtzJykgeworICAgICAgICAgICAgaWYgKCRvcGVyYXRvciA9PSA1KSB7CisgICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gMjsKKyAgICAgICAgICAgICAgICAkdG9rZW4gICAgPSAnbm9uYmxhbmtzJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkb3BlcmF0b3IgPT0gNSkgeworICAgICAgICAgICAgICAgICRvcGVyYXRvciA9IDI7CisgICAgICAgICAgICAgICAgJHRva2VuICAgID0gJ2JsYW5rcyc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgaWYgdGhlIHN0cmluZyB0b2tlbiBjb250YWlucyBhbiBFeGNlbCBtYXRjaCBjaGFyYWN0ZXIgdGhlbiBjaGFuZ2UgdGhlCisgICAgIyBvcGVyYXRvciB0eXBlIHRvIGluZGljYXRlIGEgbm9uICJzaW1wbGUiIGVxdWFsaXR5LgorICAgIGlmICgkb3BlcmF0b3IgPT0gMiBhbmQgJHRva2VuID1+IC9bKj9dLykgeworICAgICAgICAkb3BlcmF0b3IgPSAyMjsKKyAgICB9CisKKworICAgIHJldHVybiAoJG9wZXJhdG9yLCAkdG9rZW4pOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgaGlkZV9ncmlkbGluZXMoKQorIworIyBTZXQgdGhlIG9wdGlvbiB0byBoaWRlIGdyaWRsaW5lcyBvbiB0aGUgc2NyZWVuIGFuZCB0aGUgcHJpbnRlZCBwYWdlLgorIyBUaGVyZSBhcmUgdHdvIHdheXMgb2YgZG9pbmcgdGhpcyBpbiB0aGUgRXhjZWwgQklGRiBmb3JtYXQ6IFRoZSBmaXJzdCBpcyBieQorIyBzZXR0aW5nIHRoZSBEc3BHcmlkIGZpZWxkIG9mIHRoZSBXSU5ET1cyIHJlY29yZCwgdGhpcyB0dXJucyBvZmYgdGhlIHNjcmVlbgorIyBhbmQgc3Vic2VxdWVudGx5IHRoZSBwcmludCBncmlkbGluZS4gVGhlIHNlY29uZCBtZXRob2QgaXMgdG8gdmlhIHRoZQorIyBQUklOVEdSSURMSU5FUyBhbmQgR1JJRFNFVCByZWNvcmRzLCB0aGlzIHR1cm5zIG9mZiB0aGUgcHJpbnRlZCBncmlkbGluZXMKKyMgb25seS4gVGhlIGZpcnN0IG1ldGhvZCBpcyBwcm9iYWJseSBzdWZmaWNpZW50IGZvciBtb3N0IGNhc2VzLiBUaGUgc2Vjb25kCisjIG1ldGhvZCBpcyBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBQb3J0ZXJzIHRha2Ugbm90ZS4KKyMKK3N1YiBoaWRlX2dyaWRsaW5lcyB7CisKKyAgICBteSAkc2VsZiAgID0gc2hpZnQ7CisgICAgbXkgJG9wdGlvbiA9ICRfWzBdOworCisgICAgJG9wdGlvbiA9IDEgdW5sZXNzIGRlZmluZWQgJG9wdGlvbjsgIyBEZWZhdWx0IHRvIGhpZGluZyBwcmludGVkIGdyaWRsaW5lcworCisgICAgaWYgKCRvcHRpb24gPT0gMCkgeworICAgICAgICAkc2VsZi0+e19wcmludF9ncmlkbGluZXN9ICA9IDE7ICMgMSA9IGRpc3BsYXksIDAgPSBoaWRlCisgICAgICAgICRzZWxmLT57X3NjcmVlbl9ncmlkbGluZXN9ID0gMTsKKyAgICB9CisgICAgZWxzaWYgKCRvcHRpb24gPT0gMSkgeworICAgICAgICAkc2VsZi0+e19wcmludF9ncmlkbGluZXN9ICA9IDA7CisgICAgICAgICRzZWxmLT57X3NjcmVlbl9ncmlkbGluZXN9ID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X3ByaW50X2dyaWRsaW5lc30gID0gMDsKKyAgICAgICAgJHNlbGYtPntfc2NyZWVuX2dyaWRsaW5lc30gPSAwOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHByaW50X3Jvd19jb2xfaGVhZGVycygpCisjCisjIFNldCB0aGUgb3B0aW9uIHRvIHByaW50IHRoZSByb3cgYW5kIGNvbHVtbiBoZWFkZXJzIG9uIHRoZSBwcmludGVkIHBhZ2UuCisjIFNlZSBhbHNvIHRoZSBfc3RvcmVfcHJpbnRfaGVhZGVycygpIG1ldGhvZCBiZWxvdy4KKyMKK3N1YiBwcmludF9yb3dfY29sX2hlYWRlcnMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmIChkZWZpbmVkICRfWzBdKSB7CisgICAgICAgICRzZWxmLT57X3ByaW50X2hlYWRlcnN9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19wcmludF9oZWFkZXJzfSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZml0X3RvX3BhZ2VzKCR3aWR0aCwgJGhlaWdodCkKKyMKKyMgU3RvcmUgdGhlIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIG51bWJlciBvZiBwYWdlcyB0aGF0IHdpbGwgZGVmaW5lIHRoZQorIyBtYXhpbXVtIGFyZWEgcHJpbnRlZC4gU2VlIGFsc28gX3N0b3JlX3NldHVwKCkgYW5kIF9zdG9yZV93c2Jvb2woKSBiZWxvdy4KKyMKK3N1YiBmaXRfdG9fcGFnZXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2ZpdF9wYWdlfSAgICAgID0gMTsKKyAgICAkc2VsZi0+e19maXRfd2lkdGh9ICAgICA9ICRfWzBdIHx8IDA7CisgICAgJHNlbGYtPntfZml0X2hlaWdodH0gICAgPSAkX1sxXSB8fCAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2hfcGFnZWJyZWFrcyhAYnJlYWtzKQorIworIyBTdG9yZSB0aGUgaG9yaXpvbnRhbCBwYWdlIGJyZWFrcyBvbiBhIHdvcmtzaGVldC4KKyMKK3N1YiBzZXRfaF9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfaGJyZWFrc319LCBAXzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF92X3BhZ2VicmVha3MoQGJyZWFrcykKKyMKKyMgU3RvcmUgdGhlIHZlcnRpY2FsIHBhZ2UgYnJlYWtzIG9uIGEgd29ya3NoZWV0LgorIworc3ViIHNldF92X3BhZ2VicmVha3MgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHB1c2ggQHskc2VsZi0+e192YnJlYWtzfX0sIEBfOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3pvb20oJHNjYWxlKQorIworIyBTZXQgdGhlIHdvcmtzaGVldCB6b29tIGZhY3Rvci4KKyMKK3N1YiBzZXRfem9vbSB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkc2NhbGUgPSAkX1swXSB8fCAxMDA7CisKKyAgICAjIENvbmZpbmUgdGhlIHNjYWxlIHRvIEV4Y2VsJ3MgcmFuZ2UKKyAgICBpZiAoJHNjYWxlIDwgMTAgb3IgJHNjYWxlID4gNDAwKSB7CisgICAgICAgIGNhcnAgIlpvb20gZmFjdG9yICRzY2FsZSBvdXRzaWRlIHJhbmdlOiAxMCA8PSB6b29tIDw9IDQwMCI7CisgICAgICAgICRzY2FsZSA9IDEwMDsKKyAgICB9CisKKyAgICAkc2VsZi0+e196b29tfSA9IGludCAkc2NhbGU7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfcHJpbnRfc2NhbGUoJHNjYWxlKQorIworIyBTZXQgdGhlIHNjYWxlIGZhY3RvciBmb3IgdGhlIHByaW50ZWQgcGFnZS4KKyMKK3N1YiBzZXRfcHJpbnRfc2NhbGUgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJHNjYWxlID0gJF9bMF0gfHwgMTAwOworCisgICAgIyBDb25maW5lIHRoZSBzY2FsZSB0byBFeGNlbCdzIHJhbmdlCisgICAgaWYgKCRzY2FsZSA8IDEwIG9yICRzY2FsZSA+IDQwMCkgeworICAgICAgICBjYXJwICJQcmludCBzY2FsZSAkc2NhbGUgb3V0c2lkZSByYW5nZTogMTAgPD0gem9vbSA8PSA0MDAiOworICAgICAgICAkc2NhbGUgPSAxMDA7CisgICAgfQorCisgICAgIyBUdXJuIG9mZiAiZml0IHRvIHBhZ2UiIG9wdGlvbgorICAgICRzZWxmLT57X2ZpdF9wYWdlfSAgICA9IDA7CisKKyAgICAkc2VsZi0+e19wcmludF9zY2FsZX0gPSBpbnQgJHNjYWxlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMga2VlcF9sZWFkaW5nX3plcm9zKCkKKyMKKyMgQ2F1c2VzIHRoZSB3cml0ZSgpIG1ldGhvZCB0byB0cmVhdCBpbnRlZ2VycyB3aXRoIGEgbGVhZGluZyB6ZXJvIGFzIGEgc3RyaW5nLgorIyBUaGlzIGVuc3VyZXMgdGhhdCBhbnkgbGVhZGluZyB6ZXJvcyBzdWNoLCBhcyBpbiB6aXAgY29kZXMsIGFyZSBtYWludGFpbmVkLgorIworc3ViIGtlZXBfbGVhZGluZ196ZXJvcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKGRlZmluZWQgJF9bMF0pIHsKKyAgICAgICAgJHNlbGYtPntfbGVhZGluZ196ZXJvc30gPSAkX1swXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X2xlYWRpbmdfemVyb3N9ID0gMTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzaG93X2NvbW1lbnRzKCkKKyMKKyMgTWFrZSBhbnkgY29tbWVudHMgaW4gdGhlIHdvcmtzaGVldCB2aXNpYmxlLgorIworc3ViIHNob3dfY29tbWVudHMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2NvbW1lbnRzX3Zpc2libGV9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9jb21tZW50c19hdXRob3IoKQorIworIyBTZXQgdGhlIGRlZmF1bHQgYXV0aG9yIG9mIHRoZSBjZWxsIGNvbW1lbnRzLgorIworc3ViIHNldF9jb21tZW50c19hdXRob3IgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2NvbW1lbnRzX2F1dGhvcn0gICAgID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogJyc7CisgICAgJHNlbGYtPntfY29tbWVudHNfYXV0aG9yX2VuY30gPSAgICAgICAgICRfWzFdID8gMSAgICAgOiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcmlnaHRfdG9fbGVmdCgpCisjCisjIERpc3BsYXkgdGhlIHdvcmtzaGVldCByaWdodCB0byBsZWZ0IGZvciBzb21lIGVhc3Rlcm4gdmVyc2lvbnMgb2YgRXhjZWwuCisjCitzdWIgcmlnaHRfdG9fbGVmdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfZGlzcGxheV9hcmFiaWN9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGhpZGVfemVybygpCisjCisjIEhpZGUgY2VsbCB6ZXJvIHZhbHVlcy4KKyMKK3N1YiBoaWRlX3plcm8geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2Rpc3BsYXlfemVyb3N9ID0gZGVmaW5lZCAkX1swXSA/IG5vdCAkX1swXSA6IDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwcmludF9hY3Jvc3MoKQorIworIyBTZXQgdGhlIG9yZGVyIGluIHdoaWNoIHBhZ2VzIGFyZSBwcmludGVkLgorIworc3ViIHByaW50X2Fjcm9zcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfcGFnZV9vcmRlcn0gPSBkZWZpbmVkICRfWzBdID8gJF9bMF0gOiAxOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3N0YXJ0X3BhZ2UoKQorIworIyBTZXQgdGhlIHN0YXJ0IHBhZ2UgbnVtYmVyLgorIworc3ViIHNldF9zdGFydF9wYWdlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRfWzBdOworCisgICAgJHNlbGYtPntfcGFnZV9zdGFydH0gICAgPSAkX1swXTsKKyAgICAkc2VsZi0+e19jdXN0b21fc3RhcnR9ICA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfZmlyc3Rfcm93X2NvbHVtbigpCisjCisjIFNldCB0aGUgdG9wbW9zdCBhbmQgbGVmdG1vc3QgdmlzaWJsZSByb3cgYW5kIGNvbHVtbi4KKyMgVE9ETzogRG9jdW1lbnQgdGhpcyB3aGVuIHRlc3RlZCBmdWxseSBmb3IgaW50ZXJhY3Rpb24gd2l0aCBwYW5lcy4KKyMKK3N1YiBzZXRfZmlyc3Rfcm93X2NvbHVtbiB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJvdyAgPSAkX1swXSB8fCAwOworICAgIG15ICRjb2wgID0gJF9bMV0gfHwgMDsKKworICAgICRyb3cgPSA2NTUzNSBpZiAkcm93ID4gNjU1MzU7CisgICAgJGNvbCA9IDI1NSAgIGlmICRjb2wgPiAyNTU7CisKKyAgICAkc2VsZi0+e19maXJzdF9yb3d9ID0gJHJvdzsKKyAgICAkc2VsZi0+e19maXJzdF9jb2x9ID0gJGNvbDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFkZF93cml0ZV9oYW5kbGVyKCRyZSwgJGNvZGVfcmVmKQorIworIyBBbGxvdyB0aGUgdXNlciB0byBhZGQgdGhlaXIgb3duIG1hdGNoZXMgYW5kIGhhbmRsZXJzIHRvIHRoZSB3cml0ZSgpIG1ldGhvZC4KKyMKK3N1YiBhZGRfd3JpdGVfaGFuZGxlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVubGVzcyBAXyA9PSAyOworICAgIHJldHVybiB1bmxlc3MgcmVmICRfWzFdIGVxICdDT0RFJzsKKworICAgIHB1c2ggQHskc2VsZi0+e193cml0ZV9tYXRjaH19LCBbIEBfIF07Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlKCRyb3csICRjb2wsICR0b2tlbiwgJGZvcm1hdCkKKyMKKyMgUGFyc2UgJHRva2VuIGFuZCBjYWxsIGFwcHJvcHJpYXRlIHdyaXRlIG1ldGhvZC4gJHJvdyBhbmQgJGNvbHVtbiBhcmUgemVybworIyBpbmRleGVkLiAkZm9ybWF0IGlzIG9wdGlvbmFsLgorIworIyBUaGUgd3JpdGVfdXJsKCkgbWV0aG9kcyBoYXZlIGEgZmxhZyB0byBwcmV2ZW50IHJlY3Vyc2lvbiB3aGVuIHdyaXRpbmcgYQorIyBzdHJpbmcgdGhhdCBsb29rcyBsaWtlIGEgdXJsLgorIworIyBSZXR1cm5zOiByZXR1cm4gdmFsdWUgb2YgY2FsbGVkIHN1YnJvdXRpbmUKKyMKK3N1YiB3cml0ZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBteSAkdG9rZW4gPSAkX1syXTsKKworICAgICMgSGFuZGxlIHVuZGVmcyBhcyBibGFua3MKKyAgICAkdG9rZW4gPSAnJyB1bmxlc3MgZGVmaW5lZCAkdG9rZW47CisKKworICAgICMgRmlyc3QgdHJ5IHVzZXIgZGVmaW5lZCBtYXRjaGVzLgorICAgIGZvciBteSAkYXJlZiAoQHskc2VsZi0+e193cml0ZV9tYXRjaH19KSB7CisgICAgICAgIG15ICRyZSAgPSAkYXJlZi0+WzBdOworICAgICAgICBteSAkc3ViID0gJGFyZWYtPlsxXTsKKworICAgICAgICBpZiAoJHRva2VuID1+IC8kcmUvKSB7CisgICAgICAgICAgICBteSAkbWF0Y2ggPSAmJHN1Yigkc2VsZiwgQF8pOworICAgICAgICAgICAgcmV0dXJuICRtYXRjaCBpZiBkZWZpbmVkICRtYXRjaDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBNYXRjaCBhbiBhcnJheSByZWYuCisgICAgaWYgKHJlZiAkdG9rZW4gZXEgIkFSUkFZIikgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3JvdyhAXyk7CisgICAgfQorICAgICMgTWF0Y2ggaW50ZWdlciB3aXRoIGxlYWRpbmcgemVybyhzKQorICAgIGVsc2lmICgkc2VsZi0+e19sZWFkaW5nX3plcm9zfSBhbmQgJHRva2VuID1+IC9eMFxkKyQvKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfc3RyaW5nKEBfKTsKKyAgICB9CisgICAgIyBNYXRjaCBudW1iZXIKKyAgICBlbHNpZiAoJHRva2VuID1+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfbnVtYmVyKEBfKTsKKyAgICB9CisgICAgIyBNYXRjaCBodHRwLCBodHRwcyBvciBmdHAgVVJMCisgICAgZWxzaWYgKCR0b2tlbiA9fiBtfF5bZmhddHQ/cHM/Oi8vfCAgICBhbmQgbm90ICRzZWxmLT57X3dyaXRpbmdfdXJsfSkgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3VybChAXyk7CisgICAgfQorICAgICMgTWF0Y2ggbWFpbHRvOgorICAgIGVsc2lmICgkdG9rZW4gPX4gbS9ebWFpbHRvOi8gICAgICAgICAgYW5kIG5vdCAkc2VsZi0+e193cml0aW5nX3VybH0pIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV91cmwoQF8pOworICAgIH0KKyAgICAjIE1hdGNoIGludGVybmFsIG9yIGV4dGVybmFsIHNoZWV0IGxpbmsKKyAgICBlbHNpZiAoJHRva2VuID1+IG1bXig/OmlufGV4KXRlcm5hbDpdIGFuZCBub3QgJHNlbGYtPntfd3JpdGluZ191cmx9KSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfdXJsKEBfKTsKKyAgICB9CisgICAgIyBNYXRjaCBmb3JtdWxhCisgICAgZWxzaWYgKCR0b2tlbiA9fiAvXj0vKSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfZm9ybXVsYShAXyk7CisgICAgfQorICAgICMgTWF0Y2ggYmxhbmsKKyAgICBlbHNpZiAoJHRva2VuIGVxICcnKSB7CisgICAgICAgIHNwbGljZSBAXywgMiwgMTsgIyByZW1vdmUgdGhlIGVtcHR5IHN0cmluZyBmcm9tIHRoZSBwYXJhbWV0ZXIgbGlzdAorICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX2JsYW5rKEBfKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfc3RyaW5nKEBfKTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9yb3coJHJvdywgJGNvbCwgJGFycmF5X3JlZiwgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSByb3cgb2YgZGF0YSBzdGFydGluZyBmcm9tICgkcm93LCAkY29sKS4gQ2FsbCB3cml0ZV9jb2woKSBpZiBhbnkgb2YKKyMgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSByZWYgYXJlIGluIHR1cm4gYXJyYXkgcmVmcy4gVGhpcyBhbGxvd3MgdGhlIHdyaXRpbmcKKyMgb2YgMUQgb3IgMkQgYXJyYXlzIG9mIGRhdGEgaW4gb25lIGdvLgorIworIyBSZXR1cm5zOiB0aGUgZmlyc3QgZW5jb3VudGVyZWQgZXJyb3IgdmFsdWUgb3IgemVybyBmb3Igbm8gZXJyb3JzCisjCitzdWIgd3JpdGVfcm93IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgIyBDYXRjaCBub24gYXJyYXkgcmVmcyBwYXNzZWQgYnkgdXNlci4KKyAgICBpZiAocmVmICRfWzJdIG5lICdBUlJBWScpIHsKKyAgICAgICAgY3JvYWsgIk5vdCBhbiBhcnJheSByZWYgaW4gY2FsbCB0byB3cml0ZV9yb3coKSQhIjsKKyAgICB9CisKKyAgICBteSAkcm93ICAgICA9IHNoaWZ0OworICAgIG15ICRjb2wgICAgID0gc2hpZnQ7CisgICAgbXkgJHRva2VucyAgPSBzaGlmdDsKKyAgICBteSBAb3B0aW9ucyA9IEBfOworICAgIG15ICRlcnJvciAgID0gMDsKKyAgICBteSAkcmV0OworCisgICAgZm9yZWFjaCBteSAkdG9rZW4gKEAkdG9rZW5zKSB7CisKKyAgICAgICAgIyBDaGVjayBmb3IgbmVzdGVkIGFycmF5cworICAgICAgICBpZiAocmVmICR0b2tlbiBlcSAiQVJSQVkiKSB7CisgICAgICAgICAgICAkcmV0ID0gJHNlbGYtPndyaXRlX2NvbCgkcm93LCAkY29sLCAkdG9rZW4sIEBvcHRpb25zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRyZXQgPSAkc2VsZi0+d3JpdGUgICAgKCRyb3csICRjb2wsICR0b2tlbiwgQG9wdGlvbnMpOworICAgICAgICB9CisKKyAgICAgICAgIyBSZXR1cm4gb25seSB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQsIGlmIGFueS4KKyAgICAgICAgJGVycm9yIHx8PSAkcmV0OworICAgICAgICAkY29sKys7CisgICAgfQorCisgICAgcmV0dXJuICRlcnJvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX2NvbCgkcm93LCAkY29sLCAkYXJyYXlfcmVmLCAkZm9ybWF0KQorIworIyBXcml0ZSBhIGNvbHVtbiBvZiBkYXRhIHN0YXJ0aW5nIGZyb20gKCRyb3csICRjb2wpLiBDYWxsIHdyaXRlX3JvdygpIGlmIGFueSBvZgorIyB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IHJlZiBhcmUgaW4gdHVybiBhcnJheSByZWZzLiBUaGlzIGFsbG93cyB0aGUgd3JpdGluZworIyBvZiAxRCBvciAyRCBhcnJheXMgb2YgZGF0YSBpbiBvbmUgZ28uCisjCisjIFJldHVybnM6IHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBlcnJvciB2YWx1ZSBvciB6ZXJvIGZvciBubyBlcnJvcnMKKyMKK3N1YiB3cml0ZV9jb2wgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICAjIENhdGNoIG5vbiBhcnJheSByZWZzIHBhc3NlZCBieSB1c2VyLgorICAgIGlmIChyZWYgJF9bMl0gbmUgJ0FSUkFZJykgeworICAgICAgICBjcm9hayAiTm90IGFuIGFycmF5IHJlZiBpbiBjYWxsIHRvIHdyaXRlX3JvdygpJCEiOworICAgIH0KKworICAgIG15ICRyb3cgICAgID0gc2hpZnQ7CisgICAgbXkgJGNvbCAgICAgPSBzaGlmdDsKKyAgICBteSAkdG9rZW5zICA9IHNoaWZ0OworICAgIG15IEBvcHRpb25zID0gQF87CisgICAgbXkgJGVycm9yICAgPSAwOworICAgIG15ICRyZXQ7CisKKyAgICBmb3JlYWNoIG15ICR0b2tlbiAoQCR0b2tlbnMpIHsKKworICAgICAgICAjIHdyaXRlKCkgd2lsbCBkZWFsIHdpdGggYW55IG5lc3RlZCBhcnJheXMKKyAgICAgICAgJHJldCA9ICRzZWxmLT53cml0ZSgkcm93LCAkY29sLCAkdG9rZW4sIEBvcHRpb25zKTsKKworICAgICAgICAjIFJldHVybiBvbmx5IHRoZSBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZCwgaWYgYW55LgorICAgICAgICAkZXJyb3IgfHw9ICRyZXQ7CisgICAgICAgICRyb3crKzsKKyAgICB9CisKKyAgICByZXR1cm4gJGVycm9yOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfY29tbWVudCgkcm93LCAkY29sLCAkY29tbWVudCkKKyMKKyMgV3JpdGUgYSBjb21tZW50IHRvIHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gKHplcm8gaW5kZXhlZCkuCisjCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIworc3ViIHdyaXRlX2NvbW1lbnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKworICAgIG15ICRyb3cgPSAkX1swXTsKKyAgICBteSAkY29sID0gJF9bMV07CisKKyAgICAjIENoZWNrIGZvciBwYWlycyBvZiBvcHRpb25hbCBhcmd1bWVudHMsIGkuZS4gYW4gb2RkIG51bWJlciBvZiBhcmdzLgorICAgIGNyb2FrICJVbmV2ZW4gbnVtYmVyIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIiB1bmxlc3MgQF8gJSAyOworCisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wpOworCisKKyAgICAjIFdlIGhhdmUgdG8gYXZvaWQgZHVwbGljYXRlIGNvbW1lbnRzIGluIGNlbGxzIG9yIGVsc2UgRXhjZWwgd2lsbCBjb21wbGFpbi4KKyAgICAkc2VsZi0+e19jb21tZW50c30tPnskcm93fS0+eyRjb2x9ID0gWyAkc2VsZi0+X2NvbW1lbnRfcGFyYW1zKEBfKSBdOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfWEYoKQorIworIyBSZXR1cm5zIGFuIGluZGV4IHRvIHRoZSBYRiByZWNvcmQgaW4gdGhlIHdvcmtib29rLgorIworIyBOb3RlOiB0aGlzIGlzIGEgZnVuY3Rpb24sIG5vdCBhIG1ldGhvZC4KKyMKK3N1YiBfWEYgeworCisgICAgbXkgJHNlbGYgICA9ICRfWzBdOworICAgIG15ICRyb3cgICAgPSAkX1sxXTsKKyAgICBteSAkY29sICAgID0gJF9bMl07CisgICAgbXkgJGZvcm1hdCA9ICRfWzNdOworCisgICAgbXkgJGVycm9yID0gIkVycm9yOiByZWZlciB0byBtZXJnZV9yYW5nZSgpIGluIHRoZSBkb2N1bWVudGF0aW9uLiAiIC4KKyAgICAgICAgICAgICAgICAgIkNhbid0IHVzZSBwcmV2aW91c2x5IG1lcmdlZCBmb3JtYXQgaW4gbm9uLW1lcmdlZCBjZWxsIjsKKworICAgIGlmIChyZWYoJGZvcm1hdCkpIHsKKyAgICAgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgICAgICBjcm9hayAkZXJyb3IgaWYgJGZvcm1hdC0+e191c2VkX21lcmdlfSA9PSAxOworICAgICAgICAkZm9ybWF0LT57X3VzZWRfbWVyZ2V9ID0gLTE7CisKKyAgICAgICAgcmV0dXJuICRmb3JtYXQtPmdldF94Zl9pbmRleCgpOworICAgIH0KKyAgICBlbHNpZiAoZXhpc3RzICRzZWxmLT57X3Jvd19mb3JtYXRzfS0+eyRyb3d9KSB7CisgICAgICAgICMgVGVtcCBjb2RlIHRvIHByZXZlbnQgbWVyZ2VkIGZvcm1hdHMgaW4gbm9uLW1lcmdlZCBjZWxscy4KKyAgICAgICAgY3JvYWsgJGVycm9yIGlmICRzZWxmLT57X3Jvd19mb3JtYXRzfS0+eyRyb3d9LT57X3VzZWRfbWVyZ2V9ID09IDE7CisgICAgICAgICRzZWxmLT57X3Jvd19mb3JtYXRzfS0+eyRyb3d9LT57X3VzZWRfbWVyZ2V9ID0gLTE7CisKKyAgICAgICAgcmV0dXJuICRzZWxmLT57X3Jvd19mb3JtYXRzfS0+eyRyb3d9LT5nZXRfeGZfaW5kZXgoKTsKKyAgICB9CisgICAgZWxzaWYgKGV4aXN0cyAkc2VsZi0+e19jb2xfZm9ybWF0c30tPnskY29sfSkgeworICAgICAgICAjIFRlbXAgY29kZSB0byBwcmV2ZW50IG1lcmdlZCBmb3JtYXRzIGluIG5vbi1tZXJnZWQgY2VsbHMuCisgICAgICAgIGNyb2FrICRlcnJvciBpZiAkc2VsZi0+e19jb2xfZm9ybWF0c30tPnskY29sfS0+e191c2VkX21lcmdlfSA9PSAxOworICAgICAgICAkc2VsZi0+e19jb2xfZm9ybWF0c30tPnskY29sfS0+e191c2VkX21lcmdlfSA9IC0xOworCisgICAgICAgIHJldHVybiAkc2VsZi0+e19jb2xfZm9ybWF0c30tPnskY29sfS0+Z2V0X3hmX2luZGV4KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gMHgwRjsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBJbnRlcm5hbCBtZXRob2RzCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfYXBwZW5kKCksIG92ZXJyaWRkZW4uCisjCisjIFN0b3JlIFdvcmtzaGVldCBkYXRhIGluIG1lbW9yeSB1c2luZyB0aGUgYmFzZSBjbGFzcyBfYXBwZW5kKCkgb3IgdG8gYQorIyB0ZW1wb3JhcnkgZmlsZSwgdGhlIGRlZmF1bHQuCisjCitzdWIgX2FwcGVuZCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRkYXRhID0gJyc7CisKKyAgICBpZiAoJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0pIHsKKyAgICAgICAgJGRhdGEgPSBqb2luKCcnLCBAXyk7CisKKyAgICAgICAgIyBBZGQgQ09OVElOVUUgcmVjb3JkcyBpZiBuZWNlc3NhcnkKKyAgICAgICAgJGRhdGEgPSAkc2VsZi0+X2FkZF9jb250aW51ZSgkZGF0YSkgaWYgbGVuZ3RoKCRkYXRhKSA+ICRzZWxmLT57X2xpbWl0fTsKKworICAgICAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAkZGF0YTsKKyAgICAgICAgJHNlbGYtPntfZGF0YXNpemV9ICs9IGxlbmd0aCgkZGF0YSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkZGF0YSA9ICRzZWxmLT5TVVBFUjo6X2FwcGVuZChAXyk7CisgICAgfQorCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N1YnN0aXR1dGVfY2VsbHJlZigpCisjCisjIFN1YnN0aXR1dGUgYW4gRXhjZWwgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gZm9yICB6ZXJvIGJhc2VkIHJvdyBhbmQKKyMgY29sdW1uIHZhbHVlcyBpbiBhbiBhcmd1bWVudCBsaXN0LgorIworIyBFeDogKCJBNCIsICJIZWxsbyIpIGlzIGNvbnZlcnRlZCB0byAoMywgMCwgIkhlbGxvIikuCisjCitzdWIgX3N1YnN0aXR1dGVfY2VsbHJlZiB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRjZWxsID0gdWMoc2hpZnQpOworCisgICAgIyBDb252ZXJ0IGEgY29sdW1uIHJhbmdlOiAnQTpBJyBvciAnQjpHJy4KKyAgICAjIEEgcmFuZ2Ugc3VjaCBhcyBBOkEgaXMgZXF1aXZhbGVudCB0byBBMTo2NTUzNiwgc28gYWRkIHJvd3MgYXMgcmVxdWlyZWQKKyAgICBpZiAoJGNlbGwgPX4gL1wkPyhbQS1JXT9bQS1aXSk6XCQ/KFtBLUldP1tBLVpdKS8pIHsKKyAgICAgICAgbXkgKCRyb3cxLCAkY29sMSkgPSAgJHNlbGYtPl9jZWxsX3RvX3Jvd2NvbCgkMSAuJzEnKTsKKyAgICAgICAgbXkgKCRyb3cyLCAkY29sMikgPSAgJHNlbGYtPl9jZWxsX3RvX3Jvd2NvbCgkMiAuJzY1NTM2Jyk7CisgICAgICAgIHJldHVybiAkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgQF87CisgICAgfQorCisgICAgIyBDb252ZXJ0IGEgY2VsbCByYW5nZTogJ0ExOkI3JworICAgIGlmICgkY2VsbCA9fiAvXCQ/KFtBLUldP1tBLVpdXCQ/XGQrKTpcJD8oW0EtSV0/W0EtWl1cJD9cZCspLykgeworICAgICAgICBteSAoJHJvdzEsICRjb2wxKSA9ICAkc2VsZi0+X2NlbGxfdG9fcm93Y29sKCQxKTsKKyAgICAgICAgbXkgKCRyb3cyLCAkY29sMikgPSAgJHNlbGYtPl9jZWxsX3RvX3Jvd2NvbCgkMik7CisgICAgICAgIHJldHVybiAkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgQF87CisgICAgfQorCisgICAgIyBDb252ZXJ0IGEgY2VsbCByZWZlcmVuY2U6ICdBMScgb3IgJ0FEMjAwMCcKKyAgICBpZiAoJGNlbGwgPX4gL1wkPyhbQS1JXT9bQS1aXVwkP1xkKykvKSB7CisgICAgICAgIG15ICgkcm93MSwgJGNvbDEpID0gICRzZWxmLT5fY2VsbF90b19yb3djb2woJDEpOworICAgICAgICByZXR1cm4gJHJvdzEsICRjb2wxLCBAXzsKKworICAgIH0KKworICAgIGNyb2FrKCJVbmtub3duIGNlbGwgcmVmZXJlbmNlICRjZWxsIik7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2VsbF90b19yb3djb2woJGNlbGxfcmVmKQorIworIyBDb252ZXJ0IGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIHRvIGEgemVybyBiYXNlZCByb3cgYW5kIGNvbHVtbgorIyByZWZlcmVuY2U7IGNvbnZlcnRzIEMxIHRvICgwLCAyKS4KKyMKKyMgUmV0dXJuczogcm93LCBjb2x1bW4KKyMKK3N1YiBfY2VsbF90b19yb3djb2wgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkY2VsbCA9IHNoaWZ0OworCisgICAgJGNlbGwgPX4gL1wkPyhbQS1JXT9bQS1aXSlcJD8oXGQrKS87CisKKyAgICBteSAkY29sICAgICA9ICQxOworICAgIG15ICRyb3cgICAgID0gJDI7CisKKyAgICAjIENvbnZlcnQgYmFzZTI2IGNvbHVtbiBzdHJpbmcgdG8gbnVtYmVyCisgICAgIyBBbGwgeW91ciBCYXNlIGFyZSBiZWxvbmcgdG8gdXMuCisgICAgbXkgQGNoYXJzID0gc3BsaXQgLy8sICRjb2w7CisgICAgbXkgJGV4cG4gID0gMDsKKyAgICAkY29sICAgICAgPSAwOworCisgICAgd2hpbGUgKEBjaGFycykgeworICAgICAgICBteSAkY2hhciA9IHBvcChAY2hhcnMpOyAjIExTIGNoYXIgZmlyc3QKKyAgICAgICAgJGNvbCArPSAob3JkKCRjaGFyKSAtb3JkKCdBJykgKzEpICogKDI2KiokZXhwbik7CisgICAgICAgICRleHBuKys7CisgICAgfQorCisgICAgIyBDb252ZXJ0IDEtaW5kZXggdG8gemVyby1pbmRleAorICAgICRyb3ctLTsKKyAgICAkY29sLS07CisKKyAgICByZXR1cm4gJHJvdywgJGNvbDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zb3J0X3BhZ2VicmVha3MoKQorIworIworIyBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZmlsdGVyIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBvZgorIyBwYWdlYnJlYWtzIHVzZWQgaW4gdGhlIF9zdG9yZV9oYnJlYWsoKSBhbmQgX3N0b3JlX3ZicmVhaygpIG1ldGhvZHMuIEl0OgorIyAgIDEuIFJlbW92ZXMgZHVwbGljYXRlIGVudHJpZXMgZnJvbSB0aGUgbGlzdC4KKyMgICAyLiBTb3J0cyB0aGUgbGlzdC4KKyMgICAzLiBSZW1vdmVzIDAgZnJvbSB0aGUgbGlzdCBpZiBwcmVzZW50LgorIworc3ViIF9zb3J0X3BhZ2VicmVha3MgeworCisgICAgbXkgJHNlbGY9IHNoaWZ0OworCisgICAgbXkgJWhhc2g7CisgICAgbXkgQGFycmF5OworCisgICAgQGhhc2h7QF99ID0gdW5kZWY7ICAgICAgICAgICAgICAgICAgICAgICAjIEhhc2ggc2xpY2UgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMKKyAgICBAYXJyYXkgICAgPSBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWhhc2g7ICMgTnVtZXJpY2FsIHNvcnQKKyAgICBzaGlmdCBAYXJyYXkgaWYgJGFycmF5WzBdID09IDA7ICAgICAgICAgICMgUmVtb3ZlIHplcm8KKworICAgICMgMTAwMCB2ZXJ0aWNhbCBwYWdlYnJlYWtzIGFwcGVhcnMgdG8gYmUgYW4gaW50ZXJuYWwgRXhjZWwgNSBsaW1pdC4KKyAgICAjIEl0IGlzIHNsaWdodGx5IGhpZ2hlciBpbiBFeGNlbCA5Ny8yMDAsIGFwcHJveC4gMTAyNgorICAgIHNwbGljZShAYXJyYXksIDEwMDApIGlmIChAYXJyYXkgPiAxMDAwKTsKKworICAgIHJldHVybiBAYXJyYXkKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9lbmNvZGVfcGFzc3dvcmQoJHBhc3N3b3JkKQorIworIyBCYXNlZCBvbiB0aGUgYWxnb3JpdGhtIHByb3ZpZGVkIGJ5IERhbmllbCBSZW50eiBvZiBPcGVuT2ZmaWNlLgorIworIworc3ViIF9lbmNvZGVfcGFzc3dvcmQgeworCisgICAgdXNlIGludGVnZXI7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisgICAgbXkgJHBsYWludGV4dCA9ICRfWzBdOworICAgIG15ICRwYXNzd29yZDsKKyAgICBteSAkY291bnQ7CisgICAgbXkgQGNoYXJzOworICAgIG15ICRpID0gMDsKKworICAgICRjb3VudCA9IEBjaGFycyA9IHNwbGl0IC8vLCAkcGxhaW50ZXh0OworCisgICAgZm9yZWFjaCBteSAkY2hhciAoQGNoYXJzKSB7CisgICAgICAgIG15ICRsb3dfMTU7CisgICAgICAgIG15ICRoaWdoXzE1OworICAgICAgICAkY2hhciAgICAgPSBvcmQoJGNoYXIpIDw8ICsrJGk7CisgICAgICAgICRsb3dfMTUgICA9ICRjaGFyICYgMHg3ZmZmOworICAgICAgICAkaGlnaF8xNSAgPSAkY2hhciAmIDB4N2ZmZiA8PCAxNTsKKyAgICAgICAgJGhpZ2hfMTUgID0gJGhpZ2hfMTUgPj4gMTU7CisgICAgICAgICRjaGFyICAgICA9ICRsb3dfMTUgfCAkaGlnaF8xNTsKKyAgICB9CisKKyAgICAkcGFzc3dvcmQgID0gMHgwMDAwOworICAgICRwYXNzd29yZCBePSAkXyBmb3IgQGNoYXJzOworICAgICRwYXNzd29yZCBePSAkY291bnQ7CisgICAgJHBhc3N3b3JkIF49IDB4Q0U0QjsKKworICAgIHJldHVybiAkcGFzc3dvcmQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBvdXRsaW5lX3NldHRpbmdzKCR2aXNpYmxlLCAkc3ltYm9sc19iZWxvdywgJHN5bWJvbHNfcmlnaHQsICRhdXRvX3N0eWxlKQorIworIyBUaGlzIG1ldGhvZCBzZXRzIHRoZSBwcm9wZXJ0aWVzIGZvciBvdXRsaW5pbmcgYW5kIGdyb3VwaW5nLiBUaGUgZGVmYXVsdHMKKyMgY29ycmVzcG9uZCB0byBFeGNlbCdzIGRlZmF1bHRzLgorIworc3ViIG91dGxpbmVfc2V0dGluZ3MgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICAgICAgPSBzaGlmdDsKKworICAgICRzZWxmLT57X291dGxpbmVfb259ICAgID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMTsKKyAgICAkc2VsZi0+e19vdXRsaW5lX2JlbG93fSA9IGRlZmluZWQgJF9bMV0gPyAkX1sxXSA6IDE7CisgICAgJHNlbGYtPntfb3V0bGluZV9yaWdodH0gPSBkZWZpbmVkICRfWzJdID8gJF9bMl0gOiAxOworICAgICRzZWxmLT57X291dGxpbmVfc3R5bGV9ID0gICAgICAgICAkX1szXSB8fCAwOworCisgICAgIyBFbnN1cmUgdGhpcyBpcyBhIGJvb2xlYW4gdmFsZSBmb3IgV2luZG93MgorICAgICRzZWxmLT57X291dGxpbmVfb259ICAgID0gMSBpZiAkc2VsZi0+e19vdXRsaW5lX29ufTsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBCSUZGIFJFQ09SRFMKKyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX251bWJlcigkcm93LCAkY29sLCAkbnVtLCAkZm9ybWF0KQorIworIyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIyBBbiBpbnRlZ2VyIGNhbiBiZSB3cml0dGVuIGFzIGEgZG91YmxlLiBFeGNlbCB3aWxsIGRpc3BsYXkgYW4KKyMgaW50ZWdlci4gJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjCitzdWIgd3JpdGVfbnVtYmVyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIGlmIChAXyA8IDMpIHsgcmV0dXJuIC0xIH0gICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcmVjb3JkICA9IDB4MDIwMzsgICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMEU7ICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkbnVtICAgICA9ICRfWzJdOworICAgIG15ICR4ZiAgICAgID0gX1hGKCRzZWxmLCAkcm93LCAkY29sLCAkX1szXSk7ICMgVGhlIGNlbGwgZm9ybWF0CisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wpOworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2dnYiLCAkcm93LCAkY29sLCAkeGYpOworICAgIG15ICR4bF9kb3VibGUgPSBwYWNrKCJkIiwgICAkbnVtKTsKKworICAgIGlmICgkc2VsZi0+e19ieXRlX29yZGVyfSkgeyAkeGxfZG91YmxlID0gcmV2ZXJzZSAkeGxfZG91YmxlIH0KKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGEgLiAkeGxfZG91YmxlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEsICR4bF9kb3VibGUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfc3RyaW5nICgkcm93LCAkY29sLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBhIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIyBOT1RFOiB0aGVyZSBpcyBhbiBFeGNlbCA1IGRlZmluZWQgbGltaXQgb2YgMjU1IGNoYXJhY3RlcnMuCisjICRmb3JtYXQgaXMgb3B0aW9uYWwuCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIyAgICAgICAgIC0zIDogbG9uZyBzdHJpbmcgdHJ1bmNhdGVkIHRvIDI1NSBjaGFycworIworc3ViIHdyaXRlX3N0cmluZyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDBGRDsgICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDBBOyAgICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIGNvbHVtbgorICAgIG15ICRzdHJsZW4gICAgICA9IGxlbmd0aCgkX1syXSk7CisgICAgbXkgJHN0ciAgICAgICAgID0gJF9bMl07CisgICAgbXkgJHhmICAgICAgICAgID0gX1hGKCRzZWxmLCAkcm93LCAkY29sLCAkX1szXSk7ICMgVGhlIGNlbGwgZm9ybWF0CisgICAgbXkgJGVuY29kaW5nICAgID0gMHgwOworICAgIG15ICRzdHJfZXJyb3IgICA9IDA7CisKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyKSkgeworICAgICAgICAgICAgbXkgJHRtcCA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZMRSIsICRzdHIpOworICAgICAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV91dGYxNmxlX3N0cmluZygkcm93LCAkY29sLCAkdG1wLCAkX1szXSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ2hlY2sgdGhhdCByb3cgYW5kIGNvbCBhcmUgdmFsaWQgYW5kIHN0b3JlIG1heCBhbmQgbWluIHZhbHVlcworICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCk7CisKKyAgICAjIExpbWl0IHRoZSBzdHJpbmcgdG8gdGhlIG1heCBudW1iZXIgb2YgY2hhcnMuCisgICAgaWYgKCRzdHJsZW4gPiAzMjc2NykgeworICAgICAgICAkc3RyICAgICAgID0gc3Vic3RyKCRzdHIsIDAsIDMyNzY3KTsKKyAgICAgICAgJHN0cl9lcnJvciA9IC0zOworICAgIH0KKworCisgICAgIyBQcmVwZW5kIHRoZSBzdHJpbmcgd2l0aCB0aGUgdHlwZS4KKyAgICBteSAkc3RyX2hlYWRlciAgPSBwYWNrKCJ2QyIsIGxlbmd0aCgkc3RyKSwgJGVuY29kaW5nKTsKKyAgICAkc3RyICAgICAgICAgICAgPSAkc3RyX2hlYWRlciAuICRzdHI7CisKKworICAgIGlmIChub3QgZXhpc3RzICR7JHNlbGYtPntfc3RyX3RhYmxlfX0tPnskc3RyfSkgeworICAgICAgICAkeyRzZWxmLT57X3N0cl90YWJsZX19LT57JHN0cn0gPSAkeyRzZWxmLT57X3N0cl91bmlxdWV9fSsrOworICAgIH0KKworCisgICAgJHskc2VsZi0+e19zdHJfdG90YWx9fSsrOworCisKKyAgICBteSAkaGVhZGVyID0gcGFjaygidnYiLCAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgPSBwYWNrKCJ2dnZWIiwgJHJvdywgJGNvbCwgJHhmLCAkeyRzZWxmLT57X3N0cl90YWJsZX19LT57JHN0cn0pOworCisKKyAgICAjIFN0b3JlIHRoZSBkYXRhIG9yIHdyaXRlIGltbWVkaWF0ZWx5IGRlcGVuZGluZyBvbiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGlmICgkc2VsZi0+e19jb21wYXRpYmlsaXR5fSkgeworICAgICAgICAkc2VsZi0+e190YWJsZX0tPlskcm93XS0+WyRjb2xdID0gJGhlYWRlciAuICRkYXRhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworICAgIH0KKworICAgIHJldHVybiAkc3RyX2Vycm9yOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfYmxhbmsoJHJvdywgJGNvbCwgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBibGFuayBjZWxsIHRvIHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gKHplcm8gaW5kZXhlZCkuCisjIEEgYmxhbmsgY2VsbCBpcyB1c2VkIHRvIHNwZWNpZnkgZm9ybWF0dGluZyB3aXRob3V0IGFkZGluZyBhIHN0cmluZworIyBvciBhIG51bWJlci4KKyMKKyMgQSBibGFuayBjZWxsIHdpdGhvdXQgYSBmb3JtYXQgc2VydmVzIG5vIHB1cnBvc2UuIFRoZXJlZm9yZSwgd2UgZG9uJ3Qgd3JpdGUKKyMgYSBCTEFOSyByZWNvcmQgdW5sZXNzIGEgZm9ybWF0IGlzIHNwZWNpZmllZC4gVGhpcyBpcyBtYWlubHkgYW4gb3B0aW1pc2F0aW9uCisjIGZvciB0aGUgd3JpdGVfcm93KCkgYW5kIHdyaXRlX2NvbCgpIG1ldGhvZHMuCisjCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24gKGluY2x1ZGluZyBubyBmb3JtYXQpCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMKK3N1YiB3cml0ZV9ibGFuayB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworICAgIHJldHVybiAtMSBpZiBAXyA8IDI7CisKKyAgICAjIERvbid0IHdyaXRlIGEgYmxhbmsgY2VsbCB1bmxlc3MgaXQgaGFzIGEgZm9ybWF0CisgICAgcmV0dXJuIDAgaWYgbm90IGRlZmluZWQgJF9bMl07CisKKworICAgIG15ICRyZWNvcmQgID0gMHgwMjAxOyAgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwNjsgICAgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIHJvdworICAgIG15ICRjb2wgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIGNvbHVtbgorICAgIG15ICR4ZiAgICAgID0gX1hGKCRzZWxmLCAkcm93LCAkY29sLCAkX1syXSk7ICMgVGhlIGNlbGwgZm9ybWF0CisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wpOworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2dnYiLCAkcm93LCAkY29sLCAkeGYpOworCisgICAgIyBTdG9yZSB0aGUgZGF0YSBvciB3cml0ZSBpbW1lZGlhdGVseSBkZXBlbmRpbmcgb24gdGhlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpZiAoJHNlbGYtPntfY29tcGF0aWJpbGl0eX0pIHsKKyAgICAgICAgJHNlbGYtPntfdGFibGV9LT5bJHJvd10tPlskY29sXSA9ICRoZWFkZXIgLiAkZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX2Zvcm11bGEoJHJvdywgJGNvbCwgJGZvcm11bGEsICRmb3JtYXQsICR2YWx1ZSkKKyMKKyMgV3JpdGUgYSBmb3JtdWxhIHRvIHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gKHplcm8gaW5kZXhlZCkuCisjIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtdWxhIGlzIHBhc3NlZCB0byB0aGUgcGFyc2VyIGluCisjIEZvcm11bGEucG0gd2hpY2ggcmV0dXJucyBhIHBhY2tlZCBiaW5hcnkgc3RyaW5nLgorIworIyAkZm9ybWF0IGlzIG9wdGlvbmFsLgorIworIyAkdmFsdWUgaXMgYW4gb3B0aW9uYWwgcmVzdWx0IG9mIHRoZSBmb3JtdWxhIHRoYXQgY2FuIGJlIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMKK3N1YiB3cml0ZV9mb3JtdWxhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIGlmIChAXyA8IDMpIHsgcmV0dXJuIC0xIH0gICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MDAwNjsgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgPSAkX1swXTsgICAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICAgID0gJF9bMV07ICAgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJGZvcm11bGEgICA9ICRfWzJdOyAgICAgICMgVGhlIGZvcm11bGEgdGV4dCBzdHJpbmcKKyAgICBteSAkdmFsdWUgICAgID0gJF9bNF07ICAgICAgIyBUaGUgZm9ybXVsYSB0ZXh0IHN0cmluZworCisKKyAgICBteSAkeGYgICAgICAgID0gX1hGKCRzZWxmLCAkcm93LCAkY29sLCAkX1szXSk7ICAjIFRoZSBjZWxsIGZvcm1hdAorICAgIG15ICRjaG4gICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICMgTXVzdCBiZSB6ZXJvCisgICAgbXkgJGlzX3N0cmluZyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JtdWxhIGV2YWx1YXRlcyB0byBzdHIKKyAgICBteSAkbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEN1cnJlbnQgdmFsdWUgb2YgZm9ybXVsYQorICAgIG15ICRncmJpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uIGZsYWdzCisKKworICAgICMgRXhjZWwgbm9ybWFsbHkgc3RvcmVzIHRoZSBsYXN0IGNhbGN1bGF0ZWQgdmFsdWUgb2YgdGhlIGZvcm11bGEgaW4gJG51bS4KKyAgICAjIENsZWFybHkgd2UgYXJlIG5vdCBpbiBhIHBvc2l0aW9uIHRvIGNhbGN1bGF0ZSB0aGlzICJhIHByaW9yaSIuIEluc3RlYWQKKyAgICAjIHdlIHNldCAkbnVtIHRvIHplcm8gYW5kIHNldCB0aGUgb3B0aW9uIGZsYWdzIGluICRncmJpdCB0byBlbnN1cmUKKyAgICAjIGF1dG9tYXRpYyBjYWxjdWxhdGlvbiBvZiB0aGUgZm9ybXVsYSB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZC4KKyAgICAjIEFzIGEgd29ya2Fyb3VuZCBmb3Igc29tZSBub24tRXhjZWwgYXBwcyB3ZSBhbHNvIGFsbG93IHRoZSB1c2VyIHRvCisgICAgIyBzcGVjaWZ5IHRoZSByZXN1bHQgb2YgdGhlIGZvcm11bGEuCisgICAgIworICAgICgkbnVtLCAkZ3JiaXQsICRpc19zdHJpbmcpID0gJHNlbGYtPl9lbmNvZGVfZm9ybXVsYV9yZXN1bHQoJHZhbHVlKTsKKworCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgICMgU3RyaXAgdGhlID0gc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtdWxhIHN0cmluZworICAgICRmb3JtdWxhICAgID1+IHMoXj0pKCk7CisKKyAgICBteSAkdG1wICAgICA9ICRmb3JtdWxhOworCisgICAgIyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIEZvcm11bGEucG0KKyAgICBteSAkcGFyc2VyICA9ICRzZWxmLT57X3BhcnNlcn07CisKKyAgICAjIEluIG9yZGVyIHRvIHJhaXNlIGZvcm11bGEgZXJyb3JzIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGNhbGxpbmcKKyAgICAjIHByb2dyYW0gd2UgdXNlIGFuIGV2YWwgYmxvY2sgYW5kIHJlLXJhaXNlIHRoZSBlcnJvciBmcm9tIGhlcmUuCisgICAgIworICAgIGV2YWwgeyAkZm9ybXVsYSA9ICRwYXJzZXItPnBhcnNlX2Zvcm11bGEoJGZvcm11bGEpIH07CisKKyAgICBpZiAoJEApIHsKKyAgICAgICAgJEAgPX4gcy9cbiQvLzsgICMgU3RyaXAgdGhlIFxuIHVzZWQgaW4gdGhlIEZvcm11bGEucG0gZGllKCkKKyAgICAgICAgY3JvYWsgJEA7ICAgICAgICMgUmUtcmFpc2UgdGhlIGVycm9yCisgICAgfQorCisKKyAgICBteSAkZm9ybWxlbiA9IGxlbmd0aCgkZm9ybXVsYSk7ICMgTGVuZ3RoIG9mIHRoZSBiaW5hcnkgc3RyaW5nCisgICAgICAgJGxlbmd0aCAgPSAweDE2ICsgJGZvcm1sZW47ICAjIExlbmd0aCBvZiB0aGUgcmVjb3JkIGRhdGEKKworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInZ2diIsICAgJHJvdywgJGNvbCwgJHhmKTsKKyAgICAgICAkZGF0YSAgIC49ICRudW07CisgICAgICAgJGRhdGEgICAuPSBwYWNrKCJ2VnYiLCAgICRncmJpdCwgJGNobiwgJGZvcm1sZW4pOworCisgICAgIyBUaGUgU1RSSU5HIHJlY29yZCBpZiB0aGUgZm9ybXVsYSBldmFsdWF0ZXMgdG8gYSBzdHJpbmcuCisgICAgbXkgJHN0cmluZyAgPSAnJzsKKyAgICAgICAkc3RyaW5nICA9ICRzZWxmLT5fZ2V0X2Zvcm11bGFfc3RyaW5nKCR2YWx1ZSkgaWYgJGlzX3N0cmluZzsKKworCisgICAgIyBTdG9yZSB0aGUgZGF0YSBvciB3cml0ZSBpbW1lZGlhdGVseSBkZXBlbmRpbmcgb24gdGhlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpZiAoJHNlbGYtPntfY29tcGF0aWJpbGl0eX0pIHsKKyAgICAgICAgJHNlbGYtPntfdGFibGV9LT5bJHJvd10tPlskY29sXSA9ICRoZWFkZXIgLiAkZGF0YSAuICRmb3JtdWxhIC4gJHN0cmluZzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkZm9ybXVsYSwgJHN0cmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZW5jb2RlX2Zvcm11bGFfcmVzdWx0KCkKKyMKKyMgRW5jb2RlIHRoZSB1c2VyIHN1cHBsaWVkIHJlc3VsdCBmb3IgYSBmb3JtdWxhLgorIworc3ViIF9lbmNvZGVfZm9ybXVsYV9yZXN1bHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICR2YWx1ZSAgICAgPSAkX1swXTsgICAgICAjIFJlc3VsdCB0byBiZSBlbmNvZGVkLgorICAgIG15ICRpc19zdHJpbmcgPSAwOyAgICAgICAgICAjIEZvcm11bGEgZXZhbHVhdGVzIHRvIHN0ci4KKyAgICBteSAkbnVtOyAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZhbHVlIG9mIGZvcm11bGEuCisgICAgbXkgJGdyYml0OyAgICAgICAgICAgICAgICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgaWYgKG5vdCBkZWZpbmVkICR2YWx1ZSkgeworICAgICAgICAkZ3JiaXQgID0gMHgwMzsKKyAgICAgICAgJG51bSAgICA9IHBhY2sgImQiLCAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBUaGUgdXNlciBzcGVjaWZpZWQgdGhlIHJlc3VsdCBvZiB0aGUgZm9ybXVsYS4gV2UgdHVybiBvZmYgdGhlIHJlY2FsYworICAgICAgICAjIGZsYWcgYW5kIGNoZWNrIHRoZSByZXN1bHQgdHlwZS4KKyAgICAgICAgJGdyYml0ICA9IDB4MDA7CisKKyAgICAgICAgaWYgKCR2YWx1ZSA9fiAvXihbKy1dPykoPz1cZHxcLlxkKVxkKihcLlxkKik/KFtFZV0oWystXT9cZCspKT8kLykgeworICAgICAgICAgICAgIyBWYWx1ZSBpcyBhIG51bWJlci4KKyAgICAgICAgICAgICRudW0gPSBwYWNrICJkIiwgJHZhbHVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBteSAlYm9vbHMgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RSVUUnICAgID0+IFsxLCAgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZBTFNFJyAgID0+IFsxLCAgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNOVUxMIScgID0+IFsyLCAgMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNESVYvMCEnID0+IFsyLCAgN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNWQUxVRSEnID0+IFsyLCAxNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNSRUYhJyAgID0+IFsyLCAyM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNOQU1FPycgID0+IFsyLCAyOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNOVU0hJyAgID0+IFsyLCAzNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNOL0EnICAgID0+IFsyLCA0Ml0sCisgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICBpZiAoZXhpc3RzICRib29sc3skdmFsdWV9KSB7CisgICAgICAgICAgICAgICAgIyBWYWx1ZSBpcyBhIGJvb2xlYW4uCisgICAgICAgICAgICAgICAgJG51bSA9IHBhY2sgInZ2dnYiLCAkYm9vbHN7JHZhbHVlfS0+WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJvb2xzeyR2YWx1ZX0tPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIFZhbHVlIGlzIGEgc3RyaW5nLgorICAgICAgICAgICAgICAgICRudW0gPSBwYWNrICJ2dnZ2IiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGOworICAgICAgICAgICAgICAgICRpc19zdHJpbmcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICgkbnVtLCAkZ3JiaXQsICRpc19zdHJpbmcpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9mb3JtdWxhX3N0cmluZygpCisjCisjIFBhY2sgdGhlIHN0cmluZyB2YWx1ZSB3aGVuIGEgZm9ybXVsYSBldmFsdWF0ZXMgdG8gYSBzdHJpbmcuIFRoZSB2YWx1ZSBjYW5ub3QKKyMgYmUgY2FsY3VsYXRlZCBieSB0aGUgbW9kdWxlIGFuZCB0aHVzIG11c3QgYmUgc3VwcGxpZWQgYnkgdGhlIHVzZXIuCisjCitzdWIgX2dldF9mb3JtdWxhX3N0cmluZyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MDIwNzsgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICA9IDB4MDA7ICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRzdHJpbmcgICAgPSAkX1swXTsgICAgICAgICAgIyBGb3JtdWxhIHN0cmluZy4KKyAgICBteSAkc3RybGVuICAgID0gbGVuZ3RoICRfWzBdOyAgICMgTGVuZ3RoIG9mIHRoZSBmb3JtdWxhIHN0cmluZyAoY2hhcnMpLgorICAgIG15ICRlbmNvZGluZyAgPSAwOyAgICAgICAgICAgICAgIyBTdHJpbmcgZW5jb2RpbmcuCisKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyaW5nKSkgeworICAgICAgICAgICAgJHN0cmluZyA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRzdHJpbmcpOworICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgJGxlbmd0aCAgICAgICA9IDB4MDMgKyBsZW5ndGggJHN0cmluZzsgICMgTGVuZ3RoIG9mIHRoZSByZWNvcmQgZGF0YQorCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soInZDIiwgJHN0cmxlbiwgJGVuY29kaW5nKTsKKworICAgIHJldHVybiAkaGVhZGVyIC4gJGRhdGEgLiAkc3RyaW5nOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc3RvcmVfZm9ybXVsYSgkZm9ybXVsYSkKKyMKKyMgUHJlLXBhcnNlIGEgZm9ybXVsYS4gVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggcmVwZWF0X2Zvcm11bGEoKQorIyB0byByZXBldGl0aXZlbHkgcmV3cml0ZSBhIGZvcm11bGEgd2l0aG91dCByZS1wYXJzaW5nIGl0LgorIworc3ViIHN0b3JlX2Zvcm11bGEgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkZm9ybXVsYSA9ICRfWzBdOyAgICAgICMgVGhlIGZvcm11bGEgdGV4dCBzdHJpbmcKKworICAgICMgU3RyaXAgdGhlID0gc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtdWxhIHN0cmluZworICAgICRmb3JtdWxhICAgID1+IHMoXj0pKCk7CisKKyAgICAjIFBhcnNlIHRoZSBmb3JtdWxhIHVzaW5nIHRoZSBwYXJzZXIgaW4gRm9ybXVsYS5wbQorICAgIG15ICRwYXJzZXIgID0gJHNlbGYtPntfcGFyc2VyfTsKKworICAgICMgSW4gb3JkZXIgdG8gcmFpc2UgZm9ybXVsYSBlcnJvcnMgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgY2FsbGluZworICAgICMgcHJvZ3JhbSB3ZSB1c2UgYW4gZXZhbCBibG9jayBhbmQgcmUtcmFpc2UgdGhlIGVycm9yIGZyb20gaGVyZS4KKyAgICAjCisgICAgbXkgQHRva2VuczsKKyAgICBldmFsIHsgQHRva2VucyA9ICRwYXJzZXItPnBhcnNlX2Zvcm11bGEoJGZvcm11bGEpIH07CisKKyAgICBpZiAoJEApIHsKKyAgICAgICAgJEAgPX4gcy9cbiQvLzsgICMgU3RyaXAgdGhlIFxuIHVzZWQgaW4gdGhlIEZvcm11bGEucG0gZGllKCkKKyAgICAgICAgY3JvYWsgJEA7ICAgICAgICMgUmUtcmFpc2UgdGhlIGVycm9yCisgICAgfQorCisKKyAgICAjIFJldHVybiB0aGUgcGFyc2VkIHRva2VucyBpbiBhbiBhbm9ueW1vdXMgYXJyYXkKKyAgICByZXR1cm4gW0B0b2tlbnNdOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcmVwZWF0X2Zvcm11bGEoJHJvdywgJGNvbCwgJGZvcm11bGEsICRmb3JtYXQsICgkcGF0dGVybiA9PiAkcmVwbGFjZW1lbnQsLi4uKSkKKyMKKyMgV3JpdGUgYSBmb3JtdWxhIHRvIHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gKHplcm8gaW5kZXhlZCkgYnkKKyMgc3Vic3RpdHV0aW5nICRwYXR0ZXJuICRyZXBsYWNlbWVudCBwYWlycyBpbiB0aGUgJGZvcm11bGEgY3JlYXRlZCB2aWEKKyMgc3RvcmVfZm9ybXVsYSgpLiBUaGlzIGFsbG93cyB0aGUgdXNlciB0byByZXBldGl0aXZlbHkgcmV3cml0ZSBhIGZvcm11bGEKKyMgd2l0aG91dCB0aGUgc2lnbmlmaWNhbnQgb3ZlcmhlYWQgb2YgcGFyc2luZy4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjCitzdWIgcmVwZWF0X2Zvcm11bGEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMikgeyByZXR1cm4gLTEgfSAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwMDY7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gc2hpZnQ7ICAgICMgWmVybyBpbmRleGVkIHJvdworICAgIG15ICRjb2wgICAgICAgICA9IHNoaWZ0OyAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkZm9ybXVsYV9yZWYgPSBzaGlmdDsgICAgIyBBcnJheSByZWYgd2l0aCBmb3JtdWxhIHRva2VucworICAgIG15ICRmb3JtYXQgICAgICA9IHNoaWZ0OyAgICAjIFhGIGZvcm1hdAorICAgIG15IEBwYWlycyAgICAgICA9IEBfOyAgICAgICAjIFBhdHRlcm4vcmVwbGFjZW1lbnQgcGFpcnMKKworCisgICAgIyBFbmZvcmNlIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgcGF0dGVybi9yZXBsYWNlbWVudCBsaXN0CisgICAgY3JvYWsgIk9kZCBudW1iZXIgb2YgZWxlbWVudHMgaW4gcGF0dGVybi9yZXBsYWNlbWVudCBsaXN0IiBpZiBAcGFpcnMgJTI7CisKKyAgICAjIENoZWNrIHRoYXQgJGZvcm11bGEgaXMgYW4gYXJyYXkgcmVmCisgICAgY3JvYWsgIk5vdCBhIHZhbGlkIGZvcm11bGEiIGlmIHJlZiAkZm9ybXVsYV9yZWYgbmUgJ0FSUkFZJzsKKworICAgIG15IEB0b2tlbnMgID0gQCRmb3JtdWxhX3JlZjsKKworICAgICMgRW5zdXJlIHRoYXQgdGhlcmUgYXJlIHRva2VucyB0byBzdWJzdGl0dXRlCisgICAgY3JvYWsgIk5vIHRva2VucyBpbiBmb3JtdWxhIiB1bmxlc3MgQHRva2VuczsKKworCisgICAgIyBBcyBhIHRlbXBvcmFyeSBhbmQgdW5kb2N1bWVudGVkIG1lYXN1cmUgd2UgYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUKKyAgICAjIHJlc3VsdCBvZiB0aGUgZm9ybXVsYSBieSBhcHBlbmRpbmcgYSByZXN1bHQgPT4gJHZhbHVlIHBhaXIgdG8gdGhlIGVuZAorICAgICMgb2YgdGhlIGFyZ3VtZW50cy4KKyAgICBteSAkdmFsdWUgPSB1bmRlZjsKKyAgICBpZiAoJHBhaXJzWy0yXSBlcSAncmVzdWx0JykgeworICAgICAgICAkdmFsdWUgPSBwb3AgQHBhaXJzOworICAgICAgICAgICAgICAgICBwb3AgQHBhaXJzOworICAgIH0KKworCisgICAgd2hpbGUgKEBwYWlycykgeworICAgICAgICBteSAkcGF0dGVybiA9IHNoaWZ0IEBwYWlyczsKKyAgICAgICAgbXkgJHJlcGxhY2UgPSBzaGlmdCBAcGFpcnM7CisKKyAgICAgICAgZm9yZWFjaCBteSAkdG9rZW4gKEB0b2tlbnMpIHsKKyAgICAgICAgICAgIGxhc3QgaWYgJHRva2VuID1+IHMvJHBhdHRlcm4vJHJlcGxhY2UvOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjIENoYW5nZSB0aGUgcGFyYW1ldGVycyBpbiB0aGUgZm9ybXVsYSBjYWNoZWQgYnkgdGhlIEZvcm11bGEucG0gb2JqZWN0CisgICAgbXkgJHBhcnNlciAgICA9ICRzZWxmLT57X3BhcnNlcn07CisgICAgbXkgJGZvcm11bGEgICA9ICRwYXJzZXItPnBhcnNlX3Rva2VucyhAdG9rZW5zKTsKKworICAgIGNyb2FrICJVbnJlY29nbmlzZWQgdG9rZW4gaW4gZm9ybXVsYSIgdW5sZXNzIGRlZmluZWQgJGZvcm11bGE7CisKKworICAgIG15ICR4ZiAgICAgICAgPSBfWEYoJHNlbGYsICRyb3csICRjb2wsICRmb3JtYXQpOyAjIFRoZSBjZWxsIGZvcm1hdAorICAgIG15ICRjaG4gICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIE11c3QgYmUgemVybworICAgIG15ICRpc19zdHJpbmcgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZvcm11bGEgZXZhbHVhdGVzIHRvIHN0cgorICAgIG15ICRudW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEN1cnJlbnQgdmFsdWUgb2YgZm9ybXVsYQorICAgIG15ICRncmJpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbiBmbGFncworCisgICAgIyBFeGNlbCBub3JtYWxseSBzdG9yZXMgdGhlIGxhc3QgY2FsY3VsYXRlZCB2YWx1ZSBvZiB0aGUgZm9ybXVsYSBpbiAkbnVtLgorICAgICMgQ2xlYXJseSB3ZSBhcmUgbm90IGluIGEgcG9zaXRpb24gdG8gY2FsY3VsYXRlIHRoaXMgImEgcHJpb3JpIi4gSW5zdGVhZAorICAgICMgd2Ugc2V0ICRudW0gdG8gemVybyBhbmQgc2V0IHRoZSBvcHRpb24gZmxhZ3MgaW4gJGdyYml0IHRvIGVuc3VyZQorICAgICMgYXV0b21hdGljIGNhbGN1bGF0aW9uIG9mIHRoZSBmb3JtdWxhIHdoZW4gdGhlIGZpbGUgaXMgb3BlbmVkLgorICAgICMgQXMgYSB3b3JrYXJvdW5kIGZvciBzb21lIG5vbi1FeGNlbCBhcHBzIHdlIGFsc28gYWxsb3cgdGhlIHVzZXIgdG8KKyAgICAjIHNwZWNpZnkgdGhlIHJlc3VsdCBvZiB0aGUgZm9ybXVsYS4KKyAgICAjCisgICAgKCRudW0sICRncmJpdCwgJGlzX3N0cmluZykgPSAkc2VsZi0+X2VuY29kZV9mb3JtdWxhX3Jlc3VsdCgkdmFsdWUpOworCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworCisgICAgbXkgJGZvcm1sZW4gICA9IGxlbmd0aCgkZm9ybXVsYSk7ICMgTGVuZ3RoIG9mIHRoZSBiaW5hcnkgc3RyaW5nCisgICAgJGxlbmd0aCAgICAgICA9IDB4MTYgKyAkZm9ybWxlbjsgICMgTGVuZ3RoIG9mIHRoZSByZWNvcmQgZGF0YQorCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soInZ2diIsICAgJHJvdywgJGNvbCwgJHhmKTsKKyAgICAgICAkZGF0YSAgICAgLj0gJG51bTsKKyAgICAgICAkZGF0YSAgICAgLj0gcGFjaygidlZ2IiwgICAkZ3JiaXQsICRjaG4sICRmb3JtbGVuKTsKKworCisgICAgIyBUaGUgU1RSSU5HIHJlY29yZCBpZiB0aGUgZm9ybXVsYSBldmFsdWF0ZXMgdG8gYSBzdHJpbmcuCisgICAgbXkgJHN0cmluZyAgPSAnJzsKKyAgICAgICAkc3RyaW5nICA9ICRzZWxmLT5fZ2V0X2Zvcm11bGFfc3RyaW5nKCR2YWx1ZSkgaWYgJGlzX3N0cmluZzsKKworCisgICAgIyBTdG9yZSB0aGUgZGF0YSBvciB3cml0ZSBpbW1lZGlhdGVseSBkZXBlbmRpbmcgb24gdGhlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpZiAoJHNlbGYtPntfY29tcGF0aWJpbGl0eX0pIHsKKyAgICAgICAgJHNlbGYtPntfdGFibGV9LT5bJHJvd10tPlskY29sXSA9ICRoZWFkZXIgLiAkZGF0YSAuICRmb3JtdWxhIC4gJHN0cmluZzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkZm9ybXVsYSwgJHN0cmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV91cmwoJHJvdywgJGNvbCwgJHVybCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBoeXBlcmxpbmsuIFRoaXMgaXMgY29tcHJpc2VkIG9mIHR3byBlbGVtZW50czogdGhlIHZpc2libGUgbGFiZWwgYW5kCisjIHRoZSBpbnZpc2libGUgbGluay4gVGhlIHZpc2libGUgbGFiZWwgaXMgdGhlIHNhbWUgYXMgdGhlIGxpbmsgdW5sZXNzIGFuCisjIGFsdGVybmF0aXZlIHN0cmluZyBpcyBzcGVjaWZpZWQuCisjCisjIFRoZSBwYXJhbWV0ZXJzICRzdHJpbmcgYW5kICRmb3JtYXQgYXJlIG9wdGlvbmFsIGFuZCB0aGVpciBvcmRlciBpcworIyBpbnRlcmNoYW5nZWFibGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKyMKKyMgVGhlIGh5cGVybGluayBjYW4gYmUgdG8gYSBodHRwLCBmdHAsIG1haWwsIGludGVybmFsIHNoZWV0LCBvciBleHRlcm5hbAorIyBkaXJlY3RvcnkgdXJsLgorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMgICAgICAgICAtMyA6IGxvbmcgc3RyaW5nIHRydW5jYXRlZCB0byAyNTUgY2hhcnMKKyMKK3N1YiB3cml0ZV91cmwgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKyAgICByZXR1cm4gLTEgaWYgQF8gPCAzOworCisgICAgIyBBZGQgc3RhcnQgcm93IGFuZCBjb2wgdG8gYXJnIGxpc3QKKyAgICByZXR1cm4gJHNlbGYtPndyaXRlX3VybF9yYW5nZSgkX1swXSwgJF9bMV0sIEBfKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX3VybF9yYW5nZSgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgJHVybCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgVGhpcyBpcyB0aGUgbW9yZSBnZW5lcmFsIGZvcm0gb2Ygd3JpdGVfdXJsKCkuIEl0IGFsbG93cyBhIGh5cGVybGluayB0byBiZQorIyB3cml0dGVuIHRvIGEgcmFuZ2Ugb2YgY2VsbHMuIFRoaXMgZnVuY3Rpb24gYWxzbyBkZWNpZGVzIHRoZSB0eXBlIG9mIGh5cGVybGluaworIyB0byBiZSB3cml0dGVuLiBUaGVzZSBhcmUgZWl0aGVyLCBXZWIgKGh0dHAsIGZ0cCwgbWFpbHRvKSwgSW50ZXJuYWwKKyMgKFNoZWV0MSFBMSkgb3IgZXh0ZXJuYWwgKCdjOlx0ZW1wXGZvby54bHMjU2hlZXQxIUExJykuCisjCisjIFNlZSBhbHNvIHdyaXRlX3VybCgpIGFib3ZlIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gYW5kIHJldHVybiB2YWx1ZXMuCisjCitzdWIgd3JpdGVfdXJsX3JhbmdlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisgICAgcmV0dXJuIC0xIGlmIEBfIDwgNTsKKworCisgICAgIyBSZXZlcnNlIHRoZSBvcmRlciBvZiAkc3RyaW5nIGFuZCAkZm9ybWF0IGlmIG5lY2Vzc2FyeS4gV2Ugd29yayBvbiBhIGNvcHkKKyAgICAjIGluIG9yZGVyIHRvIHByb3RlY3QgdGhlIGNhbGxlcnMgYXJncy4gV2UgZG9uJ3QgdXNlICJsb2NhbCBAXyIgaW4gY2FzZSBvZgorICAgICMgcGVybDUwMDA1IHRocmVhZHMuCisgICAgIworICAgIG15IEBhcmdzID0gQF87CisKKyAgICAoJGFyZ3NbNV0sICRhcmdzWzZdKSA9ICgkYXJnc1s2XSwgJGFyZ3NbNV0pIGlmIHJlZiAkYXJnc1s1XTsKKworICAgIG15ICR1cmwgPSAkYXJnc1s0XTsKKworCisgICAgIyBDaGVjayBmb3IgaW50ZXJuYWwvZXh0ZXJuYWwgc2hlZXQgbGlua3Mgb3IgZGVmYXVsdCB0byB3ZWIgbGluaworICAgIHJldHVybiAkc2VsZi0+X3dyaXRlX3VybF9pbnRlcm5hbChAYXJncykgaWYgJHVybCA9fiBtW15pbnRlcm5hbDpdOworICAgIHJldHVybiAkc2VsZi0+X3dyaXRlX3VybF9leHRlcm5hbChAYXJncykgaWYgJHVybCA9fiBtW15leHRlcm5hbDpdOworICAgIHJldHVybiAkc2VsZi0+X3dyaXRlX3VybF93ZWIoQGFyZ3MpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3VybF93ZWIoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICR1cmwsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFVzZWQgdG8gd3JpdGUgaHR0cCwgZnRwIGFuZCBtYWlsdG8gaHlwZXJsaW5rcy4KKyMgVGhlIGxpbmsgdHlwZSAoJG9wdGlvbnMpIGlzIDB4MDMgaXMgdGhlIHNhbWUgYXMgYWJzb2x1dGUgZGlyIHJlZiB3aXRob3V0CisjIHNoZWV0LiBIb3dldmVyIGl0IGlzIGRpZmZlcmVudGlhdGVkIGJ5IHRoZSAkdW5rbm93bjIgZGF0YSBzdHJlYW0uCisjCisjIFNlZSBhbHNvIHdyaXRlX3VybCgpIGFib3ZlIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gYW5kIHJldHVybiB2YWx1ZXMuCisjCitzdWIgX3dyaXRlX3VybF93ZWIgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDFCODsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDAwOyAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdzEgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCByb3cKKyAgICBteSAkY29sMSAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IGNvbHVtbgorICAgIG15ICRyb3cyICAgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIHJvdworICAgIG15ICRjb2wyICAgICAgICA9ICRfWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIGNvbHVtbgorICAgIG15ICR1cmwgICAgICAgICA9ICRfWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICMgVVJMIHN0cmluZworICAgIG15ICRzdHIgICAgICAgICA9ICRfWzVdOyAgICAgICAgICAgICAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgbGFiZWwKKyAgICBteSAkeGYgICAgICAgICAgPSAkX1s2XSB8fCAkc2VsZi0+e191cmxfZm9ybWF0fTsjIFRoZSBjZWxsIGZvcm1hdAorCisKKyAgICAjIFdyaXRlIHRoZSB2aXNpYmxlIGxhYmVsIGJ1dCBwcm90ZWN0IGFnYWluc3QgdXJsIHJlY3Vyc2lvbiBpbiB3cml0ZSgpLgorICAgICRzdHIgICAgICAgICAgICAgICAgICA9ICR1cmwgdW5sZXNzIGRlZmluZWQgJHN0cjsKKyAgICAkc2VsZi0+e193cml0aW5nX3VybH0gPSAxOworICAgIG15ICRlcnJvciAgICAgICAgICAgICA9ICRzZWxmLT53cml0ZSgkcm93MSwgJGNvbDEsICRzdHIsICR4Zik7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMDsKKyAgICByZXR1cm4gJGVycm9yICAgICAgICAgaWYgJGVycm9yID09IC0yOworCisKKyAgICAjIFBhY2sgdGhlIHVuZG9jdW1lbnRlZCBwYXJ0cyBvZiB0aGUgaHlwZXJsaW5rIHN0cmVhbQorICAgIG15ICR1bmtub3duMSAgICA9IHBhY2soIkgqIiwgIkQwQzlFQTc5RjlCQUNFMTE4QzgyMDBBQTAwNEJBOTBCMDIwMDAwMDAiKTsKKyAgICBteSAkdW5rbm93bjIgICAgPSBwYWNrKCJIKiIsICJFMEM5RUE3OUY5QkFDRTExOEM4MjAwQUEwMDRCQTkwQiIpOworCisKKyAgICAjIFBhY2sgdGhlIG9wdGlvbiBmbGFncworICAgIG15ICRvcHRpb25zICAgICA9IHBhY2soIlYiLCAweDAzKTsKKworCisgICAgIyBVUkwgZW5jb2RpbmcuCisgICAgbXkgJGVuY29kaW5nICAgID0gMDsKKworICAgICMgQ29udmVydCBhbiBVdGY4IFVSTCB0eXBlIGFuZCB0byBhIG51bGwgdGVybWluYXRlZCB3Y2hhciBzdHJpbmcuCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHVybCkpIHsKKyAgICAgICAgICAgICR1cmwgICAgICA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZMRSIsICR1cmwpOworICAgICAgICAgICAgJHVybCAgICAgLj0gIlwwXDAiOyAjIFVSTCBpcyBudWxsIHRlcm1pbmF0ZWQuCisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgIyBDb252ZXJ0IGFuIEFzY2lpIFVSTCB0eXBlIGFuZCB0byBhIG51bGwgdGVybWluYXRlZCB3Y2hhciBzdHJpbmcuCisgICAgaWYgKCRlbmNvZGluZyA9PSAwKSB7CisgICAgICAgICR1cmwgICAgICAgLj0gIlwwIjsKKyAgICAgICAgJHVybCAgICAgICAgPSBwYWNrICd2KicsIHVucGFjayAnYyonLCAkdXJsOworICAgIH0KKworCisgICAgIyBQYWNrIHRoZSBsZW5ndGggb2YgdGhlIFVSTAorICAgIG15ICR1cmxfbGVuICAgICA9IHBhY2soIlYiLCBsZW5ndGgoJHVybCkpOworCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgZGF0YSBsZW5ndGgKKyAgICAkbGVuZ3RoICAgICAgICAgPSAweDM0ICsgbGVuZ3RoKCR1cmwpOworCisKKyAgICAjIFBhY2sgdGhlIGhlYWRlciBkYXRhCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZ2dnYiLCAkcm93MSwgJHJvdzIsICRjb2wxLCAkY29sMik7CisKKworICAgICMgV3JpdGUgdGhlIHBhY2tlZCBkYXRhCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICRkYXRhLAorICAgICAgICAgICAgICAgICAgICAkdW5rbm93bjEsCisgICAgICAgICAgICAgICAgICAgICRvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAkdW5rbm93bjIsCisgICAgICAgICAgICAgICAgICAgICR1cmxfbGVuLAorICAgICAgICAgICAgICAgICAgICAkdXJsKTsKKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfd3JpdGVfdXJsX2ludGVybmFsKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBVc2VkIHRvIHdyaXRlIGludGVybmFsIHJlZmVyZW5jZSBoeXBlcmxpbmtzIHN1Y2ggYXMgIlNoZWV0MSFBMSIuCisjCisjIFNlZSBhbHNvIHdyaXRlX3VybCgpIGFib3ZlIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gYW5kIHJldHVybiB2YWx1ZXMuCisjCitzdWIgX3dyaXRlX3VybF9pbnRlcm5hbCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMUI4OyAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMDA7ICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93MSAgICAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IHJvdworICAgIG15ICRjb2wxICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgY29sdW1uCisgICAgbXkgJHJvdzIgICAgICAgID0gJF9bMl07ICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgcm93CisgICAgbXkgJGNvbDIgICAgICAgID0gJF9bM107ICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgY29sdW1uCisgICAgbXkgJHVybCAgICAgICAgID0gJF9bNF07ICAgICAgICAgICAgICAgICAgICAgICAgIyBVUkwgc3RyaW5nCisgICAgbXkgJHN0ciAgICAgICAgID0gJF9bNV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHRlcm5hdGl2ZSBsYWJlbAorICAgIG15ICR4ZiAgICAgICAgICA9ICRfWzZdIHx8ICRzZWxmLT57X3VybF9mb3JtYXR9OyMgVGhlIGNlbGwgZm9ybWF0CisKKyAgICAjIFN0cmlwIFVSTCB0eXBlCisgICAgJHVybCAgICAgICAgICAgID1+IHNbXmludGVybmFsOl1bXTsKKworCisgICAgIyBXcml0ZSB0aGUgdmlzaWJsZSBsYWJlbCBidXQgcHJvdGVjdCBhZ2FpbnN0IHVybCByZWN1cnNpb24gaW4gd3JpdGUoKS4KKyAgICAkc3RyICAgICAgICAgICAgICAgICAgPSAkdXJsIHVubGVzcyBkZWZpbmVkICRzdHI7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMTsKKyAgICBteSAkZXJyb3IgICAgICAgICAgICAgPSAkc2VsZi0+d3JpdGUoJHJvdzEsICRjb2wxLCAkc3RyLCAkeGYpOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDA7CisgICAgcmV0dXJuICRlcnJvciAgICAgICAgIGlmICRlcnJvciA9PSAtMjsKKworCisgICAgIyBQYWNrIHRoZSB1bmRvY3VtZW50ZWQgcGFydHMgb2YgdGhlIGh5cGVybGluayBzdHJlYW0KKyAgICBteSAkdW5rbm93bjEgICAgPSBwYWNrKCJIKiIsICJEMEM5RUE3OUY5QkFDRTExOEM4MjAwQUEwMDRCQTkwQjAyMDAwMDAwIik7CisKKworICAgICMgUGFjayB0aGUgb3B0aW9uIGZsYWdzCisgICAgbXkgJG9wdGlvbnMgICAgID0gcGFjaygiViIsIDB4MDgpOworCisKKyAgICAjIFVSTCBlbmNvZGluZy4KKyAgICBteSAkZW5jb2RpbmcgICAgPSAwOworCisKKyAgICAjIENvbnZlcnQgYW4gVXRmOCBVUkwgdHlwZSBhbmQgdG8gYSBudWxsIHRlcm1pbmF0ZWQgd2NoYXIgc3RyaW5nLgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCR1cmwpKSB7CisgICAgICAgICAgICAjIFF1b3RlIHNoZWV0IG5hbWUgaWYgbm90IGFscmVhZHksIGkuZS4sIFNoZWV0IUExIHRvICdTaGVldCFBMScuCisgICAgICAgICAgICAkdXJsICAgICAgPX4gcy9eKC4rKSEvJyQxJyEvIGlmIG5vdCAkdXJsID1+IC9eJy87CisKKyAgICAgICAgICAgICR1cmwgICAgICA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZMRSIsICR1cmwpOworICAgICAgICAgICAgJHVybCAgICAgLj0gIlwwXDAiOyAjIFVSTCBpcyBudWxsIHRlcm1pbmF0ZWQuCisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjIENvbnZlcnQgYW4gQXNjaWkgVVJMIHR5cGUgYW5kIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHdjaGFyIHN0cmluZy4KKyAgICBpZiAoJGVuY29kaW5nID09IDApIHsKKyAgICAgICAgJHVybCAgICAgICAuPSAiXDAiOworICAgICAgICAkdXJsICAgICAgICA9IHBhY2sgJ3YqJywgdW5wYWNrICdjKicsICR1cmw7CisgICAgfQorCisKKyAgICAjIFBhY2sgdGhlIGxlbmd0aCBvZiB0aGUgVVJMIGFzIGNoYXJzIChub3Qgd2NoYXJzKQorICAgIG15ICR1cmxfbGVuICAgICA9IHBhY2soIlYiLCBpbnQobGVuZ3RoKCR1cmwpLzIpKTsKKworCisgICAgIyBDYWxjdWxhdGUgdGhlIGRhdGEgbGVuZ3RoCisgICAgJGxlbmd0aCAgICAgICAgID0gMHgyNCArIGxlbmd0aCgkdXJsKTsKKworCisgICAgIyBQYWNrIHRoZSBoZWFkZXIgZGF0YQorICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2dnZ2IiwgJHJvdzEsICRyb3cyLCAkY29sMSwgJGNvbDIpOworCisKKyAgICAjIFdyaXRlIHRoZSBwYWNrZWQgZGF0YQorICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAkZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJHVua25vd24xLAorICAgICAgICAgICAgICAgICAgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgJHVybF9sZW4sCisgICAgICAgICAgICAgICAgICAgICR1cmwpOworCisgICAgcmV0dXJuICRlcnJvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV91cmxfZXh0ZXJuYWwoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICR1cmwsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFdyaXRlIGxpbmtzIHRvIGV4dGVybmFsIGRpcmVjdG9yeSBuYW1lcyBzdWNoIGFzICdjOlxmb28ueGxzJywKKyMgYzpcZm9vLnhscyNTaGVldDEhQTEnLCAnLi4vLi4vZm9vLnhscycuIGFuZCAnLi4vLi4vZm9vLnhscyNTaGVldDEhQTEnLgorIworIyBOb3RlOiBFeGNlbCB3cml0ZXMgc29tZSByZWxhdGl2ZSBsaW5rcyB3aXRoIHRoZSAkZGlyX2xvbmcgc3RyaW5nLiBXZSBpZ25vcmUKKyMgdGhlc2UgY2FzZXMgZm9yIHRoZSBzYWtlIG9mIHNpbXBsZXIgY29kZS4KKyMKKyMgU2VlIGFsc28gd3JpdGVfdXJsKCkgYWJvdmUgZm9yIGEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBhbmQgcmV0dXJuIHZhbHVlcy4KKyMKK3N1YiBfd3JpdGVfdXJsX2V4dGVybmFsIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICAjIE5ldHdvcmsgZHJpdmVzIGFyZSBkaWZmZXJlbnQuIFdlIHdpbGwgaGFuZGxlIHRoZW0gc2VwYXJhdGVseQorICAgICMgTVMvTm92ZWxsIG5ldHdvcmsgZHJpdmVzIGFuZCBzaGFyZXMgc3RhcnQgd2l0aCBcXAorICAgIHJldHVybiAkc2VsZi0+X3dyaXRlX3VybF9leHRlcm5hbF9uZXQoQF8pIGlmICRfWzRdID1+IG1bXmV4dGVybmFsOlxcXFxdOworCisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjg7ICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cxICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJGNvbDEgICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkcm93MiAgICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCByb3cKKyAgICBteSAkY29sMiAgICAgICAgPSAkX1szXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBjb2x1bW4KKyAgICBteSAkdXJsICAgICAgICAgPSAkX1s0XTsgICAgICAgICAgICAgICAgICAgICAgICAjIFVSTCBzdHJpbmcKKyAgICBteSAkc3RyICAgICAgICAgPSAkX1s1XTsgICAgICAgICAgICAgICAgICAgICAgICAjIEFsdGVybmF0aXZlIGxhYmVsCisgICAgbXkgJHhmICAgICAgICAgID0gJF9bNl0gfHwgJHNlbGYtPntfdXJsX2Zvcm1hdH07IyBUaGUgY2VsbCBmb3JtYXQKKworCisgICAgIyBTdHJpcCBVUkwgdHlwZSBhbmQgY2hhbmdlIFVuaXggZGlyIHNlcGFyYXRvciB0byBEb3Mgc3R5bGUgKGlmIG5lZWRlZCkKKyAgICAjCisgICAgJHVybCAgICAgICAgICAgID1+IHNbXmV4dGVybmFsOl1bXTsKKyAgICAkdXJsICAgICAgICAgICAgPX4gc1svXVtcXF1nOworCisKKyAgICAjIFdyaXRlIHRoZSB2aXNpYmxlIGxhYmVsIGJ1dCBwcm90ZWN0IGFnYWluc3QgdXJsIHJlY3Vyc2lvbiBpbiB3cml0ZSgpLgorICAgICgkc3RyID0gJHVybCkgICAgICAgICA9fiBzW1wjXVsgLSBdIHVubGVzcyBkZWZpbmVkICRzdHI7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMTsKKyAgICBteSAkZXJyb3IgICAgICAgICAgICAgPSAkc2VsZi0+d3JpdGUoJHJvdzEsICRjb2wxLCAkc3RyLCAkeGYpOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDA7CisgICAgcmV0dXJuICRlcnJvciAgICAgICAgIGlmICRlcnJvciA9PSAtMjsKKworCisgICAgIyBEZXRlcm1pbmUgaWYgdGhlIGxpbmsgaXMgcmVsYXRpdmUgb3IgYWJzb2x1dGU6CisgICAgIyBBYnNvbHV0ZSBpZiBsaW5rIHN0YXJ0cyB3aXRoIERPUyBkcml2ZSBzcGVjaWZpZXIgbGlrZSBDOgorICAgICMgT3RoZXJ3aXNlIGRlZmF1bHQgdG8gMHgwMCBmb3IgcmVsYXRpdmUgbGluay4KKyAgICAjCisgICAgbXkgJGFic29sdXRlICAgID0gMHgwMDsKKyAgICAgICAkYWJzb2x1dGUgICAgPSAweDAyICBpZiAkdXJsID1+IG0vXltBLVphLXpdOi87CisKKworICAgICMgRGV0ZXJtaW5lIGlmIHRoZSBsaW5rIGNvbnRhaW5zIGEgc2hlZXQgcmVmZXJlbmNlIGFuZCBjaGFuZ2Ugc29tZSBvZiB0aGUKKyAgICAjIHBhcmFtZXRlcnMgYWNjb3JkaW5nbHkuCisgICAgIyBTcGxpdCB0aGUgZGlyIG5hbWUgYW5kIHNoZWV0IG5hbWUgKGlmIGl0IGV4aXN0cykKKyAgICAjCisgICAgbXkgKCRkaXJfbG9uZyAsICRzaGVldCkgPSBzcGxpdCAvXCMvLCAkdXJsOworICAgIG15ICRsaW5rX3R5cGUgICAgICAgICAgID0gMHgwMSB8ICRhYnNvbHV0ZTsKKyAgICBteSAkc2hlZXRfbGVuOworCisgICAgaWYgKGRlZmluZWQgJHNoZWV0KSB7CisgICAgICAgICRsaW5rX3R5cGUgfD0gMHgwODsKKyAgICAgICAgJHNoZWV0X2xlbiAgPSBwYWNrKCJWIiwgbGVuZ3RoKCRzaGVldCkgKyAweDAxKTsKKyAgICAgICAgJHNoZWV0ICAgICAgPSBqb2luKCJcMCIsIHNwbGl0KCcnLCAkc2hlZXQpKTsKKyAgICAgICAgJHNoZWV0ICAgICAuPSAiXDBcMFwwIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzaGVldF9sZW4gID0gJyc7CisgICAgICAgICRzaGVldCAgICAgID0gJyc7CisgICAgfQorCisKKyAgICAjIFBhY2sgdGhlIGxpbmsgdHlwZQorICAgICRsaW5rX3R5cGUgICAgICA9IHBhY2soIlYiLCAkbGlua190eXBlKTsKKworCisgICAgIyBDYWxjdWxhdGUgdGhlIHVwLWxldmVsIGRpciBjb3VudCBlLmcuICguLlwuLlwuLlwgPT0gMykKKyAgICBteSAkdXBfY291bnQgICAgPSAwOworICAgICR1cF9jb3VudCsrICAgICAgIHdoaWxlICRkaXJfbG9uZyA9fiBzW15cLlwuXFxdW107CisgICAgJHVwX2NvdW50ICAgICAgID0gcGFjaygidiIsICR1cF9jb3VudCk7CisKKworICAgICMgU3RvcmUgdGhlIHNob3J0IGRvcyBkaXIgbmFtZSAobnVsbCB0ZXJtaW5hdGVkKQorICAgIG15ICRkaXJfc2hvcnQgICA9ICRkaXJfbG9uZyAuICJcMCI7CisKKworICAgICMgU3RvcmUgdGhlIGxvbmcgZGlyIG5hbWUgYXMgYSB3Y2hhciBzdHJpbmcgKG5vbi1udWxsIHRlcm1pbmF0ZWQpCisgICAgJGRpcl9sb25nICAgICAgID0gam9pbigiXDAiLCBzcGxpdCgnJywgJGRpcl9sb25nKSk7CisgICAgJGRpcl9sb25nICAgICAgID0gJGRpcl9sb25nIC4gIlwwIjsKKworCisgICAgIyBQYWNrIHRoZSBsZW5ndGhzIG9mIHRoZSBkaXIgc3RyaW5ncworICAgIG15ICRkaXJfc2hvcnRfbGVuID0gcGFjaygiViIsIGxlbmd0aCAkZGlyX3Nob3J0ICAgICAgKTsKKyAgICBteSAkZGlyX2xvbmdfbGVuICA9IHBhY2soIlYiLCBsZW5ndGggJGRpcl9sb25nICAgICAgICk7CisgICAgbXkgJHN0cmVhbV9sZW4gICAgPSBwYWNrKCJWIiwgbGVuZ3RoKCRkaXJfbG9uZykgKyAweDA2KTsKKworCisgICAgIyBQYWNrIHRoZSB1bmRvY3VtZW50ZWQgcGFydHMgb2YgdGhlIGh5cGVybGluayBzdHJlYW0KKyAgICBteSAkdW5rbm93bjEgPXBhY2soIkgqIiwnRDBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIwMjAwMDAwMCcgICAgICAgKTsKKyAgICBteSAkdW5rbm93bjIgPXBhY2soIkgqIiwnMDMwMzAwMDAwMDAwMDAwMEMwMDAwMDAwMDAwMDAwNDYnICAgICAgICAgICAgICAgKTsKKyAgICBteSAkdW5rbm93bjMgPXBhY2soIkgqIiwnRkZGRkFEREUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKTsKKyAgICBteSAkdW5rbm93bjQgPXBhY2soInYiLCAgMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgIyBQYWNrIHRoZSBtYWluIGRhdGEgc3RyZWFtCisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnZ2diIsICRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKSAuCisgICAgICAgICAgICAgICAgICAgICAgJHVua25vd24xICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJGxpbmtfdHlwZSAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHVua25vd24yICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHVwX2NvdW50ICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9zaG9ydF9sZW4uCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9zaG9ydCAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHVua25vd24zICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHN0cmVhbV9sZW4gICAuCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9sb25nX2xlbiAuCisgICAgICAgICAgICAgICAgICAgICAgJHVua25vd240ICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9sb25nICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0X2xlbiAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0ICAgICAgICA7CisKKworICAgICMgUGFjayB0aGUgaGVhZGVyIGRhdGEKKyAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICRyZWNvcmQsICRsZW5ndGgpOworCisKKyAgICAjIFdyaXRlIHRoZSBwYWNrZWQgZGF0YQorICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3VybF9leHRlcm5hbF9uZXQoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICR1cmwsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFdyaXRlIGxpbmtzIHRvIGV4dGVybmFsIE1TL05vdmVsbCBuZXR3b3JrIGRyaXZlcyBhbmQgc2hhcmVzIHN1Y2ggYXMKKyMgJy8vTkVUV09SSy9zaGFyZS9mb28ueGxzJyBhbmQgJy8vTkVUV09SSy9zaGFyZS9mb28ueGxzI1NoZWV0MSFBMScuCisjCisjIFNlZSBhbHNvIHdyaXRlX3VybCgpIGFib3ZlIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gYW5kIHJldHVybiB2YWx1ZXMuCisjCitzdWIgX3dyaXRlX3VybF9leHRlcm5hbF9uZXQgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDFCODsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDAwOyAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdzEgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCByb3cKKyAgICBteSAkY29sMSAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IGNvbHVtbgorICAgIG15ICRyb3cyICAgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIHJvdworICAgIG15ICRjb2wyICAgICAgICA9ICRfWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIGNvbHVtbgorICAgIG15ICR1cmwgICAgICAgICA9ICRfWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICMgVVJMIHN0cmluZworICAgIG15ICRzdHIgICAgICAgICA9ICRfWzVdOyAgICAgICAgICAgICAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgbGFiZWwKKyAgICBteSAkeGYgICAgICAgICAgPSAkX1s2XSB8fCAkc2VsZi0+e191cmxfZm9ybWF0fTsjIFRoZSBjZWxsIGZvcm1hdAorCisKKyAgICAjIFN0cmlwIFVSTCB0eXBlIGFuZCBjaGFuZ2UgVW5peCBkaXIgc2VwYXJhdG9yIHRvIERvcyBzdHlsZSAoaWYgbmVlZGVkKQorICAgICMKKyAgICAkdXJsICAgICAgICAgICAgPX4gc1teZXh0ZXJuYWw6XVtdOworICAgICR1cmwgICAgICAgICAgICA9fiBzWy9dW1xcXWc7CisKKworICAgICMgV3JpdGUgdGhlIHZpc2libGUgbGFiZWwgYnV0IHByb3RlY3QgYWdhaW5zdCB1cmwgcmVjdXJzaW9uIGluIHdyaXRlKCkuCisgICAgKCRzdHIgPSAkdXJsKSAgICAgICAgID1+IHNbXCNdWyAtIF0gdW5sZXNzIGRlZmluZWQgJHN0cjsKKyAgICAkc2VsZi0+e193cml0aW5nX3VybH0gPSAxOworICAgIG15ICRlcnJvciAgICAgICAgICAgICA9ICRzZWxmLT53cml0ZSgkcm93MSwgJGNvbDEsICRzdHIsICR4Zik7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMDsKKyAgICByZXR1cm4gJGVycm9yICAgICAgICAgaWYgJGVycm9yID09IC0yOworCisKKyAgICAjIERldGVybWluZSBpZiB0aGUgbGluayBjb250YWlucyBhIHNoZWV0IHJlZmVyZW5jZSBhbmQgY2hhbmdlIHNvbWUgb2YgdGhlCisgICAgIyBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5LgorICAgICMgU3BsaXQgdGhlIGRpciBuYW1lIGFuZCBzaGVldCBuYW1lIChpZiBpdCBleGlzdHMpCisgICAgIworICAgIG15ICgkZGlyX2xvbmcgLCAkc2hlZXQpID0gc3BsaXQgL1wjLywgJHVybDsKKyAgICBteSAkbGlua190eXBlICAgICAgICAgICA9IDB4MDEwMzsgIyBBbHdheXMgYWJzb2x1dGUKKyAgICBteSAkc2hlZXRfbGVuOworCisgICAgaWYgKGRlZmluZWQgJHNoZWV0KSB7CisgICAgICAgICRsaW5rX3R5cGUgfD0gMHgwODsKKyAgICAgICAgJHNoZWV0X2xlbiAgPSBwYWNrKCJWIiwgbGVuZ3RoKCRzaGVldCkgKyAweDAxKTsKKyAgICAgICAgJHNoZWV0ICAgICAgPSBqb2luKCJcMCIsIHNwbGl0KCcnLCAkc2hlZXQpKTsKKyAgICAgICAgJHNoZWV0ICAgICAuPSAiXDBcMFwwIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzaGVldF9sZW4gICA9ICcnOworICAgICAgICAkc2hlZXQgICAgICAgPSAnJzsKKyAgICB9CisKKyAgICAjIFBhY2sgdGhlIGxpbmsgdHlwZQorICAgICRsaW5rX3R5cGUgICAgICA9IHBhY2soIlYiLCAkbGlua190eXBlKTsKKworCisgICAgIyBNYWtlIHRoZSBzdHJpbmcgbnVsbCB0ZXJtaW5hdGVkCisgICAgJGRpcl9sb25nICAgICAgID0gJGRpcl9sb25nIC4gIlwwIjsKKworCisgICAgIyBQYWNrIHRoZSBsZW5ndGhzIG9mIHRoZSBkaXIgc3RyaW5nCisgICAgbXkgJGRpcl9sb25nX2xlbiAgPSBwYWNrKCJWIiwgbGVuZ3RoICRkaXJfbG9uZyk7CisKKworICAgICMgU3RvcmUgdGhlIGxvbmcgZGlyIG5hbWUgYXMgYSB3Y2hhciBzdHJpbmcgKG5vbi1udWxsIHRlcm1pbmF0ZWQpCisgICAgJGRpcl9sb25nICAgICAgID0gam9pbigiXDAiLCBzcGxpdCgnJywgJGRpcl9sb25nKSk7CisgICAgJGRpcl9sb25nICAgICAgID0gJGRpcl9sb25nIC4gIlwwIjsKKworCisgICAgIyBQYWNrIHRoZSB1bmRvY3VtZW50ZWQgcGFydCBvZiB0aGUgaHlwZXJsaW5rIHN0cmVhbQorICAgIG15ICR1bmtub3duMSAgICA9IHBhY2soIkgqIiwnRDBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIwMjAwMDAwMCcpOworCisKKyAgICAjIFBhY2sgdGhlIG1haW4gZGF0YSBzdHJlYW0KKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2dnZ2IiwgJHJvdzEsICRyb3cyLCAkY29sMSwgJGNvbDIpIC4KKyAgICAgICAgICAgICAgICAgICAgICAkdW5rbm93bjEgICAgIC4KKyAgICAgICAgICAgICAgICAgICAgICAkbGlua190eXBlICAgIC4KKyAgICAgICAgICAgICAgICAgICAgICAkZGlyX2xvbmdfbGVuIC4KKyAgICAgICAgICAgICAgICAgICAgICAkZGlyX2xvbmcgICAgIC4KKyAgICAgICAgICAgICAgICAgICAgICAkc2hlZXRfbGVuICAgIC4KKyAgICAgICAgICAgICAgICAgICAgICAkc2hlZXQgICAgICAgIDsKKworCisgICAgIyBQYWNrIHRoZSBoZWFkZXIgZGF0YQorICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisKKworICAgICMgV3JpdGUgdGhlIHBhY2tlZCBkYXRhCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisgICAgcmV0dXJuICRlcnJvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX2RhdGVfdGltZSAoJHJvdywgJGNvbCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBkYXRldGltZSBzdHJpbmcgaW4gSVNPODYwMSAieXl5eS1tbS1kZFRoaDptbTpzcy5zcyIgZm9ybWF0IGFzIGEKKyMgbnVtYmVyIHJlcHJlc2VudGluZyBhbiBFeGNlbCBkYXRlLiAkZm9ybWF0IGlzIG9wdGlvbmFsLgorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMgICAgICAgICAtMyA6IEludmFsaWQgZGF0ZV90aW1lLCB3cml0dGVuIGFzIHN0cmluZworIworc3ViIHdyaXRlX2RhdGVfdGltZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKworICAgIG15ICRyb3cgICAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJHN0ciAgICAgICA9ICRfWzJdOworCisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wpOworCisgICAgbXkgJGVycm9yICAgICA9IDA7CisgICAgbXkgJGRhdGVfdGltZSA9ICRzZWxmLT5jb252ZXJ0X2RhdGVfdGltZSgkc3RyKTsKKworICAgIGlmIChkZWZpbmVkICRkYXRlX3RpbWUpIHsKKyAgICAgICAgJGVycm9yID0gJHNlbGYtPndyaXRlX251bWJlcigkcm93LCAkY29sLCAkZGF0ZV90aW1lLCAkX1szXSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAjIFRoZSBkYXRlIGlzbid0IHZhbGlkIHNvIHdyaXRlIGl0IGFzIGEgc3RyaW5nLgorICAgICAgICAkc2VsZi0+d3JpdGVfc3RyaW5nKCRyb3csICRjb2wsICRzdHIsICRfWzNdKTsKKyAgICAgICAgJGVycm9yID0gLTM7CisgICAgfQorICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNvbnZlcnRfZGF0ZV90aW1lKCRkYXRlX3RpbWVfc3RyaW5nKQorIworIyBUaGUgZnVuY3Rpb24gdGFrZXMgYSBkYXRlIGFuZCB0aW1lIGluIElTTzg2MDEgInl5eXktbW0tZGRUaGg6bW06c3Muc3MiIGZvcm1hdAorIyBhbmQgY29udmVydHMgaXQgdG8gYSBkZWNpbWFsIG51bWJlciByZXByZXNlbnRpbmcgYSB2YWxpZCBFeGNlbCBkYXRlLgorIworIyBEYXRlcyBhbmQgdGltZXMgaW4gRXhjZWwgYXJlIHJlcHJlc2VudGVkIGJ5IHJlYWwgbnVtYmVycy4gVGhlIGludGVnZXIgcGFydCBvZgorIyB0aGUgbnVtYmVyIHN0b3JlcyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoIGFuZCB0aGUgZnJhY3Rpb25hbCBwYXJ0CisjIHN0b3JlcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgZGF5IGluIHNlY29uZHMuIFRoZSBlcG9jaCBjYW4gYmUgZWl0aGVyIDE5MDAgb3IKKyMgMTkwNC4KKyMKKyMgUGFyYW1ldGVyOiBEYXRlIGFuZCB0aW1lIHN0cmluZyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgorIyAgICAgICAgICAgICAgIHl5eXktbW0tZGRUaGg6bW06c3Muc3MgICMgU3RhbmRhcmQKKyMgICAgICAgICAgICAgICB5eXl5LW1tLWRkVCAgICAgICAgICAgICAjIERhdGUgb25seQorIyAgICAgICAgICAgICAgICAgICAgICAgICBUaGg6bW06c3Muc3MgICMgVGltZSBvbmx5CisjCisjIFJldHVybnM6CisjICAgICAgICAgICAgQSBkZWNpbWFsIG51bWJlciByZXByZXNlbnRpbmcgYSB2YWxpZCBFeGNlbCBkYXRlLCBvcgorIyAgICAgICAgICAgIHVuZGVmIGlmIHRoZSBkYXRlIGlzIGludmFsaWQuCisjCitzdWIgY29udmVydF9kYXRlX3RpbWUgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworICAgIG15ICRkYXRlX3RpbWUgPSAkX1swXTsKKworICAgIG15ICRkYXlzICAgICAgPSAwOyAjIE51bWJlciBvZiBkYXlzIHNpbmNlIGVwb2NoCisgICAgbXkgJHNlY29uZHMgICA9IDA7ICMgVGltZSBleHByZXNzZWQgYXMgZnJhY3Rpb24gb2YgMjRoIGhvdXJzIGluIHNlY29uZHMKKworICAgIG15ICgkeWVhciwgJG1vbnRoLCAkZGF5KTsKKyAgICBteSAoJGhvdXIsICRtaW4sICRzZWMpOworCisKKyAgICAjIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgJGRhdGVfdGltZSA9fiBzL15ccysvLzsKKyAgICAkZGF0ZV90aW1lID1+IHMvXHMrJC8vOworCisgICAgIyBDaGVjayBmb3IgaW52YWxpZCBkYXRlIGNoYXIuCisgICAgcmV0dXJuIGlmICAgICAkZGF0ZV90aW1lID1+IC9bXjAtOVQ6XC1cLlpdLzsKKworICAgICMgQ2hlY2sgZm9yICJUIiBhZnRlciBkYXRlIG9yIGJlZm9yZSB0aW1lLgorICAgIHJldHVybiB1bmxlc3MgJGRhdGVfdGltZSA9fiAvXGRUfFRcZC87CisKKyAgICAjIFN0cmlwIHRyYWlsaW5nIFogaW4gSVNPODYwMSBkYXRlLgorICAgICRkYXRlX3RpbWUgPX4gcy9aJC8vOworCisKKyAgICAjIFNwbGl0IGludG8gZGF0ZSBhbmQgdGltZS4KKyAgICBteSAoJGRhdGUsICR0aW1lKSA9IHNwbGl0IC9ULywgJGRhdGVfdGltZTsKKworCisgICAgIyBXZSBhbGxvdyB0aGUgdGltZSBwb3J0aW9uIG9mIHRoZSBpbnB1dCBEYXRlVGltZSB0byBiZSBvcHRpb25hbC4KKyAgICBpZiAoJHRpbWUgbmUgJycpIHsKKyAgICAgICAgIyBNYXRjaCBoaDptbTpzcy5zc3MrIHdoZXJlIHRoZSBzZWNvbmRzIGFyZSBvcHRpb25hbAorICAgICAgICBpZiAoJHRpbWUgPX4gL14oXGRcZCk6KFxkXGQpKDooXGRcZChcLlxkKyk/KSk/LykgeworICAgICAgICAgICAgJGhvdXIgICA9ICQxOworICAgICAgICAgICAgJG1pbiAgICA9ICQyOworICAgICAgICAgICAgJHNlYyAgICA9ICQ0IHx8IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdW5kZWY7ICMgTm90IGEgdmFsaWQgdGltZSBmb3JtYXQuCisgICAgICAgIH0KKworICAgICAgICAjIFNvbWUgYm91bmRhcnkgY2hlY2tzCisgICAgICAgIHJldHVybiBpZiAkaG91ciA+PSAyNDsKKyAgICAgICAgcmV0dXJuIGlmICRtaW4gID49IDYwOworICAgICAgICByZXR1cm4gaWYgJHNlYyAgPj0gNjA7CisKKyAgICAgICAgIyBFeGNlbCBleHByZXNzZXMgc2Vjb25kcyBhcyBhIGZyYWN0aW9uIG9mIHRoZSBudW1iZXIgaW4gMjQgaG91cnMuCisgICAgICAgICRzZWNvbmRzID0gKCRob3VyICo2MCo2MCArICRtaW4gKjYwICsgJHNlYykgLyAoMjQgKjYwICo2MCk7CisgICAgfQorCisKKyAgICAjIFdlIGFsbG93IHRoZSBkYXRlIHBvcnRpb24gb2YgdGhlIGlucHV0IERhdGVUaW1lIHRvIGJlIG9wdGlvbmFsLgorICAgIHJldHVybiAkc2Vjb25kcyBpZiAkZGF0ZSBlcSAnJzsKKworCisgICAgIyBNYXRjaCBkYXRlIGFzIHl5eXktbW0tZGQuCisgICAgaWYgKCRkYXRlID1+IC9eKFxkXGRcZFxkKS0oXGRcZCktKFxkXGQpJC8pIHsKKyAgICAgICAgJHllYXIgICA9ICQxOworICAgICAgICAkbW9udGggID0gJDI7CisgICAgICAgICRkYXkgICAgPSAkMzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiB1bmRlZjsgIyBOb3QgYSB2YWxpZCBkYXRlIGZvcm1hdC4KKyAgICB9CisKKyAgICAjIFNldCB0aGUgZXBvY2ggYXMgMTkwMCBvciAxOTA0LiBEZWZhdWx0cyB0byAxOTAwLgorICAgIG15ICRkYXRlXzE5MDQgPSAkc2VsZi0+e18xOTA0fTsKKworCisgICAgIyBTcGVjaWFsIGNhc2VzIGZvciBFeGNlbC4KKyAgICBpZiAobm90ICRkYXRlXzE5MDQpIHsKKyAgICAgICAgcmV0dXJuICAgICAgJHNlY29uZHMgaWYgJGRhdGUgZXEgJzE4OTktMTItMzEnOyAjIEV4Y2VsIDE5MDAgZXBvY2gKKyAgICAgICAgcmV0dXJuICAgICAgJHNlY29uZHMgaWYgJGRhdGUgZXEgJzE5MDAtMDEtMDAnOyAjIEV4Y2VsIDE5MDAgZXBvY2gKKyAgICAgICAgcmV0dXJuIDYwICsgJHNlY29uZHMgaWYgJGRhdGUgZXEgJzE5MDAtMDItMjknOyAjIEV4Y2VsIGZhbHNlIGxlYXBkYXkKKyAgICB9CisKKworICAgICMgV2UgY2FsY3VsYXRlIHRoZSBkYXRlIGJ5IGNhbGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZXBvY2gKKyAgICAjIGFuZCBhZGp1c3QgZm9yIHRoZSBudW1iZXIgb2YgbGVhcCBkYXlzLiBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBsZWFwCisgICAgIyBkYXlzIGJ5IG5vcm1hbGlzaW5nIHRoZSB5ZWFyIGluIHJlbGF0aW9uIHRvIHRoZSBlcG9jaC4gVGh1cyB0aGUgeWVhciAyMDAwCisgICAgIyBiZWNvbWVzIDEwMCBmb3IgNCBhbmQgMTAwIHllYXIgbGVhcGRheXMgYW5kIDQwMCBmb3IgNDAwIHllYXIgbGVhcGRheXMuCisgICAgIworICAgIG15ICRlcG9jaCAgID0gJGRhdGVfMTkwNCA/IDE5MDQgOiAxOTAwOworICAgIG15ICRvZmZzZXQgID0gJGRhdGVfMTkwNCA/ICAgIDQgOiAgICAwOworICAgIG15ICRub3JtICAgID0gMzAwOworICAgIG15ICRyYW5nZSAgID0gJHllYXIgLSRlcG9jaDsKKworCisgICAgIyBTZXQgbW9udGggZGF5cyBhbmQgY2hlY2sgZm9yIGxlYXAgeWVhci4KKyAgICBteSBAbWRheXMgICA9ICgzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxKTsKKyAgICBteSAkbGVhcCAgICA9IDA7CisgICAgICAgJGxlYXAgICAgPSAxICBpZiAkeWVhciAlIDQgPT0gMCBhbmQgJHllYXIgJSAxMDAgb3IgJHllYXIgJSA0MDAgPT0gMDsKKyAgICAkbWRheXNbMV0gICA9IDI5IGlmICRsZWFwOworCisKKyAgICAjIFNvbWUgYm91bmRhcnkgY2hlY2tzCisgICAgcmV0dXJuIGlmICR5ZWFyICA8ICRlcG9jaCBvciAkeWVhciAgPiA5OTk5OworICAgIHJldHVybiBpZiAkbW9udGggPCAxICAgICAgb3IgJG1vbnRoID4gMTI7CisgICAgcmV0dXJuIGlmICRkYXkgICA8IDEgICAgICBvciAkZGF5ICAgPiAkbWRheXNbJG1vbnRoIC0xXTsKKworICAgICMgQWNjdW11bGF0ZSB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoLgorICAgICRkYXlzICA9ICRkYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBZGQgZGF5cyBmb3IgY3VycmVudCBtb250aAorICAgICRkYXlzICs9ICRtZGF5c1skX10gZm9yIDAgLi4gJG1vbnRoIC0yOyAgICAgIyBBZGQgZGF5cyBmb3IgcGFzdCBtb250aHMKKyAgICAkZGF5cyArPSAkcmFuZ2UgKjM2NTsgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIGRheXMgZm9yIHBhc3QgeWVhcnMKKyAgICAkZGF5cyArPSBpbnQoKCRyYW5nZSkgICAgICAgICAgICAgICAgLyAgNCk7ICMgQWRkIGxlYXBkYXlzCisgICAgJGRheXMgLT0gaW50KCgkcmFuZ2UgKyRvZmZzZXQpICAgICAgIC8xMDApOyAjIFN1YnRyYWN0IDEwMCB5ZWFyIGxlYXBkYXlzCisgICAgJGRheXMgKz0gaW50KCgkcmFuZ2UgKyRvZmZzZXQgKyRub3JtKS80MDApOyAjIEFkZCA0MDAgeWVhciBsZWFwZGF5cworICAgICRkYXlzIC09ICRsZWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHJlYWR5IGNvdW50ZWQgYWJvdmUKKworCisgICAgIyBBZGp1c3QgZm9yIEV4Y2VsIGVycm9uZW91c2x5IHRyZWF0aW5nIDE5MDAgYXMgYSBsZWFwIHllYXIuCisgICAgJGRheXMrKyBpZiAkZGF0ZV8xOTA0ID09IDAgYW5kICRkYXlzID4gNTk7CisKKyAgICByZXR1cm4gJGRheXMgKyAkc2Vjb25kczsKK30KKworCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9yb3coJHJvdywgJGhlaWdodCwgJFhGLCAkaGlkZGVuLCAkbGV2ZWwpCisjCisjIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBoZWlnaHQgYW5kIFhGIGZvcm1hdCBmb3IgYSByb3cuCisjIFdyaXRlcyB0aGUgIEJJRkYgcmVjb3JkIFJPVy4KKyMKK3N1YiBzZXRfcm93IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDIwODsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDEwOyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICMgUm93IE51bWJlcgorICAgIG15ICRjb2xNaWMgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIEZpcnN0IGRlZmluZWQgY29sdW1uCisgICAgbXkgJGNvbE1hYyAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgTGFzdCBkZWZpbmVkIGNvbHVtbgorICAgIG15ICRtaXlSdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJvdyBoZWlnaHQKKyAgICBteSAkaXJ3TWFjICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBVc2VkIGJ5IEV4Y2VsIHRvIG9wdGltaXNlIGxvYWRpbmcKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBSZXNlcnZlZAorICAgIG15ICRncmJpdCAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRpeGZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhGIGluZGV4CisgICAgbXkgJGhlaWdodCAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICMgRm9ybWF0IG9iamVjdAorICAgIG15ICRmb3JtYXQgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAjIEZvcm1hdCBvYmplY3QKKyAgICBteSAkaGlkZGVuICAgICAgPSAkX1szXSB8fCAwOyAgICAgICAgICAgIyBIaWRkZW4gZmxhZworICAgIG15ICRsZXZlbCAgICAgICA9ICRfWzRdIHx8IDA7ICAgICAgICAgICAjIE91dGxpbmUgbGV2ZWwKKyAgICBteSAkY29sbGFwc2VkICAgPSAkX1s1XSB8fCAwOyAgICAgICAgICAgIyBDb2xsYXBzZWQgcm93CisKKworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkcm93OyAgIyBFbnN1cmUgYXQgbGVhc3QgJHJvdyBpcyBzcGVjaWZpZWQuCisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3csIDAsIDAsIDEpOworCisgICAgIyBDaGVjayBmb3IgYSBmb3JtYXQgb2JqZWN0CisgICAgaWYgKHJlZiAkZm9ybWF0KSB7CisgICAgICAgICRpeGZlID0gJGZvcm1hdC0+Z2V0X3hmX2luZGV4KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkaXhmZSA9IDB4MEY7CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgcm93IGhlaWdodCBpbiB1bml0cyBvZiAxLzIwIG9mIGEgcG9pbnQuIE5vdGUsIHNvbWUgaGVpZ2h0cyBtYXkKKyAgICAjIG5vdCBiZSBvYnRhaW5lZCBleGFjdGx5IGR1ZSB0byByb3VuZGluZyBpbiBFeGNlbC4KKyAgICAjCisgICAgaWYgKGRlZmluZWQgJGhlaWdodCkgeworICAgICAgICAkbWl5UncgPSAkaGVpZ2h0ICoyMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRtaXlSdyA9IDB4ZmY7ICMgVGhlIGRlZmF1bHQgcm93IGhlaWdodAorICAgICAgICAkaGVpZ2h0ID0gMDsKKyAgICB9CisKKworICAgICMgU2V0IHRoZSBsaW1pdHMgZm9yIHRoZSBvdXRsaW5lIGxldmVscyAoMCA8PSB4IDw9IDcpLgorICAgICRsZXZlbCA9IDAgaWYgJGxldmVsIDwgMDsKKyAgICAkbGV2ZWwgPSA3IGlmICRsZXZlbCA+IDc7CisKKyAgICAkc2VsZi0+e19vdXRsaW5lX3Jvd19sZXZlbH0gPSAkbGV2ZWwgaWYgJGxldmVsID4kc2VsZi0+e19vdXRsaW5lX3Jvd19sZXZlbH07CisKKworICAgICMgU2V0IHRoZSBvcHRpb25zIGZsYWdzLgorICAgICMgMHgxMDogVGhlIGZDb2xsYXBzZWQgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgcm93IGNvbnRhaW5zIHRoZSAiKyIKKyAgICAjICAgICAgIHdoZW4gYW4gb3V0bGluZSBncm91cCBpcyBjb2xsYXBzZWQuCisgICAgIyAweDIwOiBUaGUgZkR5WmVybyBoZWlnaHQgZmxhZyBpbmRpY2F0ZXMgYSBjb2xsYXBzZWQgb3IgaGlkZGVuIHJvdy4KKyAgICAjIDB4NDA6IFRoZSBmVW5zeW5jZWQgZmxhZyBpcyB1c2VkIHRvIHNob3cgdGhhdCB0aGUgZm9udCBhbmQgcm93IGhlaWdodHMKKyAgICAjICAgICAgIGFyZSBub3QgY29tcGF0aWJsZS4gVGhpcyBpcyB1c3VhbGx5IHRoZSBjYXNlIGZvciBXcml0ZUV4Y2VsLgorICAgICMgMHg4MDogVGhlIGZHaG9zdERpcnR5IGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgIworICAgICRncmJpdCB8PSAkbGV2ZWw7CisgICAgJGdyYml0IHw9IDB4MDAxMCBpZiAkY29sbGFwc2VkOworICAgICRncmJpdCB8PSAweDAwMjAgaWYgJGhpZGRlbjsKKyAgICAkZ3JiaXQgfD0gMHgwMDQwOworICAgICRncmJpdCB8PSAweDAwODAgaWYgJGZvcm1hdDsKKyAgICAkZ3JiaXQgfD0gMHgwMTAwOworCisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInZ2dnZ2dnZ2IiwgJHJvdywgJGNvbE1pYywgJGNvbE1hYywgJG1peVJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlyd01hYywkcmVzZXJ2ZWQsICRncmJpdCwgJGl4ZmUpOworCisKKyAgICAjIFN0b3JlIHRoZSBkYXRhIG9yIHdyaXRlIGltbWVkaWF0ZWx5IGRlcGVuZGluZyBvbiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGlmICgkc2VsZi0+e19jb21wYXRpYmlsaXR5fSkgeworICAgICAgICAkc2VsZi0+e19yb3dfZGF0YX0tPnskX1swXX0gPSAkaGVhZGVyIC4gJGRhdGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisgICAgfQorCisKKyAgICAjIFN0b3JlIHRoZSByb3cgc2l6ZXMgZm9yIHVzZSB3aGVuIGNhbGN1bGF0aW5nIGltYWdlIHZlcnRpY2VzLgorICAgICMgQWxzbyBzdG9yZSB0aGUgY29sdW1uIGZvcm1hdHMuCisgICAgJHNlbGYtPntfcm93X3NpemVzfS0+eyRfWzBdfSAgID0gJGhlaWdodDsKKyAgICAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskX1swXX0gPSAkZm9ybWF0IGlmIGRlZmluZWQgJGZvcm1hdDsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3Jvd19kZWZhdWx0KCkKKyMKKyMgV3JpdGUgYSBkZWZhdWx0IHJvdyByZWNvcmQsIGluIGNvbXBhdGliaWxpdHkgbW9kZSwgZm9yIHJvd3MgdGhhdCBkb24ndCBoYXZlCisjIHVzZXIgc3BlY2lmaWVkIHZhbHVlcy4uCisjCitzdWIgX3dyaXRlX3Jvd19kZWZhdWx0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDIwODsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDEwOyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICMgUm93IE51bWJlcgorICAgIG15ICRjb2xNaWMgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAjIEZpcnN0IGRlZmluZWQgY29sdW1uCisgICAgbXkgJGNvbE1hYyAgICAgID0gJF9bMl07ICAgICAgICAgICAgICAgICMgTGFzdCBkZWZpbmVkIGNvbHVtbgorICAgIG15ICRtaXlSdyAgICAgICA9IDB4RkY7ICAgICAgICAgICAgICAgICAjIFJvdyBoZWlnaHQKKyAgICBteSAkaXJ3TWFjICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBVc2VkIGJ5IEV4Y2VsIHRvIG9wdGltaXNlIGxvYWRpbmcKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBSZXNlcnZlZAorICAgIG15ICRncmJpdCAgICAgICA9IDB4MDEwMDsgICAgICAgICAgICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRpeGZlICAgICAgICA9IDB4MEY7ICAgICAgICAgICAgICAgICAjIFhGIGluZGV4CisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInZ2dnZ2dnZ2IiwgJHJvdywgJGNvbE1pYywgJGNvbE1hYywgJG1peVJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlyd01hYywkcmVzZXJ2ZWQsICRncmJpdCwgJGl4ZmUpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCwgJGlnbm9yZV9yb3csICRpZ25vcmVfY29sKQorIworIyBDaGVjayB0aGF0ICRyb3cgYW5kICRjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMgZm9yIHVzZSBpbgorIyBESU1FTlNJT05TIHJlY29yZC4gU2VlLCBfc3RvcmVfZGltZW5zaW9ucygpLgorIworIyBUaGUgJGlnbm9yZV9yb3cvJGlnbm9yZV9jb2wgZmxhZ3MgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIHdpc2ggdG8KKyMgcGVyZm9ybSB0aGUgZGltZW5zaW9uIGNoZWNrIHdpdGhvdXQgc3RvcmluZyB0aGUgdmFsdWUuCisjCisjIFRoZSBpZ25vcmUgZmxhZ3MgYXJlIHVzZSBieSBzZXRfcm93KCkgYW5kIGRhdGFfdmFsaWRhdGUuCisjCitzdWIgX2NoZWNrX2RpbWVuc2lvbnMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07CisgICAgbXkgJGNvbCAgICAgICAgID0gJF9bMV07CisgICAgbXkgJGlnbm9yZV9yb3cgID0gJF9bMl07CisgICAgbXkgJGlnbm9yZV9jb2wgID0gJF9bM107CisKKworICAgIHJldHVybiAtMiBpZiBub3QgZGVmaW5lZCAkcm93OworICAgIHJldHVybiAtMiBpZiAkcm93ID49ICRzZWxmLT57X3hsc19yb3dtYXh9OworCisgICAgcmV0dXJuIC0yIGlmIG5vdCBkZWZpbmVkICRjb2w7CisgICAgcmV0dXJuIC0yIGlmICRjb2wgPj0gJHNlbGYtPntfeGxzX2NvbG1heH07CisKKworICAgIGlmIChub3QgJGlnbm9yZV9yb3cpIHsKKworICAgICAgICBpZiAobm90IGRlZmluZWQgJHNlbGYtPntfZGltX3Jvd21pbn0gb3IgJHJvdyA8ICRzZWxmLT57X2RpbV9yb3dtaW59KSB7CisgICAgICAgICAgICAkc2VsZi0+e19kaW1fcm93bWlufSA9ICRyb3c7CisgICAgICAgIH0KKworICAgICAgICBpZiAobm90IGRlZmluZWQgJHNlbGYtPntfZGltX3Jvd21heH0gb3IgJHJvdyA+ICRzZWxmLT57X2RpbV9yb3dtYXh9KSB7CisgICAgICAgICAgICAkc2VsZi0+e19kaW1fcm93bWF4fSA9ICRyb3c7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobm90ICRpZ25vcmVfY29sKSB7CisKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57X2RpbV9jb2xtaW59IG9yICRjb2wgPCAkc2VsZi0+e19kaW1fY29sbWlufSkgeworICAgICAgICAgICAgJHNlbGYtPntfZGltX2NvbG1pbn0gPSAkY29sOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57X2RpbV9jb2xtYXh9IG9yICRjb2wgPiAkc2VsZi0+e19kaW1fY29sbWF4fSkgeworICAgICAgICAgICAgJHNlbGYtPntfZGltX2NvbG1heH0gPSAkY29sOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZGltZW5zaW9ucygpCisjCisjIFdyaXRlcyBFeGNlbCBESU1FTlNJT05TIHRvIGRlZmluZSB0aGUgYXJlYSBpbiB3aGljaCB0aGVyZSBpcyBjZWxsIGRhdGEuCisjCisjIE5vdGVzOgorIyAgIEV4Y2VsIHN0b3JlcyB0aGUgbWF4IHJvdy9jb2wgYXMgcm93L2NvbCArMS4KKyMgICBNYXggYW5kIG1pbiB2YWx1ZXMgb2YgMCBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGNlbGwgZGF0YS4KKyMgICBXZSBzZXQgdGhlIHVuZGVmIG1lbWJlciBkYXRhIHRvIDAgc2luY2UgaXQgaXMgdXNlZCBieSBfc3RvcmVfdGFibGUoKS4KKyMgICBJbnNlcnRpbmcgaW1hZ2VzIG9yIGNoYXJ0cyBkb2Vzbid0IGNoYW5nZSB0aGUgRElNRU5TSU9OIGRhdGEuCisjCitzdWIgX3N0b3JlX2RpbWVuc2lvbnMgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgPSAweDAyMDA7ICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMEU7ICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJHJvd19taW47ICAgICAgICAgICAgICAgICAgICAjIEZpcnN0IHJvdworICAgIG15ICRyb3dfbWF4OyAgICAgICAgICAgICAgICAgICAgIyBMYXN0IHJvdyBwbHVzIDEKKyAgICBteSAkY29sX21pbjsgICAgICAgICAgICAgICAgICAgICMgRmlyc3QgY29sdW1uCisgICAgbXkgJGNvbF9tYXg7ICAgICAgICAgICAgICAgICAgICAjIExhc3QgY29sdW1uIHBsdXMgMQorICAgIG15ICRyZXNlcnZlZCAgPSAweDAwMDA7ICAgICAgICAgIyBSZXNlcnZlZCBieSBFeGNlbAorCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfZGltX3Jvd21pbn0pIHskcm93X21pbiA9ICRzZWxmLT57X2RpbV9yb3dtaW59ICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyRyb3dfbWluID0gMCAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfZGltX3Jvd21heH0pIHskcm93X21heCA9ICRzZWxmLT57X2RpbV9yb3dtYXh9ICsgMX0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyRyb3dfbWF4ID0gMCAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfZGltX2NvbG1pbn0pIHskY29sX21pbiA9ICRzZWxmLT57X2RpbV9jb2xtaW59ICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyRjb2xfbWluID0gMCAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfZGltX2NvbG1heH0pIHskY29sX21heCA9ICRzZWxmLT57X2RpbV9jb2xtYXh9ICsgMX0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyRjb2xfbWF4ID0gMCAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAjIFNldCBtZW1iZXIgZGF0YSB0byB0aGUgbmV3IG1heC9taW4gdmFsdWUgZm9yIHVzZSBieSBfc3RvcmVfdGFibGUoKS4KKyAgICAkc2VsZi0+e19kaW1fcm93bWlufSA9ICRyb3dfbWluOworICAgICRzZWxmLT57X2RpbV9yb3dtYXh9ID0gJHJvd19tYXg7CisgICAgJHNlbGYtPntfZGltX2NvbG1pbn0gPSAkY29sX21pbjsKKyAgICAkc2VsZi0+e19kaW1fY29sbWF4fSA9ICRjb2xfbWF4OworCisKKyAgICBteSAkaGVhZGVyICAgID0gcGFjaygidnYiLCAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygiVlZ2dnYiLCAkcm93X21pbiwgJHJvd19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbF9taW4sICRjb2xfbWF4LCAkcmVzZXJ2ZWQpOworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfd2luZG93MigpCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIFdpbmRvdzIuCisjCitzdWIgX3N0b3JlX3dpbmRvdzIgeworCisgICAgdXNlIGludGVnZXI7ICAgICMgQXZvaWQgPDwgc2hpZnQgYnVnIGluIFBlcmwgNS42LjAgb24gSFAtVVgKKworICAgIG15ICRzZWxmICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgICAgICA9IDB4MDIzRTsgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgPSAweDAwMTI7ICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRncmJpdCAgICAgICAgICA9IDB4MDBCNjsgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJHJ3VG9wICAgICAgICAgID0gJHNlbGYtPntfZmlyc3Rfcm93fTsgICAjIFRvcCB2aXNpYmxlIHJvdworICAgIG15ICRjb2xMZWZ0ICAgICAgICA9ICRzZWxmLT57X2ZpcnN0X2NvbH07ICAgIyBMZWZ0bW9zdCB2aXNpYmxlIGNvbHVtbgorICAgIG15ICRyZ2JIZHIgICAgICAgICA9IDB4MDAwMDAwNDA7ICAgICAgICAgICAgIyBSb3cvY29sIGhlYWRpbmcsIGdyaWQgY29sb3IKKworICAgIG15ICR3U2NhbGVTTFYgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgIyBab29tIGluIHBhZ2UgYnJlYWsgcHJldmlldworICAgIG15ICR3U2NhbGVOb3JtYWwgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgIyBab29tIGluIG5vcm1hbCB2aWV3CisgICAgbXkgJHJlc2VydmVkICAgICAgID0gMHgwMDAwMDAwMDsKKworCisgICAgIyBUaGUgb3B0aW9ucyBmbGFncyB0aGF0IGNvbXByaXNlICRncmJpdAorICAgIG15ICRmRHNwRm1sYSAgICAgICA9ICRzZWxmLT57X2Rpc3BsYXlfZm9ybXVsYXN9OyAjIDAgLSBiaXQKKyAgICBteSAkZkRzcEdyaWQgICAgICAgPSAkc2VsZi0+e19zY3JlZW5fZ3JpZGxpbmVzfTsgIyAxCisgICAgbXkgJGZEc3BSd0NvbCAgICAgID0gJHNlbGYtPntfZGlzcGxheV9oZWFkZXJzfTsgICMgMgorICAgIG15ICRmRnJvemVuICAgICAgICA9ICRzZWxmLT57X2Zyb3plbn07ICAgICAgICAgICAjIDMKKyAgICBteSAkZkRzcFplcm9zICAgICAgPSAkc2VsZi0+e19kaXNwbGF5X3plcm9zfTsgICAgIyA0CisgICAgbXkgJGZEZWZhdWx0SGRyICAgID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICMgNQorICAgIG15ICRmQXJhYmljICAgICAgICA9ICRzZWxmLT57X2Rpc3BsYXlfYXJhYmljfTsgICAjIDYKKyAgICBteSAkZkRzcEd1dHMgICAgICAgPSAkc2VsZi0+e19vdXRsaW5lX29ufTsgICAgICAgIyA3CisgICAgbXkgJGZGcm96ZW5Ob1NwbGl0ID0gJHNlbGYtPntfZnJvemVuX25vX3NwbGl0fTsgICMgMCAtIGJpdAorICAgIG15ICRmU2VsZWN0ZWQgICAgICA9ICRzZWxmLT57X3NlbGVjdGVkfTsgICAgICAgICAjIDEKKyAgICBteSAkZlBhZ2VkICAgICAgICAgPSAkc2VsZi0+e19hY3RpdmV9OyAgICAgICAgICAgIyAyCisgICAgbXkgJGZCcmVha1ByZXZpZXcgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICMgMworCisgICAgJGdyYml0ICAgICAgICAgICAgID0gJGZEc3BGbWxhOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwR3JpZCAgICAgICA8PCAxOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwUndDb2wgICAgICA8PCAyOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRnJvemVuICAgICAgICA8PCAzOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwWmVyb3MgICAgICA8PCA0OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRGVmYXVsdEhkciAgICA8PCA1OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmQXJhYmljICAgICAgICA8PCA2OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwR3V0cyAgICAgICA8PCA3OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRnJvemVuTm9TcGxpdCA8PCA4OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmU2VsZWN0ZWQgICAgICA8PCA5OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmUGFnZWQgICAgICAgICA8PCAxMDsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkJyZWFrUHJldmlldyAgPDwgMTE7CisKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInZ2dlZ2dlYiLCAkZ3JiaXQsICRyd1RvcCwgJGNvbExlZnQsICRyZ2JIZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdTY2FsZVNMViwgJHdTY2FsZU5vcm1hbCwgJHJlc2VydmVkICk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGFnZV92aWV3KCkKKyMKKyMgU2V0IHBhZ2UgdmlldyBtb2RlLiBPbmx5IGFwcGxpY2FibGUgdG8gTWFjIEV4Y2VsLgorIworc3ViIF9zdG9yZV9wYWdlX3ZpZXcgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntfcGFnZV92aWV3fTsKKworICAgIG15ICRkYXRhICAgID0gcGFjayAiSCoiLCAnQzgwODExMDBDODA4MDAwMDAwMDAwMDQwMDAwMDAwMDAwOTAwMDAwMDAwJzsKKworICAgICRzZWxmLT5fYXBwZW5kKCRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90YWJfY29sb3IoKQorIworIyBXcml0ZSB0aGUgVGFiIENvbG9yIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV90YWJfY29sb3IgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkY29sb3IgICA9ICRzZWxmLT57X3RhYl9jb2xvcn07CisKKyAgICByZXR1cm4gdW5sZXNzICRjb2xvcjsKKworICAgIG15ICRyZWNvcmQgID0gMHgwODYyOyAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAxNDsgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICR6ZXJvICAgID0gMHgwMDAwOworICAgIG15ICR1bmtub3duID0gMHgwMDE0OworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgID0gcGFjaygidnZ2dnZ2dnZ2diIsICRyZWNvcmQsICR6ZXJvLCAkemVybywgJHplcm8sICR6ZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6ZXJvLCAkdW5rbm93biwgJHplcm8sICRjb2xvciwgJHplcm8pOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RlZnJvdygpCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIERFRlJPV0hFSUdIVC4KKyMKK3N1YiBfc3RvcmVfZGVmcm93IHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICA9IDB4MDIyNTsgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDA0OyAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGdyYml0ICAgID0gMHgwMDAwOyAgICAgICMgT3B0aW9ucy4KKyAgICBteSAkaGVpZ2h0ICAgPSAweDAwRkY7ICAgICAgIyBEZWZhdWx0IHJvdyBoZWlnaHQKKworICAgIG15ICRoZWFkZXIgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgID0gcGFjaygidnYiLCAkZ3JiaXQsICAkaGVpZ2h0KTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZGVmY29sKCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgREVGQ09MV0lEVEguCisjCitzdWIgX3N0b3JlX2RlZmNvbCB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgPSAweDAwNTU7ICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwMjsgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRjb2x3aWR0aCA9IDB4MDAwODsgICAgICAjIERlZmF1bHQgY29sdW1uIHdpZHRoCisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInYiLCAgJGNvbHdpZHRoKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY29saW5mbygkZmlyc3Rjb2wsICRsYXN0Y29sLCAkd2lkdGgsICRmb3JtYXQsICRoaWRkZW4pCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIENPTElORk8gdG8gZGVmaW5lIGNvbHVtbiB3aWR0aHMKKyMKKyMgTm90ZTogVGhlIFNESyBzYXlzIHRoZSByZWNvcmQgbGVuZ3RoIGlzIDB4MEIgYnV0IEV4Y2VsIHdyaXRlcyBhIDB4MEMKKyMgbGVuZ3RoIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY29saW5mbyB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgPSAweDAwN0Q7ICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMEI7ICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGNvbEZpcnN0ID0gJF9bMF0gfHwgMDsgICAgICAjIEZpcnN0IGZvcm1hdHRlZCBjb2x1bW4KKyAgICBteSAkY29sTGFzdCAgPSAkX1sxXSB8fCAwOyAgICAgICMgTGFzdCBmb3JtYXR0ZWQgY29sdW1uCisgICAgbXkgJHdpZHRoICAgID0gJF9bMl0gfHwgOC40MzsgICAjIENvbCB3aWR0aCBpbiB1c2VyIHVuaXRzLCA4LjQzIGlzIGRlZmF1bHQKKyAgICBteSAkY29sZHg7ICAgICAgICAgICAgICAgICAgICAgICMgQ29sIHdpZHRoIGluIGludGVybmFsIHVuaXRzCisgICAgbXkgJHBpeGVsczsgICAgICAgICAgICAgICAgICAgICAjIENvbCB3aWR0aCBpbiBwaXhlbHMKKworICAgICMgRXhjZWwgcm91bmRzIHRoZSBjb2x1bW4gd2lkdGggdG8gdGhlIG5lYXJlc3QgcGl4ZWwuIFRoZXJlZm9yZSB3ZSBmaXJzdAorICAgICMgY29udmVydCB0byBwaXhlbHMgYW5kIHRoZW4gdG8gdGhlIGludGVybmFsIHVuaXRzLiBUaGUgcGl4ZWwgdG8gdXNlcnMtdW5pdHMKKyAgICAjIHJlbGF0aW9uc2hpcCBpcyBkaWZmZXJlbnQgZm9yIHZhbHVlcyBsZXNzIHRoYW4gMS4KKyAgICAjCisgICAgaWYgKCR3aWR0aCA8IDEpIHsKKyAgICAgICAgJHBpeGVscyA9IGludCgkd2lkdGggKjEyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRwaXhlbHMgPSBpbnQoJHdpZHRoICo3ICkgKzU7CisgICAgfQorCisgICAgJGNvbGR4ID0gaW50KCRwaXhlbHMgKjI1Ni83KTsKKworCisgICAgbXkgJGl4ZmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhGIGluZGV4CisgICAgbXkgJGdyYml0ICAgICAgID0gMHgwMDAwOyAgICAgICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDA7ICAgICAgICAgICAgIyBSZXNlcnZlZAorICAgIG15ICRmb3JtYXQgICAgICA9ICRfWzNdOyAgICAgICAgICAgIyBGb3JtYXQgb2JqZWN0CisgICAgbXkgJGhpZGRlbiAgICAgID0gJF9bNF0gfHwgMDsgICAgICAjIEhpZGRlbiBmbGFnCisgICAgbXkgJGxldmVsICAgICAgID0gJF9bNV0gfHwgMDsgICAgICAjIE91dGxpbmUgbGV2ZWwKKyAgICBteSAkY29sbGFwc2VkICAgPSAkX1s2XSB8fCAwOyAgICAgICMgT3V0bGluZSBsZXZlbAorCisKKyAgICAjIENoZWNrIGZvciBhIGZvcm1hdCBvYmplY3QKKyAgICBpZiAocmVmICRmb3JtYXQpIHsKKyAgICAgICAgJGl4ZmUgPSAkZm9ybWF0LT5nZXRfeGZfaW5kZXgoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRpeGZlID0gMHgwRjsKKyAgICB9CisKKworICAgICMgU2V0IHRoZSBsaW1pdHMgZm9yIHRoZSBvdXRsaW5lIGxldmVscyAoMCA8PSB4IDw9IDcpLgorICAgICRsZXZlbCA9IDAgaWYgJGxldmVsIDwgMDsKKyAgICAkbGV2ZWwgPSA3IGlmICRsZXZlbCA+IDc7CisKKworICAgICMgU2V0IHRoZSBvcHRpb25zIGZsYWdzLiAoU2VlIHNldF9yb3coKSBmb3IgbW9yZSBkZXRhaWxzKS4KKyAgICAkZ3JiaXQgfD0gMHgwMDAxIGlmICRoaWRkZW47CisgICAgJGdyYml0IHw9ICRsZXZlbCA8PCA4OworICAgICRncmJpdCB8PSAweDEwMDAgaWYgJGNvbGxhcHNlZDsKKworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgID0gcGFjaygidnZ2dnZDIiwgJGNvbEZpcnN0LCAkY29sTGFzdCwgJGNvbGR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpeGZlLCAkZ3JiaXQsICRyZXNlcnZlZCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2ZpbHRlcm1vZGUoKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBGSUxURVJNT0RFIHRvIGluZGljYXRlIHRoYXQgdGhlIHdvcmtzaGVldCBjb250YWlucworIyBBVVRPRklMVEVSIHJlY29yZCwgaWUuIGF1dG9maWx0ZXJzIHdpdGggYSBmaWx0ZXIgc2V0LgorIworc3ViIF9zdG9yZV9maWx0ZXJtb2RlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDlCOyAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDA7ICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICAjIE9ubHkgd3JpdGUgdGhlIHJlY29yZCBpZiB0aGUgd29ya3NoZWV0IGNvbnRhaW5zIGEgZmlsdGVyZWQgYXV0b2ZpbHRlci4KKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X2ZpbHRlcl9vbn07CisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F1dG9maWx0ZXJpbmZvKCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgQVVUT0ZJTFRFUklORk8uCisjCitzdWIgX3N0b3JlX2F1dG9maWx0ZXJpbmZvIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDlEOyAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJG51bV9maWx0ZXJzID0gJHNlbGYtPntfZmlsdGVyX2NvdW50fTsKKworICAgICMgT25seSB3cml0ZSB0aGUgcmVjb3JkIGlmIHRoZSB3b3Jrc2hlZXQgY29udGFpbnMgYW4gYXV0b2ZpbHRlci4KKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X2ZpbHRlcl9jb3VudH07CisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInYiLCAgJG51bV9maWx0ZXJzKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2VsZWN0aW9uKCRmaXJzdF9yb3csICRmaXJzdF9jb2wsICRsYXN0X3JvdywgJGxhc3RfY29sKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBTRUxFQ1RJT04uCisjCitzdWIgX3N0b3JlX3NlbGVjdGlvbiB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgPSAweDAwMUQ7ICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwRjsgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRwbm4gICAgICA9ICRzZWxmLT57X2FjdGl2ZV9wYW5lfTsgICAjIFBhbmUgcG9zaXRpb24KKyAgICBteSAkcndBY3QgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgIyBBY3RpdmUgcm93CisgICAgbXkgJGNvbEFjdCAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICMgQWN0aXZlIGNvbHVtbgorICAgIG15ICRpcmVmQWN0ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAjIEFjdGl2ZSBjZWxsIHJlZgorICAgIG15ICRjcmVmICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiByZWZzCisKKyAgICBteSAkcndGaXJzdCAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgIyBGaXJzdCByb3cgaW4gcmVmZXJlbmNlCisgICAgbXkgJGNvbEZpcnN0ID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICMgRmlyc3QgY29sIGluIHJlZmVyZW5jZQorICAgIG15ICRyd0xhc3QgICA9ICRfWzJdIHx8ICRyd0ZpcnN0OyAgICAgICAjIExhc3QgIHJvdyBpbiByZWZlcmVuY2UKKyAgICBteSAkY29sTGFzdCAgPSAkX1szXSB8fCAkY29sRmlyc3Q7ICAgICAgIyBMYXN0ICBjb2wgaW4gcmVmZXJlbmNlCisKKyAgICAjIFN3YXAgbGFzdCByb3cvY29sIGZvciBmaXJzdCByb3cvY29sIGFzIG5lY2Vzc2FyeQorICAgIGlmICgkcndGaXJzdCA+ICRyd0xhc3QpIHsKKyAgICAgICAgKCRyd0ZpcnN0LCAkcndMYXN0KSA9ICgkcndMYXN0LCAkcndGaXJzdCk7CisgICAgfQorCisgICAgaWYgKCRjb2xGaXJzdCA+ICRjb2xMYXN0KSB7CisgICAgICAgICgkY29sRmlyc3QsICRjb2xMYXN0KSA9ICgkY29sTGFzdCwgJGNvbEZpcnN0KTsKKyAgICB9CisKKworICAgIG15ICRoZWFkZXIgICA9IHBhY2soInZ2IiwgICAgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soIkN2dnZ2dnZDQyIsICAgICRwbm4sICRyd0FjdCwgJGNvbEFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXJlZkFjdCwgJGNyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3Rmlyc3QsICRyd0xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbEZpcnN0LCAkY29sTGFzdCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZXh0ZXJuY291bnQoJGNvdW50KQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBFWFRFUk5DT1VOVCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGV4dGVybmFsIHNoZWV0CisjIHJlZmVyZW5jZXMgaW4gYSB3b3Jrc2hlZXQuCisjCisjIEV4Y2VsIG9ubHkgc3RvcmVzIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgc2hlZXRzIHRoYXQgYXJlIHVzZWQgaW4gZm9ybXVsYXMuCisjIEZvciBzaW1wbGljaXR5IHdlIHN0b3JlIHJlZmVyZW5jZXMgdG8gYWxsIHRoZSBzaGVldHMgaW4gdGhlIHdvcmtib29rCisjIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSB1c2VkIG9yIG5vdC4gVGhpcyByZWR1Y2VzIHRoZSBvdmVyYWxsCisjIGNvbXBsZXhpdHkgYW5kIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIGEgdHdvIHdheSBkaWFsb2d1ZSBiZXR3ZWVuIHRoZSBmb3JtdWxhCisjIHBhcnNlciB0aGUgd29ya3NoZWV0IG9iamVjdHMuCisjCitzdWIgX3N0b3JlX2V4dGVybmNvdW50IHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICA9IDB4MDAxNjsgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwMjsgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkY3hhbHMgICAgPSAkX1swXTsgICAgICAgICAgICMgTnVtYmVyIG9mIGV4dGVybmFsIHJlZmVyZW5jZXMKKworICAgIG15ICRoZWFkZXIgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgID0gcGFjaygidiIsICAkY3hhbHMpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9leHRlcm5zaGVldCgkc2hlZXRuYW1lKQorIworIworIyBXcml0ZXMgdGhlIEV4Y2VsIEJJRkYgRVhURVJOU0hFRVQgcmVjb3JkLiBUaGVzZSByZWZlcmVuY2VzIGFyZSB1c2VkIGJ5CisjIGZvcm11bGFzLiBBIGZvcm11bGEgcmVmZXJlbmNlcyBhIHNoZWV0IG5hbWUgdmlhIGFuIGluZGV4LiBTaW5jZSB3ZSBzdG9yZSBhCisjIHJlZmVyZW5jZSB0byBhbGwgb2YgdGhlIGV4dGVybmFsIHdvcmtzaGVldHMgdGhlIEVYVEVSTlNIRUVUIGluZGV4IGlzIHRoZSBzYW1lCisjIGFzIHRoZSB3b3Jrc2hlZXQgaW5kZXguCisjCitzdWIgX3N0b3JlX2V4dGVybnNoZWV0IHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAwMTc7ICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkc2hlZXRuYW1lID0gJF9bMF07ICAgICAgICAgICMgV29ya3NoZWV0IG5hbWUKKyAgICBteSAkY2NoOyAgICAgICAgICAgICAgICAgICAgICAgICMgTGVuZ3RoIG9mIHNoZWV0IG5hbWUKKyAgICBteSAkcmdjaDsgICAgICAgICAgICAgICAgICAgICAgICMgRmlsZW5hbWUgZW5jb2RpbmcKKworICAgICMgUmVmZXJlbmNlcyB0byB0aGUgY3VycmVudCBzaGVldCBhcmUgZW5jb2RlZCBkaWZmZXJlbnRseSB0byByZWZlcmVuY2VzIHRvCisgICAgIyBleHRlcm5hbCBzaGVldHMuCisgICAgIworICAgIGlmICgkc2VsZi0+e19uYW1lfSBlcSAkc2hlZXRuYW1lKSB7CisgICAgICAgICRzaGVldG5hbWUgPSAnJzsKKyAgICAgICAgJGxlbmd0aCAgICA9IDB4MDI7ICAjIFRoZSBmb2xsb3dpbmcgMiBieXRlcworICAgICAgICAkY2NoICAgICAgID0gMTsgICAgICMgVGhlIGZvbGxvd2luZyBieXRlCisgICAgICAgICRyZ2NoICAgICAgPSAweDAyOyAgIyBTZWxmIHJlZmVyZW5jZQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGxlbmd0aCAgICA9IDB4MDIgKyBsZW5ndGgoJF9bMF0pOworICAgICAgICAkY2NoICAgICAgID0gbGVuZ3RoKCRzaGVldG5hbWUpOworICAgICAgICAkcmdjaCAgICAgID0gMHgwMzsgICMgUmVmZXJlbmNlIHRvIGEgc2hlZXQgaW4gdGhlIGN1cnJlbnQgd29ya2Jvb2sKKyAgICB9CisKKyAgICBteSAkaGVhZGVyICAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgID0gcGFjaygiQ0MiLCAkY2NoLCAkcmdjaCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEsICRzaGVldG5hbWUpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3BhbmVzKCkKKyMKKyMKKyMgV3JpdGVzIHRoZSBFeGNlbCBCSUZGIFBBTkUgcmVjb3JkLgorIyBUaGUgcGFuZXMgY2FuIGVpdGhlciBiZSBmcm96ZW4gb3IgdGhhd2VkICh1bmZyb3plbikuCisjIEZyb3plbiBwYW5lcyBhcmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIGEgaW50ZWdlciBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucy4KKyMgVGhhd2VkIHBhbmVzIGFyZSBzcGVjaWZpZWQgaW4gdGVybXMgb2YgRXhjZWwncyB1bml0cyBmb3Igcm93cyBhbmQgY29sdW1ucy4KKyMKK3N1YiBfc3RvcmVfcGFuZXMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDQxOyAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDBBOyAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICR5ICAgICAgICAgICA9ICRfWzBdIHx8IDA7ICAgIyBWZXJ0aWNhbCBzcGxpdCBwb3NpdGlvbgorICAgIG15ICR4ICAgICAgICAgICA9ICRfWzFdIHx8IDA7ICAgIyBIb3Jpem9udGFsIHNwbGl0IHBvc2l0aW9uCisgICAgbXkgJHJ3VG9wICAgICAgID0gJF9bMl07ICAgICAgICAjIFRvcCByb3cgdmlzaWJsZQorICAgIG15ICRjb2xMZWZ0ICAgICA9ICRfWzNdOyAgICAgICAgIyBMZWZ0bW9zdCBjb2x1bW4gdmlzaWJsZQorICAgIG15ICRub19zcGxpdCAgICA9ICRfWzRdOyAgICAgICAgIyBObyB1c2VkIGhlcmUuCisgICAgbXkgJHBubkFjdCAgICAgID0gJF9bNV07ICAgICAgICAjIEFjdGl2ZSBwYW5lCisKKworICAgICMgQ29kZSBzcGVjaWZpYyB0byBmcm96ZW4gb3IgdGhhd2VkIHBhbmVzLgorICAgIGlmICgkc2VsZi0+e19mcm96ZW59KSB7CisgICAgICAgICMgU2V0IGRlZmF1bHQgdmFsdWVzIGZvciAkcndUb3AgYW5kICRjb2xMZWZ0CisgICAgICAgICRyd1RvcCAgID0gJHkgdW5sZXNzIGRlZmluZWQgJHJ3VG9wOworICAgICAgICAkY29sTGVmdCA9ICR4IHVubGVzcyBkZWZpbmVkICRjb2xMZWZ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yICRyd1RvcCBhbmQgJGNvbExlZnQKKyAgICAgICAgJHJ3VG9wICAgPSAwICB1bmxlc3MgZGVmaW5lZCAkcndUb3A7CisgICAgICAgICRjb2xMZWZ0ID0gMCAgdW5sZXNzIGRlZmluZWQgJGNvbExlZnQ7CisKKyAgICAgICAgIyBDb252ZXJ0IEV4Y2VsJ3Mgcm93IGFuZCBjb2x1bW4gdW5pdHMgdG8gdGhlIGludGVybmFsIHVuaXRzLgorICAgICAgICAjIFRoZSBkZWZhdWx0IHJvdyBoZWlnaHQgaXMgMTIuNzUKKyAgICAgICAgIyBUaGUgZGVmYXVsdCBjb2x1bW4gd2lkdGggaXMgOC40MworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgc2xvcGUgYW5kIGludGVyc2VjdGlvbiB2YWx1ZXMgd2VyZSBpbnRlcnBvbGF0ZWQuCisgICAgICAgICMKKyAgICAgICAgJHkgPSAyMCokeSAgICAgICsgMjU1OworICAgICAgICAkeCA9IDExMy44NzkqJHggKyAzOTA7CisgICAgfQorCisKKyAgICAjIERldGVybWluZSB3aGljaCBwYW5lIHNob3VsZCBiZSBhY3RpdmUuIFRoZXJlIGlzIGFsc28gdGhlIHVuZG9jdW1lbnRlZAorICAgICMgb3B0aW9uIHRvIG92ZXJyaWRlIHRoaXMgc2hvdWxkIGl0IGJlIG5lY2Vzc2FyeTogbWF5IGJlIHJlbW92ZWQgbGF0ZXIuCisgICAgIworICAgIGlmIChub3QgZGVmaW5lZCAkcG5uQWN0KSB7CisgICAgICAgICRwbm5BY3QgPSAwIGlmICgkeCAhPSAwICYmICR5ICE9IDApOyAjIEJvdHRvbSByaWdodAorICAgICAgICAkcG5uQWN0ID0gMSBpZiAoJHggIT0gMCAmJiAkeSA9PSAwKTsgIyBUb3AgcmlnaHQKKyAgICAgICAgJHBubkFjdCA9IDIgaWYgKCR4ID09IDAgJiYgJHkgIT0gMCk7ICMgQm90dG9tIGxlZnQKKyAgICAgICAgJHBubkFjdCA9IDMgaWYgKCR4ID09IDAgJiYgJHkgPT0gMCk7ICMgVG9wIGxlZnQKKyAgICB9CisKKyAgICAkc2VsZi0+e19hY3RpdmVfcGFuZX0gPSAkcG5uQWN0OyAjIFVzZWQgaW4gX3N0b3JlX3NlbGVjdGlvbgorCisgICAgbXkgJGhlYWRlciAgICAgPSBwYWNrKCJ2diIsICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgID0gcGFjaygidnZ2dnYiLCAkeCwgJHksICRyd1RvcCwgJGNvbExlZnQsICRwbm5BY3QpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NldHVwKCkKKyMKKyMgU3RvcmUgdGhlIHBhZ2Ugc2V0dXAgU0VUVVAgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NldHVwIHsKKworICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYCisKKyAgICBteSAkc2VsZiAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgICAgICA9IDB4MDBBMTsgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICA9IDB4MDAyMjsgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworCisgICAgbXkgJGlQYXBlclNpemUgICA9ICRzZWxmLT57X3BhcGVyX3NpemV9OyAgICAjIFBhcGVyIHNpemUKKyAgICBteSAkaVNjYWxlICAgICAgID0gJHNlbGYtPntfcHJpbnRfc2NhbGV9OyAgICMgUHJpbnQgc2NhbGluZyBmYWN0b3IKKyAgICBteSAkaVBhZ2VTdGFydCAgID0gJHNlbGYtPntfcGFnZV9zdGFydH07ICAgICMgU3RhcnRpbmcgcGFnZSBudW1iZXIKKyAgICBteSAkaUZpdFdpZHRoICAgID0gJHNlbGYtPntfZml0X3dpZHRofTsgICAgICMgRml0IHRvIG51bWJlciBvZiBwYWdlcyB3aWRlCisgICAgbXkgJGlGaXRIZWlnaHQgICA9ICRzZWxmLT57X2ZpdF9oZWlnaHR9OyAgICAjIEZpdCB0byBudW1iZXIgb2YgcGFnZXMgaGlnaAorICAgIG15ICRncmJpdCAgICAgICAgPSAweDAwOyAgICAgICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkaVJlcyAgICAgICAgID0gMHgwMjU4OyAgICAgICAgICAgICAgICAgICMgUHJpbnQgcmVzb2x1dGlvbgorICAgIG15ICRpVlJlcyAgICAgICAgPSAweDAyNTg7ICAgICAgICAgICAgICAgICAgIyBWZXJ0aWNhbCBwcmludCByZXNvbHV0aW9uCisgICAgbXkgJG51bUhkciAgICAgICA9ICRzZWxmLT57X21hcmdpbl9oZWFkZXJ9OyAjIEhlYWRlciBNYXJnaW4KKyAgICBteSAkbnVtRnRyICAgICAgID0gJHNlbGYtPntfbWFyZ2luX2Zvb3Rlcn07ICMgRm9vdGVyIE1hcmdpbgorICAgIG15ICRpQ29waWVzICAgICAgPSAweDAxOyAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgY29waWVzCisKKworICAgIG15ICRmTGVmdFRvUmlnaHQgPSAkc2VsZi0+e19wYWdlX29yZGVyfTsgICAgIyBQcmludCBvdmVyIHRoZW4gZG93bgorICAgIG15ICRmTGFuZHNjYXBlICAgPSAkc2VsZi0+e19vcmllbnRhdGlvbn07ICAgIyBQYWdlIG9yaWVudGF0aW9uCisgICAgbXkgJGZOb1BscyAgICAgICA9IDB4MDsgICAgICAgICAgICAgICAgICAgICAjIFNldHVwIG5vdCByZWFkIGZyb20gcHJpbnRlcgorICAgIG15ICRmTm9Db2xvciAgICAgPSAkc2VsZi0+e19ibGFja193aGl0ZX07ICAgIyBQcmludCBibGFjayBhbmQgd2hpdGUKKyAgICBteSAkZkRyYWZ0ICAgICAgID0gJHNlbGYtPntfZHJhZnRfcXVhbGl0eX07ICMgUHJpbnQgZHJhZnQgcXVhbGl0eQorICAgIG15ICRmTm90ZXMgICAgICAgPSAkc2VsZi0+e19wcmludF9jb21tZW50c307IyBQcmludCBub3RlcworICAgIG15ICRmTm9PcmllbnQgICAgPSAweDA7ICAgICAgICAgICAgICAgICAgICAgIyBPcmllbnRhdGlvbiBub3Qgc2V0CisgICAgbXkgJGZVc2VQYWdlICAgICA9ICRzZWxmLT57X2N1c3RvbV9zdGFydH07ICAjIFVzZSBjdXN0b20gc3RhcnRpbmcgcGFnZQorCisKKyAgICAkZ3JiaXQgICAgICAgICAgID0gJGZMZWZ0VG9SaWdodDsKKyAgICAkZ3JiaXQgICAgICAgICAgfD0gJGZMYW5kc2NhcGUgICAgPDwgMTsKKyAgICAkZ3JiaXQgICAgICAgICAgfD0gJGZOb1BscyAgICAgICAgPDwgMjsKKyAgICAkZ3JiaXQgICAgICAgICAgfD0gJGZOb0NvbG9yICAgICAgPDwgMzsKKyAgICAkZ3JiaXQgICAgICAgICAgfD0gJGZEcmFmdCAgICAgICAgPDwgNDsKKyAgICAkZ3JiaXQgICAgICAgICAgfD0gJGZOb3RlcyAgICAgICAgPDwgNTsKKyAgICAkZ3JiaXQgICAgICAgICAgfD0gJGZOb09yaWVudCAgICAgPDwgNjsKKyAgICAkZ3JiaXQgICAgICAgICAgfD0gJGZVc2VQYWdlICAgICAgPDwgNzsKKworCisgICAgJG51bUhkciA9IHBhY2soImQiLCAkbnVtSGRyKTsKKyAgICAkbnVtRnRyID0gcGFjaygiZCIsICRudW1GdHIpOworCisgICAgaWYgKCRzZWxmLT57X2J5dGVfb3JkZXJ9KSB7CisgICAgICAgICRudW1IZHIgPSByZXZlcnNlICRudW1IZHI7CisgICAgICAgICRudW1GdHIgPSByZXZlcnNlICRudW1GdHI7CisgICAgfQorCisgICAgbXkgJGhlYWRlciA9IHBhY2soInZ2IiwgICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YTEgID0gcGFjaygidnZ2dnZ2dnYiLCAgICRpUGFwZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpUGFnZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlGaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpRml0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdyYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaVZSZXMpOworICAgIG15ICRkYXRhMiAgPSAkbnVtSGRyIC4kbnVtRnRyOworICAgIG15ICRkYXRhMyAgPSBwYWNrKCJ2IiwgJGlDb3BpZXMpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhMSwgJGRhdGEyLCAkZGF0YTMpOworCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2hlYWRlcigpCisjCisjIFN0b3JlIHRoZSBoZWFkZXIgY2FwdGlvbiBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfaGVhZGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDE0OyAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkc3RyICAgICAgICAgPSAkc2VsZi0+e19oZWFkZXJ9OyAgICAgICAgICAgICAjIGhlYWRlciBzdHJpbmcKKyAgICBteSAkY2NoICAgICAgICAgPSBsZW5ndGgoJHN0cik7ICAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiBoZWFkZXIgc3RyaW5nCisgICAgbXkgJGVuY29kaW5nICAgID0gJHNlbGYtPntfaGVhZGVyX2VuY29kaW5nfTsgICAgIyBDaGFyYWN0ZXIgZW5jb2RpbmcKKworCisgICAgIyBDaGFyYWN0ZXIgbGVuZ3RoIGlzIG51bSBvZiBjaGFycyBub3QgbnVtIG9mIGJ5dGVzCisgICAgJGNjaCAgICAgICAgICAgLz0gMiBpZiAkZW5jb2Rpbmc7CisKKyAgICAjIENoYW5nZSB0aGUgVVRGLTE2IG5hbWUgZnJvbSBCRSB0byBMRQorICAgICRzdHIgICAgICAgICAgICA9IHBhY2sgJ24qJywgdW5wYWNrICd2KicsICRzdHIgaWYgJGVuY29kaW5nOworCisgICAgJGxlbmd0aCAgICAgICAgID0gMyArIGxlbmd0aCgkc3RyKTsKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZDIiwgICRjY2gsICRlbmNvZGluZyk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEsICRzdHIpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2Zvb3RlcigpCisjCisjIFN0b3JlIHRoZSBmb290ZXIgY2FwdGlvbiBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfZm9vdGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDE1OyAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkc3RyICAgICAgICAgPSAkc2VsZi0+e19mb290ZXJ9OyAgICAgICAgICAgICAjIGZvb3RlciBzdHJpbmcKKyAgICBteSAkY2NoICAgICAgICAgPSBsZW5ndGgoJHN0cik7ICAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiBmb290ZXIgc3RyaW5nCisgICAgbXkgJGVuY29kaW5nICAgID0gJHNlbGYtPntfZm9vdGVyX2VuY29kaW5nfTsgICAgIyBDaGFyYWN0ZXIgZW5jb2RpbmcKKworCisgICAgIyBDaGFyYWN0ZXIgbGVuZ3RoIGlzIG51bSBvZiBjaGFycyBub3QgbnVtIG9mIGJ5dGVzCisgICAgJGNjaCAgICAgICAgICAgLz0gMiBpZiAkZW5jb2Rpbmc7CisKKyAgICAjIENoYW5nZSB0aGUgVVRGLTE2IG5hbWUgZnJvbSBCRSB0byBMRQorICAgICRzdHIgICAgICAgICAgICA9IHBhY2sgJ24qJywgdW5wYWNrICd2KicsICRzdHIgaWYgJGVuY29kaW5nOworCisgICAgJGxlbmd0aCAgICAgICAgID0gMyArIGxlbmd0aCgkc3RyKTsKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZDIiwgICRjY2gsICRlbmNvZGluZyk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEsICRzdHIpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2hjZW50ZXIoKQorIworIyBTdG9yZSB0aGUgaG9yaXpvbnRhbCBjZW50ZXJpbmcgSENFTlRFUiBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfaGNlbnRlciB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MDA4MzsgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZIQ2VudGVyID0gJHNlbGYtPntfaGNlbnRlcn07ICAgIyBIb3Jpem9udGFsIGNlbnRlcmluZworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2IiwgICAkZkhDZW50ZXIpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV92Y2VudGVyKCkKKyMKKyMgU3RvcmUgdGhlIHZlcnRpY2FsIGNlbnRlcmluZyBWQ0VOVEVSIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV92Y2VudGVyIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgID0gMHgwMDg0OyAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwMjsgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZlZDZW50ZXIgPSAkc2VsZi0+e192Y2VudGVyfTsgICAjIEhvcml6b250YWwgY2VudGVyaW5nCisKKyAgICBteSAkaGVhZGVyICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soInYiLCAgICRmVkNlbnRlcik7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21hcmdpbl9sZWZ0KCkKKyMKKyMgU3RvcmUgdGhlIExFRlRNQVJHSU4gQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX21hcmdpbl9sZWZ0IHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDAyNjsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDA4OyAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG1hcmdpbiAgPSAkc2VsZi0+e19tYXJnaW5fbGVmdH07ICAgICMgTWFyZ2luIGluIGluY2hlcworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJkIiwgICAkbWFyZ2luKTsKKworICAgIGlmICgkc2VsZi0+e19ieXRlX29yZGVyfSkgeyAkZGF0YSA9IHJldmVyc2UgJGRhdGEgfQorCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJnaW5fcmlnaHQoKQorIworIyBTdG9yZSB0aGUgUklHSFRNQVJHSU4gQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX21hcmdpbl9yaWdodCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMjc7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwODsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRtYXJnaW4gID0gJHNlbGYtPntfbWFyZ2luX3JpZ2h0fTsgICAjIE1hcmdpbiBpbiBpbmNoZXMKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygiZCIsICAgJG1hcmdpbik7CisKKyAgICBpZiAoJHNlbGYtPntfYnl0ZV9vcmRlcn0pIHsgJGRhdGEgPSByZXZlcnNlICRkYXRhIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFyZ2luX3RvcCgpCisjCisjIFN0b3JlIHRoZSBUT1BNQVJHSU4gQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX21hcmdpbl90b3AgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgID0gMHgwMDI4OyAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMDg7ICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkbWFyZ2luICA9ICRzZWxmLT57X21hcmdpbl90b3B9OyAgICAgIyBNYXJnaW4gaW4gaW5jaGVzCisKKyAgICBteSAkaGVhZGVyICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soImQiLCAgICRtYXJnaW4pOworCisgICAgaWYgKCRzZWxmLT57X2J5dGVfb3JkZXJ9KSB7ICRkYXRhID0gcmV2ZXJzZSAkZGF0YSB9CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21hcmdpbl9ib3R0b20oKQorIworIyBTdG9yZSB0aGUgQk9UVE9NTUFSR0lOIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJnaW5fYm90dG9tIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDAyOTsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDA4OyAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG1hcmdpbiAgPSAkc2VsZi0+e19tYXJnaW5fYm90dG9tfTsgICMgTWFyZ2luIGluIGluY2hlcworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJkIiwgICAkbWFyZ2luKTsKKworICAgIGlmICgkc2VsZi0+e19ieXRlX29yZGVyfSkgeyAkZGF0YSA9IHJldmVyc2UgJGRhdGEgfQorCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG1lcmdlX2NlbGxzKCRmaXJzdF9yb3csICRmaXJzdF9jb2wsICRsYXN0X3JvdywgJGxhc3RfY29sKQorIworIyBUaGlzIGlzIGFuIEV4Y2VsOTcvMjAwMCBtZXRob2QuIEl0IGlzIHJlcXVpcmVkIHRvIHBlcmZvcm0gbW9yZSBjb21wbGljYXRlZAorIyBtZXJnaW5nIHRoYW4gdGhlIG5vcm1hbCBhbGlnbiBtZXJnZSBpbiBGb3JtYXQucG0KKyMKK3N1YiBtZXJnZV9jZWxscyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDBFNTsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDBBOyAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGNyZWYgICAgID0gMTsgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHJlZnMKKyAgICBteSAkcndGaXJzdCAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgIyBGaXJzdCByb3cgaW4gcmVmZXJlbmNlCisgICAgbXkgJGNvbEZpcnN0ID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICMgRmlyc3QgY29sIGluIHJlZmVyZW5jZQorICAgIG15ICRyd0xhc3QgICA9ICRfWzJdIHx8ICRyd0ZpcnN0OyAgICAgICAjIExhc3QgIHJvdyBpbiByZWZlcmVuY2UKKyAgICBteSAkY29sTGFzdCAgPSAkX1szXSB8fCAkY29sRmlyc3Q7ICAgICAgIyBMYXN0ICBjb2wgaW4gcmVmZXJlbmNlCisKKworICAgICMgRXhjZWwgZG9lc24ndCBhbGxvdyBhIHNpbmdsZSBjZWxsIHRvIGJlIG1lcmdlZAorICAgIHJldHVybiBpZiAkcndGaXJzdCA9PSAkcndMYXN0IGFuZCAkY29sRmlyc3QgPT0gJGNvbExhc3Q7CisKKyAgICAjIFN3YXAgbGFzdCByb3cvY29sIHdpdGggZmlyc3Qgcm93L2NvbCBhcyBuZWNlc3NhcnkKKyAgICAoJHJ3Rmlyc3QsICAkcndMYXN0ICkgPSAoJHJ3TGFzdCwgICRyd0ZpcnN0ICkgaWYgJHJ3Rmlyc3QgID4gJHJ3TGFzdDsKKyAgICAoJGNvbEZpcnN0LCAkY29sTGFzdCkgPSAoJGNvbExhc3QsICRjb2xGaXJzdCkgaWYgJGNvbEZpcnN0ID4gJGNvbExhc3Q7CisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInZ2dnZ2IiwgICAgJGNyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcndGaXJzdCwgJHJ3TGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xGaXJzdCwgJGNvbExhc3QpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbWVyZ2VfcmFuZ2UoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICRzdHJpbmcsICRmb3JtYXQsICRlbmNvZGluZykKKyMKKyMgVGhpcyBpcyBhIHdyYXBwZXIgdG8gZW5zdXJlIGNvcnJlY3QgdXNlIG9mIHRoZSBtZXJnZV9jZWxscyBtZXRob2QsIGkuZS4sIHdyaXRlCisjIHRoZSBmaXJzdCBjZWxsIG9mIHRoZSByYW5nZSwgd3JpdGUgdGhlIGZvcm1hdHRlZCBibGFuayBjZWxscyBpbiB0aGUgcmFuZ2UgYW5kCisjIHRoZW4gY2FsbCB0aGUgbWVyZ2VfY2VsbHMgcmVjb3JkLiBGYWlsaW5nIHRvIGRvIHRoZSBzdGVwcyBpbiB0aGlzIG9yZGVyIHdpbGwKKyMgY2F1c2UgRXhjZWwgOTcgdG8gY3Jhc2guCisjCitzdWIgbWVyZ2VfcmFuZ2UgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorICAgIGNyb2FrICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyIgaWYgQF8gIT0gNiBhbmQgQF8gIT0gNzsKKyAgICBjcm9hayAiRm9ybWF0IGFyZ3VtZW50IGlzIG5vdCBhIGZvcm1hdCBvYmplY3QiIHVubGVzcyByZWYgJF9bNV07CisKKyAgICBteSAkcndGaXJzdCAgPSAkX1swXTsKKyAgICBteSAkY29sRmlyc3QgPSAkX1sxXTsKKyAgICBteSAkcndMYXN0ICAgPSAkX1syXTsKKyAgICBteSAkY29sTGFzdCAgPSAkX1szXTsKKyAgICBteSAkc3RyaW5nICAgPSAkX1s0XTsKKyAgICBteSAkZm9ybWF0ICAgPSAkX1s1XTsKKyAgICBteSAkZW5jb2RpbmcgPSAkX1s2XSA/IDEgOiAwOworCisKKyAgICAjIFRlbXAgY29kZSB0byBwcmV2ZW50IG1lcmdlZCBmb3JtYXRzIGluIG5vbi1tZXJnZWQgY2VsbHMuCisgICAgbXkgJGVycm9yID0gIkVycm9yOiByZWZlciB0byBtZXJnZV9yYW5nZSgpIGluIHRoZSBkb2N1bWVudGF0aW9uLiAiIC4KKyAgICAgICAgICAgICAgICAiQ2FuJ3QgdXNlIHByZXZpb3VzbHkgbm9uLW1lcmdlZCBmb3JtYXQgaW4gbWVyZ2VkIGNlbGxzIjsKKworICAgIGNyb2FrICRlcnJvciBpZiAkZm9ybWF0LT57X3VzZWRfbWVyZ2V9ID09IC0xOworICAgICRmb3JtYXQtPntfdXNlZF9tZXJnZX0gPSAwOyAjIFVudGlsIHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbi4KKworCisgICAgIyBTZXQgdGhlIG1lcmdlX3JhbmdlIHByb3BlcnR5IG9mIHRoZSBmb3JtYXQgb2JqZWN0LiBGb3IgQklGRjgrLgorICAgICRmb3JtYXQtPnNldF9tZXJnZV9yYW5nZSgpOworCisgICAgIyBFeGNlbCBkb2Vzbid0IGFsbG93IGEgc2luZ2xlIGNlbGwgdG8gYmUgbWVyZ2VkCisgICAgY3JvYWsgIkNhbid0IG1lcmdlIHNpbmdsZSBjZWxsIiBpZiAkcndGaXJzdCAgPT0gJHJ3TGFzdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xGaXJzdCA9PSAkY29sTGFzdDsKKworICAgICMgU3dhcCBsYXN0IHJvdy9jb2wgd2l0aCBmaXJzdCByb3cvY29sIGFzIG5lY2Vzc2FyeQorICAgICgkcndGaXJzdCwgICRyd0xhc3QgKSA9ICgkcndMYXN0LCAgJHJ3Rmlyc3QgKSBpZiAkcndGaXJzdCAgPiAkcndMYXN0OworICAgICgkY29sRmlyc3QsICRjb2xMYXN0KSA9ICgkY29sTGFzdCwgJGNvbEZpcnN0KSBpZiAkY29sRmlyc3QgPiAkY29sTGFzdDsKKworICAgICMgV3JpdGUgdGhlIGZpcnN0IGNlbGwKKyAgICBpZiAoJGVuY29kaW5nKSB7CisgICAgICAgICRzZWxmLT53cml0ZV91dGYxNmJlX3N0cmluZygkcndGaXJzdCwgJGNvbEZpcnN0LCAkc3RyaW5nLCAkZm9ybWF0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT53cml0ZSAgICAgICAgICAgICAgICgkcndGaXJzdCwgJGNvbEZpcnN0LCAkc3RyaW5nLCAkZm9ybWF0KTsKKyAgICB9CisKKyAgICAjIFBhZCBvdXQgdGhlIHJlc3Qgb2YgdGhlIGFyZWEgd2l0aCBmb3JtYXR0ZWQgYmxhbmsgY2VsbHMuCisgICAgZm9yIG15ICRyb3cgKCRyd0ZpcnN0IC4uICRyd0xhc3QpIHsKKyAgICAgICAgZm9yIG15ICRjb2wgKCRjb2xGaXJzdCAuLiAkY29sTGFzdCkgeworICAgICAgICAgICAgbmV4dCBpZiAkcm93ID09ICRyd0ZpcnN0IGFuZCAkY29sID09ICRjb2xGaXJzdDsKKyAgICAgICAgICAgICRzZWxmLT53cml0ZV9ibGFuaygkcm93LCAkY29sLCAkZm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzZWxmLT5tZXJnZV9jZWxscygkcndGaXJzdCwgJGNvbEZpcnN0LCAkcndMYXN0LCAkY29sTGFzdCk7CisKKyAgICAjIFRlbXAgY29kZSB0byBwcmV2ZW50IG1lcmdlZCBmb3JtYXRzIGluIG5vbi1tZXJnZWQgY2VsbHMuCisgICAgJGZvcm1hdC0+e191c2VkX21lcmdlfSA9IDE7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wcmludF9oZWFkZXJzKCkKKyMKKyMgV3JpdGUgdGhlIFBSSU5USEVBREVSUyBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcHJpbnRfaGVhZGVycyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAyYTsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMjsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmUHJpbnRSd0NvbCA9ICRzZWxmLT57X3ByaW50X2hlYWRlcnN9OyAgIyBCb29sZWFuIGZsYWcKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInYiLCAgICRmUHJpbnRSd0NvbCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3ByaW50X2dyaWRsaW5lcygpCisjCisjIFdyaXRlIHRoZSBQUklOVEdSSURMSU5FUyBCSUZGIHJlY29yZC4gTXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisjIEdSSURTRVQgcmVjb3JkLgorIworc3ViIF9zdG9yZV9wcmludF9ncmlkbGluZXMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwMmI7ICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmUHJpbnRHcmlkICA9ICRzZWxmLT57X3ByaW50X2dyaWRsaW5lc307ICMgQm9vbGVhbiBmbGFnCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgICAkZlByaW50R3JpZCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2dyaWRzZXQoKQorIworIyBXcml0ZSB0aGUgR1JJRFNFVCBCSUZGIHJlY29yZC4gTXVzdCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisjIFBSSU5UR1JJRExJTkVTIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfZ3JpZHNldCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA4MjsgICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZkdyaWRTZXQgICAgPSBub3QgJHNlbGYtPntfcHJpbnRfZ3JpZGxpbmVzfTsgIyBCb29sZWFuIGZsYWcKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInYiLCAgICRmR3JpZFNldCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZ3V0cygpCisjCisjIFdyaXRlIHRoZSBHVVRTIEJJRkYgcmVjb3JkLiBUaGlzIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBndXR0ZXIgbWFyZ2lucworIyB3aGVyZSBFeGNlbCBvdXRsaW5lIHN5bWJvbHMgYXJlIGRpc3BsYXllZC4gVGhlIHZpc2liaWxpdHkgb2YgdGhlIGd1dHRlcnMgaXMKKyMgY29udHJvbGxlZCBieSBhIGZsYWcgaW4gV1NCT09MLiBTZWUgYWxzbyBfc3RvcmVfd3Nib29sKCkuCisjCisjIFdlIGFyZSBhbGwgaW4gdGhlIGd1dHRlciBidXQgc29tZSBvZiB1cyBhcmUgbG9va2luZyBhdCB0aGUgc3RhcnMuCisjCitzdWIgX3N0b3JlX2d1dHMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwODA7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwODsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGR4UndHdXQgICAgID0gMHgwMDAwOyAgICMgU2l6ZSBvZiByb3cgZ3V0dGVyCisgICAgbXkgJGR4Q29sR3V0ICAgID0gMHgwMDAwOyAgICMgU2l6ZSBvZiBjb2wgZ3V0dGVyCisKKyAgICBteSAkcm93X2xldmVsICAgPSAkc2VsZi0+e19vdXRsaW5lX3Jvd19sZXZlbH07CisgICAgbXkgJGNvbF9sZXZlbCAgID0gMDsKKworCisgICAgIyBDYWxjdWxhdGUgdGhlIG1heGltdW0gY29sdW1uIG91dGxpbmUgbGV2ZWwuIFRoZSBlcXVpdmFsZW50IGNhbGN1bGF0aW9uCisgICAgIyBmb3IgdGhlIHJvdyBvdXRsaW5lIGxldmVsIGlzIGNhcnJpZWQgb3V0IGluIHNldF9yb3coKS4KKyAgICAjCisgICAgZm9yZWFjaCBteSAkY29saW5mbyAoQHskc2VsZi0+e19jb2xpbmZvfX0pIHsKKyAgICAgICAgIyBTa2lwIGNvbHMgd2l0aG91dCBvdXRsaW5lIGxldmVsIGluZm8uCisgICAgICAgIG5leHQgaWYgQHskY29saW5mb30gPCA2OworICAgICAgICAkY29sX2xldmVsID0gQHskY29saW5mb31bNV0gaWYgQHskY29saW5mb31bNV0gPiAkY29sX2xldmVsOworICAgIH0KKworCisgICAgIyBTZXQgdGhlIGxpbWl0cyBmb3IgdGhlIG91dGxpbmUgbGV2ZWxzICgwIDw9IHggPD0gNykuCisgICAgJGNvbF9sZXZlbCA9IDAgaWYgJGNvbF9sZXZlbCA8IDA7CisgICAgJGNvbF9sZXZlbCA9IDcgaWYgJGNvbF9sZXZlbCA+IDc7CisKKworICAgICMgVGhlIGRpc3BsYXllZCBsZXZlbCBpcyBvbmUgZ3JlYXRlciB0aGFuIHRoZSBtYXggb3V0bGluZSBsZXZlbHMKKyAgICAkcm93X2xldmVsKysgaWYgJHJvd19sZXZlbCA+IDA7CisgICAgJGNvbF9sZXZlbCsrIGlmICRjb2xfbGV2ZWwgPiAwOworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZ2dnYiLCAkZHhSd0d1dCwgJGR4Q29sR3V0LCAkcm93X2xldmVsLCAkY29sX2xldmVsKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV93c2Jvb2woKQorIworIyBXcml0ZSB0aGUgV1NCT09MIEJJRkYgcmVjb3JkLCBtYWlubHkgZm9yIGZpdC10by1wYWdlLiBVc2VkIGluIGNvbmp1bmN0aW9uCisjIHdpdGggdGhlIFNFVFVQIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfd3Nib29sIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDgxOyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRncmJpdCAgICAgICA9IDB4MDAwMDsgICAjIE9wdGlvbiBmbGFncworCisgICAgIyBTZXQgdGhlIG9wdGlvbiBmbGFncworICAgICRncmJpdCB8PSAweDAwMDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQXV0byBwYWdlIGJyZWFrcyB2aXNpYmxlCisgICAgJGdyYml0IHw9IDB4MDAyMCBpZiAkc2VsZi0+e19vdXRsaW5lX3N0eWxlfTsgIyBBdXRvIG91dGxpbmUgc3R5bGVzCisgICAgJGdyYml0IHw9IDB4MDA0MCBpZiAkc2VsZi0+e19vdXRsaW5lX2JlbG93fTsgIyBPdXRsaW5lIHN1bW1hcnkgYmVsb3cKKyAgICAkZ3JiaXQgfD0gMHgwMDgwIGlmICRzZWxmLT57X291dGxpbmVfcmlnaHR9OyAjIE91dGxpbmUgc3VtbWFyeSByaWdodAorICAgICRncmJpdCB8PSAweDAxMDAgaWYgJHNlbGYtPntfZml0X3BhZ2V9OyAgICAgICMgUGFnZSBzZXR1cCBmaXQgdG8gcGFnZQorICAgICRncmJpdCB8PSAweDA0MDAgaWYgJHNlbGYtPntfb3V0bGluZV9vbn07ICAgICMgT3V0bGluZSBzeW1ib2xzIGRpc3BsYXllZAorCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgICAkZ3JiaXQpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9oYnJlYWsoKQorIworIyBXcml0ZSB0aGUgSE9SSVpPTlRBTFBBR0VCUkVBS1MgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2hicmVhayB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgIyBSZXR1cm4gaWYgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCBwYWdlYnJlYWtzCisgICAgcmV0dXJuIHVubGVzcyBAeyRzZWxmLT57X2hicmVha3N9fTsKKworICAgICMgU29ydCBhbmQgZmlsdGVyIGFycmF5IG9mIHBhZ2UgYnJlYWtzCisgICAgbXkgQGJyZWFrcyAgPSAkc2VsZi0+X3NvcnRfcGFnZWJyZWFrcyhAeyRzZWxmLT57X2hicmVha3N9fSk7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDAxYjsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGNicmsgICAgPSBzY2FsYXIgQGJyZWFrczsgICAgICAgIyBOdW1iZXIgb2YgcGFnZSBicmVha3MKKyAgICBteSAkbGVuZ3RoICA9IDIgKyA2KiRjYnJrOyAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgID0gcGFjaygidiIsICAgJGNicmspOworCisgICAgIyBBcHBlbmQgZWFjaCBwYWdlIGJyZWFrCisgICAgZm9yZWFjaCBteSAkYnJlYWsgKEBicmVha3MpIHsKKyAgICAgICAgJGRhdGEgLj0gcGFjaygidnZ2IiwgJGJyZWFrLCAweDAwMDAsIDB4MDBmZik7CisgICAgfQorCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV92YnJlYWsoKQorIworIyBXcml0ZSB0aGUgVkVSVElDQUxQQUdFQlJFQUtTIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV92YnJlYWsgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgICMgUmV0dXJuIGlmIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgcGFnZWJyZWFrcworICAgIHJldHVybiB1bmxlc3MgQHskc2VsZi0+e192YnJlYWtzfX07CisKKyAgICAjIFNvcnQgYW5kIGZpbHRlciBhcnJheSBvZiBwYWdlIGJyZWFrcworICAgIG15IEBicmVha3MgID0gJHNlbGYtPl9zb3J0X3BhZ2VicmVha3MoQHskc2VsZi0+e192YnJlYWtzfX0pOworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMWE7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRjYnJrICAgID0gc2NhbGFyIEBicmVha3M7ICAgICAgICMgTnVtYmVyIG9mIHBhZ2UgYnJlYWtzCisgICAgbXkgJGxlbmd0aCAgPSAyICsgNiokY2JyazsgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInYiLCAgICRjYnJrKTsKKworICAgICMgQXBwZW5kIGVhY2ggcGFnZSBicmVhaworICAgIGZvcmVhY2ggbXkgJGJyZWFrIChAYnJlYWtzKSB7CisgICAgICAgICRkYXRhIC49IHBhY2soInZ2diIsICRicmVhaywgMHgwMDAwLCAweGZmZmYpOworICAgIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcHJvdGVjdCgpCisjCisjIFNldCB0aGUgQmlmZiBQUk9URUNUIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3b3Jrc2hlZXQgaXMgcHJvdGVjdGVkLgorIworc3ViIF9zdG9yZV9wcm90ZWN0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgIyBFeGl0IHVubGVzcyBzaGVldCBwcm90ZWN0aW9uIGhhcyBiZWVuIHNwZWNpZmllZAorICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntfcHJvdGVjdH07CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwMTI7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMjsgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZMb2NrICAgICAgID0gJHNlbGYtPntfcHJvdGVjdH07ICAgICMgV29ya3NoZWV0IGlzIHByb3RlY3RlZAorCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgICRmTG9jayk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9wcm90ZWN0KCkKKyMKKyMgU2V0IHRoZSBCaWZmIE9CSlBST1RFQ1QgcmVjb3JkIHRvIGluZGljYXRlIHRoYXQgb2JqZWN0cyBhcmUgcHJvdGVjdGVkLgorIworc3ViIF9zdG9yZV9vYmpfcHJvdGVjdCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgICMgRXhpdCB1bmxlc3Mgc2hlZXQgcHJvdGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X3Byb3RlY3R9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDYzOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmTG9jayAgICAgICA9ICRzZWxmLT57X3Byb3RlY3R9OyAgICAjIFdvcmtzaGVldCBpcyBwcm90ZWN0ZWQKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAkZkxvY2spOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wYXNzd29yZCgpCisjCisjIFdyaXRlIHRoZSB3b3Jrc2hlZXQgUEFTU1dPUkQgcmVjb3JkLgorIworc3ViIF9zdG9yZV9wYXNzd29yZCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgICMgRXhpdCB1bmxlc3Mgc2hlZXQgcHJvdGVjdGlvbiBhbmQgcGFzc3dvcmQgaGF2ZSBiZWVuIHNwZWNpZmllZAorICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntfcHJvdGVjdH0gYW5kIGRlZmluZWQgJHNlbGYtPntfcGFzc3dvcmR9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDEzOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICR3UGFzc3dvcmQgICA9ICRzZWxmLT57X3Bhc3N3b3JkfTsgICAjIEVuY29kZWQgcGFzc3dvcmQKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAkd1Bhc3N3b3JkKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIworIyBOb3RlIGFib3V0IGNvbXBhdGliaWxpdHkgbW9kZS4KKyMKKyMgRXhjZWwgZG9lc24ndCByZXF1aXJlIGV2ZXJ5IHBvc3NpYmxlIEJpZmYgcmVjb3JkIHRvIGJlIHByZXNlbnQgaW4gYSBmaWxlLgorIyBJbiBwYXJ0aWN1bGFyIGlmIHRoZSBpbmRleGluZyByZWNvcmRzIElOREVYLCBST1cgYW5kIERCQ0VMTCBhcmVuJ3QgcHJlc2VudAorIyBpdCBqdXN0IGlnbm9yZXMgdGhlIGZhY3QgYW5kIHJlYWRzIHRoZSBjZWxscyBhbnl3YXkuIFRoaXMgaXMgYWxzbyB0cnVlIG9mCisjIHRoZSBFWFRTU1QgcmVjb3JkLiBHbnVtZXJpYyBhbmQgT09vIGFsc28gdGFrZSB0aGlzIGFwcHJvYWNoLiBUaGlzIGFsbG93cworIyBXcml0ZUV4Y2VsIHRvIGlnbm9yZSB0aGVzZSByZWNvcmRzIGluIG9yZGVyIHRvIG1pbmltaXNlIHRoZSBhbW91bnQgb2YgZGF0YQorIyBzdG9yZWQgaW4gbWVtb3J5LiBIb3dldmVyLCBvdGhlciB0aGlyZCBwYXJ0eSBhcHBsaWNhdGlvbnMgdGhhdCByZWFkIEV4Y2VsCisjIGZpbGVzIG9mdGVuIGV4cGVjdCB0aGVzZSByZWNvcmRzIHRvIGJlIHByZXNlbnQuIEluICJjb21wYXRpYmlsaXR5IG1vZGUiCisjIFdyaXRlRXhjZWwgd3JpdGVzIHRoZXNlIHJlY29yZHMgYW5kIHRyaWVzIHRvIGJlIGFzIGNsb3NlIHRvIGFuIEV4Y2VsCisjIGdlbmVyYXRlZCBmaWxlIGFzIHBvc3NpYmxlLgorIworIyBUaGlzIHJlcXVpcmVzIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzdG9yZWQgaW4gbWVtb3J5IHVudGlsIHRoZSBmaWxlIGlzCisjIGFib3V0IHRvIGJlIHdyaXR0ZW4uIFRoaXMgaW5jdXJzIGEgbWVtb3J5IGFuZCBzcGVlZCBwZW5hbHR5IGFuZCBtYXkgbm90IGJlCisjIHN1aXRhYmxlIGZvciB2ZXJ5IGxhcmdlIGZpbGVzLgorIworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdGFibGUoKQorIworIyBXcml0ZSBjZWxsIGRhdGEgc3RvcmVkIGluIHRoZSB3b3Jrc2hlZXQgcm93L2NvbCB0YWJsZS4KKyMKKyMgVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiBjb21wYXRpYml0eV9tb2RlKCkgaXMgaW4gb3BlcmF0aW9uLgorIworIyBUaGlzIG1ldGhvZCB3cml0ZXMgUk9XIGRhdGEsIHRoZW4gY2VsbCBkYXRhIChOVU1CRVIsIExBQkVMU1NULCBldGMpIGFuZCB0aGVuCisjIERCQ0VMTCByZWNvcmRzIGluIGJsb2NrcyBvZiAzMiByb3dzLiBUaGlzIGlzIGV4cGxhaW5lZCBpbiBkZXRhaWwgKGZvciBhCisjIGNoYW5nZSkgaW4gdGhlIEV4Y2VsIFNESyBhbmQgaW4gdGhlIE9PbyBFeGNlbCBmaWxlIGZvcm1hdCBkb2MuCisjCitzdWIgX3N0b3JlX3RhYmxlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X2NvbXBhdGliaWxpdHl9OworCisgICAgIyBPZmZzZXQgZnJvbSB0aGUgREJDRUxMIHJlY29yZCBiYWNrIHRvIHRoZSBmaXJzdCBST1cgb2YgdGhlIDMyIHJvdyBibG9jay4KKyAgICBteSAkcm93X29mZnNldCA9IDA7CisKKyAgICAjIFRyYWNrIHJvd3MgdGhhdCBoYXZlIGNlbGwgZGF0YSBvciBtb2RpZmllZCBieSBzZXRfcm93KCkuCisgICAgbXkgQHdyaXR0ZW5fcm93czsKKworCisgICAgIyBXcml0ZSB0aGUgUk9XIHJlY29yZHMgd2l0aCB1cGRhdGVkIG1heC9taW4gY29sIGZpZWxkcy4KKyAgICAjCisgICAgZm9yIG15ICRyb3cgKDAgLi4gJHNlbGYtPntfZGltX3Jvd21heH0gLTEpIHsKKyAgICAgICAgIyBTa2lwIHVubGVzcyB0aGVyZSBpcyBjZWxsIGRhdGEgaW4gcm93IG9yIHRoZSByb3cgaGFzIGJlZW4gbW9kaWZpZWQuCisgICAgICAgIG5leHQgdW5sZXNzICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddIG9yICRzZWxmLT57X3Jvd19kYXRhfS0+eyRyb3d9OworCisgICAgICAgICMgU3RvcmUgdGhlIHJvd3Mgd2l0aCBkYXRhLgorICAgICAgICBwdXNoIEB3cml0dGVuX3Jvd3MsICRyb3c7CisKKyAgICAgICAgIyBJbmNyZWFzZSB0aGUgcm93IG9mZnNldCBieSB0aGUgbGVuZ3RoIG9mIGEgUk9XIHJlY29yZDsKKyAgICAgICAgJHJvd19vZmZzZXQgKz0gMjA7CisKKyAgICAgICAgIyBUaGUgbWF4L21pbiBjb2xzIGluIHRoZSBST1cgcmVjb3JkcyBhcmUgdGhlIHNhbWUgYXMgaW4gRElNRU5TSU9OUy4KKyAgICAgICAgbXkgJGNvbF9taW4gPSAkc2VsZi0+e19kaW1fY29sbWlufTsKKyAgICAgICAgbXkgJGNvbF9tYXggPSAkc2VsZi0+e19kaW1fY29sbWF4fTsKKworICAgICAgICAjIFdyaXRlIGEgdXNlciBzcGVjaWZpZWQgUk9XIHJlY29yZCAobW9kaWZpZWQgYnkgc2V0X3JvdygpKS4KKyAgICAgICAgaWYgKCRzZWxmLT57X3Jvd19kYXRhfS0+eyRyb3d9KSB7CisgICAgICAgICAgICAjIFJld3JpdGUgdGhlIG1pbiBhbmQgbWF4IGNvbHMgZm9yIHVzZXIgZGVmaW5lZCByb3cgcmVjb3JkLgorICAgICAgICAgICAgbXkgJHBhY2tlZF9yb3cgPSAkc2VsZi0+e19yb3dfZGF0YX0tPnskcm93fTsKKyAgICAgICAgICAgIHN1YnN0ciAkcGFja2VkX3JvdywgNiwgNCwgcGFjaygndnYnLCAkY29sX21pbiwgJGNvbF9tYXgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJHBhY2tlZF9yb3cpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXcml0ZSBhIGRlZmF1bHQgUm93IHJlY29yZCBpZiB0aGVyZSBpc24ndCBhICB1c2VyIGRlZmluZWQgUk9XLgorICAgICAgICAgICAgJHNlbGYtPl93cml0ZV9yb3dfZGVmYXVsdCgkcm93LCAkY29sX21pbiwgJGNvbF9tYXgpOworICAgICAgICB9CisKKworCisgICAgICAgICMgSWYgMzIgcm93cyBoYXZlIGJlZW4gd3JpdHRlbiBvciB3ZSBhcmUgYXQgdGhlIGxhc3Qgcm93IGluIHRoZQorICAgICAgICAjIHdvcmtzaGVldCB0aGVuIHdyaXRlIHRoZSBjZWxsIGRhdGEgYW5kIHRoZSBEQkNFTEwgcmVjb3JkLgorICAgICAgICAjCisgICAgICAgIGlmIChAd3JpdHRlbl9yb3dzID09IDMyIG9yICRyb3cgPT0gJHNlbGYtPntfZGltX3Jvd21heH0gLTEpIHsKKworICAgICAgICAgICAgIyBPZmZzZXRzIHRvIHRoZSBmaXJzdCBjZWxsIG9mIGVhY2ggcm93LgorICAgICAgICAgICAgbXkgQGNlbGxfb2Zmc2V0czsKKyAgICAgICAgICAgIHB1c2ggQGNlbGxfb2Zmc2V0cywgJHJvd19vZmZzZXQgLSAyMDsKKworICAgICAgICAgICAgIyBXcml0ZSB0aGUgY2VsbCBkYXRhIGluIGVhY2ggcm93IGFuZCBzdW0gdGhlaXIgbGVuZ3RocyBmb3IgdGhlCisgICAgICAgICAgICAjIGNlbGwgb2Zmc2V0cy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIGZvciBteSAkcm93IChAd3JpdHRlbl9yb3dzKSB7CisgICAgICAgICAgICAgICAgbXkgJGNlbGxfb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgIGZvciBteSAkY29sIChAeyRzZWxmLT57X3RhYmxlfS0+WyRyb3ddfSkgeworICAgICAgICAgICAgICAgICAgICBuZXh0IHVubGVzcyAkY29sOworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkY29sKTsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGxlbmd0aCA9IGxlbmd0aCAkY29sOworICAgICAgICAgICAgICAgICAgICAkcm93X29mZnNldCAgKz0gJGxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgJGNlbGxfb2Zmc2V0ICs9ICRsZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1c2ggQGNlbGxfb2Zmc2V0cywgJGNlbGxfb2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjIFRoZSBsYXN0IG9mZnNldCBpc24ndCByZXF1aXJlZC4KKyAgICAgICAgICAgIHBvcCBAY2VsbF9vZmZzZXRzOworCisgICAgICAgICAgICAjIFN0b3JlcyB0aGUgREJDRUxMIG9mZnNldCBmb3IgdXNlIGluIHRoZSBJTkRFWCByZWNvcmQuCisgICAgICAgICAgICBwdXNoIEB7JHNlbGYtPntfZGJfaW5kaWNlc319LCAkc2VsZi0+e19kYXRhc2l6ZX07CisKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIERCQ0VMTCByZWNvcmQuCisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX2RiY2VsbCgkcm93X29mZnNldCwgQGNlbGxfb2Zmc2V0cyk7CisKKyAgICAgICAgICAgICMgQ2xlYXIgdGhlIHZhcmlhYmxlIGZvciB0aGUgbmV4dCBibG9jayBvZiByb3dzLgorICAgICAgICAgICAgQHdyaXR0ZW5fcm93cyAgID0gKCk7CisgICAgICAgICAgICBAY2VsbF9vZmZzZXRzICAgPSAoKTsKKyAgICAgICAgICAgICRyb3dfb2Zmc2V0ICAgICA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZGJjZWxsKCkKKyMKKyMgU3RvcmUgdGhlIERCQ0VMTCByZWNvcmQgdXNpbmcgdGhlIG9mZnNldCBjYWxjdWxhdGVkIGluIF9zdG9yZV90YWJsZSgpLgorIworIyBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIGNvbXBhdGliaXR5X21vZGUoKSBpcyBpbiBvcGVyYXRpb24uCisjCitzdWIgX3N0b3JlX2RiY2VsbCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJHJvd19vZmZzZXQgICAgICA9IHNoaWZ0OworICAgIG15IEBjZWxsX29mZnNldHMgICAgPSBAXzsKKworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDBENzsgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gNCArIDIgKiBAY2VsbF9vZmZzZXRzOyAgIyBCeXRlcyB0byBmb2xsb3cKKworCisgICAgbXkgJGhlYWRlciAgICAgICAgICA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjayAnVicsICAkcm93X29mZnNldDsKKyAgICAgICAkZGF0YSAgICAgICAgICAgLj0gcGFjayAndicsICRfIGZvciBAY2VsbF9vZmZzZXRzOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2luZGV4KCkKKyMKKyMgU3RvcmUgdGhlIElOREVYIHJlY29yZCB1c2luZyB0aGUgREJDRUxMIG9mZnNldHMgY2FsY3VsYXRlZCBpbiBfc3RvcmVfdGFibGUoKS4KKyMKKyMgVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiBjb21wYXRpYml0eV9tb2RlKCkgaXMgaW4gb3BlcmF0aW9uLgorIworc3ViIF9zdG9yZV9pbmRleCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19jb21wYXRpYmlsaXR5fTsKKworICAgIG15IEBpbmRpY2VzICAgICA9IEB7JHNlbGYtPntfZGJfaW5kaWNlc319OworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDAwMDA7CisgICAgbXkgJHJvd19taW4gICAgID0gJHNlbGYtPntfZGltX3Jvd21pbn07CisgICAgbXkgJHJvd19tYXggICAgID0gJHNlbGYtPntfZGltX3Jvd21heH07CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAyMEI7ICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAxNiArIDQgKiBAaW5kaWNlczsgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrICd2dicsICAgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrICdWVlZWJywgJHJlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcm93X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvd19tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXNlcnZlZDsKKworICAgIGZvciBteSAkaW5kZXggKEBpbmRpY2VzKSB7CisgICAgICAgJGRhdGEgLj0gcGFjayAnVicsICRpbmRleCArICRzZWxmLT57X29mZnNldH0gKyAyMCArICRsZW5ndGggKzQ7CisgICAgfQorCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgaW5zZXJ0X2NoYXJ0KCRyb3csICRjb2wsICRjaGFydCwgJHgsICR5LCAkc2NhbGVfeCwgJHNjYWxlX3kpCisjCisjIEluc2VydCBhIGNoYXJ0IGludG8gYSB3b3Jrc2hlZXQuIFRoZSAkY2hhcnQgYXJndW1lbnQgc2hvdWxkIGJlIGEgQ2hhcnQKKyMgb2JqZWN0IG9yIGVsc2UgaXQgaXMgYXNzdW1lZCB0byBiZSBhIGZpbGVuYW1lIG9mIGFuIGV4dGVybmFsIGJpbmFyeSBmaWxlLgorIyBUaGUgbGF0dGVyIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyMKK3N1YiBpbnNlcnRfY2hhcnQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOworICAgIG15ICRjaGFydCAgICAgICA9ICRfWzJdOworICAgIG15ICR4X29mZnNldCAgICA9ICRfWzNdIHx8IDA7CisgICAgbXkgJHlfb2Zmc2V0ICAgID0gJF9bNF0gfHwgMDsKKyAgICBteSAkc2NhbGVfeCAgICAgPSAkX1s1XSB8fCAxOworICAgIG15ICRzY2FsZV95ICAgICA9ICRfWzZdIHx8IDE7CisKKyAgICBjcm9hayAiSW5zdWZmaWNpZW50IGFyZ3VtZW50cyBpbiBpbnNlcnRfY2hhcnQoKSIgdW5sZXNzIEBfID49IDM7CisKKyAgICBpZiAoIHJlZiAkY2hhcnQgKSB7CisgICAgICAgICMgQ2hlY2sgZm9yIGEgQ2hhcnQgb2JqZWN0LgorICAgICAgICBjcm9hayAiTm90IGEgQ2hhcnQgb2JqZWN0IGluIGluc2VydF9jaGFydCgpIgorICAgICAgICAgIHVubGVzcyAkY2hhcnQtPmlzYSggJ1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCcgKTsKKworICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGNoYXJ0IGlzIGFuIGVtYmVkZGVkIHN0eWxlIGNoYXJ0LgorICAgICAgICBjcm9hayAiTm90IGEgZW1iZWRkZWQgc3R5bGUgQ2hhcnQgb2JqZWN0IGluIGluc2VydF9jaGFydCgpIgorICAgICAgICAgIHVubGVzcyAkY2hhcnQtPntfZW1iZWRkZWR9OworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMgQXNzdW1lIGFuIGV4dGVybmFsIGJpbiBmaWxlbmFtZS4KKyAgICAgICAgY3JvYWsgIkNvdWxkbid0IGxvY2F0ZSAkY2hhcnQgaW4gaW5zZXJ0X2NoYXJ0KCk6ICQhIiB1bmxlc3MgLWUgJGNoYXJ0OworICAgIH0KKworICAgICRzZWxmLT57X2NoYXJ0c30tPnskcm93fS0+eyRjb2x9ID0gIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjYWxlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNjYWxlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKKworfQorCisjIE9sZGVyIG1ldGhvZCBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyplbWJlZF9jaGFydCA9ICppbnNlcnRfY2hhcnQ7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgaW5zZXJ0X2ltYWdlKCRyb3csICRjb2wsICRmaWxlbmFtZSwgJHgsICR5LCAkc2NhbGVfeCwgJHNjYWxlX3kpCisjCisjIEluc2VydCBhbiBpbWFnZSBpbnRvIHRoZSB3b3Jrc2hlZXQuCisjCitzdWIgaW5zZXJ0X2ltYWdlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBteSAkcm93ICAgICAgICAgPSAkX1swXTsKKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsKKyAgICBteSAkaW1hZ2UgICAgICAgPSAkX1syXTsKKyAgICBteSAkeF9vZmZzZXQgICAgPSAkX1szXSB8fCAwOworICAgIG15ICR5X29mZnNldCAgICA9ICRfWzRdIHx8IDA7CisgICAgbXkgJHNjYWxlX3ggICAgID0gJF9bNV0gfHwgMTsKKyAgICBteSAkc2NhbGVfeSAgICAgPSAkX1s2XSB8fCAxOworCisgICAgY3JvYWsgIkluc3VmZmljaWVudCBhcmd1bWVudHMgaW4gaW5zZXJ0X2ltYWdlKCkiIHVubGVzcyBAXyA+PSAzOworICAgIGNyb2FrICJDb3VsZG4ndCBsb2NhdGUgJGltYWdlOiAkISIgICAgICAgICAgICAgICB1bmxlc3MgLWUgJGltYWdlOworCisgICAgJHNlbGYtPntfaW1hZ2VzfS0+eyRyb3d9LT57JGNvbH0gPSBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY2FsZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY2FsZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CisKK30KKworIyBPbGRlciBtZXRob2QgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisqaW5zZXJ0X2JpdG1hcCA9ICppbnNlcnRfaW1hZ2U7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgX3Bvc2l0aW9uX29iamVjdCgpCisjCisjIENhbGN1bGF0ZSB0aGUgdmVydGljZXMgdGhhdCBkZWZpbmUgdGhlIHBvc2l0aW9uIG9mIGEgZ3JhcGhpY2FsIG9iamVjdCB3aXRoaW4KKyMgdGhlIHdvcmtzaGVldC4KKyMKKyMgICAgICAgICArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKyMgICAgICAgICB8ICAgICBBICAgICAgfCAgICAgIEIgICAgIHwKKyMgICArLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKyMgICB8ICAgICB8KHgxLHkxKSAgICAgfCAgICAgICAgICAgIHwKKyMgICB8ICAxICB8KEExKS5fX19fX19ffF9fX19fXyAgICAgIHwKKyMgICB8ICAgICB8ICAgIHwgICAgICAgICAgICAgIHwgICAgIHwKKyMgICB8ICAgICB8ICAgIHwgICAgICAgICAgICAgIHwgICAgIHwKKyMgICArLS0tLS0rLS0tLXwgICAgQklUTUFQICAgIHwtLS0tLSsKKyMgICB8ICAgICB8ICAgIHwgICAgICAgICAgICAgIHwgICAgIHwKKyMgICB8ICAyICB8ICAgIHxfX19fX19fX19fX19fXy4gICAgIHwKKyMgICB8ICAgICB8ICAgICAgICAgICAgfCAgICAgICAgKEIyKXwKKyMgICB8ICAgICB8ICAgICAgICAgICAgfCAgICAgKHgyLHkyKXwKKyMgICArLS0tLSArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKyMKKyMgRXhhbXBsZSBvZiBhIGJpdG1hcCB0aGF0IGNvdmVycyBzb21lIG9mIHRoZSBhcmVhIGZyb20gY2VsbCBBMSB0byBjZWxsIEIyLgorIworIyBCYXNlZCBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYml0bWFwIHdlIG5lZWQgdG8gY2FsY3VsYXRlIDggdmFyczoKKyMgICAgICRjb2xfc3RhcnQsICRyb3dfc3RhcnQsICRjb2xfZW5kLCAkcm93X2VuZCwgJHgxLCAkeTEsICR4MiwgJHkyLgorIyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY2VsbHMgYXJlIGFsc28gdmFyaWFibGUgYW5kIGhhdmUgdG8gYmUgdGFrZW4gaW50bworIyBhY2NvdW50LgorIyBUaGUgdmFsdWVzIG9mICRjb2xfc3RhcnQgYW5kICRyb3dfc3RhcnQgYXJlIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsaW5nCisjIGZ1bmN0aW9uLiBUaGUgdmFsdWVzIG9mICRjb2xfZW5kIGFuZCAkcm93X2VuZCBhcmUgY2FsY3VsYXRlZCBieSBzdWJ0cmFjdGluZworIyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYml0bWFwIGZyb20gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlCisjIHVuZGVybHlpbmcgY2VsbHMuCisjIFRoZSB2ZXJ0aWNlcyBhcmUgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgdW5kZXJseWluZyBjZWxsIHdpZHRoIGFzCisjIGZvbGxvd3MgKHJocyB2YWx1ZXMgYXJlIGluIHBpeGVscyk6CisjCisjICAgICAgIHgxID0gWCAvIFcgKjEwMjQKKyMgICAgICAgeTEgPSBZIC8gSCAqMjU2CisjICAgICAgIHgyID0gKFgtMSkgLyBXICoxMDI0CisjICAgICAgIHkyID0gKFktMSkgLyBIICoyNTYKKyMKKyMgICAgICAgV2hlcmU6ICBYIGlzIGRpc3RhbmNlIGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgdW5kZXJseWluZyBjZWxsCisjICAgICAgICAgICAgICAgWSBpcyBkaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHVuZGVybHlpbmcgY2VsbAorIyAgICAgICAgICAgICAgIFcgaXMgdGhlIHdpZHRoIG9mIHRoZSBjZWxsCisjICAgICAgICAgICAgICAgSCBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjZWxsCisjCisjIE5vdGU6IHRoZSBTREsgaW5jb3JyZWN0bHkgc3RhdGVzIHRoYXQgdGhlIGhlaWdodCBzaG91bGQgYmUgZXhwcmVzc2VkIGFzIGEKKyMgcGVyY2VudGFnZSBvZiAxMDI0LgorIworc3ViIF9wb3NpdGlvbl9vYmplY3QgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRjb2xfc3RhcnQ7ICAjIENvbCBjb250YWluaW5nIHVwcGVyIGxlZnQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR4MTsgICAgICAgICAjIERpc3RhbmNlIHRvIGxlZnQgc2lkZSBvZiBvYmplY3QKKworICAgIG15ICRyb3dfc3RhcnQ7ICAjIFJvdyBjb250YWluaW5nIHRvcCBsZWZ0IGNvcm5lciBvZiBvYmplY3QKKyAgICBteSAkeTE7ICAgICAgICAgIyBEaXN0YW5jZSB0byB0b3Agb2Ygb2JqZWN0CisKKyAgICBteSAkY29sX2VuZDsgICAgIyBDb2wgY29udGFpbmluZyBsb3dlciByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHgyOyAgICAgICAgICMgRGlzdGFuY2UgdG8gcmlnaHQgc2lkZSBvZiBvYmplY3QKKworICAgIG15ICRyb3dfZW5kOyAgICAjIFJvdyBjb250YWluaW5nIGJvdHRvbSByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHkyOyAgICAgICAgICMgRGlzdGFuY2UgdG8gYm90dG9tIG9mIG9iamVjdAorCisgICAgbXkgJHdpZHRoOyAgICAgICMgV2lkdGggb2YgaW1hZ2UgZnJhbWUKKyAgICBteSAkaGVpZ2h0OyAgICAgIyBIZWlnaHQgb2YgaW1hZ2UgZnJhbWUKKworICAgICgkY29sX3N0YXJ0LCAkcm93X3N0YXJ0LCAkeDEsICR5MSwgJHdpZHRoLCAkaGVpZ2h0KSA9IEBfOworCisKKyAgICAjIEFkanVzdCBzdGFydCBjb2x1bW4gZm9yIG9mZnNldHMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIHRoZSBjb2wgd2lkdGgKKyAgICB3aGlsZSAoJHgxID49ICRzZWxmLT5fc2l6ZV9jb2woJGNvbF9zdGFydCkpIHsKKyAgICAgICAgJHgxIC09ICRzZWxmLT5fc2l6ZV9jb2woJGNvbF9zdGFydCk7CisgICAgICAgICRjb2xfc3RhcnQrKzsKKyAgICB9CisKKyAgICAjIEFkanVzdCBzdGFydCByb3cgZm9yIG9mZnNldHMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIHRoZSByb3cgaGVpZ2h0CisgICAgd2hpbGUgKCR5MSA+PSAkc2VsZi0+X3NpemVfcm93KCRyb3dfc3RhcnQpKSB7CisgICAgICAgICR5MSAtPSAkc2VsZi0+X3NpemVfcm93KCRyb3dfc3RhcnQpOworICAgICAgICAkcm93X3N0YXJ0Kys7CisgICAgfQorCisKKyAgICAjIEluaXRpYWxpc2UgZW5kIGNlbGwgdG8gdGhlIHNhbWUgYXMgdGhlIHN0YXJ0IGNlbGwKKyAgICAkY29sX2VuZCAgICA9ICRjb2xfc3RhcnQ7CisgICAgJHJvd19lbmQgICAgPSAkcm93X3N0YXJ0OworCisgICAgJHdpZHRoICAgICAgPSAkd2lkdGggICsgJHgxOworICAgICRoZWlnaHQgICAgID0gJGhlaWdodCArICR5MTsKKworCisgICAgIyBTdWJ0cmFjdCB0aGUgdW5kZXJseWluZyBjZWxsIHdpZHRocyB0byBmaW5kIHRoZSBlbmQgY2VsbCBvZiB0aGUgaW1hZ2UKKyAgICB3aGlsZSAoJHdpZHRoID49ICRzZWxmLT5fc2l6ZV9jb2woJGNvbF9lbmQpKSB7CisgICAgICAgICR3aWR0aCAtPSAkc2VsZi0+X3NpemVfY29sKCRjb2xfZW5kKTsKKyAgICAgICAgJGNvbF9lbmQrKzsKKyAgICB9CisKKyAgICAjIFN1YnRyYWN0IHRoZSB1bmRlcmx5aW5nIGNlbGwgaGVpZ2h0cyB0byBmaW5kIHRoZSBlbmQgY2VsbCBvZiB0aGUgaW1hZ2UKKyAgICB3aGlsZSAoJGhlaWdodCA+PSAkc2VsZi0+X3NpemVfcm93KCRyb3dfZW5kKSkgeworICAgICAgICAkaGVpZ2h0IC09ICRzZWxmLT5fc2l6ZV9yb3coJHJvd19lbmQpOworICAgICAgICAkcm93X2VuZCsrOworICAgIH0KKworICAgICMgQml0bWFwIGlzbid0IGFsbG93ZWQgdG8gc3RhcnQgb3IgZmluaXNoIGluIGEgaGlkZGVuIGNlbGwsIGkuZS4gYSBjZWxsCisgICAgIyB3aXRoIHplcm8gZWlnaHQgb3Igd2lkdGguCisgICAgIworICAgIHJldHVybiBpZiAkc2VsZi0+X3NpemVfY29sKCRjb2xfc3RhcnQpID09IDA7CisgICAgcmV0dXJuIGlmICRzZWxmLT5fc2l6ZV9jb2woJGNvbF9lbmQpICAgPT0gMDsKKyAgICByZXR1cm4gaWYgJHNlbGYtPl9zaXplX3Jvdygkcm93X3N0YXJ0KSA9PSAwOworICAgIHJldHVybiBpZiAkc2VsZi0+X3NpemVfcm93KCRyb3dfZW5kKSAgID09IDA7CisKKyAgICAjIENvbnZlcnQgdGhlIHBpeGVsIHZhbHVlcyB0byB0aGUgcGVyY2VudGFnZSB2YWx1ZSBleHBlY3RlZCBieSBFeGNlbAorICAgICR4MSA9ICR4MSAgICAgLyAkc2VsZi0+X3NpemVfY29sKCRjb2xfc3RhcnQpICAgKiAxMDI0OworICAgICR5MSA9ICR5MSAgICAgLyAkc2VsZi0+X3NpemVfcm93KCRyb3dfc3RhcnQpICAgKiAgMjU2OworICAgICR4MiA9ICR3aWR0aCAgLyAkc2VsZi0+X3NpemVfY29sKCRjb2xfZW5kKSAgICAgKiAxMDI0OworICAgICR5MiA9ICRoZWlnaHQgLyAkc2VsZi0+X3NpemVfcm93KCRyb3dfZW5kKSAgICAgKiAgMjU2OworCisgICAgIyBTaW11bGF0ZSBjZWlsKCkgd2l0aG91dCBjYWxsaW5nIFBPU0lYOjpjZWlsKCkuCisgICAgJHgxID0gaW50KCR4MSArMC41KTsKKyAgICAkeTEgPSBpbnQoJHkxICswLjUpOworICAgICR4MiA9IGludCgkeDIgKzAuNSk7CisgICAgJHkyID0gaW50KCR5MiArMC41KTsKKworICAgIHJldHVybiggJGNvbF9zdGFydCwgJHgxLAorICAgICAgICAgICAgJHJvd19zdGFydCwgJHkxLAorICAgICAgICAgICAgJGNvbF9lbmQsICAgJHgyLAorICAgICAgICAgICAgJHJvd19lbmQsICAgJHkyCisgICAgICAgICAgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zaXplX2NvbCgkY29sKQorIworIyBDb252ZXJ0IHRoZSB3aWR0aCBvZiBhIGNlbGwgZnJvbSB1c2VyJ3MgdW5pdHMgdG8gcGl4ZWxzLiBFeGNlbCByb3VuZHMgdGhlCisjIGNvbHVtbiB3aWR0aCB0byB0aGUgbmVhcmVzdCBwaXhlbC4gSWYgdGhlIHdpZHRoIGhhc24ndCBiZWVuIHNldCBieSB0aGUgdXNlcgorIyB3ZSB1c2UgdGhlIGRlZmF1bHQgdmFsdWUuIElmIHRoZSBjb2x1bW4gaXMgaGlkZGVuIHdlIHVzZSBhIHZhbHVlIG9mIHplcm8uCisjCitzdWIgX3NpemVfY29sIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGNvbCAgPSAkX1swXTsKKworICAgICMgTG9vayB1cCB0aGUgY2VsbCB2YWx1ZSB0byBzZWUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZAorICAgIGlmIChleGlzdHMgJHNlbGYtPntfY29sX3NpemVzfS0+eyRjb2x9KSB7CisgICAgICAgIG15ICR3aWR0aCA9ICRzZWxmLT57X2NvbF9zaXplc30tPnskY29sfTsKKworICAgICAgICAjIFRoZSByZWxhdGlvbnNoaXAgaXMgZGlmZmVyZW50IGZvciB1c2VyIHVuaXRzIGxlc3MgdGhhbiAxLgorICAgICAgICBpZiAoJHdpZHRoIDwgMSkgeworICAgICAgICAgICAgcmV0dXJuIGludCgkd2lkdGggKjEyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpbnQoJHdpZHRoICo3ICkgKzU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiA2NDsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc2l6ZV9yb3coJHJvdykKKyMKKyMgQ29udmVydCB0aGUgaGVpZ2h0IG9mIGEgY2VsbCBmcm9tIHVzZXIncyB1bml0cyB0byBwaXhlbHMuIEJ5IGludGVycG9sYXRpb24KKyMgdGhlIHJlbGF0aW9uc2hpcCBpczogeSA9IDQvM3guIElmIHRoZSBoZWlnaHQgaGFzbid0IGJlZW4gc2V0IGJ5IHRoZSB1c2VyIHdlCisjIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHJvdyBpcyBoaWRkZW4gd2UgdXNlIGEgdmFsdWUgb2YgemVyby4gKE5vdAorIyBwb3NzaWJsZSB0byBoaWRlIHJvdyB5ZXQpLgorIworc3ViIF9zaXplX3JvdyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRyb3cgID0gJF9bMF07CisKKyAgICAjIExvb2sgdXAgdGhlIGNlbGwgdmFsdWUgdG8gc2VlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQKKyAgICBpZiAoZXhpc3RzICRzZWxmLT57X3Jvd19zaXplc30tPnskcm93fSkgeworICAgICAgICBpZiAoJHNlbGYtPntfcm93X3NpemVzfS0+eyRyb3d9ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGludCAoNC8zICogJHNlbGYtPntfcm93X3NpemVzfS0+eyRyb3d9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE3OworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV96b29tKCR6b29tKQorIworIworIyBTdG9yZSB0aGUgd2luZG93IHpvb20gZmFjdG9yLiBUaGlzIHNob3VsZCBiZSBhIHJlZHVjZWQgZnJhY3Rpb24gYnV0IGZvcgorIyBzaW1wbGljaXR5IHdlIHdpbGwgc3RvcmUgYWxsIGZyYWN0aW9ucyB3aXRoIGEgbnVtZXJhdG9yIG9mIDEwMC4KKyMKK3N1YiBfc3RvcmVfem9vbSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgICMgSWYgc2NhbGUgaXMgMTAwIHdlIGRvbid0IG5lZWQgdG8gd3JpdGUgYSByZWNvcmQKKyAgICByZXR1cm4gaWYgJHNlbGYtPntfem9vbX0gPT0gMTAwOworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMEEwOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDQ7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCAgICk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnYiLCAkc2VsZi0+e196b29tfSwgMTAwKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCRyb3csICRjb2wsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgVW5pY29kZSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KKyMgJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjICAgICAgICAgLTMgOiBsb25nIHN0cmluZyB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJzCisjCitzdWIgd3JpdGVfdXRmMTZiZV9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRkQ7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwQTsgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIHJvdworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkc3RybGVuICAgICAgPSBsZW5ndGgoJF9bMl0pOworICAgIG15ICRzdHIgICAgICAgICA9ICRfWzJdOworICAgIG15ICR4ZiAgICAgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bM10pOyAjIFRoZSBjZWxsIGZvcm1hdAorICAgIG15ICRlbmNvZGluZyAgICA9IDB4MTsKKyAgICBteSAkc3RyX2Vycm9yICAgPSAwOworCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgICMgTGltaXQgdGhlIHV0ZjE2IHN0cmluZyB0byB0aGUgbWF4IG51bWJlciBvZiBjaGFycyAobm90IGJ5dGVzKS4KKyAgICBpZiAoJHN0cmxlbiA+IDMyNzY3KiAyKSB7CisgICAgICAgICRzdHIgICAgICAgPSBzdWJzdHIoJHN0ciwgMCwgMzI3NjcqMik7CisgICAgICAgICRzdHJfZXJyb3IgPSAtMzsKKyAgICB9CisKKworICAgIG15ICRudW1fYnl0ZXMgPSBsZW5ndGggJHN0cjsKKyAgICBteSAkbnVtX2NoYXJzID0gaW50KCRudW1fYnl0ZXMgLyAyKTsKKworCisgICAgIyBDaGVjayBmb3IgYSB2YWxpZCAyLWJ5dGUgY2hhciBzdHJpbmcuCisgICAgY3JvYWsgIlVuZXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gVW5pY29kZSBzdHJpbmciIGlmICRudW1fYnl0ZXMgJSAyOworCisKKyAgICAjIENoYW5nZSBmcm9tIFVURjE2IGJpZy1lbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICAgICRzdHIgPSBwYWNrICJ2KiIsIHVucGFjayAibioiLCAkc3RyOworCisKKyAgICAjIEFkZCB0aGUgZW5jb2RpbmcgYW5kIGxlbmd0aCBoZWFkZXIgdG8gdGhlIHN0cmluZy4KKyAgICBteSAkc3RyX2hlYWRlciAgPSBwYWNrKCJ2QyIsICRudW1fY2hhcnMsICRlbmNvZGluZyk7CisgICAgJHN0ciAgICAgICAgICAgID0gJHN0cl9oZWFkZXIgLiAkc3RyOworCisKKyAgICBpZiAobm90IGV4aXN0cyAkeyRzZWxmLT57X3N0cl90YWJsZX19LT57JHN0cn0pIHsKKyAgICAgICAgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9ID0gJHskc2VsZi0+e19zdHJfdW5pcXVlfX0rKzsKKyAgICB9CisKKworICAgICR7JHNlbGYtPntfc3RyX3RvdGFsfX0rKzsKKworCisgICAgbXkgJGhlYWRlciA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgID0gcGFjaygidnZ2ViIsICRyb3csICRjb2wsICR4ZiwgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9KTsKKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuICRzdHJfZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV91dGYxNmxlX3N0cmluZygkcm93LCAkY29sLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBhIFVURi0xNkxFIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIyAkZm9ybWF0IGlzIG9wdGlvbmFsLgorIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMgICAgICAgICAtMyA6IGxvbmcgc3RyaW5nIHRydW5jYXRlZCB0byAyNTUgY2hhcnMKKyMKK3N1YiB3cml0ZV91dGYxNmxlX3N0cmluZyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDBGRDsgICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDBBOyAgICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIGNvbHVtbgorICAgIG15ICRzdHIgICAgICAgICA9ICRfWzJdOworICAgIG15ICRmb3JtYXQgICAgICA9ICRfWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBjZWxsIGZvcm1hdAorCisKKyAgICAjIENoYW5nZSBmcm9tIFVURjE2IGJpZy1lbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICAgICRzdHIgPSBwYWNrICJ2KiIsIHVucGFjayAibioiLCAkc3RyOworCisKKyAgICByZXR1cm4gJHNlbGYtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCRyb3csICRjb2wsICRzdHIsICRmb3JtYXQpOworfQorCisKKyMgT2xkZXIgbWV0aG9kIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorKndyaXRlX3VuaWNvZGUgICAgPSAqd3JpdGVfdXRmMTZiZV9zdHJpbmc7Cisqd3JpdGVfdW5pY29kZV9sZSA9ICp3cml0ZV91dGYxNmxlX3N0cmluZzsKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F1dG9maWx0ZXJzKCkKKyMKKyMgRnVuY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb2x1bW5zIHRoYXQgZm9ybSBwYXJ0IG9mIGFuIGF1dG9maWx0ZXIKKyMgcmFuZ2UgYW5kIHdyaXRlIEJpZmYgQVVUT0ZJTFRFUiByZWNvcmRzIGlmIGEgZmlsdGVyIGV4cHJlc3Npb24gaGFzIGJlZW4gc2V0LgorIworc3ViIF9zdG9yZV9hdXRvZmlsdGVycyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBTa2lwIGFsbCBjb2x1bW5zIGlmIG5vIGZpbHRlciBoYXZlIGJlZW4gc2V0LgorICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntfZmlsdGVyX29ufTsKKworICAgIG15ICh1bmRlZiwgdW5kZWYsICRjb2wxLCAkY29sMikgPSBAeyRzZWxmLT57X2ZpbHRlcl9hcmVhfX07CisKKyAgICBmb3IgbXkgJGkgKCRjb2wxIC4uICRjb2wyKSB7CisgICAgICAgICMgUmV2ZXJzZSBvcmRlciBzaW5jZSByZWNvcmRzIGFyZSBiZWluZyBwcmUtcGVuZGVkLgorICAgICAgICBteSAkY29sID0gJGNvbDIgLSRpOworCisgICAgICAgICMgU2tpcCBpZiBjb2x1bW4gZG9lc24ndCBoYXZlIGFuIGFjdGl2ZSBmaWx0ZXIuCisgICAgICAgIG5leHQgdW5sZXNzICRzZWxmLT57X2ZpbHRlcl9jb2xzfS0+eyRjb2x9OworCisgICAgICAgICMgUmV0cmlldmUgdGhlIGZpbHRlciB0b2tlbnMgYW5kIHdyaXRlIHRoZSBhdXRvZmlsdGVyIHJlY29yZHMuCisgICAgICAgIG15IEB0b2tlbnMgPSAgQHskc2VsZi0+e19maWx0ZXJfY29sc30tPnskY29sfX07CisgICAgICAgICRzZWxmLT5fc3RvcmVfYXV0b2ZpbHRlcigkY29sLCBAdG9rZW5zKTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXV0b2ZpbHRlcigpCisjCisjIEZ1bmN0aW9uIHRvIHdyaXRlIHdvcmtzaGVldCBBVVRPRklMVEVSIHJlY29yZHMuIFRoZXNlIGNvbnRhaW4gMiBCaWZmIERvcGVyCisjIHN0cnVjdHVyZXMgdG8gcmVwcmVzZW50IHRoZSAyIHBvc3NpYmxlIGZpbHRlciBjb25kaXRpb25zLgorIworc3ViIF9zdG9yZV9hdXRvZmlsdGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwOUU7CisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMDsKKworICAgIG15ICRpbmRleCAgICAgICAgICAgPSAkX1swXTsKKyAgICBteSAkb3BlcmF0b3JfMSAgICAgID0gJF9bMV07CisgICAgbXkgJHRva2VuXzEgICAgICAgICA9ICRfWzJdOworICAgIG15ICRqb2luICAgICAgICAgICAgPSAkX1szXTsgIyBBbmQvT3IKKyAgICBteSAkb3BlcmF0b3JfMiAgICAgID0gJF9bNF07CisgICAgbXkgJHRva2VuXzIgICAgICAgICA9ICRfWzVdOworCisgICAgbXkgJHRvcDEwX2FjdGl2ZSAgICA9IDA7CisgICAgbXkgJHRvcDEwX2RpcmVjdGlvbiA9IDA7CisgICAgbXkgJHRvcDEwX3BlcmNlbnQgICA9IDA7CisgICAgbXkgJHRvcDEwX3ZhbHVlICAgICA9IDEwMTsKKworICAgIG15ICRncmJpdCAgICAgICA9ICRqb2luOworICAgIG15ICRvcHRpbWlzZWRfMSA9IDA7CisgICAgbXkgJG9wdGltaXNlZF8yID0gMDsKKyAgICBteSAkZG9wZXJfMSAgICAgPSAnJzsKKyAgICBteSAkZG9wZXJfMiAgICAgPSAnJzsKKyAgICBteSAkc3RyaW5nXzEgICAgPSAnJzsKKyAgICBteSAkc3RyaW5nXzIgICAgPSAnJzsKKworICAgICMgRXhjZWwgdXNlZCBhbiBvcHRpbWlzYXRpb24gaW4gdGhlIGNhc2Ugb2YgYSBzaW1wbGUgZXF1YWxpdHkuCisgICAgJG9wdGltaXNlZF8xID0gMSBpZiAgICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3JfMSA9PSAyOworICAgICRvcHRpbWlzZWRfMiA9IDEgaWYgZGVmaW5lZCAkb3BlcmF0b3JfMiBhbmQgJG9wZXJhdG9yXzIgPT0gMjsKKworCisgICAgIyBDb252ZXJ0IG5vbi1zaW1wbGUgZXF1YWxpdGllcyBiYWNrIHRvIHR5cGUgMi4gU2VlICBfcGFyc2VfZmlsdGVyX3Rva2VucygpLgorICAgICRvcGVyYXRvcl8xID0gMiBpZiAgICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3JfMSA9PSAyMjsKKyAgICAkb3BlcmF0b3JfMiA9IDIgaWYgZGVmaW5lZCAkb3BlcmF0b3JfMiBhbmQgJG9wZXJhdG9yXzIgPT0gMjI7CisKKworICAgICMgSGFuZGxlIGEgIlRvcCIgc3R5bGUgZXhwcmVzc2lvbi4KKyAgICBpZiAoJG9wZXJhdG9yXzEgPj0gMzApIHsKKyAgICAgICAgIyBSZW1vdmUgdGhlIHNlY29uZCBleHByZXNzaW9uIGlmIHByZXNlbnQuCisgICAgICAgICRvcGVyYXRvcl8yID0gdW5kZWY7CisgICAgICAgICR0b2tlbl8yICAgID0gdW5kZWY7CisKKyAgICAgICAgIyBTZXQgdGhlIGFjdGl2ZSBmbGFnLgorICAgICAgICAkdG9wMTBfYWN0aXZlICAgID0gMTsKKworICAgICAgICBpZiAoJG9wZXJhdG9yXzEgPT0gMzAgb3IgJG9wZXJhdG9yXzEgPT0gMzEpIHsKKyAgICAgICAgICAgICR0b3AxMF9kaXJlY3Rpb24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRvcGVyYXRvcl8xID09IDMxIG9yICRvcGVyYXRvcl8xID09IDMzKSB7CisgICAgICAgICAgICAkdG9wMTBfcGVyY2VudCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJHRvcDEwX2RpcmVjdGlvbiA9PSAxKSB7CisgICAgICAgICAgICAkb3BlcmF0b3JfMSA9IDYKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRvcGVyYXRvcl8xID0gMworICAgICAgICB9CisKKyAgICAgICAgJHRvcDEwX3ZhbHVlICAgICA9ICR0b2tlbl8xOworICAgICAgICAkdG9rZW5fMSAgICAgICAgID0gMDsKKyAgICB9CisKKworICAgICRncmJpdCAgICAgfD0gJG9wdGltaXNlZF8xICAgICAgPDwgMjsKKyAgICAkZ3JiaXQgICAgIHw9ICRvcHRpbWlzZWRfMiAgICAgIDw8IDM7CisgICAgJGdyYml0ICAgICB8PSAkdG9wMTBfYWN0aXZlICAgICA8PCA0OworICAgICRncmJpdCAgICAgfD0gJHRvcDEwX2RpcmVjdGlvbiAgPDwgNTsKKyAgICAkZ3JiaXQgICAgIHw9ICR0b3AxMF9wZXJjZW50ICAgIDw8IDY7CisgICAgJGdyYml0ICAgICB8PSAkdG9wMTBfdmFsdWUgICAgICA8PCA3OworCisgICAgKCRkb3Blcl8xLCAkc3RyaW5nXzEpID0gJHNlbGYtPl9wYWNrX2RvcGVyKCRvcGVyYXRvcl8xLCAkdG9rZW5fMSk7CisgICAgKCRkb3Blcl8yLCAkc3RyaW5nXzIpID0gJHNlbGYtPl9wYWNrX2RvcGVyKCRvcGVyYXRvcl8yLCAkdG9rZW5fMik7CisKKyAgICBteSAkZGF0YSAgICA9IHBhY2sgJ3YnLCAkaW5kZXg7CisgICAgICAgJGRhdGEgICAuPSBwYWNrICd2JywgJGdyYml0OworICAgICAgICRkYXRhICAgLj0gJGRvcGVyXzE7CisgICAgICAgJGRhdGEgICAuPSAkZG9wZXJfMjsKKyAgICAgICAkZGF0YSAgIC49ICRzdHJpbmdfMTsKKyAgICAgICAkZGF0YSAgIC49ICRzdHJpbmdfMjsKKworICAgICAgICRsZW5ndGggID0gbGVuZ3RoICRkYXRhOworICAgIG15ICRoZWFkZXIgID0gcGFjaygndnYnLCAgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfZG9wZXIoKQorIworIyBDcmVhdGUgYSBCaWZmIERvcGVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBmaWx0ZXIgZXhwcmVzc2lvbi4gRGVwZW5kaW5nCisjIG9uIHRoZSB0eXBlIG9mIHRoZSB0b2tlbiB3ZSBwYWNrIGFuIEVtcHR5LCBTdHJpbmcgb3IgTnVtYmVyIGRvcGVyLgorIworc3ViIF9wYWNrX2RvcGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJG9wZXJhdG9yICAgID0gJF9bMF07CisgICAgbXkgJHRva2VuICAgICAgID0gJF9bMV07CisKKyAgICBteSAkZG9wZXIgICAgICAgPSAnJzsKKyAgICBteSAkc3RyaW5nICAgICAgPSAnJzsKKworCisgICAgIyBSZXR1cm4gZGVmYXVsdCBkb3BlciBmb3Igbm9uLWRlZmluZWQgZmlsdGVycy4KKyAgICBpZiAobm90IGRlZmluZWQgJG9wZXJhdG9yKSB7CisgICAgICAgIHJldHVybiAoJHNlbGYtPl9wYWNrX3VudXNlZF9kb3BlciwgJHN0cmluZyk7CisgICAgfQorCisKKyAgICBpZiAoJHRva2VuID1+IC9eYmxhbmtzfG5vbmJsYW5rcyQvaSkgeworICAgICAgICAkZG9wZXIgID0gJHNlbGYtPl9wYWNrX2JsYW5rc19kb3Blcigkb3BlcmF0b3IsICR0b2tlbik7CisgICAgfQorICAgIGVsc2lmICgkb3BlcmF0b3IgPT0gMiBvcgorICAgICAgICAkdG9rZW4gICAgIX4gL14oWystXT8pKD89XGR8XC5cZClcZCooXC5cZCopPyhbRWVdKFsrLV0/XGQrKSk/JC8pCisgICAgeworICAgICAgICAjIEV4Y2VsIHRyZWF0cyBhbGwgdG9rZW5zIGFzIHN0cmluZ3MgaWYgdGhlIG9wZXJhdG9yIGlzIGVxdWFsaXR5LCA9LgorCisgICAgICAgICRzdHJpbmcgPSAkdG9rZW47CisKKyAgICAgICAgbXkgJGVuY29kaW5nID0gMDsKKyAgICAgICAgbXkgJGxlbmd0aCAgID0gbGVuZ3RoICRzdHJpbmc7CisKKyAgICAgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgICAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRzdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgJHN0cmluZyA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRzdHJpbmcpOworICAgICAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkc3RyaW5nID0gcGFjaygnQycsICRlbmNvZGluZykgLiAkc3RyaW5nOworICAgICAgICAkZG9wZXIgID0gJHNlbGYtPl9wYWNrX3N0cmluZ19kb3Blcigkb3BlcmF0b3IsICRsZW5ndGgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHN0cmluZyA9ICcnOworICAgICAgICAkZG9wZXIgID0gJHNlbGYtPl9wYWNrX251bWJlcl9kb3Blcigkb3BlcmF0b3IsICR0b2tlbik7CisgICAgfQorCisgICAgcmV0dXJuICgkZG9wZXIsICRzdHJpbmcpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfdW51c2VkX2RvcGVyKCkKKyMKKyMgUGFjayBhbiBlbXB0eSBEb3BlciBzdHJ1Y3R1cmUuCisjCitzdWIgX3BhY2tfdW51c2VkX2RvcGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgcmV0dXJuIHBhY2sgJ0MxMCcsICgweDApIHggMTA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19ibGFua3NfZG9wZXIoKQorIworIyBQYWNrIGFuIEJsYW5rcy9Ob25CbGFua3MgRG9wZXIgc3RydWN0dXJlLgorIworc3ViIF9wYWNrX2JsYW5rc19kb3BlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRvcGVyYXRvciAgICA9ICRfWzBdOworICAgIG15ICR0b2tlbiAgICAgICA9ICRfWzFdOworICAgIG15ICR0eXBlOworCisgICAgaWYgKCR0b2tlbiBlcSAnYmxhbmtzJykgeworICAgICAgICAkdHlwZSAgICAgPSAweDBDOworICAgICAgICAkb3BlcmF0b3IgPSAyOworCisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkdHlwZSAgICAgPSAweDBFOworICAgICAgICAkb3BlcmF0b3IgPSA1OworICAgIH0KKworCisgICAgbXkgJGRvcGVyICAgICAgID0gcGFjayAnQ0NWVicsICAgICR0eXBlLCAgICAgICAgICMgRGF0YSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcGVyYXRvciwgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAgICAgICAgIyBSZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA7ICAgICAgICAjIFJlc2VydmVkCisgICAgcmV0dXJuICRkb3BlcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX3N0cmluZ19kb3BlcigpCisjCisjIFBhY2sgYW4gc3RyaW5nIERvcGVyIHN0cnVjdHVyZS4KKyMKK3N1YiBfcGFja19zdHJpbmdfZG9wZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkb3BlcmF0b3IgICAgPSAkX1swXTsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkX1sxXTsKKyAgICBteSAkZG9wZXIgICAgICAgPSBwYWNrICdDQ1ZDQ0NDJywgMHgwNiwgICAgICAgICAgIyBEYXRhIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yLCAgICAgIworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAsICAgICAgICAjIFJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW5ndGgsICAgICAgICMgU3RyaW5nIGNoYXIgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsIDB4MCwgMHgwOyAjIFJlc2VydmVkCisgICAgcmV0dXJuICRkb3BlcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX251bWJlcl9kb3BlcigpCisjCisjIFBhY2sgYW4gSUVFRSBkb3VibGUgbnVtYmVyIERvcGVyIHN0cnVjdHVyZS4KKyMKK3N1YiBfcGFja19udW1iZXJfZG9wZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkb3BlcmF0b3IgICAgPSAkX1swXTsKKyAgICBteSAkbnVtYmVyICAgICAgPSAkX1sxXTsKKyAgICAgICAkbnVtYmVyICAgICAgPSBwYWNrICdkJywgJG51bWJlcjsKKyAgICAgICAkbnVtYmVyICAgICAgPSByZXZlcnNlICRudW1iZXIgaWYgJHNlbGYtPntfYnl0ZV9vcmRlcn07CisKKyAgICBteSAkZG9wZXIgICAgICAgPSBwYWNrICdDQycsIDB4MDQsICRvcGVyYXRvcjsKKyAgICAgICAkZG9wZXIgICAgICAuPSAkbnVtYmVyOworCisgICAgcmV0dXJuICRkb3BlcjsKK30KKworCisjCisjIE1ldGhvZHMgcmVsYXRlZCB0byBjb21tZW50cyBhbmQgTVNPIG9iamVjdHMuCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJlcGFyZV9pbWFnZXMoKQorIworIyBUdXJuIHRoZSBIb0ggdGhhdCBzdG9yZXMgdGhlIGltYWdlcyBpbnRvIGFuIGFycmF5IGZvciBlYXNpZXIgaGFuZGxpbmcuCisjCitzdWIgX3ByZXBhcmVfaW1hZ2VzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkY291bnQgICA9IDA7CisgICAgbXkgQGltYWdlczsKKworCisgICAgIyBXZSBzb3J0IHRoZSBpbWFnZXMgYnkgcm93IGFuZCBjb2x1bW4gYnV0IHRoYXQgaXNuJ3Qgc3RyaWN0bHkgcmVxdWlyZWQuCisgICAgIworICAgIG15IEByb3dzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfaW1hZ2VzfX07CisKKyAgICBmb3IgbXkgJHJvdyAoQHJvd3MpIHsKKyAgICAgICAgbXkgQGNvbHMgPSBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJXskc2VsZi0+e19pbWFnZXN9LT57JHJvd319OworCisgICAgICAgIGZvciBteSAkY29sIChAY29scykgeworICAgICAgICAgICAgcHVzaCBAaW1hZ2VzLCAkc2VsZi0+e19pbWFnZXN9LT57JHJvd30tPnskY29sfTsKKyAgICAgICAgICAgICRjb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgJHNlbGYtPntfaW1hZ2VzfSAgICAgICA9IHt9OworICAgICRzZWxmLT57X2ltYWdlc19hcnJheX0gPSBcQGltYWdlczsKKworICAgIHJldHVybiAkY291bnQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJlcGFyZV9jb21tZW50cygpCisjCisjIFR1cm4gdGhlIEhvSCB0aGF0IHN0b3JlcyB0aGUgY29tbWVudHMgaW50byBhbiBhcnJheSBmb3IgZWFzaWVyIGhhbmRsaW5nLgorIworc3ViIF9wcmVwYXJlX2NvbW1lbnRzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkY291bnQgICA9IDA7CisgICAgbXkgQGNvbW1lbnRzOworCisKKyAgICAjIFdlIHNvcnQgdGhlIGNvbW1lbnRzIGJ5IHJvdyBhbmQgY29sdW1uIGJ1dCB0aGF0IGlzbid0IHN0cmljdGx5IHJlcXVpcmVkLgorICAgICMKKyAgICBteSBAcm93cyA9IHNvcnQgeyRhIDw9PiAkYn0ga2V5cyAleyRzZWxmLT57X2NvbW1lbnRzfX07CisKKyAgICBmb3IgbXkgJHJvdyAoQHJvd3MpIHsKKyAgICAgICAgbXkgQGNvbHMgPSBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJXskc2VsZi0+e19jb21tZW50c30tPnskcm93fX07CisKKyAgICAgICAgZm9yIG15ICRjb2wgKEBjb2xzKSB7CisgICAgICAgICAgICBwdXNoIEBjb21tZW50cywgJHNlbGYtPntfY29tbWVudHN9LT57JHJvd30tPnskY29sfTsKKyAgICAgICAgICAgICRjb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgJHNlbGYtPntfY29tbWVudHN9ICAgICAgID0ge307CisgICAgJHNlbGYtPntfY29tbWVudHNfYXJyYXl9ID0gXEBjb21tZW50czsKKworICAgIHJldHVybiAkY291bnQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJlcGFyZV9jaGFydHMoKQorIworIyBUdXJuIHRoZSBIb0ggdGhhdCBzdG9yZXMgdGhlIGNoYXJ0cyBpbnRvIGFuIGFycmF5IGZvciBlYXNpZXIgaGFuZGxpbmcuCisjCitzdWIgX3ByZXBhcmVfY2hhcnRzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkY291bnQgICA9IDA7CisgICAgbXkgQGNoYXJ0czsKKworCisgICAgIyBXZSBzb3J0IHRoZSBjaGFydHMgYnkgcm93IGFuZCBjb2x1bW4gYnV0IHRoYXQgaXNuJ3Qgc3RyaWN0bHkgcmVxdWlyZWQuCisgICAgIworICAgIG15IEByb3dzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfY2hhcnRzfX07CisKKyAgICBmb3IgbXkgJHJvdyAoQHJvd3MpIHsKKyAgICAgICAgbXkgQGNvbHMgPSBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJXskc2VsZi0+e19jaGFydHN9LT57JHJvd319OworCisgICAgICAgIGZvciBteSAkY29sIChAY29scykgeworICAgICAgICAgICAgcHVzaCBAY2hhcnRzLCAkc2VsZi0+e19jaGFydHN9LT57JHJvd30tPnskY29sfTsKKyAgICAgICAgICAgICRjb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgJHNlbGYtPntfY2hhcnRzfSAgICAgICA9IHt9OworICAgICRzZWxmLT57X2NoYXJ0c19hcnJheX0gPSBcQGNoYXJ0czsKKworICAgIHJldHVybiAkY291bnQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfaW1hZ2VzKCkKKyMKKyMgU3RvcmUgdGhlIGNvbGxlY3Rpb25zIG9mIHJlY29yZHMgdGhhdCBtYWtlIHVwIGltYWdlcy4KKyMKK3N1YiBfc3RvcmVfaW1hZ2VzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSBAaWRzICAgICAgICAgICAgID0gQHskc2VsZi0+e19vYmplY3RfaWRzICB9fTsKKyAgICBteSAkc3BpZCAgICAgICAgICAgID0gc2hpZnQgQGlkczsKKworICAgIG15IEBpbWFnZXMgICAgICAgICAgPSBAeyRzZWxmLT57X2ltYWdlc19hcnJheX19OworICAgIG15ICRudW1faW1hZ2VzICAgICAgPSBzY2FsYXIgQGltYWdlczsKKworICAgIG15ICRudW1fZmlsdGVycyAgICAgPSAkc2VsZi0+e19maWx0ZXJfY291bnR9OworICAgIG15ICRudW1fY29tbWVudHMgICAgPSBAeyRzZWxmLT57X2NvbW1lbnRzX2FycmF5fX07CisgICAgbXkgJG51bV9jaGFydHMgICAgICA9IEB7JHNlbGYtPntfY2hhcnRzX2FycmF5ICB9fTsKKworICAgICMgU2tpcCB0aGlzIGlmIHRoZXJlIGFyZW4ndCBhbnkgaW1hZ2VzLgorICAgIHJldHVybiB1bmxlc3MgJG51bV9pbWFnZXM7CisKKyAgICBmb3IgbXkgJGkgKDAgLi4gJG51bV9pbWFnZXMtMSkgeworICAgICAgICBteSAkcm93ICAgICAgICAgPSAgICRpbWFnZXNbJGldLT5bMF07CisgICAgICAgIG15ICRjb2wgICAgICAgICA9ICAgJGltYWdlc1skaV0tPlsxXTsKKyAgICAgICAgbXkgJG5hbWUgICAgICAgID0gICAkaW1hZ2VzWyRpXS0+WzJdOworICAgICAgICBteSAkeF9vZmZzZXQgICAgPSAgICRpbWFnZXNbJGldLT5bM107CisgICAgICAgIG15ICR5X29mZnNldCAgICA9ICAgJGltYWdlc1skaV0tPls0XTsKKyAgICAgICAgbXkgJHNjYWxlX3ggICAgID0gICAkaW1hZ2VzWyRpXS0+WzVdOworICAgICAgICBteSAkc2NhbGVfeSAgICAgPSAgICRpbWFnZXNbJGldLT5bNl07CisgICAgICAgIG15ICRpbWFnZV9pZCAgICA9ICAgJGltYWdlc1skaV0tPls3XTsKKyAgICAgICAgbXkgJHR5cGUgICAgICAgID0gICAkaW1hZ2VzWyRpXS0+WzhdOworICAgICAgICBteSAkd2lkdGggICAgICAgPSAgICRpbWFnZXNbJGldLT5bOV07CisgICAgICAgIG15ICRoZWlnaHQgICAgICA9ICAgJGltYWdlc1skaV0tPlsxMF07CisKKyAgICAgICAgJHdpZHRoICAqPSAkc2NhbGVfeCBpZiAkc2NhbGVfeDsKKyAgICAgICAgJGhlaWdodCAqPSAkc2NhbGVfeSBpZiAkc2NhbGVfeTsKKworCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbnMgb2YgaW1hZ2Ugb2JqZWN0LgorICAgICAgICBteSBAdmVydGljZXMgPSAkc2VsZi0+X3Bvc2l0aW9uX29iamVjdCggJGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBpZiAoJGkgPT0gMCkgeworICAgICAgICAgICAgIyBXcml0ZSB0aGUgcGFyZW50IE1TT0RSQVdJSU5HIHJlY29yZC4KKyAgICAgICAgICAgIG15ICRkZ19sZW5ndGggICAgPSAxNTYgKyA4NCooJG51bV9pbWFnZXMgLTEpOworICAgICAgICAgICAgbXkgJHNwZ3JfbGVuZ3RoICA9IDEzMiArIDg0KigkbnVtX2ltYWdlcyAtMSk7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAxMjAgKiRudW1fY2hhcnRzOworICAgICAgICAgICAgICAgJHNwZ3JfbGVuZ3RoICs9IDEyMCAqJG51bV9jaGFydHM7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAgOTYgKiRudW1fZmlsdGVyczsKKyAgICAgICAgICAgICAgICRzcGdyX2xlbmd0aCArPSAgOTYgKiRudW1fZmlsdGVyczsKKworICAgICAgICAgICAgICAgJGRnX2xlbmd0aCAgICs9IDEyOCAqJG51bV9jb21tZW50czsKKyAgICAgICAgICAgICAgICRzcGdyX2xlbmd0aCArPSAxMjggKiRudW1fY29tbWVudHM7CisKKworCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19kZ19jb250YWluZXIoJGRnX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19kZyhAaWRzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3JfY29udGFpbmVyKCRzcGdyX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoNDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BncigpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMHgwLCAkc3BpZCsrLCAweDAwMDUpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDc2KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDc1LCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2ltYWdlKCRpbWFnZV9pZCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDIsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBjaGlsZCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoNzYpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoNzUsICRzcGlkKyssIDB4MEEwMCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19vcHRfaW1hZ2UoJGltYWdlX2lkKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9hbmNob3IoMiwgQHZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9kYXRhKCk7CisKKyAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKworICAgICAgICB9CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9vYmpfaW1hZ2UoJGkrMSk7CisgICAgfQorCisgICAgJHNlbGYtPntfb2JqZWN0X2lkc30tPlswXSA9ICRzcGlkOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRzKCkKKyMKKyMgU3RvcmUgdGhlIGNvbGxlY3Rpb25zIG9mIHJlY29yZHMgdGhhdCBtYWtlIHVwIGNoYXJ0cy4KKyMKK3N1YiBfc3RvcmVfY2hhcnRzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSBAaWRzICAgICAgICAgICAgID0gQHskc2VsZi0+e19vYmplY3RfaWRzfX07CisgICAgbXkgJHNwaWQgICAgICAgICAgICA9IHNoaWZ0IEBpZHM7CisKKyAgICBteSBAY2hhcnRzICAgICAgICAgID0gQHskc2VsZi0+e19jaGFydHNfYXJyYXl9fTsKKyAgICBteSAkbnVtX2NoYXJ0cyAgICAgID0gc2NhbGFyIEBjaGFydHM7CisKKyAgICBteSAkbnVtX2ZpbHRlcnMgICAgID0gJHNlbGYtPntfZmlsdGVyX2NvdW50fTsKKyAgICBteSAkbnVtX2NvbW1lbnRzICAgID0gQHskc2VsZi0+e19jb21tZW50c19hcnJheX19OworCisgICAgIyBOdW1iZXIgb2Ygb2JqZWN0cyB3cml0dGVuIHNvIGZhci4KKyAgICBteSAkbnVtX29iamVjdHMgICAgID0gQHskc2VsZi0+e19pbWFnZXNfYXJyYXl9fTsKKworICAgICMgU2tpcCB0aGlzIGlmIHRoZXJlIGFyZW4ndCBhbnkgY2hhcnRzLgorICAgIHJldHVybiB1bmxlc3MgJG51bV9jaGFydHM7CisKKyAgICBmb3IgbXkgJGkgKDAgLi4gJG51bV9jaGFydHMtMSApIHsKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gICAkY2hhcnRzWyRpXS0+WzBdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAgICRjaGFydHNbJGldLT5bMV07CisgICAgICAgIG15ICRjaGFydCAgICAgICAgPSAgICRjaGFydHNbJGldLT5bMl07CisgICAgICAgIG15ICR4X29mZnNldCAgICA9ICAgJGNoYXJ0c1skaV0tPlszXTsKKyAgICAgICAgbXkgJHlfb2Zmc2V0ICAgID0gICAkY2hhcnRzWyRpXS0+WzRdOworICAgICAgICBteSAkc2NhbGVfeCAgICAgPSAgICRjaGFydHNbJGldLT5bNV07CisgICAgICAgIG15ICRzY2FsZV95ICAgICA9ICAgJGNoYXJ0c1skaV0tPls2XTsKKyAgICAgICAgbXkgJHdpZHRoICAgICAgID0gICA1MjY7CisgICAgICAgIG15ICRoZWlnaHQgICAgICA9ICAgMzE5OworCisgICAgICAgICR3aWR0aCAgKj0gJHNjYWxlX3ggaWYgJHNjYWxlX3g7CisgICAgICAgICRoZWlnaHQgKj0gJHNjYWxlX3kgaWYgJHNjYWxlX3k7CisKKyAgICAgICAgIyBDYWxjdWxhdGUgdGhlIHBvc2l0aW9ucyBvZiBjaGFydCBvYmplY3QuCisgICAgICAgIG15IEB2ZXJ0aWNlcyA9ICRzZWxmLT5fcG9zaXRpb25fb2JqZWN0KCAkY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisKKyAgICAgICAgaWYgKCRpID09IDAgYW5kIG5vdCAkbnVtX29iamVjdHMpIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIHBhcmVudCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGdfbGVuZ3RoICAgID0gMTkyICsgMTIwKigkbnVtX2NoYXJ0cyAtMSk7CisgICAgICAgICAgICBteSAkc3Bncl9sZW5ndGggID0gMTY4ICsgMTIwKigkbnVtX2NoYXJ0cyAtMSk7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAgOTYgKiRudW1fZmlsdGVyczsKKyAgICAgICAgICAgICAgICRzcGdyX2xlbmd0aCArPSAgOTYgKiRudW1fZmlsdGVyczsKKworICAgICAgICAgICAgICAgJGRnX2xlbmd0aCAgICs9IDEyOCAqJG51bV9jb21tZW50czsKKyAgICAgICAgICAgICAgICRzcGdyX2xlbmd0aCArPSAxMjggKiRudW1fY29tbWVudHM7CisKKworICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fZGdfY29udGFpbmVyKCRkZ19sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fZGcoQGlkcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyX2NvbnRhaW5lcigkc3Bncl9sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDQwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3IoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDB4MCwgJHNwaWQrKywgMHgwMDA1KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcigxMTIpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMjAxLCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2NoYXJ0KCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDAsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBjaGlsZCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoMTEyKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9jaGFydCgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigwLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworCisgICAgICAgIH0KKworICAgICAgICAkc2VsZi0+X3N0b3JlX29ial9jaGFydCgkbnVtX29iamVjdHMrJGkrMSk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfY2hhcnRfYmluYXJ5KCRjaGFydCk7CisgICAgfQorCisKKyAgICAjIFNpbXVsYXRlIHRoZSBFWFRFUk5TSEVFVCBsaW5rIGJldHdlZW4gdGhlIGNoYXJ0IGFuZCBkYXRhIHVzaW5nIGEgZm9ybXVsYQorICAgICMgc3VjaCBhcyAnPVNoZWV0MSFBMScuCisgICAgIyBUT0RPLiBXb24ndCB3b3JrIGZvciBleHRlcm5hbCBkYXRhIHJlZnMuIEFsc28gc2hvdWxkIHVzZSBhIG1vcmUgZGlyZWN0CisgICAgIyAgICAgICBtZXRob2QuCisgICAgIworICAgIG15ICRmb3JtdWxhID0gIj0nJHNlbGYtPntfbmFtZX0nIUExIjsKKyAgICAkc2VsZi0+c3RvcmVfZm9ybXVsYSgkZm9ybXVsYSk7CisKKyAgICAkc2VsZi0+e19vYmplY3RfaWRzfS0+WzBdID0gJHNwaWQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfYmluYXJ5CisjCisjIEFkZCB0aGUgYmluYXJ5IGRhdGEgZm9yIGEgY2hhcnQuIFRoaXMgY291bGQgZWl0aGVyIGJlIGZyb20gYSBDaGFydCBvYmplY3QKKyMgb3IgZnJvbSBhbiBleHRlcm5hbCBiaW5hcnkgZmlsZSAoZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfYmluYXJ5IHsKKworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRjaGFydCA9ICRfWzBdOworICAgIG15ICR0bXA7CisKKworICAgIGlmICggcmVmICRjaGFydCApIHsKKyAgICAgICAgJGNoYXJ0LT5fY2xvc2UoKTsKKyAgICAgICAgbXkgJHRtcCA9ICRjaGFydC0+Z2V0X2RhdGEoKTsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoICR0bXAgKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgbXkgJGZpbGVoYW5kbGUgPSBGaWxlSGFuZGxlLT5uZXcoICRjaGFydCApCisgICAgICAgICAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRjaGFydCBpbiBpbnNlcnRfY2hhcnQoKTogJCEuXG4iOworCisgICAgICAgIGJpbm1vZGUoICRmaWxlaGFuZGxlICk7CisKKyAgICAgICAgd2hpbGUgKCByZWFkKCAkZmlsZWhhbmRsZSwgJHRtcCwgNDA5NiApICkgeworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoICR0bXAgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9maWx0ZXJzKCkKKyMKKyMgU3RvcmUgdGhlIGNvbGxlY3Rpb25zIG9mIHJlY29yZHMgdGhhdCBtYWtlIHVwIGZpbHRlcnMuCisjCitzdWIgX3N0b3JlX2ZpbHRlcnMgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDBFQzsgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAwOyAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15IEBpZHMgICAgICAgICAgICAgPSBAeyRzZWxmLT57X29iamVjdF9pZHN9fTsKKyAgICBteSAkc3BpZCAgICAgICAgICAgID0gc2hpZnQgQGlkczsKKworICAgIG15ICRmaWx0ZXJfYXJlYSAgICAgPSAkc2VsZi0+e19maWx0ZXJfYXJlYX07CisgICAgbXkgJG51bV9maWx0ZXJzICAgICA9ICRzZWxmLT57X2ZpbHRlcl9jb3VudH07CisKKyAgICBteSAkbnVtX2NvbW1lbnRzICAgID0gQHskc2VsZi0+e19jb21tZW50c19hcnJheX19OworCisgICAgIyBOdW1iZXIgb2Ygb2JqZWN0cyB3cml0dGVuIHNvIGZhci4KKyAgICBteSAkbnVtX29iamVjdHMgICAgID0gQHskc2VsZi0+e19pbWFnZXNfYXJyYXl9fQorICAgICAgICAgICAgICAgICAgICAgICAgKyBAeyRzZWxmLT57X2NoYXJ0c19hcnJheX19OworCisgICAgIyBTa2lwIHRoaXMgaWYgdGhlcmUgYXJlbid0IGFueSBmaWx0ZXJzLgorICAgIHJldHVybiB1bmxlc3MgJG51bV9maWx0ZXJzOworCisKKyAgICBteSAoJHJvdzEsICRyb3cyLCAkY29sMSwgJGNvbDIpID0gQCRmaWx0ZXJfYXJlYTsKKworICAgIGZvciBteSAkaSAoMCAuLiAkbnVtX2ZpbHRlcnMtMSApIHsKKworICAgICAgICBteSBAdmVydGljZXMgPSAoICRjb2wxICskaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICRyb3cxLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbDEgKyRpICsxLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJHJvdzEgKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAgICAgaWYgKCRpID09IDAgYW5kIG5vdCAkbnVtX29iamVjdHMpIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIHBhcmVudCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGdfbGVuZ3RoICAgID0gMTY4ICsgOTYqKCRudW1fZmlsdGVycyAtMSk7CisgICAgICAgICAgICBteSAkc3Bncl9sZW5ndGggID0gMTQ0ICsgOTYqKCRudW1fZmlsdGVycyAtMSk7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAxMjggKiRudW1fY29tbWVudHM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gMTI4ICokbnVtX2NvbW1lbnRzOworCisKKyAgICAgICAgICAgIG15ICRkYXRhICAgICAgICA9ICRzZWxmLT5fc3RvcmVfbXNvX2RnX2NvbnRhaW5lcigkZGdfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2RnKEBpZHMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3Bncl9jb250YWluZXIoJHNwZ3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcig0MCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyKCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgweDAsICRzcGlkKyssIDB4MDAwNSk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoODgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMjAxLCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2ZpbHRlcigpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigxLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXcml0ZSB0aGUgY2hpbGQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDg4KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9maWx0ZXIoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9hbmNob3IoMSwgQHZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9kYXRhKCk7CisKKyAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKworICAgICAgICB9CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9vYmpfZmlsdGVyKCRudW1fb2JqZWN0cyskaSsxLCAkY29sMSArJGkpOworICAgIH0KKworCisgICAgIyBTaW11bGF0ZSB0aGUgRVhURVJOU0hFRVQgbGluayBiZXR3ZWVuIHRoZSBmaWx0ZXIgYW5kIGRhdGEgdXNpbmcgYSBmb3JtdWxhCisgICAgIyBzdWNoIGFzICc9U2hlZXQxIUExJy4KKyAgICAjIFRPRE8uIFdvbid0IHdvcmsgZm9yIGV4dGVybmFsIGRhdGEgcmVmcy4gQWxzbyBzaG91bGQgdXNlIGEgbW9yZSBkaXJlY3QKKyAgICAjICAgICAgIG1ldGhvZC4KKyAgICAjCisgICAgbXkgJGZvcm11bGEgPSAiPSckc2VsZi0+e19uYW1lfSchQTEiOworICAgICRzZWxmLT5zdG9yZV9mb3JtdWxhKCRmb3JtdWxhKTsKKworICAgICRzZWxmLT57X29iamVjdF9pZHN9LT5bMF0gPSAkc3BpZDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jb21tZW50cygpCisjCisjIFN0b3JlIHRoZSBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIHRoYXQgbWFrZSB1cCBjZWxsIGNvbW1lbnRzLgorIworIyBOT1RFOiBXZSB3cml0ZSB0aGUgY29tbWVudCBvYmplY3RzIGxhc3Qgc2luY2UgdGhhdCBtYWtlcyBpdCBhIGxpdHRsZSBlYXNpZXIKKyMgdG8gd3JpdGUgdGhlIE5PVEUgcmVjb3JkcyBkaXJlY3RseSBhZnRlciB0aGUgTVNPRFJBV0lJTkcgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfY29tbWVudHMgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDBFQzsgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAwOyAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15IEBpZHMgICAgICAgICAgICAgPSBAeyRzZWxmLT57X29iamVjdF9pZHN9fTsKKyAgICBteSAkc3BpZCAgICAgICAgICAgID0gc2hpZnQgQGlkczsKKworICAgIG15IEBjb21tZW50cyAgICAgICAgPSBAeyRzZWxmLT57X2NvbW1lbnRzX2FycmF5fX07CisgICAgbXkgJG51bV9jb21tZW50cyAgICA9IHNjYWxhciBAY29tbWVudHM7CisKKyAgICAjIE51bWJlciBvZiBvYmplY3RzIHdyaXR0ZW4gc28gZmFyLgorICAgIG15ICRudW1fb2JqZWN0cyAgICAgPSBAeyRzZWxmLT57X2ltYWdlc19hcnJheX19CisgICAgICAgICAgICAgICAgICAgICAgICArICAgJHNlbGYtPntfZmlsdGVyX2NvdW50fQorICAgICAgICAgICAgICAgICAgICAgICAgKyBAeyRzZWxmLT57X2NoYXJ0c19hcnJheX19OworCisgICAgIyBTa2lwIHRoaXMgaWYgdGhlcmUgYXJlbid0IGFueSBjb21tZW50cy4KKyAgICByZXR1cm4gdW5sZXNzICRudW1fY29tbWVudHM7CisKKyAgICBmb3IgbXkgJGkgKDAgLi4gJG51bV9jb21tZW50cy0xKSB7CisKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gICAkY29tbWVudHNbJGldLT5bMF07CisgICAgICAgIG15ICRjb2wgICAgICAgICA9ICAgJGNvbW1lbnRzWyRpXS0+WzFdOworICAgICAgICBteSAkc3RyICAgICAgICAgPSAgICRjb21tZW50c1skaV0tPlsyXTsKKyAgICAgICAgbXkgJGVuY29kaW5nICAgID0gICAkY29tbWVudHNbJGldLT5bM107CisgICAgICAgIG15ICR2aXNpYmxlICAgICA9ICAgJGNvbW1lbnRzWyRpXS0+WzZdOworICAgICAgICBteSAkY29sb3IgICAgICAgPSAgICRjb21tZW50c1skaV0tPls3XTsKKyAgICAgICAgbXkgQHZlcnRpY2VzICAgID0gQHskY29tbWVudHNbJGldLT5bOF19OworICAgICAgICBteSAkc3RyX2xlbiAgICAgPSBsZW5ndGggJHN0cjsKKyAgICAgICAgICAgJHN0cl9sZW4gICAgLz0gMiBpZiAkZW5jb2Rpbmc7ICMgTnVtIG9mIGNoYXJzIG5vdCBieXRlcy4KKyAgICAgICAgbXkgJGZvcm1hdHMgICAgID0gW1swLCA5XSwgWyRzdHJfbGVuLCAwXV07CisKKworICAgICAgICBpZiAoJGkgPT0gMCBhbmQgbm90ICRudW1fb2JqZWN0cykgeworICAgICAgICAgICAgIyBXcml0ZSB0aGUgcGFyZW50IE1TT0RSQVdJSU5HIHJlY29yZC4KKyAgICAgICAgICAgIG15ICRkZ19sZW5ndGggICA9IDIwMCArIDEyOCooJG51bV9jb21tZW50cyAtMSk7CisgICAgICAgICAgICBteSAkc3Bncl9sZW5ndGggPSAxNzYgKyAxMjgqKCRudW1fY29tbWVudHMgLTEpOworCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19kZ19jb250YWluZXIoJGRnX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19kZyhAaWRzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3JfY29udGFpbmVyKCRzcGdyX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoNDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BncigpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMHgwLCAkc3BpZCsrLCAweDAwMDUpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDEyMCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgyMDIsICRzcGlkKyssIDB4MEEwMCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19vcHRfY29tbWVudCgweDgwLCAkdmlzaWJsZSwgJGNvbG9yKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9hbmNob3IoMywgQHZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9kYXRhKCk7CisKKyAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIGNoaWxkIE1TT0RSQVdJSU5HIHJlY29yZC4KKyAgICAgICAgICAgIG15ICRkYXRhICAgICAgICA9ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcigxMjApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMjAyLCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2NvbW1lbnQoMHg4MCwgJHZpc2libGUsICRjb2xvcik7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDMsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisKKyAgICAgICAgfQorCisgICAgICAgICRzZWxmLT5fc3RvcmVfb2JqX2NvbW1lbnQoJG51bV9vYmplY3RzKyRpKzEpOworICAgICAgICAkc2VsZi0+X3N0b3JlX21zb19kcmF3aW5nX3RleHRfYm94KCk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfdHhvKCRzdHJfbGVuKTsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV90eG9fY29udGludWVfMSgkc3RyLCAkZW5jb2RpbmcpOworICAgICAgICAkc2VsZi0+X3N0b3JlX3R4b19jb250aW51ZV8yKCRmb3JtYXRzKTsKKyAgICB9CisKKworICAgICMgV3JpdGUgdGhlIE5PVEUgcmVjb3JkcyBhZnRlciBNU09EUkFXSUlORyByZWNvcmRzLgorICAgIGZvciBteSAkaSAoMCAuLiAkbnVtX2NvbW1lbnRzLTEpIHsKKworICAgICAgICBteSAkcm93ICAgICAgICAgPSAkY29tbWVudHNbJGldLT5bMF07CisgICAgICAgIG15ICRjb2wgICAgICAgICA9ICRjb21tZW50c1skaV0tPlsxXTsKKyAgICAgICAgbXkgJGF1dGhvciAgICAgID0gJGNvbW1lbnRzWyRpXS0+WzRdOworICAgICAgICBteSAkYXV0aG9yX2VuYyAgPSAkY29tbWVudHNbJGldLT5bNV07CisgICAgICAgIG15ICR2aXNpYmxlICAgICA9ICRjb21tZW50c1skaV0tPls2XTsKKworICAgICAgICAkc2VsZi0+X3N0b3JlX25vdGUoJHJvdywgJGNvbCwgJG51bV9vYmplY3RzKyRpKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXV0aG9yLCAkYXV0aG9yX2VuYywgJHZpc2libGUpOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fZGdfY29udGFpbmVyKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBEZ0NvbnRhaW5lciByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19kZ19jb250YWluZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDI7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTU7CisgICAgbXkgJGluc3RhbmNlICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkX1swXTsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2RnKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBEZyByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19kZyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwODsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAwOworICAgIG15ICRpbnN0YW5jZSAgICA9ICRfWzBdOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9IDg7CisKKyAgICBteSAkbnVtX3NoYXBlcyAgPSAkX1sxXTsKKyAgICBteSAkbWF4X3NwaWQgICAgPSAkX1syXTsKKworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgIlZWIiwgJG51bV9zaGFwZXMsICRtYXhfc3BpZDsKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19zcGdyX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgU3BnckNvbnRhaW5lciByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19zcGdyX2NvbnRhaW5lciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwMzsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAxNTsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9ICRfWzBdOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fc3BfY29udGFpbmVyKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBTcENvbnRhaW5lciByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19zcF9jb250YWluZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDQ7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTU7CisgICAgbXkgJGluc3RhbmNlICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkX1swXTsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX3NwZ3IoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIFNwZ3IgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fc3BnciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwOTsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAxOworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjayAiVlZWViIsIDAsIDAsIDAsIDA7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMTY7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19zcCgpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgU3AgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fc3AgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMEE7CisgICAgbXkgJHZlcnNpb24gICAgID0gMjsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAkX1swXTsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSA4OworCisgICAgbXkgJHNwaWQgICAgICAgID0gJF9bMV07CisgICAgbXkgJG9wdGlvbnMgICAgID0gJF9bMl07CisKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrICJWViIsICRzcGlkLCAkb3B0aW9uczsKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19vcHRfY29tbWVudCgpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgT3B0IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX29wdF9jb21tZW50IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBCOworICAgIG15ICR2ZXJzaW9uICAgICA9IDM7CisgICAgbXkgJGluc3RhbmNlICAgID0gOTsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSA1NDsKKworICAgIG15ICRzcGlkICAgICAgICA9ICRfWzBdOworICAgIG15ICR2aXNpYmxlICAgICA9ICRfWzFdOworICAgIG15ICRjb2xvdXIgICAgICA9ICRfWzJdIHx8IDB4NTA7CisKKworICAgICMgVXNlIHRoZSB2aXNpYmxlIGZsYWcgaWYgc2V0IGJ5IHRoZSB1c2VyIG9yIGVsc2UgdXNlIHRoZSB3b3Jrc2hlZXQgdmFsdWUuCisgICAgIyBOb3RlIHRoYXQgdGhlIHZhbHVlIHVzZWQgaXMgdGhlIG9wcG9zaXRlIG9mIF9zdG9yZV9ub3RlKCkuCisgICAgIworICAgIGlmIChkZWZpbmVkICR2aXNpYmxlKSB7CisgICAgICAgICR2aXNpYmxlID0gJHZpc2libGUgICAgICAgICAgICAgICAgICAgPyAweDAwMDAgOiAweDAwMDI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkdmlzaWJsZSA9ICRzZWxmLT57X2NvbW1lbnRzX3Zpc2libGV9ID8gMHgwMDAwIDogMHgwMDAyOworICAgIH0KKworCisgICAgJGRhdGEgICAgPSBwYWNrICJWIiwgICRzcGlkOworICAgICRkYXRhICAgLj0gcGFjayAiSCoiLCAnMDAwMEJGMDAwODAwMDgwMDU4MDEwMDAwMDAwMDgxMDEnIDsKKyAgICAkZGF0YSAgIC49IHBhY2sgIkMiLCAgJGNvbG91cjsKKyAgICAkZGF0YSAgIC49IHBhY2sgIkgqIiwgJzAwMDAwODgzMDE1MDAwMDAwOEJGMDExMDAwMTEwMDAxJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICcwMjAwMDAwMDAwM0YwMjAzMDAwMzAwQkYwMyc7CisgICAgJGRhdGEgICAuPSBwYWNrICJ2IiwgICR2aXNpYmxlOworICAgICRkYXRhICAgLj0gcGFjayAiSCoiLCAnMEEwMCc7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19vcHRfaW1hZ2UoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIE9wdCByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19vcHRfaW1hZ2UgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMEI7CisgICAgbXkgJHZlcnNpb24gICAgID0gMzsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAzOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9IHVuZGVmOworICAgIG15ICRzcGlkICAgICAgICA9ICRfWzBdOworCisgICAgJGRhdGEgICAgPSBwYWNrICd2JywgMHg0MTA0OyAgICAgICAgIyBCbGlwIC0+IHBpYgorICAgICRkYXRhICAgLj0gcGFjayAnVicsICRzcGlkOworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDFCRjsgICAgICAgICMgRmlsbCBTdHlsZSAtPiBmTm9GaWxsSGl0VGVzdAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwMTAwMDA7CisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwM0JGOyAgICAgICAgIyBHcm91cCBTaGFwZSAtPiBmUHJpbnQKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDgwMDAwOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fb3B0X2NoYXJ0KCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBPcHQgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fb3B0X2NoYXJ0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBCOworICAgIG15ICR2ZXJzaW9uICAgICA9IDM7CisgICAgbXkgJGluc3RhbmNlICAgID0gOTsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSB1bmRlZjsKKworICAgICRkYXRhICAgID0gcGFjayAndicsIDB4MDA3RjsgICAgICAgICMgUHJvdGVjdGlvbiAtPiBmTG9ja0FnYWluc3RHcm91cGluZworICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDEwNDAxMDQ7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAwQkY7ICAgICAgICAjIFRleHQgLT4gZkZpdFRleHRUb1NoYXBlCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDA4MDAwODsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDE4MTsgICAgICAgICMgRmlsbCBTdHlsZSAtPiBmaWxsQ29sb3IKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDA4MDAwMDRFIDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDE4MzsgICAgICAgICMgRmlsbCBTdHlsZSAtPiBmaWxsQmFja0NvbG9yCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwODAwMDA0RDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDFCRjsgICAgICAgICMgRmlsbCBTdHlsZSAtPiBmTm9GaWxsSGl0VGVzdAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAxMTAwMTA7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxQzA7ICAgICAgICAjIExpbmUgU3R5bGUgLT4gbGluZUNvbG9yCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwODAwMDA0RDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDFGRjsgICAgICAgICMgTGluZSBTdHlsZSAtPiBmTm9MaW5lRHJhd0Rhc2gKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDgwMDA4OworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMjNGOyAgICAgICAgIyBTaGFkb3cgU3R5bGUgLT4gZnNoYWRvd09ic2N1cmVkCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDAyMDAwMDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDNCRjsgICAgICAgICMgR3JvdXAgU2hhcGUgLT4gZlByaW50CisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDA4MDAwMDsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX29wdF9maWx0ZXIoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIE9wdCByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19vcHRfZmlsdGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBCOworICAgIG15ICR2ZXJzaW9uICAgICA9IDM7CisgICAgbXkgJGluc3RhbmNlICAgID0gNTsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSB1bmRlZjsKKworCisKKyAgICAkZGF0YSAgICA9IHBhY2sgJ3YnLCAweDAwN0Y7ICAgICAgICAjIFByb3RlY3Rpb24gLT4gZkxvY2tBZ2FpbnN0R3JvdXBpbmcKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAxMDQwMTA0OworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMEJGOyAgICAgICAgIyBUZXh0IC0+IGZGaXRUZXh0VG9TaGFwZQorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwODAwMDg7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxQkY7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZk5vRmlsbEhpdFRlc3QKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDEwMDAwOworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMUZGOyAgICAgICAgIyBMaW5lIFN0eWxlIC0+IGZOb0xpbmVEcmF3RGFzaAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwODAwMDA7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAzQkY7ICAgICAgICAjIEdyb3VwIFNoYXBlIC0+IGZQcmludAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwQTAwMDA7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19jbGllbnRfYW5jaG9yKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBDbGllbnRBbmNob3IgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fY2xpZW50X2FuY2hvciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAxMDsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAwOworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMTg7CisKKyAgICBteSAkZmxhZyAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRjb2xfc3RhcnQgICA9ICRfWzBdOyAgICAjIENvbCBjb250YWluaW5nIHVwcGVyIGxlZnQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR4MSAgICAgICAgICA9ICRfWzFdOyAgICAjIERpc3RhbmNlIHRvIGxlZnQgc2lkZSBvZiBvYmplY3QKKworICAgIG15ICRyb3dfc3RhcnQgICA9ICRfWzJdOyAgICAjIFJvdyBjb250YWluaW5nIHRvcCBsZWZ0IGNvcm5lciBvZiBvYmplY3QKKyAgICBteSAkeTEgICAgICAgICAgPSAkX1szXTsgICAgIyBEaXN0YW5jZSB0byB0b3Agb2Ygb2JqZWN0CisKKyAgICBteSAkY29sX2VuZCAgICAgPSAkX1s0XTsgICAgIyBDb2wgY29udGFpbmluZyBsb3dlciByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHgyICAgICAgICAgID0gJF9bNV07ICAgICMgRGlzdGFuY2UgdG8gcmlnaHQgc2lkZSBvZiBvYmplY3QKKworICAgIG15ICRyb3dfZW5kICAgICA9ICRfWzZdOyAgICAjIFJvdyBjb250YWluaW5nIGJvdHRvbSByaWdodCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHkyICAgICAgICAgID0gJF9bN107ICAgICMgRGlzdGFuY2UgdG8gYm90dG9tIG9mIG9iamVjdAorCisgICAgJGRhdGEgICA9IHBhY2sgInY5IiwgICAgJGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbF9zdGFydCwgJHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3dfc3RhcnQsICR5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sX2VuZCwgICAkeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvd19lbmQsICAgJHkyOworCisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19jbGllbnRfZGF0YSgpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgQ2xpZW50RGF0YSByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19jbGllbnRfZGF0YSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAxMTsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAwOworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMDsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfb2JqX2NvbW1lbnQoKQorIworIyBXcml0ZSB0aGUgT0JKIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgY2VsbCBjb21tZW50cy4KKyMKK3N1YiBfc3RvcmVfb2JqX2NvbW1lbnQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwNUQ7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAzNDsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICMgT2JqZWN0IElEIG51bWJlci4KKyAgICBteSAkb2JqX3R5cGUgICAgPSAweDAwMTk7ICAgIyBPYmplY3QgdHlwZSAoY29tbWVudCkuCisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7ICAgICAgICMgUmVjb3JkIGRhdGEuCisKKyAgICBteSAkc3ViX3JlY29yZCAgPSAweDAwMDA7ICAgIyBTdWItcmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJHN1Yl9sZW5ndGggID0gMHgwMDAwOyAgICMgTGVuZ3RoIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJHN1Yl9kYXRhICAgID0gJyc7ICAgICAgICMgRGF0YSBvZiBzdWItcmVjb3JkLgorICAgIG15ICRvcHRpb25zICAgICA9IDB4NDAxMTsKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwMDA7CisKKyAgICAjIEFkZCBmdENtbyAoY29tbW9uIG9iamVjdCBkYXRhKSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMTU7ICAgIyBmdENtbworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAxMjsKKyAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICJ2dnZWVlYiLCAkb2JqX3R5cGUsICRvYmpfaWQsICAgJG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc2VydmVkLCAkcmVzZXJ2ZWQsICRyZXNlcnZlZDsKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrKCJ2diIsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGgpOworICAgICRkYXRhICAgICAgICAgIC49ICRzdWJfZGF0YTsKKworCisgICAgIyBBZGQgZnROdHMgKG5vdGUgc3RydWN0dXJlKSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMEQ7ICAgIyBmdE50cworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAxNjsKKyAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICJWVlZWVnYiLCAoJHJlc2VydmVkKSB4IDY7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjaygidnYiLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoKTsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0RW5kIChlbmQgb2Ygb2JqZWN0KSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMDA7ICAgIyBmdE50cworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAwMDsKKyAgICAkZGF0YSAgICAgICAgICAuPSBwYWNrKCJ2diIsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGgpOworCisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfb2JqX2ltYWdlKCkKKyMKKyMgV3JpdGUgdGhlIE9CSiByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIGltYWdlIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX29ial9pbWFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA1RDsgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDI2OyAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkb2JqX2lkICAgICAgPSAkX1swXTsgICAgIyBPYmplY3QgSUQgbnVtYmVyLgorICAgIG15ICRvYmpfdHlwZSAgICA9IDB4MDAwODsgICAjIE9iamVjdCB0eXBlIChQaWN0dXJlKS4KKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsgICAgICAgIyBSZWNvcmQgZGF0YS4KKworICAgIG15ICRzdWJfcmVjb3JkICA9IDB4MDAwMDsgICAjIFN1Yi1yZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkc3ViX2xlbmd0aCAgPSAweDAwMDA7ICAgIyBMZW5ndGggb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkc3ViX2RhdGEgICAgPSAnJzsgICAgICAgIyBEYXRhIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJG9wdGlvbnMgICAgID0gMHg2MDExOworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDsKKworICAgICMgQWRkIGZ0Q21vIChjb21tb24gb2JqZWN0IGRhdGEpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAxNTsgICAjIGZ0Q21vCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDEyOworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ3Z2dlZWVicsICRvYmpfdHlwZSwgJG9ial9pZCwgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXJ2ZWQsICRyZXNlcnZlZCwgJHJlc2VydmVkOworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0Q2YgKENsaXBib2FyZCBmb3JtYXQpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwNzsgICAjIGZ0Q2YKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDI7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAndicsICAgICAgMHhGRkZGOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKyAgICAjIEFkZCBmdFBpb0dyYml0IChQaWN0dXJlIG9wdGlvbiBmbGFncykgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDA4OyAgICMgZnRQaW9HcmJpdAorICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAwMjsKKyAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICd2JywgICAgICAweDAwMDE7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgIC49ICRzdWJfZGF0YTsKKworCisgICAgIyBBZGQgZnRFbmQgKGVuZCBvZiBvYmplY3QpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwMDsgICAjIGZ0TnRzCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDAwOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCd2dicsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9jaGFydCgpCisjCisjIFdyaXRlIHRoZSBPQkogcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBjaGFydCByZWNvcmRzLgorIworc3ViIF9zdG9yZV9vYmpfY2hhcnQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwNUQ7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAxQTsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICMgT2JqZWN0IElEIG51bWJlci4KKyAgICBteSAkb2JqX3R5cGUgICAgPSAweDAwMDU7ICAgIyBPYmplY3QgdHlwZSAoY2hhcnQpLgorICAgIG15ICRkYXRhICAgICAgICA9ICcnOyAgICAgICAjIFJlY29yZCBkYXRhLgorCisgICAgbXkgJHN1Yl9yZWNvcmQgID0gMHgwMDAwOyAgICMgU3ViLXJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRzdWJfbGVuZ3RoICA9IDB4MDAwMDsgICAjIExlbmd0aCBvZiBzdWItcmVjb3JkLgorICAgIG15ICRzdWJfZGF0YSAgICA9ICcnOyAgICAgICAjIERhdGEgb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkb3B0aW9ucyAgICAgPSAweDYwMTE7CisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOworCisgICAgIyBBZGQgZnRDbW8gKGNvbW1vbiBvYmplY3QgZGF0YSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDE1OyAgICMgZnRDbW8KKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMTI7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAndnZ2VlZWJywgJG9ial90eXBlLCAkb2JqX2lkLCAgICRvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXNlcnZlZCwgJHJlc2VydmVkLCAkcmVzZXJ2ZWQ7CisgICAgJGRhdGEgICAgICAgICAgID0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgIC49ICRzdWJfZGF0YTsKKworICAgICMgQWRkIGZ0RW5kIChlbmQgb2Ygb2JqZWN0KSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMDA7ICAgIyBmdE50cworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAwMDsKKyAgICAkZGF0YSAgICAgICAgICAuPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRoZWFkZXIgID0gcGFjaygndnYnLCAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfb2JqX2ZpbHRlcigpCisjCisjIFdyaXRlIHRoZSBPQkogcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBmaWx0ZXIgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfb2JqX2ZpbHRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA1RDsgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDQ2OyAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkb2JqX2lkICAgICAgPSAkX1swXTsgICAgIyBPYmplY3QgSUQgbnVtYmVyLgorICAgIG15ICRvYmpfdHlwZSAgICA9IDB4MDAxNDsgICAjIE9iamVjdCB0eXBlIChjb21ibyBib3gpLgorICAgIG15ICRkYXRhICAgICAgICA9ICcnOyAgICAgICAjIFJlY29yZCBkYXRhLgorCisgICAgbXkgJHN1Yl9yZWNvcmQgID0gMHgwMDAwOyAgICMgU3ViLXJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRzdWJfbGVuZ3RoICA9IDB4MDAwMDsgICAjIExlbmd0aCBvZiBzdWItcmVjb3JkLgorICAgIG15ICRzdWJfZGF0YSAgICA9ICcnOyAgICAgICAjIERhdGEgb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkb3B0aW9ucyAgICAgPSAweDIxMDE7CisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOworCisgICAgIyBBZGQgZnRDbW8gKGNvbW1vbiBvYmplY3QgZGF0YSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDE1OyAgICMgZnRDbW8KKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMTI7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAndnZ2VlZWJywgJG9ial90eXBlLCAkb2JqX2lkLCAgICRvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXNlcnZlZCwgJHJlc2VydmVkLCAkcmVzZXJ2ZWQ7CisgICAgJGRhdGEgICAgICAgICAgID0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgIC49ICRzdWJfZGF0YTsKKworICAgICMgQWRkIGZ0U2JzIFNjcm9sbCBiYXIgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDBDOyAgICMgZnRTYnMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMTQ7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAnSConLCAnMDAwMDAwMDAwMDAwMDAwMDY0MDAwMTAwMEEwMDAwMDAxMDAwMDEwMCc7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgIC49ICRzdWJfZGF0YTsKKworCisgICAgIyBBZGQgZnRMYnNEYXRhIChMaXN0IGJveCBkYXRhKSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMTM7ICAgIyBmdExic0RhdGEKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDFGRUU7ICAgIyBTcGVjaWFsIGNhc2UgKHVuZG9jdW1lbnRlZCkuCisKKworICAgICMgSWYgdGhlIGZpbHRlciBpcyBhY3RpdmUgd2Ugc2V0IG9uZSBvZiB0aGUgdW5kb2N1bWVudGVkIGZsYWdzLgorICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOworCisgICAgaWYgKCRzZWxmLT57X2ZpbHRlcl9jb2xzfS0+eyRjb2x9KSB7CisgICAgICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDEwMDAxMDMwMDAwMEEwMDA4MDA1NzAwJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDEwMDAxMDMwMDAwMDIwMDA4MDA1NzAwJzsKKyAgICB9CisKKyAgICAkZGF0YSAgICAgICAgICAuPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgLj0gJHN1Yl9kYXRhOworCisKKyAgICAjIEFkZCBmdEVuZCAoZW5kIG9mIG9iamVjdCkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDAwOyAgICMgZnROdHMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDA7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjayAndnYnLCAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkaGVhZGVyICA9IHBhY2soJ3Z2JywgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19kcmF3aW5nX3RleHRfYm94KCkKKyMKKyMgV3JpdGUgdGhlIE1TT0RSQVdJTkcgQ2xpZW50VGV4dGJveCByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIGNvbW1lbnRzLgorIworc3ViIF9zdG9yZV9tc29fZHJhd2luZ190ZXh0X2JveCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDBFQzsgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDg7ICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisKKyAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfdGV4dF9ib3goKTsKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19jbGllbnRfdGV4dF9ib3goKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIENsaWVudFRleHRib3ggcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fY2xpZW50X3RleHRfYm94IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBEOworICAgIG15ICR2ZXJzaW9uICAgICA9IDA7CisgICAgbXkgJGluc3RhbmNlICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAwOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90eG8oKQorIworIyBXcml0ZSB0aGUgd29ya3NoZWV0IFRYTyByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIGNlbGwgY29tbWVudHMuCisjCitzdWIgX3N0b3JlX3R4byB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDFCNjsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDEyOyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkc3RyaW5nX2xlbiAgPSAkX1swXTsgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgdGhlIG5vdGUgdGV4dC4KKyAgICBteSAkZm9ybWF0X2xlbiAgPSAkX1sxXSB8fCAxNjsgICAgICAgICAgIyBMZW5ndGggb2YgdGhlIGZvcm1hdCBydW5zLgorICAgIG15ICRyb3RhdGlvbiAgICA9ICRfWzJdIHx8IDA7ICAgICAgICAgICAjIE9wdGlvbnMKKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAyMTI7ICAgICAgICAgICAgICAgIyBPcHRpb25zCisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgT3B0aW9ucworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInZ2VnZ2dlYiLCAgICRncmJpdCwgJHJvdGF0aW9uLCAkcmVzZXJ2ZWQsICRyZXNlcnZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdHJpbmdfbGVuLCAkZm9ybWF0X2xlbiwgJHJlc2VydmVkKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3R4b19jb250aW51ZV8xKCkKKyMKKyMgV3JpdGUgdGhlIGZpcnN0IENPTlRJTlVFIHJlY29yZCB0byBmb2xsb3cgdGhlIFRYTyByZWNvcmQuIEl0IGNvbnRhaW5zIHRoZQorIyB0ZXh0IGRhdGEuCisjCitzdWIgX3N0b3JlX3R4b19jb250aW51ZV8xIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDNDOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkc3RyaW5nICAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgIyBDb21tZW50IHN0cmluZy4KKyAgICBteSAkZW5jb2RpbmcgICAgPSAkX1sxXSB8fCAwOyAgICAgICAgICAgIyBFbmNvZGluZyBvZiB0aGUgc3RyaW5nLgorCisKKyAgICAjIFNwbGl0IGxvbmcgY29tbWVudCBzdHJpbmdzIGludG8gc21hbGxlciBjb250aW51ZSBibG9ja3MgaWYgbmVjZXNzYXJ5LgorICAgICMgV2UgY2FuJ3QgbGV0IEJJRkZ3cml0ZXI6Ol9hZGRfY29udGludWUoKSBoYW5kbGVkIHRoaXMgc2luY2UgYW4gZXh0cmEKKyAgICAjIGVuY29kaW5nIGJ5dGUgaGFzIHRvIGJlIGFkZGVkIHNpbWlsYXIgdG8gdGhlIFNTVCBibG9jay4KKyAgICAjCisgICAgIyBXZSBtYWtlIHRoZSBsaW1pdCBzaXplIHNtYWxsZXIgdGhhbiB0aGUgX2FkZF9jb250aW51ZSgpIHNpemUgYW5kIGV2ZW4KKyAgICAjIHNvIHRoYXQgVVRGMTYgY2hhcnMgb2NjdXIgaW4gdGhlIHNhbWUgYmxvY2suCisgICAgIworICAgIG15ICRsaW1pdCA9IDgyMTg7CisgICAgd2hpbGUgKGxlbmd0aCgkc3RyaW5nKSA+ICRsaW1pdCkgeworICAgICAgICBteSAkdG1wX3N0ciA9IHN1YnN0cigkc3RyaW5nLCAwLCAkbGltaXQsICIiKTsKKworICAgICAgICBteSAkZGF0YSAgICA9IHBhY2soIkMiLCAkZW5jb2RpbmcpIC4gJHRtcF9zdHI7CisgICAgICAgIG15ICRsZW5ndGggID0gbGVuZ3RoICRkYXRhOworICAgICAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworICAgIH0KKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRkYXRhICAgID0gcGFjaygiQyIsICRlbmNvZGluZykgLiAkc3RyaW5nOworICAgIG15ICRsZW5ndGggID0gbGVuZ3RoICRkYXRhOworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3R4b19jb250aW51ZV8yKCkKKyMKKyMgV3JpdGUgdGhlIHNlY29uZCBDT05USU5VRSByZWNvcmQgdG8gZm9sbG93IHRoZSBUWE8gcmVjb3JkLiBJdCBjb250YWlucyB0aGUKKyMgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHN0cmluZy4KKyMKK3N1YiBfc3RvcmVfdHhvX2NvbnRpbnVlXzIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwM0M7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRmb3JtYXRzICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAjIEZvcm1hdHRpbmcgaW5mb3JtYXRpb24KKworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGRhdGEgPSAnJzsKKworICAgIGZvciBteSAkYV9yZWYgKEAkZm9ybWF0cykgeworICAgICAgICAkZGF0YSAuPSBwYWNrICJ2dlYiLCAkYV9yZWYtPlswXSwgJGFfcmVmLT5bMV0sIDB4MDsKKyAgICB9CisKKyAgICAkbGVuZ3RoICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX25vdGUoKQorIworIyBXcml0ZSB0aGUgd29ya3NoZWV0IE5PVEUgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBjZWxsIGNvbW1lbnRzLgorIworc3ViIF9zdG9yZV9ub3RlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDFDOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMEM7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOworICAgIG15ICRvYmpfaWQgICAgICA9ICRfWzJdOworICAgIG15ICRhdXRob3IgICAgICA9ICRfWzNdIHx8ICRzZWxmLT57X2NvbW1lbnRzX2F1dGhvcn07CisgICAgbXkgJGF1dGhvcl9lbmMgID0gJF9bNF0gfHwgJHNlbGYtPntfY29tbWVudHNfYXV0aG9yX2VuY307CisgICAgbXkgJHZpc2libGUgICAgID0gJF9bNV07CisKKworICAgICMgVXNlIHRoZSB2aXNpYmxlIGZsYWcgaWYgc2V0IGJ5IHRoZSB1c2VyIG9yIGVsc2UgdXNlIHRoZSB3b3Jrc2hlZXQgdmFsdWUuCisgICAgIyBUaGUgZmxhZyBpcyBhbHNvIHNldCBpbiBfc3RvcmVfbXNvX29wdF9jb21tZW50KCkgYnV0IHdpdGggdGhlIG9wcG9zaXRlCisgICAgIyB2YWx1ZS4KKyAgICBpZiAoZGVmaW5lZCAkdmlzaWJsZSkgeworICAgICAgICAkdmlzaWJsZSA9ICR2aXNpYmxlICAgICAgICAgICAgICAgICAgID8gMHgwMDAyIDogMHgwMDAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHZpc2libGUgPSAkc2VsZi0+e19jb21tZW50c192aXNpYmxlfSA/IDB4MDAwMiA6IDB4MDAwMDsKKyAgICB9CisKKworICAgICMgR2V0IHRoZSBudW1iZXIgb2YgY2hhcnMgaW4gdGhlIGF1dGhvciBzdHJpbmcgKG5vdCBieXRlcykuCisgICAgbXkgJG51bV9jaGFycyAgPSBsZW5ndGggJGF1dGhvcjsKKyAgICAgICAkbnVtX2NoYXJzIC89IDIgaWYgJGF1dGhvcl9lbmM7CisKKworICAgICMgTnVsbCB0ZXJtaW5hdGUgdGhlIGF1dGhvciBzdHJpbmcuCisgICAgJGF1dGhvciAuPSAiXDAiOworCisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkZGF0YSAgICA9IHBhY2soInZ2dnZ2QyIsICRyb3csICRjb2wsICR2aXNpYmxlLCAkb2JqX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG51bV9jaGFycywgJGF1dGhvcl9lbmMpOworCisgICAgJGxlbmd0aCAgICAgPSBsZW5ndGgoJGRhdGEpICsgbGVuZ3RoKCRhdXRob3IpOworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkYXV0aG9yKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jb21tZW50X3BhcmFtcygpCisjCisjIFRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGFkZGl0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyB0byB3cml0ZV9jb21tZW50KCkgYXMKKyMgd2VsbCBhcyBjYWxjdWxhdGluZyB0aGUgY29tbWVudCBvYmplY3QgcG9zaXRpb24gYW5kIHZlcnRpY2VzLgorIworc3ViIF9jb21tZW50X3BhcmFtcyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcm93ICAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGNvbCAgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRzdHJpbmcgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRkZWZhdWx0X3dpZHRoICAgPSAxMjg7CisgICAgbXkgJGRlZmF1bHRfaGVpZ2h0ICA9IDc0OworCisgICAgbXkgJXBhcmFtcyAgPSAoCisgICAgICAgICAgICAgICAgICAgIGF1dGhvciAgICAgICAgICA9PiAnJywKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yX2VuY29kaW5nID0+IDAsCisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBjb2xvciAgICAgICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2NlbGwgICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfY29sICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICBzdGFydF9yb3cgICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHZpc2libGUgICAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggICAgICAgICAgID0+ICRkZWZhdWx0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAgICAgPT4gJGRlZmF1bHRfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICB4X29mZnNldCAgICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHhfc2NhbGUgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICB5X29mZnNldCAgICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgIyBPdmVyd3JpdGUgdGhlIGRlZmF1bHRzIHdpdGggYW55IHVzZXIgc3VwcGxpZWQgdmFsdWVzLiBJbmNvcnJlY3Qgb3IKKyAgICAjIG1pc3NwZWxsZWQgcGFyYW1ldGVycyBhcmUgc2lsZW50bHkgaWdub3JlZC4KKyAgICAlcGFyYW1zICAgICA9ICglcGFyYW1zLCBAXyk7CisKKworICAgICMgRW5zdXJlIHRoYXQgYSB3aWR0aCBhbmQgaGVpZ2h0IGhhdmUgYmVlbiBzZXQuCisgICAgJHBhcmFtc3t3aWR0aH0gID0gJGRlZmF1bHRfd2lkdGggIGlmIG5vdCAkcGFyYW1ze3dpZHRofTsKKyAgICAkcGFyYW1ze2hlaWdodH0gPSAkZGVmYXVsdF9oZWlnaHQgaWYgbm90ICRwYXJhbXN7aGVpZ2h0fTsKKworCisgICAgIyBDaGVjayB0aGF0IHV0ZjE2IHN0cmluZ3MgaGF2ZSBhbiBldmVuIG51bWJlciBvZiBieXRlcy4KKyAgICBpZiAoJHBhcmFtc3tlbmNvZGluZ30pIHsKKyAgICAgICAgY3JvYWsgIlVuZXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gY29tbWVudCBzdHJpbmciCisgICAgICAgICAgICAgICBpZiBsZW5ndGgoJHN0cmluZykgJSAyOworCisgICAgICAgICMgQ2hhbmdlIGZyb20gVVRGLTE2QkUgdG8gVVRGLTE2TEUKKyAgICAgICAgJHN0cmluZyA9IHBhY2sgJ3YqJywgdW5wYWNrICduKicsICRzdHJpbmc7CisgICAgfQorCisgICAgaWYgKCRwYXJhbXN7YXV0aG9yX2VuY29kaW5nfSkgeworICAgICAgICBjcm9hayAiVW5ldmVuIG51bWJlciBvZiBieXRlcyBpbiBhdXRob3Igc3RyaW5nIgorICAgICAgICAgICAgICAgIGlmIGxlbmd0aCgkcGFyYW1ze2F1dGhvcn0pICUgMjsKKworICAgICAgICAjIENoYW5nZSBmcm9tIFVURi0xNkJFIHRvIFVURi0xNkxFCisgICAgICAgICRwYXJhbXN7YXV0aG9yfSA9IHBhY2sgJ3YqJywgdW5wYWNrICduKicsICRwYXJhbXN7YXV0aG9yfTsKKyAgICB9CisKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyaW5nKSkgeworICAgICAgICAgICAgJHN0cmluZyA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZMRSIsICRzdHJpbmcpOworICAgICAgICAgICAgJHBhcmFtc3tlbmNvZGluZ30gPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkcGFyYW1ze2F1dGhvcn0pKSB7CisgICAgICAgICAgICAkcGFyYW1ze2F1dGhvcn0gPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkcGFyYW1ze2F1dGhvcn0pOworICAgICAgICAgICAgJHBhcmFtc3thdXRob3JfZW5jb2Rpbmd9ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBMaW1pdCB0aGUgc3RyaW5nIHRvIHRoZSBtYXggbnVtYmVyIG9mIGNoYXJzIChub3QgYnl0ZXMpLgorICAgIG15ICRtYXhfbGVuICA9IDMyNzY3OworICAgICAgICRtYXhfbGVuICo9IDIgaWYgJHBhcmFtc3tlbmNvZGluZ307CisKKyAgICBpZiAobGVuZ3RoKCRzdHJpbmcpID4gJG1heF9sZW4pIHsKKyAgICAgICAgJHN0cmluZyAgICAgICA9IHN1YnN0cigkc3RyaW5nLCAwLCAkbWF4X2xlbik7CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgY29tbWVudCBiYWNrZ3JvdW5kIGNvbG91ci4KKyAgICBteSAkY29sb3IgICAgICAgPSAkcGFyYW1ze2NvbG9yfTsKKyAgICAgICAkY29sb3IgICAgICAgPSAmU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdDo6X2dldF9jb2xvcigkY29sb3IpOworICAgICAgICRjb2xvciAgICAgICA9IDB4NTAgaWYgJGNvbG9yID09IDB4N0ZGRjsgIyBEZWZhdWx0IGNvbG9yLgorICAgICRwYXJhbXN7Y29sb3J9ICA9ICRjb2xvcjsKKworCisgICAgIyBDb252ZXJ0IGEgY2VsbCByZWZlcmVuY2UgdG8gYSByb3cgYW5kIGNvbHVtbi4KKyAgICBpZiAoZGVmaW5lZCAkcGFyYW1ze3N0YXJ0X2NlbGx9KSB7CisgICAgICAgIG15ICgkcm93LCAkY29sKSAgICA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKCRwYXJhbXN7c3RhcnRfY2VsbH0pOworICAgICAgICAkcGFyYW1ze3N0YXJ0X3Jvd30gPSAkcm93OworICAgICAgICAkcGFyYW1ze3N0YXJ0X2NvbH0gPSAkY29sOworICAgIH0KKworCisgICAgIyBTZXQgdGhlIGRlZmF1bHQgc3RhcnQgY2VsbCBhbmQgb2Zmc2V0cyBmb3IgdGhlIGNvbW1lbnQuIFRoZXNlIGFyZQorICAgICMgZ2VuZXJhbGx5IGZpeGVkIGluIHJlbGF0aW9uIHRvIHRoZSBwYXJlbnQgY2VsbC4gSG93ZXZlciB0aGVyZSBhcmUKKyAgICAjIHNvbWUgZWRnZSBjYXNlcyBmb3IgY2VsbHMgYXQgdGhlLCBlciwgZWRnZXMuCisgICAgIworICAgIGlmIChub3QgZGVmaW5lZCAkcGFyYW1ze3N0YXJ0X3Jvd30pIHsKKworICAgICAgICBpZiAgICAoJHJvdyA9PSAwICAgICkgeyRwYXJhbXN7c3RhcnRfcm93fSA9IDAgICAgICB9CisgICAgICAgIGVsc2lmICgkcm93ID09IDY1NTMzKSB7JHBhcmFtc3tzdGFydF9yb3d9ID0gNjU1MjkgIH0KKyAgICAgICAgZWxzaWYgKCRyb3cgPT0gNjU1MzQpIHskcGFyYW1ze3N0YXJ0X3Jvd30gPSA2NTUzMCAgfQorICAgICAgICBlbHNpZiAoJHJvdyA9PSA2NTUzNSkgeyRwYXJhbXN7c3RhcnRfcm93fSA9IDY1NTMxICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICB7JHBhcmFtc3tzdGFydF9yb3d9ID0gJHJvdyAtMX0KKyAgICB9CisKKyAgICBpZiAobm90IGRlZmluZWQgJHBhcmFtc3t5X29mZnNldH0pIHsKKworICAgICAgICBpZiAgICAoJHJvdyA9PSAwICAgICkgeyRwYXJhbXN7eV9vZmZzZXR9ICA9IDIgICAgICB9CisgICAgICAgIGVsc2lmICgkcm93ID09IDY1NTMzKSB7JHBhcmFtc3t5X29mZnNldH0gID0gNCAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRyb3cgPT0gNjU1MzQpIHskcGFyYW1ze3lfb2Zmc2V0fSAgPSA0ICAgICAgfQorICAgICAgICBlbHNpZiAoJHJvdyA9PSA2NTUzNSkgeyRwYXJhbXN7eV9vZmZzZXR9ICA9IDIgICAgICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICB7JHBhcmFtc3t5X29mZnNldH0gID0gNyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobm90IGRlZmluZWQgJHBhcmFtc3tzdGFydF9jb2x9KSB7CisKKyAgICAgICAgaWYgICAgKCRjb2wgPT0gMjUzICApIHskcGFyYW1ze3N0YXJ0X2NvbH0gPSAyNTAgICAgfQorICAgICAgICBlbHNpZiAoJGNvbCA9PSAyNTQgICkgeyRwYXJhbXN7c3RhcnRfY29sfSA9IDI1MSAgICB9CisgICAgICAgIGVsc2lmICgkY29sID09IDI1NSAgKSB7JHBhcmFtc3tzdGFydF9jb2x9ID0gMjUyICAgIH0KKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgIHskcGFyYW1ze3N0YXJ0X2NvbH0gPSAkY29sICsxfQorICAgIH0KKworICAgIGlmIChub3QgZGVmaW5lZCAkcGFyYW1ze3hfb2Zmc2V0fSkgeworCisgICAgICAgIGlmICAgICgkY29sID09IDI1MyAgKSB7JHBhcmFtc3t4X29mZnNldH0gID0gNDkgICAgIH0KKyAgICAgICAgZWxzaWYgKCRjb2wgPT0gMjU0ICApIHskcGFyYW1ze3hfb2Zmc2V0fSAgPSA0OSAgICAgfQorICAgICAgICBlbHNpZiAoJGNvbCA9PSAyNTUgICkgeyRwYXJhbXN7eF9vZmZzZXR9ICA9IDQ5ICAgICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICB7JHBhcmFtc3t4X29mZnNldH0gID0gMTUgICAgIH0KKyAgICB9CisKKworICAgICMgU2NhbGUgdGhlIHNpemUgb2YgdGhlIGNvbW1lbnQgYm94IGlmIHJlcXVpcmVkLgorICAgIGlmICgkcGFyYW1ze3hfc2NhbGV9KSB7CisgICAgICAgICRwYXJhbXN7d2lkdGh9ICA9ICRwYXJhbXN7d2lkdGh9ICAqICRwYXJhbXN7eF9zY2FsZX07CisgICAgfQorCisgICAgaWYgKCRwYXJhbXN7eV9zY2FsZX0pIHsKKyAgICAgICAgJHBhcmFtc3toZWlnaHR9ID0gJHBhcmFtc3toZWlnaHR9ICogJHBhcmFtc3t5X3NjYWxlfTsKKyAgICB9CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbnMgb2YgY29tbWVudCBvYmplY3QuCisgICAgbXkgQHZlcnRpY2VzID0gJHNlbGYtPl9wb3NpdGlvbl9vYmplY3QoICRwYXJhbXN7c3RhcnRfY29sfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc3tzdGFydF9yb3d9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ze3hfb2Zmc2V0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc3t5X29mZnNldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXN7d2lkdGh9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ze2hlaWdodH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICByZXR1cm4oCisgICAgICAgICAgICRyb3csCisgICAgICAgICAgICRjb2wsCisgICAgICAgICAgICRzdHJpbmcsCisgICAgICAgICAgICRwYXJhbXN7ZW5jb2Rpbmd9LAorICAgICAgICAgICAkcGFyYW1ze2F1dGhvcn0sCisgICAgICAgICAgICRwYXJhbXN7YXV0aG9yX2VuY29kaW5nfSwKKyAgICAgICAgICAgJHBhcmFtc3t2aXNpYmxlfSwKKyAgICAgICAgICAgJHBhcmFtc3tjb2xvcn0sCisgICAgICAgICAgIFtAdmVydGljZXNdCisgICAgICAgICAgKTsKK30KKworCisKKyMKKyMgREFUQSBWQUxJREFUSU9OCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZGF0YV92YWxpZGF0aW9uKCRyb3csICRjb2wsIHsuLi59KQorIworIyBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBpbnRlcmZhY2UgdG8gRXhjZWwgZGF0YSB2YWxpZGF0aW9uLgorIyBTb21ld2hhdCBpcm9uaWNhbGx5IHRoZSB0aGlzIHJlcXVpcmVzIGEgbG90IG9mIHZhbGlkYXRpb24gY29kZSBzaW5jZSB0aGUKKyMgaW50ZXJmYWNlIGlzIGZsZXhpYmxlIGFuZCBjb3ZlcnMgYSBzZXZlcmFsIHR5cGVzIG9mIGRhdGEgdmFsaWRhdGlvbi4KKyMKKyMgV2UgYWxsb3cgZGF0YSB2YWxpZGF0aW9uIHRvIGJlIGNhbGxlZCBvbiBvbmUgY2VsbCBvciBhIHJhbmdlIG9mIGNlbGxzLiBUaGUKKyMgaGFzaHJlZiBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzIGFuZCBtdXN0IGJlIHRoZSBsYXN0IHBhcmFtOgorIyAgICBkYXRhX3ZhbGlkYXRpb24oJHJvdywgJGNvbCwgey4uLn0pCisjICAgIGRhdGFfdmFsaWRhdGlvbigkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCwgey4uLn0pCisjCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIyAgICAgICAgIC0zIDogaW5jb3JyZWN0IHBhcmFtZXRlci4KKyMKK3N1YiBkYXRhX3ZhbGlkYXRpb24geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgIyBDaGVjayBmb3IgYSB2YWxpZCBudW1iZXIgb2YgYXJncy4KKyAgICBpZiAoQF8gIT0gNSAmJiBAXyAhPSAzKSB7IHJldHVybiAtMSB9CisKKyAgICAjIFRoZSBmaW5hbCBoYXNocmVmIGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIHBhcmFtZXRlcnMuCisgICAgbXkgJHBhcmFtID0gcG9wOworCisgICAgIyBNYWtlIHRoZSBsYXN0IHJvdy9jb2wgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGlmIG5vdCBkZWZpbmVkLgorICAgIG15ICgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMikgPSBAXzsKKyAgICBpZiAoIWRlZmluZWQgJHJvdzIpIHsKKyAgICAgICAgJHJvdzIgPSAkcm93MTsKKyAgICAgICAgJGNvbDIgPSAkY29sMTsKKyAgICB9CisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIHdpdGhvdXQgc3RvcmluZyB0aGUgdmFsdWVzLgorICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdzEsICRjb2wxLCAxLCAxKTsKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3cyLCAkY29sMiwgMSwgMSk7CisKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgbGFzdCBwYXJhbWV0ZXIgaXMgYSBoYXNoIGxpc3QuCisgICAgaWYgKHJlZiAkcGFyYW0gbmUgJ0hBU0gnKSB7CisgICAgICAgIGNhcnAgIkxhc3QgcGFyYW1ldGVyICckcGFyYW0nIGluIGRhdGFfdmFsaWRhdGlvbigpIG11c3QgYmUgYSBoYXNoIHJlZiI7CisgICAgICAgIHJldHVybiAtMzsKKyAgICB9CisKKyAgICAjIExpc3Qgb2YgdmFsaWQgaW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAldmFsaWRfcGFyYW1ldGVyID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0gICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlX2JsYW5rICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2lucHV0ICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdGl0bGUgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X21lc3NhZ2UgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2Vycm9yICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdGl0bGUgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl90eXBlICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY2VsbHMgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlucHV0IHBhcmFtZXRlcnMuCisgICAgZm9yIG15ICRwYXJhbV9rZXkgKGtleXMgJSRwYXJhbSkgeworICAgICAgICBpZiAobm90IGV4aXN0cyAkdmFsaWRfcGFyYW1ldGVyeyRwYXJhbV9rZXl9KSB7CisgICAgICAgICAgICBjYXJwICJVbmtub3duIHBhcmFtZXRlciAnJHBhcmFtX2tleScgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICAgICAgcmV0dXJuIC0zOworICAgICAgICB9CisgICAgfQorCisgICAgIyBNYXAgYWx0ZXJuYXRpdmUgcGFyYW1ldGVyIG5hbWVzICdzb3VyY2UnIG9yICdtaW5pbXVtJyB0byAndmFsdWUnLgorICAgICRwYXJhbS0+e3ZhbHVlfSA9ICRwYXJhbS0+e3NvdXJjZX0gIGlmIGRlZmluZWQgJHBhcmFtLT57c291cmNlfTsKKyAgICAkcGFyYW0tPnt2YWx1ZX0gPSAkcGFyYW0tPnttaW5pbXVtfSBpZiBkZWZpbmVkICRwYXJhbS0+e21pbmltdW19OworCisgICAgIyAndmFsaWRhdGUnIGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyLgorICAgIGlmIChub3QgZXhpc3RzICRwYXJhbS0+e3ZhbGlkYXRlfSkgeworICAgICAgICBjYXJwICJQYXJhbWV0ZXIgJ3ZhbGlkYXRlJyBpcyByZXF1aXJlZCBpbiBkYXRhX3ZhbGlkYXRpb24oKSI7CisgICAgICAgIHJldHVybiAtMzsKKyAgICB9CisKKworICAgICMgTGlzdCBvZiAgdmFsaWQgdmFsaWRhdGlvbiB0eXBlcy4KKyAgICBteSAldmFsaWRfdHlwZSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbnknICAgICAgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW55IHZhbHVlJyAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dob2xlIG51bWJlcicgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aG9sZScgICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW50ZWdlcicgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwnICAgICAgICAgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaXN0JyAgICAgICAgICAgID0+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0ZScgICAgICAgICAgICA9PiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWUnICAgICAgICAgICAgPT4gNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0IGxlbmd0aCcgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVuZ3RoJyAgICAgICAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbScgICAgICAgICAgPT4gNywKKyAgICAgICAgICAgICAgICAgICAgICApOworCisKKyAgICAjIENoZWNrIGZvciB2YWxpZCB2YWxpZGF0aW9uIHR5cGVzLgorICAgIGlmIChub3QgZXhpc3RzICR2YWxpZF90eXBle2xjKCRwYXJhbS0+e3ZhbGlkYXRlfSl9KSB7CisgICAgICAgIGNhcnAgIlVua25vd24gdmFsaWRhdGlvbiB0eXBlICckcGFyYW0tPnt2YWxpZGF0ZX0nIGZvciBwYXJhbWV0ZXIgIiAuCisgICAgICAgICAgICAgIid2YWxpZGF0ZScgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGFyYW0tPnt2YWxpZGF0ZX0gPSAkdmFsaWRfdHlwZXtsYygkcGFyYW0tPnt2YWxpZGF0ZX0pfTsKKyAgICB9CisKKworICAgICMgTm8gYWN0aW9uIGlzIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uIHR5cGUgJ2FueScuCisgICAgIyBUT0RPOiB3ZSBzaG91bGQgcGVyaGFwcyBzdG9yZSAnYW55JyBmb3IgbWVzc2FnZSBvbmx5IHZhbGlkYXRpb25zLgorICAgIHJldHVybiAwIGlmICRwYXJhbS0+e3ZhbGlkYXRlfSA9PSAwOworCisKKyAgICAjIFRoZSBsaXN0IGFuZCBjdXN0b20gdmFsaWRhdGlvbnMgZG9uJ3QgaGF2ZSBhIGNyaXRlcmlhIHNvIHdlIHVzZSBhIGRlZmF1bHQKKyAgICAjIG9mICdiZXR3ZWVuJy4KKyAgICBpZiAoJHBhcmFtLT57dmFsaWRhdGV9ID09IDMgfHwgJHBhcmFtLT57dmFsaWRhdGV9ID09IDcpIHsKKyAgICAgICAgJHBhcmFtLT57Y3JpdGVyaWF9ICA9ICdiZXR3ZWVuJzsKKyAgICAgICAgJHBhcmFtLT57bWF4aW11bX0gICA9IHVuZGVmOworICAgIH0KKworICAgICMgJ2NyaXRlcmlhJyBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4KKyAgICBpZiAobm90IGV4aXN0cyAkcGFyYW0tPntjcml0ZXJpYX0pIHsKKyAgICAgICAgY2FycCAiUGFyYW1ldGVyICdjcml0ZXJpYScgaXMgcmVxdWlyZWQgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorCisKKyAgICAjIExpc3Qgb2YgdmFsaWQgY3JpdGVyaWEgdHlwZXMuCisgICAgbXkgJWNyaXRlcmlhX3R5cGUgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmV0d2VlbicgICAgICAgICAgICAgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdCBiZXR3ZWVuJyAgICAgICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcXVhbCB0bycgICAgICAgICAgICAgICAgICAgID0+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz09JyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3QgZXF1YWwgdG8nICAgICAgICAgICAgICAgID0+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIT0nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzw+JyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdncmVhdGVyIHRoYW4nICAgICAgICAgICAgICAgID0+IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlc3MgdGhhbicgICAgICAgICAgICAgICAgICAgPT4gNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8JyAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvJyAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz49JyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsZXNzIHRoYW4gb3IgZXF1YWwgdG8nICAgICAgID0+IDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPD0nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiA3LAorICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIENoZWNrIGZvciB2YWxpZCBjcml0ZXJpYSB0eXBlcy4KKyAgICBpZiAobm90IGV4aXN0cyAkY3JpdGVyaWFfdHlwZXtsYygkcGFyYW0tPntjcml0ZXJpYX0pfSkgeworICAgICAgICBjYXJwICJVbmtub3duIGNyaXRlcmlhIHR5cGUgJyRwYXJhbS0+e2NyaXRlcmlhfScgZm9yIHBhcmFtZXRlciAiIC4KKyAgICAgICAgICAgICAiJ2NyaXRlcmlhJyBpbiBkYXRhX3ZhbGlkYXRpb24oKSI7CisgICAgICAgIHJldHVybiAtMzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRwYXJhbS0+e2NyaXRlcmlhfSA9ICRjcml0ZXJpYV90eXBle2xjKCRwYXJhbS0+e2NyaXRlcmlhfSl9OworICAgIH0KKworCisgICAgIyAnQmV0d2VlbicgYW5kICdOb3QgYmV0d2VlbicgY3JpdGVyaWEgcmVxdWlyZSAyIHZhbHVlcy4KKyAgICBpZiAoJHBhcmFtLT57Y3JpdGVyaWF9ID09IDAgfHwgJHBhcmFtLT57Y3JpdGVyaWF9ID09IDEpIHsKKyAgICAgICAgaWYgKG5vdCBleGlzdHMgJHBhcmFtLT57bWF4aW11bX0pIHsKKyAgICAgICAgICAgIGNhcnAgIlBhcmFtZXRlciAnbWF4aW11bScgaXMgcmVxdWlyZWQgaW4gZGF0YV92YWxpZGF0aW9uKCkgIiAuCisgICAgICAgICAgICAgICAgICJ3aGVuIHVzaW5nICdiZXR3ZWVuJyBvciAnbm90IGJldHdlZW4nIGNyaXRlcmlhIjsKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHBhcmFtLT57bWF4aW11bX0gPSB1bmRlZjsKKyAgICB9CisKKworCisgICAgIyBMaXN0IG9mIHZhbGlkIGVycm9yIGRpYWxvZyB0eXBlcy4KKyAgICBteSAlZXJyb3JfdHlwZSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wJyAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmZvcm1hdGlvbicgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIENoZWNrIGZvciB2YWxpZCBlcnJvciBkaWFsb2cgdHlwZXMuCisgICAgaWYgKG5vdCBleGlzdHMgJHBhcmFtLT57ZXJyb3JfdHlwZX0pIHsKKyAgICAgICAgJHBhcmFtLT57ZXJyb3JfdHlwZX0gPSAwOworICAgIH0KKyAgICBlbHNpZiAobm90IGV4aXN0cyAkZXJyb3JfdHlwZXtsYygkcGFyYW0tPntlcnJvcl90eXBlfSl9KSB7CisgICAgICAgIGNhcnAgIlVua25vd24gY3JpdGVyaWEgdHlwZSAnJHBhcmFtLT57ZXJyb3JfdHlwZX0nIGZvciBwYXJhbWV0ZXIgIiAuCisgICAgICAgICAgICAgIidlcnJvcl90eXBlJyBpbiBkYXRhX3ZhbGlkYXRpb24oKSI7CisgICAgICAgIHJldHVybiAtMzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRwYXJhbS0+e2Vycm9yX3R5cGV9ID0gJGVycm9yX3R5cGV7bGMoJHBhcmFtLT57ZXJyb3JfdHlwZX0pfTsKKyAgICB9CisKKworICAgICMgQ29udmVydCBkYXRlL3RpbWVzIHZhbHVlIGlmIHJlcXVpcmVkLgorICAgIGlmICgkcGFyYW0tPnt2YWxpZGF0ZX0gPT0gNCB8fCAkcGFyYW0tPnt2YWxpZGF0ZX0gPT0gNSkgeworICAgICAgICBpZiAoJHBhcmFtLT57dmFsdWV9ID1+IC9ULykgeworICAgICAgICAgICAgbXkgJGRhdGVfdGltZSA9ICRzZWxmLT5jb252ZXJ0X2RhdGVfdGltZSgkcGFyYW0tPnt2YWx1ZX0pOworCisgICAgICAgICAgICBpZiAoIWRlZmluZWQgJGRhdGVfdGltZSkgeworICAgICAgICAgICAgICAgIGNhcnAgIkludmFsaWQgZGF0ZS90aW1lIHZhbHVlICckcGFyYW0tPnt2YWx1ZX0nICIgLgorICAgICAgICAgICAgICAgICAgICAgImluIGRhdGFfdmFsaWRhdGlvbigpIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkcGFyYW0tPnt2YWx1ZX0gPSAkZGF0ZV90aW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZWZpbmVkICRwYXJhbS0+e21heGltdW19ICYmICRwYXJhbS0+e21heGltdW19ID1+IC9ULykgeworICAgICAgICAgICAgbXkgJGRhdGVfdGltZSA9ICRzZWxmLT5jb252ZXJ0X2RhdGVfdGltZSgkcGFyYW0tPnttYXhpbXVtfSk7CisKKyAgICAgICAgICAgIGlmICghZGVmaW5lZCAkZGF0ZV90aW1lKSB7CisgICAgICAgICAgICAgICAgY2FycCAiSW52YWxpZCBkYXRlL3RpbWUgdmFsdWUgJyRwYXJhbS0+e21heGltdW19JyAiIC4KKyAgICAgICAgICAgICAgICAgICAgICJpbiBkYXRhX3ZhbGlkYXRpb24oKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJHBhcmFtLT57bWF4aW11bX0gPSAkZGF0ZV90aW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAjIFNldCBzb21lIGRlZmF1bHRzIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIuCisgICAgJHBhcmFtLT57aWdub3JlX2JsYW5rfSAgPSAxIGlmICFkZWZpbmVkICRwYXJhbS0+e2lnbm9yZV9ibGFua307CisgICAgJHBhcmFtLT57ZHJvcGRvd259ICAgICAgPSAxIGlmICFkZWZpbmVkICRwYXJhbS0+e2Ryb3Bkb3dufTsKKyAgICAkcGFyYW0tPntzaG93X2lucHV0fSAgICA9IDEgaWYgIWRlZmluZWQgJHBhcmFtLT57c2hvd19pbnB1dH07CisgICAgJHBhcmFtLT57c2hvd19lcnJvcn0gICAgPSAxIGlmICFkZWZpbmVkICRwYXJhbS0+e3Nob3dfZXJyb3J9OworCisKKyAgICAjIFRoZXNlIGFyZSB0aGUgY2VsbHMgdG8gd2hpY2ggdGhlIHZhbGlkYXRpb24gaXMgYXBwbGllZC4KKyAgICAkcGFyYW0tPntjZWxsc30gPSBbWyRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyXV07CisKKyAgICAjIEEgKGZvciBub3cpIHVuZG9jdW1lbnRlZCBwYXJhbWV0ZXIgdG8gcGFzcyBhZGRpdGlvbmFsIGNlbGwgcmFuZ2VzLgorICAgIGlmIChleGlzdHMgJHBhcmFtLT57b3RoZXJfY2VsbHN9KSB7CisKKyAgICAgICAgcHVzaCBAeyRwYXJhbS0+e2NlbGxzfX0sIEB7JHBhcmFtLT57b3RoZXJfY2VsbHN9fTsKKyAgICB9CisKKyAgICAjIFN0b3JlIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIHVudGlsIHdlIGNsb3NlIHRoZSB3b3Jrc2hlZXQuCisgICAgcHVzaCBAeyRzZWxmLT57X3ZhbGlkYXRpb25zfX0sICRwYXJhbTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV92YWxpZGF0aW9uX2NvdW50KCkKKyMKKyMgU3RvcmUgdGhlIGNvdW50IG9mIHRoZSBEViByZWNvcmRzIHRvIGZvbGxvdy4KKyMKKyMgTm90ZSwgdGhpcyBjb3VsZCBiZSB3cmFwcGVkIGludG8gX3N0b3JlX2R2KCkgYnV0IHdlIG1heSByZXF1aXJlIHNlcGFyYXRlCisjIGhhbmRsaW5nIG9mIHRoZSBvYmplY3QgaWQgYXQgYSBsYXRlciBzdGFnZS4KKyMKK3N1YiBfc3RvcmVfdmFsaWRhdGlvbl9jb3VudCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGR2X2NvdW50ID0gQHskc2VsZi0+e192YWxpZGF0aW9uc319OworICAgIG15ICRvYmpfaWQgICA9IC0xOworCisgICAgcmV0dXJuIHVubGVzcyAkZHZfY291bnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2R2YWwoJG9ial9pZCAsICRkdl9jb3VudCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmFsaWRhdGlvbnMoKQorIworIyBTdG9yZSB0aGUgZGF0YV92YWxpZGF0aW9uIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX3ZhbGlkYXRpb25zIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5sZXNzIHNjYWxhciBAeyRzZWxmLT57X3ZhbGlkYXRpb25zfX07CisKKyAgICBmb3IgbXkgJHBhcmFtIChAeyRzZWxmLT57X3ZhbGlkYXRpb25zfX0pIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9kdiggICAkcGFyYW0tPntjZWxsc30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57dmFsaWRhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e2NyaXRlcmlhfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPnt2YWx1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57bWF4aW11bX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57aW5wdXRfdGl0bGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e2lucHV0X21lc3NhZ2V9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e2Vycm9yX3RpdGxlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntlcnJvcl9tZXNzYWdlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntlcnJvcl90eXBlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntpZ25vcmVfYmxhbmt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e2Ryb3Bkb3dufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntzaG93X2lucHV0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntzaG93X2Vycm9yfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kdmFsKCkKKyMKKyMgU3RvcmUgdGhlIERWIHJlY29yZCB3aGljaCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGFuZCBpbmZvcm1hdGlvbiBjb21tb24gdG8KKyMgYWxsIERWIHN0cnVjdHVyZXMuCisjCitzdWIgX3N0b3JlX2R2YWwgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjI7ICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMTI7ICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkb2JqX2lkICAgICAgPSAkX1swXTsgICAgICAgICMgT2JqZWN0IElEIG51bWJlci4KKyAgICBteSAkZHZfY291bnQgICAgPSAkX1sxXTsgICAgICAgICMgQ291bnQgb2YgRFYgc3RydWN0cyB0byBmb2xsb3cuCisKKyAgICBteSAkZmxhZ3MgICAgICAgPSAweDAwMDQ7ICAgICAgICMgT3B0aW9uIGZsYWdzLgorICAgIG15ICR4X2Nvb3JkICAgICA9IDB4MDAwMDAwMDA7ICAgIyBYIGNvb3JkIG9mIGlucHV0IGJveC4KKyAgICBteSAkeV9jb29yZCAgICAgPSAweDAwMDAwMDAwOyAgICMgWSBjb29yZCBvZiBpbnB1dCBib3guCisKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRoZWFkZXIgPSBwYWNrKCd2dicsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgPSBwYWNrKCd2VlZWVicsICRmbGFncywgJHhfY29vcmQsICR5X2Nvb3JkLCAkb2JqX2lkLCAkZHZfY291bnQpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2R2KCkKKyMKKyMgU3RvcmUgdGhlIERWIHJlY29yZCB0aGF0IHNwZWNpZmllcyB0aGUgZGF0YSB2YWxpZGF0aW9uIGNyaXRlcmlhIGFuZCBvcHRpb25zCisjIGZvciBhIHJhbmdlIG9mIGNlbGxzLi4KKyMKK3N1YiBfc3RvcmVfZHYgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDFCRTsgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDA7ICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZmxhZ3MgICAgICAgICAgID0gMHgwMDAwMDAwMDsgICAjIERWIG9wdGlvbiBmbGFncy4KKworICAgIG15ICRjZWxscyAgICAgICAgICAgPSAkX1swXTsgICAgICAgICMgQXJlZiBvZiBjZWxscyB0byB3aGljaCBEViBhcHBsaWVzLgorICAgIG15ICR2YWxpZGF0aW9uX3R5cGUgPSAkX1sxXTsgICAgICAgICMgVHlwZSBvZiBkYXRhIHZhbGlkYXRpb24uCisgICAgbXkgJGNyaXRlcmlhX3R5cGUgICA9ICRfWzJdOyAgICAgICAgIyBWYWxpZGF0aW9uIGNyaXRlcmlhLgorICAgIG15ICRmb3JtdWxhXzEgICAgICAgPSAkX1szXTsgICAgICAgICMgVmFsdWUvU291cmNlL01pbmltdW0gZm9ybXVsYS4KKyAgICBteSAkZm9ybXVsYV8yICAgICAgID0gJF9bNF07ICAgICAgICAjIE1heGltdW0gZm9ybXVsYS4KKyAgICBteSAkaW5wdXRfdGl0bGUgICAgID0gJF9bNV07ICAgICAgICAjIFRpdGxlIG9mIGlucHV0IG1lc3NhZ2UuCisgICAgbXkgJGlucHV0X21lc3NhZ2UgICA9ICRfWzZdOyAgICAgICAgIyBUZXh0IG9mIGlucHV0IG1lc3NhZ2UuCisgICAgbXkgJGVycm9yX3RpdGxlICAgICA9ICRfWzddOyAgICAgICAgIyBUaXRsZSBvZiBlcnJvciBtZXNzYWdlLgorICAgIG15ICRlcnJvcl9tZXNzYWdlICAgPSAkX1s4XTsgICAgICAgICMgVGV4dCBvZiBpbnB1dCBtZXNzYWdlLgorICAgIG15ICRlcnJvcl90eXBlICAgICAgPSAkX1s5XTsgICAgICAgICMgRXJyb3IgZGlhbG9nIHR5cGUuCisgICAgbXkgJGlnbm9yZV9ibGFuayAgICA9ICRfWzEwXTsgICAgICAgIyBJZ25vcmUgYmxhbmsgY2VsbHMuCisgICAgbXkgJGRyb3Bkb3duICAgICAgICA9ICRfWzExXTsgICAgICAgIyBEaXNwbGF5IGRyb3Bkb3duIHdpdGggbGlzdC4KKyAgICBteSAkaW5wdXRfYm94ICAgICAgID0gJF9bMTJdOyAgICAgICAjIERpc3BsYXkgaW5wdXQgYm94LgorICAgIG15ICRlcnJvcl9ib3ggICAgICAgPSAkX1sxM107ICAgICAgICMgRGlzcGxheSBlcnJvciBib3guCisgICAgbXkgJGltZV9tb2RlICAgICAgICA9IDA7ICAgICAgICAgICAgIyBJTUUgaW5wdXQgbW9kZSBmb3IgZmFyIGVhc3QgZm9udHMuCisgICAgbXkgJHN0cl9sb29rdXAgICAgICA9IDA7ICAgICAgICAgICAgIyBTZWUgYmVsb3cuCisKKyAgICAjIFNldCB0aGUgc3RyaW5nIGxvb2t1cCBmbGFnIGZvciAnbGlzdCcgdmFsaWRhdGlvbnMgd2l0aCBhIHN0cmluZyBhcnJheS4KKyAgICBpZiAoJHZhbGlkYXRpb25fdHlwZSA9PSAzICYmIHJlZiAkZm9ybXVsYV8xIGVxICdBUlJBWScpICB7CisgICAgICAgICRzdHJfbG9va3VwID0gMTsKKyAgICB9CisKKyAgICAjIFRoZSBkcm9wZG93biBmbGFnIGlzIHN0b3JlZCBhcyBhIG5lZ2F0ZWQgdmFsdWUuCisgICAgbXkgJG5vX2Ryb3Bkb3duID0gbm90ICRkcm9wZG93bjsKKworICAgICMgU2V0IHRoZSByZXF1aXJlZCBmbGFncy4KKyAgICAkZmxhZ3MgfD0gJHZhbGlkYXRpb25fdHlwZTsKKyAgICAkZmxhZ3MgfD0gJGVycm9yX3R5cGUgICAgICAgPDwgNDsKKyAgICAkZmxhZ3MgfD0gJHN0cl9sb29rdXAgICAgICAgPDwgNzsKKyAgICAkZmxhZ3MgfD0gJGlnbm9yZV9ibGFuayAgICAgPDwgODsKKyAgICAkZmxhZ3MgfD0gJG5vX2Ryb3Bkb3duICAgICAgPDwgOTsKKyAgICAkZmxhZ3MgfD0gJGltZV9tb2RlICAgICAgICAgPDwgMTA7CisgICAgJGZsYWdzIHw9ICRpbnB1dF9ib3ggICAgICAgIDw8IDE4OworICAgICRmbGFncyB8PSAkZXJyb3JfYm94ICAgICAgICA8PCAxOTsKKyAgICAkZmxhZ3MgfD0gJGNyaXRlcmlhX3R5cGUgICAgPDwgMjA7CisKKyAgICAjIFBhY2sgdGhlIHZhbGlkYXRpb24gZm9ybXVsYXMuCisgICAgJGZvcm11bGFfMSA9ICRzZWxmLT5fcGFja19kdl9mb3JtdWxhKCRmb3JtdWxhXzEpOworICAgICRmb3JtdWxhXzIgPSAkc2VsZi0+X3BhY2tfZHZfZm9ybXVsYSgkZm9ybXVsYV8yKTsKKworICAgICMgUGFjayB0aGUgaW5wdXQgYW5kIGVycm9yIGRpYWxvZyBzdHJpbmdzLgorICAgICRpbnB1dF90aXRsZSAgID0gJHNlbGYtPl9wYWNrX2R2X3N0cmluZygkaW5wdXRfdGl0bGUsICAgMzIgKTsKKyAgICAkZXJyb3JfdGl0bGUgICA9ICRzZWxmLT5fcGFja19kdl9zdHJpbmcoJGVycm9yX3RpdGxlLCAgIDMyICk7CisgICAgJGlucHV0X21lc3NhZ2UgPSAkc2VsZi0+X3BhY2tfZHZfc3RyaW5nKCRpbnB1dF9tZXNzYWdlLCAyNTUpOworICAgICRlcnJvcl9tZXNzYWdlID0gJHNlbGYtPl9wYWNrX2R2X3N0cmluZygkZXJyb3JfbWVzc2FnZSwgMjU1KTsKKworICAgICMgUGFjayB0aGUgRFYgY2VsbCBkYXRhLgorICAgIG15ICRkdl9jb3VudCA9IHNjYWxhciBAJGNlbGxzOworICAgIG15ICRkdl9kYXRhICA9IHBhY2sgJ3YnLCAkZHZfY291bnQ7CisgICAgZm9yIG15ICRyYW5nZSAoQCRjZWxscykgeworICAgICAgICAkZHZfZGF0YSAuPSBwYWNrICd2dnZ2JywgJHJhbmdlLT5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmFuZ2UtPlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyYW5nZS0+WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJhbmdlLT5bM107CisgICAgfQorCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGRhdGEgICA9IHBhY2sgJ1YnLCAkZmxhZ3M7CisgICAgICAgJGRhdGEgIC49ICRpbnB1dF90aXRsZTsKKyAgICAgICAkZGF0YSAgLj0gJGVycm9yX3RpdGxlOworICAgICAgICRkYXRhICAuPSAkaW5wdXRfbWVzc2FnZTsKKyAgICAgICAkZGF0YSAgLj0gJGVycm9yX21lc3NhZ2U7CisgICAgICAgJGRhdGEgIC49ICRmb3JtdWxhXzE7CisgICAgICAgJGRhdGEgIC49ICRmb3JtdWxhXzI7CisgICAgICAgJGRhdGEgIC49ICRkdl9kYXRhOworCisgICAgbXkgJGhlYWRlciA9IHBhY2soJ3Z2JywgJHJlY29yZCwgbGVuZ3RoICRkYXRhKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX2R2X3N0cmluZygpCisjCisjIFBhY2sgdGhlIHN0cmluZ3MgdXNlZCBpbiB0aGUgaW5wdXQgYW5kIGVycm9yIGRpYWxvZyBjYXB0aW9ucyBhbmQgbWVzc2FnZXMuCisjIENhcHRpb25zIGFyZSBsaW1pdGVkIHRvIDMyIGNoYXJhY3RlcnMuIE1lc3NhZ2VzIGFyZSBsaW1pdGVkIHRvIDI1NSBjaGFycy4KKyMKK3N1YiBfcGFja19kdl9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkc3RyaW5nICAgICAgPSAkX1swXTsKKyAgICBteSAkbWF4X2xlbmd0aCAgPSAkX1sxXTsKKworICAgIG15ICRzdHJfbGVuZ3RoICA9IDA7CisgICAgbXkgJGVuY29kaW5nICAgID0gMDsKKworICAgICMgVGhlIGRlZmF1bHQgZW1wdHkgc3RyaW5nIGlzICJcMCIuCisgICAgaWYgKCFkZWZpbmVkICRzdHJpbmcgfHwgJHN0cmluZyBlcSAnJykgeworICAgICAgICAkc3RyaW5nID0gIlwwIjsKKyAgICB9CisKKyAgICAjIEV4Y2VsIGxpbWl0cyBEViBjYXB0aW9ucyB0byAzMiBjaGFycyBhbmQgbWVzc2FnZXMgdG8gMjU1LgorICAgIGlmIChsZW5ndGggJHN0cmluZyA+ICRtYXhfbGVuZ3RoKSB7CisgICAgICAgICRzdHJpbmcgPSBzdWJzdHIoJHN0cmluZywgMCwgJG1heF9sZW5ndGgpOworICAgIH0KKworICAgICRzdHJfbGVuZ3RoID0gbGVuZ3RoICRzdHJpbmc7CisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcGFjaygndkMnLCAkc3RyX2xlbmd0aCwgJGVuY29kaW5nKSAuICRzdHJpbmc7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19kdl9mb3JtdWxhKCkKKyMKKyMgUGFjayB0aGUgZm9ybXVsYSB1c2VkIGluIHRoZSBEViByZWNvcmQuIFRoaXMgaXMgdGhlIHNhbWUgYXMgYW4gY2VsbCBmb3JtdWxhCisjIHdpdGggc29tZSBhZGRpdGlvbmFsIGhlYWRlciBpbmZvcm1hdGlvbi4gTm90ZSwgRFYgZm9ybXVsYXMgaW4gRXhjZWwgdXNlCisjIHJlbGF0aXZlIGFkZHJlc3NpbmcgKFIxQzEgYW5kIHB0Z1h4eE4pIGhvd2V2ZXIgd2UgdXNlIHRoZSBGb3JtdWxhLnBtJ3MKKyMgZGVmYXVsdCBhYnNvbHV0ZSBhZGRyZXNzaW5nIChBMSBhbmQgcHRnWHh4KS4KKyMKK3N1YiBfcGFja19kdl9mb3JtdWxhIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJGZvcm11bGEgICAgID0gJF9bMF07CisgICAgbXkgJGVuY29kaW5nICAgID0gMDsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAwOworICAgIG15ICR1bnVzZWQgICAgICA9IDB4MDAwMDsKKyAgICBteSBAdG9rZW5zOworCisgICAgIyBSZXR1cm4gYSBkZWZhdWx0IHN0cnVjdHVyZSBmb3IgdW51c2VkIGZvcm11bGFzLgorICAgIGlmICghZGVmaW5lZCAkZm9ybXVsYSB8fCAkZm9ybXVsYSBlcSAnJykgeworICAgICAgICByZXR1cm4gcGFjaygndnYnLCAwLCAkdW51c2VkKTsKKyAgICB9CisKKyAgICAjIFBhY2sgYSBsaXN0IGFycmF5IHJlZiBhcyBhIG51bGwgc2VwYXJhdGVkIHN0cmluZy4KKyAgICBpZiAocmVmICRmb3JtdWxhIGVxICdBUlJBWScpIHsKKyAgICAgICAgJGZvcm11bGEgICA9IGpvaW4gIlwwIiwgQCRmb3JtdWxhOworICAgICAgICAkZm9ybXVsYSAgID0gcXEoIiRmb3JtdWxhIik7CisgICAgfQorCisgICAgIyBTdHJpcCB0aGUgPSBzaWduIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvcm11bGEgc3RyaW5nCisgICAgJGZvcm11bGEgICAgPX4gcyhePSkoKTsKKworICAgICMgUGFyc2UgdGhlIGZvcm11bGEgdXNpbmcgdGhlIHBhcnNlciBpbiBGb3JtdWxhLnBtCisgICAgbXkgJHBhcnNlciAgPSAkc2VsZi0+e19wYXJzZXJ9OworCisgICAgIyBJbiBvcmRlciB0byByYWlzZSBmb3JtdWxhIGVycm9ycyBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBjYWxsaW5nCisgICAgIyBwcm9ncmFtIHdlIHVzZSBhbiBldmFsIGJsb2NrIGFuZCByZS1yYWlzZSB0aGUgZXJyb3IgZnJvbSBoZXJlLgorICAgICMKKyAgICBldmFsIHsgQHRva2VucyA9ICRwYXJzZXItPnBhcnNlX2Zvcm11bGEoJGZvcm11bGEpIH07CisKKyAgICBpZiAoJEApIHsKKyAgICAgICAgJEAgPX4gcy9cbiQvLzsgICMgU3RyaXAgdGhlIFxuIHVzZWQgaW4gdGhlIEZvcm11bGEucG0gZGllKCkKKyAgICAgICAgY3JvYWsgJEA7ICAgICAgICMgUmUtcmFpc2UgdGhlIGVycm9yCisgICAgfQorICAgIGVsc2UgeworICAgICAgICAjIFRPRE8gdGVzdCBmb3Igbm9uIHZhbGlkIHB0Z3Mgc3VjaCBhcyBTaGVldDIhQTEKKyAgICB9CisgICAgIyBGb3JjZSAyZCByYW5nZXMgdG8gYmUgYSByZWZlcmVuY2UgY2xhc3MuCisgICAgcy9fcmFuZ2UyZC9fcmFuZ2UyZFIvIGZvciBAdG9rZW5zOworICAgIHMvX25hbWUvX25hbWVSLyAgICAgICBmb3IgQHRva2VuczsKKworICAgICMgUGFyc2UgdGhlIHRva2VucyBpbnRvIGEgZm9ybXVsYSBzdHJpbmcuCisgICAgJGZvcm11bGEgPSAkcGFyc2VyLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7CisKKworICAgIHJldHVybiBwYWNrKCd2dicsIGxlbmd0aCAkZm9ybXVsYSwgJHVudXNlZCkgLiAkZm9ybXVsYTsKK30KKworCisKKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitXb3Jrc2hlZXQgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgV29ya3NoZWV0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisK