ZGlmZiAtLWdpdCBhL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9tb3JlZmluZGVydG9vbHMucHkgYi9NYWMvQ29udHJpYi9tb3JlZmluZGVydG9vbHMvbW9yZWZpbmRlcnRvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvQ29udHJpYi9tb3JlZmluZGVydG9vbHMvbW9yZWZpbmRlcnRvb2xzLnB5CkBAIC0wLDAgKzEsNzA4IEBACisiIiJVdGlsaXR5IHJvdXRpbmVzIGRlcGVuZGluZyBvbiB0aGUgZmluZGVyLAoraW5zcGlyZWQgYnkgZmluZGVydG9vbHMsIGJ1dCBleHRlbmRlZC4KK01vc3QgZXZlbnRzIGhhdmUgYmVlbiBjYXB0dXJlZCBmcm9tCitMYXNzbyBDYXB0dXJlIEFFIGFuZCB0aGFuIHRyYW5zbGF0ZWQgdG8gcHl0aG9uIGNvZGUuCisKK0lNUE9SVEFOVAorTm90ZSB0aGF0IHRoZSBwcm9jZXNzZXMoKSBmdW5jdGlvbiByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZXMKK2RlcGVuZGluZyBvbiB0aGUgT1MgdmVyc2lvbiBpdCBpcyBydW5uaW5nIG9uLiBPbiBNYWNPUyA5Cit0aGUgRmluZGVyIHJldHVybnMgdGhlIHByb2Nlc3MgKm5hbWVzKiB3aGljaCBjYW4gdGhlbiBiZQordXNlZCB0byBmaW5kIG91dCBtb3JlIGFib3V0IHRoZW0uIE9uIE1hY09TIDguNiBhbmQgZWFybGllcgordGhlIEZpbmRlciByZXR1cm5zIGEgY29kZSB3aGljaCBkb2VzIG5vdCBzZWVtIHRvIHdvcmsuCitTbyBib3R0b20gbGluZTogdGhlIHByb2Nlc3NlcygpIHN0dWZmIGRvZXMgbm90IHdvcmsgb24gPCBNYWNPUzkKKworV3JpdHRlbiBieSBlcmlrQGxldHRlcnJvci5jb20KKyIiIgorCitpbXBvcnQgRmluZGVyXzdfMF9TdWl0ZSwgRmluZGVyX1N1aXRlCitpbXBvcnQgQXBwbGVFdmVudHMKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKK2ltcG9ydCBzeXMKK2ltcG9ydCBtYWNmcworaW1wb3J0IGFldHlwZXMKK2Zyb20gdHlwZXMgaW1wb3J0ICoKKworX192ZXJzaW9uX18gPSAnMS4wJworbW9yZWZpbmRlcnRvb2xzZXJyb3IgPSAnbW9yZWZpbmRlcnRvb2xzIEVycm9yJworCisKK1NJR05BVFVSRT0nTUFDUycKKworY2xhc3MgRmluZGVyKGFldG9vbHMuVGFsa1RvLCBGaW5kZXJfU3VpdGUuRmluZGVyX1N1aXRlLCBGaW5kZXJfN18wX1N1aXRlLkZpbmRlcl83XzBfU3VpdGUpOgorCXBhc3MKKwkKK19maW5kZXJfdGFsa2VyID0gTm9uZQorCitkZWYgX2dldGZpbmRlcigpOgorCSIiInJldHVybnMgYmFzaWMgKHJlY3ljbGFibGUpIEZpbmRlciBBRSBpbnRlcmZhY2Ugb2JqZWN0IiIiCisJZ2xvYmFsIF9maW5kZXJfdGFsa2VyCisJaWYgbm90IF9maW5kZXJfdGFsa2VyOgorCQlfZmluZGVyX3RhbGtlciA9IEZpbmRlcihTSUdOQVRVUkUpCisJX2ZpbmRlcl90YWxrZXIuc2VuZF9mbGFncyA9ICggX2ZpbmRlcl90YWxrZXIuc2VuZF9mbGFncyB8IAorCQlBcHBsZUV2ZW50cy5rQUVDYW5JbnRlcmFjdCB8IEFwcGxlRXZlbnRzLmtBRUNhblN3aXRjaExheWVyKQorCXJldHVybiBfZmluZGVyX3RhbGtlcgorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMJVGhlIG9yaWdpbmFsIGZpbmRlcnRvb2xzCisjCisKK2RlZiBsYXVuY2goZmlsZSk6CisJIiIiT3BlbiBhIGZpbGUgdGhydSB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMiIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlmc3MgPSBtYWNmcy5GU1NwZWMoZmlsZSkKKwl2UmVmTnVtLCBwYXJJRCwgbmFtZSA9IGZzcy5hc190dXBsZSgpCisJZGlyX2ZzcyA9IG1hY2ZzLkZTU3BlYygodlJlZk51bSwgcGFySUQsICcnKSkKKwlmaWxlX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlkaXJfYWxpYXMgPSBkaXJfZnNzLk5ld0FsaWFzKCkKKwlyZXR1cm4gZmluZGVyLm9wZW4oZGlyX2FsaWFzLCBpdGVtcz1bZmlsZV9hbGlhc10pCisJCitkZWYgUHJpbnQoZmlsZSk6CisJIiIiUHJpbnQgYSBmaWxlIHRocnUgdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJZnNzID0gbWFjZnMuRlNTcGVjKGZpbGUpCisJdlJlZk51bSwgcGFySUQsIG5hbWUgPSBmc3MuYXNfdHVwbGUoKQorCWRpcl9mc3MgPSBtYWNmcy5GU1NwZWMoKHZSZWZOdW0sIHBhcklELCAnJykpCisJZmlsZV9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCisJZGlyX2FsaWFzID0gZGlyX2Zzcy5OZXdBbGlhcygpCisJcmV0dXJuIGZpbmRlci5fcHJpbnQoZGlyX2FsaWFzLCBpdGVtcz1bZmlsZV9hbGlhc10pCisJCitkZWYgY29weShzcmMsIGRzdGRpcik6CisJIiIiQ29weSBhIGZpbGUgdG8gYSBmb2xkZXIiIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlzcmNfZnNzID0gbWFjZnMuRlNTcGVjKHNyYykKKwlkc3RfZnNzID0gbWFjZnMuRlNTcGVjKGRzdGRpcikKKwlzcmNfYWxpYXMgPSBzcmNfZnNzLk5ld0FsaWFzKCkKKwlkc3RfYWxpYXMgPSBkc3RfZnNzLk5ld0FsaWFzKCkKKwlyZXR1cm4gZmluZGVyLmNvcHlfdG8oZHN0X2FsaWFzLCBfZnJvbT1bc3JjX2FsaWFzXSkKKworZGVmIG1vdmUoc3JjLCBkc3RkaXIpOgorCSIiIk1vdmUgYSBmaWxlIHRvIGEgZm9sZGVyIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJc3JjX2ZzcyA9IG1hY2ZzLkZTU3BlYyhzcmMpCisJZHN0X2ZzcyA9IG1hY2ZzLkZTU3BlYyhkc3RkaXIpCisJc3JjX2FsaWFzID0gc3JjX2Zzcy5OZXdBbGlhcygpCisJZHN0X2FsaWFzID0gZHN0X2Zzcy5OZXdBbGlhcygpCisJcmV0dXJuIGZpbmRlci5tb3ZlX3RvKGRzdF9hbGlhcywgX2Zyb209W3NyY19hbGlhc10pCisKK2RlZiBzbGVlcCgpOgorCSIiIlB1dCB0aGUgbWFjIHRvIHNsZWVwIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJZmluZGVyLnNsZWVwKCkKKwkKK2RlZiBzaHV0ZG93bigpOgorCSIiIlNodXQgdGhlIG1hYyBkb3duIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJZmluZGVyLnNodXRfZG93bigpCisJCitkZWYgcmVzdGFydCgpOgorCSIiIlJlc3RhcnQgdGhlIG1hYyIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWZpbmRlci5yZXN0YXJ0KCkKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCUFkZGl0aW9uYWwgZmluZGVydG9vbHMKKyMKKworZGVmIHJldmVhbChmaWxlKToKKwkiIiJSZXZlYWwgYSBmaWxlIGluIHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlmc3MgPSBtYWNmcy5GU1NwZWMoZmlsZSkKKwlmaWxlX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlyZXR1cm4gZmluZGVyLnJldmVhbChmaWxlX2FsaWFzKQorCQorZGVmIHNlbGVjdChmaWxlKToKKwkiIiJzZWxlY3QgYSBmaWxlIGluIHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlmc3MgPSBtYWNmcy5GU1NwZWMoZmlsZSkKKwlmaWxlX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlyZXR1cm4gZmluZGVyLnNlbGVjdChmaWxlX2FsaWFzKQorCQorZGVmIHVwZGF0ZShmaWxlKToKKwkiIiJVcGRhdGUgdGhlIGRpc3BsYXkgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QocykgdG8gbWF0Y2ggCisJdGhlaXIgb24tZGlzayByZXByZXNlbnRhdGlvbi4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWZzcyA9IG1hY2ZzLkZTU3BlYyhmaWxlKQorCWZpbGVfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQorCXJldHVybiBmaW5kZXIudXBkYXRlKGZpbGVfYWxpYXMpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIwlNb3JlIGZpbmRlcnRvb2xzCisjCisKK2RlZiBjb21tZW50KG9iamVjdCwgY29tbWVudD1Ob25lKToKKwkiIiJjb21tZW50OiBnZXQgb3Igc2V0IHRoZSBGaW5kZXItY29tbWVudCBvZiB0aGUgaXRlbSwgZGlzcGxheWVkIGluIHRoZSCzR2V0IEluZm+yIHdpbmRvdy4iIiIKKwlvYmplY3QgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQorCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCisJb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlpZiBjb21tZW50ID09IE5vbmU6CisJCXJldHVybiBfZ2V0Y29tbWVudChvYmplY3RfYWxpYXMpCisJZWxzZToKKwkJcmV0dXJuIF9zZXRjb21tZW50KG9iamVjdF9hbGlhcywgY29tbWVudCkKKwkKK2RlZiBfc2V0Y29tbWVudChvYmplY3RfYWxpYXMsIGNvbW1lbnQpOgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY29tdCcpLCBmcj1hZW9ial8wMCkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorCWFyZ3NbImRhdGEiXSA9IGNvbW1lbnQKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiBfZ2V0Y29tbWVudChvYmplY3RfYWxpYXMpOgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY29tdCcpLCBmcj1hZW9ial8wMCkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCUdldCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHByb2Nlc3NlcyBpbiB0aGUgRmluZGVyLgorCitkZWYgcHJvY2Vzc2VzKCk6CisJIiIicHJvY2Vzc2VzIHJldHVybnMgYSBsaXN0IG9mIGFsbCBhY3RpdmUgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhpcyBjb21wdXRlciBhbmQgdGhlaXIgY3JlYXRvcnMuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCXByb2Nlc3NuYW1lcyA9IFtdCisJcHJvY2Vzc251bWJlcnMgPSBbXQorCWNyZWF0b3JzID0gW10KKwlwYXJ0aXRpb25zID0gW10KKwl1c2VkID0gW10KKwkjIyBnZXQgdGhlIHByb2Nlc3NuYW1lcyBvciBlbHNlIHRoZSBwcm9jZXNzbnVtYmVycworCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFldHlwZXMuVW5rbm93bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlwID0gW10KKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcCA9ICBhcmdzWyctLS0tJ10KKwkJZm9yIHByb2MgaW4gcDoKKwkJCWlmIGhhc2F0dHIocHJvYywgJ3NlbGQnKToKKwkJCQkjIGl0IGhhcyBhIHJlYWwgbmFtZQorCQkJCXByb2Nlc3NuYW1lcy5hcHBlbmQocHJvYy5zZWxkKQorCQkJZWxpZiBoYXNhdHRyKHByb2MsICd0eXBlJyk6CisJCQkJaWYgcHJvYy50eXBlID09ICJwc24gIjoKKwkJCQkJIyBpdCBoYXMgYSBwcm9jZXNzIG51bWJlcgorCQkJCQlwcm9jZXNzbnVtYmVycy5hcHBlbmQocHJvYy5kYXRhKQorCSMjIGdldCB0aGUgY3JlYXRvcnMKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFldHlwZXMuVW5rbm93bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpCisJYXJnc1snLS0tLSddID0gIGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZmNydCcpLCBmcj1hZW9ial8wKQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmcpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXAgPSAgYXJnc1snLS0tLSddCisJCWZvciBwcm9jIGluIHA6CisJCQljcmVhdG9ycy5hcHBlbmQocHJvYy50eXBlKQorCSMjIGNvbmNhdGVuYXRlIGluIG9uZSBkaWN0CisJcmVzdWx0ID0gW10KKwlpZiBsZW4ocHJvY2Vzc25hbWVzKSA+IGxlbihwcm9jZXNzbnVtYmVycyk6CisJCWRhdGEgPSBwcm9jZXNzbmFtZXMKKwllbHNlOgorCQlkYXRhID0gcHJvY2Vzc251bWJlcnMKKwlmb3IgaSBpbiByYW5nZShsZW4oY3JlYXRvcnMpKToKKwkJcmVzdWx0LmFwcGVuZCgoZGF0YVtpXSwgY3JlYXRvcnNbaV0pKQorCXJldHVybiByZXN1bHQKKworY2xhc3MgX3Byb2Nlc3M6CisJcGFzcworCitkZWYgaXNhY3RpdmVwcm9jZXNzKHByb2Nlc3NuYW1lKToKKwkiIiJDaGVjayBvZiBwcm9jZXNzbmFtZSBpcyBhY3RpdmUuIE1hY09TOSIiIgorCWFsbCA9IHByb2Nlc3NlcygpCisJb2sgPSAwCisJZm9yIG4sIGMgaW4gYWxsOgorCQlpZiBuID09IHByb2Nlc3NuYW1lOgorCQkJcmV0dXJuIDEKKwlyZXR1cm4gMAorCQorZGVmIHByb2Nlc3NpbmZvKHByb2Nlc3NuYW1lKToKKwkiIiJSZXR1cm4gYW4gb2JqZWN0IHdpdGggYWxsIHByb2Nlc3MgcHJvcGVydGllcyBhcyBhdHRyaWJ1dGVzIGZvciBwcm9jZXNzbmFtZS4gTWFjT1M5IiIiCisJcCA9IF9wcm9jZXNzKCkKKwkKKwlpZiBwcm9jZXNzbmFtZSA9PSAiRmluZGVyIjoKKwkJcC5wYXJ0aXRpb24gPSBOb25lCisJCXAudXNlZCA9IE5vbmUKKwllbHNlOgorCQlwLnBhcnRpdGlvbiA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdhcHB0JykKKwkJcC51c2VkID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ3B1c2QnKQorCXAudmlzaWJsZSA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdwdmlzJykJCSNJcyB0aGUgcHJvY2VzcycgbGF5ZXIgdmlzaWJsZT8KKwlwLmZyb250bW9zdCA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdwaXNmJykJI0lzIHRoZSBwcm9jZXNzIHRoZSBmcm9udG1vc3QgcHJvY2Vzcz8KKwlwLmZpbGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnZmlsZScpCQkJI3RoZSBmaWxlIGZyb20gd2hpY2ggdGhlIHByb2Nlc3Mgd2FzIGxhdW5jaGVkCisJcC5maWxldHlwZSAgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnYXN0eScpCQkjdGhlIE9TVHlwZSBvZiB0aGUgZmlsZSB0eXBlIG9mIHRoZSBwcm9jZXNzCisJcC5jcmVhdG9ydHlwZSA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdmY3J0JykJI3RoZSBPU1R5cGUgb2YgdGhlIGNyZWF0b3Igb2YgdGhlIHByb2Nlc3MgKHRoZSBzaWduYXR1cmUpCisJcC5hY2NlcHRoaWdobGV2ZWwgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncmV2dCcpCSNJcyB0aGUgcHJvY2VzcyBoaWdoLWxldmVsIGV2ZW50IGF3YXJlIChhY2NlcHRzIG9wZW4gYXBwbGljYXRpb24sIG9wZW4gZG9jdW1lbnQsIHByaW50IGRvY3VtZW50LCBhbmQgcXVpdCk/CisJcC5oYXNzY3JpcHRpbmcgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnaHNjcicpCQkjRG9lcyB0aGUgcHJvY2VzcyBoYXZlIGEgc2NyaXB0aW5nIHRlcm1pbm9sb2d5LCBpLmUuLCBjYW4gaXQgYmUgc2NyaXB0ZWQ/CisJcmV0dXJuIHAKKwkKK2RlZiBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCBwcm9wZXJ0eSk6CisJIiIicmV0dXJuIHRoZSBwYXJ0aXRpb24gc2l6ZSBhbmQgbWVtb3J5IHVzZWQgZm9yIHByb2Nlc3NuYW1lIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3ByY3MnKSwgZm9ybT0ibmFtZSIsIHNlbGQ9cHJvY2Vzc25hbWUsIGZyPU5vbmUpCisJYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUocHJvcGVydHkpLCBmcj1hZW9ial8wMCkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCU1lc3MgYXJvdW5kIHdpdGggRmluZGVyIHdpbmRvd3MuCisJCitkZWYgb3BlbndpbmRvdyhvYmplY3QpOgorCSIiIk9wZW4gYSBGaW5kZXIgd2luZG93IGZvciBvYmplY3QsIFNwZWNpZnkgb2JqZWN0IGJ5IG5hbWUgb3IgZnNzcGVjLiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCW9iamVjdCA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCisJZnNzID0gbWFjZnMuRlNTcGVjKG9iamVjdCkKKwlvYmplY3RfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlfY29kZSA9ICdhZXZ0JworCV9zdWJjb2RlID0gJ29kb2MnCisJYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKF9jb2RlLCBfc3ViY29kZSwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJCitkZWYgY2xvc2V3aW5kb3cob2JqZWN0KToKKwkiIiJDbG9zZSBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciwgU3BlY2lmeSBieSBwYXRoLiIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWZzcyA9IG1hY2ZzLkZTU3BlYyhvYmplY3QpCisJb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJX2NvZGUgPSAnY29yZScKKwlfc3ViY29kZSA9ICdjbG9zJworCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMAorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCitkZWYgbG9jYXRpb24ob2JqZWN0LCBwb3M9Tm9uZSk6CisJIiIiU2V0IHRoZSBwb3NpdGlvbiBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byBwb3M9KHcsIGgpLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuCisJSWYgcG9zPU5vbmUsIGxvY2F0aW9uIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBvYmplY3QuIiIiCisJZnNzID0gbWFjZnMuRlNTcGVjKG9iamVjdCkKKwlvYmplY3RfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQorCWlmIG5vdCBwb3M6CisJCXJldHVybiBfZ2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzKQorCXJldHVybiBfc2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzLCBwb3MpCisJCitkZWYgX3NldGxvY2F0aW9uKG9iamVjdF9hbGlhcywgKHgsIHkpKToKKwkiIiJfc2V0bG9jYXRpb246IFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGljb24gZm9yIHRoZSBvYmplY3QuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzAwKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisJYXJnc1siZGF0YSJdID0gW3gsIHldCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgInNldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlyZXR1cm4gKHgseSkKKwkKK2RlZiBfZ2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzKToKKwkiIiJfZ2V0bG9jYXRpb246IGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGljb24gZm9yIHRoZSBvYmplY3QuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzAwKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcG9zID0gYXJnc1snLS0tLSddCisJCXJldHVybiBwb3MuaCwgcG9zLnYKKworZGVmIGxhYmVsKG9iamVjdCwgaW5kZXg9Tm9uZSk6CisJIiIibGFiZWw6IHNldCBvciBnZXQgdGhlIGxhYmVsIG9mIHRoZSBpdGVtLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuIiIiCisJZnNzID0gbWFjZnMuRlNTcGVjKG9iamVjdCkKKwlvYmplY3RfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQorCWlmIGluZGV4ID09IE5vbmU6CisJCXJldHVybiBfZ2V0bGFiZWwob2JqZWN0X2FsaWFzKQorCWlmIGluZGV4IDwgMCBvciBpbmRleCA+IDc6CisJCWluZGV4ID0gMAorCXJldHVybiBfc2V0bGFiZWwob2JqZWN0X2FsaWFzLCBpbmRleCkKKwkKK2RlZiBfZ2V0bGFiZWwob2JqZWN0X2FsaWFzKToKKwkiIiJsYWJlbDogR2V0IHRoZSBsYWJlbCBmb3IgdGhlIG9iamVjdC4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2xhYmknKSwgZnI9YWVvYmpfMDApCisJYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiBfc2V0bGFiZWwob2JqZWN0X2FsaWFzLCBpbmRleCk6CisJIiIibGFiZWw6IFNldCB0aGUgbGFiZWwgZm9yIHRoZSBvYmplY3QuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCV9jb2RlID0gJ2NvcmUnCisJX3N1YmNvZGUgPSAnc2V0ZCcKKwlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKKwkJCWZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKKwkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnbGFiaScpLCBmcj1hZW9ial8wKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzEKKwlhcmdzWyJkYXRhIl0gPSBpbmRleAorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCXJldHVybiBpbmRleAorCitkZWYgd2luZG93dmlldyhmb2xkZXIsIHZpZXc9Tm9uZSk6CisJIiIid2luZG93dmlldzogU2V0IHRoZSB2aWV3IG9mIHRoZSB3aW5kb3cgZm9yIHRoZSBmb2xkZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4KKwkwID0gYnkgaWNvbiAoZGVmYXVsdCkKKwkxID0gYnkgbmFtZQorCTIgPSBieSBidXR0b24KKwkiIiIKKwlmc3MgPSBtYWNmcy5GU1NwZWMoZm9sZGVyKQorCWZvbGRlcl9hbGlhcyA9IGZzcy5OZXdBbGlhcygpCisJaWYgdmlldyA9PSBOb25lOgorCQlyZXR1cm4gX2dldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzKQorCXJldHVybiBfc2V0d2luZG93dmlldyhmb2xkZXJfYWxpYXMsIHZpZXcpCisJCitkZWYgX3NldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzLCB2aWV3PTApOgorCSIiInNldCB0aGUgd2luZG93dmlldyIiIgorCWF0dHJzID0ge30KKwlhcmdzID0ge30KKwlpZiB2aWV3ID09IDE6CisJCV92ID0gYWV0eXBlcy5UeXBlKCdwbmFtJykKKwllbGlmIHZpZXcgPT0gMjoKKwkJX3YgPSBhZXR5cGVzLlR5cGUoJ2xnYnUnKQorCWVsc2U6CisJCV92ID0gYWV0eXBlcy5UeXBlKCdpaW1nJykKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKwkJCWZvcm0gPSAnYWxpcycsIHNlbGQgPSBmb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisJYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtID0gJ3Byb3AnLCBzZWxkID0gYWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisJYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtID0gJ3Byb3AnLCBzZWxkID0gYWV0eXBlcy5UeXBlKCdwdmV3JyksIGZyPWFlb2JqXzEpCisJYWVvYmpfMyA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtID0gJ3Byb3AnLCBzZWxkID0gX3YsIGZyPU5vbmUpCisJX2NvZGUgPSAnY29yZScKKwlfc3ViY29kZSA9ICdzZXRkJworCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzIKKwlhcmdzWydkYXRhJ10gPSBhZW9ial8zCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKF9jb2RlLCBfc3ViY29kZSwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIF9nZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcyk6CisJIiIiZ2V0IHRoZSB3aW5kb3d2aWV3IiIiCisJYXR0cnMgPSB7fQorCWFyZ3MgPSB7fQorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wMCkKKwlhZW9ial8wMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncHZldycpLCBmcj1hZW9ial8wMSkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8wMgorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJdmlld3MgPSB7J2lpbWcnOjAsICdwbmFtJzoxLCAnbGdidSc6Mn0KKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIHZpZXdzW2FyZ3NbJy0tLS0nXS5lbnVtXQorCitkZWYgd2luZG93c2l6ZShmb2xkZXIsIHNpemU9Tm9uZSk6CisJIiIiU2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvIHNpemU9KHcsIGgpLCBTcGVjaWZ5IGJ5IHBhdGguCisJSWYgc2l6ZT1Ob25lLCB3aW5kb3dzaXplIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHdpbmRvdy4KKwlTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuCisJIiIiCisJZnNzID0gbWFjZnMuRlNTcGVjKGZvbGRlcikKKwlmb2xkZXJfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQorCW9wZW53aW5kb3coZnNzKQorCWlmIG5vdCBzaXplOgorCQlyZXR1cm4gX2dldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzKQorCXJldHVybiBfc2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMsIHNpemUpCisJCitkZWYgX3NldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzLCAodywgaCkpOgorCSIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkiIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJX2NvZGUgPSAnY29yZScKKwlfc3ViY29kZSA9ICdzZXRkJworCWFldmFyMDAgPSBbdywgaF0KKwlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwKKwkJCWZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKKwlhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3B0c3onKSwgZnI9YWVvYmpfMSkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8yCisJYXJnc1siZGF0YSJdID0gYWV2YXIwMAorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCXJldHVybiAodywgaCkKKwkJCitkZWYgX2dldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzKToKKwkiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKwkJCWZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKKwlhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMSkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8yCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgd2luZG93cG9zaXRpb24oZm9sZGVyLCBwb3M9Tm9uZSk6CisJIiIiU2V0IHRoZSBwb3NpdGlvbiBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byBwb3M9KHcsIGgpLiIiIgorCWZzcyA9IG1hY2ZzLkZTU3BlYyhmb2xkZXIpCisJZm9sZGVyX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkKKwlvcGVud2luZG93KGZzcykKKwlpZiBub3QgcG9zOgorCQlyZXR1cm4gX2dldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcykKKwlpZiB0eXBlKHBvcykgPT0gSW5zdGFuY2VUeXBlOgorCQkjIHBvcyBtaWdodCBiZSBhIFFEUG9pbnQgb2JqZWN0IGFzIHJldHVybmVkIGJ5IF9nZXR3aW5kb3dwb3NpdGlvbgorCQlwb3MgPSAocG9zLmgsIHBvcy52KQorCXJldHVybiBfc2V0d2luZG93cG9zaXRpb24oZm9sZGVyX2FsaWFzLCBwb3MpCisJCQkKK2RlZiBfc2V0d2luZG93cG9zaXRpb24oZm9sZGVyX2FsaWFzLCAoeCwgeSkpOgorCSIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkuIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKwkJCWZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKKwlhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMSkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8yCisJYXJnc1siZGF0YSJdID0gW3gsIHldCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ3NldGQnLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgX2dldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcyk6CisJIiIiR2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyLCBTcGVjaWZ5IGJ5IHBhdGguIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKwkJCWZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKKwlhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3B0c3onKSwgZnI9YWVvYmpfMSkKKwlhcmdzWyctLS0tJ10gPSBhZW9ial8yCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgaWNvbihvYmplY3QsIGljb25kYXRhPU5vbmUpOgorCSIiImljb24gc2V0cyB0aGUgaWNvbiBvZiBvYmplY3QsIGlmIG5vIGljb25kYXRhIGlzIGdpdmVuLAorCWljb24gd2lsbCByZXR1cm4gYW4gQUUgb2JqZWN0IHdpdGggYmluYXJ5IGRhdGEgZm9yIHRoZSBjdXJyZW50IGljb24uCisJSWYgbGVmdCB1bnRvdWNoZWQsIHRoaXMgZGF0YSBjYW4gYmUgdXNlZCB0byBwYXN0ZSB0aGUgaWNvbiBvbiBhbm90aGVyIGZpbGUuCisJRGV2ZWxvcG1lbnQgb3Bwb3J0dW5pdHk6IGdldCBhbmQgc2V0IHRoZSBkYXRhIGFzIFBJQ1QuIiIiCisJZnNzID0gbWFjZnMuRlNTcGVjKG9iamVjdCkKKwlvYmplY3RfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQorCWlmIGljb25kYXRhID09IE5vbmU6CisJCXJldHVybiBfZ2V0aWNvbihvYmplY3RfYWxpYXMpCisJcmV0dXJuIF9zZXRpY29uKG9iamVjdF9hbGlhcywgaWNvbmRhdGEpCisJCitkZWYgX2dldGljb24ob2JqZWN0X2FsaWFzKToKKwkiIiJnZXQgdGhlIGljb25kYXRhIGZvciBvYmplY3QuIEJpbmFyeSBkYXRhIG9mIHNvbWUgc29ydC4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCAKKwkJCWZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKwlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQorCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgX3NldGljb24ob2JqZWN0X2FsaWFzLCBpY29uZGF0YSk6CisJIiIic2V0IHRoZSBpY29uZGF0YSBmb3Igb2JqZWN0LCBmb3JtYXR0ZWQgYXMgcHJvZHVjZWQgYnkgX2dldGljb24oKSIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIAorCQkJZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisJCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2lpbWcnKSwgZnI9YWVvYmpfMDApCisJYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKwlhcmdzWyJkYXRhIl0gPSBpY29uZGF0YQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJzZXRkIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10uZGF0YQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMJVm9sdW1lcyBhbmQgc2VydmVycy4KKwkKK2RlZiBtb3VudHZvbHVtZSh2b2x1bWUsIHNlcnZlcj1Ob25lLCB1c2VybmFtZT1Ob25lLCBwYXNzd29yZD1Ob25lKToKKwkiIiJtb3VudCBhIHZvbHVtZSwgbG9jYWwgb3Igb24gYSBzZXJ2ZXIgb24gQXBwbGVUYWxrLgorCU5vdGU6IG1vdW50aW5nIGEgQVNJUCBzZXJ2ZXIgcmVxdWlyZXMgYSBkaWZmZXJlbnQgb3BlcmF0aW9uLgorCXNlcnZlciBpcyB0aGUgbmFtZSBvZiB0aGUgc2VydmVyIHdoZXJlIHRoZSB2b2x1bWUgYmVsb25ncworCXVzZXJuYW1lLCBwYXNzd29yZCBiZWxvbmcgdG8gYSByZWdpc3RlcmVkIHVzZXIgb2YgdGhlIHZvbHVtZS4iIiIKKwlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJaWYgcGFzc3dvcmQ6CisJCWFyZ3NbIlBBU1MiXSA9IHBhc3N3b3JkCisJaWYgdXNlcm5hbWU6CisJCWFyZ3NbIlVTRVIiXSA9IHVzZXJuYW1lCisJaWYgc2VydmVyOgorCQlhcmdzWyJTUlZSIl0gPSBzZXJ2ZXIKKwlhcmdzWyctLS0tJ10gPSB2b2x1bWUKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImFldnQiLCAibXZvbCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiB1bm1vdW50dm9sdW1lKHZvbHVtZSk6CisJIiIidW5tb3VudCBhIHZvbHVtZSB0aGF0J3Mgb24gdGhlIGRlc2t0b3AiIiIKKwlwdXRhd2F5KHZvbHVtZSkKKwkKK2RlZiBwdXRhd2F5KG9iamVjdCk6CisJIiIicHV0aCB0aGUgb2JqZWN0IGF3YXksIHdoZXJlZXZlciBpdCBjYW1lIGZyb20uIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZGlzJyksIGZvcm09Im5hbWUiLCBzZWxkPW9iamVjdCwgZnI9Tm9uZSkKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gdGFsa2VyLnNlbmQoImZuZHIiLCAicHR3eSIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIwlNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucworIworCitkZWYgdm9sdW1lbGV2ZWwobGV2ZWwpOgorCSIiInNldCB0aGUgYXVkaW8gb3V0cHV0IGxldmVsLCBwYXJhbWV0ZXIgYmV0d2VlbiAwIChzaWxlbnQpIGFuZCA3IChmdWxsIGJsYXN0KSIiIgorCWZpbmRlciA9IF9nZXRmaW5kZXIoKQorCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlpZiBsZXZlbCA8IDA6CisJCWxldmVsID0gMAorCWVsaWYgbGV2ZWwgPiA3OgorCQlsZXZlbCA9IDcKKwlhcmdzWyctLS0tJ10gPSBsZXZlbAorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiYWV2dCIsICJzdHZsIiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisJaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisJCXJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIE9TdmVyc2lvbigpOgorCSIiInJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIHNvZnR3YXJlIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCd2ZXIyJyksIGZyPU5vbmUpCisJYXJnc1snLS0tLSddID0gYWVvYmpfMDAKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlyZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiBmaWxlc2hhcmluZygpOgorCSIiInJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgZmlsZXNoYXJpbmcgYW5kIHdoZXRoZXIgaXQgaXMgc3RhcnRpbmcgdXAgb3Igbm90OgorCQktMQlmaWxlIHNoYXJpbmcgaXMgb2ZmIGFuZCBub3Qgc3RhcnRpbmcgdXAKKwkJMAlmaWxlIHNoYXJpbmcgaXMgb2ZmIGFuZCBzdGFydGluZyB1cAorCQkxCWZpbGUgc2hhcmluZyBpcyBvbiIiIgorCXN0YXR1cyA9IC0xCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJIyBzZWUgaWYgaXQgaXMgb24KKwlhcmdzID0ge30KKwlhdHRycyA9IHt9CisJYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdmc2hyJyksIGZyPU5vbmUpCisJX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKwlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKwkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKwlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKwkJaWYgYXJnc1snLS0tLSddID09IDA6CisJCQlzdGF0dXMgPSAtMQorCQllbHNlOgorCQkJc3RhdHVzID0gMQorCSMgaXMgaXQgc3RhcnRpbmcgdXAgcGVyY2hhbmNlPworCWFyZ3MgPSB7fQorCWF0dHJzID0ge30KKwlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2ZzdXAnKSwgZnI9Tm9uZSkKKwlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorCQlpZiBhcmdzWyctLS0tJ10gPT0gMToKKwkJCXN0YXR1cyA9IDAKKwlyZXR1cm4gc3RhdHVzCisJCitkZWYgbW92ZXRvdHJhc2gocGF0aCk6CisJIiIibW92ZSB0aGUgb2JqZWN0IHRvIHRoZSB0cmFzaCIiIgorCWZzcyA9IG1hY2ZzLkZTU3BlYyhwYXRoKQorCXRyYXNoZm9sZGVyID0gbWFjZnMuRlNTcGVjKG1hY2ZzLkZpbmRGb2xkZXIoZnNzLmFzX3R1cGxlKClbMF0sICd0cnNoJywgMCkgKyAoIiIsKSkuYXNfcGF0aG5hbWUoKQorCWZpbmRlcnRvb2xzLm1vdmUocGF0aCwgdHJhc2hmb2xkZXIpCisKK2RlZiBlbXB0eXRyYXNoKCk6CisJIiIiZW1wdHkgdGhlIHRyYXNoIiIiCisJZmluZGVyID0gX2dldGZpbmRlcigpCisJYXJncyA9IHt9CisJYXR0cnMgPSB7fQorCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgndHJzaCcpLCBmcj1Ob25lKQorCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiZm5kciIsICJlbXB0IiwgYXJncywgYXR0cnMpCisJaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKZGlmZiAtLWdpdCBhL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9tb3JlZmluZGVydG9vbHN0ZXN0LnB5IGIvTWFjL0NvbnRyaWIvbW9yZWZpbmRlcnRvb2xzL21vcmVmaW5kZXJ0b29sc3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZDI1ZQotLS0gL2Rldi9udWxsCisrKyBiL01hYy9Db250cmliL21vcmVmaW5kZXJ0b29scy9tb3JlZmluZGVydG9vbHN0ZXN0LnB5CkBAIC0wLDAgKzEsODUgQEAKKyIiIlNvbWUgdGVzdHMgb2YgdmFyaW91cyBtb3JlZmluZGVydG9vbHMgZnVuY3Rpb25zLgorVGhpcyBkb2VzIG5vdCB0ZXN0IHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgYWxyZWFkeSBkZWZpbmVkIGFuZCB0ZXN0ZWQgaW4gZmluZGVydG9vbHMuCisxMCAxMCAyMDAwIGVyaWtAbGV0dGVycm9yLmNvbQorIiIiCisKK2ltcG9ydCBtb3JlZmluZGVydG9vbHMKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgTWFjT1MKK2ltcG9ydCByYW5kb20KKworbWZ0ID0gbW9yZWZpbmRlcnRvb2xzCisKK3ByaW50ICdcbm1vcmVmaW5kZXJ0b29scyB2ZXJzaW9uICVzXG5UZXN0cyBjb21pbmcgdXCKJyAlbWZ0Ll9fdmVyc2lvbl9fCisKKyMgbWlzY2VsbGFuZW91cworcHJpbnQgJ1x0ZmlsZXNoYXJpbmcgb24/JywJbWZ0LmZpbGVzaGFyaW5nKCkJCSMgaXMgZmlsZSBzaGFyaW5nIG9uLCBvZmYsIHN0YXJ0aW5nIHVwPworcHJpbnQgJ1x0T1MgdmVyc2lvbicsIAkJbWZ0Lk9TdmVyc2lvbigpCQkjIHRoZSB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0gc29mdHdhcmUKKworIyBzZXQgdGhlIHNvdW5kdm9sdW1lIGluIGEgc2ltcGxlIHdheQorcHJpbnQgJ1x0U3lzdGVtIGJlZXAgdm9sdW1lJworZm9yIGkgaW4gcmFuZ2UoMCwgNyk6CisJbWZ0LnZvbHVtZWxldmVsKGkpCQkKKwlNYWNPUy5TeXNCZWVwKCkKKworIyBGaW5kZXIncyB3aW5kb3dzLCBmaWxlIGxvY2F0aW9uLCBmaWxlIGF0dHJpYnV0ZXMKK2YgPSBfX2ZpbGVfXwkJCQkjIGdldCBhIHBhdGggbmFtZSB0aGF0IGlzIGlubm9jZW50IHRvIHBsYXkgd2l0aCBhbmQgYWx3YXlzIHdvcmtzCittZnQucmV2ZWFsKGYpCQkJCSMgcmV2ZWFsIHRoaXMgZmlsZSBpbiBhIEZpbmRlciB3aW5kb3cKK21mdC5zZWxlY3QoZikJCQkJIyBzZWxlY3QgdGhpcyBmaWxlCisKK2Jhc2UsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGYpCittZnQuY2xvc2V3aW5kb3coYmFzZSkJIyBjbG9zZSB0aGUgd2luZG93IHRoaXMgZmlsZSBpcyBpbgkob3BlbmVkIGJ5IHJldmVhbCkKK21mdC5vcGVud2luZG93KGJhc2UpCQkjIG9wZW4gaXQgYWdhaW4KK21mdC53aW5kb3d2aWV3KGJhc2UsIDEpCSMgc2V0IHRoZSB2aWV3IGJ5IGxpc3QKKworbWZ0LmxhYmVsKGYsIDIpCQkJCSMgc2V0IHRoZSBsYWJlbCBvZiB0aGlzIGZpbGUgdG8gc29tZXRoaW5nIG9yYW5nZQorcHJpbnQgJ1x0bGFiZWwnLCBtZnQubGFiZWwoZikJIyBnZXQgdGhlIGxhYmVsIG9mIHRoaXMgZmlsZQorCisjIHRoZSBmaWxlIGxvY2F0aW9uIG9ubHkgd29ya3MgaW4gYSB3aW5kb3cgd2l0aCBpY29uIHZpZXchCitwcmludCAnUmFuZG9tIGxvY2F0aW9ucyBmb3IgYW4gaWNvbicKK21mdC53aW5kb3d2aWV3KGJhc2UsIDApCQkjIHNldCB0aGUgdmlldyBieSBpY29uCittZnQud2luZG93c2l6ZShiYXNlLCAoNjAwLCA2MDApKQorZm9yIGkgaW4gcmFuZ2UoNTApOgorCW1mdC5sb2NhdGlvbihmLCAocmFuZG9tLnJhbmRpbnQoMTAsIDU5MCksIHJhbmRvbS5yYW5kaW50KDEwLCA1OTApKSkKKworbWZ0LndpbmRvd3NpemUoYmFzZSwgKDIwMCwgNDAwKSkKK21mdC53aW5kb3d2aWV3KGJhc2UsIDEpCQkjIHNldCB0aGUgdmlldyBieSBpY29uCisKK29yZ3BvcyA9IG1mdC53aW5kb3dwb3NpdGlvbihiYXNlKQorcHJpbnQgJ0FuaW1hdGVkIHdpbmRvdyBsb2NhdGlvbicKK2ZvciBpIGluIHJhbmdlKDEwKToKKwlwb3MgPSAoMTAwK2kqMTAsIDEwMCtpKjEwKQorCW1mdC53aW5kb3dwb3NpdGlvbihiYXNlLCBwb3MpCisJcHJpbnQgJ1x0d2luZG93IHBvc2l0aW9uJywgcG9zCittZnQud2luZG93cG9zaXRpb24oYmFzZSwgb3JncG9zKQkjIHBhcmsgaXQgd2hlcmUgaXQgd2FzIGJlZm9yZYoKKworcHJpbnQgJ1B1dCBhIGNvbW1lbnQgaW4gZmlsZScsIGYsICc6JworcHJpbnQgJ1x0JywgbWZ0LmNvbW1lbnQoZikJCSMgcHJpbnQgdGhlIEZpbmRlciBjb21tZW50IHRoaXMgZmlsZSBoYXMKK3MgPSAnVGhpcyBpcyBhIGNvbW1lbnQgbm8gb25lIHJlYWRzIScKK21mdC5jb21tZW50KGYsIHMpCQkJIyBzZXQgdGhlIEZpbmRlciBjb21tZW50CisKKyMKKyMKKyMJdGhlIGZvbGxvd2luZyBjb2RlIGRvZXMgbm90IHdvcmsgb24gTWFjT1MgdmVyc2lvbnMgb2xkZXIgdGhhbiBNYWNPUyA5LgorIworIworCitpZiAwOgorCXByaW50ICdNYWNPUzkgb3IgYmV0dGVyIHNwZWNpZmljIGZ1bmN0aW9ucycKKwkjIHByb2Nlc3NlcworCXByID0gbWZ0LnByb2Nlc3NlcygpCQkjIHJldHVybiBhIGxpc3Qgb2YgdHVwbGVzIHdpdGggKGFjdGl2ZV9wcm9jZXNzbmFtZSwgY3JlYXRvcmNvZGUpCisJcHJpbnQgJ1JldHVybiBhIGxpc3Qgb2YgY3VycmVudCBhY3RpdmUgcHJvY2Vzc2VzOicKKwlmb3IgcCBpbiBwcjoKKwkJcHJpbnQgJ1x0JywgcAorCQorCSMgZ2V0IGF0dHJpYnV0ZXMgb2YgdGhlIGZpcnN0IHByb2Nlc3MgaW4gdGhlIGxpc3QKKwlwcmludCAnQXR0cmlidXRlcyBvZiB0aGUgZmlyc3QgcHJvY2VzcyBpbiB0aGUgbGlzdDonCisJcGluZm8gPSBtZnQucHJvY2Vzc2luZm8ocHJbMF1bMF0pCisJcHJpbnQgJ1x0JywgcHJbMF1bMF0KKwlwcmludCAnXHRcdG1lbW9yeSBwYXJ0aXRpb24nLCBwaW5mby5wYXJ0aXRpb24JCSMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhpcyBwcm9jZXNzCisJcHJpbnQgJ1x0XHRtZW1vcnkgdXNlZCcsIHBpbmZvLnVzZWQJCQkjIHRoZSBtZW1vcnkgYWN0dWFsbCB1c2VkIGJ5IHRoaXMgcHJvY2VzcworCXByaW50ICdcdFx0aXMgdmlzaWJsZScsIHBpbmZvLnZpc2libGUJCQkjIGlzIHRoZSBwcm9jZXNzIHZpc2libGUgdG8gdGhlIHVzZXIKKwlwcmludCAnXHRcdGlzIGZyb250bW9zdCcsIHBpbmZvLmZyb250bW9zdAkJIyBpcyB0aGUgcHJvY2VzcyB0aGUgZnJvbnQgbW9zdCBvbmU/CisJcHJpbnQgJ1x0XHRoYXMgc2NyaXB0aW5nJywgcGluZm8uaGFzc2NyaXB0aW5nCQkjIGlzIHRoZSBwcm9jZXNzIHNjcmlwdGFibGU/CisJcHJpbnQgJ1x0XHRhY2NlcHRzIGhpZ2ggbGV2ZWwgZXZlbnRzJywgCXBpbmZvLmFjY2VwdGhpZ2hsZXZlbAkjIGRvZXMgdGhlIHByb2Nlc3MgYWNjZXB0IGhpZ2ggbGV2ZWwgYXBwbGVldmVudHM/CitwcmludCAnRG9uZS4nClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTWFjL0NvbnRyaWIvbW9yZWZpbmRlcnRvb2xzL3JlYWRtZS50eHQgYi9NYWMvQ29udHJpYi9tb3JlZmluZGVydG9vbHMvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGIzMWFiCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL0NvbnRyaWIvbW9yZWZpbmRlcnRvb2xzL3JlYWRtZS50eHQKQEAgLTAsMCArMSw0IEBACitUaGUgbW9yZWZpbmRlcnRvb2xzIG1vZHVsZSBpcyBhbiBleHRlbnNpb24gdG8gZmluZGVydG9vbHMsIGRvbmF0ZWQgYnkgRXJpawordmFuIEJsb2tsYW5kLCBlcmlrQGxldHRlcnJvci5jb20uIFRoZSByZWFzb24gaXQgaXMgaW5jbHVkZWQgaW4gQ29udHJpYiBpbiBzdGVhZAorb2YgaW5jb3Jwb3JhdGVkIGluIGZpbmRlcnRvb2xzIGlzIGxhY2sgb2YgdGltZSBiZWZvcmUgdGhlIHJlbGVhc2UsIGl0IHdpbGwgYmUKK2luY29ycG9yYXRlZCBpbiB0aGUgbmV4dCByZWxlYXNlLgo=