ZGlmZiAtLWdpdCBhL0RvYy9BQ0tTIGIvRG9jL0FDS1MKaW5kZXggMTRhNWNhOC4uYmJiMzI0MSAxMDA2NDQKLS0tIGEvRG9jL0FDS1MKKysrIGIvRG9jL0FDS1MKQEAgLTE5NSw2ICsxOTUsNyBAQAogU3RldmVuIFdvcmsKIFRob21hcyBXb3V0ZXJzCiBLYS1QaW5nIFllZQorUm9yeSBZb3JrZQogTW9zaGUgWmFka2EKIE1pbGFuIFphbWF6YWwKIENoZW5nIFpoYW5nCmRpZmYgLS1naXQgYS9Eb2MvTWFrZWZpbGUuZGVwcyBiL0RvYy9NYWtlZmlsZS5kZXBzCmluZGV4IDIwYzA2ODguLjExYzZkZTAgMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZS5kZXBzCisrKyBiL0RvYy9NYWtlZmlsZS5kZXBzCkBAIC0xNTUsNiArMTU1LDcgQEAKIAlsaWIvcmVxdWlyZWRfMi5weSBcCiAJbGliL2xpYnRlbXBmaWxlLnRleCBcCiAJbGliL2xpYmVycm5vLnRleCBcCisJbGliL2xpYmN0eXBlcy50ZXggXAogCWxpYi9saWJzb21lb3MudGV4IFwKIAlsaWIvbGlic2lnbmFsLnRleCBcCiAJbGliL2xpYnNvY2tldC50ZXggXApAQCAtMTc5LDYgKzE4MCw3IEBACiAJbGliL2xpYnByb2ZpbGUudGV4IFwKIAlsaWIvbGliaG90c2hvdC50ZXggXAogCWxpYi9saWJ0aW1laXQudGV4IFwKKwlsaWIvbGlidHJhY2UudGV4IFwKIAlsaWIvbGliY2dpLnRleCBcCiAJbGliL2xpYmNnaXRiLnRleCBcCiAJbGliL2xpYnVybGxpYi50ZXggXApAQCAtMzA2LDYgKzMwOCw3IEBACiAJbGliL2xpYmdldHBhc3MudGV4IFwKIAlsaWIvbGlic2h1dGlsLnRleCBcCiAJbGliL2xpYnJlcHIudGV4IFwKKwlsaWIvbGlibXNpbGliLnRleCBcCiAJbGliL2xpYm1zdmNydC50ZXggXAogCWxpYi9saWJ3aW5yZWcudGV4IFwKIAlsaWIvbGlid2luc291bmQudGV4IFwKQEAgLTM0OCw3ICszNTEsOCBAQAogCWxpYi9saWJ0dXJ0bGUudGV4IFwKIAlsaWIvbGlidGFyZmlsZS50ZXggXAogCWxpYi9saWJjc3YudGV4IFwKLQlsaWIvbGliY2ZncGFyc2VyLnRleAorCWxpYi9saWJjZmdwYXJzZXIudGV4IFwKKwlsaWIvbGlic3FsaXRlMy50ZXgKIAogIyBMYVRlWCBzb3VyY2UgZmlsZXMgZm9yIE1hY2ludG9zaCBMaWJyYXJ5IE1vZHVsZXMuCiBNQUNGSUxFUz0gJChIT1dUT1NUWUxFUykgJChJTkRFWFNUWUxFUykgJChDT01NT05URVgpIFwKZGlmZiAtLWdpdCBhL0RvYy9hcGkvYWJzdHJhY3QudGV4IGIvRG9jL2FwaS9hYnN0cmFjdC50ZXgKaW5kZXggZjUwZWJjNC4uN2M3NDJhMCAxMDA2NDQKLS0tIGEvRG9jL2FwaS9hYnN0cmFjdC50ZXgKKysrIGIvRG9jL2FwaS9hYnN0cmFjdC50ZXgKQEAgLTI1NSw2ICsyNTUsOCBAQAogICBcTlVMTCwgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuICBSZXR1cm5zIHRoZQogICByZXN1bHQgb2YgdGhlIGNhbGwgb24gc3VjY2Vzcywgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb24gXHNhbXB7XHZhcntjYWxsYWJsZX0oKlx2YXJ7YXJnc30pfS4KKyAgTm90ZSB0aGF0IGlmIHlvdSBvbmx5IHBhc3MgXGN0eXBle1B5T2JqZWN0ICp9IGFyZ3MsCisgIFxjZnVuY3Rpb257UHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJnc30gaXMgYSBmYXN0ZXIgYWx0ZXJuYXRpdmUuCiBcZW5ke2NmdW5jZGVzY30KIAogCkBAIC0yNjgsNiArMjcwLDggQEAKICAgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUKICAgY2FsbCBvbiBzdWNjZXNzLCBvciBcTlVMTHt9IG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mCiAgIHRoZSBQeXRob24gZXhwcmVzc2lvbiBcc2FtcHtcdmFye299Llx2YXJ7bWV0aG9kfShcdmFye2FyZ3N9KX0uCisgIE5vdGUgdGhhdCBpZiB5b3Ugb25seSBwYXNzIFxjdHlwZXtQeU9iamVjdCAqfSBhcmdzLAorICBcY2Z1bmN0aW9ue1B5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzfSBpcyBhIGZhc3RlciBhbHRlcm5hdGl2ZS4KIFxlbmR7Y2Z1bmNkZXNjfQogCiAKQEAgLTYyNCw3ICs2MjgsNyBAQAogICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgcmlnaHQgc2hpZnRpbmcgXHZhcntvMX0gYnkgXHZhcntvMn0gb24KICAgc3VjY2Vzcywgb3IgXE5VTEx7fSBvbiBmYWlsdXJlLiAgVGhlIG9wZXJhdGlvbiBpcyBkb25lCiAgIFxlbXBoe2luLXBsYWNlfSB3aGVuIFx2YXJ7bzF9IHN1cHBvcnRzIGl0LiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudAotICBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudCBcc2FtcHtcdmFye28xfSA+XGNvZGV7Pj19IFx2YXJ7bzJ9fS4KKyAgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQgXHNhbXB7XHZhcntvMX0gPj49IFx2YXJ7bzJ9fS4KIFxlbmR7Y2Z1bmNkZXNjfQogCiAKZGlmZiAtLWdpdCBhL0RvYy9hcGkvY29uY3JldGUudGV4IGIvRG9jL2FwaS9jb25jcmV0ZS50ZXgKaW5kZXggMTk4MmJhZS4uMTAyNDdhYiAxMDA2NDQKLS0tIGEvRG9jL2FwaS9jb25jcmV0ZS50ZXgKKysrIGIvRG9jL2FwaS9jb25jcmV0ZS50ZXgKQEAgLTI0NSw3ICsyNDUsNyBAQAogXGVuZHtjc2ltcGxlbWFjcm9kZXNjfQogCiBcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5Qm9vbF9Gcm9tTG9uZ317bG9uZyB2fQotICBSZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIFxjb25zdGFudHtQeV9UcnVlfSBvciBcY29uc3RhbnR7UHlfRmFsc2V9IAorICBSZXR1cm4gYSBuZXcgcmVmZXJlbmNlIHRvIFxjb25zdGFudHtQeV9UcnVlfSBvciBcY29uc3RhbnR7UHlfRmFsc2V9CiAgIGRlcGVuZGluZyBvbiB0aGUgdHJ1dGggdmFsdWUgb2YgXHZhcnt2fS4KIFx2ZXJzaW9uYWRkZWR7Mi4zfQogXGVuZHtjZnVuY2Rlc2N9CkBAIC02MTgsMTIgKzYxOCwyNCBAQAogICBleGFjdGx5IHRvIHRoZSBmb3JtYXQgY2hhcmFjdGVycyBpbiB0aGUgXHZhcntmb3JtYXR9IHN0cmluZy4gIFRoZQogICBmb2xsb3dpbmcgZm9ybWF0IGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQ6CiAKKyAgJSBUaGlzIHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSB0YWJsZSBpbiBQeUVycl9Gb3JtYXQuCisgICUgT25lIHNob3VsZCBqdXN0IHJlZmVyIHRvIHRoZSBvdGhlci4KKworICAlIFRoZSBkZXNjcmlwdGlvbnMgZm9yICV6ZCBhbmQgJXp1IGFyZSB3cm9uZywgYnV0IHRoZSB0cnV0aCBpcyBjb21wbGljYXRlZAorICAlIGJlY2F1c2Ugbm90IGFsbCBjb21waWxlcnMgc3VwcG9ydCB0aGUgJXogd2lkdGggbW9kaWZpZXIgLS0gd2UgZmFrZSBpdAorICAlIHdoZW4gbmVjZXNzYXJ5IHZpYSBpbnRlcnBvbGF0aW5nIFBZX0ZPUk1BVF9TSVpFX1QuCisKKyAgJSAldSwgJWx1LCAlenUgc2hvdWxkIGhhdmUgIm5ldyBpbiBQeXRob24gMi41IiBibHVyYnMuCisKICAgXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17bWVtYmVyfXtGb3JtYXQgQ2hhcmFjdGVyc317VHlwZX17Q29tbWVudH0KICAgICBcbGluZWlpaXtcJVwlfXtcZW1waHtuL2F9fXtUaGUgbGl0ZXJhbCBcJSBjaGFyYWN0ZXIufQogICAgIFxsaW5laWlpe1wlY317aW50fXtBIHNpbmdsZSBjaGFyYWN0ZXIsIHJlcHJlc2VudGVkIGFzIGFuIEMgaW50Ln0KICAgICBcbGluZWlpaXtcJWR9e2ludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVkIil9Ln0KKyAgICBcbGluZWlpaXtcJXV9e3Vuc2lnbmVkIGludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCV1Iil9Ln0KICAgICBcbGluZWlpaXtcJWxkfXtsb25nfXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWxkIil9Ln0KLSAgICBcbGluZWlpaXtcJXpkfXtsb25nfXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXpkIil9Ln0KKyAgICBcbGluZWlpaXtcJWx1fXt1bnNpZ25lZCBsb25nfXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWx1Iil9Ln0KKyAgICBcbGluZWlpaXtcJXpkfXtQeV9zc2l6ZV90fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXpkIil9Ln0KKyAgICBcbGluZWlpaXtcJXp1fXtzaXplX3R9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlenUiKX0ufQogICAgIFxsaW5laWlpe1wlaX17aW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWkiKX0ufQogICAgIFxsaW5laWlpe1wleH17aW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXgiKX0ufQogICAgIFxsaW5laWlpe1wlc317Y2hhcip9e0EgbnVsbC10ZXJtaW5hdGVkIEMgY2hhcmFjdGVyIGFycmF5Ln0KQEAgLTYzMiw2ICs2NDQsMTAgQEAKIAlndWFyYW50ZWVkIHRvIHN0YXJ0IHdpdGggdGhlIGxpdGVyYWwgXGNvZGV7MHh9IHJlZ2FyZGxlc3Mgb2YKIAl3aGF0IHRoZSBwbGF0Zm9ybSdzIFxjb2Rle3ByaW50Zn0geWllbGRzLn0KICAgXGVuZHt0YWJsZWlpaX0KKworICBBbiB1bnJlY29nbml6ZWQgZm9ybWF0IGNoYXJhY3RlciBjYXVzZXMgYWxsIHRoZSByZXN0IG9mIHRoZSBmb3JtYXQKKyAgc3RyaW5nIHRvIGJlIGNvcGllZCBhcy1pcyB0byB0aGUgcmVzdWx0IHN0cmluZywgYW5kIGFueSBleHRyYQorICBhcmd1bWVudHMgZGlzY2FyZGVkLgogXGVuZHtjZnVuY2Rlc2N9CiAKIFxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17UHlTdHJpbmdfRnJvbUZvcm1hdFZ9e2NvbnN0IGNoYXIgKmZvcm1hdCwKQEAgLTY4Nyw3ICs3MDMsNyBAQAogICBcdmFye3NpemV9KX0uICBJdCBtdXN0IG5vdCBiZSBkZWFsbG9jYXRlZC4gIElmIFx2YXJ7c3RyaW5nfSBpcyBhCiAgIFVuaWNvZGUgb2JqZWN0LCB0aGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBkZWZhdWx0IGVuY29kaW5nIG9mCiAgIFx2YXJ7c3RyaW5nfSBhbmQgb3BlcmF0ZXMgb24gdGhhdC4gIElmIFx2YXJ7c3RyaW5nfSBpcyBub3QgYSBzdHJpbmcKLSAgb2JqZWN0IGF0IGFsbCwgXGNmdW5jdGlvbntQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoKX0gcmV0dXJucyAKKyAgb2JqZWN0IGF0IGFsbCwgXGNmdW5jdGlvbntQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoKX0gcmV0dXJucwogICBcY29kZXstMX0gYW5kIHJhaXNlcyBcZXhjZXB0aW9ue1R5cGVFcnJvcn0uCiBcZW5ke2NmdW5jZGVzY30KIApAQCAtOTQ5LDcgKzk2NSw3IEBACiBcZW5ke2NmdW5jZGVzY30KIAogXGJlZ2lue2NmdW5jZGVzY317ZG91YmxlfXtQeV9VTklDT0RFX1RPTlVNRVJJQ317UHlfVU5JQ09ERSBjaH0KLSAgUmV0dXJuIHRoZSBjaGFyYWN0ZXIgXHZhcntjaH0gY29udmVydGVkIHRvIGEgKHBvc2l0aXZlKSBkb3VibGUuCisgIFJldHVybiB0aGUgY2hhcmFjdGVyIFx2YXJ7Y2h9IGNvbnZlcnRlZCB0byBhIGRvdWJsZS4KICAgUmV0dXJuIFxjb2Rley0xLjB9IGlmIHRoaXMgaXMgbm90IHBvc3NpYmxlLiAgVGhpcyBtYWNybyBkb2VzIG5vdCByYWlzZQogICBleGNlcHRpb25zLgogXGVuZHtjZnVuY2Rlc2N9CkBAIC0xMzkzLDcgKzE0MDksNyBAQAogICBUaGUgXHZhcnttYXBwaW5nfSB0YWJsZSBtdXN0IG1hcCBVbmljb2RlIG9yZGluYWwgaW50ZWdlcnMgdG8gVW5pY29kZQogICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuCiAKLSAgTWFwcGluZyB0YWJsZXMgbmVlZCBvbmx5IHByb3ZpZGUgdGhlIG1ldGhvZHtfX2dldGl0ZW1fXygpfQorICBNYXBwaW5nIHRhYmxlcyBuZWVkIG9ubHkgcHJvdmlkZSB0aGUgXG1ldGhvZHtfX2dldGl0ZW1fXygpfQogICBpbnRlcmZhY2U7IGRpY3Rpb25hcmllcyBhbmQgc2VxdWVuY2VzIHdvcmsgd2VsbC4gIFVubWFwcGVkIGNoYXJhY3RlcgogICBvcmRpbmFscyAob25lcyB3aGljaCBjYXVzZSBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9KSBhcmUgbGVmdAogICB1bnRvdWNoZWQgYW5kIGFyZSBjb3BpZWQgYXMtaXMuCkBAIC0xNDk0LDcgKzE1MTAsNyBAQAogICBSZXR1cm4gMSBpZiBcdmFye3N1YnN0cn0gbWF0Y2hlcyBcdmFye3N0cn1bXHZhcntzdGFydH06XHZhcntlbmR9XSBhdAogICB0aGUgZ2l2ZW4gdGFpbCBlbmQgKFx2YXJ7ZGlyZWN0aW9ufSA9PSAtMSBtZWFucyB0byBkbyBhIHByZWZpeAogICBtYXRjaCwgXHZhcntkaXJlY3Rpb259ID09IDEgYSBzdWZmaXggbWF0Y2gpLCAwIG90aGVyd2lzZS4KLSAgUmV0dXJuIFxjb2Rley0xfSBpZiBhbiBlcnJvciBvY2N1cnJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgCisgIFJldHVybiBcY29kZXstMX0gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiBcZW5ke2NmdW5jZGVzY30KIAogXGJlZ2lue2NmdW5jZGVzY317UHlfc3NpemVfdH17UHlVbmljb2RlX0ZpbmR9e1B5T2JqZWN0ICpzdHIsCkBAIC0zMDEzLDcgKzMwMjksNyBAQAogCiAKIFxzdWJzZWN0aW9ue1NldCBPYmplY3RzIFxsYWJlbHtzZXRPYmplY3RzfX0KLVxzZWN0aW9uYXV0aG9ye1JheW1vbmQgRC4gSGV0dGluZ2VyfXtweXRob25AcmNuLmNvbX0gICAgICAgICAgICAgICAgICAgICAKK1xzZWN0aW9uYXV0aG9ye1JheW1vbmQgRC4gSGV0dGluZ2VyfXtweXRob25AcmNuLmNvbX0KIAogXG9iaW5kZXh7c2V0fQogXG9iaW5kZXh7ZnJvemVuc2V0fQpAQCAtMzAyMiw4ICszMDM4LDggQEAKIFRoaXMgc2VjdGlvbiBkZXRhaWxzIHRoZSBwdWJsaWMgQVBJIGZvciBcY2xhc3N7c2V0fSBhbmQgXGNsYXNze2Zyb3plbnNldH0KIG9iamVjdHMuICBBbnkgZnVuY3Rpb25hbGl0eSBub3QgbGlzdGVkIGJlbG93IGlzIGJlc3QgYWNjZXNzZWQgdXNpbmcgdGhlCiBlaXRoZXIgdGhlIGFic3RyYWN0IG9iamVjdCBwcm90b2NvbCAoaW5jbHVkaW5nCi1cY2Z1bmN0aW9ue1B5T2JqZWN0X0NhbGxNZXRob2QoKX0sIFxjZnVuY3Rpb257UHlPYmplY3RfUmljaENvbXBhcmVCb29sKCl9LCAKLVxjZnVuY3Rpb257UHlPYmplY3RfSGFzaCgpfSwgXGNmdW5jdGlvbntQeU9iamVjdF9SZXByKCl9LCAKK1xjZnVuY3Rpb257UHlPYmplY3RfQ2FsbE1ldGhvZCgpfSwgXGNmdW5jdGlvbntQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woKX0sCitcY2Z1bmN0aW9ue1B5T2JqZWN0X0hhc2goKX0sIFxjZnVuY3Rpb257UHlPYmplY3RfUmVwcigpfSwKIFxjZnVuY3Rpb257UHlPYmplY3RfSXNUcnVlKCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X1ByaW50KCl9LCBhbmQKIFxjZnVuY3Rpb257UHlPYmplY3RfR2V0SXRlcigpfSkKIG9yIHRoZSBhYnN0cmFjdCBudW1iZXIgcHJvdG9jb2wgKGluY2x1ZGluZwpAQCAtMzA0MCw3ICszMDU2LDcgQEAKICAgYmxvY2sgb2YgbWVtb3J5IGZvciBtZWRpdW0gYW5kIGxhcmdlIHNpemVkIHNldHMgKG11Y2ggbGlrZSBsaXN0IHN0b3JhZ2UpLgogICBOb25lIG9mIHRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHVibGljIGFuZAogICBhcmUgc3ViamVjdCB0byBjaGFuZ2UuICBBbGwgYWNjZXNzIHNob3VsZCBiZSBkb25lIHRocm91Z2ggdGhlCi0gIGRvY3VtZW50ZWQgQVBJIHJhdGhlciB0aGFuIGJ5IG1hbmlwdWxhdGluZyB0aGUgdmFsdWVzIGluIHRoZSBzdHJ1Y3R1cmUuIAorICBkb2N1bWVudGVkIEFQSSByYXRoZXIgdGhhbiBieSBtYW5pcHVsYXRpbmcgdGhlIHZhbHVlcyBpbiB0aGUgc3RydWN0dXJlLgogCiBcZW5ke2N0eXBlZGVzY30KIApAQCAtMzA1OSw3ICszMDc1LDcgQEAKIExpa2V3aXNlLCB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb25zIHdvcmsgd2l0aCBhbnkgaXRlcmFibGUgUHl0aG9uIG9iamVjdC4KIAogXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUFueVNldF9DaGVja317UHlPYmplY3QgKnB9Ci0gIFJldHVybiB0cnVlIGlmIFx2YXJ7cH0gaXMgYSBcY2xhc3N7c2V0fSBvYmplY3QsIGEgXGNsYXNze2Zyb3plbnNldH0gCisgIFJldHVybiB0cnVlIGlmIFx2YXJ7cH0gaXMgYSBcY2xhc3N7c2V0fSBvYmplY3QsIGEgXGNsYXNze2Zyb3plbnNldH0KICAgb2JqZWN0LCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUuCiBcZW5ke2NmdW5jZGVzY30KIApAQCAtMzExMiw3ICszMTI4LDcgQEAKICAgZnVuY3Rpb24gZG9lcyBub3QgYXV0b21hdGljYWxseSBjb252ZXJ0IHVuaGFzaGFibGUgc2V0cyBpbnRvIHRlbXBvcmFyeQogICBmcm96ZW5zZXRzLiAgUmFpc2UgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gaWYgdGhlIFx2YXJ7a2V5fSBpcyB1bmhhc2hhYmxlLgogICBSYWlzZSBcZXhjZXB0aW9ue1B5RXhjX1N5c3RlbUVycm9yfSBpZiBcdmFye2FueXNldH0gaXMgbm90IGEgXGNsYXNze3NldH0sCi0gIFxjbGFzc3tmcm96ZW5zZXR9LCBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YnR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgIAorICBcY2xhc3N7ZnJvemVuc2V0fSwgb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJ0eXBlLgogXGVuZHtjZnVuY2Rlc2N9CiAKIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGluc3RhbmNlcyBvZiBcY2xhc3N7c2V0fSBvcgpAQCAtMzEzNCw3ICszMTUwLDcgQEAKICAgdW5oYXNoYWJsZS4gIFVubGlrZSB0aGUgUHl0aG9uIFxtZXRob2R7ZGlzY2FyZCgpfSBtZXRob2QsIHRoaXMgZnVuY3Rpb24KICAgZG9lcyBub3QgYXV0b21hdGljYWxseSBjb252ZXJ0IHVuaGFzaGFibGUgc2V0cyBpbnRvIHRlbXBvcmFyeSBmcm96ZW5zZXRzLgogICBSYWlzZSBcZXhjZXB0aW9ue1B5RXhjX1N5c3RlbUVycm9yfSBpZiBcdmFye3NldH0gaXMgYW4gbm90IGFuIGluc3RhbmNlCi0gIG9mIFxjbGFzc3tzZXR9IG9yIGl0cyBzdWJ0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgb2YgXGNsYXNze3NldH0gb3IgaXRzIHN1YnR5cGUuCiBcZW5ke2NmdW5jZGVzY30KIAogXGJlZ2lue2NmdW5jZGVzY317UHlPYmplY3QqfXtQeVNldF9Qb3B9e1B5T2JqZWN0ICpzZXR9CkBAIC0zMTQyLDcgKzMxNTgsNyBAQAogICBhbmQgcmVtb3ZlcyB0aGUgb2JqZWN0IGZyb20gdGhlIFx2YXJ7c2V0fS4gIFJldHVybiBcTlVMTHt9IG9uCiAgIGZhaWx1cmUuICBSYWlzZSBcZXhjZXB0aW9ue0tleUVycm9yfSBpZiB0aGUgc2V0IGlzIGVtcHR5LgogICBSYWlzZSBhIFxleGNlcHRpb257U3lzdGVtRXJyb3J9IGlmIFx2YXJ7c2V0fSBpcyBhbiBub3QgYW4gaW5zdGFuY2UKLSAgb2YgXGNsYXNze3NldH0gb3IgaXRzIHN1YnR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgCisgIG9mIFxjbGFzc3tzZXR9IG9yIGl0cyBzdWJ0eXBlLgogXGVuZHtjZnVuY2Rlc2N9CiAKIFxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlTZXRfQ2xlYXJ9e1B5T2JqZWN0ICpzZXR9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2V4Y2VwdGlvbnMudGV4IGIvRG9jL2FwaS9leGNlcHRpb25zLnRleAppbmRleCA2MmY3MTNiLi42ZGJlODE4IDEwMDY0NAotLS0gYS9Eb2MvYXBpL2V4Y2VwdGlvbnMudGV4CisrKyBiL0RvYy9hcGkvZXhjZXB0aW9ucy50ZXgKQEAgLTEzMiwxMyArMTMyLDMyIEBACiAgIGNvZGVzLCBzaW1pbGFyIHRvIFxjZnVuY3Rpb257cHJpbnRmKCl9LiBUaGUgXGNvZGV7d2lkdGgucHJlY2lzaW9ufQogICBiZWZvcmUgYSBmb3JtYXQgY29kZSBpcyBwYXJzZWQsIGJ1dCB0aGUgd2lkdGggcGFydCBpcyBpZ25vcmVkLgogCi0gIFxiZWdpbnt0YWJsZWlpfXtjfGx9e2NoYXJhY3Rlcn17Q2hhcmFjdGVyfXtNZWFuaW5nfQotICAgIFxsaW5laWl7Y317Q2hhcmFjdGVyLCBhcyBhbiBcY3R5cGV7aW50fSBwYXJhbWV0ZXJ9Ci0gICAgXGxpbmVpaXtkfXtOdW1iZXIgaW4gZGVjaW1hbCwgYXMgYW4gXGN0eXBle2ludH0gcGFyYW1ldGVyfQotICAgIFxsaW5laWl7eH17TnVtYmVyIGluIGhleGFkZWNpbWFsLCBhcyBhbiBcY3R5cGV7aW50fSBwYXJhbWV0ZXJ9Ci0gICAgXGxpbmVpaXtzfXtBIHN0cmluZywgYXMgYSBcY3R5cGV7Y2hhciAqfSBwYXJhbWV0ZXJ9Ci0gICAgXGxpbmVpaXtwfXtBIGhleCBwb2ludGVyLCBhcyBhIFxjdHlwZXt2b2lkICp9IHBhcmFtZXRlcn0KLSAgXGVuZHt0YWJsZWlpfQorICAlIFRoaXMgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHRhYmxlIGluIFB5U3RyaW5nX0Zyb21Gb3JtYXQuCisgICUgT25lIHNob3VsZCBqdXN0IHJlZmVyIHRvIHRoZSBvdGhlci4KKworICAlIFRoZSBkZXNjcmlwdGlvbnMgZm9yICV6ZCBhbmQgJXp1IGFyZSB3cm9uZywgYnV0IHRoZSB0cnV0aCBpcyBjb21wbGljYXRlZAorICAlIGJlY2F1c2Ugbm90IGFsbCBjb21waWxlcnMgc3VwcG9ydCB0aGUgJXogd2lkdGggbW9kaWZpZXIgLS0gd2UgZmFrZSBpdAorICAlIHdoZW4gbmVjZXNzYXJ5IHZpYSBpbnRlcnBvbGF0aW5nIFBZX0ZPUk1BVF9TSVpFX1QuCisKKyAgJSAldSwgJWx1LCAlenUgc2hvdWxkIGhhdmUgIm5ldyBpbiBQeXRob24gMi41IiBibHVyYnMuCisKKyAgXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17bWVtYmVyfXtGb3JtYXQgQ2hhcmFjdGVyc317VHlwZX17Q29tbWVudH0KKyAgICBcbGluZWlpaXtcJVwlfXtcZW1waHtuL2F9fXtUaGUgbGl0ZXJhbCBcJSBjaGFyYWN0ZXIufQorICAgIFxsaW5laWlpe1wlY317aW50fXtBIHNpbmdsZSBjaGFyYWN0ZXIsIHJlcHJlc2VudGVkIGFzIGFuIEMgaW50Ln0KKyAgICBcbGluZWlpaXtcJWR9e2ludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVkIil9Ln0KKyAgICBcbGluZWlpaXtcJXV9e3Vuc2lnbmVkIGludH17RXhhY3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCV1Iil9Ln0KKyAgICBcbGluZWlpaXtcJWxkfXtsb25nfXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWxkIil9Ln0KKyAgICBcbGluZWlpaXtcJWx1fXt1bnNpZ25lZCBsb25nfXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWx1Iil9Ln0KKyAgICBcbGluZWlpaXtcJXpkfXtQeV9zc2l6ZV90fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXpkIil9Ln0KKyAgICBcbGluZWlpaXtcJXp1fXtzaXplX3R9e0V4YWN0bHkgZXF1aXZhbGVudCB0byBcY29kZXtwcmludGYoIlwlenUiKX0ufQorICAgIFxsaW5laWlpe1wlaX17aW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJWkiKX0ufQorICAgIFxsaW5laWlpe1wleH17aW50fXtFeGFjdGx5IGVxdWl2YWxlbnQgdG8gXGNvZGV7cHJpbnRmKCJcJXgiKX0ufQorICAgIFxsaW5laWlpe1wlc317Y2hhcip9e0EgbnVsbC10ZXJtaW5hdGVkIEMgY2hhcmFjdGVyIGFycmF5Ln0KKyAgICBcbGluZWlpaXtcJXB9e3ZvaWQqfXtUaGUgaGV4IHJlcHJlc2VudGF0aW9uIG9mIGEgQyBwb2ludGVyLgorCU1vc3RseSBlcXVpdmFsZW50IHRvIFxjb2Rle3ByaW50ZigiXCVwIil9IGV4Y2VwdCB0aGF0IGl0IGlzCisJZ3VhcmFudGVlZCB0byBzdGFydCB3aXRoIHRoZSBsaXRlcmFsIFxjb2RlezB4fSByZWdhcmRsZXNzIG9mCisJd2hhdCB0aGUgcGxhdGZvcm0ncyBcY29kZXtwcmludGZ9IHlpZWxkcy59CisgIFxlbmR7dGFibGVpaWl9CiAKICAgQW4gdW5yZWNvZ25pemVkIGZvcm1hdCBjaGFyYWN0ZXIgY2F1c2VzIGFsbCB0aGUgcmVzdCBvZiB0aGUgZm9ybWF0CiAgIHN0cmluZyB0byBiZSBjb3BpZWQgYXMtaXMgdG8gdGhlIHJlc3VsdCBzdHJpbmcsIGFuZCBhbnkgZXh0cmEKQEAgLTI3Miw4ICsyOTEsOCBAQAogICBjb21tYW5kIGxpbmUgZG9jdW1lbnRhdGlvbi4gIFRoZXJlIGlzIG5vIEMgQVBJIGZvciB3YXJuaW5nIGNvbnRyb2wuCiBcZW5ke2NmdW5jZGVzY30KIAotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUVycl9XYXJuRXhwbGljaXR9e1B5T2JqZWN0ICpjYXRlZ29yeSwgCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8sIAorXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUVycl9XYXJuRXhwbGljaXR9e1B5T2JqZWN0ICpjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubywKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2R1bGUsIFB5T2JqZWN0ICpyZWdpc3RyeX0KICAgSXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2Ugd2l0aCBleHBsaWNpdCBjb250cm9sIG92ZXIgYWxsIHdhcm5pbmcKICAgYXR0cmlidXRlcy4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgd3JhcHBlciBhcm91bmQgdGhlIFB5dGhvbgpAQCAtMzE0LDEyICszMzMsMTQgQEAKICAgVGhlIFx2YXJ7bmFtZX0gYXJndW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGV4Y2VwdGlvbiwgYSBDCiAgIHN0cmluZyBvZiB0aGUgZm9ybSBcY29kZXttb2R1bGUuY2xhc3N9LiAgVGhlIFx2YXJ7YmFzZX0gYW5kCiAgIFx2YXJ7ZGljdH0gYXJndW1lbnRzIGFyZSBub3JtYWxseSBcTlVMTC4gIFRoaXMgY3JlYXRlcyBhIGNsYXNzCi0gIG9iamVjdCBkZXJpdmVkIGZyb20gdGhlIHJvb3QgZm9yIGFsbCBleGNlcHRpb25zLCB0aGUgYnVpbHQtaW4gbmFtZQotICBcZXhjZXB0aW9ue0V4Y2VwdGlvbn0gKGFjY2Vzc2libGUgaW4gQyBhcyBcY2RhdGF7UHlFeGNfRXhjZXB0aW9ufSkuCisgIG9iamVjdCBkZXJpdmVkIGZyb20gXGV4Y2VwdGlvbntFeGNlcHRpb259IChhY2Nlc3NpYmxlIGluIEMgYXMKKyAgXGNkYXRhe1B5RXhjX0V4Y2VwdGlvbn0pLgorCiAgIFRoZSBcbWVtYmVye19fbW9kdWxlX199IGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGNsYXNzIGlzIHNldCB0byB0aGUKICAgZmlyc3QgcGFydCAodXAgdG8gdGhlIGxhc3QgZG90KSBvZiB0aGUgXHZhcntuYW1lfSBhcmd1bWVudCwgYW5kIHRoZQogICBjbGFzcyBuYW1lIGlzIHNldCB0byB0aGUgbGFzdCBwYXJ0IChhZnRlciB0aGUgbGFzdCBkb3QpLiAgVGhlCi0gIFx2YXJ7YmFzZX0gYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUgYmFzZSBjbGFzcy4KKyAgXHZhcntiYXNlfSBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFsdGVybmF0ZSBiYXNlIGNsYXNzZXM7CisgIGl0IGNhbiBlaXRoZXIgYmUgb25seSBvbmUgY2xhc3Mgb3IgYSB0dXBsZSBvZiBjbGFzc2VzLgogICBUaGUgXHZhcntkaWN0fSBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZGljdGlvbmFyeSBvZiBjbGFzcwogICB2YXJpYWJsZXMgYW5kIG1ldGhvZHMuCiBcZW5ke2NmdW5jZGVzY30KQEAgLTM5OSw1ICs0MjAsNSBAQAogXHdpdGhzdWJpdGVteyhidWlsdC1pbiBleGNlcHRpb24pfXtcdHRpbmRleHtCYXNlRXhjZXB0aW9ufX0KIAogU3RyaW5nIGV4Y2VwdGlvbnMgYXJlIHN0aWxsIHN1cHBvcnRlZCBpbiB0aGUgaW50ZXJwcmV0ZXIgdG8gYWxsb3cKLWV4aXN0aW5nIGNvZGUgdG8gcnVuIHVubW9kaWZpZWQsIGJ1dCB0aGlzIHdpbGwgYWxzbyBjaGFuZ2UgaW4gYSBmdXR1cmUgCitleGlzdGluZyBjb2RlIHRvIHJ1biB1bm1vZGlmaWVkLCBidXQgdGhpcyB3aWxsIGFsc28gY2hhbmdlIGluIGEgZnV0dXJlCiByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvRG9jL2FwaS9uZXd0eXBlcy50ZXggYi9Eb2MvYXBpL25ld3R5cGVzLnRleAppbmRleCAyZDc1OGIwLi4yOGY3N2Y3IDEwMDY0NAotLS0gYS9Eb2MvYXBpL25ld3R5cGVzLnRleAorKysgYi9Eb2MvYXBpL25ld3R5cGVzLnRleApAQCAtODgzLDggKzg4MywzOSBAQAogXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e3RyYXZlcnNlcHJvY317dHBfdHJhdmVyc2V9CiAgIEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYSB0cmF2ZXJzYWwgZnVuY3Rpb24gZm9yIHRoZSBnYXJiYWdlCiAgIGNvbGxlY3Rvci4gIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX0dDfQotICBmbGFnIGJpdCBpcyBzZXQuICBNb3JlIGluZm9ybWF0aW9uIGluIHNlY3Rpb24KLSAgXHJlZntzdXBwb3J0aW5nLWN5Y2xlLWRldGVjdGlvbn0gYWJvdXQgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICBmbGFnIGJpdCBpcyBzZXQuICBNb3JlIGluZm9ybWF0aW9uIGFib3V0IFB5dGhvbidzIGdhcmJhZ2UgY29sbGVjdGlvbgorICBzY2hlbWUgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb24gXHJlZntzdXBwb3J0aW5nLWN5Y2xlLWRldGVjdGlvbn0uCisKKyAgVGhlIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IHBvaW50ZXIgaXMgdXNlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKKyAgdG8gZGV0ZWN0IHJlZmVyZW5jZSBjeWNsZXMuIEEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBvZiBhCisgIFxtZW1iZXJ7dHBfdHJhdmVyc2V9IGZ1bmN0aW9uIHNpbXBseSBjYWxscyBcY2Z1bmN0aW9ue1B5X1ZJU0lUKCl9IG9uCisgIGVhY2ggb2YgdGhlIGluc3RhbmNlJ3MgbWVtYmVycyB0aGF0IGFyZSBQeXRob24gb2JqZWN0cy4gIEZvciBleGFtcGUsIHRoaXMKKyAgaXMgZnVuY3Rpb24gXGNmdW5jdGlvbntsb2NhbF90cmF2ZXJzZX0gZnJvbSB0aGUgXG1vZHVsZXt0aHJlYWR9IGV4dGVuc2lvbgorICBtb2R1bGU6CisKKyAgXGJlZ2lue3ZlcmJhdGltfQorICBzdGF0aWMgaW50CisgIGxvY2FsX3RyYXZlcnNlKGxvY2Fsb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgeworICAgICAgUHlfVklTSVQoc2VsZi0+YXJncyk7CisgICAgICBQeV9WSVNJVChzZWxmLT5rdyk7CisgICAgICBQeV9WSVNJVChzZWxmLT5kaWN0KTsKKyAgICAgIHJldHVybiAwOworICB9CisgIFxlbmR7dmVyYmF0aW19CisKKyAgTm90ZSB0aGF0IFxjZnVuY3Rpb257UHlfVklTSVQoKX0gaXMgY2FsbGVkIG9ubHkgb24gdGhvc2UgbWVtYmVycyB0aGF0IGNhbgorICBwYXJ0aWNpcGF0ZSBpbiByZWZlcmVuY2UgY3ljbGVzLiAgQWx0aG91Z2ggdGhlcmUgaXMgYWxzbyBhCisgIFxzYW1we3NlbGYtPmtleX0gbWVtYmVyLCBpdCBjYW4gb25seSBiZSBcTlVMTHt9IG9yIGEgUHl0aG9uIHN0cmluZyBhbmQKKyAgdGhlcmVmb3JlIGNhbm5vdCBiZSBwYXJ0IG9mIGEgcmVmZXJlbmNlIGN5Y2xlLgorCisgIE9uIHRoZSBvdGhlciBoYW5kLCBldmVuIGlmIHlvdSBrbm93IGEgbWVtYmVyIGNhbiBuZXZlciBiZSBwYXJ0IG9mIGEgY3ljbGUsCisgIGFzIGEgZGVidWdnaW5nIGFpZCB5b3UgbWF5IHdhbnQgdG8gdmlzaXQgaXQgYW55d2F5IGp1c3Qgc28gdGhlCisgIFxtb2R1bGV7Z2N9IG1vZHVsZSdzIFxmdW5jdGlvbntnZXRfcmVmZXJlbnRzKCl9IGZ1bmN0aW9uIHdpbGwgaW5jbHVkZSBpdC4KKworICBOb3RlIHRoYXQgXGNmdW5jdGlvbntQeV9WSVNJVCgpfSByZXF1aXJlcyB0aGUgXHZhcnt2aXNpdH0gYW5kIFx2YXJ7YXJnfQorICBwYXJhbWV0ZXJzIHRvIFxjZnVuY3Rpb257bG9jYWxfdHJhdmVyc2V9IHRvIGhhdmUgdGhlc2Ugc3BlY2lmaWMgbmFtZXM7CisgIGRvbid0IG5hbWUgdGhlbSBqdXN0IGFueXRoaW5nLgogCiAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggXG1lbWJlcnt0cF9jbGVhcn0KICAgYW5kIHRoZSBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX0dDfSBmbGFnIGJpdDogdGhlIGZsYWcgYml0LApAQCAtODk2LDggKzkyNyw1NyBAQAogXGJlZ2lue2NtZW1iZXJkZXNjfXtQeVR5cGVPYmplY3R9e2lucXVpcnl9e3RwX2NsZWFyfQogICBBbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgY2xlYXIgZnVuY3Rpb24gZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KICAgVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIFxjb25zdGFudHtQeV9UUEZMQUdTX0hBVkVfR0N9IGZsYWcgYml0IGlzCi0gIHNldC4gIE1vcmUgaW5mb3JtYXRpb24gaW4gc2VjdGlvbgotICBccmVme3N1cHBvcnRpbmctY3ljbGUtZGV0ZWN0aW9ufSBhYm91dCBnYXJiYWdlIGNvbGxlY3Rpb24uCisgIHNldC4KKworICBUaGUgXG1lbWJlcnt0cF9jbGVhcn0gbWVtYmVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYnJlYWsgcmVmZXJlbmNlCisgIGN5Y2xlcyBpbiBjeWNsaWMgZ2FyYmFnZSBkZXRlY3RlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuICBUYWtlbgorICB0b2dldGhlciwgYWxsIFxtZW1iZXJ7dHBfY2xlYXJ9IGZ1bmN0aW9ucyBpbiB0aGUgc3lzdGVtIG11c3QgY29tYmluZSB0bworICBicmVhayBhbGwgcmVmZXJlbmNlIGN5Y2xlcy4gIFRoaXMgaXMgc3VidGxlLCBhbmQgaWYgaW4gYW55IGRvdWJ0IHN1cHBseSBhCisgIFxtZW1iZXJ7dHBfY2xlYXJ9IGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSB0dXBsZSB0eXBlIGRvZXMgbm90CisgIGltcGxlbWVudCBhIFxtZW1iZXJ7dHBfY2xlYXJ9IGZ1bmN0aW9uLCBiZWNhdXNlIGl0J3MgcG9zc2libGUgdG8gcHJvdmUKKyAgdGhhdCBubyByZWZlcmVuY2UgY3ljbGUgY2FuIGJlIGNvbXBvc2VkIGVudGlyZWx5IG9mIHR1cGxlcy4gIFRoZXJlZm9yZQorICB0aGUgXG1lbWJlcnt0cF9jbGVhcn0gZnVuY3Rpb25zIG9mIG90aGVyIHR5cGVzIG11c3QgYmUgc3VmZmljaWVudCB0bworICBicmVhayBhbnkgY3ljbGUgY29udGFpbmluZyBhIHR1cGxlLiAgVGhpcyBpc24ndCBpbW1lZGlhdGVseSBvYnZpb3VzLCBhbmQKKyAgdGhlcmUncyByYXJlbHkgYSBnb29kIHJlYXNvbiB0byBhdm9pZCBpbXBsZW1lbnRpbmcgXG1lbWJlcnt0cF9jbGVhcn0uCisKKyAgSW1wbGVtZW50YXRpb25zIG9mIFxtZW1iZXJ7dHBfY2xlYXJ9IHNob3VsZCBkcm9wIHRoZSBpbnN0YW5jZSdzCisgIHJlZmVyZW5jZXMgdG8gdGhvc2Ugb2YgaXRzIG1lbWJlcnMgdGhhdCBtYXkgYmUgUHl0aG9uIG9iamVjdHMsIGFuZCBzZXQKKyAgaXRzIHBvaW50ZXJzIHRvIHRob3NlIG1lbWJlcnMgdG8gXE5VTEx7fSwgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisgIFxiZWdpbnt2ZXJiYXRpbX0KKyAgc3RhdGljIGludAorICBsb2NhbF9jbGVhcihsb2NhbG9iamVjdCAqc2VsZikKKyAgeworICAgICAgUHlfQ0xFQVIoc2VsZi0+a2V5KTsKKyAgICAgIFB5X0NMRUFSKHNlbGYtPmFyZ3MpOworICAgICAgUHlfQ0xFQVIoc2VsZi0+a3cpOworICAgICAgUHlfQ0xFQVIoc2VsZi0+ZGljdCk7CisgICAgICByZXR1cm4gMDsKKyAgfQorICBcZW5ke3ZlcmJhdGltfQorCisgIFRoZSBcY2Z1bmN0aW9ue1B5X0NMRUFSKCl9IG1hY3JvIHNob3VsZCBiZSB1c2VkLCBiZWNhdXNlIGNsZWFyaW5nCisgIHJlZmVyZW5jZXMgaXMgZGVsaWNhdGU6ICB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjb250YWluZWQgb2JqZWN0IG11c3Qgbm90IGJlCisgIGRlY3JlbWVudGVkIHVudGlsIGFmdGVyIHRoZSBwb2ludGVyIHRvIHRoZSBjb250YWluZWQgb2JqZWN0IGlzIHNldCB0bworICBcTlVMTHt9LiAgVGhpcyBpcyBiZWNhdXNlIGRlY3JlbWVudGluZyB0aGUgcmVmZXJlbmNlIGNvdW50IG1heSBjYXVzZQorICB0aGUgY29udGFpbmVkIG9iamVjdCB0byBiZWNvbWUgdHJhc2gsIHRyaWdnZXJpbmcgYSBjaGFpbiBvZiByZWNsYW1hdGlvbgorICBhY3Rpdml0eSB0aGF0IG1heSBpbmNsdWRlIGludm9raW5nIGFyYml0cmFyeSBQeXRob24gY29kZSAoZHVlIHRvCisgIGZpbmFsaXplcnMsIG9yIHdlYWtyZWYgY2FsbGJhY2tzLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRhaW5lZCBvYmplY3QpLgorICBJZiBpdCdzIHBvc3NpYmxlIGZvciBzdWNoIGNvZGUgdG8gcmVmZXJlbmNlIFx2YXJ7c2VsZn0gYWdhaW4sIGl0J3MKKyAgaW1wb3J0YW50IHRoYXQgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3QgYmUgXE5VTEx7fSBhdCB0aGF0CisgIHRpbWUsIHNvIHRoYXQgXHZhcntzZWxmfSBrbm93cyB0aGUgY29udGFpbmVkIG9iamVjdCBjYW4gbm8gbG9uZ2VyIGJlCisgIHVzZWQuICBUaGUgXGNmdW5jdGlvbntQeV9DTEVBUigpfSBtYWNybyBwZXJmb3JtcyB0aGUgb3BlcmF0aW9ucyBpbiBhCisgIHNhZmUgb3JkZXIuCisKKyAgQmVjYXVzZSB0aGUgZ29hbCBvZiBcbWVtYmVye3RwX2NsZWFyfSBmdW5jdGlvbnMgaXMgdG8gYnJlYWsgcmVmZXJlbmNlCisgIGN5Y2xlcywgaXQncyBub3QgbmVjZXNzYXJ5IHRvIGNsZWFyIGNvbnRhaW5lZCBvYmplY3RzIGxpa2UgUHl0aG9uIHN0cmluZ3MKKyAgb3IgUHl0aG9uIGludGVnZXJzLCB3aGljaCBjYW4ndCBwYXJ0aWNpcGF0ZSBpbiByZWZlcmVuY2UgY3ljbGVzLgorICBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWF5IGJlIGNvbnZlbmllbnQgdG8gY2xlYXIgYWxsIGNvbnRhaW5lZCBQeXRob24KKyAgb2JqZWN0cywgYW5kIHdyaXRlIHRoZSB0eXBlJ3MgXG1lbWJlcnt0cF9kZWFsbG9jfSBmdW5jdGlvbiB0bworICBpbnZva2UgXG1lbWJlcnt0cF9jbGVhcn0uCisKKyAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBQeXRob24ncyBnYXJiYWdlIGNvbGxlY3Rpb24KKyAgc2NoZW1lIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uIFxyZWZ7c3VwcG9ydGluZy1jeWNsZS1kZXRlY3Rpb259LgogCiAgIFRoaXMgZmllbGQgaXMgaW5oZXJpdGVkIGJ5IHN1YnR5cGVzIHRvZ2V0aGVyIHdpdGggXG1lbWJlcnt0cF9jbGVhcn0KICAgYW5kIHRoZSBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX0dDfSBmbGFnIGJpdDogdGhlIGZsYWcgYml0LApAQCAtOTEwLDEwICs5OTAsMTAgQEAKICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byB0aGUgcmljaCBjb21wYXJpc29uIGZ1bmN0aW9uLgogCiAgIFRoZSBzaWduYXR1cmUgaXMgdGhlIHNhbWUgYXMgZm9yIFxjZnVuY3Rpb257UHlPYmplY3RfUmljaENvbXBhcmUoKX0uCi0gIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIFxjb2RlezF9IGlmIHRoZSByZXF1ZXN0ZWQgY29tcGFyaXNvbgotICByZXR1cm5zIHRydWUsIFxjb2RlezB9IGlmIGl0IHJldHVybnMgZmFsc2UuICBJdCBzaG91bGQgcmV0dXJuCi0gIFxjb2Rley0xfSBhbmQgc2V0IGFuIGV4Y2VwdGlvbiBjb25kaXRpb24gd2hlbiBhbiBlcnJvciBvY2N1cnJlZAotICBkdXJpbmcgdGhlIGNvbXBhcmlzb24uCisgIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gKHVzdWFsbHkKKyAgXGNvZGV7UHlfVHJ1ZX0gb3IgXGNvZGV7UHlfRmFsc2V9KS4gIElmIHRoZSBjb21wYXJpc29uIGlzIHVuZGVmaW5lZCwKKyAgaXQgbXVzdCByZXR1cm4gXGNvZGV7UHlfTm90SW1wbGVtZW50ZWR9LCBpZiBhbm90aGVyIGVycm9yIG9jY3VycmVkCisgIGl0IG11c3QgcmV0dXJuIFxjb2Rle05VTEx9IGFuZCBzZXQgYW4gZXhjZXB0aW9uIGNvbmRpdGlvbi4KIAogICBUaGlzIGZpZWxkIGlzIGluaGVyaXRlZCBieSBzdWJ0eXBlcyB0b2dldGhlciB3aXRoCiAgIFxtZW1iZXJ7dHBfY29tcGFyZX0gYW5kIFxtZW1iZXJ7dHBfaGFzaH06IGEgc3VidHlwZSBpbmhlcml0cyBhbGwKZGlmZiAtLWdpdCBhL0RvYy9hcGkvcmVmY291bnRzLmRhdCBiL0RvYy9hcGkvcmVmY291bnRzLmRhdAppbmRleCA3YmJhMDExLi5hYjZkODY1IDEwMDY0NAotLS0gYS9Eb2MvYXBpL3JlZmNvdW50cy5kYXQKKysrIGIvRG9jL2FwaS9yZWZjb3VudHMuZGF0CkBAIC0xMTQ3LDcgKzExNDcsNyBAQAogUHlTZXRfTmV3OlB5T2JqZWN0Kjo6KzE6CiBQeVNldF9OZXc6UHlPYmplY3QqOml0ZXJhYmxlOjA6CiAKLVB5U2V0X1BvcDpQeU9iamVjdCo6OjA6b3IgcmV0dXJucyBOVUxMIGFuZCByYWlzZXMgS2V5RXJyb3IgaWYgc2V0IGlzIGVtcHR5CitQeVNldF9Qb3A6UHlPYmplY3QqOjorMTpvciByZXR1cm5zIE5VTEwgYW5kIHJhaXNlcyBLZXlFcnJvciBpZiBzZXQgaXMgZW1wdHkKIFB5U2V0X1BvcDpQeU9iamVjdCo6c2V0OjA6CiAKIFB5U2V0X1NpemU6aW50Ojo6CmRpZmYgLS1naXQgYS9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleCBiL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CmluZGV4IDU1YTQxODQuLmI0YzlmNDggMTAwNjQ0Ci0tLSBhL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CisrKyBiL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CkBAIC01LDUgKzUsNSBAQAogCUVtYWlsOiBcZW1haWx7ZG9jc0BweXRob24ub3JnfQogfQogCi1cZGF0ZXs1dGggQXByaWwgMjAwNn0JCQklIFhYWCB1cGRhdGUgYmVmb3JlIGZpbmFsIHJlbGVhc2UhCitcZGF0ZXtcdG9kYXl9CQkJJSBYWFggdXBkYXRlIGJlZm9yZSBmaW5hbCByZWxlYXNlIQogXGlucHV0e3BhdGNobGV2ZWx9CQklIGluY2x1ZGUgUHl0aG9uIHZlcnNpb24gaW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL0RvYy9kaXN0L2Rpc3QudGV4IGIvRG9jL2Rpc3QvZGlzdC50ZXgKaW5kZXggM2JhNTFkMC4uOTk3MGVjMiAxMDA2NDQKLS0tIGEvRG9jL2Rpc3QvZGlzdC50ZXgKKysrIGIvRG9jL2Rpc3QvZGlzdC50ZXgKQEAgLTE3NjAsMTYgKzE3NjAsMTYgQEAKIFVSTCBmcm9tIHRoZSBcZmlsZXtcJEhPTUUvLnB5cGlyY30gZmlsZSAoc2VlIHNlY3Rpb25+XHJlZntweXBpcmN9IGZvcgogbW9yZSBvbiB0aGlzIGZpbGUpLgogCi1Zb3UgY2FuIHVzZSB0aGUgXHByb2dyYW1vcHR7LS1zaWdufSBvcHRpb24gdG8gdGVsbCBcY29tbWFuZHt1cGxvYWR9IHRvCitZb3UgY2FuIHVzZSB0aGUgXGxvbmdwcm9ncmFtb3B0e3NpZ259IG9wdGlvbiB0byB0ZWxsIFxjb21tYW5ke3VwbG9hZH0gdG8KIHNpZ24gZWFjaCB1cGxvYWRlZCBmaWxlIHVzaW5nIEdQRyAoR05VIFByaXZhY3kgR3VhcmQpLiAgVGhlIAogXHByb2dyYW17Z3BnfSBwcm9ncmFtIG11c3QgYmUgYXZhaWxhYmxlIGZvciBleGVjdXRpb24gb24gdGhlIHN5c3RlbQogXGVudnZhcntQQVRIfS4gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoaWNoIGtleSB0byB1c2UgZm9yIHNpZ25pbmcKLXVzaW5nIHRoZSBccHJvZ3JhbW9wdHstLWlkZW50aXR5PVx2YXJ7bmFtZX19IG9wdGlvbi4KK3VzaW5nIHRoZSBcbG9uZ3Byb2dyYW1vcHR7aWRlbnRpdHk9XHZhcntuYW1lfX0gb3B0aW9uLgogCiBPdGhlciBcY29tbWFuZHt1cGxvYWR9IG9wdGlvbnMgaW5jbHVkZSAKLVxwcm9ncmFtb3B0ey0tcmVwb3NpdG9yeT1cdmFye3VybH19ICh3aGljaCBsZXRzIHlvdSBvdmVycmlkZSB0aGUKK1xsb25ncHJvZ3JhbW9wdHtyZXBvc2l0b3J5PVx2YXJ7dXJsfX0gKHdoaWNoIGxldHMgeW91IG92ZXJyaWRlIHRoZQogcmVwb3NpdG9yeSBzZXR0aW5nIGZyb20gXGZpbGV7XCRIT01FLy5weXBpcmN9KSwgYW5kCi1ccHJvZ3JhbW9wdHstLXNob3ctcmVzcG9uc2V9ICh3aGljaCBkaXNwbGF5cyB0aGUgZnVsbCByZXNwb25zZSB0ZXh0CitcbG9uZ3Byb2dyYW1vcHR7c2hvdy1yZXNwb25zZX0gKHdoaWNoIGRpc3BsYXlzIHRoZSBmdWxsIHJlc3BvbnNlIHRleHQKIGZyb20gdGhlIFB5UEkgc2VydmVyIGZvciBoZWxwIGluIGRlYnVnZ2luZyB1cGxvYWQgcHJvYmxlbXMpLgogCiBcY2hhcHRlcntFeGFtcGxlc30KZGlmZiAtLWdpdCBhL0RvYy9leHQvd2luZG93cy50ZXggYi9Eb2MvZXh0L3dpbmRvd3MudGV4CmluZGV4IGE4MjEwOTQuLmNhMThhMWUgMTAwNjQ0Ci0tLSBhL0RvYy9leHQvd2luZG93cy50ZXgKKysrIGIvRG9jL2V4dC93aW5kb3dzLnRleApAQCAtODgsNyArODgsNyBAQAogICAgIE9uY2UgdGhlIERlYnVnIGJ1aWxkIGhhcyBzdWNjZWVkZWQsIGJyaW5nIHVwIGEgRE9TIGJveCwgYW5kIGNoYW5nZQogICAgIHRvIHRoZSBcZmlsZXtleGFtcGxlX250XHRleHRiYWNrc2xhc2ggRGVidWd9IGRpcmVjdG9yeS4gIFlvdQogICAgIHNob3VsZCBub3cgYmUgYWJsZSB0byByZXBlYXQgdGhlIGZvbGxvd2luZyBzZXNzaW9uIChcY29kZXtDPn0gaXMKLSAgICB0aGUgRE9TIHByb21wdCwgXGNvZGV7Plxjb2Rlez59Pn0gaXMgdGhlIFB5dGhvbiBwcm9tcHQ7IG5vdGUgdGhhdAorICAgIHRoZSBET1MgcHJvbXB0LCBcY29kZXs+Pj59IGlzIHRoZSBQeXRob24gcHJvbXB0OyBub3RlIHRoYXQKICAgICBidWlsZCBpbmZvcm1hdGlvbiBhbmQgdmFyaW91cyBkZWJ1ZyBvdXRwdXQgZnJvbSBQeXRob24gbWF5IG5vdAogICAgIG1hdGNoIHRoaXMgc2NyZWVuIGR1bXAgZXhhY3RseSk6CiAKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by91bmljb2RlLnJzdCBiL0RvYy9ob3d0by91bmljb2RlLnJzdAppbmRleCAwOTQ2YmRjLi5mOTI0NzFhIDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vdW5pY29kZS5yc3QKKysrIGIvRG9jL2hvd3RvL3VuaWNvZGUucnN0CkBAIC0xNTgsNyArMTU4LDcgQEAKIEVuY29kaW5ncyBkb24ndCBoYXZlIHRvIGhhbmRsZSBldmVyeSBwb3NzaWJsZSBVbmljb2RlIGNoYXJhY3RlciwgYW5kCiBtb3N0IGVuY29kaW5ncyBkb24ndC4gIEZvciBleGFtcGxlLCBQeXRob24ncyBkZWZhdWx0IGVuY29kaW5nIGlzIHRoZQogJ2FzY2lpJyBlbmNvZGluZy4gIFRoZSBydWxlcyBmb3IgY29udmVydGluZyBhIFVuaWNvZGUgc3RyaW5nIGludG8gdGhlCi1BU0NJSSBlbmNvZGluZyBhcmUgYXJlIHNpbXBsZTsgZm9yIGVhY2ggY29kZSBwb2ludDoKK0FTQ0lJIGVuY29kaW5nIGFyZSBzaW1wbGU7IGZvciBlYWNoIGNvZGUgcG9pbnQ6CiAKIDEuIElmIHRoZSBjb2RlIHBvaW50IGlzIDwxMjgsIGVhY2ggYnl0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgb2YgdGhlIAogICAgY29kZSBwb2ludC4KQEAgLTcyMSw3ICs3MjEsNyBAQAogVGhhbmtzIHRvIHRoZSBmb2xsb3dpbmcgcGVvcGxlIHdobyBoYXZlIG5vdGVkIGVycm9ycyBvciBvZmZlcmVkCiBzdWdnZXN0aW9ucyBvbiB0aGlzIGFydGljbGU6IE5pY2hvbGFzIEJhc3RpbiwgCiBNYXJpdXMgR2VkbWluYXMsIEtlbnQgSm9obnNvbiwgS2VuIEtydWdsZXIsCi1NYXJjLUFuZHLDqSBMZW1idXJnLCBNYXJ0aW4gdm9uIEzDtndpcy4KK01hcmMtQW5kcsOpIExlbWJ1cmcsIE1hcnRpbiB2b24gTMO2d2lzLCBDaGFkIFdoaXRhY3JlLgogCiBWZXJzaW9uIDEuMDogcG9zdGVkIEF1Z3VzdCA1IDIwMDUuCiAKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by91cmxsaWIyLnJzdCBiL0RvYy9ob3d0by91cmxsaWIyLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNlNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2hvd3RvL3VybGxpYjIucnN0CkBAIC0wLDAgKzEsNTk4IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgSE9XVE8gRmV0Y2ggSW50ZXJuZXQgUmVzb3VyY2VzIFVzaW5nIHVybGxpYjIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRmV0Y2hpbmcgVVJMcyBXaXRoIFB5dGhvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy4uIG5vdGU6OgorCisgICAgVGhlcmUgaXMgYW4gRnJlbmNoIHRyYW5zbGF0aW9uIG9mIGFuIGVhcmxpZXIgcmV2aXNpb24gb2YgdGhpcworICAgIEhPV1RPLCBhdmFpbGFibGUgYXQgYHVybGxpYjIgLSBMZSBNYW51ZWwgbWFucXVhbnQKKyAgICA8aHR0cDovL3d3dy52b2lkc3BhY2UvcHl0aG9uL2FydGljbGVzL3VybGxpYjJfZnJhbmNhaXMuc2h0bWw+YF8uCisKKy4uIGNvbnRlbnRzOjogdXJsbGliMiBUdXRvcmlhbAorIAorCitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCisuLiBzaWRlYmFyOjogUmVsYXRlZCBBcnRpY2xlcworCisgICAgWW91IG1heSBhbHNvIGZpbmQgdXNlZnVsIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSBvbiBmZXRjaGluZyB3ZWIKKyAgICByZXNvdXJjZXMgd2l0aCBQeXRob24gOgorICAgIAorICAgICogYEJhc2ljIEF1dGhlbnRpY2F0aW9uIDxodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcudWsvcHl0aG9uL2FydGljbGVzL2F1dGhlbnRpY2F0aW9uLnNodG1sPmBfCisgICAgCisgICAgICAgIEEgdHV0b3JpYWwgb24gKkJhc2ljIEF1dGhlbnRpY2F0aW9uKiwgd2l0aCBleGFtcGxlcyBpbiBQeXRob24uCisgICAgCisgICAgVGhpcyBIT1dUTyBpcyB3cml0dGVuIGJ5IGBNaWNoYWVsIEZvb3JkCisgICAgPGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9weXRob24vaW5kZXguc2h0bWw+YF8uCisKKyoqdXJsbGliMioqIGlzIGEgYFB5dGhvbiA8aHR0cDovL3d3dy5weXRob24ub3JnPmBfIG1vZHVsZSBmb3IgZmV0Y2hpbmcgVVJMcworKFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvcnMpLiBJdCBvZmZlcnMgYSB2ZXJ5IHNpbXBsZSBpbnRlcmZhY2UsIGluIHRoZSBmb3JtIG9mCit0aGUgKnVybG9wZW4qIGZ1bmN0aW9uLiBUaGlzIGlzIGNhcGFibGUgb2YgZmV0Y2hpbmcgVVJMcyB1c2luZyBhIHZhcmlldHkKK29mIGRpZmZlcmVudCBwcm90b2NvbHMuIEl0IGFsc28gb2ZmZXJzIGEgc2xpZ2h0bHkgbW9yZSBjb21wbGV4CitpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIGNvbW1vbiBzaXR1YXRpb25zIC0gbGlrZSBiYXNpYyBhdXRoZW50aWNhdGlvbiwKK2Nvb2tpZXMsIHByb3hpZXMgYW5kIHNvIG9uLiBUaGVzZSBhcmUgcHJvdmlkZWQgYnkgb2JqZWN0cyBjYWxsZWQKK2hhbmRsZXJzIGFuZCBvcGVuZXJzLgorCit1cmxsaWIyIHN1cHBvcnRzIGZldGNoaW5nIFVSTHMgZm9yIG1hbnkgIlVSTCBzY2hlbWVzIiAoaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nCitiZWZvcmUgdGhlICI6IiBpbiBVUkwgLSBmb3IgZXhhbXBsZSAiZnRwIiBpcyB0aGUgVVJMIHNjaGVtZSBvZgorImZ0cDovL3B5dGhvbi5vcmcvIikgdXNpbmcgdGhlaXIgYXNzb2NpYXRlZCBuZXR3b3JrIHByb3RvY29scyAoZS5nLiBGVFAsIEhUVFApLgorVGhpcyB0dXRvcmlhbCBmb2N1c2VzIG9uIHRoZSBtb3N0IGNvbW1vbiBjYXNlLCBIVFRQLgorCitGb3Igc3RyYWlnaHRmb3J3YXJkIHNpdHVhdGlvbnMgKnVybG9wZW4qIGlzIHZlcnkgZWFzeSB0byB1c2UuIEJ1dCBhcworc29vbiBhcyB5b3UgZW5jb3VudGVyIGVycm9ycyBvciBub24tdHJpdmlhbCBjYXNlcyB3aGVuIG9wZW5pbmcgSFRUUAorVVJMcywgeW91IHdpbGwgbmVlZCBzb21lIHVuZGVyc3RhbmRpbmcgb2YgdGhlIEh5cGVyVGV4dCBUcmFuc2ZlcgorUHJvdG9jb2wuIFRoZSBtb3N0IGNvbXByZWhlbnNpdmUgYW5kIGF1dGhvcml0YXRpdmUgcmVmZXJlbmNlIHRvIEhUVFAKK2lzIDpSRkM6YDI2MTZgLiBUaGlzIGlzIGEgdGVjaG5pY2FsIGRvY3VtZW50IGFuZCBub3QgaW50ZW5kZWQgdG8gYmUKK2Vhc3kgdG8gcmVhZC4gVGhpcyBIT1dUTyBhaW1zIHRvIGlsbHVzdHJhdGUgdXNpbmcgKnVybGxpYjIqLCB3aXRoCitlbm91Z2ggZGV0YWlsIGFib3V0IEhUVFAgdG8gaGVscCB5b3UgdGhyb3VnaC4gSXQgaXMgbm90IGludGVuZGVkIHRvCityZXBsYWNlIHRoZSBgdXJsbGliMiBkb2NzIDxodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYi9tb2R1bGUtdXJsbGliMi5odG1sPmBfICwKK2J1dCBpcyBzdXBwbGVtZW50YXJ5IHRvIHRoZW0uCisKKworRmV0Y2hpbmcgVVJMcworPT09PT09PT09PT09PQorCitUaGUgc2ltcGxlc3Qgd2F5IHRvIHVzZSB1cmxsaWIyIGlzIGFzIGZvbGxvd3MgOiA6OgorCisgICAgaW1wb3J0IHVybGxpYjIKKyAgICByZXNwb25zZSA9IHVybGxpYjIudXJsb3BlbignaHR0cDovL3B5dGhvbi5vcmcvJykKKyAgICBodG1sID0gcmVzcG9uc2UucmVhZCgpCisKK01hbnkgdXNlcyBvZiB1cmxsaWIyIHdpbGwgYmUgdGhhdCBzaW1wbGUgKG5vdGUgdGhhdCBpbnN0ZWFkIG9mIGFuCisnaHR0cDonIFVSTCB3ZSBjb3VsZCBoYXZlIHVzZWQgYW4gVVJMIHN0YXJ0aW5nIHdpdGggJ2Z0cDonLCAnZmlsZTonLAorZXRjLikuICBIb3dldmVyLCBpdCdzIHRoZSBwdXJwb3NlIG9mIHRoaXMgdHV0b3JpYWwgdG8gZXhwbGFpbiB0aGUgbW9yZQorY29tcGxpY2F0ZWQgY2FzZXMsIGNvbmNlbnRyYXRpbmcgb24gSFRUUC4KKworSFRUUCBpcyBiYXNlZCBvbiByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIC0gdGhlIGNsaWVudCBtYWtlcyByZXF1ZXN0cworYW5kIHNlcnZlcnMgc2VuZCByZXNwb25zZXMuIHVybGxpYjIgbWlycm9ycyB0aGlzIHdpdGggYSBgYFJlcXVlc3RgYAorb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIEhUVFAgcmVxdWVzdCB5b3UgYXJlIG1ha2luZy4gSW4gaXRzCitzaW1wbGVzdCBmb3JtIHlvdSBjcmVhdGUgYSBSZXF1ZXN0IG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgVVJMIHlvdQord2FudCB0byBmZXRjaC4gQ2FsbGluZyBgYHVybG9wZW5gYCB3aXRoIHRoaXMgUmVxdWVzdCBvYmplY3QgcmV0dXJucyBhCityZXNwb25zZSBvYmplY3QgZm9yIHRoZSBVUkwgcmVxdWVzdGVkLiBUaGlzIHJlc3BvbnNlIGlzIGEgZmlsZS1saWtlCitvYmplY3QsIHdoaWNoIG1lYW5zIHlvdSBjYW4gZm9yIGV4YW1wbGUgY2FsbCAucmVhZCgpIG9uIHRoZSByZXNwb25zZSA6Cis6OgorCisgICAgaW1wb3J0IHVybGxpYjIKKworICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCgnaHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrJykKKyAgICByZXNwb25zZSA9IHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgdGhlX3BhZ2UgPSByZXNwb25zZS5yZWFkKCkKKworTm90ZSB0aGF0IHVybGxpYjIgbWFrZXMgdXNlIG9mIHRoZSBzYW1lIFJlcXVlc3QgaW50ZXJmYWNlIHRvIGhhbmRsZQorYWxsIFVSTCBzY2hlbWVzLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gbWFrZSBhbiBGVFAgcmVxdWVzdCBsaWtlIHNvOiA6OgorCisgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KCdmdHA6Ly9leGFtcGxlLmNvbS8nKQorCitJbiB0aGUgY2FzZSBvZiBIVFRQLCB0aGVyZSBhcmUgdHdvIGV4dHJhIHRoaW5ncyB0aGF0IFJlcXVlc3Qgb2JqZWN0cworYWxsb3cgeW91IHRvIGRvOiBGaXJzdCwgeW91IGNhbiBwYXNzIGRhdGEgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLgorU2Vjb25kLCB5b3UgY2FuIHBhc3MgZXh0cmEgaW5mb3JtYXRpb24gKCJtZXRhZGF0YSIpICphYm91dCogdGhlIGRhdGEKK29yIHRoZSBhYm91dCByZXF1ZXN0IGl0c2VsZiwgdG8gdGhlIHNlcnZlciAtIHRoaXMgaW5mb3JtYXRpb24gaXMgc2VudAorYXMgSFRUUCAiaGVhZGVycyIuICBMZXQncyBsb29rIGF0IGVhY2ggb2YgdGhlc2UgaW4gdHVybi4KKworRGF0YQorLS0tLQorCitTb21ldGltZXMgeW91IHdhbnQgdG8gc2VuZCBkYXRhIHRvIGEgVVJMIChvZnRlbiB0aGUgVVJMIHdpbGwgcmVmZXIgdG8KK2EgQ0dJIChDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UpIHNjcmlwdCBbI11fIG9yIG90aGVyIHdlYgorYXBwbGljYXRpb24pLiBXaXRoIEhUVFAsIHRoaXMgaXMgb2Z0ZW4gZG9uZSB1c2luZyB3aGF0J3Mga25vd24gYXMgYQorKipQT1NUKiogcmVxdWVzdC4gVGhpcyBpcyBvZnRlbiB3aGF0IHlvdXIgYnJvd3NlciBkb2VzIHdoZW4geW91IHN1Ym1pdAorYSBIVE1MIGZvcm0gdGhhdCB5b3UgZmlsbGVkIGluIG9uIHRoZSB3ZWIuIE5vdCBhbGwgUE9TVHMgaGF2ZSB0byBjb21lCitmcm9tIGZvcm1zOiB5b3UgY2FuIHVzZSBhIFBPU1QgdG8gdHJhbnNtaXQgYXJiaXRyYXJ5IGRhdGEgdG8geW91ciBvd24KK2FwcGxpY2F0aW9uLiBJbiB0aGUgY29tbW9uIGNhc2Ugb2YgSFRNTCBmb3JtcywgdGhlIGRhdGEgbmVlZHMgdG8gYmUKK2VuY29kZWQgaW4gYSBzdGFuZGFyZCB3YXksIGFuZCB0aGVuIHBhc3NlZCB0byB0aGUgUmVxdWVzdCBvYmplY3QgYXMKK3RoZSBgYGRhdGFgYCBhcmd1bWVudC4gVGhlIGVuY29kaW5nIGlzIGRvbmUgdXNpbmcgYSBmdW5jdGlvbiBmcm9tIHRoZQorYGB1cmxsaWJgYCBsaWJyYXJ5ICpub3QqIGZyb20gYGB1cmxsaWIyYGAuIDo6CisKKyAgICBpbXBvcnQgdXJsbGliCisgICAgaW1wb3J0IHVybGxpYjIgIAorCisgICAgdXJsID0gJ2h0dHA6Ly93d3cuc29tZXNlcnZlci5jb20vY2dpLWJpbi9yZWdpc3Rlci5jZ2knCisgICAgdmFsdWVzID0geyduYW1lJyA6ICdNaWNoYWVsIEZvb3JkJywKKyAgICAgICAgICAgICAgJ2xvY2F0aW9uJyA6ICdOb3J0aGFtcHRvbicsCisgICAgICAgICAgICAgICdsYW5ndWFnZScgOiAnUHl0aG9uJyB9CisKKyAgICBkYXRhID0gdXJsbGliLnVybGVuY29kZSh2YWx1ZXMpCisgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHVybCwgZGF0YSkKKyAgICByZXNwb25zZSA9IHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgdGhlX3BhZ2UgPSByZXNwb25zZS5yZWFkKCkKKworTm90ZSB0aGF0IG90aGVyIGVuY29kaW5ncyBhcmUgc29tZXRpbWVzIHJlcXVpcmVkIChlLmcuIGZvciBmaWxlIHVwbG9hZAorZnJvbSBIVE1MIGZvcm1zIC0gc2VlCitgSFRNTCBTcGVjaWZpY2F0aW9uLCBGb3JtIFN1Ym1pc3Npb24gPGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjEzPmBfCitmb3IgbW9yZSBkZXRhaWxzKS4KKworSWYgeW91IGRvIG5vdCBwYXNzIHRoZSBgYGRhdGFgYCBhcmd1bWVudCwgdXJsbGliMiB1c2VzIGEgKipHRVQqKgorcmVxdWVzdC4gT25lIHdheSBpbiB3aGljaCBHRVQgYW5kIFBPU1QgcmVxdWVzdHMgZGlmZmVyIGlzIHRoYXQgUE9TVAorcmVxdWVzdHMgb2Z0ZW4gaGF2ZSAic2lkZS1lZmZlY3RzIjogdGhleSBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZQorc3lzdGVtIGluIHNvbWUgd2F5IChmb3IgZXhhbXBsZSBieSBwbGFjaW5nIGFuIG9yZGVyIHdpdGggdGhlIHdlYnNpdGUKK2ZvciBhIGh1bmRyZWR3ZWlnaHQgb2YgdGlubmVkIHNwYW0gdG8gYmUgZGVsaXZlcmVkIHRvIHlvdXIgZG9vcikuCitUaG91Z2ggdGhlIEhUVFAgc3RhbmRhcmQgbWFrZXMgaXQgY2xlYXIgdGhhdCBQT1NUcyBhcmUgaW50ZW5kZWQgdG8KKyphbHdheXMqIGNhdXNlIHNpZGUtZWZmZWN0cywgYW5kIEdFVCByZXF1ZXN0cyAqbmV2ZXIqIHRvIGNhdXNlCitzaWRlLWVmZmVjdHMsIG5vdGhpbmcgcHJldmVudHMgYSBHRVQgcmVxdWVzdCBmcm9tIGhhdmluZyBzaWRlLWVmZmVjdHMsCitub3IgYSBQT1NUIHJlcXVlc3RzIGZyb20gaGF2aW5nIG5vIHNpZGUtZWZmZWN0cy4gRGF0YSBjYW4gYWxzbyBiZQorcGFzc2VkIGluIGFuIEhUVFAgR0VUIHJlcXVlc3QgYnkgZW5jb2RpbmcgaXQgaW4gdGhlIFVSTCBpdHNlbGYuCisKK1RoaXMgaXMgZG9uZSBhcyBmb2xsb3dzOjoKKworICAgID4+PiBpbXBvcnQgdXJsbGliMgorICAgID4+PiBpbXBvcnQgdXJsbGliCisgICAgPj4+IGRhdGEgPSB7fQorICAgID4+PiBkYXRhWyduYW1lJ10gPSAnU29tZWJvZHkgSGVyZScKKyAgICA+Pj4gZGF0YVsnbG9jYXRpb24nXSA9ICdOb3J0aGFtcHRvbicKKyAgICA+Pj4gZGF0YVsnbGFuZ3VhZ2UnXSA9ICdQeXRob24nCisgICAgPj4+IHVybF92YWx1ZXMgPSB1cmxsaWIudXJsZW5jb2RlKGRhdGEpCisgICAgPj4+IHByaW50IHVybF92YWx1ZXMKKyAgICBuYW1lPVNvbWVib2R5K0hlcmUmbGFuZ3VhZ2U9UHl0aG9uJmxvY2F0aW9uPU5vcnRoYW1wdG9uCisgICAgPj4+IHVybCA9ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL2V4YW1wbGUuY2dpJworICAgID4+PiBmdWxsX3VybCA9IHVybCArICc/JyArIHVybF92YWx1ZXMKKyAgICA+Pj4gZGF0YSA9IHVybGxpYjIub3BlbihmdWxsX3VybCkKKworTm90aWNlIHRoYXQgdGhlIGZ1bGwgVVJMIGlzIGNyZWF0ZWQgYnkgYWRkaW5nIGEgYGA/YGAgdG8gdGhlIFVSTCwgZm9sbG93ZWQgYnkKK3RoZSBlbmNvZGVkIHZhbHVlcy4KKworSGVhZGVycworLS0tLS0tLQorCitXZSdsbCBkaXNjdXNzIGhlcmUgb25lIHBhcnRpY3VsYXIgSFRUUCBoZWFkZXIsIHRvIGlsbHVzdHJhdGUgaG93IHRvCithZGQgaGVhZGVycyB0byB5b3VyIEhUVFAgcmVxdWVzdC4KKworU29tZSB3ZWJzaXRlcyBbI11fIGRpc2xpa2UgYmVpbmcgYnJvd3NlZCBieSBwcm9ncmFtcywgb3Igc2VuZAorZGlmZmVyZW50IHZlcnNpb25zIHRvIGRpZmZlcmVudCBicm93c2VycyBbI11fIC4gQnkgZGVmYXVsdCB1cmxsaWIyCitpZGVudGlmaWVzIGl0c2VsZiBhcyBgYFB5dGhvbi11cmxsaWIveC55YGAgKHdoZXJlIGBgeGBgIGFuZCBgYHlgYCBhcmUKK3RoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQeXRob24gcmVsZWFzZSwKK2UuZy4gYGBQeXRob24tdXJsbGliLzIuNWBgKSwgd2hpY2ggbWF5IGNvbmZ1c2UgdGhlIHNpdGUsIG9yIGp1c3QgcGxhaW4KK25vdCB3b3JrLiBUaGUgd2F5IGEgYnJvd3NlciBpZGVudGlmaWVzIGl0c2VsZiBpcyB0aHJvdWdoIHRoZQorYGBVc2VyLUFnZW50YGAgaGVhZGVyIFsjXV8uIFdoZW4geW91IGNyZWF0ZSBhIFJlcXVlc3Qgb2JqZWN0IHlvdSBjYW4KK3Bhc3MgYSBkaWN0aW9uYXJ5IG9mIGhlYWRlcnMgaW4uIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBtYWtlcyB0aGUgc2FtZQorcmVxdWVzdCBhcyBhYm92ZSwgYnV0IGlkZW50aWZpZXMgaXRzZWxmIGFzIGEgdmVyc2lvbiBvZiBJbnRlcm5ldAorRXhwbG9yZXIgWyNdXy4gOjoKKworICAgIGltcG9ydCB1cmxsaWIKKyAgICBpbXBvcnQgdXJsbGliMiAgCisgICAgCisgICAgdXJsID0gJ2h0dHA6Ly93d3cuc29tZXNlcnZlci5jb20vY2dpLWJpbi9yZWdpc3Rlci5jZ2knCisgICAgdXNlcl9hZ2VudCA9ICdNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA1LjU7IFdpbmRvd3MgTlQpJyAKKyAgICB2YWx1ZXMgPSB7J25hbWUnIDogJ01pY2hhZWwgRm9vcmQnLAorICAgICAgICAgICAgICAnbG9jYXRpb24nIDogJ05vcnRoYW1wdG9uJywKKyAgICAgICAgICAgICAgJ2xhbmd1YWdlJyA6ICdQeXRob24nIH0KKyAgICBoZWFkZXJzID0geyAnVXNlci1BZ2VudCcgOiB1c2VyX2FnZW50IH0KKyAgICAKKyAgICBkYXRhID0gdXJsbGliLnVybGVuY29kZSh2YWx1ZXMpCisgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHVybCwgZGF0YSwgaGVhZGVycykKKyAgICByZXNwb25zZSA9IHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgdGhlX3BhZ2UgPSByZXNwb25zZS5yZWFkKCkKKworVGhlIHJlc3BvbnNlIGFsc28gaGFzIHR3byB1c2VmdWwgbWV0aG9kcy4gU2VlIHRoZSBzZWN0aW9uIG9uIGBpbmZvIGFuZAorZ2V0dXJsYF8gd2hpY2ggY29tZXMgYWZ0ZXIgd2UgaGF2ZSBhIGxvb2sgYXQgd2hhdCBoYXBwZW5zIHdoZW4gdGhpbmdzCitnbyB3cm9uZy4KKworCitIYW5kbGluZyBFeGNlcHRpb25zCis9PT09PT09PT09PT09PT09PT09CisKKyp1cmxvcGVuKiByYWlzZXMgYGBVUkxFcnJvcmBgIHdoZW4gaXQgY2Fubm90IGhhbmRsZSBhIHJlc3BvbnNlICh0aG91Z2gKK2FzIHVzdWFsIHdpdGggUHl0aG9uIEFQSXMsIGJ1aWx0aW4gZXhjZXB0aW9ucyBzdWNoIGFzIFZhbHVlRXJyb3IsCitUeXBlRXJyb3IgZXRjLiBtYXkgYWxzbyBiZSByYWlzZWQpLgorCitgYEhUVFBFcnJvcmBgIGlzIHRoZSBzdWJjbGFzcyBvZiBgYFVSTEVycm9yYGAgcmFpc2VkIGluIHRoZSBzcGVjaWZpYworY2FzZSBvZiBIVFRQIFVSTHMuCisKK1VSTEVycm9yCistLS0tLS0tLQorCitPZnRlbiwgVVJMRXJyb3IgaXMgcmFpc2VkIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmV0d29yayBjb25uZWN0aW9uIChubworcm91dGUgdG8gdGhlIHNwZWNpZmllZCBzZXJ2ZXIpLCBvciB0aGUgc3BlY2lmaWVkIHNlcnZlciBkb2Vzbid0IGV4aXN0LgorSW4gdGhpcyBjYXNlLCB0aGUgZXhjZXB0aW9uIHJhaXNlZCB3aWxsIGhhdmUgYSAncmVhc29uJyBhdHRyaWJ1dGUsCit3aGljaCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gZXJyb3IgY29kZSBhbmQgYSB0ZXh0IGVycm9yIG1lc3NhZ2UuCisKK2UuZy4gOjoKKworICAgID4+PiByZXEgPSB1cmxsaWIyLlJlcXVlc3QoJ2h0dHA6Ly93d3cucHJldGVuZF9zZXJ2ZXIub3JnJykKKyAgICA+Pj4gdHJ5OiB1cmxsaWIyLnVybG9wZW4ocmVxKQorICAgID4+PiBleGNlcHQgVVJMRXJyb3IsIGU6CisgICAgPj4+ICAgIHByaW50IGUucmVhc29uCisgICAgPj4+CisgICAgKDQsICdnZXRhZGRyaW5mbyBmYWlsZWQnKQorCisKK0hUVFBFcnJvcgorLS0tLS0tLS0tCisKK0V2ZXJ5IEhUVFAgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGNvbnRhaW5zIGEgbnVtZXJpYyAic3RhdHVzCitjb2RlIi4gU29tZXRpbWVzIHRoZSBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmVyIGlzIHVuYWJsZQordG8gZnVsZmlsIHRoZSByZXF1ZXN0LiBUaGUgZGVmYXVsdCBoYW5kbGVycyB3aWxsIGhhbmRsZSBzb21lIG9mIHRoZXNlCityZXNwb25zZXMgZm9yIHlvdSAoZm9yIGV4YW1wbGUsIGlmIHRoZSByZXNwb25zZSBpcyBhICJyZWRpcmVjdGlvbiIKK3RoYXQgcmVxdWVzdHMgdGhlIGNsaWVudCBmZXRjaCB0aGUgZG9jdW1lbnQgZnJvbSBhIGRpZmZlcmVudCBVUkwsCit1cmxsaWIyIHdpbGwgaGFuZGxlIHRoYXQgZm9yIHlvdSkuIEZvciB0aG9zZSBpdCBjYW4ndCBoYW5kbGUsIHVybG9wZW4KK3dpbGwgcmFpc2UgYW4gYGBIVFRQRXJyb3JgYC4gVHlwaWNhbCBlcnJvcnMgaW5jbHVkZSAnNDA0JyAocGFnZSBub3QKK2ZvdW5kKSwgJzQwMycgKHJlcXVlc3QgZm9yYmlkZGVuKSwgYW5kICc0MDEnIChhdXRoZW50aWNhdGlvbgorcmVxdWlyZWQpLgorCitTZWUgc2VjdGlvbiAxMCBvZiBSRkMgMjYxNiBmb3IgYSByZWZlcmVuY2Ugb24gYWxsIHRoZSBIVFRQIGVycm9yCitjb2Rlcy4KKworVGhlIGBgSFRUUEVycm9yYGAgaW5zdGFuY2UgcmFpc2VkIHdpbGwgaGF2ZSBhbiBpbnRlZ2VyICdjb2RlJworYXR0cmlidXRlLCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgZXJyb3Igc2VudCBieSB0aGUgc2VydmVyLgorCitFcnJvciBDb2Rlcworfn5+fn5+fn5+fn4KKworQmVjYXVzZSB0aGUgZGVmYXVsdCBoYW5kbGVycyBoYW5kbGUgcmVkaXJlY3RzIChjb2RlcyBpbiB0aGUgMzAwCityYW5nZSksIGFuZCBjb2RlcyBpbiB0aGUgMTAwLTI5OSByYW5nZSBpbmRpY2F0ZSBzdWNjZXNzLCB5b3Ugd2lsbAordXN1YWxseSBvbmx5IHNlZSBlcnJvciBjb2RlcyBpbiB0aGUgNDAwLTU5OSByYW5nZS4KKworYGBCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnJlc3BvbnNlc2BgIGlzIGEgdXNlZnVsCitkaWN0aW9uYXJ5IG9mIHJlc3BvbnNlIGNvZGVzIGluIHRoYXQgc2hvd3MgYWxsIHRoZSByZXNwb25zZSBjb2RlcyB1c2VkCitieSBSRkMgMjYxNi4gVGhlIGRpY3Rpb25hcnkgaXMgcmVwcm9kdWNlZCBoZXJlIGZvciBjb252ZW5pZW5jZSA6OgorCisgICAgIyBUYWJsZSBtYXBwaW5nIHJlc3BvbnNlIGNvZGVzIHRvIG1lc3NhZ2VzOyBlbnRyaWVzIGhhdmUgdGhlCisgICAgIyBmb3JtIHtjb2RlOiAoc2hvcnRtZXNzYWdlLCBsb25nbWVzc2FnZSl9LgorICAgIHJlc3BvbnNlcyA9IHsKKyAgICAgICAgMTAwOiAoJ0NvbnRpbnVlJywgJ1JlcXVlc3QgcmVjZWl2ZWQsIHBsZWFzZSBjb250aW51ZScpLAorICAgICAgICAxMDE6ICgnU3dpdGNoaW5nIFByb3RvY29scycsCisgICAgICAgICAgICAgICdTd2l0Y2hpbmcgdG8gbmV3IHByb3RvY29sOyBvYmV5IFVwZ3JhZGUgaGVhZGVyJyksCisKKyAgICAgICAgMjAwOiAoJ09LJywgJ1JlcXVlc3QgZnVsZmlsbGVkLCBkb2N1bWVudCBmb2xsb3dzJyksCisgICAgICAgIDIwMTogKCdDcmVhdGVkJywgJ0RvY3VtZW50IGNyZWF0ZWQsIFVSTCBmb2xsb3dzJyksCisgICAgICAgIDIwMjogKCdBY2NlcHRlZCcsCisgICAgICAgICAgICAgICdSZXF1ZXN0IGFjY2VwdGVkLCBwcm9jZXNzaW5nIGNvbnRpbnVlcyBvZmYtbGluZScpLAorICAgICAgICAyMDM6ICgnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLCAnUmVxdWVzdCBmdWxmaWxsZWQgZnJvbSBjYWNoZScpLAorICAgICAgICAyMDQ6ICgnTm8gQ29udGVudCcsICdSZXF1ZXN0IGZ1bGZpbGxlZCwgbm90aGluZyBmb2xsb3dzJyksCisgICAgICAgIDIwNTogKCdSZXNldCBDb250ZW50JywgJ0NsZWFyIGlucHV0IGZvcm0gZm9yIGZ1cnRoZXIgaW5wdXQuJyksCisgICAgICAgIDIwNjogKCdQYXJ0aWFsIENvbnRlbnQnLCAnUGFydGlhbCBjb250ZW50IGZvbGxvd3MuJyksCisKKyAgICAgICAgMzAwOiAoJ011bHRpcGxlIENob2ljZXMnLAorICAgICAgICAgICAgICAnT2JqZWN0IGhhcyBzZXZlcmFsIHJlc291cmNlcyAtLSBzZWUgVVJJIGxpc3QnKSwKKyAgICAgICAgMzAxOiAoJ01vdmVkIFBlcm1hbmVudGx5JywgJ09iamVjdCBtb3ZlZCBwZXJtYW5lbnRseSAtLSBzZWUgVVJJIGxpc3QnKSwKKyAgICAgICAgMzAyOiAoJ0ZvdW5kJywgJ09iamVjdCBtb3ZlZCB0ZW1wb3JhcmlseSAtLSBzZWUgVVJJIGxpc3QnKSwKKyAgICAgICAgMzAzOiAoJ1NlZSBPdGhlcicsICdPYmplY3QgbW92ZWQgLS0gc2VlIE1ldGhvZCBhbmQgVVJMIGxpc3QnKSwKKyAgICAgICAgMzA0OiAoJ05vdCBNb2RpZmllZCcsCisgICAgICAgICAgICAgICdEb2N1bWVudCBoYXMgbm90IGNoYW5nZWQgc2luY2UgZ2l2ZW4gdGltZScpLAorICAgICAgICAzMDU6ICgnVXNlIFByb3h5JywKKyAgICAgICAgICAgICAgJ1lvdSBtdXN0IHVzZSBwcm94eSBzcGVjaWZpZWQgaW4gTG9jYXRpb24gdG8gYWNjZXNzIHRoaXMgJworICAgICAgICAgICAgICAncmVzb3VyY2UuJyksCisgICAgICAgIDMwNzogKCdUZW1wb3JhcnkgUmVkaXJlY3QnLAorICAgICAgICAgICAgICAnT2JqZWN0IG1vdmVkIHRlbXBvcmFyaWx5IC0tIHNlZSBVUkkgbGlzdCcpLAorCisgICAgICAgIDQwMDogKCdCYWQgUmVxdWVzdCcsCisgICAgICAgICAgICAgICdCYWQgcmVxdWVzdCBzeW50YXggb3IgdW5zdXBwb3J0ZWQgbWV0aG9kJyksCisgICAgICAgIDQwMTogKCdVbmF1dGhvcml6ZWQnLAorICAgICAgICAgICAgICAnTm8gcGVybWlzc2lvbiAtLSBzZWUgYXV0aG9yaXphdGlvbiBzY2hlbWVzJyksCisgICAgICAgIDQwMjogKCdQYXltZW50IFJlcXVpcmVkJywKKyAgICAgICAgICAgICAgJ05vIHBheW1lbnQgLS0gc2VlIGNoYXJnaW5nIHNjaGVtZXMnKSwKKyAgICAgICAgNDAzOiAoJ0ZvcmJpZGRlbicsCisgICAgICAgICAgICAgICdSZXF1ZXN0IGZvcmJpZGRlbiAtLSBhdXRob3JpemF0aW9uIHdpbGwgbm90IGhlbHAnKSwKKyAgICAgICAgNDA0OiAoJ05vdCBGb3VuZCcsICdOb3RoaW5nIG1hdGNoZXMgdGhlIGdpdmVuIFVSSScpLAorICAgICAgICA0MDU6ICgnTWV0aG9kIE5vdCBBbGxvd2VkJywKKyAgICAgICAgICAgICAgJ1NwZWNpZmllZCBtZXRob2QgaXMgaW52YWxpZCBmb3IgdGhpcyBzZXJ2ZXIuJyksCisgICAgICAgIDQwNjogKCdOb3QgQWNjZXB0YWJsZScsICdVUkkgbm90IGF2YWlsYWJsZSBpbiBwcmVmZXJyZWQgZm9ybWF0LicpLAorICAgICAgICA0MDc6ICgnUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnLCAnWW91IG11c3QgYXV0aGVudGljYXRlIHdpdGggJworICAgICAgICAgICAgICAndGhpcyBwcm94eSBiZWZvcmUgcHJvY2VlZGluZy4nKSwKKyAgICAgICAgNDA4OiAoJ1JlcXVlc3QgVGltZW91dCcsICdSZXF1ZXN0IHRpbWVkIG91dDsgdHJ5IGFnYWluIGxhdGVyLicpLAorICAgICAgICA0MDk6ICgnQ29uZmxpY3QnLCAnUmVxdWVzdCBjb25mbGljdC4nKSwKKyAgICAgICAgNDEwOiAoJ0dvbmUnLAorICAgICAgICAgICAgICAnVVJJIG5vIGxvbmdlciBleGlzdHMgYW5kIGhhcyBiZWVuIHBlcm1hbmVudGx5IHJlbW92ZWQuJyksCisgICAgICAgIDQxMTogKCdMZW5ndGggUmVxdWlyZWQnLCAnQ2xpZW50IG11c3Qgc3BlY2lmeSBDb250ZW50LUxlbmd0aC4nKSwKKyAgICAgICAgNDEyOiAoJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLCAnUHJlY29uZGl0aW9uIGluIGhlYWRlcnMgaXMgZmFsc2UuJyksCisgICAgICAgIDQxMzogKCdSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UnLCAnRW50aXR5IGlzIHRvbyBsYXJnZS4nKSwKKyAgICAgICAgNDE0OiAoJ1JlcXVlc3QtVVJJIFRvbyBMb25nJywgJ1VSSSBpcyB0b28gbG9uZy4nKSwKKyAgICAgICAgNDE1OiAoJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLCAnRW50aXR5IGJvZHkgaW4gdW5zdXBwb3J0ZWQgZm9ybWF0LicpLAorICAgICAgICA0MTY6ICgnUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZScsCisgICAgICAgICAgICAgICdDYW5ub3Qgc2F0aXNmeSByZXF1ZXN0IHJhbmdlLicpLAorICAgICAgICA0MTc6ICgnRXhwZWN0YXRpb24gRmFpbGVkJywKKyAgICAgICAgICAgICAgJ0V4cGVjdCBjb25kaXRpb24gY291bGQgbm90IGJlIHNhdGlzZmllZC4nKSwKKworICAgICAgICA1MDA6ICgnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgJ1NlcnZlciBnb3QgaXRzZWxmIGluIHRyb3VibGUnKSwKKyAgICAgICAgNTAxOiAoJ05vdCBJbXBsZW1lbnRlZCcsCisgICAgICAgICAgICAgICdTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbicpLAorICAgICAgICA1MDI6ICgnQmFkIEdhdGV3YXknLCAnSW52YWxpZCByZXNwb25zZXMgZnJvbSBhbm90aGVyIHNlcnZlci9wcm94eS4nKSwKKyAgICAgICAgNTAzOiAoJ1NlcnZpY2UgVW5hdmFpbGFibGUnLAorICAgICAgICAgICAgICAnVGhlIHNlcnZlciBjYW5ub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBkdWUgdG8gYSBoaWdoIGxvYWQnKSwKKyAgICAgICAgNTA0OiAoJ0dhdGV3YXkgVGltZW91dCcsCisgICAgICAgICAgICAgICdUaGUgZ2F0ZXdheSBzZXJ2ZXIgZGlkIG5vdCByZWNlaXZlIGEgdGltZWx5IHJlc3BvbnNlJyksCisgICAgICAgIDUwNTogKCdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsICdDYW5ub3QgZnVsZmlsbCByZXF1ZXN0LicpLAorICAgICAgICB9CisKK1doZW4gYW4gZXJyb3IgaXMgcmFpc2VkIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgYnkgcmV0dXJuaW5nIGFuIEhUVFAgZXJyb3IKK2NvZGUgKmFuZCogYW4gZXJyb3IgcGFnZS4gWW91IGNhbiB1c2UgdGhlIGBgSFRUUEVycm9yYGAgaW5zdGFuY2UgYXMgYQorcmVzcG9uc2Ugb24gdGhlIHBhZ2UgcmV0dXJuZWQuIFRoaXMgbWVhbnMgdGhhdCBhcyB3ZWxsIGFzIHRoZSBjb2RlCithdHRyaWJ1dGUsIGl0IGFsc28gaGFzIHJlYWQsIGdldHVybCwgYW5kIGluZm8sIG1ldGhvZHMuIDo6CisKKyAgICA+Pj4gcmVxID0gdXJsbGliMi5SZXF1ZXN0KCdodHRwOi8vd3d3LnB5dGhvbi5vcmcvZmlzaC5odG1sJykKKyAgICA+Pj4gdHJ5OiAKKyAgICA+Pj4gICAgIHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgPj4+IGV4Y2VwdCBVUkxFcnJvciwgZToKKyAgICA+Pj4gICAgIHByaW50IGUuY29kZQorICAgID4+PiAgICAgcHJpbnQgZS5yZWFkKCkKKyAgICA+Pj4gCisgICAgNDA0CisgICAgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorICAgIDw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iLi9jc3MvaHQyaHRtbC5jc3MiIAorICAgICAgICB0eXBlPSJ0ZXh0L2NzcyI/PgorICAgIDxodG1sPjxoZWFkPjx0aXRsZT5FcnJvciA0MDQ6IEZpbGUgTm90IEZvdW5kPC90aXRsZT4gCisgICAgLi4uLi4uIGV0Yy4uLgorCitXcmFwcGluZyBpdCBVcAorLS0tLS0tLS0tLS0tLS0KKworU28gaWYgeW91IHdhbnQgdG8gYmUgcHJlcGFyZWQgZm9yIGBgSFRUUEVycm9yYGAgKm9yKiBgYFVSTEVycm9yYGAKK3RoZXJlIGFyZSB0d28gYmFzaWMgYXBwcm9hY2hlcy4gSSBwcmVmZXIgdGhlIHNlY29uZCBhcHByb2FjaC4KKworTnVtYmVyIDEKK35+fn5+fn5+CisKKzo6CisKKworICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdCwgdXJsb3BlbiwgVVJMRXJyb3IsIEhUVFBFcnJvcgorICAgIHJlcSA9IFJlcXVlc3Qoc29tZXVybCkKKyAgICB0cnk6CisgICAgICAgIHJlc3BvbnNlID0gdXJsb3BlbihyZXEpCisgICAgZXhjZXB0IEhUVFBFcnJvciwgZToKKyAgICAgICAgcHJpbnQgJ1RoZSBzZXJ2ZXIgY291bGRuXCd0IGZ1bGZpbGwgdGhlIHJlcXVlc3QuJworICAgICAgICBwcmludCAnRXJyb3IgY29kZTogJywgZS5jb2RlCisgICAgZXhjZXB0IFVSTEVycm9yLCBlOgorICAgICAgICBwcmludCAnV2UgZmFpbGVkIHRvIHJlYWNoIGEgc2VydmVyLicKKyAgICAgICAgcHJpbnQgJ1JlYXNvbjogJywgZS5yZWFzb24KKyAgICBlbHNlOgorICAgICAgICAjIGV2ZXJ5dGhpbmcgaXMgZmluZQorCisKKy4uIG5vdGU6OgorCisgICAgVGhlIGBgZXhjZXB0IEhUVFBFcnJvcmBgICptdXN0KiBjb21lIGZpcnN0LCBvdGhlcndpc2UgYGBleGNlcHQgVVJMRXJyb3JgYAorICAgIHdpbGwgKmFsc28qIGNhdGNoIGFuIGBgSFRUUEVycm9yYGAuCisKK051bWJlciAyCit+fn5+fn5+fgorCis6OgorCisgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0LCB1cmxvcGVuLCBVUkxFcnJvcgorICAgIHJlcSA9IFJlcXVlc3Qoc29tZXVybCkKKyAgICB0cnk6CisgICAgICAgIHJlc3BvbnNlID0gdXJsb3BlbihyZXEpCisgICAgZXhjZXB0IFVSTEVycm9yLCBlOgorICAgICAgICBpZiBoYXNhdHRyKGUsICdyZWFzb24nKToKKyAgICAgICAgICAgIHByaW50ICdXZSBmYWlsZWQgdG8gcmVhY2ggYSBzZXJ2ZXIuJworICAgICAgICAgICAgcHJpbnQgJ1JlYXNvbjogJywgZS5yZWFzb24KKyAgICAgICAgZWxpZiBoYXNhdHRyKGUsICdjb2RlJyk6CisgICAgICAgICAgICBwcmludCAnVGhlIHNlcnZlciBjb3VsZG5cJ3QgZnVsZmlsbCB0aGUgcmVxdWVzdC4nCisgICAgICAgICAgICBwcmludCAnRXJyb3IgY29kZTogJywgZS5jb2RlCisgICAgZWxzZToKKyAgICAgICAgIyBldmVyeXRoaW5nIGlzIGZpbmUKKyAgICAgICAgCisKK2luZm8gYW5kIGdldHVybAorPT09PT09PT09PT09PT09CisKK1RoZSByZXNwb25zZSByZXR1cm5lZCBieSB1cmxvcGVuIChvciB0aGUgYGBIVFRQRXJyb3JgYCBpbnN0YW5jZSkgaGFzCit0d28gdXNlZnVsIG1ldGhvZHMgYGBpbmZvYGAgYW5kIGBgZ2V0dXJsYGAuCisKKyoqZ2V0dXJsKiogLSB0aGlzIHJldHVybnMgdGhlIHJlYWwgVVJMIG9mIHRoZSBwYWdlIGZldGNoZWQuIFRoaXMgaXMKK3VzZWZ1bCBiZWNhdXNlIGBgdXJsb3BlbmBgIChvciB0aGUgb3BlbmVyIG9iamVjdCB1c2VkKSBtYXkgaGF2ZQorZm9sbG93ZWQgYSByZWRpcmVjdC4gVGhlIFVSTCBvZiB0aGUgcGFnZSBmZXRjaGVkIG1heSBub3QgYmUgdGhlIHNhbWUKK2FzIHRoZSBVUkwgcmVxdWVzdGVkLgorCisqKmluZm8qKiAtIHRoaXMgcmV0dXJucyBhIGRpY3Rpb25hcnktbGlrZSBvYmplY3QgdGhhdCBkZXNjcmliZXMgdGhlCitwYWdlIGZldGNoZWQsIHBhcnRpY3VsYXJseSB0aGUgaGVhZGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuIEl0IGlzCitjdXJyZW50bHkgYW4gYGBodHRwbGliLkhUVFBNZXNzYWdlYGAgaW5zdGFuY2UuCisKK1R5cGljYWwgaGVhZGVycyBpbmNsdWRlICdDb250ZW50LWxlbmd0aCcsICdDb250ZW50LXR5cGUnLCBhbmQgc28KK29uLiBTZWUgdGhlCitgUXVpY2sgUmVmZXJlbmNlIHRvIEhUVFAgSGVhZGVycyA8aHR0cDovL3d3dy5jcy50dXQuZmkvfmprb3JwZWxhL2h0dHAuaHRtbD5gXworZm9yIGEgdXNlZnVsIGxpc3Rpbmcgb2YgSFRUUCBoZWFkZXJzIHdpdGggYnJpZWYgZXhwbGFuYXRpb25zIG9mIHRoZWlyIG1lYW5pbmcKK2FuZCB1c2UuCisKKworT3BlbmVycyBhbmQgSGFuZGxlcnMKKz09PT09PT09PT09PT09PT09PT09CisKK1doZW4geW91IGZldGNoIGEgVVJMIHlvdSB1c2UgYW4gb3BlbmVyIChhbiBpbnN0YW5jZSBvZiB0aGUgcGVyaGFwcworY29uZnVzaW5nbHktbmFtZWQgYGB1cmxsaWIyLk9wZW5lckRpcmVjdG9yYGApLiBOb3JtYWxseSB3ZSBoYXZlIGJlZW4gdXNpbmcKK3RoZSBkZWZhdWx0IG9wZW5lciAtIHZpYSBgYHVybG9wZW5gYCAtIGJ1dCB5b3UgY2FuIGNyZWF0ZSBjdXN0b20KK29wZW5lcnMuIE9wZW5lcnMgdXNlIGhhbmRsZXJzLiBBbGwgdGhlICJoZWF2eSBsaWZ0aW5nIiBpcyBkb25lIGJ5IHRoZQoraGFuZGxlcnMuIEVhY2ggaGFuZGxlciBrbm93cyBob3cgdG8gb3BlbiBVUkxzIGZvciBhIHBhcnRpY3VsYXIgVVJMCitzY2hlbWUgKGh0dHAsIGZ0cCwgZXRjLiksIG9yIGhvdyB0byBoYW5kbGUgYW4gYXNwZWN0IG9mIFVSTCBvcGVuaW5nLAorZm9yIGV4YW1wbGUgSFRUUCByZWRpcmVjdGlvbnMgb3IgSFRUUCBjb29raWVzLgorCitZb3Ugd2lsbCB3YW50IHRvIGNyZWF0ZSBvcGVuZXJzIGlmIHlvdSB3YW50IHRvIGZldGNoIFVSTHMgd2l0aAorc3BlY2lmaWMgaGFuZGxlcnMgaW5zdGFsbGVkLCBmb3IgZXhhbXBsZSB0byBnZXQgYW4gb3BlbmVyIHRoYXQgaGFuZGxlcworY29va2llcywgb3IgdG8gZ2V0IGFuIG9wZW5lciB0aGF0IGRvZXMgbm90IGhhbmRsZSByZWRpcmVjdGlvbnMuCisKK1RvIGNyZWF0ZSBhbiBvcGVuZXIsIGluc3RhbnRpYXRlIGFuIE9wZW5lckRpcmVjdG9yLCBhbmQgdGhlbiBjYWxsCisuYWRkX2hhbmRsZXIoc29tZV9oYW5kbGVyX2luc3RhbmNlKSByZXBlYXRlZGx5LgorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBgYGJ1aWxkX29wZW5lcmBgLCB3aGljaCBpcyBhIGNvbnZlbmllbmNlCitmdW5jdGlvbiBmb3IgY3JlYXRpbmcgb3BlbmVyIG9iamVjdHMgd2l0aCBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgorYGBidWlsZF9vcGVuZXJgYCBhZGRzIHNldmVyYWwgaGFuZGxlcnMgYnkgZGVmYXVsdCwgYnV0IHByb3ZpZGVzIGEKK3F1aWNrIHdheSB0byBhZGQgbW9yZSBhbmQvb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaGFuZGxlcnMuCisKK090aGVyIHNvcnRzIG9mIGhhbmRsZXJzIHlvdSBtaWdodCB3YW50IHRvIGNhbiBoYW5kbGUgcHJveGllcywKK2F1dGhlbnRpY2F0aW9uLCBhbmQgb3RoZXIgY29tbW9uIGJ1dCBzbGlnaHRseSBzcGVjaWFsaXNlZAorc2l0dWF0aW9ucy4KKworYGBpbnN0YWxsX29wZW5lcmBgIGNhbiBiZSB1c2VkIHRvIG1ha2UgYW4gYGBvcGVuZXJgYCBvYmplY3QgdGhlCisoZ2xvYmFsKSBkZWZhdWx0IG9wZW5lci4gVGhpcyBtZWFucyB0aGF0IGNhbGxzIHRvIGBgdXJsb3BlbmBgIHdpbGwgdXNlCit0aGUgb3BlbmVyIHlvdSBoYXZlIGluc3RhbGxlZC4KKworT3BlbmVyIG9iamVjdHMgaGF2ZSBhbiBgYG9wZW5gYCBtZXRob2QsIHdoaWNoIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkKK3RvIGZldGNoIHVybHMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBgYHVybG9wZW5gYCBmdW5jdGlvbjogdGhlcmUncyBubworbmVlZCB0byBjYWxsIGBgaW5zdGFsbF9vcGVuZXJgYCwgZXhjZXB0IGFzIGEgY29udmVuaWVuY2UuCisKKworQmFzaWMgQXV0aGVudGljYXRpb24KKz09PT09PT09PT09PT09PT09PT09CisKK1RvIGlsbHVzdHJhdGUgY3JlYXRpbmcgYW5kIGluc3RhbGxpbmcgYSBoYW5kbGVyIHdlIHdpbGwgdXNlIHRoZQorYGBIVFRQQmFzaWNBdXRoSGFuZGxlcmBgLiBGb3IgYSBtb3JlIGRldGFpbGVkIGRpc2N1c3Npb24gb2YgdGhpcworc3ViamVjdCAtIGluY2x1ZGluZyBhbiBleHBsYW5hdGlvbiBvZiBob3cgQmFzaWMgQXV0aGVudGljYXRpb24gd29ya3MgLQorc2VlIHRoZSBgQmFzaWMgQXV0aGVudGljYXRpb24gVHV0b3JpYWwgIDxodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcudWsvcHl0aG9uL2FydGljbGVzL2F1dGhlbnRpY2F0aW9uLnNodG1sPmBfLgorCitXaGVuIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLCB0aGUgc2VydmVyIHNlbmRzIGEgaGVhZGVyIChhcyB3ZWxsIGFzCit0aGUgNDAxIGVycm9yIGNvZGUpIHJlcXVlc3RpbmcgYXV0aGVudGljYXRpb24uICBUaGlzIHNwZWNpZmllcyB0aGUKK2F1dGhlbnRpY2F0aW9uIHNjaGVtZSBhbmQgYSAncmVhbG0nLiBUaGUgaGVhZGVyIGxvb2tzIGxpa2UgOgorYGBXd3ctYXV0aGVudGljYXRlOiBTQ0hFTUUgcmVhbG09IlJFQUxNImBgLgorCitlLmcuIDo6IAorCisgICAgV3d3LWF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09ImNQYW5lbCBVc2VycyIKKworCitUaGUgY2xpZW50IHNob3VsZCB0aGVuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIGFwcHJvcHJpYXRlIG5hbWUgYW5kCitwYXNzd29yZCBmb3IgdGhlIHJlYWxtIGluY2x1ZGVkIGFzIGEgaGVhZGVyIGluIHRoZSByZXF1ZXN0LiBUaGlzIGlzCisnYmFzaWMgYXV0aGVudGljYXRpb24nLiBJbiBvcmRlciB0byBzaW1wbGlmeSB0aGlzIHByb2Nlc3Mgd2UgY2FuCitjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYGBIVFRQQmFzaWNBdXRoSGFuZGxlcmBgIGFuZCBhbiBvcGVuZXIgdG8gdXNlCit0aGlzIGhhbmRsZXIuCisKK1RoZSBgYEhUVFBCYXNpY0F1dGhIYW5kbGVyYGAgdXNlcyBhbiBvYmplY3QgY2FsbGVkIGEgcGFzc3dvcmQgbWFuYWdlcgordG8gaGFuZGxlIHRoZSBtYXBwaW5nIG9mIFVSTHMgYW5kIHJlYWxtcyB0byBwYXNzd29yZHMgYW5kCit1c2VybmFtZXMuIElmIHlvdSBrbm93IHdoYXQgdGhlIHJlYWxtIGlzIChmcm9tIHRoZSBhdXRoZW50aWNhdGlvbgoraGVhZGVyIHNlbnQgYnkgdGhlIHNlcnZlciksIHRoZW4geW91IGNhbiB1c2UgYQorYGBIVFRQUGFzc3dvcmRNZ3JgYC4gRnJlcXVlbnRseSBvbmUgZG9lc24ndCBjYXJlIHdoYXQgdGhlIHJlYWxtIGlzLiBJbgordGhhdCBjYXNlLCBpdCBpcyBjb252ZW5pZW50IHRvIHVzZQorYGBIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtYGAuIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEKK2RlZmF1bHQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGZvciBhIFVSTC4gVGhpcyB3aWxsIGJlIHN1cHBsaWVkIGluIHRoZQorYWJzZW5jZSBvZiB5b3UgcHJvdmlkaW5nIGFuIGFsdGVybmF0aXZlIGNvbWJpbmF0aW9uIGZvciBhIHNwZWNpZmljCityZWFsbS4gV2UgaW5kaWNhdGUgdGhpcyBieSBwcm92aWRpbmcgYGBOb25lYGAgYXMgdGhlIHJlYWxtIGFyZ3VtZW50IHRvCit0aGUgYGBhZGRfcGFzc3dvcmRgYCBtZXRob2QuCisKK1RoZSB0b3AtbGV2ZWwgVVJMIGlzIHRoZSBmaXJzdCBVUkwgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi4gVVJMcworImRlZXBlciIgdGhhbiB0aGUgVVJMIHlvdSBwYXNzIHRvIC5hZGRfcGFzc3dvcmQoKSB3aWxsIGFsc28gbWF0Y2guIDo6CisKKyAgICAjIGNyZWF0ZSBhIHBhc3N3b3JkIG1hbmFnZXIKKyAgICBwYXNzd29yZF9tZ3IgPSB1cmxsaWIyLkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0oKSAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgIyBBZGQgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KKyAgICAjIElmIHdlIGtuZXcgdGhlIHJlYWxtLCB3ZSBjb3VsZCB1c2UgaXQgaW5zdGVhZCBvZiBgYE5vbmVgYC4KKyAgICB0b3BfbGV2ZWxfdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS9mb28vIgorICAgIHBhc3N3b3JkX21nci5hZGRfcGFzc3dvcmQoTm9uZSwgdG9wX2xldmVsX3VybCwgdXNlcm5hbWUsIHBhc3N3b3JkKQorCisgICAgaGFuZGxlciA9IHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIocGFzc3dvcmRfbWdyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICMgY3JlYXRlICJvcGVuZXIiIChPcGVuZXJEaXJlY3RvciBpbnN0YW5jZSkKKyAgICBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcihoYW5kbGVyKSAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAjIHVzZSB0aGUgb3BlbmVyIHRvIGZldGNoIGEgVVJMCisgICAgb3BlbmVyLm9wZW4oYV91cmwpICAgICAgCisKKyAgICAjIEluc3RhbGwgdGhlIG9wZW5lci4KKyAgICAjIE5vdyBhbGwgY2FsbHMgdG8gdXJsbGliMi51cmxvcGVuIHVzZSBvdXIgb3BlbmVyLgorICAgIHVybGxpYjIuaW5zdGFsbF9vcGVuZXIob3BlbmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLi4gbm90ZTo6CisKKyAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSB3ZSBvbmx5IHN1cHBsaWVkIG91ciBgYEhIVFBCYXNpY0F1dGhIYW5kbGVyYGAKKyAgICB0byBgYGJ1aWxkX29wZW5lcmBgLiBCeSBkZWZhdWx0IG9wZW5lcnMgaGF2ZSB0aGUgaGFuZGxlcnMgZm9yCisgICAgbm9ybWFsIHNpdHVhdGlvbnMgLSBgYFByb3h5SGFuZGxlcmBgLCBgYFVua25vd25IYW5kbGVyYGAsCisgICAgYGBIVFRQSGFuZGxlcmBgLCBgYEhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyYGAsCisgICAgYGBIVFRQUmVkaXJlY3RIYW5kbGVyYGAsIGBgRlRQSGFuZGxlcmBgLCBgYEZpbGVIYW5kbGVyYGAsCisgICAgYGBIVFRQRXJyb3JQcm9jZXNzb3JgYC4KKwordG9wX2xldmVsX3VybCBpcyBpbiBmYWN0ICplaXRoZXIqIGEgZnVsbCBVUkwgKGluY2x1ZGluZyB0aGUgJ2h0dHA6Jworc2NoZW1lIGNvbXBvbmVudCBhbmQgdGhlIGhvc3RuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSBwb3J0IG51bWJlcikKK2UuZy4gImh0dHA6Ly9leGFtcGxlLmNvbS8iICpvciogYW4gImF1dGhvcml0eSIgKGkuZS4gdGhlIGhvc3RuYW1lLAorb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIHBvcnQgbnVtYmVyKSBlLmcuICJleGFtcGxlLmNvbSIgb3IKKyJleGFtcGxlLmNvbTo4MDgwIiAodGhlIGxhdHRlciBleGFtcGxlIGluY2x1ZGVzIGEgcG9ydCBudW1iZXIpLiAgVGhlCithdXRob3JpdHksIGlmIHByZXNlbnQsIG11c3QgTk9UIGNvbnRhaW4gdGhlICJ1c2VyaW5mbyIgY29tcG9uZW50IC0gZm9yCitleGFtcGxlICJqb2VAcGFzc3dvcmQ6ZXhhbXBsZS5jb20iIGlzIG5vdCBjb3JyZWN0LgorCisKK1Byb3hpZXMKKz09PT09PT0KKworKip1cmxsaWIyKiogd2lsbCBhdXRvLWRldGVjdCB5b3VyIHByb3h5IHNldHRpbmdzIGFuZCB1c2UgdGhvc2UuIFRoaXMKK2lzIHRocm91Z2ggdGhlIGBgUHJveHlIYW5kbGVyYGAgd2hpY2ggaXMgcGFydCBvZiB0aGUgbm9ybWFsIGhhbmRsZXIKK2NoYWluLiBOb3JtYWxseSB0aGF0J3MgYSBnb29kIHRoaW5nLCBidXQgdGhlcmUgYXJlIG9jY2FzaW9ucyB3aGVuIGl0CittYXkgbm90IGJlIGhlbHBmdWwgWyNdXy4gT25lIHdheSB0byBkbyB0aGlzIGlzIHRvIHNldHVwIG91ciBvd24KK2BgUHJveHlIYW5kbGVyYGAsIHdpdGggbm8gcHJveGllcyBkZWZpbmVkLiBUaGlzIGlzIGRvbmUgdXNpbmcgc2ltaWxhcgorc3RlcHMgdG8gc2V0dGluZyB1cCBhIGBCYXNpYyBBdXRoZW50aWNhdGlvbmBfIGhhbmRsZXIgOiA6OgorCisgICAgPj4+IHByb3h5X3N1cHBvcnQgPSB1cmxsaWIyLlByb3h5SGFuZGxlcih7fSkKKyAgICA+Pj4gb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIocHJveHlfc3VwcG9ydCkKKyAgICA+Pj4gdXJsbGliMi5pbnN0YWxsX29wZW5lcihvcGVuZXIpCisKKy4uIG5vdGU6OgorCisgICAgQ3VycmVudGx5IGBgdXJsbGliMmBgICpkb2VzIG5vdCogc3VwcG9ydCBmZXRjaGluZyBvZiBgYGh0dHBzYGAKKyAgICBsb2NhdGlvbnMgdGhyb3VnaCBhIHByb3h5LiBUaGlzIGNhbiBiZSBhIHByb2JsZW0uCisKK1NvY2tldHMgYW5kIExheWVycworPT09PT09PT09PT09PT09PT09CisKK1RoZSBQeXRob24gc3VwcG9ydCBmb3IgZmV0Y2hpbmcgcmVzb3VyY2VzIGZyb20gdGhlIHdlYiBpcworbGF5ZXJlZC4gdXJsbGliMiB1c2VzIHRoZSBodHRwbGliIGxpYnJhcnksIHdoaWNoIGluIHR1cm4gdXNlcyB0aGUKK3NvY2tldCBsaWJyYXJ5LgorCitBcyBvZiBQeXRob24gMi4zIHlvdSBjYW4gc3BlY2lmeSBob3cgbG9uZyBhIHNvY2tldCBzaG91bGQgd2FpdCBmb3IgYQorcmVzcG9uc2UgYmVmb3JlIHRpbWluZyBvdXQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBhcHBsaWNhdGlvbnMgd2hpY2gKK2hhdmUgdG8gZmV0Y2ggd2ViIHBhZ2VzLiBCeSBkZWZhdWx0IHRoZSBzb2NrZXQgbW9kdWxlIGhhcyAqbm8gdGltZW91dCoKK2FuZCBjYW4gaGFuZy4gQ3VycmVudGx5LCB0aGUgc29ja2V0IHRpbWVvdXQgaXMgbm90IGV4cG9zZWQgYXQgdGhlCitodHRwbGliIG9yIHVybGxpYjIgbGV2ZWxzLiAgSG93ZXZlciwgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgdGltZW91dAorZ2xvYmFsbHkgZm9yIGFsbCBzb2NrZXRzIHVzaW5nIDogOjoKKworICAgIGltcG9ydCBzb2NrZXQKKyAgICBpbXBvcnQgdXJsbGliMgorCisgICAgIyB0aW1lb3V0IGluIHNlY29uZHMKKyAgICB0aW1lb3V0ID0gMTAKKyAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQodGltZW91dCkgCisKKyAgICAjIHRoaXMgY2FsbCB0byB1cmxsaWIyLnVybG9wZW4gbm93IHVzZXMgdGhlIGRlZmF1bHQgdGltZW91dAorICAgICMgd2UgaGF2ZSBzZXQgaW4gdGhlIHNvY2tldCBtb2R1bGUKKyAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoJ2h0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51aycpCisgICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4ocmVxKQorCisKKy0tLS0tLS0KKworCitGb290bm90ZXMKKz09PT09PT09PQorCitUaGlzIGRvY3VtZW50IHdhcyByZXZpZXdlZCBhbmQgcmV2aXNlZCBieSBKb2huIExlZS4KKworLi4gWyNdIEZvciBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlIENHSSBwcm90b2NvbCBzZWUKKyAgICAgICBgV3JpdGluZyBXZWIgQXBwbGljYXRpb25zIGluIFB5dGhvbiA8aHR0cDovL3d3dy5weXppbmUuY29tL0lzc3VlMDA4L1NlY3Rpb25fQXJ0aWNsZXMvYXJ0aWNsZV9DR0lPbmUuaHRtbD5gXy4gCisuLiBbI10gTGlrZSBHb29nbGUgZm9yIGV4YW1wbGUuIFRoZSAqcHJvcGVyKiB3YXkgdG8gdXNlIGdvb2dsZSBmcm9tIGEgcHJvZ3JhbQorICAgICAgIGlzIHRvIHVzZSBgUHlHb29nbGUgPGh0dHA6Ly9weWdvb2dsZS5zb3VyY2Vmb3JnZS5uZXQ+YF8gb2YgY291cnNlLiBTZWUKKyAgICAgICBgVm9pZHNwYWNlIEdvb2dsZSA8aHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9yZWNpcGVib29rLnNodG1sI2dvb2dsZT5gXworICAgICAgIGZvciBzb21lIGV4YW1wbGVzIG9mIHVzaW5nIHRoZSBHb29nbGUgQVBJLgorLi4gWyNdIEJyb3dzZXIgc25pZmZpbmcgaXMgYSB2ZXJ5IGJhZCBwcmFjdGlzZSBmb3Igd2Vic2l0ZSBkZXNpZ24gLSBidWlsZGluZworICAgICAgIHNpdGVzIHVzaW5nIHdlYiBzdGFuZGFyZHMgaXMgbXVjaCBtb3JlIHNlbnNpYmxlLiBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mCisgICAgICAgc2l0ZXMgc3RpbGwgc2VuZCBkaWZmZXJlbnQgdmVyc2lvbnMgdG8gZGlmZmVyZW50IGJyb3dzZXJzLgorLi4gWyNdIFRoZSB1c2VyIGFnZW50IGZvciBNU0lFIDYgaXMKKyAgICAgICAqJ01vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDYuMDsgV2luZG93cyBOVCA1LjE7IFNWMTsgLk5FVCBDTFIgMS4xLjQzMjIpJyoKKy4uIFsjXSBGb3IgZGV0YWlscyBvZiBtb3JlIEhUVFAgcmVxdWVzdCBoZWFkZXJzLCBzZWUKKyAgICAgICBgUXVpY2sgUmVmZXJlbmNlIHRvIEhUVFAgSGVhZGVyc2BfLgorLi4gWyNdIEluIG15IGNhc2UgSSBoYXZlIHRvIHVzZSBhIHByb3h5IHRvIGFjY2VzcyB0aGUgaW50ZXJuZXQgYXQgd29yay4gSWYgeW91CisgICAgICAgYXR0ZW1wdCB0byBmZXRjaCAqbG9jYWxob3N0KiBVUkxzIHRocm91Z2ggdGhpcyBwcm94eSBpdCBibG9ja3MgdGhlbS4gSUUKKyAgICAgICBpcyBzZXQgdG8gdXNlIHRoZSBwcm94eSwgd2hpY2ggdXJsbGliMiBwaWNrcyB1cCBvbi4gSW4gb3JkZXIgdG8gdGVzdAorICAgICAgIHNjcmlwdHMgd2l0aCBhIGxvY2FsaG9zdCBzZXJ2ZXIsIEkgaGF2ZSB0byBwcmV2ZW50IHVybGxpYjIgZnJvbSB1c2luZworICAgICAgIHRoZSBwcm94eS4KZGlmZiAtLWdpdCBhL0RvYy9pbnN0L2luc3QudGV4IGIvRG9jL2luc3QvaW5zdC50ZXgKaW5kZXggNDk2MWExYS4uNjc2ZjhhZSAxMDA2NDQKLS0tIGEvRG9jL2luc3QvaW5zdC50ZXgKKysrIGIvRG9jL2luc3QvaW5zdC50ZXgKQEAgLTcyNiw4ICs3MjYsOCBAQAogXGVudnZhcntQWVRIT05IT01FfSBzZXRzIGFuIGFsdGVybmF0ZSB2YWx1ZSBmb3IgdGhlIHByZWZpeCBvZiB0aGUKIFB5dGhvbiBpbnN0YWxsYXRpb24uICBGb3IgZXhhbXBsZSwgaWYgXGVudnZhcntQWVRIT05IT01FfSBpcyBzZXQgdG8KIFxzYW1wey93d3cvcHl0aG9ufSwgdGhlIHNlYXJjaCBwYXRoIHdpbGwgYmUgc2V0IHRvIFxjb2Rle1snJywKLScvd3d3L3B5dGhvbi9saWIvcHl0aG9uMi4yLycsICcvd3d3L3B5dGhvbi9saWIvcHl0aG9uMi4zL3BsYXQtbGludXgyJywKLS4uLl19LiAgCisnL3d3dy9weXRob24vbGliL3B5dGhvblxzaG9ydHZlcnNpb24vJywKKycvd3d3L3B5dGhvbi9saWIvcHl0aG9uXHNob3J0dmVyc2lvbi9wbGF0LWxpbnV4MicsIC4uLl19LiAgCiAKIFRoZSBcZW52dmFye1BZVEhPTlBBVEh9IHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gYSBsaXN0IG9mIHBhdGhzIHRoYXQKIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJlZ2lubmluZyBvZiBcY29kZXtzeXMucGF0aH0uICBGb3IgZXhhbXBsZSwgaWYKQEAgLTk4MSwxNSArOTgxLDE1IEBACiBmcm9tIHRoZSBQeXRob24gb3IgQWN0aXZlU3RhdGUgV2ViIHNpdGUuICAoUHl0aG9uIGlzIGJ1aWx0IHdpdGgKIE1pY3Jvc29mdCBWaXN1YWwgXENwcCwgd2hpY2ggdXNlcyBDT0ZGIGFzIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuKQogRm9yIHRoaXMgcmVhc29uIHlvdSBoYXZlIHRvIGNvbnZlcnQgUHl0aG9uJ3MgbGlicmFyeQotXGZpbGV7cHl0aG9uMjQubGlifSBpbnRvIHRoZSBCb3JsYW5kIGZvcm1hdC4gIFlvdSBjYW4gZG8gdGhpcyBhcworXGZpbGV7cHl0aG9uMjUubGlifSBpbnRvIHRoZSBCb3JsYW5kIGZvcm1hdC4gIFlvdSBjYW4gZG8gdGhpcyBhcwogZm9sbG93czoKIAogXGJlZ2lue3ZlcmJhdGltfQotY29mZjJvbWYgcHl0aG9uMjQubGliIHB5dGhvbjI0X2JjcHAubGliCitjb2ZmMm9tZiBweXRob24yNS5saWIgcHl0aG9uMjVfYmNwcC5saWIKIFxlbmR7dmVyYmF0aW19CiAKIFRoZSBcZmlsZXtjb2ZmMm9tZn0gcHJvZ3JhbSBjb21lcyB3aXRoIHRoZSBCb3JsYW5kIGNvbXBpbGVyLiAgVGhlIGZpbGUKLVxmaWxle3B5dGhvbjI0LmxpYn0gaXMgaW4gdGhlIFxmaWxle0xpYnN9IGRpcmVjdG9yeSBvZiB5b3VyIFB5dGhvbgorXGZpbGV7cHl0aG9uMjUubGlifSBpcyBpbiB0aGUgXGZpbGV7TGlic30gZGlyZWN0b3J5IG9mIHlvdXIgUHl0aG9uCiBpbnN0YWxsYXRpb24uICBJZiB5b3VyIGV4dGVuc2lvbiB1c2VzIG90aGVyIGxpYnJhcmllcyAoemxpYiwuLi4pIHlvdQogaGF2ZSB0byBjb252ZXJ0IHRoZW0gdG9vLgogCkBAIC0xMDUzLDE3ICsxMDUzLDIzIEBACiBQRXhwb3J0cyAwLjQyaCB0aGVyZS4pCiAKIFxiZWdpbnt2ZXJiYXRpbX0KLXBleHBvcnRzIHB5dGhvbjI0LmRsbCA+cHl0aG9uMjQuZGVmCitwZXhwb3J0cyBweXRob24yNS5kbGwgPnB5dGhvbjI1LmRlZgogXGVuZHt2ZXJiYXRpbX0KIAorVGhlIGxvY2F0aW9uIG9mIGFuIGluc3RhbGxlZCBcZmlsZXtweXRob24yNS5kbGx9IHdpbGwgZGVwZW5kIG9uIHRoZQoraW5zdGFsbGF0aW9uIG9wdGlvbnMgYW5kIHRoZSB2ZXJzaW9uIGFuZCBsYW5ndWFnZSBvZiBXaW5kb3dzLiAgSW4gYQorYGBqdXN0IGZvciBtZScnIGluc3RhbGxhdGlvbiwgaXQgd2lsbCBhcHBlYXIgaW4gdGhlIHJvb3Qgb2YgdGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5LiAgSW4gYSBzaGFyZWQgaW5zdGFsbGF0aW9uLCBpdCB3aWxsIGJlIGxvY2F0ZWQKK2luIHRoZSBzeXN0ZW0gZGlyZWN0b3J5LgorCiBUaGVuIHlvdSBjYW4gY3JlYXRlIGZyb20gdGhlc2UgaW5mb3JtYXRpb24gYW4gaW1wb3J0IGxpYnJhcnkgZm9yIGdjYy4KICAKIFxiZWdpbnt2ZXJiYXRpbX0KLWRsbHRvb2wgLS1kbGxuYW1lIHB5dGhvbjI0LmRsbCAtLWRlZiBweXRob24yNC5kZWYgLS1vdXRwdXQtbGliIGxpYnB5dGhvbjI0LmEKKy9jeWd3aW4vYmluL2RsbHRvb2wgLS1kbGxuYW1lIHB5dGhvbjI1LmRsbCAtLWRlZiBweXRob24yNS5kZWYgLS1vdXRwdXQtbGliIGxpYnB5dGhvbjI1LmEKIFxlbmR7dmVyYmF0aW19CiAKIFRoZSByZXN1bHRpbmcgbGlicmFyeSBoYXMgdG8gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyAKLVxmaWxle3B5dGhvbjI0LmxpYn0uIChTaG91bGQgYmUgdGhlIFxmaWxle2xpYnN9IGRpcmVjdG9yeSB1bmRlciB5b3VyCitcZmlsZXtweXRob24yNS5saWJ9LiAoU2hvdWxkIGJlIHRoZSBcZmlsZXtsaWJzfSBkaXJlY3RvcnkgdW5kZXIgeW91cgogUHl0aG9uIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuKQogCiBJZiB5b3VyIGV4dGVuc2lvbiB1c2VzIG90aGVyIGxpYnJhcmllcyAoemxpYiwuLi4pIHlvdSBtaWdodCAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleAppbmRleCBlYWMzNWRlLi5jZjY1N2MzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWIudGV4CkBAIC0yMjQsNiArMjI0LDcgQEAKIFxpbnB1dHtsaWJkYmhhc2h9CiBcaW5wdXR7bGliYnNkZGJ9CiBcaW5wdXR7bGliZHVtYmRibX0KK1xpbnB1dHtsaWJzcWxpdGUzfQogCiAKICUgPT09PT09PT09PT09PQpAQCAtMjQzLDYgKzI0NCw4IEBACiBcaW5wdXR7bGliY3Vyc2VzcGFuZWx9CiBcaW5wdXR7bGlicGxhdGZvcm19CiBcaW5wdXR7bGliZXJybm99CitcaW5wdXR7bGliY3R5cGVzfQorXGlucHV0e2xpYmN0eXBlc3JlZn0KIAogXGlucHV0e2xpYnNvbWVvc30gICAgICAgICAgICAgICAlIE9wdGlvbmFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMKIFxpbnB1dHtsaWJzZWxlY3R9CkBAIC0zNTksNyArMzYyLDcgQEAKIFxpbnB1dHtsaWJwcm9maWxlfSAgICAgICAgICAgICAgJSBUaGUgUHl0aG9uIFByb2ZpbGVyCiBcaW5wdXR7bGliaG90c2hvdH0gICAgICAgICAgICAgICUgdW5tYWludGFpbmVkIEMgcHJvZmlsZXIKIFxpbnB1dHtsaWJ0aW1laXR9Ci0KK1xpbnB1dHtsaWJ0cmFjZX0KIAogJSA9PT09PT09PT09PT09CiAlIFBZVEhPTiBFTkdJTkUKQEAgLTQ0NCw2ICs0NDcsNyBAQAogXGlucHV0e2xpYnN1bmF1ZGlvfQogCiBcaW5wdXR7d2luZG93c30gICAgICAgICAgICAgICAgICUgTVMgV2luZG93cyBPTkxZCitcaW5wdXR7bGlibXNpbGlifQogXGlucHV0e2xpYm1zdmNydH0KIFxpbnB1dHtsaWJ3aW5yZWd9CiBcaW5wdXR7bGlid2luc291bmR9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvZGVjcy50ZXggYi9Eb2MvbGliL2xpYmNvZGVjcy50ZXgKaW5kZXggNmUwYmM4ZC4uMDVjMDM3NSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjb2RlY3MudGV4CisrKyBiL0RvYy9saWIvbGliY29kZWNzLnRleApAQCAtMTYxLDcgKzE2MSw3IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2xvb2t1cF9lcnJvcn17bmFtZX0KLVJldHVybiB0aGUgZXJyb3IgaGFuZGxlciBwcmV2aW91c2x5IHJlZ2lzdGVyIHVuZGVyIHRoZSBuYW1lIFx2YXJ7bmFtZX0uCitSZXR1cm4gdGhlIGVycm9yIGhhbmRsZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHVuZGVyIHRoZSBuYW1lIFx2YXJ7bmFtZX0uCiAKIFJhaXNlcyBhIFxleGNlcHRpb257TG9va3VwRXJyb3J9IGluIGNhc2UgdGhlIGhhbmRsZXIgY2Fubm90IGJlIGZvdW5kLgogXGVuZHtmdW5jZGVzY30KQEAgLTM2Niw3ICszNjYsNyBAQAogZGVmaW5lIGluIG9yZGVyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LgogCiBcYmVnaW57Y2xhc3NkZXNjfXtJbmNyZW1lbnRhbEVuY29kZXJ9e1xvcHRpb25hbHtlcnJvcnN9fQotICBDb25zdHJ1Y3RvciBmb3IgYSBcY2xhc3N7SW5jcmVtZW50YWxFbmNvZGVyfSBpbnN0YW5jZS4KKyAgQ29uc3RydWN0b3IgZm9yIGFuIFxjbGFzc3tJbmNyZW1lbnRhbEVuY29kZXJ9IGluc3RhbmNlLgogCiAgIEFsbCBpbmNyZW1lbnRhbCBlbmNvZGVycyBtdXN0IHByb3ZpZGUgdGhpcyBjb25zdHJ1Y3RvciBpbnRlcmZhY2UuIFRoZXkgYXJlCiAgIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGJ1dCBvbmx5IHRoZSBvbmVzIGRlZmluZWQKQEAgLTQxMyw3ICs0MTMsNyBAQAogZGVmaW5lIGluIG9yZGVyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5LgogCiBcYmVnaW57Y2xhc3NkZXNjfXtJbmNyZW1lbnRhbERlY29kZXJ9e1xvcHRpb25hbHtlcnJvcnN9fQotICBDb25zdHJ1Y3RvciBmb3IgYSBcY2xhc3N7SW5jcmVtZW50YWxEZWNvZGVyfSBpbnN0YW5jZS4KKyAgQ29uc3RydWN0b3IgZm9yIGFuIFxjbGFzc3tJbmNyZW1lbnRhbERlY29kZXJ9IGluc3RhbmNlLgogCiAgIEFsbCBpbmNyZW1lbnRhbCBkZWNvZGVycyBtdXN0IHByb3ZpZGUgdGhpcyBjb25zdHJ1Y3RvciBpbnRlcmZhY2UuIFRoZXkgYXJlCiAgIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGJ1dCBvbmx5IHRoZSBvbmVzIGRlZmluZWQKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29kZW9wLnRleCBiL0RvYy9saWIvbGliY29kZW9wLnRleAppbmRleCA3ZDYxNTNlLi42OTcyYjZmIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmNvZGVvcC50ZXgKKysrIGIvRG9jL2xpYi9saWJjb2Rlb3AudGV4CkBAIC0xOSw3ICsxOSw3IEBACiBcYmVnaW57ZW51bWVyYXRlfQogICBcaXRlbSBCZWluZyBhYmxlIHRvIHRlbGwgaWYgYSBsaW5lIG9mIGlucHV0IGNvbXBsZXRlcyBhIFB5dGhvbiAKICAgICAgICAgc3RhdGVtZW50OiBpbiBzaG9ydCwgdGVsbGluZyB3aGV0aGVyIHRvIHByaW50Ci0gICAgICAgIGBcY29kZXs+XGNvZGV7Pn0+fn0nIG9yIGBcY29kZXsuLi5+fScgbmV4dC4KKyAgICAgICAgYFxjb2Rlez4+Pn59JyBvciBgXGNvZGV7Li4ufn0nIG5leHQuCiAgIFxpdGVtIFJlbWVtYmVyaW5nIHdoaWNoIGZ1dHVyZSBzdGF0ZW1lbnRzIHRoZSB1c2VyIGhhcyBlbnRlcmVkLCBzbyAKICAgICAgICAgc3Vic2VxdWVudCBpbnB1dCBjYW4gYmUgY29tcGlsZWQgd2l0aCB0aGVzZSBpbiBlZmZlY3QuCiBcZW5ke2VudW1lcmF0ZX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29sbGVjdGlvbnMudGV4IGIvRG9jL2xpYi9saWJjb2xsZWN0aW9ucy50ZXgKaW5kZXggZDliZmEzOS4uM2U1NmEzZSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjb2xsZWN0aW9ucy50ZXgKKysrIGIvRG9jL2xpYi9saWJjb2xsZWN0aW9ucy50ZXgKQEAgLTU5LDEyICs1OSwxMiBAQAogCiBcYmVnaW57bWV0aG9kZGVzY317cG9wfXt9CiAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBlbGVtZW50IGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlLgotICAgSWYgbm8gZWxlbWVudHMgYXJlIHByZXNlbnQsIHJhaXNlcyBhIFxleGNlcHRpb257SW5kZXhFcnJvcn0uCisgICBJZiBubyBlbGVtZW50cyBhcmUgcHJlc2VudCwgcmFpc2VzIGFuIFxleGNlcHRpb257SW5kZXhFcnJvcn0uCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXtwb3BsZWZ0fXt9CiAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBlbGVtZW50IGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuCi0gICBJZiBubyBlbGVtZW50cyBhcmUgcHJlc2VudCwgcmFpc2VzIGEgXGV4Y2VwdGlvbntJbmRleEVycm9yfS4gICAKKyAgIElmIG5vIGVsZW1lbnRzIGFyZSBwcmVzZW50LCByYWlzZXMgYW4gXGV4Y2VwdGlvbntJbmRleEVycm9yfS4gICAKIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e3JlbW92ZX17dmFsdWV9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvbnRleHRsaWIudGV4IGIvRG9jL2xpYi9saWJjb250ZXh0bGliLnRleAppbmRleCA0NmY5Y2RkLi43MmJmNTM3IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmNvbnRleHRsaWIudGV4CisrKyBiL0RvYy9saWIvbGliY29udGV4dGxpYi50ZXgKQEAgLTEyLDExICsxMiwxMyBAQAogRnVuY3Rpb25zIHByb3ZpZGVkOgogCiBcYmVnaW57ZnVuY2Rlc2N9e2NvbnRleHRtYW5hZ2VyfXtmdW5jfQotVGhpcyBmdW5jdGlvbiBpcyBhIGRlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjb250ZXh0IG1hbmFnZXJzCi1mb3IgdXNlIHdpdGggdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCwgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhCi1jbGFzcyBvciBzZXBhcmF0ZSBcbWV0aG9ke19fZW50ZXJfXygpfSBhbmQgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzLgorVGhpcyBmdW5jdGlvbiBpcyBhIGRlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGZhY3RvcnkKK2Z1bmN0aW9uIGZvciBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgY29udGV4dCBtYW5hZ2Vycywgd2l0aG91dAorbmVlZGluZyB0byBjcmVhdGUgYSBjbGFzcyBvciBzZXBhcmF0ZSBcbWV0aG9ke19fZW50ZXJfXygpfSBhbmQKK1xtZXRob2R7X19leGl0X18oKX0gbWV0aG9kcy4KIAotQSBzaW1wbGUgZXhhbXBsZToKK0Egc2ltcGxlIGV4YW1wbGUgKHRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGFzIGEgcmVhbCB3YXkgb2YKK2dlbmVyYXRpbmcgSFRNTCEpOgogCiBcYmVnaW57dmVyYmF0aW19CiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CkBAIC0zNiw5ICszOCwxMCBAQAogPC9oMT4KIFxlbmR7dmVyYmF0aW19CiAKLVdoZW4gY2FsbGVkLCB0aGUgZGVjb3JhdGVkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgZ2VuZXJhdG9yLWl0ZXJhdG9yLgotVGhpcyBpdGVyYXRvciBtdXN0IHlpZWxkIGV4YWN0bHkgb25lIHZhbHVlLCB3aGljaCB3aWxsIGJlIGJvdW5kIHRvIHRoZQotdGFyZ2V0cyBpbiB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50J3MgXGtleXdvcmR7YXN9IGNsYXVzZSwgaWYgYW55LgorVGhlIGZ1bmN0aW9uIGJlaW5nIGRlY29yYXRlZCBtdXN0IHJldHVybiBhIGdlbmVyYXRvci1pdGVyYXRvciB3aGVuCitjYWxsZWQuIFRoaXMgaXRlcmF0b3IgbXVzdCB5aWVsZCBleGFjdGx5IG9uZSB2YWx1ZSwgd2hpY2ggd2lsbCBiZQorYm91bmQgdG8gdGhlIHRhcmdldHMgaW4gdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCdzIFxrZXl3b3Jke2FzfQorY2xhdXNlLCBpZiBhbnkuCiAKIEF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZ2VuZXJhdG9yIHlpZWxkcywgdGhlIGJsb2NrIG5lc3RlZCBpbiB0aGUKIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBpcyBleGVjdXRlZC4gIFRoZSBnZW5lcmF0b3IgaXMgdGhlbiByZXN1bWVkCkBAIC00NiwzNyArNDksMTYgQEAKIGJsb2NrLCBpdCBpcyByZXJhaXNlZCBpbnNpZGUgdGhlIGdlbmVyYXRvciBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIHlpZWxkCiBvY2N1cnJlZC4gIFRodXMsIHlvdSBjYW4gdXNlIGEKIFxrZXl3b3Jke3RyeX0uLi5ca2V5d29yZHtleGNlcHR9Li4uXGtleXdvcmR7ZmluYWxseX0gc3RhdGVtZW50IHRvIHRyYXAKLXRoZSBlcnJvciAoaWYgYW55KSwgb3IgZW5zdXJlIHRoYXQgc29tZSBjbGVhbnVwIHRha2VzIHBsYWNlLgotCi1Ob3RlIHRoYXQgeW91IGNhbiB1c2UgXGNvZGV7QGNvbnRleHRtYW5hZ2VyfSB0byBkZWZpbmUgYSBjb250ZXh0Ci1tYW5hZ2VyJ3MgXG1ldGhvZHtfX2NvbnRleHRfX30gbWV0aG9kLiAgVGhpcyBpcyB1c3VhbGx5IG1vcmUgY29udmVuaWVudAotdGhhbiBjcmVhdGluZyBhbm90aGVyIGNsYXNzIGp1c3QgdG8gc2VydmUgYXMgYSBjb250ZXh0LiAgRm9yIGV4YW1wbGU6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKLWZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKLQotY2xhc3MgVGFnOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKLSAgICAgICAgc2VsZi5uYW1lID0gbmFtZQotICAgICAgICAKLSAgICBAY29udGV4dG1hbmFnZXIKLSAgICBkZWYgX19jb250ZXh0X18oc2VsZik6Ci0gICAgICAgIHByaW50ICI8JXM+IiAlIHNlbGYubmFtZQotICAgICAgICB5aWVsZCBzZWxmCi0gICAgICAgIHByaW50ICI8LyVzPiIgJSBzZWxmLm5hbWUKLSAgICAgICAgCi1oMSA9IFRhZygiaDEiKQotCi0+Pj4gd2l0aCBoMSBhcyBtZToKLS4uLiAgICAgcHJpbnQgImhlbGxvIGZyb20iLCBtZQotPGgxPgotaGVsbG8gZnJvbSA8X19tYWluX18uVGFnIGluc3RhbmNlIGF0IDB4NDAyY2U4ZWM+Ci08L2gxPgotXGVuZHt2ZXJiYXRpbX0KK3RoZSBlcnJvciAoaWYgYW55KSwgb3IgZW5zdXJlIHRoYXQgc29tZSBjbGVhbnVwIHRha2VzIHBsYWNlLiBJZiBhbgorZXhjZXB0aW9uIGlzIHRyYXBwZWQgbWVyZWx5IGluIG9yZGVyIHRvIGxvZyBpdCBvciB0byBwZXJmb3JtIHNvbWUKK2FjdGlvbiAocmF0aGVyIHRoYW4gdG8gc3VwcHJlc3MgaXQgZW50aXJlbHkpLCB0aGUgZ2VuZXJhdG9yIG11c3QKK3JlcmFpc2UgdGhhdCBleGNlcHRpb24uIE90aGVyd2lzZSB0aGUgZ2VuZXJhdG9yIGNvbnRleHQgbWFuYWdlciB3aWxsCitpbmRpY2F0ZSB0byB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IHRoYXQgdGhlIGV4Y2VwdGlvbiBoYXMgYmVlbgoraGFuZGxlZCwgYW5kIGV4ZWN1dGlvbiB3aWxsIHJlc3VtZSB3aXRoIHRoZSBzdGF0ZW1lbnQgaW1tZWRpYXRlbHkKK2ZvbGxvd2luZyB0aGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LgogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXtuZXN0ZWR9e2N0eDFcb3B0aW9uYWx7LCBjdHgyXG9wdGlvbmFseywgLi4ufX19CitcYmVnaW57ZnVuY2Rlc2N9e25lc3RlZH17bWdyMVxvcHRpb25hbHssIG1ncjJcb3B0aW9uYWx7LCAuLi59fX0KIENvbWJpbmUgbXVsdGlwbGUgY29udGV4dCBtYW5hZ2VycyBpbnRvIGEgc2luZ2xlIG5lc3RlZCBjb250ZXh0IG1hbmFnZXIuCiAKIENvZGUgbGlrZSB0aGlzOgpAQCAtOTcsMTggKzc5LDIyIEBACiAgICAgICAgICAgICBkb19zb21ldGhpbmcoKQogXGVuZHt2ZXJiYXRpbX0KIAotTm90ZSB0aGF0IGlmIG9uZSBvZiB0aGUgbmVzdGVkIGNvbnRleHRzJyBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZAotcmFpc2VzIGFuIGV4Y2VwdGlvbiwgYW55IHByZXZpb3VzIGV4Y2VwdGlvbiBzdGF0ZSB3aWxsIGJlIGxvc3Q7IHRoZSBuZXcKLWV4Y2VwdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgb3V0ZXIgY29udGV4dHMnIFxtZXRob2R7X19leGl0X18oKX0KLW1ldGhvZChzKSwgaWYgYW55LiAgSW4gZ2VuZXJhbCwgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzIHNob3VsZCBhdm9pZAotcmFpc2luZyBleGNlcHRpb25zLCBhbmQgaW4gcGFydGljdWxhciB0aGV5IHNob3VsZCBub3QgcmUtcmFpc2UgYQorTm90ZSB0aGF0IGlmIHRoZSBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZCBvZiBvbmUgb2YgdGhlIG5lc3RlZAorY29udGV4dCBtYW5hZ2VycyBpbmRpY2F0ZXMgYW4gZXhjZXB0aW9uIHNob3VsZCBiZSBzdXBwcmVzc2VkLCBubworZXhjZXB0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIGFueSByZW1haW5pbmcgb3V0ZXIgY29udGV4dAorbWFuYWdlcnMuIFNpbWlsYXJseSwgaWYgdGhlIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIG9mIG9uZSBvZiB0aGUKK25lc3RlZCBtYW5hZ2VycyByYWlzZXMgYW4gZXhjZXB0aW9uLCBhbnkgcHJldmlvdXMgZXhjZXB0aW9uIHN0YXRlIHdpbGwKK2JlIGxvc3Q7IHRoZSBuZXcgZXhjZXB0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQorXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzIG9mIGFueSByZW1haW5pbmcgb3V0ZXIgY29udGV4dCBtYW5hZ2Vycy4KK0luIGdlbmVyYWwsIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kcyBzaG91bGQgYXZvaWQgcmFpc2luZworZXhjZXB0aW9ucywgYW5kIGluIHBhcnRpY3VsYXIgdGhleSBzaG91bGQgbm90IHJlLXJhaXNlIGEKIHBhc3NlZC1pbiBleGNlcHRpb24uCiBcZW5ke2Z1bmNkZXNjfQogCiBcbGFiZWx7Y29udGV4dC1jbG9zaW5nfQogXGJlZ2lue2Z1bmNkZXNjfXtjbG9zaW5nfXt0aGluZ30KLVJldHVybiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IGNsb3NlcyBcdmFye3RoaW5nfSB1cG9uIGNvbXBsZXRpb24gb2YgdGhlCi1ibG9jay4gIFRoaXMgaXMgYmFzaWNhbGx5IGVxdWl2YWxlbnQgdG86CitSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCBjbG9zZXMgXHZhcnt0aGluZ30gdXBvbiBjb21wbGV0aW9uIG9mCit0aGUgYmxvY2suICBUaGlzIGlzIGJhc2ljYWxseSBlcXVpdmFsZW50IHRvOgogCiBcYmVnaW57dmVyYmF0aW19CiBmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCkBAIC0xMjcsMTQgKzExMywxNCBAQAogZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCiBpbXBvcnQgY29kZWNzCiAKLXdpdGggY2xvc2luZyhjb2RlY3Mub3BlbigiZm9vIiwgZW5jb2Rpbmc9InV0ZjgiKSkgYXMgZjoKLSAgICBmb3IgbGluZSBpbiBmOgotICAgICAgICBwcmludCBsaW5lLmVuY29kZSgibGF0aW4xIikKK3dpdGggY2xvc2luZyh1cmxsaWIudXJsb3BlbignaHR0cDovL3d3dy5weXRob24ub3JnJykpIGFzIHBhZ2U6CisgICAgZm9yIGxpbmUgaW4gcGFnZToKKyAgICAgICAgcHJpbnQgbGluZQogXGVuZHt2ZXJiYXRpbX0KIAotd2l0aG91dCBuZWVkaW5nIHRvIGV4cGxpY2l0bHkgY2xvc2UgXGNvZGV7Zn0uICBFdmVuIGlmIGFuIGVycm9yIG9jY3VycywKLVxjb2Rle2YuY2xvc2UoKX0gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgXGtleXdvcmR7d2l0aH0gYmxvY2sgaXMgZXhpdGVkLgotCit3aXRob3V0IG5lZWRpbmcgdG8gZXhwbGljaXRseSBjbG9zZSBcY29kZXtwYWdlfS4gIEV2ZW4gaWYgYW4gZXJyb3IKK29jY3VycywgXGNvZGV7cGFnZS5jbG9zZSgpfSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBca2V5d29yZHt3aXRofQorYmxvY2sgaXMgZXhpdGVkLgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue3NlZWFsc299CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmN0eXBlcy50ZXggYi9Eb2MvbGliL2xpYmN0eXBlcy50ZXgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGMzNzc0OQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvbGliY3R5cGVzLnRleApAQCAtMCwwICsxLDEyMjYgQEAKK1xuZXdsZW5ndGh7XGxvY2FsbGluZXdpZHRofQorXHNldGxlbmd0aHtcbG9jYWxsaW5ld2lkdGh9e1xsaW5ld2lkdGh9Citcc2VjdGlvbntcbW9kdWxle2N0eXBlc30gLS0tIEEgZm9yZWlnbiBmdW5jdGlvbiBsaWJyYXJ5IGZvciBQeXRob24ufQorXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e2N0eXBlc30KK1xtb2R1bGVhdXRob3J7VGhvbWFzIEhlbGxlcn17dGhlbGxlckBweXRob24ubmV0fQorXG1vZHVsZXN5bm9wc2lze0EgZm9yZWlnbiBmdW5jdGlvbiBsaWJyYXJ5IGZvciBQeXRob24ufQorXHZlcnNpb25hZGRlZHsyLjV9CisKK1xjb2Rle2N0eXBlc30gaXMgYSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi4KKworCitcc3Vic2VjdGlvbntjdHlwZXMgdHV0b3JpYWxcbGFiZWx7Y3R5cGVzLWN0eXBlcy10dXRvcmlhbH19CisKK1RoaXMgdHV0b3JpYWwgZGVzY3JpYmVzIHZlcnNpb24gMC45Ljkgb2YgXGNvZGV7Y3R5cGVzfS4KKworTm90ZTogVGhlIGNvZGUgc2FtcGxlcyBpbiB0aGlzIHR1dG9yaWFsIHVzZXMgXGNvZGV7ZG9jdGVzdH0gdG8gbWFrZSBzdXJlCit0aGF0IHRoZXkgYWN0dWFsbHkgd29yay4gIFNpbmNlIHNvbWUgY29kZSBzYW1wbGVzIGJlaGF2ZSBkaWZmZXJlbnRseQordW5kZXIgTGludXgsIFdpbmRvd3MsIG9yIE1hYyBPUyBYLCB0aGV5IGNvbnRhaW4gZG9jdGVzdCBkaXJlY3RpdmVzIGluCitjb21tZW50cy4KKworTm90ZTogUXVpdGUgc29tZSBjb2RlIHNhbXBsZXMgcmVmZXJlbmNlcyB0aGUgY3R5cGVzIFxjbGFzc3tje1xffWludH0gdHlwZS4KK1RoaXMgdHlwZSBpcyBhbiBhbGlhcyB0byB0aGUgXGNsYXNze2N7XF99bG9uZ30gdHlwZSBvbiAzMi1iaXQgc3lzdGVtcy4gIFNvLAoreW91IHNob3VsZCBub3QgYmUgY29uZnVzZWQgaWYgXGNsYXNze2N7XF99bG9uZ30gaXMgcHJpbnRlZCBpZiB5b3Ugd291bGQKK2V4cGVjdCBcY2xhc3N7Y3tcX31pbnR9IC0gdGhleSBhcmUgYWN0dWFsbHkgdGhlIHNhbWUgdHlwZS4KKworCitcc3Vic3Vic2VjdGlvbntMb2FkaW5nIGR5bmFtaWMgbGluayBsaWJyYXJpZXNcbGFiZWx7Y3R5cGVzLWxvYWRpbmctZHluYW1pYy1saW5rLWxpYnJhcmllc319CisKK1xjb2Rle2N0eXBlc30gZXhwb3J0cyB0aGUgXHZhcntjZGxsfSwgYW5kIG9uIFdpbmRvd3MgYWxzbyBcdmFye3dpbmRsbH0gYW5kCitcdmFye29sZWRsbH0gb2JqZWN0cyB0byBsb2FkIGR5bmFtaWMgbGluayBsaWJyYXJpZXMuCisKK1lvdSBsb2FkIGxpYnJhcmllcyBieSBhY2Nlc3NpbmcgdGhlbSBhcyBhdHRyaWJ1dGVzIG9mIHRoZXNlIG9iamVjdHMuCitcdmFye2NkbGx9IGxvYWRzIGxpYnJhcmllcyB3aGljaCBleHBvcnQgZnVuY3Rpb25zIHVzaW5nIHRoZSBzdGFuZGFyZAorXGNvZGV7Y2RlY2x9IGNhbGxpbmcgY29udmVudGlvbiwgd2hpbGUgXHZhcnt3aW5kbGx9IGxpYnJhcmllcyBjYWxsCitmdW5jdGlvbnMgdXNpbmcgdGhlIFxjb2Rle3N0ZGNhbGx9IGNhbGxpbmcgY29udmVudGlvbi4gXHZhcntvbGVkbGx9IGFsc28KK3VzZXMgdGhlIFxjb2Rle3N0ZGNhbGx9IGNhbGxpbmcgY29udmVudGlvbiwgYW5kIGFzc3VtZXMgdGhlIGZ1bmN0aW9ucworcmV0dXJuIGEgV2luZG93cyBcY2xhc3N7SFJFU1VMVH0gZXJyb3IgY29kZS4gVGhlIGVycm9yIGNvZGUgaXMgdXNlZCB0bworYXV0b21hdGljYWxseSByYWlzZSBcY2xhc3N7V2luZG93c0Vycm9yfSBQeXRob24gZXhjZXB0aW9ucyB3aGVuIHRoZQorZnVuY3Rpb24gY2FsbCBmYWlscy4KKworSGVyZSBhcmUgc29tZSBleGFtcGxlcyBmb3IgV2luZG93cywgbm90ZSB0aGF0IFxjb2Rle21zdmNydH0gaXMgdGhlIE1TCitzdGFuZGFyZCBDIGxpYnJhcnkgY29udGFpbmluZyBtb3N0IHN0YW5kYXJkIEMgZnVuY3Rpb25zLCBhbmQgdXNlcyB0aGUKK2NkZWNsIGNhbGxpbmcgY29udmVudGlvbjoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorPj4+IHByaW50IHdpbmRsbC5rZXJuZWwzMiAjIGRvY3Rlc3Q6ICtXSU5ET1dTCis8V2luRExMICdrZXJuZWwzMicsIGhhbmRsZSAuLi4gYXQgLi4uPgorPj4+IHByaW50IGNkbGwubXN2Y3J0ICMgZG9jdGVzdDogK1dJTkRPV1MKKzxDRExMICdtc3ZjcnQnLCBoYW5kbGUgLi4uIGF0IC4uLj4KKz4+PiBsaWJjID0gY2RsbC5tc3ZjcnQgIyBkb2N0ZXN0OiArV0lORE9XUworPj4+CitcZW5ke3ZlcmJhdGltfQorCitXaW5kb3dzIGFwcGVuZHMgdGhlIHVzdWFsICcuZGxsJyBmaWxlIHN1ZmZpeCBhdXRvbWF0aWNhbGx5LgorCitPbiBMaW51eCwgaXQgaXMgcmVxdWlyZWQgdG8gc3BlY2lmeSB0aGUgZmlsZW5hbWUgXGVtcGh7aW5jbHVkaW5nfSB0aGUKK2V4dGVuc2lvbiB0byBsb2FkIGEgbGlicmFyeSwgc28gYXR0cmlidXRlIGFjY2VzcyBkb2VzIG5vdCB3b3JrLgorRWl0aGVyIHRoZSBcbWV0aG9ke0xvYWRMaWJyYXJ5fSBtZXRob2Qgb2YgdGhlIGRsbCBsb2FkZXJzIHNob3VsZCBiZSB1c2VkLAorb3IgeW91IHNob3VsZCBsb2FkIHRoZSBsaWJyYXJ5IGJ5IGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIENETEwgYnkKK2NhbGxpbmcgdGhlIGNvbnN0cnVjdG9yOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGNkbGwuTG9hZExpYnJhcnkoImxpYmMuc28uNiIpICMgZG9jdGVzdDogK0xJTlVYCis8Q0RMTCAnbGliYy5zby42JywgaGFuZGxlIC4uLiBhdCAuLi4+Cis+Pj4gbGliYyA9IENETEwoImxpYmMuc28uNiIpICAgICAjIGRvY3Rlc3Q6ICtMSU5VWAorPj4+IGxpYmMgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb2N0ZXN0OiArTElOVVgKKzxDRExMICdsaWJjLnNvLjYnLCBoYW5kbGUgLi4uIGF0IC4uLj4KKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworWFhYIEFkZCBzZWN0aW9uIGZvciBNYWMgT1MgWC4KKworCitcc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgZnVuY3Rpb25zIGZyb20gbG9hZGVkIGRsbHNcbGFiZWx7Y3R5cGVzLWFjY2Vzc2luZy1mdW5jdGlvbnMtZnJvbS1sb2FkZWQtZGxsc319CisKK0Z1bmN0aW9ucyBhcmUgYWNjZXNzZWQgYXMgYXR0cmlidXRlcyBvZiBkbGwgb2JqZWN0czoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorPj4+IGxpYmMucHJpbnRmCis8X0Z1bmNQdHIgb2JqZWN0IGF0IDB4Li4uPgorPj4+IHByaW50IHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBICMgZG9jdGVzdDogK1dJTkRPV1MKKzxfRnVuY1B0ciBvYmplY3QgYXQgMHguLi4+Cis+Pj4gcHJpbnQgd2luZGxsLmtlcm5lbDMyLk15T3duRnVuY3Rpb24gIyBkb2N0ZXN0OiArV0lORE9XUworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgIEZpbGUgImN0eXBlcy5weSIsIGxpbmUgMjM5LCBpbiBfX2dldGF0dHJfXworICAgIGZ1bmMgPSBfU3RkY2FsbEZ1bmNQdHIobmFtZSwgc2VsZikKK0F0dHJpYnV0ZUVycm9yOiBmdW5jdGlvbiAnTXlPd25GdW5jdGlvbicgbm90IGZvdW5kCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK05vdGUgdGhhdCB3aW4zMiBzeXN0ZW0gZGxscyBsaWtlIFxjb2Rle2tlcm5lbDMyfSBhbmQgXGNvZGV7dXNlcjMyfSBvZnRlbgorZXhwb3J0IEFOU0kgYXMgd2VsbCBhcyBVTklDT0RFIHZlcnNpb25zIG9mIGEgZnVuY3Rpb24uIFRoZSBVTklDT0RFCit2ZXJzaW9uIGlzIGV4cG9ydGVkIHdpdGggYW4gXGNvZGV7V30gYXBwZW5kZWQgdG8gdGhlIG5hbWUsIHdoaWxlIHRoZSBBTlNJCit2ZXJzaW9uIGlzIGV4cG9ydGVkIHdpdGggYW4gXGNvZGV7QX0gYXBwZW5kZWQgdG8gdGhlIG5hbWUuIFRoZSB3aW4zMgorXGNvZGV7R2V0TW9kdWxlSGFuZGxlfSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIFxlbXBoe21vZHVsZSBoYW5kbGV9IGZvciBhCitnaXZlbiBtb2R1bGUgbmFtZSwgaGFzIHRoZSBmb2xsb3dpbmcgQyBwcm90b3R5cGUsIGFuZCBhIG1hY3JvIGlzIHVzZWQKK3RvIGV4cG9zZSBvbmUgb2YgdGhlbSBhcyBcY29kZXtHZXRNb2R1bGVIYW5kbGV9IGRlcGVuZGluZyBvbiB3aGV0aGVyCitVTklDT0RFIGlzIGRlZmluZWQgb3Igbm90OgorXGJlZ2lue3ZlcmJhdGltfQorLyogQU5TSSB2ZXJzaW9uICovCitITU9EVUxFIEdldE1vZHVsZUhhbmRsZUEoTFBDU1RSIGxwTW9kdWxlTmFtZSk7CisvKiBVTklDT0RFIHZlcnNpb24gKi8KK0hNT0RVTEUgR2V0TW9kdWxlSGFuZGxlVyhMUENXU1RSIGxwTW9kdWxlTmFtZSk7CitcZW5ke3ZlcmJhdGltfQorCitcdmFye3dpbmRsbH0gZG9lcyBub3QgdHJ5IHRvIHNlbGVjdCBvbmUgb2YgdGhlbSBieSBtYWdpYywgeW91IG11c3QKK2FjY2VzcyB0aGUgdmVyc2lvbiB5b3UgbmVlZCBieSBzcGVjaWZ5aW5nIFxjb2Rle0dldE1vZHVsZUhhbmRsZUF9IG9yCitcY29kZXtHZXRNb2R1bGVIYW5kbGVXfSBleHBsaWNpdGVseSwgYW5kIHRoZW4gY2FsbCBpdCB3aXRoIG5vcm1hbCBzdHJpbmdzCitvciB1bmljb2RlIHN0cmluZ3MgcmVzcGVjdGl2ZWx5LgorCitTb21ldGltZXMsIGRsbHMgZXhwb3J0IGZ1bmN0aW9ucyB3aXRoIG5hbWVzIHdoaWNoIGFyZW4ndCB2YWxpZCBQeXRob24KK2lkZW50aWZpZXJzLCBsaWtlIFxjb2RleyI/PzJAWUFQQVhJQFoifS4gSW4gdGhpcyBjYXNlIHlvdSBoYXZlIHRvIHVzZQorXGNvZGV7Z2V0YXR0cn0gdG8gcmV0cmlldmUgdGhlIGZ1bmN0aW9uOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGdldGF0dHIoY2RsbC5tc3ZjcnQsICI/PzJAWUFQQVhJQFoiKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCis8X0Z1bmNQdHIgb2JqZWN0IGF0IDB4Li4uPgorPj4+CitcZW5ke3ZlcmJhdGltfQorCitPbiBXaW5kb3dzLCBzb21lIGRsbHMgZXhwb3J0IGZ1bmN0aW9ucyBub3QgYnkgbmFtZSBidXQgYnkgb3JkaW5hbC4KK1RoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgYWNjZXNzZWQgYnkgaW5kZXhpbmcgdGhlIGRsbCBvYmplY3Qgd2l0aCB0aGUKK29kaW5hbCBudW1iZXI6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gY2RsbC5rZXJuZWwzMlsxXSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCis8X0Z1bmNQdHIgb2JqZWN0IGF0IDB4Li4uPgorPj4+IGNkbGwua2VybmVsMzJbMF0gIyBkb2N0ZXN0OiArV0lORE9XUworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgIEZpbGUgImN0eXBlcy5weSIsIGxpbmUgMzEwLCBpbiBfX2dldGl0ZW1fXworICAgIGZ1bmMgPSBfU3RkY2FsbEZ1bmNQdHIobmFtZSwgc2VsZikKK0F0dHJpYnV0ZUVycm9yOiBmdW5jdGlvbiBvcmRpbmFsIDAgbm90IGZvdW5kCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKKworXHN1YnN1YnNlY3Rpb257Q2FsbGluZyBmdW5jdGlvbnNcbGFiZWx7Y3R5cGVzLWNhbGxpbmctZnVuY3Rpb25zfX0KKworWW91IGNhbiBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBsaWtlIGFueSBvdGhlciBQeXRob24gY2FsbGFibGUuIFRoaXMKK2V4YW1wbGUgdXNlcyB0aGUgXGNvZGV7dGltZSgpfSBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBzeXN0ZW0gdGltZSBpbgorc2Vjb25kcyBzaW5jZSB0aGUgXFVOSVh7fSBlcG9jaCwgYW5kIHRoZSBcY29kZXtHZXRNb2R1bGVIYW5kbGVBKCl9IGZ1bmN0aW9uLAord2hpY2ggcmV0dXJucyBhIHdpbjMyIG1vZHVsZSBoYW5kbGUuCisKK1RoaXMgZXhhbXBsZSBjYWxscyBib3RoIGZ1bmN0aW9ucyB3aXRoIGEgTlVMTCBwb2ludGVyIChcY29kZXtOb25lfSBzaG91bGQKK2JlIHVzZWQgYXMgdGhlIE5VTEwgcG9pbnRlcik6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcHJpbnQgbGliYy50aW1lKE5vbmUpCisxMTQuLi4KKz4+PiBwcmludCBoZXgod2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoTm9uZSkpICMgZG9jdGVzdDogK1dJTkRPV1MKKzB4MWQwMDAwMDAKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworXGNvZGV7Y3R5cGVzfSB0cmllcyB0byBwcm90ZWN0IHlvdSBmcm9tIGNhbGxpbmcgZnVuY3Rpb25zIHdpdGggdGhlIHdyb25nCitudW1iZXIgb2YgYXJndW1lbnRzLiAgVW5mb3J0dW5hdGVseSB0aGlzIG9ubHkgd29ya3Mgb24gV2luZG93cy4gIEl0Citkb2VzIHRoaXMgYnkgZXhhbWluaW5nIHRoZSBzdGFjayBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJuczoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgpICMgZG9jdGVzdDogK1dJTkRPV1MKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworVmFsdWVFcnJvcjogUHJvY2VkdXJlIHByb2JhYmx5IGNhbGxlZCB3aXRoIG5vdCBlbm91Z2ggYXJndW1lbnRzICg0IGJ5dGVzIG1pc3NpbmcpCis+Pj4gd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoMCwgMCkgIyBkb2N0ZXN0OiArV0lORE9XUworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgYXJndW1lbnRzICg0IGJ5dGVzIGluIGV4Y2VzcykKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworT24gV2luZG93cywgXGNvZGV7Y3R5cGVzfSB1c2VzIHdpbjMyIHN0cnVjdHVyZWQgZXhjZXB0aW9uIGhhbmRsaW5nIHRvCitwcmV2ZW50IGNyYXNoZXMgZnJvbSBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHRzIHdoZW4gZnVuY3Rpb25zIGFyZQorY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudCB2YWx1ZXM6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoMzIpICMgZG9jdGVzdDogK1dJTkRPV1MKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworV2luZG93c0Vycm9yOiBleGNlcHRpb246IGFjY2VzcyB2aW9sYXRpb24gcmVhZGluZyAweDAwMDAwMDIwCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1RoZXJlIGFyZSwgaG93ZXZlciwgZW5vdWdoIHdheXMgdG8gY3Jhc2ggUHl0aG9uIHdpdGggXGNvZGV7Y3R5cGVzfSwgc28KK3lvdSBzaG91bGQgYmUgY2FyZWZ1bCBhbnl3YXkuCisKK1B5dGhvbiBpbnRlZ2Vycywgc3RyaW5ncyBhbmQgdW5pY29kZSBzdHJpbmdzIGFyZSB0aGUgb25seSBvYmplY3RzIHRoYXQKK2NhbiBkaXJlY3RseSBiZSB1c2VkIGFzIHBhcmFtZXRlcnMgaW4gdGhlc2UgZnVuY3Rpb24gY2FsbHMuCisKK0JlZm9yZSB3ZSBtb3ZlIG9uIGNhbGxpbmcgZnVuY3Rpb25zIHdpdGggb3RoZXIgcGFyYW1ldGVyIHR5cGVzLCB3ZQoraGF2ZSB0byBsZWFybiBtb3JlIGFib3V0IFxjb2Rle2N0eXBlc30gZGF0YSB0eXBlcy4KKworCitcc3Vic3Vic2VjdGlvbntTaW1wbGUgZGF0YSB0eXBlc1xsYWJlbHtjdHlwZXMtc2ltcGxlLWRhdGEtdHlwZXN9fQorCitcY29kZXtjdHlwZXN9IGRlZmluZXMgYSBudW1iZXIgb2YgcHJpbWl0aXZlIEMgY29tcGF0aWJsZSBkYXRhIHR5cGVzIDoKK1xiZWdpbntxdW90ZX0KKworXGJlZ2lue2xvbmd0YWJsZX1bY117fHB7MC4xOVxsb2NhbGxpbmV3aWR0aH18cHswLjI4XGxvY2FsbGluZXdpZHRofXxwezAuMTRcbG9jYWxsaW5ld2lkdGh9fH0KK1xobGluZQorXHRleHRiZnsKK2N0eXBlcyB0eXBlCit9ICYgXHRleHRiZnsKK0MgdHlwZQorfSAmIFx0ZXh0YmZ7CitQeXRob24gdHlwZQorfSBcXAorXGhsaW5lCitcZW5kaGVhZAorCitcY2xhc3N7Y3tcX31jaGFyfQorICYgCitcY29kZXtjaGFyfQorICYgCitjaGFyYWN0ZXIKKyBcXAorXGhsaW5lCisKK1xjbGFzc3tje1xffWJ5dGV9CisgJiAKK1xjb2Rle2NoYXJ9CisgJiAKK2ludGVnZXIKKyBcXAorXGhsaW5lCisKK1xjbGFzc3tje1xffXVieXRlfQorICYgCitcY29kZXt1bnNpZ25lZCBjaGFyfQorICYgCitpbnRlZ2VyCisgXFwKK1xobGluZQorCitcY2xhc3N7Y3tcX31zaG9ydH0KKyAmIAorXGNvZGV7c2hvcnR9CisgJiAKK2ludGVnZXIKKyBcXAorXGhsaW5lCisKK1xjbGFzc3tje1xffXVzaG9ydH0KKyAmIAorXGNvZGV7dW5zaWduZWQgc2hvcnR9CisgJiAKK2ludGVnZXIKKyBcXAorXGhsaW5lCisKK1xjbGFzc3tje1xffWludH0KKyAmIAorXGNvZGV7aW50fQorICYgCitpbnRlZ2VyCisgXFwKK1xobGluZQorCitcY2xhc3N7Y3tcX311aW50fQorICYgCitcY29kZXt1bnNpZ25lZCBpbnR9CisgJiAKK2ludGVnZXIKKyBcXAorXGhsaW5lCisKK1xjbGFzc3tje1xffWxvbmd9CisgJiAKK1xjb2Rle2xvbmd9CisgJiAKK2ludGVnZXIKKyBcXAorXGhsaW5lCisKK1xjbGFzc3tje1xffXVsb25nfQorICYgCitcY29kZXt1bnNpZ25lZCBsb25nfQorICYgCitsb25nCisgXFwKK1xobGluZQorCitcY2xhc3N7Y3tcX31sb25nbG9uZ30KKyAmIAorXGNvZGV7e1xffXtcX31pbnQ2NH0gb3IKK1xjb2Rle2xvbmcgbG9uZ30KKyAmIAorbG9uZworIFxcCitcaGxpbmUKKworXGNsYXNze2N7XF99dWxvbmdsb25nfQorICYgCitcY29kZXt1bnNpZ25lZCB7XF99e1xffWludDY0fSBvcgorXGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfQorICYgCitsb25nCisgXFwKK1xobGluZQorCitcY2xhc3N7Y3tcX31mbG9hdH0KKyAmIAorXGNvZGV7ZmxvYXR9CisgJiAKK2Zsb2F0CisgXFwKK1xobGluZQorCitcY2xhc3N7Y3tcX31kb3VibGV9CisgJiAKK1xjb2Rle2RvdWJsZX0KKyAmIAorZmxvYXQKKyBcXAorXGhsaW5lCisKK1xjbGFzc3tje1xffWNoYXJ7XF99cH0KKyAmIAorXGNvZGV7Y2hhciAqfQorKE5VTCB0ZXJtaW5hdGVkKQorICYgCitzdHJpbmcgb3IKK1xjb2Rle05vbmV9CisgXFwKK1xobGluZQorCitcY2xhc3N7Y3tcX313Y2hhcntcX31wfQorICYgCitcY29kZXt3Y2hhcntcX310ICp9CisoTlVMIHRlcm1pbmF0ZWQpCisgJiAKK3VuaWNvZGUgb3IKK1xjb2Rle05vbmV9CisgXFwKK1xobGluZQorCitcY2xhc3N7Y3tcX312b2lke1xffXB9CisgJiAKK1xjb2Rle3ZvaWQgKn0KKyAmIAoraW50ZWdlciBvcgorXGNvZGV7Tm9uZX0KKyBcXAorXGhsaW5lCitcZW5ke2xvbmd0YWJsZX0KK1xlbmR7cXVvdGV9CisKK0FsbCB0aGVzZSB0eXBlcyBjYW4gYmUgY3JlYXRlZCBieSBjYWxsaW5nIHRoZW0gd2l0aCBhbiBvcHRpb25hbAoraW5pdGlhbGl6ZXIgb2YgdGhlIGNvcnJlY3QgdHlwZSBhbmQgdmFsdWU6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gY19pbnQoKQorY19sb25nKDApCis+Pj4gY19jaGFyX3AoIkhlbGxvLCBXb3JsZCIpCitjX2NoYXJfcCgnSGVsbG8sIFdvcmxkJykKKz4+PiBjX3VzaG9ydCgtMykKK2NfdXNob3J0KDY1NTMzKQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitTaW5jZSB0aGVzZSB0eXBlcyBhcmUgbXV0YWJsZSwgdGhlaXIgdmFsdWUgY2FuIGFsc28gYmUgY2hhbmdlZAorYWZ0ZXJ3YXJkczoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBpID0gY19pbnQoNDIpCis+Pj4gcHJpbnQgaQorY19sb25nKDQyKQorPj4+IHByaW50IGkudmFsdWUKKzQyCis+Pj4gaS52YWx1ZSA9IC05OQorPj4+IHByaW50IGkudmFsdWUKKy05OQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitBc3NpZ25pbmcgYSBuZXcgdmFsdWUgdG8gaW5zdGFuY2VzIG9mIHRoZSBwb2ludGVyIHR5cGVzIFxjbGFzc3tje1xffWNoYXJ7XF99cH0sCitcY2xhc3N7Y3tcX313Y2hhcntcX31wfSwgYW5kIFxjbGFzc3tje1xffXZvaWR7XF99cH0gY2hhbmdlcyB0aGUgXGVtcGh7bWVtb3J5IGxvY2F0aW9ufSB0aGV5Citwb2ludCB0bywgXGVtcGh7bm90IHRoZSBjb250ZW50c30gb2YgdGhlIG1lbW9yeSBibG9jayAob2YgY291cnNlIG5vdCwKK2JlY2F1c2UgUHl0aG9uIHN0cmluZ3MgYXJlIGltbXV0YWJsZSk6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcyA9ICJIZWxsbywgV29ybGQiCis+Pj4gY19zID0gY19jaGFyX3AocykKKz4+PiBwcmludCBjX3MKK2NfY2hhcl9wKCdIZWxsbywgV29ybGQnKQorPj4+IGNfcy52YWx1ZSA9ICJIaSwgdGhlcmUiCis+Pj4gcHJpbnQgY19zCitjX2NoYXJfcCgnSGksIHRoZXJlJykKKz4+PiBwcmludCBzICAgICAgICAgICAgICAgICAjIGZpcnN0IHN0cmluZyBpcyB1bmNoYW5nZWQKK0hlbGxvLCBXb3JsZAorXGVuZHt2ZXJiYXRpbX0KKworWW91IHNob3VsZCBiZSBjYXJlZnVsLCBob3dldmVyLCBub3QgdG8gcGFzcyB0aGVtIHRvIGZ1bmN0aW9ucworZXhwZWN0aW5nIHBvaW50ZXJzIHRvIG11dGFibGUgbWVtb3J5LiBJZiB5b3UgbmVlZCBtdXRhYmxlIG1lbW9yeQorYmxvY2tzLCBjdHlwZXMgaGFzIGEgXGNvZGV7Y3JlYXRle1xffXN0cmluZ3tcX31idWZmZXJ9IGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMKK3RoZXNlIGluIHZhcmlvdXMgd2F5cy4gIFRoZSBjdXJyZW50IG1lbW9yeSBibG9jayBjb250ZW50cyBjYW4gYmUKK2FjY2Vzc2VkIChvciBjaGFuZ2VkKSB3aXRoIHRoZSBcY29kZXtyYXd9IHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MKK2l0IGFzIE5VTCB0ZXJtaW5hdGVkIHN0cmluZywgdXNlIHRoZSBcY29kZXtzdHJpbmd9IHByb3BlcnR5OgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGZyb20gY3R5cGVzIGltcG9ydCAqCis+Pj4gcCA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKDMpICAgICAgIyBjcmVhdGUgYSAzIGJ5dGUgYnVmZmVyLCBpbml0aWFsaXplZCB0byBOVUwgYnl0ZXMKKz4+PiBwcmludCBzaXplb2YocCksIHJlcHIocC5yYXcpCiszICdceDAwXHgwMFx4MDAnCis+Pj4gcCA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCJIZWxsbyIpICAgICAgIyBjcmVhdGUgYSBidWZmZXIgY29udGFpbmluZyBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZworPj4+IHByaW50IHNpemVvZihwKSwgcmVwcihwLnJhdykKKzYgJ0hlbGxvXHgwMCcKKz4+PiBwcmludCByZXByKHAudmFsdWUpCisnSGVsbG8nCis+Pj4gcCA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCJIZWxsbyIsIDEwKSAgIyBjcmVhdGUgYSAxMCBieXRlIGJ1ZmZlcgorPj4+IHByaW50IHNpemVvZihwKSwgcmVwcihwLnJhdykKKzEwICdIZWxsb1x4MDBceDAwXHgwMFx4MDBceDAwJworPj4+IHAudmFsdWUgPSAiSGkiICAgICAgCis+Pj4gcHJpbnQgc2l6ZW9mKHApLCByZXByKHAucmF3KQorMTAgJ0hpXHgwMGxvXHgwMFx4MDBceDAwXHgwMFx4MDAnCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBcY29kZXtjcmVhdGV7XF99c3RyaW5ne1xffWJ1ZmZlcn0gZnVuY3Rpb24gcmVwbGFjZXMgdGhlIFxjb2Rle2N7XF99YnVmZmVyfQorZnVuY3Rpb24gKHdoaWNoIGlzIHN0aWxsIGF2YWlsYWJsZSBhcyBhbiBhbGlhcyksIGFzIHdlbGwgYXMgdGhlCitcY29kZXtje1xffXN0cmluZ30gZnVuY3Rpb24gZnJvbSBlYXJsaWVyIGN0eXBlcyByZWxlYXNlcy4gIFRvIGNyZWF0ZSBhCittdXRhYmxlIG1lbW9yeSBibG9jayBjb250YWluaW5nIHVuaWNvZGUgY2hhcmFjdGVycyBvZiB0aGUgQyB0eXBlCitcY29kZXt3Y2hhcntcX310fSB1c2UgdGhlIFxjb2Rle2NyZWF0ZXtcX311bmljb2Rle1xffWJ1ZmZlcn0gZnVuY3Rpb24uCisKKworXHN1YnN1YnNlY3Rpb257Q2FsbGluZyBmdW5jdGlvbnMsIGNvbnRpbnVlZFxsYWJlbHtjdHlwZXMtY2FsbGluZy1mdW5jdGlvbnMtY29udGludWVkfX0KKworTm90ZSB0aGF0IHByaW50ZiBwcmludHMgdG8gdGhlIHJlYWwgc3RhbmRhcmQgb3V0cHV0IGNoYW5uZWwsIFxlbXBoe25vdH0gdG8KK1xjb2Rle3N5cy5zdGRvdXR9LCBzbyB0aGVzZSBleGFtcGxlcyB3aWxsIG9ubHkgd29yayBhdCB0aGUgY29uc29sZQorcHJvbXB0LCBub3QgZnJvbSB3aXRoaW4gXGVtcGh7SURMRX0gb3IgXGVtcGh7UHl0aG9uV2lufToKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBwcmludGYgPSBsaWJjLnByaW50ZgorPj4+IHByaW50ZigiSGVsbG8sICVzXG4iLCAiV29ybGQhIikKK0hlbGxvLCBXb3JsZCEKKzE0Cis+Pj4gcHJpbnRmKCJIZWxsbywgJVMiLCB1IldvcmxkISIpCitIZWxsbywgV29ybGQhCisxMworPj4+IHByaW50ZigiJWQgYm90dGxlcyBvZiBiZWVyXG4iLCA0MikKKzQyIGJvdHRsZXMgb2YgYmVlcgorMTkKKz4+PiBwcmludGYoIiVmIGJvdHRsZXMgb2YgYmVlclxuIiwgNDIuNSkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworQXJndW1lbnRFcnJvcjogYXJndW1lbnQgMjogZXhjZXB0aW9ucy5UeXBlRXJyb3I6IERvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyIDIKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworQXMgaGFzIGJlZW4gbWVudGlvbmVkIGJlZm9yZSwgYWxsIFB5dGhvbiB0eXBlcyBleGNlcHQgaW50ZWdlcnMsCitzdHJpbmdzLCBhbmQgdW5pY29kZSBzdHJpbmdzIGhhdmUgdG8gYmUgd3JhcHBlZCBpbiB0aGVpciBjb3JyZXNwb25kaW5nCitcY29kZXtjdHlwZXN9IHR5cGUsIHNvIHRoYXQgdGhleSBjYW4gYmUgY29udmVydGVkIHRvIHRoZSByZXF1aXJlZCBDIGRhdGEKK3R5cGU6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcHJpbnRmKCJBbiBpbnQgJWQsIGEgZG91YmxlICVmXG4iLCAxMjM0LCBjX2RvdWJsZSgzLjE0KSkKK0ludGVnZXIgMTIzNCwgZG91YmxlIDMuMTQwMDAwMTA0OQorMzEKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworCitcc3Vic3Vic2VjdGlvbntDYWxsaW5nIGZ1bmN0aW9ucyB3aXRoIHlvdXIgb3duIGN1c3RvbSBkYXRhIHR5cGVzXGxhYmVse2N0eXBlcy1jYWxsaW5nLWZ1bmN0aW9ucy13aXRoLW93bi1jdXN0b20tZGF0YS10eXBlc319CisKK1lvdSBjYW4gYWxzbyBjdXN0b21pemUgXGNvZGV7Y3R5cGVzfSBhcmd1bWVudCBjb252ZXJzaW9uIHRvIGFsbG93CitpbnN0YW5jZXMgb2YgeW91ciBvd24gY2xhc3NlcyBiZSB1c2VkIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cy4KK1xjb2Rle2N0eXBlc30gbG9va3MgZm9yIGFuIFxtZW1iZXJ7e1xffWFze1xffXBhcmFtZXRlcntcX319IGF0dHJpYnV0ZSBhbmQgdXNlcyB0aGlzIGFzCit0aGUgZnVuY3Rpb24gYXJndW1lbnQuIE9mIGNvdXJzZSwgaXQgbXVzdCBiZSBvbmUgb2YgaW50ZWdlciwgc3RyaW5nLAorb3IgdW5pY29kZToKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBjbGFzcyBCb3R0bGVzKG9iamVjdCk6CisuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCBudW1iZXIpOgorLi4uICAgICAgICAgc2VsZi5fYXNfcGFyYW1ldGVyXyA9IG51bWJlcgorLi4uCis+Pj4gYm90dGxlcyA9IEJvdHRsZXMoNDIpCis+Pj4gcHJpbnRmKCIlZCBib3R0bGVzIG9mIGJlZXJcbiIsIGJvdHRsZXMpCis0MiBib3R0bGVzIG9mIGJlZXIKKzE5Cis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHN0b3JlIHRoZSBpbnN0YW5jZSdzIGRhdGEgaW4gdGhlCitcbWVtYmVye3tcX31hc3tcX31wYXJhbWV0ZXJ7XF99fSBpbnN0YW5jZSB2YXJpYWJsZSwgeW91IGNvdWxkIGRlZmluZSBhIFxjb2Rle3Byb3BlcnR5fQord2hpY2ggbWFrZXMgdGhlIGRhdGEgYXZhaWJsYWJsZS4KKworCitcc3Vic3Vic2VjdGlvbntTcGVjaWZ5aW5nIHRoZSByZXF1aXJlZCBhcmd1bWVudCB0eXBlcyAoZnVuY3Rpb24gcHJvdG90eXBlcylcbGFiZWx7Y3R5cGVzLXNwZWNpZnlpbmctcmVxdWlyZWQtYXJndW1lbnQtdHlwZXN9fQorCitJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSByZXF1aXJlZCBhcmd1bWVudCB0eXBlcyBvZiBmdW5jdGlvbnMKK2V4cG9ydGVkIGZyb20gRExMcyBieSBzZXR0aW5nIHRoZSBcbWVtYmVye2FyZ3R5cGVzfSBhdHRyaWJ1dGUuCisKK1xtZW1iZXJ7YXJndHlwZXN9IG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBDIGRhdGEgdHlwZXMgKHRoZSBcY29kZXtwcmludGZ9CitmdW5jdGlvbiBpcyBwcm9iYWJseSBub3QgYSBnb29kIGV4YW1wbGUgaGVyZSwgYmVjYXVzZSBpdCB0YWtlcyBhCit2YXJpYWJsZSBudW1iZXIgYW5kIGRpZmZlcmVudCB0eXBlcyBvZiBwYXJhbWV0ZXJzIGRlcGVuZGluZyBvbiB0aGUKK2Zvcm1hdCBzdHJpbmcsIG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgaXMgcXVpdGUgaGFuZHkgdG8gZXhwZXJpbWVudAord2l0aCB0aGlzIGZlYXR1cmUpOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHByaW50Zi5hcmd0eXBlcyA9IFtjX2NoYXJfcCwgY19jaGFyX3AsIGNfaW50LCBjX2RvdWJsZV0KKz4+PiBwcmludGYoIlN0cmluZyAnJXMnLCBJbnQgJWQsIERvdWJsZSAlZlxuIiwgIkhpIiwgMTAsIDIuMikKK1N0cmluZyAnSGknLCBJbnQgMTAsIERvdWJsZSAyLjIwMDAwMAorMzcKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworU3BlY2lmeWluZyBhIGZvcm1hdCBwcm90ZWN0cyBhZ2FpbnN0IGluY29tcGF0aWJsZSBhcmd1bWVudCB0eXBlcyAoanVzdAorYXMgYSBwcm90b3R5cGUgZm9yIGEgQyBmdW5jdGlvbiksIGFuZCB0cmllcyB0byBjb252ZXJ0IHRoZSBhcmd1bWVudHMKK3RvIHZhbGlkIHR5cGVzOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHByaW50ZigiJWQgJWQgJWQiLCAxLCAyLCAzKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitBcmd1bWVudEVycm9yOiBhcmd1bWVudCAyOiBleGNlcHRpb25zLlR5cGVFcnJvcjogd3JvbmcgdHlwZQorPj4+IHByaW50ZigiJXMgJWQgJWYiLCAiWCIsIDIsIDMpCitYIDIgMy4wMDAwMDAxMgorMTIKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworSWYgeW91IGhhdmUgZGVmaW5lZCB5b3VyIG93biBjbGFzc2VzIHdoaWNoIHlvdSBwYXNzIHRvIGZ1bmN0aW9uIGNhbGxzLAoreW91IGhhdmUgdG8gaW1wbGVtZW50IGEgXG1ldGhvZHtmcm9te1xffXBhcmFtfSBjbGFzcyBtZXRob2QgZm9yIHRoZW0gdG8gYmUKK2FibGUgdG8gdXNlIHRoZW0gaW4gdGhlIFxtZW1iZXJ7YXJndHlwZXN9IHNlcXVlbmNlLiBUaGUgXG1ldGhvZHtmcm9te1xffXBhcmFtfQorY2xhc3MgbWV0aG9kIHJlY2VpdmVzIHRoZSBQeXRob24gb2JqZWN0IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gY2FsbCwKK2l0IHNob3VsZCBkbyBhIHR5cGVjaGVjayBvciB3aGF0ZXZlciBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoaXMKK29iamVjdCBpcyBhY2NlcHRhYmxlLCBhbmQgdGhlbiByZXR1cm4gdGhlIG9iamVjdCBpdHNlbGYsIGl0J3MKK1xtZW1iZXJ7e1xffWFze1xffXBhcmFtZXRlcntcX319IGF0dHJpYnV0ZSwgb3Igd2hhdGV2ZXIgeW91IHdhbnQgdG8gcGFzcyBhcyB0aGUgQworZnVuY3Rpb24gYXJndW1lbnQgaW4gdGhpcyBjYXNlLiBBZ2FpbiwgdGhlIHJlc3VsdCBzaG91bGQgYmUgYW4KK2ludGVnZXIsIHN0cmluZywgdW5pY29kZSwgYSBcY29kZXtjdHlwZXN9IGluc3RhbmNlLCBvciBzb21ldGhpbmcgaGF2aW5nCit0aGUgXG1lbWJlcnt7XF99YXN7XF99cGFyYW1ldGVye1xffX0gYXR0cmlidXRlLgorCisKK1xzdWJzdWJzZWN0aW9ue1JldHVybiB0eXBlc1xsYWJlbHtjdHlwZXMtcmV0dXJuLXR5cGVzfX0KKworQnkgZGVmYXVsdCBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gcmV0dXJuIGludGVnZXJzLiAgT3RoZXIgcmV0dXJuCit0eXBlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNldHRpbmcgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlIG9mIHRoZQorZnVuY3Rpb24gb2JqZWN0LgorCitIZXJlIGlzIGEgbW9yZSBhZHZhbmNlZCBleGFtcGxlLCBpdCB1c2VzIHRoZSBzdHJjaHIgZnVuY3Rpb24sIHdoaWNoCitleHBlY3RzIGEgc3RyaW5nIHBvaW50ZXIgYW5kIGEgY2hhciwgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEKK3N0cmluZzoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBzdHJjaHIgPSBsaWJjLnN0cmNocgorPj4+IHN0cmNocigiYWJjZGVmIiwgb3JkKCJkIikpICMgZG9jdGVzdDogK1NLSVAKKzgwNTk5ODMKKz4+PiBzdHJjaHIucmVzdHlwZSA9IGNfY2hhcl9wICMgY19jaGFyX3AgaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nCis+Pj4gc3RyY2hyKCJhYmNkZWYiLCBvcmQoImQiKSkKKydkZWYnCis+Pj4gcHJpbnQgc3RyY2hyKCJhYmNkZWYiLCBvcmQoIngiKSkKK05vbmUKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworSWYgeW91IHdhbnQgdG8gYXZvaWQgdGhlIFxjb2Rle29yZCgieCIpfSBjYWxscyBhYm92ZSwgeW91IGNhbiBzZXQgdGhlCitcbWVtYmVye2FyZ3R5cGVzfSBhdHRyaWJ1dGUsIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHdpbGwgYmUgY29udmVydGVkIGZyb20KK2Egc2luZ2xlIGNoYXJhY3RlciBQeXRob24gc3RyaW5nIGludG8gYSBDIGNoYXI6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gc3RyY2hyLnJlc3R5cGUgPSBjX2NoYXJfcAorPj4+IHN0cmNoci5hcmd0eXBlcyA9IFtjX2NoYXJfcCwgY19jaGFyXQorPj4+IHN0cmNocigiYWJjZGVmIiwgImQiKQorJ2RlZicKKz4+PiBzdHJjaHIoImFiY2RlZiIsICJkZWYiKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitBcmd1bWVudEVycm9yOiBhcmd1bWVudCAyOiBleGNlcHRpb25zLlR5cGVFcnJvcjogb25lIGNoYXJhY3RlciBzdHJpbmcgZXhwZWN0ZWQKKz4+PiBwcmludCBzdHJjaHIoImFiY2RlZiIsICJ4IikKK05vbmUKKz4+PiBzdHJjaHIoImFiY2RlZiIsICJkIikKKydkZWYnCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1hYWCBNZW50aW9uIHRoZSBcbWVtYmVye2VycmNoZWNrfSBwcm90b2NvbC4uLgorCitZb3UgY2FuIGFsc28gdXNlIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCAoYSBmdW5jdGlvbiBvciBhIGNsYXNzIGZvcgorZXhhbXBsZSkgYXMgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLiAgSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKK1xjb2Rle2ludGVnZXJ9IHRoZSBDIGZ1bmN0aW9uIHJldHVybnMsIGFuZCB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbCB3aWxsCitiZSB1c2VkIGFzIHRoZSByZXN1bHQgb2YgeW91ciBmdW5jdGlvbiBjYWxsLiBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjaworZm9yIGVycm9yIHJldHVybiB2YWx1ZXMgYW5kIGF1dG9tYXRpY2FsbHkgcmFpc2UgYW4gZXhjZXB0aW9uOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IEdldE1vZHVsZUhhbmRsZSA9IHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBICMgZG9jdGVzdDogK1dJTkRPV1MKKz4+PiBkZWYgVmFsaWRIYW5kbGUodmFsdWUpOgorLi4uICAgICBpZiB2YWx1ZSA9PSAwOgorLi4uICAgICAgICAgcmFpc2UgV2luRXJyb3IoKQorLi4uICAgICByZXR1cm4gdmFsdWUKKy4uLgorPj4+Cis+Pj4gR2V0TW9kdWxlSGFuZGxlLnJlc3R5cGUgPSBWYWxpZEhhbmRsZSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCis+Pj4gR2V0TW9kdWxlSGFuZGxlKE5vbmUpICMgZG9jdGVzdDogK1dJTkRPV1MKKzQ4NjUzOTI2NAorPj4+IEdldE1vZHVsZUhhbmRsZSgic29tZXRoaW5nIHNpbGx5IikgIyBkb2N0ZXN0OiArV0lORE9XUyArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICBGaWxlICI8c3RkaW4+IiwgbGluZSAzLCBpbiBWYWxpZEhhbmRsZQorV2luZG93c0Vycm9yOiBbRXJybm8gMTI2XSBUaGUgc3BlY2lmaWVkIG1vZHVsZSBjb3VsZCBub3QgYmUgZm91bmQuCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1xjb2Rle1dpbkVycm9yfSBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgY2FsbCBXaW5kb3dzIFxjb2Rle0Zvcm1hdE1lc3NhZ2UoKX0KK2FwaSB0byBnZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBlcnJvciBjb2RlLCBhbmQgXGVtcGh7cmV0dXJuc30KK2FuIGV4Y2VwdGlvbi4gIFxjb2Rle1dpbkVycm9yfSB0YWtlcyBhbiBvcHRpb25hbCBlcnJvciBjb2RlIHBhcmFtZXRlciwgaWYKK25vIG9uZSBpcyB1c2VkLCBpdCBjYWxscyBcZnVuY3Rpb257R2V0TGFzdEVycm9yKCl9IHRvIHJldHJpZXZlIGl0LgorCisKK1xzdWJzdWJzZWN0aW9ue1Bhc3NpbmcgcG9pbnRlcnMgKG9yOiBwYXNzaW5nIHBhcmFtZXRlcnMgYnkgcmVmZXJlbmNlKVxsYWJlbHtjdHlwZXMtcGFzc2luZy1wb2ludGVyc319CisKK1NvbWV0aW1lcyBhIEMgYXBpIGZ1bmN0aW9uIGV4cGVjdHMgYSBcZW1waHtwb2ludGVyfSB0byBhIGRhdGEgdHlwZSBhcworcGFyYW1ldGVyLCBwcm9iYWJseSB0byB3cml0ZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGxvY2F0aW9uLCBvciBpZgordGhlIGRhdGEgaXMgdG9vIGxhcmdlIHRvIGJlIHBhc3NlZCBieSB2YWx1ZS4gVGhpcyBpcyBhbHNvIGtub3duIGFzCitcZW1waHtwYXNzaW5nIHBhcmFtZXRlcnMgYnkgcmVmZXJlbmNlfS4KKworXGNvZGV7Y3R5cGVzfSBleHBvcnRzIHRoZSBcZnVuY3Rpb257YnlyZWZ9IGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gcGFzcworcGFyYW1ldGVycyBieSByZWZlcmVuY2UuICBUaGUgc2FtZSBlZmZlY3QgY2FuIGJlIGFjaGlldmVkIHdpdGggdGhlCitcY29kZXtwb2ludGVyfSBmdW5jdGlvbiwgYWx0aG91Z2ggXGNvZGV7cG9pbnRlcn0gZG9lcyBhIGxvdCBtb3JlIHdvcmsgc2luY2UKK2l0IGNvbnN0cnVjdHMgYSByZWFsIHBvaW50ZXIgb2JqZWN0LCBzbyBpdCBpcyBmYXN0ZXIgdG8gdXNlIFxmdW5jdGlvbntieXJlZn0KK2lmIHlvdSBkb24ndCBuZWVkIHRoZSBwb2ludGVyIG9iamVjdCBpbiBQeXRob24gaXRzZWxmOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGkgPSBjX2ludCgpCis+Pj4gZiA9IGNfZmxvYXQoKQorPj4+IHMgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcignXDAwMCcgKiAzMikKKz4+PiBwcmludCBpLnZhbHVlLCBmLnZhbHVlLCByZXByKHMudmFsdWUpCiswIDAuMCAnJworPj4+IGxpYmMuc3NjYW5mKCIxIDMuMTQgSGVsbG8iLCAiJWQgJWYgJXMiLAorLi4uICAgICAgICAgICAgIGJ5cmVmKGkpLCBieXJlZihmKSwgcykKKzMKKz4+PiBwcmludCBpLnZhbHVlLCBmLnZhbHVlLCByZXByKHMudmFsdWUpCisxIDMuMTQwMDAwMTA0OSAnSGVsbG8nCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKKworXHN1YnN1YnNlY3Rpb257U3RydWN0dXJlcyBhbmQgdW5pb25zXGxhYmVse2N0eXBlcy1zdHJ1Y3R1cmVzLXVuaW9uc319CisKK1N0cnVjdHVyZXMgYW5kIHVuaW9ucyBtdXN0IGRlcml2ZSBmcm9tIHRoZSBcY2xhc3N7U3RydWN0dXJlfSBhbmQgXGNsYXNze1VuaW9ufQorYmFzZSBjbGFzc2VzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBcY29kZXtjdHlwZXN9IG1vZHVsZS4gRWFjaCBzdWJjbGFzcworbXVzdCBkZWZpbmUgYSBcbWVtYmVye3tcX31maWVsZHN7XF99fSBhdHRyaWJ1dGUuICBcbWVtYmVye3tcX31maWVsZHN7XF99fSBtdXN0IGJlIGEgbGlzdCBvZgorXGVtcGh7Mi10dXBsZXN9LCBjb250YWluaW5nIGEgXGVtcGh7ZmllbGQgbmFtZX0gYW5kIGEgXGVtcGh7ZmllbGQgdHlwZX0uCisKK1RoZSBmaWVsZCB0eXBlIG11c3QgYmUgYSBcY29kZXtjdHlwZXN9IHR5cGUgbGlrZSBcY2xhc3N7Y3tcX31pbnR9LCBvciBhbnkgb3RoZXIKK2Rlcml2ZWQgXGNvZGV7Y3R5cGVzfSB0eXBlOiBzdHJ1Y3R1cmUsIHVuaW9uLCBhcnJheSwgcG9pbnRlci4KKworSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGEgUE9JTlQgc3RydWN0dXJlLCB3aGljaCBjb250YWlucyB0d28KK2ludGVnZXJzIG5hbWVkIFxjb2Rle3h9IGFuZCBcY29kZXt5fSwgYW5kIGFsc28gc2hvd3MgaG93IHRvIGluaXRpYWxpemUgYQorc3RydWN0dXJlIGluIHRoZSBjb25zdHJ1Y3RvcjoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorPj4+IGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisuLi4gICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwKKy4uLiAgICAgICAgICAgICAgICAgKCJ5IiwgY19pbnQpXQorLi4uCis+Pj4gcG9pbnQgPSBQT0lOVCgxMCwgMjApCis+Pj4gcHJpbnQgcG9pbnQueCwgcG9pbnQueQorMTAgMjAKKz4+PiBwb2ludCA9IFBPSU5UKHk9NSkKKz4+PiBwcmludCBwb2ludC54LCBwb2ludC55CiswIDUKKz4+PiBQT0lOVCgxLCAyLCAzKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitWYWx1ZUVycm9yOiB0b28gbWFueSBpbml0aWFsaXplcnMKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworWW91IGNhbiwgaG93ZXZlciwgYnVpbGQgbXVjaCBtb3JlIGNvbXBsaWNhdGVkIHN0cnVjdHVyZXMuIFN0cnVjdHVyZXMKK2NhbiBpdHNlbGYgY29udGFpbiBvdGhlciBzdHJ1Y3R1cmVzIGJ5IHVzaW5nIGEgc3RydWN0dXJlIGFzIGEgZmllbGQKK3R5cGUuCisKK0hlcmUgaXMgYSBSRUNUIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyB0d28gUE9JTlRzIG5hbWVkIFxjb2Rle3VwcGVybGVmdH0KK2FuZCBcY29kZXtsb3dlcnJpZ2h0fQorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGNsYXNzIFJFQ1QoU3RydWN0dXJlKToKKy4uLiAgICAgX2ZpZWxkc18gPSBbKCJ1cHBlcmxlZnQiLCBQT0lOVCksCisuLi4gICAgICAgICAgICAgICAgICgibG93ZXJyaWdodCIsIFBPSU5UKV0KKy4uLgorPj4+IHJjID0gUkVDVChwb2ludCkKKz4+PiBwcmludCByYy51cHBlcmxlZnQueCwgcmMudXBwZXJsZWZ0LnkKKzAgNQorPj4+IHByaW50IHJjLmxvd2VycmlnaHQueCwgcmMubG93ZXJyaWdodC55CiswIDAKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworTmVzdGVkIHN0cnVjdHVyZXMgY2FuIGFsc28gYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yIGluCitzZXZlcmFsIHdheXM6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gciA9IFJFQ1QoUE9JTlQoMSwgMiksIFBPSU5UKDMsIDQpKQorPj4+IHIgPSBSRUNUKCgxLCAyKSwgKDMsIDQpKQorXGVuZHt2ZXJiYXRpbX0KKworRmllbGRzIGRlc2NyaXB0b3JzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgXGVtcGh7Y2xhc3N9LCB0aGV5IGFyZSB1c2VmdWwKK2ZvciBkZWJ1Z2dpbmcgYmVjYXVzZSB0aGV5IGNhbiBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbjoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBwcmludCBQT0lOVC54Cis8RmllbGQgdHlwZT1jX2xvbmcsIG9mcz0wLCBzaXplPTQ+Cis+Pj4gcHJpbnQgUE9JTlQueQorPEZpZWxkIHR5cGU9Y19sb25nLCBvZnM9NCwgc2l6ZT00PgorPj4+CitcZW5ke3ZlcmJhdGltfQorCisKK1xzdWJzdWJzZWN0aW9ue1N0cnVjdHVyZS91bmlvbiBhbGlnbm1lbnQgYW5kIGJ5dGUgb3JkZXJcbGFiZWx7Y3R5cGVzLXN0cnVjdHVyZXVuaW9uLWFsaWdubWVudC1ieXRlLW9yZGVyfX0KKworQnkgZGVmYXVsdCwgU3RydWN0dXJlIGFuZCBVbmlvbiBmaWVsZHMgYXJlIGFsaWduZWQgaW4gdGhlIHNhbWUgd2F5IHRoZQorQyBjb21waWxlciBkb2VzIGl0LiBJdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW91ciBiZQorc3BlY2lmeWluZyBhIFxtZW1iZXJ7e1xffXBhY2t7XF99fSBjbGFzcyBhdHRyaWJ1dGUgaW4gdGhlIHN1YmNsYXNzCitkZWZpbml0aW9uLiBUaGlzIG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgc3BlY2lmaWVzIHRoZQorbWF4aW11bSBhbGlnbm1lbnQgZm9yIHRoZSBmaWVsZHMuIFRoaXMgaXMgd2hhdCBcY29kZXt7XCN9cHJhZ21hIHBhY2sobil9CithbHNvIGRvZXMgaW4gTVNWQy4KKworXGNvZGV7Y3R5cGVzfSB1c2VzIHRoZSBuYXRpdmUgYnl0ZSBvcmRlciBmb3IgU3RydWN0dXJlcyBhbmQgVW5pb25zLiAgVG8KK2J1aWxkIHN0cnVjdHVyZXMgd2l0aCBub24tbmF0aXZlIGJ5dGUgb3JkZXIsIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUKK0JpZ0VuZGlhblN0cnVjdHVyZSwgTGl0dGxlRW5kaWFuU3RydWN0dXJlLCBCaWdFbmRpYW5VbmlvbiwgYW5kCitMaXR0bGVFbmRpYW5VbmlvbiBiYXNlIGNsYXNzZXMuICBUaGVzZSBjbGFzc2VzIGNhbm5vdCBjb250YWluIHBvaW50ZXIKK2ZpZWxkcy4KKworCitcc3Vic3Vic2VjdGlvbntCaXQgZmllbGRzIGluIHN0cnVjdHVyZXMgYW5kIHVuaW9uc1xsYWJlbHtjdHlwZXMtYml0LWZpZWxkcy1pbi1zdHJ1Y3R1cmVzLXVuaW9uc319CisKK0l0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgY29udGFpbmluZyBiaXQgZmllbGRzLgorQml0IGZpZWxkcyBhcmUgb25seSBwb3NzaWJsZSBmb3IgaW50ZWdlciBmaWVsZHMsIHRoZSBiaXQgd2lkdGggaXMKK3NwZWNpZmllZCBhcyB0aGUgdGhpcmQgaXRlbSBpbiB0aGUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0gdHVwbGVzOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGNsYXNzIEludChTdHJ1Y3R1cmUpOgorLi4uICAgICBfZmllbGRzXyA9IFsoImZpcnN0XzE2IiwgY19pbnQsIDE2KSwKKy4uLiAgICAgICAgICAgICAgICAgKCJzZWNvbmRfMTYiLCBjX2ludCwgMTYpXQorLi4uCis+Pj4gcHJpbnQgSW50LmZpcnN0XzE2Cis8RmllbGQgdHlwZT1jX2xvbmcsIG9mcz0wOjAsIGJpdHM9MTY+Cis+Pj4gcHJpbnQgSW50LnNlY29uZF8xNgorPEZpZWxkIHR5cGU9Y19sb25nLCBvZnM9MDoxNiwgYml0cz0xNj4KKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworCitcc3Vic3Vic2VjdGlvbntBcnJheXNcbGFiZWx7Y3R5cGVzLWFycmF5c319CisKK0FycmF5cyBhcmUgc2VxdWVuY2VzLCBjb250YWluaW5nIGEgZml4ZWQgbnVtYmVyIG9mIGluc3RhbmNlcyBvZiB0aGUKK3NhbWUgdHlwZS4KKworVGhlIHJlY29tbWVuZGVkIHdheSB0byBjcmVhdGUgYXJyYXkgdHlwZXMgaXMgYnkgbXVsdGlwbHlpbmcgYSBkYXRhCit0eXBlIHdpdGggYSBwb3NpdGl2ZSBpbnRlZ2VyOgorXGJlZ2lue3ZlcmJhdGltfQorVGVuUG9pbnRzQXJyYXlUeXBlID0gUE9JTlQgKiAxMAorXGVuZHt2ZXJiYXRpbX0KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGFuIHNvbWV3aGF0IGFydGlmaWNhbCBkYXRhIHR5cGUsIGEgc3RydWN0dXJlCitjb250YWluaW5nIDQgUE9JTlRzIGFtb25nIG90aGVyIHN0dWZmOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGZyb20gY3R5cGVzIGltcG9ydCAqCis+Pj4gY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKy4uLiAgICBfZmllbGRzXyA9ICgieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpCisuLi4KKz4+PiBjbGFzcyBNeVN0cnVjdChTdHJ1Y3R1cmUpOgorLi4uICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKy4uLiAgICAgICAgICAgICAgICAoImIiLCBjX2Zsb2F0KSwKKy4uLiAgICAgICAgICAgICAgICAoInBvaW50X2FycmF5IiwgUE9JTlQgKiA0KV0KKz4+PgorPj4+IHByaW50IGxlbihNeVN0cnVjdCgpLnBvaW50X2FycmF5KQorNAorXGVuZHt2ZXJiYXRpbX0KKworSW5zdGFuY2VzIGFyZSBjcmVhdGVkIGluIHRoZSB1c3VhbCB3YXksIGJ5IGNhbGxpbmcgdGhlIGNsYXNzOgorXGJlZ2lue3ZlcmJhdGltfQorYXJyID0gVGVuUG9pbnRzQXJyYXlUeXBlKCkKK2ZvciBwdCBpbiBhcnI6CisgICAgcHJpbnQgcHQueCwgcHQueQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGFib3ZlIGNvZGUgcHJpbnQgYSBzZXJpZXMgb2YgXGNvZGV7MCAwfSBsaW5lcywgYmVjYXVzZSB0aGUgYXJyYXkKK2NvbnRlbnRzIGlzIGluaXRpYWxpemVkIHRvIHplcm9zLgorCitJbml0aWFsaXplcnMgb2YgdGhlIGNvcnJlY3QgdHlwZSBjYW4gYWxzbyBiZSBzcGVjaWZpZWQ6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKKz4+PiBUZW5JbnRlZ2VycyA9IGNfaW50ICogMTAKKz4+PiBpaSA9IFRlbkludGVnZXJzKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKQorPj4+IHByaW50IGlpCis8Y19sb25nX0FycmF5XzEwIG9iamVjdCBhdCAweC4uLj4KKz4+PiBmb3IgaSBpbiBpaTogcHJpbnQgaSwKKy4uLgorMSAyIDMgNCA1IDYgNyA4IDkgMTAKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworCitcc3Vic3Vic2VjdGlvbntQb2ludGVyc1xsYWJlbHtjdHlwZXMtcG9pbnRlcnN9fQorCitQb2ludGVyIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBcY29kZXtwb2ludGVyfSBmdW5jdGlvbiBvbiBhCitcY29kZXtjdHlwZXN9IHR5cGU6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKKz4+PiBpID0gY19pbnQoNDIpCis+Pj4gcGkgPSBwb2ludGVyKGkpCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1hYWCBYWFggTm90IGNvcnJlY3Q6IHVzZSBpbmRleGluZywgbm90IHRoZSBjb250ZW50cyBhdHJpYnV0ZQorCitQb2ludGVyIGluc3RhbmNlcyBoYXZlIGEgXGNvZGV7Y29udGVudHN9IGF0dHJpYnV0ZSB3aGljaCByZXR1cm5zIHRoZQorY3R5cGVzJyB0eXBlIHBvaW50ZWQgdG8sIHRoZSBcY29kZXtje1xffWludCg0Mil9IGluIHRoZSBhYm92ZSBjYXNlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHBpLmNvbnRlbnRzCitjX2xvbmcoNDIpCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0Fzc2lnbmluZyBhbm90aGVyIFxjbGFzc3tje1xffWludH0gaW5zdGFuY2UgdG8gdGhlIHBvaW50ZXIncyBjb250ZW50cworYXR0cmlidXRlIHdvdWxkIGNhdXNlIHRoZSBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBtZW1vcnkgbG9jYXRpb24KK3doZXJlIHRoaXMgaXMgc3RvcmVkOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHBpLmNvbnRlbnRzID0gY19pbnQoOTkpCis+Pj4gcGkuY29udGVudHMKK2NfbG9uZyg5OSkKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworUG9pbnRlciBpbnN0YW5jZXMgY2FuIGFsc28gYmUgaW5kZXhlZCB3aXRoIGludGVnZXJzOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHBpWzBdCis5OQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitYWFggV2hhdCBpcyB0aGlzPz8/CitBc3NpZ25pbmcgdG8gYW4gaW50ZWdlciBpbmRleCBjaGFuZ2VzIHRoZSBwb2ludGVkIHRvIHZhbHVlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGkyID0gcGlbMF0KKz4+PiBpMgorOTkKKz4+PiBwaVswXSA9IDIyCis+Pj4gaTIKKzk5Cis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIGluZGV4ZXMgZGlmZmVyZW50IGZyb20gMCwgYnV0IHlvdSBtdXN0IGtub3cKK3doYXQgeW91J3JlIGRvaW5nIHdoZW4geW91IHVzZSB0aGlzOiBZb3UgYWNjZXNzIG9yIGNoYW5nZSBhcmJpdHJhcnkKK21lbW9yeSBsb2NhdGlvbnMgd2hlbiB5b3UgZG8gdGhpcy4gR2VuZXJhbGx5IHlvdSBvbmx5IHVzZSB0aGlzIGZlYXR1cmUKK2lmIHlvdSByZWNlaXZlIGEgcG9pbnRlciBmcm9tIGEgQyBmdW5jdGlvbiwgYW5kIHlvdSBcZW1waHtrbm93fSB0aGF0IHRoZQorcG9pbnRlciBhY3R1YWxseSBwb2ludHMgdG8gYW4gYXJyYXkgaW5zdGVhZCBvZiBhIHNpbmdsZSBpdGVtLgorCisKK1xzdWJzdWJzZWN0aW9ue1BvaW50ZXIgY2xhc3Nlcy90eXBlc1xsYWJlbHtjdHlwZXMtcG9pbnRlci1jbGFzc2VzdHlwZXN9fQorCitCZWhpbmQgdGhlIHNjZW5lcywgdGhlIFxjb2Rle3BvaW50ZXJ9IGZ1bmN0aW9uIGRvZXMgbW9yZSB0aGFuIHNpbXBseQorY3JlYXRlIHBvaW50ZXIgaW5zdGFuY2VzLCBpdCBoYXMgdG8gY3JlYXRlIHBvaW50ZXIgXGVtcGh7dHlwZXN9IGZpcnN0LgorVGhpcyBpcyBkb25lIHdpdGggdGhlIFxjb2Rle1BPSU5URVJ9IGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIGFueQorXGNvZGV7Y3R5cGVzfSB0eXBlLCBhbmQgcmV0dXJucyBhIG5ldyB0eXBlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IFBJID0gUE9JTlRFUihjX2ludCkKKz4+PiBQSQorPGNsYXNzICdjdHlwZXMuTFBfY19sb25nJz4KKz4+PiBQSSg0MikgIyBkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworVHlwZUVycm9yOiBleHBlY3RlZCBjX2xvbmcgaW5zdGVhZCBvZiBpbnQKKz4+PiBQSShjX2ludCg0MikpCis8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHguLi4+Cis+Pj4KK1xlbmR7dmVyYmF0aW19CisKKworXHN1YnN1YnNlY3Rpb257SW5jb21wbGV0ZSBUeXBlc1xsYWJlbHtjdHlwZXMtaW5jb21wbGV0ZS10eXBlc319CisKK1xlbXBoe0luY29tcGxldGUgVHlwZXN9IGFyZSBzdHJ1Y3R1cmVzLCB1bmlvbnMgb3IgYXJyYXlzIHdob3NlIG1lbWJlcnMgYXJlCitub3QgeWV0IHNwZWNpZmllZC4gSW4gQywgdGhleSBhcmUgc3BlY2lmaWVkIGJ5IGZvcndhcmQgZGVjbGFyYXRpb25zLCB3aGljaAorYXJlIGRlZmluZWQgbGF0ZXI6CitcYmVnaW57dmVyYmF0aW19CitzdHJ1Y3QgY2VsbDsgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworCitzdHJ1Y3QgeworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IGNlbGwgKm5leHQ7Cit9IGNlbGw7CitcZW5ke3ZlcmJhdGltfQorCitUaGUgc3RyYWlnaHRmb3J3YXJkIHRyYW5zbGF0aW9uIGludG8gY3R5cGVzIGNvZGUgd291bGQgYmUgdGhpcywgYnV0IGl0Citkb2VzIG5vdCB3b3JrOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGNsYXNzIGNlbGwoU3RydWN0dXJlKToKKy4uLiAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyX3ApLAorLi4uICAgICAgICAgICAgICAgICAoIm5leHQiLCBQT0lOVEVSKGNlbGwpKV0KKy4uLgorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIGNlbGwKK05hbWVFcnJvcjogbmFtZSAnY2VsbCcgaXMgbm90IGRlZmluZWQKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworYmVjYXVzZSB0aGUgbmV3IFxjb2Rle2NsYXNzIGNlbGx9IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGNsYXNzIHN0YXRlbWVudAoraXRzZWxmLiAgSW4gXGNvZGV7Y3R5cGVzfSwgd2UgY2FuIGRlZmluZSB0aGUgXGNvZGV7Y2VsbH0gY2xhc3MgYW5kIHNldCB0aGUKK1xtZW1iZXJ7e1xffWZpZWxkc3tcX319IGF0dHJpYnV0ZSBsYXRlciwgYWZ0ZXIgdGhlIGNsYXNzIHN0YXRlbWVudDoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorPj4+IGNsYXNzIGNlbGwoU3RydWN0dXJlKToKKy4uLiAgICAgcGFzcworLi4uCis+Pj4gY2VsbC5fZmllbGRzXyA9IFsoIm5hbWUiLCBjX2NoYXJfcCksCisuLi4gICAgICAgICAgICAgICAgICAoIm5leHQiLCBQT0lOVEVSKGNlbGwpKV0KKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworTGV0cyB0cnkgaXQuIFdlIGNyZWF0ZSB0d28gaW5zdGFuY2VzIG9mIFxjb2Rle2NlbGx9LCBhbmQgbGV0IHRoZW0gcG9pbnQKK3RvIGVhY2ggb3RoZXIsIGFuZCBmaW5hbGx5IGZvbGxvdyB0aGUgcG9pbnRlciBjaGFpbiBhIGZldyB0aW1lczoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBjMSA9IGNlbGwoKQorPj4+IGMxLm5hbWUgPSAiZm9vIgorPj4+IGMyID0gY2VsbCgpCis+Pj4gYzIubmFtZSA9ICJiYXIiCis+Pj4gYzEubmV4dCA9IHBvaW50ZXIoYzIpCis+Pj4gYzIubmV4dCA9IHBvaW50ZXIoYzEpCis+Pj4gcCA9IGMxCis+Pj4gZm9yIGkgaW4gcmFuZ2UoOCk6CisuLi4gICAgIHByaW50IHAubmFtZSwKKy4uLiAgICAgcCA9IHAubmV4dFswXQorLi4uCitmb28gYmFyIGZvbyBiYXIgZm9vIGJhciBmb28gYmFyCis+Pj4gICAgCitcZW5ke3ZlcmJhdGltfQorCisKK1xzdWJzdWJzZWN0aW9ue0NhbGxiYWNrIGZ1bmN0aW9uc1xsYWJlbHtjdHlwZXMtY2FsbGJhY2stZnVuY3Rpb25zfX0KKworXGNvZGV7Y3R5cGVzfSBhbGxvd3MgdG8gY3JlYXRlIEMgY2FsbGFibGUgZnVuY3Rpb24gcG9pbnRlcnMgZnJvbSBQeXRob24KK2NhbGxhYmxlcy4gVGhlc2UgYXJlIHNvbWV0aW1lcyBjYWxsZWQgXGVtcGh7Y2FsbGJhY2sgZnVuY3Rpb25zfS4KKworRmlyc3QsIHlvdSBtdXN0IGNyZWF0ZSBhIGNsYXNzIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIHRoZSBjbGFzcwora25vd3MgdGhlIGNhbGxpbmcgY29udmVudGlvbiwgdGhlIHJldHVybiB0eXBlLCBhbmQgdGhlIG51bWJlciBhbmQKK3R5cGVzIG9mIGFyZ3VtZW50cyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVjZWl2ZS4KKworVGhlIENGVU5DVFlQRSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgdHlwZXMgZm9yIGNhbGxiYWNrIGZ1bmN0aW9ucwordXNpbmcgdGhlIG5vcm1hbCBjZGVjbCBjYWxsaW5nIGNvbnZlbnRpb24sIGFuZCwgb24gV2luZG93cywgdGhlCitXSU5GVU5DVFlQRSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgdHlwZXMgZm9yIGNhbGxiYWNrIGZ1bmN0aW9ucwordXNpbmcgdGhlIHN0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uLgorCitCb3RoIG9mIHRoZXNlIGZhY3RvcnkgZnVuY3Rpb25zIGFyZSBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0IHR5cGUgYXMKK2ZpcnN0IGFyZ3VtZW50LCBhbmQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBleHBlY3RlZCBhcmd1bWVudCB0eXBlcyBhcwordGhlIHJlbWFpbmluZyBhcmd1bWVudHMuCisKK0kgd2lsbCBwcmVzZW50IGFuIGV4YW1wbGUgaGVyZSB3aGljaCB1c2VzIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkncworXGZ1bmN0aW9ue3Fzb3J0fSBmdW5jdGlvbiwgdGhpcyBpcyB1c2VkIHRvIHNvcnQgaXRlbXMgd2l0aCB0aGUgaGVscCBvZiBhCitjYWxsYmFjayBmdW5jdGlvbi4gXGZ1bmN0aW9ue3Fzb3J0fSB3aWxsIGJlIHVzZWQgdG8gc29ydCBhbiBhcnJheSBvZgoraW50ZWdlcnM6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gSW50QXJyYXk1ID0gY19pbnQgKiA1Cis+Pj4gaWEgPSBJbnRBcnJheTUoNSwgMSwgNywgMzMsIDk5KQorPj4+IHFzb3J0ID0gbGliYy5xc29ydAorPj4+IHFzb3J0LnJlc3R5cGUgPSBOb25lCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1xmdW5jdGlvbntxc29ydH0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gc29ydCwgdGhlCitudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRhdGEgYXJyYXksIHRoZSBzaXplIG9mIG9uZSBpdGVtLCBhbmQgYSBwb2ludGVyCit0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiwgdGhlIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgd2lsbCB0aGVuIGJlCitjYWxsZWQgd2l0aCB0d28gcG9pbnRlcnMgdG8gaXRlbXMsIGFuZCBpdCBtdXN0IHJldHVybiBhIG5lZ2F0aXZlCitpbnRlZ2VyIGlmIHRoZSBmaXJzdCBpdGVtIGlzIHNtYWxsZXIgdGhhbiB0aGUgc2Vjb25kLCBhIHplcm8gaWYgdGhleQorYXJlIGVxdWFsLCBhbmQgYSBwb3NpdGl2ZSBpbnRlZ2VyIGVsc2UuCisKK1NvIG91ciBjYWxsYmFjayBmdW5jdGlvbiByZWNlaXZlcyBwb2ludGVycyB0byBpbnRlZ2VycywgYW5kIG11c3QKK3JldHVybiBhbiBpbnRlZ2VyLiBGaXJzdCB3ZSBjcmVhdGUgdGhlIFxjb2Rle3R5cGV9IGZvciB0aGUgY2FsbGJhY2sKK2Z1bmN0aW9uOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IENNUEZVTkMgPSBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoY19pbnQpLCBQT0lOVEVSKGNfaW50KSkKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworRm9yIHRoZSBmaXJzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIHdlIHNpbXBseSBwcmludAordGhlIGFyZ3VtZW50cyB3ZSBnZXQsIGFuZCByZXR1cm4gMCAoaW5jcmVtZW50YWwgZGV2ZWxvcG1lbnQgOy0pOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGRlZiBweV9jbXBfZnVuYyhhLCBiKToKKy4uLiAgICAgcHJpbnQgInB5X2NtcF9mdW5jIiwgYSwgYgorLi4uICAgICByZXR1cm4gMAorLi4uCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0NyZWF0ZSB0aGUgQyBjYWxsYWJsZSBjYWxsYmFjazoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBjbXBfZnVuYyA9IENNUEZVTkMocHlfY21wX2Z1bmMpCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0FuZCB3ZSdyZSByZWFkeSB0byBnbzoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBxc29ydChpYSwgbGVuKGlhKSwgc2l6ZW9mKGNfaW50KSwgY21wX2Z1bmMpICMgZG9jdGVzdDogK1dJTkRPV1MKK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KK3B5X2NtcF9mdW5jIDxjdHlwZXMuTFBfY19sb25nIG9iamVjdCBhdCAweDAwLi4uPiA8Y3R5cGVzLkxQX2NfbG9uZyBvYmplY3QgYXQgMHgwMC4uLj4KKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworV2Uga25vdyBob3cgdG8gYWNjZXNzIHRoZSBjb250ZW50cyBvZiBhIHBvaW50ZXIsIHNvIGxldHMgcmVkZWZpbmUgb3VyIGNhbGxiYWNrOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGRlZiBweV9jbXBfZnVuYyhhLCBiKToKKy4uLiAgICAgcHJpbnQgInB5X2NtcF9mdW5jIiwgYVswXSwgYlswXQorLi4uICAgICByZXR1cm4gMAorLi4uCis+Pj4gY21wX2Z1bmMgPSBDTVBGVU5DKHB5X2NtcF9mdW5jKQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitIZXJlIGlzIHdoYXQgd2UgZ2V0IG9uIFdpbmRvd3M6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcXNvcnQoaWEsIGxlbihpYSksIHNpemVvZihjX2ludCksIGNtcF9mdW5jKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCitweV9jbXBfZnVuYyA3IDEKK3B5X2NtcF9mdW5jIDMzIDEKK3B5X2NtcF9mdW5jIDk5IDEKK3B5X2NtcF9mdW5jIDUgMQorcHlfY21wX2Z1bmMgNyA1CitweV9jbXBfZnVuYyAzMyA1CitweV9jbXBfZnVuYyA5OSA1CitweV9jbXBfZnVuYyA3IDk5CitweV9jbXBfZnVuYyAzMyA5OQorcHlfY21wX2Z1bmMgNyAzMworPj4+CitcZW5ke3ZlcmJhdGltfQorCitJdCBpcyBmdW5ueSB0byBzZWUgdGhhdCBvbiBsaW51eCB0aGUgc29ydCBmdW5jdGlvbiBzZWVtcyB0byB3b3JrIG11Y2gKK21vcmUgZWZmaWNpZW50LCBpdCBpcyBkb2luZyBsZXNzIGNvbXBhcmlzb25zOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHFzb3J0KGlhLCBsZW4oaWEpLCBzaXplb2YoY19pbnQpLCBjbXBfZnVuYykgIyBkb2N0ZXN0OiArTElOVVgKK3B5X2NtcF9mdW5jIDUgMQorcHlfY21wX2Z1bmMgMzMgOTkKK3B5X2NtcF9mdW5jIDcgMzMKK3B5X2NtcF9mdW5jIDUgNworcHlfY21wX2Z1bmMgMSA3Cis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0FoLCB3ZSdyZSBuZWFybHkgZG9uZSEgVGhlIGxhc3Qgc3RlcCBpcyB0byBhY3R1YWxseSBjb21wYXJlIHRoZSB0d28KK2l0ZW1zIGFuZCByZXR1cm4gYSB1c2VmdWwgcmVzdWx0OgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGRlZiBweV9jbXBfZnVuYyhhLCBiKToKKy4uLiAgICAgcHJpbnQgInB5X2NtcF9mdW5jIiwgYVswXSwgYlswXQorLi4uICAgICByZXR1cm4gYVswXSAtIGJbMF0KKy4uLgorPj4+CitcZW5ke3ZlcmJhdGltfQorCitGaW5hbCBydW4gb24gV2luZG93czoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBxc29ydChpYSwgbGVuKGlhKSwgc2l6ZW9mKGNfaW50KSwgQ01QRlVOQyhweV9jbXBfZnVuYykpICMgZG9jdGVzdDogK1dJTkRPV1MKK3B5X2NtcF9mdW5jIDMzIDcKK3B5X2NtcF9mdW5jIDk5IDMzCitweV9jbXBfZnVuYyA1IDk5CitweV9jbXBfZnVuYyAxIDk5CitweV9jbXBfZnVuYyAzMyA3CitweV9jbXBfZnVuYyAxIDMzCitweV9jbXBfZnVuYyA1IDMzCitweV9jbXBfZnVuYyA1IDcKK3B5X2NtcF9mdW5jIDEgNworcHlfY21wX2Z1bmMgNSAxCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK2FuZCBvbiBMaW51eDoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBxc29ydChpYSwgbGVuKGlhKSwgc2l6ZW9mKGNfaW50KSwgQ01QRlVOQyhweV9jbXBfZnVuYykpICMgZG9jdGVzdDogK0xJTlVYCitweV9jbXBfZnVuYyA1IDEKK3B5X2NtcF9mdW5jIDMzIDk5CitweV9jbXBfZnVuYyA3IDMzCitweV9jbXBfZnVuYyAxIDcKK3B5X2NtcF9mdW5jIDUgNworPj4+CitcZW5ke3ZlcmJhdGltfQorCitTbywgb3VyIGFycmF5IHNvcnRlZCBub3c6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZm9yIGkgaW4gaWE6IHByaW50IGksCisuLi4KKzEgNSA3IDMzIDk5Cis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1x0ZXh0YmZ7SW1wb3J0YW50IG5vdGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uczp9CisKK01ha2Ugc3VyZSB5b3Uga2VlcCByZWZlcmVuY2VzIHRvIENGVU5DVFlQRSBvYmplY3RzIGFzIGxvbmcgYXMgdGhleSBhcmUKK3VzZWQgZnJvbSBDIGNvZGUuIGN0eXBlcyBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZQorZ2FyYmFnZSBjb2xsZWN0ZWQsIGNyYXNoaW5nIHlvdXIgcHJvZ3JhbSB3aGVuIGEgY2FsbGJhY2sgaXMgbWFkZS4KKworCitcc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgdmFsdWVzIGV4cG9ydGVkIGZyb20gZGxsc1xsYWJlbHtjdHlwZXMtYWNjZXNzaW5nLXZhbHVlcy1leHBvcnRlZC1mcm9tLWRsbHN9fQorCitTb21ldGltZXMsIGEgZGxsIG5vdCBvbmx5IGV4cG9ydHMgZnVuY3Rpb25zLCBpdCBhbHNvIGV4cG9ydHMKK3ZhbHVlcy4gQW4gZXhhbXBsZSBpbiB0aGUgUHl0aG9uIGxpYnJhcnkgaXRzZWxmIGlzIHRoZQorXGNvZGV7UHl7XF99T3B0aW1pemVGbGFnfSwgYW4gaW50ZWdlciBzZXQgdG8gMCwgMSwgb3IgMiwgZGVwZW5kaW5nIG9uIHRoZQorXHByb2dyYW1vcHR7LU99IG9yIFxwcm9ncmFtb3B0ey1PT30gZmxhZyBnaXZlbiBvbiBzdGFydHVwLgorCitcY29kZXtjdHlwZXN9IGNhbiBhY2Nlc3MgdmFsdWVzIGxpa2UgdGhpcyB3aXRoIHRoZSBcbWV0aG9ke2lue1xffWRsbH0gY2xhc3MKK21ldGhvZHMgb2YgdGhlIHR5cGUuICBcdmFye3B5dGhvbmFwaX0g7HMgYSBwcmVkZWZpbmVkIHN5bWJvbCBnaXZpbmcKK2FjY2VzcyB0byB0aGUgUHl0aG9uIEMgYXBpOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IG9wdF9mbGFnID0gY19pbnQuaW5fZGxsKHB5dGhvbmFwaSwgIlB5X09wdGltaXplRmxhZyIpCis+Pj4gcHJpbnQgb3B0X2ZsYWcKK2NfbG9uZygwKQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitJZiB0aGUgaW50ZXJwcmV0ZXIgd291bGQgaGF2ZSBiZWVuIHN0YXJ0ZWQgd2l0aCBccHJvZ3JhbW9wdHstT30sIHRoZSBzYW1wbGUKK3dvdWxkIGhhdmUgcHJpbnRlZCBcY29kZXtje1xffWxvbmcoMSl9LCBvciBcY29kZXtje1xffWxvbmcoMil9IGlmIFxwcm9ncmFtb3B0ey1PT30gd291bGQgaGF2ZQorYmVlbiBzcGVjaWZpZWQuCisKK0FuIGV4dGVuZGVkIGV4YW1wbGUgd2hpY2ggYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBwb2ludGVycworYWNjZXNzZXMgdGhlIFxjb2Rle1B5SW1wb3J0e1xffUZyb3plbk1vZHVsZXN9IHBvaW50ZXIgZXhwb3J0ZWQgYnkgUHl0aG9uLgorCitRdW90aW5nIHRoZSBQeXRob24gZG9jczogXGVtcGh7VGhpcyBwb2ludGVyIGlzIGluaXRpYWxpemVkIHRvIHBvaW50IHRvIGFuCithcnJheSBvZiBgYHN0cnVjdCB7XF99ZnJvemVuYGAgcmVjb3JkcywgdGVybWluYXRlZCBieSBvbmUgd2hvc2UgbWVtYmVycworYXJlIGFsbCBOVUxMIG9yIHplcm8uIFdoZW4gYSBmcm96ZW4gbW9kdWxlIGlzIGltcG9ydGVkLCBpdCBpcyBzZWFyY2hlZAoraW4gdGhpcyB0YWJsZS4gVGhpcmQtcGFydHkgY29kZSBjb3VsZCBwbGF5IHRyaWNrcyB3aXRoIHRoaXMgdG8gcHJvdmlkZQorYSBkeW5hbWljYWxseSBjcmVhdGVkIGNvbGxlY3Rpb24gb2YgZnJvemVuIG1vZHVsZXMufQorCitTbyBtYW5pcHVsYXRpbmcgdGhpcyBwb2ludGVyIGNvdWxkIGV2ZW4gcHJvdmUgdXNlZnVsLiBUbyByZXN0cmljdCB0aGUKK2V4YW1wbGUgc2l6ZSwgd2Ugc2hvdyBvbmx5IGhvdyB0aGlzIHRhYmxlIGNhbiBiZSByZWFkIHdpdGgKK1xjb2Rle2N0eXBlc306CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKKz4+PgorPj4+IGNsYXNzIHN0cnVjdF9mcm96ZW4oU3RydWN0dXJlKToKKy4uLiAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyX3ApLAorLi4uICAgICAgICAgICAgICAgICAoImNvZGUiLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKy4uLiAgICAgICAgICAgICAgICAgKCJzaXplIiwgY19pbnQpXQorLi4uCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1dlIGhhdmUgZGVmaW5lZCB0aGUgXGNvZGV7c3RydWN0IHtcX31mcm96ZW59IGRhdGEgdHlwZSwgc28gd2UgY2FuIGdldCB0aGUKK3BvaW50ZXIgdG8gdGhlIHRhYmxlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IEZyb3plblRhYmxlID0gUE9JTlRFUihzdHJ1Y3RfZnJvemVuKQorPj4+IHRhYmxlID0gRnJvemVuVGFibGUuaW5fZGxsKHB5dGhvbmFwaSwgIlB5SW1wb3J0X0Zyb3plbk1vZHVsZXMiKQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitTaW5jZSBcY29kZXt0YWJsZX0gaXMgYSBcY29kZXtwb2ludGVyfSB0byB0aGUgYXJyYXkgb2YgXGNvZGV7c3RydWN0e1xffWZyb3plbn0KK3JlY29yZHMsIHdlIGNhbiBpdGVyYXRlIG92ZXIgaXQsIGJ1dCB3ZSBqdXN0IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQKK291ciBsb29wIHRlcm1pbmF0ZXMsIGJlY2F1c2UgcG9pbnRlcnMgaGF2ZSBubyBzaXplLiBTb29uZXIgb3IgbGF0ZXIgaXQKK3dvdWxkIHByb2JhYmx5IGNyYXNoIHdpdGggYW4gYWNjZXNzIHZpb2xhdGlvbiBvciB3aGF0ZXZlciwgc28gaXQncworYmV0dGVyIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHdlIGhpdCB0aGUgTlVMTCBlbnRyeToKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBmb3IgaXRlbSBpbiB0YWJsZToKKy4uLiAgICBwcmludCBpdGVtLm5hbWUsIGl0ZW0uc2l6ZQorLi4uICAgIGlmIGl0ZW0ubmFtZSBpcyBOb25lOgorLi4uICAgICAgICBicmVhaworLi4uCitfX2hlbGxvX18gMTA0CitfX3BoZWxsb19fIC0xMDQKK19fcGhlbGxvX18uc3BhbSAxMDQKK05vbmUgMAorPj4+CitcZW5ke3ZlcmJhdGltfQorCitUaGUgZmFjdCB0aGF0IHN0YW5kYXJkIFB5dGhvbiBoYXMgYSBmcm96ZW4gbW9kdWxlIGFuZCBhIGZyb3plbiBwYWNrYWdlCisoaW5kaWNhdGVkIGJ5IHRoZSBuZWdhdGl2ZSBzaXplIG1lbWJlcikgaXMgbm90IHdlbGxrbm93biwgaXQgaXMgb25seQordXNlZCBmb3IgdGVzdGluZy4gVHJ5IGl0IG91dCB3aXRoIFxjb2Rle2ltcG9ydCB7XF99e1xffWhlbGxve1xffXtcX319IGZvciBleGFtcGxlLgorCitYWFggRGVzY3JpYmUgaG93IHRvIGFjY2VzcyB0aGUgXHZhcntjb2RlfSBtZW1iZXIgZmllbGRzLCB3aGljaCBjb250YWluCit0aGUgYnl0ZSBjb2RlIGZvciB0aGUgbW9kdWxlcy4KKworCitcc3Vic3Vic2VjdGlvbntTdXJwcmlzZXNcbGFiZWx7Y3R5cGVzLXN1cnByaXNlc319CisKK1RoZXJlIGFyZSBzb21lIGVkZ2VzIGluIFxjb2Rle2N0eXBlc30gd2hlcmUgeW91IG1heSBiZSBleHBlY3Qgc29tZXRoaW5nCitlbHNlIHRoYW4gd2hhdCBhY3R1YWxseSBoYXBwZW5zLgorCitDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKKz4+PiBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorLi4uICAgICBfZmllbGRzXyA9ICgieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpCisuLi4KKz4+PiBjbGFzcyBSRUNUKFN0cnVjdHVyZSk6CisuLi4gICAgIF9maWVsZHNfID0gKCJhIiwgUE9JTlQpLCAoImIiLCBQT0lOVCkKKy4uLgorPj4+IHAxID0gUE9JTlQoMSwgMikKKz4+PiBwMiA9IFBPSU5UKDMsIDQpCis+Pj4gcmMgPSBSRUNUKHAxLCBwMikKKz4+PiBwcmludCByYy5hLngsIHJjLmEueSwgcmMuYi54LCByYy5iLnkKKzEgMiAzIDQKKz4+PiAjIG5vdyBzd2FwIHRoZSB0d28gcG9pbnRzCis+Pj4gcmMuYSwgcmMuYiA9IHJjLmIsIHJjLmEKKz4+PiBwcmludCByYy5hLngsIHJjLmEueSwgcmMuYi54LCByYy5iLnkKKzMgNCAzIDQKK1xlbmR7dmVyYmF0aW19CisKK0htLiBXZSBjZXJ0YWlubHkgZXhwZWN0ZWQgdGhlIGxhc3Qgc3RhdGVtZW50IHRvIHByaW50IFxjb2RlezMgNCAxIDJ9LgorV2hhdCBoYXBwZW5kZWQ/IEhlcmUgYXJlIHRoZSBzdGVwcyBvZiB0aGUgXGNvZGV7cmMuYSwgcmMuYiA9IHJjLmIsIHJjLmF9CitsaW5lIGFib3ZlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHRlbXAwLCB0ZW1wMSA9IHJjLmIsIHJjLmEKKz4+PiByYy5hID0gdGVtcDAKKz4+PiByYy5iID0gdGVtcDEKK1xlbmR7dmVyYmF0aW19CisKK05vdGUgdGhhdCBcY29kZXt0ZW1wMH0gYW5kIFxjb2Rle3RlbXAxfSBhcmUgb2JqZWN0cyBzdGlsbCB1c2luZyB0aGUgaW50ZXJuYWwKK2J1ZmZlciBvZiB0aGUgXGNvZGV7cmN9IG9iamVjdCBhYm92ZS4gU28gZXhlY3V0aW5nIFxjb2Rle3JjLmEgPSB0ZW1wMH0KK2NvcGllcyB0aGUgYnVmZmVyIGNvbnRlbnRzIG9mIFxjb2Rle3RlbXAwfSBpbnRvIFxjb2Rle3JjfSAncyBidWZmZXIuICBUaGlzLAoraW4gdHVybiwgY2hhbmdlcyB0aGUgY29udGVudHMgb2YgXGNvZGV7dGVtcDF9LiBTbywgdGhlIGxhc3QgYXNzaWdubWVudAorXGNvZGV7cmMuYiA9IHRlbXAxfSwgZG9lc24ndCBoYXZlIHRoZSBleHBlY3RlZCBlZmZlY3QuCisKK0tlZXAgaW4gbWluZCB0aGF0IHJldHJpZXZpbmcgc3Vib2JqZWN0cyBmcm9tIFN0cnVjdHVyZSwgVW5pb25zLCBhbmQKK0FycmF5cyBkb2Vzbid0IFxlbXBoe2NvcHl9IHRoZSBzdWJvYmplY3QsIGluc3RlYWQgaXQgcmV0cmlldmVzIGEgd3JhcHBlcgorb2JqZWN0IGFjY2Vzc2luZyB0aGUgcm9vdC1vYmplY3QncyB1bmRlcmx5aW5nIGJ1ZmZlci4KKworQW5vdGhlciBleGFtcGxlIHRoYXQgbWF5IGJlaGF2ZSBkaWZmZXJlbnQgZnJvbSB3aGF0IG9uZSB3b3VsZCBleHBlY3QgaXMgdGhpczoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBzID0gY19jaGFyX3AoKQorPj4+IHMudmFsdWUgPSAiYWJjIGRlZiBnaGkiCis+Pj4gcy52YWx1ZQorJ2FiYyBkZWYgZ2hpJworPj4+IHMudmFsdWUgaXMgcy52YWx1ZQorRmFsc2UKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworV2h5IGlzIGl0IHByaW50aW5nIFxjb2Rle0ZhbHNlfT8gIGN0eXBlcyBpbnN0YW5jZXMgYXJlIG9iamVjdHMgY29udGFpbmluZworYSBtZW1vcnkgYmxvY2sgcGx1cyBzb21lIGRlc2NyaXB0b3JzIGFjY2Vzc2luZyB0aGUgY29udGVudHMgb2YgdGhlCittZW1vcnkuICBTdG9yaW5nIGEgUHl0aG9uIG9iamVjdCBpbiB0aGUgbWVtb3J5IGJsb2NrIGRvZXMgbm90IHN0b3JlCit0aGUgb2JqZWN0IGl0c2VsZiwgaW5zdGVhZCB0aGUgXGNvZGV7Y29udGVudHN9IG9mIHRoZSBvYmplY3QgaXMgc3RvcmVkLgorQWNjZXNzaW5nIHRoZSBjb250ZW50cyBhZ2FpbiBjb25zdHJ1Y3RzIGEgbmV3IFB5dGhvbiBlYWNoIHRpbWUhCisKKworXHN1YnN1YnNlY3Rpb257QnVncywgVG9EbyBhbmQgbm9uLWltcGxlbWVudGVkIHRoaW5nc1xsYWJlbHtjdHlwZXMtYnVncy10b2RvLW5vbi1pbXBsZW1lbnRlZC10aGluZ3N9fQorCitFbnVtZXJhdGlvbiB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkLiBZb3UgY2FuIGRvIGl0IGVhc2lseSB5b3Vyc2VsZiwKK3VzaW5nIFxjbGFzc3tje1xffWludH0gYXMgdGhlIGJhc2UgY2xhc3MuCisKK1xjb2Rle2xvbmcgZG91YmxlfSBpcyBub3QgaW1wbGVtZW50ZWQuCislIExvY2FsIFZhcmlhYmxlczoKKyUgY29tcGlsZS1jb21tYW5kOiAibWFrZS5iYXQiCislIEVuZDogCisKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY3R5cGVzcmVmLnRleCBiL0RvYy9saWIvbGliY3R5cGVzcmVmLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk1MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9saWJjdHlwZXNyZWYudGV4CkBAIC0wLDAgKzEsNDU3IEBACitcc3Vic2VjdGlvbntjdHlwZXMgcmVmZXJlbmNlXGxhYmVse2N0eXBlcy1yZWZlcmVuY2V9fQorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIGZ1bmN0aW9ucworXHN1YnN1YnNlY3Rpb257Y3R5cGVzIGZ1bmN0aW9uc30KKworXGJlZ2lue2Z1bmNkZXNjfXthZGRyZXNzb2Z9e29ian0KK1JldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgaW50ZWdlci4gIFx2YXJ7b2JqfSBtdXN0CitiZSBhbiBpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthbGlnbm1lbnR9e29ial9vcl90eXBlfQorUmV0dXJucyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIGN0eXBlcyB0eXBlLgorXHZhcntvYmpfb3JfdHlwZX0gbXVzdCBiZSBhIGN0eXBlcyB0eXBlIG9yIGFuIGluc3RhbmNlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2V4Y2NsYXNzZGVzY317QXJndW1lbnRFcnJvcn17fQorVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwgY2Fubm90IGNvbnZlcnQKK29uZSBvZiB0aGUgcGFzc2VkIGFyZ3VtZW50cy4KK1xlbmR7ZXhjY2xhc3NkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2J5cmVmfXtvYmp9CitSZXR1cm5zIGEgbGlnaHQtd2VpZ2h0IHBvaW50ZXIgdG8gXHZhcntvYmp9LCB3aGljaCBtdXN0IGJlIGFuIGluc3RhbmNlCitvZiBhIGN0eXBlcyB0eXBlLiAgVGhlIHJldHVybmVkIG9iamVjdCBjYW4gb25seSBiZSB1c2VkIGFzIGEgZm9yZWlnbgorZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuICBJdCBiZWhhdmVzIHNpbWlsYXIgdG8gXGNvZGV7cG9pbnRlcihvYmopfSwKK2J1dCB0aGUgY29uc3RydWN0aW9uIGlzIGEgbG90IGZhc3Rlci4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317Y2FzdH17b2JqLCB0eXBlfQorVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBjYXN0IG9wZXJhdG9yIGluIEMuICBJdCByZXR1cm5zIGEgbmV3CitpbnN0YW5jZSBvZiBcdmFye3R5cGV9IHdoaWNoIHBvaW50cyB0byB0aGUgc2FtZSBtZW1vcnkgYmxvY2sgYXMKK1xjb2Rle29ian0uICBcY29kZXt0eXBlfSBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBhbmQgXGNvZGV7b2JqfQorIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGEgcG9pbnRlci4KK1xlbmR7ZnVuY2Rlc2N9CisKKyUgWFhYIHNlcGFyYXRlIHNlY3Rpb24gZm9yIENGVU5DVFlQRSwgV0lORlVOQ1RZUEUsIFBZRlVOQ1RZUEU/CisKK1xiZWdpbntmdW5jZGVzY317Q0ZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9CitUaGlzIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiBwcm90b3R5cGUuICBUaGUKK2Z1bmN0aW9uIHByb3RvdHlwZSBkZXNjcmliZXMgYSBmdW5jdGlvbiB0aGF0IGhhcyBhIHJlc3VsdCB0eXBlIG9mCitcY29kZXtyZXN0eXBlfSwgYW5kIGFjY2VwdHMgYXJndW1lbnRzIGFzIHNwZWNpZmllZCBieSBcY29kZXthcmd0eXBlc30uCitUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBzZXZlcmFsIGtpbmRzIG9mCitmdW5jdGlvbnMsIGRlcGVuZGluZyBvbiBob3cgdGhlIHByb3RvdHlwZSBpcyBjYWxsZWQuCisKK1RoZSBwcm90b3R5cGVzIHJldHVybmVkIGJ5IFxjb2Rle0NGVU5DVFlQRX0gb3IgXGNvZGV7UFlGVU5DVFlQRX0KK2NyZWF0ZSBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIHN0YW5kYXJkIEMgY2FsbGluZyBjb252ZW50aW9uLAorcHJvdG90eXBlcyByZXR1cm5lZCBmcm9tIFxjb2Rle1dJTkZVTkNUWVBFfSAob24gV2luZG93cykgdXNlIHRoZQorXGNvZGV7X19zdGRjYWxsfSBjYWxsaW5nIGNvbnZlbnRpb24uCisKK0Z1bmN0aW9ucyBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIFxjb2Rle0NGVU5DVFlQRX0gYW5kCitcY29kZXtXSU5GVU5DVFlQRX0gcHJvdG90eXBlcyByZWxlYXNlIHRoZSBQeXRob24gR0lMCitiZWZvcmUgZW50ZXJpbmcgdGhlIGZvcmVpZ24gZnVuY3Rpb24sIGFuZCBhY3F1aXJlIGl0IGJhY2sgYWZ0ZXIKK2xlYXZpbmcgdGhlIGZ1bmN0aW9uIGNvZGUuCisKKyUgWFhYIGRpZmZlcmVuY2VzIGJldHdlZW4gQ0ZVTkNUWVBFIC8gV0lORlVOQ1RZUEUgLyBQWUZVTkNUWVBFCisKK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317Y3JlYXRlX3N0cmluZ19idWZmZXJ9e2luaXRfb3Jfc2l6ZVxvcHRpb25hbHssIHNpemV9fQorVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbXV0YWJsZSBjaGFyYWN0ZXIgYnVmZmVyLiAgVGhlIHJldHVybmVkIG9iamVjdAoraXMgYSBjdHlwZXMgYXJyYXkgb2YgXGNvZGV7Y19jaGFyfS4KKworXHZhcntpbml0X29yX3NpemV9IG11c3QgYmUgYW4gaW50ZWdlciB3aGljaCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlCithcnJheSwgb3IgYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5IGl0ZW1zLgorCitJZiBhIHN0cmluZyBpcyBzcGVjaWZpZWQgYXMgZmlyc3QgYXJndW1lbnQsIHRoZSBidWZmZXIgaXMgbWFkZSBvbmUKK2l0ZW0gbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBpbgordGhlIGFycmF5IGlzIGEgTlVMIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIEFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCBhcworc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBhcnJheSBpZiB0aGUKK2xlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KKworSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHVuaWNvZGUgc3RyaW5nLCBpdCBpcyBjb252ZXJ0ZWQgaW50byBhbgorOC1iaXQgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317Y3JlYXRlX3VuaWNvZGVfYnVmZmVyfXtpbml0X29yX3NpemVcb3B0aW9uYWx7LCBzaXplfX0KK1RoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG11dGFibGUgdW5pY29kZSBjaGFyYWN0ZXIgYnVmZmVyLiAgVGhlCityZXR1cm5lZCBvYmplY3QgaXMgYSBjdHlwZXMgYXJyYXkgb2YgXGNvZGV7Y193Y2hhcn0uCisKK1x2YXJ7aW5pdF9vcl9zaXplfSBtdXN0IGJlIGFuIGludGVnZXIgd2hpY2ggc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZQorYXJyYXksIG9yIGEgdW5pY29kZSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5CitpdGVtcy4KKworSWYgYSB1bmljb2RlIHN0cmluZyBpcyBzcGVjaWZpZWQgYXMgZmlyc3QgYXJndW1lbnQsIHRoZSBidWZmZXIgaXMgbWFkZQorb25lIGl0ZW0gbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdGhlIGxhc3QgZWxlbWVudAoraW4gdGhlIGFycmF5IGlzIGEgTlVMIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIEFuIGludGVnZXIgY2FuIGJlIHBhc3NlZAorYXMgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBhcnJheSBpZgordGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KKworSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIDgtYml0IHN0cmluZywgaXQgaXMgY29udmVydGVkIGludG8gYW4KK3VuaWNvZGUgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317RGxsQ2FuVW5sb2FkTm93fXt9CitXaW5kb3dzIG9ubHk6IFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIHdoaWNoIGFsbG93cyB0byBpbXBsZW1lbnQKK2lucHJvY2VzcyBDT00gc2VydmVycyB3aXRoIGN0eXBlcy4gIEl0IGlzIGNhbGxlZCBmcm9tIHRoZQorXGNvZGV7RGxsQ2FuVW5sb2FkTm93fSBmdW5jdGlvbiB0aGF0IHRoZSBcY29kZXtfY3R5cGVzfQorZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtEbGxHZXRDbGFzc09iamVjdH17fQorV2luZG93cyBvbmx5OiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayB3aGljaCBhbGxvd3MgdG8gaW1wbGVtZW50CitpbnByb2Nlc3MgQ09NIHNlcnZlcnMgd2l0aCBjdHlwZXMuICBJdCBpcyBjYWxsZWQgZnJvbSB0aGUKK1xjb2Rle0RsbEdldENsYXNzT2JqZWN0fSBmdW5jdGlvbiB0aGF0IHRoZSBcY29kZXtfY3R5cGVzfQorZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtGb3JtYXRFcnJvcn17XG9wdGlvbmFse2NvZGV9fQorV2luZG93cyBvbmx5OiBSZXR1cm5zIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gIElmIG5vCitlcnJvciBjb2RlIGlzIHNwZWNpZmllZCwgdGhlIGxhc3QgZXJyb3IgY29kZSBpcyB1c2VkIGJ5IGNhbGxpbmcgdGhlCitXaW5kb3dzIGFwaSBmdW5jdGlvbiBcY29kZXtHZXRMYXN0RXJyb3J9LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtHZXRMYXN0RXJyb3J9e30KK1dpbmRvd3Mgb25seTogUmV0dXJucyB0aGUgbGFzdCBlcnJvciBjb2RlIHNldCBieSBXaW5kb3dzIGluIHRoZQorY2FsbGluZyB0aHJlYWQuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e21lbW1vdmV9e2RzdCwgc3JjLCBjb3VudH0KK1NhbWUgYXMgdGhlIHN0YW5kYXJkIEMgXGNvZGV7bWVtbW92ZX0gbGlicmFyeSBmdW5jdGlvbjogY29waWVzCitcdmFye2NvdW50fSBieXRlcyBmcm9tIFxjb2Rle3NyY30gdG8gXGNvZGV7ZHN0fS4gIFxjb2Rle2RzdH0gYW5kCitcY29kZXtzcmN9IG11c3QgYmUgaW50ZWdlcnMgb3IgY3R5cGVzIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlcnMuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e21lbXNldH17ZHN0LCBjLCBjb3VudH0KK1NhbWUgYXMgdGhlIHN0YW5kYXJkIEMgXGNvZGV7bWVtc2V0fSBsaWJyYXJ5IGZ1bmN0aW9uOiBmaWxscyB0aGUKK21lbW9yeSBjbG9jayBhdCBhZGRyZXNzIFxjb2Rle2RzdH0gd2l0aCBcdmFye2NvdW50fSBieXRlcyBvZiB2YWx1ZQorXHZhcntjfS4gIFx2YXJ7ZHN0fSBtdXN0IGJlIGFuIGludGVnZXIgc3BlY2lmeWluZyBhbiBhZGRyZXNzLCBvciBhIGN0eXBlcyBpbnN0YW5jZS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317UE9JTlRFUn17dHlwZX0KK1RoaXMgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGN0eXBlcyBwb2ludGVyIHR5cGUuCitQb2ludGVyIHR5cGVzIGFyZSBjYWNoZWQgYW4gcmV1c2VkIGludGVybmFsbHksIHNvIGNhbGxpbmcgdGhpcworZnVuY3Rpb24gcmVwZWF0ZWRseSBpcyBjaGVhcC4gIFx2YXJ7dHlwZX0gbXVzdCBiZSBhIGN0eXBlcyB0eXBlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtwb2ludGVyfXtvYmp9CitUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgcG9pbnRlciBpbnN0YW5jZSwgcG9pbnRpbmcgdG8gXHZhcntvYmp9LgorVGhlIHJldHVybmVkIG9iamVjdCBpcyBvZiB0aGUgdHlwZSBcY29kZXtQT0lOVEVSKHR5cGUob2JqKSl9LgorCitOb3RlOiBJZiB5b3UganVzdCB3YW50IHRvIHBhc3MgYSBwb2ludGVyIHRvIGFuIG9iamVjdCB0byBhIGZvcmVpZ24KK2Z1bmN0aW9uIGNhbGwsIHlvdSBzaG91bGQgdXNlIFxjb2Rle2J5cmVmKG9iail9IHdoaWNoIGlzIG11Y2ggZmFzdGVyLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtQWUZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3B5dGhvbmFwaX17fQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtyZXNpemV9e29iaiwgc2l6ZX0KK1RoaXMgZnVuY3Rpb24gcmVzaXplcyB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlciBvZiBcdmFye29ian0sIHdoaWNoCittdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgY3R5cGVzIHR5cGUuICBJdCBpcyBub3QgcG9zc2libGUgdG8gbWFrZSB0aGUKK2J1ZmZlciBzbWFsbGVyIHRoYW4gdGhlIG5hdGl2ZSBzaXplIG9mIHRoZSBvYmplY3RzIHR5cGUsIGFzIGdpdmVuIGJ5CitcY29kZXtzaXplb2YodHlwZShvYmopKX0sIGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBlbmxhcmdlIHRoZSBidWZmZXIuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3NldF9jb252ZXJzaW9uX21vZGV9e2VuY29kaW5nLCBlcnJvcnN9CitUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHJ1bGVzIHRoYXQgY3R5cGVzIG9iamVjdHMgdXNlIHdoZW4gY29udmVydGluZworYmV0d2VlbiA4LWJpdCBzdHJpbmdzIGFuZCB1bmljb2RlIHN0cmluZ3MuICBcdmFye2VuY29kaW5nfSBtdXN0IGJlIGEKK3N0cmluZyBzcGVjaWZ5aW5nIGFuIGVuY29kaW5nLCBsaWtlICd1dGYtOCcgb3IgJ21iY3MnLCBcdmFye2Vycm9yc30KK211c3QgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcgb24gZW5jb2RpbmcvZGVjb2RpbmcKK2Vycm9ycy4gIEV4YW1wbGVzIG9mIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBzdHJpY3QnJywgYGByZXBsYWNlJycsIG9yCitgYGlnbm9yZScnLgorCitcY29kZXtzZXRfY29udmVyc2lvbl9tb2RlfSByZXR1cm5zIGEgMi10dXBsZSBjb250YWluaW5nIHRoZSBwcmV2aW91cworY29udmVyc2lvbiBydWxlcy4gIE9uIHdpbmRvd3MsIHRoZSBpbml0aWFsIGNvbnZlcnNpb24gcnVsZXMgYXJlCitcY29kZXsoJ21iY3MnLCAnaWdub3JlJyl9LCBvbiBvdGhlciBzeXN0ZW1zIFxjb2RleygnYXNjaWknLCAnc3RyaWN0Jyl9LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtzaXplb2Z9e29ial9vcl90eXBlfQorUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIGN0eXBlcyB0eXBlIG9yIGluc3RhbmNlIG1lbW9yeSBidWZmZXIuCitEb2VzIHRoZSBzYW1lIGFzIHRoZSBDIHNpemVvZigpIGZ1bmN0aW9uLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtzdHJpbmdfYXR9e2FkZHJlc3Ncb3B0aW9uYWx7c2l6ZX19CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN0cmluZyBzdGFydGluZyBhdCBtZW1vcnkgYWRkcmVzcworXHZhcnthZGRyZXNzfS4gIElmIFx2YXJ7c2l6ZX0gaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHNpemUsCitvdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIHplcm8tdGVybWluYXRlZC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317V2luRXJyb3J9e2NvZGU9Tm9uZSwgZGVzY3I9Tm9uZX0KK1dpbmRvd3Mgb25seTogdGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSB0aGUgd29yc3QtbmFtZWQgdGhpbmcgaW4KK2N0eXBlcy4gIEl0IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7V2luZG93c0Vycm9yfS4gIElmIFx2YXJ7Y29kZX0KK2lzIG5vdCBzcGVjaWZpZWQsIFxjb2Rle0dldExhc3RFcnJvcn0gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgZXJyb3IKK2NvZGUuICBJZiBcdmFye2Rlc2NyfSBpcyBub3Qgc3BjaWZpZWQsIFx2YXJ7Rm9ybWF0RXJyb3J9IGlzIGNhbGxlZCB0bworZ2V0IGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1dJTkZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3dzdHJpbmdfYXR9e2FkZHJlc3N9CitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdpZGUgY2hhcmFjdGVyIHN0cmluZyBzdGFydGluZyBhdCBtZW1vcnkKK2FkZHJlc3MgXHZhcnthZGRyZXNzfSBhcyB1bmljb2RlIHN0cmluZy4gIElmIFx2YXJ7c2l6ZX0gaXMgc3BlY2lmaWVkLAoraXQgaXMgdXNlZCBhcyBzaXplLCBvdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlCit6ZXJvLXRlcm1pbmF0ZWQuCitcZW5ke2Z1bmNkZXNjfQorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIGRhdGEgdHlwZXMKK1xzdWJzdWJzZWN0aW9ue2RhdGEgdHlwZXN9CisKK2N0eXBlcyBkZWZpbmVzIGEgbG90IG9mIEMgY29tcGF0aWJsZSBkYXRhdHlwZXMsIGFuZCBhbHNvIGFsbG93cyB0bworZGVmaW5lIHlvdXIgb3duIHR5cGVzLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCBhIGN0eXBlcyB0eXBlIGluc3RhbmNlCitob2xkcyBhIG1lbW9yeSBibG9jayB0aGF0IGNvbnRhaW5zIEMgY29tcGF0aWJsZSBkYXRhLgorCitcYmVnaW57Y2xhc3NkZXNjfXtfY3R5cGVzLl9DRGF0YX17fQorVGhpcyBub24tcHVibGljIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBjdHlwZXMgZGF0YSB0eXBlcy4gIEl0CitpcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24gbWV0aG9kcyBvZiB0aGUgY3R5cGVzCitkYXRhIHR5cGVzLgorXGVuZHtjbGFzc2Rlc2N9CisKK0NvbW1vbiBtZXRob2RzIG9mIGN0eXBlcyBkYXRhIHR5cGVzLCB0aGVzZSBhcmUgYWxsIGNsYXNzIG1ldGhvZHMgKHRvCitiZSBleGFjdCwgdGhleSBhcmUgbWV0aG9kcyBvZiB0aGUgbWV0YWNsYXNzKToKKworXGJlZ2lue21ldGhvZGRlc2N9e2Zyb21fYWRkcmVzc317YWRkcmVzc30KK1RoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSB1c2luZyB0aGUgbWVtb3J5IHNwZWNpZmllZAorYnkgXGNvZGV7YWRkcmVzc30uIAorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZnJvbV9wYXJhbX17b2JqfQorVGhpcyBtZXRob2QgYWRhcHRzIFxjb2Rle29ian0gdG8gYSBjdHlwZXMgdHlwZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2luX2RsbH17bmFtZSwgbGlicmFyeX0KK1RoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSBleHBvcnRlZCBieSBhIHNoYXJlZAorbGlicmFyeS4gIFx2YXJ7bmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IGV4cG9ydHMgdGhlIGRhdGEsCitcdmFye2xpYnJhcnl9IGlzIHRoZSBsb2FkZWQgc2hhcmVkIGxpYnJhcnkuCitcZW5ke21ldGhvZGRlc2N9CisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUgc2ltcGxlIGRhdGEgdHlwZXMKK1xzdWJzdWJzZWN0aW9ue3NpbXBsZSBkYXRhIHR5cGVzfQorCitcYmVnaW57Y2xhc3NkZXNjfXtfY3R5cGVzLl9TaW1wbGVDRGF0YX17fQorVGhpcyBub24tcHVibGljIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBjdHlwZXMgZGF0YSB0eXBlcy4gIEl0CitpcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24gYXR0cmlidXRlcyBvZiB0aGUKK2N0eXBlcyBkYXRhIHR5cGVzLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXt2YWx1ZX0KK1RoaXMgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGluc3RhbmNlLiAgRm9yIGludGVnZXIKK3R5cGVzLCBpdCBpcyBhbiBpbnRlZ2VyLgorXGVuZHttZW1iZXJkZXNjfQorCitIZXJlIGFyZSB0aGUgc2ltcGxlIGN0eXBlcyBkYXRhIHR5cGVzOgorCitcYmVnaW57Y2xhc3NkZXNjfXtjX2J5dGV9e1xvcHRpb25hbHt2YWx1ZX19CitSZXByZXNlbnRzIGEgQyBcY29kZXtzaWduZWQgY2hhcn0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZQorYXMgc21hbGwgaW50ZWdlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIKK2luaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfY2hhcn17XG9wdGlvbmFse3ZhbHVlfX0KK1JlcHJlc2VudHMgYSBDIFxjb2Rle2NoYXJ9IGRhdGF0eXBlLCBhbmQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMgYQorc2luZ2xlIGNoYXJhY3Rlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIHN0cmluZworaW5pdGlhbGl6ZXIsIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX2NoYXJfcH17XG9wdGlvbmFse3ZhbHVlfX0KK1JlcHJlc2VudHMgYSBDIFxjb2Rle2NoYXIgKn0gZGF0YXR5cGUsIHdoaWNoIG11c3QgYmUgYSBwb2ludGVyIHRvIGEKK3plcm8tdGVybWluYXRlZCBzdHJpbmcuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBpbnRlZ2VyIGFkZHJlc3MsCitvciBhIHN0cmluZy4KKyUgWFhYIEV4cGxhaW4gdGhlIGRpZmZlcmVuY2UgdG8gUE9JTlRFUihjX2NoYXIpCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2NsYXNzZGVzY317Y19kb3VibGV9e1xvcHRpb25hbHt2YWx1ZX19CitSZXByZXNlbnRzIGEgQyBcY29kZXtkb3VibGV9IGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfZmxvYXR9e1xvcHRpb25hbHt2YWx1ZX19CitSZXByZXNlbnRzIGEgQyBcY29kZXtkb3VibGV9IGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfaW50fXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgorb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gIE9uCitwbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBcdmFye2NfaW50fSBpcyBhbgorYWxpYXMgdG8gXHZhcntjX2xvbmd9LgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfaW50MTZ9e1xvcHRpb25hbHt2YWx1ZX19CitSZXByZXNlbnRzIGEgQyAxNi1iaXQgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCitmb3IgXHZhcntjX3Nob3J0fS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX2ludDMyfXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgMzItYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcworZm9yIFxjb2Rle2NfaW50fS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX2ludDY0fXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgNjQtYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcworZm9yIFxjb2Rle2NfbG9uZ2xvbmd9LgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfaW50OH17XG9wdGlvbmFse3ZhbHVlfX0KK1JlcHJlc2VudHMgYSBDIDgtYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IgXGNvZGV7Y19ieXRlfS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX2xvbmd9e1xvcHRpb25hbHt2YWx1ZX19CitSZXByZXNlbnRzIGEgQyBcY29kZXtzaWduZWQgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cworYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX2xvbmdsb25nfXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIGxvbmcgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IKK2FjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3Nob3J0fXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCithbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2Nfc2l6ZV90fXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7c2l6ZV90fSBkYXRhdHlwZS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3VieXRlfXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7dW5zaWduZWQgY2hhcn0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZQorYXMgc21hbGwgaW50ZWdlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIKK2luaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfdWludH17XG9wdGlvbmFse3ZhbHVlfX0KK1JlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cworYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gIE9uCitwbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBcdmFye2NfaW50fSBpcyBhbgorYWxpYXMgdG8gXHZhcntjX2xvbmd9LgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfdWludDE2fXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgMTYtYml0IFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCitmb3IgXGNvZGV7Y191c2hvcnR9LgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2NfdWludDMyfXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgMzItYml0IFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCitmb3IgXGNvZGV7Y191aW50fS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3VpbnQ2NH17XG9wdGlvbmFse3ZhbHVlfX0KK1JlcHJlc2VudHMgYSBDIDY0LWJpdCBcY29kZXt1bnNpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcworZm9yIFxjb2Rle2NfdWxvbmdsb25nfS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3VpbnQ4fXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgOC1iaXQgXGNvZGV7dW5zaWduZWQgaW50fSBkYXRhdHlwZS4gIFVzdWFsbHkgYW4gYWxpYXMKK2ZvciBcY29kZXtjX3VieXRlfS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3Vsb25nfXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7dW5zaWduZWQgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cworYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3Vsb25nbG9uZ317XG9wdGlvbmFse3ZhbHVlfX0KK1JlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIGxvbmcgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IKK2FjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3VzaG9ydH17XG9wdGlvbmFse3ZhbHVlfX0KK1JlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCithbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e2Nfdm9pZF9wfXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7dm9pZCAqfSB0eXBlLiAgVGhlIHZhbHVlIGlzIHJlcHJlc2VudGVkIGFzCitpbnRlZ2VyLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplci4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3djaGFyfXtcb3B0aW9uYWx7dmFsdWV9fQorUmVwcmVzZW50cyBhIEMgXGNvZGV7d2NoYXJfdH0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcyBhCitzaW5nbGUgY2hhcmFjdGVyIHVuaWNvZGUgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwKK3N0cmluZyBpbml0aWFsaXplciwgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIG11c3QgYmUgZXhhY3RseSBvbmUKK2NoYXJhY3Rlci4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtjX3djaGFyX3B9e1xvcHRpb25hbHt2YWx1ZX19CitSZXByZXNlbnRzIGEgQyBcY29kZXt3Y2hhcl90ICp9IGRhdGF0eXBlLCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlciB0byBhCit6ZXJvLXRlcm1pbmF0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK2ludGVnZXIgYWRkcmVzcywgb3IgYSBzdHJpbmcuCislIFhYWCBFeHBsYWluIHRoZSBkaWZmZXJlbmNlIHRvIFBPSU5URVIoY193Y2hhcikKK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtIUkVTVUxUfXt9CitXaW5kb3dzIG9ubHk6IFJlcHJlc2VudHMgYSBcY29kZXtIUkVTVUxUfSB2YWx1ZSwgd2hpY2ggY29udGFpbnMKK3N1Y2Nlc3Mgb3IgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwuCitcZW5ke2NsYXNzZGVzY30KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSBzdHJ1Y3R1cmVkIGRhdGEgdHlwZXMKK1xzdWJzdWJzZWN0aW9ue3N0cnVjdHVyZWQgZGF0YSB0eXBlc30KKworXGJlZ2lue2NsYXNzZGVzY317QmlnRW5kaWFuU3RydWN0dXJlfXt9CitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2NsYXNzZGVzY317TGl0dGxlRW5kaWFuU3RydWN0dXJlfXt9CitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2NsYXNzZGVzY317U3RydWN0dXJlfXt9CitCYXNlIGNsYXNzIGZvciBTdHJ1Y3R1cmUgZGF0YSB0eXBlcy4KKworXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e1VuaW9ufXt9CitcZW5ke2NsYXNzZGVzY30KKworCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislIGxpYnJhcmllcworXHN1YnN1YnNlY3Rpb257bGlicmFyaWVzfQorCitcYmVnaW57Y2xhc3NkZXNjfXtDRExMfXtuYW1lLCBtb2RlPVJUTERfTE9DQUwsIGhhbmRsZT1Ob25lfQorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntkYXRhZGVzY317Y2RsbH0KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0xpYnJhcnlMb2FkZXJ9e2RsbHR5cGV9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtMb2FkTGlicmFyeX17bmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZX0KK1xlbmR7bWVtYmVyZGVzY30KKworXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e09sZURMTH17bmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZX0KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e29sZWRsbH0KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e3B5X29iamVjdH17fQorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e1B5RExMfXtuYW1lLCBtb2RlPVJUTERfTE9DQUwsIGhhbmRsZT1Ob25lfQorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntkYXRhZGVzY317cHlkbGx9e30KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317UlRMRF9HTE9CQUx9CitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1JUTERfTE9DQUx9CitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtXaW5ETEx9e25hbWUsIG1vZGU9UlRMRF9MT0NBTCwgaGFuZGxlPU5vbmV9CitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXt3aW5kbGx9CitcZW5ke2RhdGFkZXNjfQorCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmN1cnNlc3BhbmVsLnRleCBiL0RvYy9saWIvbGliY3Vyc2VzcGFuZWwudGV4CmluZGV4IDUxOTA5MWUuLjFmOTY3MTcgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY3Vyc2VzcGFuZWwudGV4CisrKyBiL0RvYy9saWIvbGliY3Vyc2VzcGFuZWwudGV4CkBAIC0yMiw2ICsyMiw5IEBACiAKIFxiZWdpbntmdW5jZGVzY317bmV3X3BhbmVsfXt3aW59CiBSZXR1cm5zIGEgcGFuZWwgb2JqZWN0LCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBnaXZlbiB3aW5kb3cgXHZhcnt3aW59LgorQmUgYXdhcmUgdGhhdCB5b3UgbmVlZCB0byBrZWVwIHRoZSByZXR1cm5lZCBwYW5lbCBvYmplY3QgcmVmZXJlbmNlZAorZXhwbGljaXRseS4gIElmIHlvdSBkb24ndCwgdGhlIHBhbmVsIG9iamVjdCBpcyBnYXJiYWdlIGNvbGxlY3RlZCBhbmQKK3JlbW92ZWQgZnJvbSB0aGUgcGFuZWwgc3RhY2suCiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3RvcF9wYW5lbH17fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJkZWNpbWFsLnRleCBiL0RvYy9saWIvbGliZGVjaW1hbC50ZXgKaW5kZXggZmZjMzM2My4uYTBjN2JkZSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJkZWNpbWFsLnRleAorKysgYi9Eb2MvbGliL2xpYmRlY2ltYWwudGV4CkBAIC03MTMsOCArNzEzLDggQEAKICAgXGNvbnN0YW50e05hTn0uCiBcZW5ke21ldGhvZGRlc2N9CiAKLVxiZWdpbnttZXRob2RkZXNjfXtzcXJ0fXt9Ci0gIFJldHVybiB0aGUgc3F1YXJlIHJvb3QgdG8gZnVsbCBwcmVjaXNpb24uCitcYmVnaW57bWV0aG9kZGVzY317c3FydH17eH0KKyAgUmV0dXJuIHRoZSBzcXVhcmUgcm9vdCBvZiBcdmFye3h9IHRvIGZ1bGwgcHJlY2lzaW9uLgogXGVuZHttZXRob2RkZXNjfSAgICAgICAgICAgICAgICAgICAgCiAKIFxiZWdpbnttZXRob2RkZXNjfXtzdWJ0cmFjdH17eCwgeX0KQEAgLTczNCw3ICs3MzQsNyBAQAogICBvciBcY29uc3RhbnR7Um91bmRlZH0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogXGVuZHttZXRob2RkZXNjfSAKIAotXGJlZ2lue21ldGhvZGRlc2N9e3RvX3NjaV9zdHJpbmd9e30KK1xiZWdpbnttZXRob2RkZXNjfXt0b19zY2lfc3RyaW5nfXt4fQogICBDb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZyB1c2luZyBzY2llbnRpZmljIG5vdGF0aW9uLgogXGVuZHttZXRob2RkZXNjfSAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJkaXMudGV4IGIvRG9jL2xpYi9saWJkaXMudGV4CmluZGV4IDE5ZmRhNWIuLjI3YjhhNWMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZGlzLnRleAorKysgYi9Eb2MvbGliL2xpYmRpcy50ZXgKQEAgLTU1LDcgKzU1LDcgQEAKIFxiZWdpbntlbnVtZXJhdGV9CiBcaXRlbSB0aGUgbGluZSBudW1iZXIsIGZvciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgZWFjaCBsaW5lCiBcaXRlbSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiwgaW5kaWNhdGVkIGFzIFxzYW1wey0tPn0sCi1caXRlbSBhIGxhYmVsbGVkIGluc3RydWN0aW9uLCBpbmRpY2F0ZWQgd2l0aCBcc2FtcHs+XGNvZGV7Pn19LAorXGl0ZW0gYSBsYWJlbGxlZCBpbnN0cnVjdGlvbiwgaW5kaWNhdGVkIHdpdGggXHNhbXB7Pj59LAogXGl0ZW0gdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uLAogXGl0ZW0gdGhlIG9wZXJhdGlvbiBjb2RlIG5hbWUsCiBcaXRlbSBvcGVyYXRpb24gcGFyYW1ldGVycywgYW5kCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRvY3Rlc3QudGV4IGIvRG9jL2xpYi9saWJkb2N0ZXN0LnRleAppbmRleCAwZTNhMDE3Li43M2IyOWFkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmRvY3Rlc3QudGV4CisrKyBiL0RvYy9saWIvbGliZG9jdGVzdC50ZXgKQEAgLTMzMyw4ICszMzMsOCBAQAogXGVuZHt2ZXJiYXRpbX0KIAogQW55IGV4cGVjdGVkIG91dHB1dCBtdXN0IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZmluYWwKLVxjb2Rleyc+XGNvZGV7Pn0+fid9IG9yIFxjb2RleycuLi5+J30gbGluZSBjb250YWluaW5nIHRoZSBjb2RlLCBhbmQKLXRoZSBleHBlY3RlZCBvdXRwdXQgKGlmIGFueSkgZXh0ZW5kcyB0byB0aGUgbmV4dCBcY29kZXsnPlxjb2Rlez59Pn4nfQorXGNvZGV7Jz4+Pn4nfSBvciBcY29kZXsnLi4ufid9IGxpbmUgY29udGFpbmluZyB0aGUgY29kZSwgYW5kCit0aGUgZXhwZWN0ZWQgb3V0cHV0IChpZiBhbnkpIGV4dGVuZHMgdG8gdGhlIG5leHQgXGNvZGV7Jz4+Pn4nfQogb3IgYWxsLXdoaXRlc3BhY2UgbGluZS4KIAogVGhlIGZpbmUgcHJpbnQ6CkBAIC0zODYsNyArMzg2LDcgQEAKIFxlbmR7dmVyYmF0aW19CiAKIGFuZCBhcyBtYW55IGxlYWRpbmcgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGFyZSBzdHJpcHBlZCBmcm9tIHRoZQotZXhwZWN0ZWQgb3V0cHV0IGFzIGFwcGVhcmVkIGluIHRoZSBpbml0aWFsIFxjb2Rleyc+XGNvZGV7Pn0+fid9IGxpbmUKK2V4cGVjdGVkIG91dHB1dCBhcyBhcHBlYXJlZCBpbiB0aGUgaW5pdGlhbCBcY29kZXsnPj4+fid9IGxpbmUKIHRoYXQgc3RhcnRlZCB0aGUgZXhhbXBsZS4KIFxlbmR7aXRlbWl6ZX0KIApAQCAtNDA3LDEwICs0MDcsMTMgQEAKIFxzdWJzdWJzZWN0aW9ue1doYXQgQWJvdXQgRXhjZXB0aW9ucz9cbGFiZWx7ZG9jdGVzdC1leGNlcHRpb25zfX0KIAogTm8gcHJvYmxlbSwgcHJvdmlkZWQgdGhhdCB0aGUgdHJhY2ViYWNrIGlzIHRoZSBvbmx5IG91dHB1dCBwcm9kdWNlZCBieQotdGhlIGV4YW1wbGU6ICBqdXN0IHBhc3RlIGluIHRoZSB0cmFjZWJhY2suICBTaW5jZSB0cmFjZWJhY2tzIGNvbnRhaW4KLWRldGFpbHMgdGhhdCBhcmUgbGlrZWx5IHRvIGNoYW5nZSByYXBpZGx5IChmb3IgZXhhbXBsZSwgZXhhY3QgZmlsZSBwYXRocwotYW5kIGxpbmUgbnVtYmVycyksIHRoaXMgaXMgb25lIGNhc2Ugd2hlcmUgZG9jdGVzdCB3b3JrcyBoYXJkIHRvIGJlCi1mbGV4aWJsZSBpbiB3aGF0IGl0IGFjY2VwdHMuCit0aGUgZXhhbXBsZTogIGp1c3QgcGFzdGUgaW4gdGhlIHRyYWNlYmFjay5cZm9vdG5vdGV7RXhhbXBsZXMgY29udGFpbmluZworICAgIGJvdGggZXhwZWN0ZWQgb3V0cHV0IGFuZCBhbiBleGNlcHRpb24gYXJlIG5vdCBzdXBwb3J0ZWQuICBUcnlpbmcKKyAgICB0byBndWVzcyB3aGVyZSBvbmUgZW5kcyBhbmQgdGhlIG90aGVyIGJlZ2lucyBpcyB0b28gZXJyb3ItcHJvbmUsCisgICAgYW5kIHRoYXQgYWxzbyBtYWtlcyBmb3IgYSBjb25mdXNpbmcgdGVzdC59CitTaW5jZSB0cmFjZWJhY2tzIGNvbnRhaW4gZGV0YWlscyB0aGF0IGFyZSBsaWtlbHkgdG8gY2hhbmdlIHJhcGlkbHkgKGZvcgorZXhhbXBsZSwgZXhhY3QgZmlsZSBwYXRocyBhbmQgbGluZSBudW1iZXJzKSwgdGhpcyBpcyBvbmUgY2FzZSB3aGVyZSBkb2N0ZXN0Cit3b3JrcyBoYXJkIHRvIGJlIGZsZXhpYmxlIGluIHdoYXQgaXQgYWNjZXB0cy4KIAogU2ltcGxlIGV4YW1wbGU6CiAKQEAgLTYxMyw2ICs2MTYsMjAgQEAKIAogXGVuZHtkYXRhZGVzY30KIAorXGJlZ2lue2RhdGFkZXNjfXtTS0lQfQorCisgICAgV2hlbiBzcGVjaWZpZWQsIGRvIG5vdCBydW4gdGhlIGV4YW1wbGUgYXQgYWxsLiAgVGhpcyBjYW4gYmUgdXNlZnVsCisgICAgaW4gY29udGV4dHMgd2hlcmUgZG9jdGVzdCBleGFtcGxlcyBzZXJ2ZSBhcyBib3RoIGRvY3VtZW50YXRpb24gYW5kCisgICAgdGVzdCBjYXNlcywgYW5kIGFuIGV4YW1wbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBkb2N1bWVudGF0aW9uCisgICAgcHVycG9zZXMsIGJ1dCBzaG91bGQgbm90IGJlIGNoZWNrZWQuICBFLmcuLCB0aGUgZXhhbXBsZSdzIG91dHB1dAorICAgIG1pZ2h0IGJlIHJhbmRvbTsgb3IgdGhlIGV4YW1wbGUgbWlnaHQgZGVwZW5kIG9uIHJlc291cmNlcyB3aGljaAorICAgIHdvdWxkIGJlIHVuYXZhaWxhYmxlIHRvIHRoZSB0ZXN0IGRyaXZlci4KKworICAgIFRoZSBTS0lQIGZsYWcgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGVtcG9yYXJpbHkgImNvbW1lbnRpbmcgb3V0IgorICAgIGV4YW1wbGVzLgorCitcZW5ke2RhdGFkZXNjfQorCiBcYmVnaW57ZGF0YWRlc2N9e0NPTVBBUklTT05fRkxBR1N9CiAgICAgQSBiaXRtYXNrIG9yJ2luZyB0b2dldGhlciBhbGwgdGhlIGNvbXBhcmlzb24gZmxhZ3MgYWJvdmUuCiBcZW5ke2RhdGFkZXNjfQpAQCAtNzQxLDYgKzc1OCw3IEBACiAgICAgd2VyZSBhZGRlZDsgYnkgZGVmYXVsdCBcY29kZXs8QkxBTktMSU5FPn0gaW4gZXhwZWN0ZWQgb3V0cHV0CiAgICAgbWF0Y2hlcyBhbiBlbXB0eSBsaW5lIGluIGFjdHVhbCBvdXRwdXQ7IGFuZCBkb2N0ZXN0IGRpcmVjdGl2ZXMKICAgICB3ZXJlIGFkZGVkXXsyLjR9CitcdmVyc2lvbmNoYW5nZWRbQ29uc3RhbnQgXGNvbnN0YW50e1NLSVB9IHdhcyBhZGRlZF17Mi41fQogCiBUaGVyZSdzIGFsc28gYSB3YXkgdG8gcmVnaXN0ZXIgbmV3IG9wdGlvbiBmbGFnIG5hbWVzLCBhbHRob3VnaCB0aGlzCiBpc24ndCB1c2VmdWwgdW5sZXNzIHlvdSBpbnRlbmQgdG8gZXh0ZW5kIFxyZWZtb2R1bGV7ZG9jdGVzdH0gaW50ZXJuYWxzCkBAIC0xMDQwLDcgKzEwNTgsMTEgQEAKIFRoZXJlIGFyZSB0d28gbWFpbiBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIFxjbGFzc3tccmVmbW9kdWxle3VuaXR0ZXN0fS5UZXN0U3VpdGV9CiBpbnN0YW5jZXMgZnJvbSB0ZXh0IGZpbGVzIGFuZCBtb2R1bGVzIHdpdGggZG9jdGVzdHM6CiAKLVxiZWdpbntmdW5jZGVzY317RG9jRmlsZVN1aXRlfXsqcGF0aHMsICoqa3d9CitcYmVnaW57ZnVuY2Rlc2N9e0RvY0ZpbGVTdWl0ZX17XG9wdGlvbmFse21vZHVsZV9yZWxhdGl2ZX1cb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZX1cb3B0aW9uYWx7LCBzZXRVcH1cb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd259XG9wdGlvbmFseywgZ2xvYnN9XG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmZsYWdzfVxvcHRpb25hbHssIHBhcnNlcn19CisKICAgQ29udmVydCBkb2N0ZXN0IHRlc3RzIGZyb20gb25lIG9yIG1vcmUgdGV4dCBmaWxlcyB0byBhCiAgIFxjbGFzc3tccmVmbW9kdWxle3VuaXR0ZXN0fS5UZXN0U3VpdGV9LgogCkBAIC0xMTA4LDkgKzExMzAsOSBAQAogCiAgIFx2ZXJzaW9uYWRkZWR7Mi40fQogCi0gIFN0YXJ0aW5nIGluIFB5dGhvbiAyLjUsIHRoZSBnbG9iYWwgXGNvZGV7X19maWxlX199IHdhcyBhZGRlZCB0byB0aGUKKyAgXHZlcnNpb25jaGFuZ2VkW1RoZSBnbG9iYWwgXGNvZGV7X19maWxlX199IHdhcyBhZGRlZCB0byB0aGUKICAgZ2xvYmFscyBwcm92aWRlZCB0byBkb2N0ZXN0cyBsb2FkZWQgZnJvbSBhIHRleHQgZmlsZSB1c2luZwotICBcZnVuY3Rpb257RG9jRmlsZVN1aXRlKCl9LgorICBcZnVuY3Rpb257RG9jRmlsZVN1aXRlKCl9XXsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e0RvY1Rlc3RTdWl0ZX17XG9wdGlvbmFse21vZHVsZX1cb3B0aW9uYWx7LApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJleGNzLnRleCBiL0RvYy9saWIvbGliZXhjcy50ZXgKaW5kZXggODUwNThhNC4uMzBmZTgzMSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJleGNzLnRleAorKysgYi9Eb2MvbGliL2xpYmV4Y3MudGV4CkBAIC04MCw3ICs4MCw2IEBACiB0byBiZSBhdHRhY2hlZCB0byB0aGUgZXhjZXB0aW9uLCBhdHRhY2ggaXQgdGhyb3VnaCBhcmJpdHJhcnkgYXR0cmlidXRlcyBvbiB0aGUKIGluc3RhbmNlLiAgQWxsIGFyZ3VtZW50cyBhcmUgYWxzbyBzdG9yZWQgaW4gXG1lbWJlcnthcmdzfSBhcyBhIHR1cGxlLCBidXQgaXQgd2lsbAogZXZlbnR1YWxseSBiZSBkZXByZWNhdGVkIGFuZCB0aHVzIGl0cyB1c2UgaXMgZGlzY291cmFnZWQuCi1cdmVyc2lvbmNoYW5nZWRbQ2hhbmdlZCB0byBpbmhlcml0IGZyb20gXGV4Y2VwdGlvbntCYXNlRXhjZXB0aW9ufV17Mi41fQogXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke2V4Y2Rlc2N9CiAKQEAgLTg4LDYgKzg3LDcgQEAKIEFsbCBidWlsdC1pbiwgbm9uLXN5c3RlbS1leGl0aW5nIGV4Y2VwdGlvbnMgYXJlIGRlcml2ZWQKIGZyb20gdGhpcyBjbGFzcy4gIEFsbCB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucyBzaG91bGQgYWxzbyBiZSBkZXJpdmVkCiBmcm9tIHRoaXMgY2xhc3MuCitcdmVyc2lvbmNoYW5nZWRbQ2hhbmdlZCB0byBpbmhlcml0IGZyb20gXGV4Y2VwdGlvbntCYXNlRXhjZXB0aW9ufV17Mi41fQogXGVuZHtleGNkZXNjfQogCiBcYmVnaW57ZXhjZGVzY317U3RhbmRhcmRFcnJvcn0KQEAgLTM5NCwxMSArMzk0LDE1IEBACiBcYmVnaW57ZXhjZGVzY317V2luZG93c0Vycm9yfQogICBSYWlzZWQgd2hlbiBhIFdpbmRvd3Mtc3BlY2lmaWMgZXJyb3Igb2NjdXJzIG9yIHdoZW4gdGhlIGVycm9yIG51bWJlcgogICBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFuIFxjZGF0YXtlcnJub30gdmFsdWUuICBUaGUKLSAgXG1lbWJlcntlcnJub30gYW5kIFxtZW1iZXJ7c3RyZXJyb3J9IHZhbHVlcyBhcmUgY3JlYXRlZCBmcm9tIHRoZQorICBcbWVtYmVye3dpbmVycm9yfSBhbmQgXG1lbWJlcntzdHJlcnJvcn0gdmFsdWVzIGFyZSBjcmVhdGVkIGZyb20gdGhlCiAgIHJldHVybiB2YWx1ZXMgb2YgdGhlIFxjZnVuY3Rpb257R2V0TGFzdEVycm9yKCl9IGFuZAogICBcY2Z1bmN0aW9ue0Zvcm1hdE1lc3NhZ2UoKX0gZnVuY3Rpb25zIGZyb20gdGhlIFdpbmRvd3MgUGxhdGZvcm0gQVBJLgorICBUaGUgXG1lbWJlcntlcnJub30gdmFsdWUgbWFwcyB0aGUgXG1lbWJlcnt3aW5lcnJvcn0gdmFsdWUgdG8gCisgIGNvcnJlc3BvbmRpbmcgXGNvZGV7ZXJybm8uaH0gdmFsdWVzLgogICBUaGlzIGlzIGEgc3ViY2xhc3Mgb2YgXGV4Y2VwdGlvbntPU0Vycm9yfS4KIFx2ZXJzaW9uYWRkZWR7Mi4wfQorXHZlcnNpb25jaGFuZ2VkW1ByZXZpb3VzIHZlcnNpb25zIHB1dCB0aGUgXGNmdW5jdGlvbntHZXRMYXN0RXJyb3IoKX0KK2NvZGVzIGludG8gXG1lbWJlcntlcnJub31dezIuNX0KIFxlbmR7ZXhjZGVzY30KIAogXGJlZ2lue2V4Y2Rlc2N9e1plcm9EaXZpc2lvbkVycm9yfQpAQCAtNDQyLDYgKzQ0NiwxMSBAQAogaW4gdGhlIGZ1dHVyZS4KIFxlbmR7ZXhjZGVzY30KIAorXGJlZ2lue2V4Y2Rlc2N9e0ltcG9ydFdhcm5pbmd9CitCYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBwcm9iYWJsZSBtaXN0YWtlcyBpbiBtb2R1bGUgaW1wb3J0cy4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtleGNkZXNjfQorCiBUaGUgY2xhc3MgaGllcmFyY2h5IGZvciBidWlsdC1pbiBleGNlcHRpb25zIGlzOgogCiBcdmVyYmF0aW1pbnB1dHsuLi8uLi9MaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZnVuY3MudGV4IGIvRG9jL2xpYi9saWJmdW5jcy50ZXgKaW5kZXggYzAzNTJkMy4uODkwNGQ1ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJmdW5jcy50ZXgKKysrIGIvRG9jL2xpYi9saWJmdW5jcy50ZXgKQEAgLTQxOCw3ICs0MTgsNyBAQAogICB0aGF0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBiaW5hcnkgYW5kIHRleHQgZmlsZXMgKGVsc2UgaXQgaXMKICAgaWdub3JlZCkuICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCBcZXhjZXB0aW9ue0lPRXJyb3J9IGlzCiAgIHJhaXNlZC4KLQorICAKICAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIFxjZnVuY3Rpb257Zm9wZW4oKX0gdmFsdWVzIFx2YXJ7bW9kZX0KICAgbWF5IGJlIFxjb2RleydVJ30gb3IgXGNvZGV7J3JVJ30uIElmIFB5dGhvbiBpcyBidWlsdCB3aXRoIHVuaXZlcnNhbAogICBuZXdsaW5lIHN1cHBvcnQgKHRoZSBkZWZhdWx0KSB0aGUgZmlsZSBpcyBvcGVuZWQgYXMgYSB0ZXh0IGZpbGUsIGJ1dApAQCAtNDM0LDYgKzQzNCw5IEBACiAgIGhhdmUgeWV0IGJlZW4gc2VlbiksIFxjb2RleydcZSBuJ30sIFxjb2RleydcZSByJ30sIFxjb2RleydcZSByXGUgbid9LAogICBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYWxsIHRoZSBuZXdsaW5lIHR5cGVzIHNlZW4uCiAKKyAgUHl0aG9uIGVuZm9yY2VzIHRoYXQgdGhlIG1vZGUsIGFmdGVyIHN0cmlwcGluZyBcY29kZXsnVSd9LCBiZWdpbnMgd2l0aAorICBcY29kZXsncid9LCBcY29kZXsndyd9IG9yIFxjb2RleydhJ30uCisKICAgSWYgXHZhcnttb2RlfSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBcY29kZXsncid9LiAgV2hlbiBvcGVuaW5nIGEKICAgYmluYXJ5IGZpbGUsIHlvdSBzaG91bGQgYXBwZW5kIFxjb2RleydiJ30gdG8gdGhlIFx2YXJ7bW9kZX0gdmFsdWUKICAgZm9yIGltcHJvdmVkIHBvcnRhYmlsaXR5LiAgKEl0J3MgdXNlZnVsIGV2ZW4gb24gc3lzdGVtcyB3aGljaCBkb24ndApAQCAtNDU1LDEyICs0NTgsMTAgQEAKICAgICBhZnRlciBhbnkgSS9PIGhhcyBiZWVuIHBlcmZvcm1lZCwgYW5kIHRoZXJlJ3Mgbm8gcmVsaWFibGUgd2F5IHRvCiAgICAgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyB0aGUgY2FzZS59CiAKLSAgVGhlIFxmdW5jdGlvbntmaWxlKCl9IGNvbnN0cnVjdG9yIGlzIG5ldyBpbiBQeXRob24gMi4yIGFuZCBpcyBhbgotICBhbGlhcyBmb3IgXGZ1bmN0aW9ue29wZW4oKX0uICBCb3RoIHNwZWxsaW5ncyBhcmUgZXF1aXZhbGVudC4gIFRoZQotICBpbnRlbnQgaXMgZm9yIFxmdW5jdGlvbntvcGVuKCl9IHRvIGNvbnRpbnVlIHRvIGJlIHByZWZlcnJlZCBmb3IgdXNlCi0gIGFzIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgbmV3IFxjbGFzc3tmaWxlfSBvYmplY3QuICBUaGUKLSAgc3BlbGxpbmcsIFxjbGFzc3tmaWxlfSBpcyBtb3JlIHN1aXRlZCB0byB0eXBlIHRlc3RpbmcgKGZvciBleGFtcGxlLAotICB3cml0aW5nIFxzYW1we2lzaW5zdGFuY2UoZiwgZmlsZSl9KS4KKyAgXHZlcnNpb25hZGRlZHsyLjJ9CisKKyAgXHZlcnNpb25jaGFuZ2VkW1Jlc3RyaWN0aW9uIG9uIGZpcnN0IGxldHRlciBvZiBtb2RlIHN0cmluZworICAgICAgICAgICAgICAgICAgaW50cm9kdWNlZF17Mi41fQogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtmaWx0ZXJ9e2Z1bmN0aW9uLCBsaXN0fQpAQCAtNzA4LDcgKzcwOSwxMCBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtvcGVufXtmaWxlbmFtZVxvcHRpb25hbHssIG1vZGVcb3B0aW9uYWx7LCBidWZzaXplfX19Ci0gIEFuIGFsaWFzIGZvciB0aGUgXGZ1bmN0aW9ue2ZpbGUoKX0gZnVuY3Rpb24gYWJvdmUuCisgIEEgd3JhcHBlciBmb3IgdGhlIFxmdW5jdGlvbntmaWxlKCl9IGZ1bmN0aW9uIGFib3ZlLiAgVGhlIGludGVudCBpcworICBmb3IgXGZ1bmN0aW9ue29wZW4oKX0gdG8gYmUgcHJlZmVycmVkIGZvciB1c2UgYXMgYSBmYWN0b3J5IGZ1bmN0aW9uCisgIHJldHVybmluZyBhIG5ldyBcY2xhc3N7ZmlsZX0gb2JqZWN0LiAgXGNsYXNze2ZpbGV9IGlzIG1vcmUgc3VpdGVkIHRvCisgIHR5cGUgdGVzdGluZyAoZm9yIGV4YW1wbGUsIHdyaXRpbmcgXHNhbXB7aXNpbnN0YW5jZShmLCBmaWxlKX0pLgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtvcmR9e2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmdldHBhc3MudGV4IGIvRG9jL2xpYi9saWJnZXRwYXNzLnRleAppbmRleCAxZDE3N2QzLi5hNzQyNDM5IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmdldHBhc3MudGV4CisrKyBiL0RvYy9saWIvbGliZ2V0cGFzcy50ZXgKQEAgLTE5LDcgKzE5LDcgQEAKICAgXGNvZGV7c3lzLnN0ZG91dH0gKHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZCBvbiBXaW5kb3dzKS4KIAogICBBdmFpbGFiaWxpdHk6IE1hY2ludG9zaCwgXFVOSVgsIFdpbmRvd3MuCi0gIFx2ZXJzaW9uYWRkZWRbVGhlIFx2YXJ7c3RyZWFtfSBwYXJhbWV0ZXJdezIuNX0KKyAgXHZlcnNpb25jaGFuZ2VkW1RoZSBcdmFye3N0cmVhbX0gcGFyYW1ldGVyIHdhcyBhZGRlZF17Mi41fQogXGVuZHtmdW5jZGVzY30KIAogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmh0bWxwYXJzZXIudGV4IGIvRG9jL2xpYi9saWJodG1scGFyc2VyLnRleAppbmRleCBiODViYTU2Li41MmY4NDA5IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmh0bWxwYXJzZXIudGV4CisrKyBiL0RvYy9saWIvbGliaHRtbHBhcnNlci50ZXgKQEAgLTEzMiw3ICsxMzIsNyBAQAogXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9kZWNsfXtkZWNsfQogTWV0aG9kIGNhbGxlZCB3aGVuIGFuIFNHTUwgZGVjbGFyYXRpb24gaXMgcmVhZCBieSB0aGUgcGFyc2VyLiAgVGhlCiBcdmFye2RlY2x9IHBhcmFtZXRlciB3aWxsIGJlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGRlY2xhcmF0aW9uCi1pbnNpZGUgdGhlIFxjb2RlezwhfS4uLlxjb2Rlez59IG1hcmt1cC5JdCBpcyBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuCitpbnNpZGUgdGhlIFxjb2RlezwhfS4uLlxjb2Rlez59IG1hcmt1cC4gIEl0IGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4KIGJ5IGEgZGVyaXZlZCBjbGFzczsgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgogXGVuZHttZXRob2RkZXNjfQogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmxvY2FsZS50ZXggYi9Eb2MvbGliL2xpYmxvY2FsZS50ZXgKaW5kZXggZTZiYTJjMS4uNjg4Y2NiMCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJsb2NhbGUudGV4CisrKyBiL0RvYy9saWIvbGlibG9jYWxlLnRleApAQCAtNjEsNyArNjEsNyBAQAogICBSZXR1cm5zIHRoZSBkYXRhYmFzZSBvZiB0aGUgbG9jYWwgY29udmVudGlvbnMgYXMgYSBkaWN0aW9uYXJ5LgogICBUaGlzIGRpY3Rpb25hcnkgaGFzIHRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcyBrZXlzOgogCi0gIFxiZWdpbnt0YWJsZWlpaX17bHxsfHB7M2lufX17Y29uc3RhbnR9e0tleX17Q2F0ZWdvcnl9e01lYW5pbmd9CisgIFxiZWdpbnt0YWJsZWlpaX17bHxsfHB7M2lufX17Y29uc3RhbnR9e0NhdGVnb3J5fXtLZXl9e01lYW5pbmd9CiAgICAgXGxpbmVpaWl7TENfTlVNRVJJQ317XGNvZGV7J2RlY2ltYWxfcG9pbnQnfX0KICAgICAgICAgICAgIHtEZWNpbWFsIHBvaW50IGNoYXJhY3Rlci59CiAgICAgXGxpbmVpaWl7fXtcY29kZXsnZ3JvdXBpbmcnfX0KQEAgLTc2LDggKzc2LDIwIEBACiAgICAgICAgICAgICB7SW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wufQogICAgIFxsaW5laWlpe317XGNvZGV7J2N1cnJlbmN5X3N5bWJvbCd9fQogICAgICAgICAgICAge0xvY2FsIGN1cnJlbmN5IHN5bWJvbC59CisgICAgXGxpbmVpaWl7fXtcY29kZXsncF9jc19wcmVjZWRlcy9uX2NzX3ByZWNlZGVzJ319CisgICAgICAgICAgICB7V2hldGhlciB0aGUgY3VycmVuY3kgc3ltYm9sIHByZWNlZGVzIHRoZSB2YWx1ZSAoZm9yIHBvc2l0aXZlIHJlc3AuCisgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWVzKS59CisgICAgXGxpbmVpaWl7fXtcY29kZXsncF9zZXBfYnlfc3BhY2Uvbl9zZXBfYnlfc3BhY2UnfX0KKyAgICAgICAgICAgIHtXaGV0aGVyIHRoZSBjdXJyZW5jeSBzeW1ib2wgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHZhbHVlIAorICAgICAgICAgICAgIGJ5IGEgc3BhY2UgKGZvciBwb3NpdGl2ZSByZXNwLiBuZWdhdGl2ZSB2YWx1ZXMpLn0KICAgICBcbGluZWlpaXt9e1xjb2Rleydtb25fZGVjaW1hbF9wb2ludCd9fQogICAgICAgICAgICAge0RlY2ltYWwgcG9pbnQgdXNlZCBmb3IgbW9uZXRhcnkgdmFsdWVzLn0KKyAgICBcbGluZWlpaXt9e1xjb2RleydmcmFjX2RpZ2l0cyd9fQorICAgICAgICAgICAge051bWJlciBvZiBmcmFjdGlvbmFsIGRpZ2l0cyB1c2VkIGluIGxvY2FsIGZvcm1hdHRpbmcKKyAgICAgICAgICAgICBvZiBtb25ldGFyeSB2YWx1ZXMufQorICAgIFxsaW5laWlpe317XGNvZGV7J2ludF9mcmFjX2RpZ2l0cyd9fQorICAgICAgICAgICAge051bWJlciBvZiBmcmFjdGlvbmFsIGRpZ2l0cyB1c2VkIGluIGludGVybmF0aW9uYWwKKyAgICAgICAgICAgICBmb3JtYXR0aW5nIG9mIG1vbmV0YXJ5IHZhbHVlcy59CiAgICAgXGxpbmVpaWl7fXtcY29kZXsnbW9uX3Rob3VzYW5kc19zZXAnfX0KICAgICAgICAgICAgIHtHcm91cCBzZXBhcmF0b3IgdXNlZCBmb3IgbW9uZXRhcnkgdmFsdWVzLn0KICAgICBcbGluZWlpaXt9e1xjb2Rleydtb25fZ3JvdXBpbmcnfX0KQEAgLTg3LDEzICs5OSwxMiBAQAogICAgICAgICAgICAge1N5bWJvbCB1c2VkIHRvIGFubm90YXRlIGEgcG9zaXRpdmUgbW9uZXRhcnkgdmFsdWUufQogICAgIFxsaW5laWlpe317XGNvZGV7J25lZ2F0aXZlX3NpZ24nfX0KICAgICAgICAgICAgIHtTeW1ib2wgdXNlZCB0byBhbm5vdGF0ZSBhIG5lZ2F0aXZlIG1vbmV0YXJ5IHZhbHVlLn0KLSAgICBcbGluZWlpaXt9e1xjb2RleydmcmFjX2RpZ2l0cyd9fQotICAgICAgICAgICAge051bWJlciBvZiBmcmFjdGlvbmFsIGRpZ2l0cyB1c2VkIGluIGxvY2FsIGZvcm1hdHRpbmcKLSAgICAgICAgICAgICBvZiBtb25ldGFyeSB2YWx1ZXMufQotICAgIFxsaW5laWlpe317XGNvZGV7J2ludF9mcmFjX2RpZ2l0cyd9fQotICAgICAgICAgICAge051bWJlciBvZiBmcmFjdGlvbmFsIGRpZ2l0cyB1c2VkIGluIGludGVybmF0aW9uYWwKLSAgICAgICAgICAgICBmb3JtYXR0aW5nIG9mIG1vbmV0YXJ5IHZhbHVlcy59CisgICAgXGxpbmVpaWl7fXtcY29kZXsncF9zaWduX3Bvc24vbl9zaWduX3Bvc24nfX0KKyAgICAgICAgICAgIHtUaGUgcG9zaXRpb24gb2YgdGhlIHNpZ24gKGZvciBwb3NpdGl2ZSByZXNwLiBuZWdhdGl2ZSB2YWx1ZXMpLCBzZWUgYmVsb3cufQogICBcZW5ke3RhYmxlaWlpfQorICAKKyAgQWxsIG51bWVyaWMgdmFsdWVzIGNhbiBiZSBzZXQgdG8gXGNvbnN0YW50e0NIQVJfTUFYfSB0byBpbmRpY2F0ZSB0aGF0CisgIHRoZXJlIGlzIG5vIHZhbHVlIHNwZWNpZmllZCBpbiB0aGlzIGxvY2FsZS4KIAogICBUaGUgcG9zc2libGUgdmFsdWVzIGZvciBcY29kZXsncF9zaWduX3Bvc24nfSBhbmQKICAgXGNvZGV7J25fc2lnbl9wb3NuJ30gYXJlIGdpdmVuIGJlbG93LgpAQCAtMTA0LDcgKzExNSw3IEBACiAgICAgXGxpbmVpaXsyfXtUaGUgc2lnbiBzaG91bGQgZm9sbG93IHRoZSB2YWx1ZSBhbmQgY3VycmVuY3kgc3ltYm9sLn0KICAgICBcbGluZWlpezN9e1RoZSBzaWduIHNob3VsZCBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZSB2YWx1ZS59CiAgICAgXGxpbmVpaXs0fXtUaGUgc2lnbiBzaG91bGQgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSB2YWx1ZS59Ci0gICAgXGxpbmVpaXtcY29uc3RhbnR7TENfTUFYfX17Tm90aGluZyBpcyBzcGVjaWZpZWQgaW4gdGhpcyBsb2NhbGUufQorICAgIFxsaW5laWl7XGNvbnN0YW50e0NIQVJfTUFYfX17Tm90aGluZyBpcyBzcGVjaWZpZWQgaW4gdGhpcyBsb2NhbGUufQogICBcZW5ke3RhYmxlaWl9CiBcZW5ke2Z1bmNkZXNjfQogCkBAIC0yMDYsMTIgKzIxNyw0NCBAQAogICBzdHJpbmdzLgogXGVuZHtmdW5jZGVzY30KIAotXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXR9e2Zvcm1hdCwgdmFsXG9wdGlvbmFseywgZ3JvdXBpbmd9fQorXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXR9e2Zvcm1hdCwgdmFsXG9wdGlvbmFseywgZ3JvdXBpbmdcb3B0aW9uYWx7LCBtb25ldGFyeX19fQogICBGb3JtYXRzIGEgbnVtYmVyIFx2YXJ7dmFsfSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQKICAgXGNvbnN0YW50e0xDX05VTUVSSUN9IHNldHRpbmcuICBUaGUgZm9ybWF0IGZvbGxvd3MgdGhlIGNvbnZlbnRpb25zCiAgIG9mIHRoZSBcY29kZXtcJX0gb3BlcmF0b3IuICBGb3IgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLCB0aGUgZGVjaW1hbAogICBwb2ludCBpcyBtb2RpZmllZCBpZiBhcHByb3ByaWF0ZS4gIElmIFx2YXJ7Z3JvdXBpbmd9IGlzIHRydWUsIGFsc28KICAgdGFrZXMgdGhlIGdyb3VwaW5nIGludG8gYWNjb3VudC4KKworICBJZiBcdmFye21vbmV0YXJ5fSBpcyB0cnVlLCB0aGUgY29udmVyc2lvbiB1c2VzIG1vbmV0YXJ5IHRob3VzYW5kcworICBzZXBhcmF0b3IgYW5kIGdyb3VwaW5nIHN0cmluZ3MuCisKKyAgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSB3b3JrIGZvciBleGFjdGx5IG9uZSBcJWNoYXIKKyAgc3BlY2lmaWVyLiBGb3Igd2hvbGUgZm9ybWF0IHN0cmluZ3MsIHVzZSBcZnVuY3Rpb257Zm9ybWF0X3N0cmluZygpfS4KKworICBcdmVyc2lvbmNoYW5nZWRbQWRkZWQgdGhlIFx2YXJ7bW9uZXRhcnl9IHBhcmFtZXRlcl17Mi41fQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtmb3JtYXRfc3RyaW5nfXtmb3JtYXQsIHZhbFxvcHRpb25hbHssIGdyb3VwaW5nfX0KKyAgUHJvY2Vzc2VzIGZvcm1hdHRpbmcgc3BlY2lmaWVycyBhcyBpbiBcY29kZXtmb3JtYXQgXCUgdmFsfSwKKyAgYnV0IHRha2VzIHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5ncyBpbnRvIGFjY291bnQuCisKKyAgXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2N1cnJlbmN5fXt2YWxcb3B0aW9uYWx7LCBzeW1ib2xcb3B0aW9uYWx7LCBncm91cGluZ1xvcHRpb25hbHssIGludGVybmF0aW9uYWx9fX19CisgIEZvcm1hdHMgYSBudW1iZXIgXHZhcnt2YWx9IGFjY29yZGluZyB0byB0aGUgY3VycmVudCBcY29uc3RhbnR7TENfTU9ORVRBUll9CisgIHNldHRpbmdzLiAKKyAgCisgIFRoZSByZXR1cm5lZCBzdHJpbmcgaW5jbHVkZXMgdGhlIGN1cnJlbmN5IHN5bWJvbCBpZiBcdmFye3N5bWJvbH0gaXMgdHJ1ZSwKKyAgd2hpY2ggaXMgdGhlIGRlZmF1bHQuCisgIElmIFx2YXJ7Z3JvdXBpbmd9IGlzIHRydWUgKHdoaWNoIGlzIG5vdCB0aGUgZGVmYXVsdCksIGdyb3VwaW5nIGlzIGRvbmUgd2l0aAorICB0aGUgdmFsdWUuCisgIElmIFx2YXJ7aW50ZXJuYXRpb25hbH0gaXMgdHJ1ZSAod2hpY2ggaXMgbm90IHRoZSBkZWZhdWx0KSwgdGhlIGludGVybmF0aW9uYWwKKyAgY3VycmVuY3kgc3ltYm9sIGlzIHVzZWQuCisKKyAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgd29yayB3aXRoIHRoZSBgQycgbG9jYWxlLCBzbyB5b3UgaGF2ZSB0byBzZXQKKyAgYSBsb2NhbGUgdmlhIFxmdW5jdGlvbntzZXRsb2NhbGUoKX0gZmlyc3QuCisKKyAgXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3N0cn17ZmxvYXR9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1haWxib3gudGV4IGIvRG9jL2xpYi9saWJtYWlsYm94LnRleAppbmRleCBkZDE4NTYyLi4wYTFmNzkyIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYm1haWxib3gudGV4CisrKyBiL0RvYy9saWIvbGlibWFpbGJveC50ZXgKQEAgLTEsMTIgKzEsMTI1MyBAQAogXHNlY3Rpb257XG1vZHVsZXttYWlsYm94fSAtLS0KLSAgICAgICAgIFJlYWQgdmFyaW91cyBtYWlsYm94IGZvcm1hdHN9CisgICAgICAgICAgTWFuaXB1bGF0ZSBtYWlsYm94ZXMgaW4gdmFyaW91cyBmb3JtYXRzfQogCi1cZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17bWFpbGJveH0KLVxtb2R1bGVzeW5vcHNpc3tSZWFkIHZhcmlvdXMgbWFpbGJveCBmb3JtYXRzLn0KK1xkZWNsYXJlbW9kdWxle317bWFpbGJveH0KK1xtb2R1bGVhdXRob3J7R3JlZ29yeSBLLn5Kb2huc29ufXtna2pAZ3JlZ29yeWtqb2huc29uLmNvbX0KK1xzZWN0aW9uYXV0aG9ye0dyZWdvcnkgSy5+Sm9obnNvbn17Z2tqQGdyZWdvcnlram9obnNvbi5jb219CitcbW9kdWxlc3lub3BzaXN7TWFuaXB1bGF0ZSBtYWlsYm94ZXMgaW4gdmFyaW91cyBmb3JtYXRzfQogCiAKLVRoaXMgbW9kdWxlIGRlZmluZXMgYSBudW1iZXIgb2YgY2xhc3NlcyB0aGF0IGFsbG93IGVhc3kgYW5kIHVuaWZvcm0KLWFjY2VzcyB0byBtYWlsIG1lc3NhZ2VzIGluIGEgKFxVTklYKSBtYWlsYm94LgorVGhpcyBtb2R1bGUgZGVmaW5lcyB0d28gY2xhc3NlcywgXGNsYXNze01haWxib3h9IGFuZCBcY2xhc3N7TWVzc2FnZX0sIGZvcgorYWNjZXNzaW5nIGFuZCBtYW5pcHVsYXRpbmcgb24tZGlzayBtYWlsYm94ZXMgYW5kIHRoZSBtZXNzYWdlcyB0aGV5IGNvbnRhaW4uCitcY2xhc3N7TWFpbGJveH0gb2ZmZXJzIGEgZGljdGlvbmFyeS1saWtlIG1hcHBpbmcgZnJvbSBrZXlzIHRvIG1lc3NhZ2VzLgorXGNsYXNze01lc3NhZ2V9IGV4dGVuZHMgdGhlIFxtb2R1bGV7ZW1haWwuTWVzc2FnZX0gbW9kdWxlJ3MgXGNsYXNze01lc3NhZ2V9CitjbGFzcyB3aXRoIGZvcm1hdC1zcGVjaWZpYyBzdGF0ZSBhbmQgYmVoYXZpb3IuIFN1cHBvcnRlZCBtYWlsYm94IGZvcm1hdHMgYXJlCitNYWlsZGlyLCBtYm94LCBNSCwgQmFieWwsIGFuZCBNTURGLgorCitcYmVnaW57c2VlYWxzb30KKyAgICBcc2VlbW9kdWxle2VtYWlsfXtSZXByZXNlbnQgYW5kIG1hbmlwdWxhdGUgbWVzc2FnZXMufQorXGVuZHtzZWVhbHNvfQorCitcc3Vic2VjdGlvbntcY2xhc3N7TWFpbGJveH0gb2JqZWN0c30KK1xsYWJlbHttYWlsYm94LW9iamVjdHN9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtNYWlsYm94fQorQSBtYWlsYm94LCB3aGljaCBtYXkgYmUgaW5zcGVjdGVkIGFuZCBtb2RpZmllZC4KK1xlbmR7Y2xhc3NkZXNjKn0KKworVGhlIFxjbGFzc3tNYWlsYm94fSBpbnRlcmZhY2UgaXMgZGljdGlvbmFyeS1saWtlLCB3aXRoIHNtYWxsIGtleXMKK2NvcnJlc3BvbmRpbmcgdG8gbWVzc2FnZXMuIEtleXMgYXJlIGlzc3VlZCBieSB0aGUgXGNsYXNze01haWxib3h9IGluc3RhbmNlCit3aXRoIHdoaWNoIHRoZXkgd2lsbCBiZSB1c2VkIGFuZCBhcmUgb25seSBtZWFuaW5nZnVsIHRvIHRoYXQgXGNsYXNze01haWxib3h9CitpbnN0YW5jZS4gQSBrZXkgY29udGludWVzIHRvIGlkZW50aWZ5IGEgbWVzc2FnZSBldmVuIGlmIHRoZSBjb3JyZXNwb25kaW5nCittZXNzYWdlIGlzIG1vZGlmaWVkLCBzdWNoIGFzIGJ5IHJlcGxhY2luZyBpdCB3aXRoIGFub3RoZXIgbWVzc2FnZS4gTWVzc2FnZXMgbWF5CitiZSBhZGRlZCB0byBhIFxjbGFzc3tNYWlsYm94fSBpbnN0YW5jZSB1c2luZyB0aGUgc2V0LWxpa2UgbWV0aG9kCitcbWV0aG9ke2FkZCgpfSBhbmQgcmVtb3ZlZCB1c2luZyBhIFxjb2Rle2RlbH0gc3RhdGVtZW50IG9yIHRoZSBzZXQtbGlrZSBtZXRob2RzCitcbWV0aG9ke3JlbW92ZSgpfSBhbmQgXG1ldGhvZHtkaXNjYXJkKCl9LgorCitcY2xhc3N7TWFpbGJveH0gaW50ZXJmYWNlIHNlbWFudGljcyBkaWZmZXIgZnJvbSBkaWN0aW9uYXJ5IHNlbWFudGljcyBpbiBzb21lCitub3Rld29ydGh5IHdheXMuIEVhY2ggdGltZSBhIG1lc3NhZ2UgaXMgcmVxdWVzdGVkLCBhIG5ldyByZXByZXNlbnRhdGlvbgorKHR5cGljYWxseSBhIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZSkgaXMgZ2VuZXJhdGVkLCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50CitzdGF0ZSBvZiB0aGUgbWFpbGJveC4gU2ltaWxhcmx5LCB3aGVuIGEgbWVzc2FnZSBpcyBhZGRlZCB0byBhIFxjbGFzc3tNYWlsYm94fQoraW5zdGFuY2UsIHRoZSBwcm92aWRlZCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uJ3MgY29udGVudHMgYXJlIGNvcGllZC4gSW4gbmVpdGhlcgorY2FzZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZSByZXByZXNlbnRhdGlvbiBrZXB0IGJ5IHRoZSBcY2xhc3N7TWFpbGJveH0KK2luc3RhbmNlLgorCitUaGUgZGVmYXVsdCBcY2xhc3N7TWFpbGJveH0gaXRlcmF0b3IgaXRlcmF0ZXMgb3ZlciBtZXNzYWdlIHJlcHJlc2VudGF0aW9ucywgbm90CitrZXlzIGFzIHRoZSBkZWZhdWx0IGRpY3Rpb25hcnkgaXRlcmF0b3IgZG9lcy4gTW9yZW92ZXIsIG1vZGlmaWNhdGlvbiBvZiBhCittYWlsYm94IGR1cmluZyBpdGVyYXRpb24gaXMgc2FmZSBhbmQgd2VsbC1kZWZpbmVkLiBNZXNzYWdlcyBhZGRlZCB0byB0aGUKK21haWxib3ggYWZ0ZXIgYW4gaXRlcmF0b3IgaXMgY3JlYXRlZCB3aWxsIG5vdCBiZSBzZWVuIGJ5IHRoZSBpdGVyYXRvci4gTWVzc2FnZXMKK3JlbW92ZWQgZnJvbSB0aGUgbWFpbGJveCBiZWZvcmUgdGhlIGl0ZXJhdG9yIHlpZWxkcyB0aGVtIHdpbGwgYmUgc2lsZW50bHkKK3NraXBwZWQsIHRob3VnaCB1c2luZyBhIGtleSBmcm9tIGFuIGl0ZXJhdG9yIG1heSByZXN1bHQgaW4gYQorXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaXMgc3Vic2VxdWVudGx5CityZW1vdmVkLgorCitcY2xhc3N7TWFpbGJveH0gaXRzZWxmIGlzIGludGVuZGVkIHRvIGRlZmluZSBhbiBpbnRlcmZhY2UgYW5kIHRvIGJlIGluaGVyaXRlZAorZnJvbSBieSBmb3JtYXQtc3BlY2lmaWMgc3ViY2xhc3NlcyBidXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4KK0luc3RlYWQsIHlvdSBzaG91bGQgaW5zdGFudGlhdGUgYSBzdWJjbGFzcy4KKworXGNsYXNze01haWxib3h9IGluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZH17bWVzc2FnZX0KK0FkZCBcdmFye21lc3NhZ2V9IHRvIHRoZSBtYWlsYm94IGFuZCByZXR1cm4gdGhlIGtleSB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkIHRvCitpdC4KKworUGFyYW1ldGVyIFx2YXJ7bWVzc2FnZX0gbWF5IGJlIGEgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlLCBhbgorXGNsYXNze2VtYWlsLk1lc3NhZ2UuTWVzc2FnZX0gaW5zdGFuY2UsIGEgc3RyaW5nLCBvciBhIGZpbGUtbGlrZSBvYmplY3QgKHdoaWNoCitzaG91bGQgYmUgb3BlbiBpbiB0ZXh0IG1vZGUpLiBJZiBcdmFye21lc3NhZ2V9IGlzIGFuIGluc3RhbmNlIG9mIHRoZQorYXBwcm9wcmlhdGUgZm9ybWF0LXNwZWNpZmljIFxjbGFzc3tNZXNzYWdlfSBzdWJjbGFzcyAoZS5nLiwgaWYgaXQncyBhbgorXGNsYXNze21ib3hNZXNzYWdlfSBpbnN0YW5jZSBhbmQgdGhpcyBpcyBhbiBcY2xhc3N7bWJveH0gaW5zdGFuY2UpLCBpdHMKK2Zvcm1hdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyB1c2VkLiBPdGhlcndpc2UsIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yCitmb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYXJlIHVzZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtyZW1vdmV9e2tleX0KK1xtZXRob2RsaW5le19fZGVsaXRlbV9ffXtrZXl9CitcbWV0aG9kbGluZXtkaXNjYXJkfXtrZXl9CitEZWxldGUgdGhlIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdmFye2tleX0gZnJvbSB0aGUgbWFpbGJveC4KKworSWYgbm8gc3VjaCBtZXNzYWdlIGV4aXN0cywgYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gaXMgcmFpc2VkIGlmIHRoZQorbWV0aG9kIHdhcyBjYWxsZWQgYXMgXG1ldGhvZHtyZW1vdmUoKX0gb3IgXG1ldGhvZHtfX2RlbGl0ZW1fXygpfSBidXQgbm8KK2V4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIGFzIFxtZXRob2R7ZGlzY2FyZCgpfS4gVGhlCitiZWhhdmlvciBvZiBcbWV0aG9ke2Rpc2NhcmQoKX0gbWF5IGJlIHByZWZlcnJlZCBpZiB0aGUgdW5kZXJseWluZyBtYWlsYm94Citmb3JtYXQgc3VwcG9ydHMgY29uY3VycmVudCBtb2RpZmljYXRpb24gYnkgb3RoZXIgcHJvY2Vzc2VzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317X19zZXRpdGVtX199e2tleSwgbWVzc2FnZX0KK1JlcGxhY2UgdGhlIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdmFye2tleX0gd2l0aCBcdmFye21lc3NhZ2V9LiBSYWlzZSBhCitcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gaWYgbm8gbWVzc2FnZSBhbHJlYWR5IGNvcnJlc3BvbmRzIHRvIFx2YXJ7a2V5fS4KKworQXMgd2l0aCBcbWV0aG9ke2FkZCgpfSwgcGFyYW1ldGVyIFx2YXJ7bWVzc2FnZX0gbWF5IGJlIGEgXGNsYXNze01lc3NhZ2V9CitpbnN0YW5jZSwgYW4gXGNsYXNze2VtYWlsLk1lc3NhZ2UuTWVzc2FnZX0gaW5zdGFuY2UsIGEgc3RyaW5nLCBvciBhIGZpbGUtbGlrZQorb2JqZWN0ICh3aGljaCBzaG91bGQgYmUgb3BlbiBpbiB0ZXh0IG1vZGUpLiBJZiBcdmFye21lc3NhZ2V9IGlzIGFuIGluc3RhbmNlIG9mCit0aGUgYXBwcm9wcmlhdGUgZm9ybWF0LXNwZWNpZmljIFxjbGFzc3tNZXNzYWdlfSBzdWJjbGFzcyAoZS5nLiwgaWYgaXQncyBhbgorXGNsYXNze21ib3hNZXNzYWdlfSBpbnN0YW5jZSBhbmQgdGhpcyBpcyBhbiBcY2xhc3N7bWJveH0gaW5zdGFuY2UpLCBpdHMKK2Zvcm1hdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyB1c2VkLiBPdGhlcndpc2UsIHRoZSBmb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24KK29mIHRoZSBtZXNzYWdlIHRoYXQgY3VycmVudGx5IGNvcnJlc3BvbmRzIHRvIFx2YXJ7a2V5fSBpcyBsZWZ0IHVuY2hhbmdlZC4gCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtpdGVya2V5c317fQorXG1ldGhvZGxpbmV7a2V5c317fQorUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIGtleXMgaWYgY2FsbGVkIGFzIFxtZXRob2R7aXRlcmtleXMoKX0gb3IgcmV0dXJuIGEKK2xpc3Qgb2Yga2V5cyBpZiBjYWxsZWQgYXMgXG1ldGhvZHtrZXlzKCl9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317aXRlcnZhbHVlc317fQorXG1ldGhvZGxpbmV7X19pdGVyX199e30KK1xtZXRob2RsaW5le3ZhbHVlc317fQorUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgcmVwcmVzZW50YXRpb25zIG9mIGFsbCBtZXNzYWdlcyBpZiBjYWxsZWQgYXMKK1xtZXRob2R7aXRlcnZhbHVlcygpfSBvciBcbWV0aG9ke19faXRlcl9fKCl9IG9yIHJldHVybiBhIGxpc3Qgb2Ygc3VjaAorcmVwcmVzZW50YXRpb25zIGlmIGNhbGxlZCBhcyBcbWV0aG9ke3ZhbHVlcygpfS4gVGhlIG1lc3NhZ2VzIGFyZSByZXByZXNlbnRlZCBhcworaW5zdGFuY2VzIG9mIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQtc3BlY2lmaWMgXGNsYXNze01lc3NhZ2V9IHN1YmNsYXNzIHVubGVzcyBhCitjdXN0b20gbWVzc2FnZSBmYWN0b3J5IHdhcyBzcGVjaWZpZWQgd2hlbiB0aGUgXGNsYXNze01haWxib3h9IGluc3RhbmNlIHdhcworaW5pdGlhbGl6ZWQuIFxub3Rle1RoZSBiZWhhdmlvciBvZiBcbWV0aG9ke19faXRlcl9fKCl9IGlzIHVubGlrZSB0aGF0IG9mCitkaWN0aW9uYXJpZXMsIHdoaWNoIGl0ZXJhdGUgb3ZlciBrZXlzLn0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2l0ZXJpdGVtc317fQorXG1ldGhvZGxpbmV7aXRlbXN9e30KK1JldHVybiBhbiBpdGVyYXRvciBvdmVyIChcdmFye2tleX0sIFx2YXJ7bWVzc2FnZX0pIHBhaXJzLCB3aGVyZSBcdmFye2tleX0gaXMgYQora2V5IGFuZCBcdmFye21lc3NhZ2V9IGlzIGEgbWVzc2FnZSByZXByZXNlbnRhdGlvbiwgaWYgY2FsbGVkIGFzCitcbWV0aG9ke2l0ZXJpdGVtcygpfSBvciByZXR1cm4gYSBsaXN0IG9mIHN1Y2ggcGFpcnMgaWYgY2FsbGVkIGFzCitcbWV0aG9ke2l0ZW1zKCl9LiBUaGUgbWVzc2FnZXMgYXJlIHJlcHJlc2VudGVkIGFzIGluc3RhbmNlcyBvZiB0aGUgYXBwcm9wcmlhdGUKK2Zvcm1hdC1zcGVjaWZpYyBcY2xhc3N7TWVzc2FnZX0gc3ViY2xhc3MgdW5sZXNzIGEgY3VzdG9tIG1lc3NhZ2UgZmFjdG9yeSB3YXMKK3NwZWNpZmllZCB3aGVuIHRoZSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2Ugd2FzIGluaXRpYWxpemVkLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0fXtrZXlcb3B0aW9uYWx7LCBkZWZhdWx0PU5vbmV9fQorXG1ldGhvZGxpbmV7X19nZXRpdGVtX199e2tleX0KK1JldHVybiBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gXHZhcntrZXl9LiBJZiBubyBzdWNoCittZXNzYWdlIGV4aXN0cywgXHZhcntkZWZhdWx0fSBpcyByZXR1cm5lZCBpZiB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgYXMKK1xtZXRob2R7Z2V0KCl9IGFuZCBhIFxleGNlcHRpb257S2V5RXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIG1ldGhvZCB3YXMKK2NhbGxlZCBhcyBcbWV0aG9ke19fZ2V0aXRlbV9fKCl9LiBUaGUgbWVzc2FnZSBpcyByZXByZXNlbnRlZCBhcyBhbiBpbnN0YW5jZSBvZgordGhlIGFwcHJvcHJpYXRlIGZvcm1hdC1zcGVjaWZpYyBcY2xhc3N7TWVzc2FnZX0gc3ViY2xhc3MgdW5sZXNzIGEgY3VzdG9tCittZXNzYWdlIGZhY3Rvcnkgd2FzIHNwZWNpZmllZCB3aGVuIHRoZSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2Ugd2FzCitpbml0aWFsaXplZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9tZXNzYWdlfXtrZXl9CitSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIFx2YXJ7a2V5fSBhcyBhbgoraW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdC1zcGVjaWZpYyBcY2xhc3N7TWVzc2FnZX0gc3ViY2xhc3MsIG9yIHJhaXNlCithIFxleGNlcHRpb257S2V5RXJyb3J9IGV4Y2VwdGlvbiBpZiBubyBzdWNoIG1lc3NhZ2UgZXhpc3RzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X3N0cmluZ317a2V5fQorUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gXHZhcntrZXl9LCBvcgorcmFpc2UgYSBcZXhjZXB0aW9ue0tleUVycm9yfSBleGNlcHRpb24gaWYgbm8gc3VjaCBtZXNzYWdlIGV4aXN0cy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9maWxlfXtrZXl9CitSZXR1cm4gYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdmFye2tleX0sCitvciByYWlzZSBhIFxleGNlcHRpb257S2V5RXJyb3J9IGV4Y2VwdGlvbiBpZiBubyBzdWNoIG1lc3NhZ2UgZXhpc3RzLiBUaGUKK2ZpbGUtbGlrZSBvYmplY3QgYmVoYXZlcyBhcyBpZiBvcGVuIGluIGJpbmFyeSBtb2RlLiBUaGlzIGZpbGUgc2hvdWxkIGJlIGNsb3NlZAorb25jZSBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorCitcbm90ZXtVbmxpa2Ugb3RoZXIgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzLCBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb25zIGFyZQorbm90IG5lY2Vzc2FyaWx5IGluZGVwZW5kZW50IG9mIHRoZSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2UgdGhhdCBjcmVhdGVkIHRoZW0KK29yIG9mIHRoZSB1bmRlcmx5aW5nIG1haWxib3guIE1vcmUgc3BlY2lmaWMgZG9jdW1lbnRhdGlvbiBpcyBwcm92aWRlZCBieSBlYWNoCitzdWJjbGFzcy59CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtoYXNfa2V5fXtrZXl9CitcbWV0aG9kbGluZXtfX2NvbnRhaW5zX199e2tleX0KK1JldHVybiBcY29kZXtUcnVlfSBpZiBcdmFye2tleX0gY29ycmVzcG9uZHMgdG8gYSBtZXNzYWdlLCBcY29kZXtGYWxzZX0KK290aGVyd2lzZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e19fbGVuX199e30KK1JldHVybiBhIGNvdW50IG9mIG1lc3NhZ2VzIGluIHRoZSBtYWlsYm94LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Y2xlYXJ9e30KK0RlbGV0ZSBhbGwgbWVzc2FnZXMgZnJvbSB0aGUgbWFpbGJveC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3BvcH17a2V5XG9wdGlvbmFseywgZGVmYXVsdH19CitSZXR1cm4gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIFx2YXJ7a2V5fSBhbmQgZGVsZXRlCit0aGUgbWVzc2FnZS4gSWYgbm8gc3VjaCBtZXNzYWdlIGV4aXN0cywgcmV0dXJuIFx2YXJ7ZGVmYXVsdH0gaWYgaXQgd2FzIHN1cHBsaWVkCitvciBlbHNlIHJhaXNlIGEgXGV4Y2VwdGlvbntLZXlFcnJvcn0gZXhjZXB0aW9uLiBUaGUgbWVzc2FnZSBpcyByZXByZXNlbnRlZCBhcworYW4gaW5zdGFuY2Ugb2YgdGhlIGFwcHJvcHJpYXRlIGZvcm1hdC1zcGVjaWZpYyBcY2xhc3N7TWVzc2FnZX0gc3ViY2xhc3MgdW5sZXNzCithIGN1c3RvbSBtZXNzYWdlIGZhY3Rvcnkgd2FzIHNwZWNpZmllZCB3aGVuIHRoZSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2Ugd2FzCitpbml0aWFsaXplZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3BvcGl0ZW19e30KK1JldHVybiBhbiBhcmJpdHJhcnkgKFx2YXJ7a2V5fSwgXHZhcnttZXNzYWdlfSkgcGFpciwgd2hlcmUgXHZhcntrZXl9IGlzIGEga2V5CithbmQgXHZhcnttZXNzYWdlfSBpcyBhIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24sIGFuZCBkZWxldGUgdGhlIGNvcnJlc3BvbmRpbmcKK21lc3NhZ2UuIElmIHRoZSBtYWlsYm94IGlzIGVtcHR5LCByYWlzZSBhIFxleGNlcHRpb257S2V5RXJyb3J9IGV4Y2VwdGlvbi4gVGhlCittZXNzYWdlIGlzIHJlcHJlc2VudGVkIGFzIGFuIGluc3RhbmNlIG9mIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQtc3BlY2lmaWMKK1xjbGFzc3tNZXNzYWdlfSBzdWJjbGFzcyB1bmxlc3MgYSBjdXN0b20gbWVzc2FnZSBmYWN0b3J5IHdhcyBzcGVjaWZpZWQgd2hlbiB0aGUKK1xjbGFzc3tNYWlsYm94fSBpbnN0YW5jZSB3YXMgaW5pdGlhbGl6ZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXt1cGRhdGV9e2FyZ30KK1BhcmFtZXRlciBcdmFye2FyZ30gc2hvdWxkIGJlIGEgXHZhcntrZXl9LXRvLVx2YXJ7bWVzc2FnZX0gbWFwcGluZyBvciBhbgoraXRlcmFibGUgb2YgKFx2YXJ7a2V5fSwgXHZhcnttZXNzYWdlfSkgcGFpcnMuIFVwZGF0ZXMgdGhlIG1haWxib3ggc28gdGhhdCwgZm9yCitlYWNoIGdpdmVuIFx2YXJ7a2V5fSBhbmQgXHZhcnttZXNzYWdlfSwgdGhlIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdmFye2tleX0KK2lzIHNldCB0byBcdmFye21lc3NhZ2V9IGFzIGlmIGJ5IHVzaW5nIFxtZXRob2R7X19zZXRpdGVtX18oKX0uIEFzIHdpdGgKK1xtZXRob2R7X19zZXRpdGVtX18oKX0sIGVhY2ggXHZhcntrZXl9IG11c3QgYWxyZWFkeSBjb3JyZXNwb25kIHRvIGEgbWVzc2FnZSBpbgordGhlIG1haWxib3ggb3IgZWxzZSBhIFxleGNlcHRpb257S2V5RXJyb3J9IGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCwgc28gaW4KK2dlbmVyYWwgaXQgaXMgaW5jb3JyZWN0IGZvciBcdmFye2FyZ30gdG8gYmUgYSBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2UuCitcbm90ZXtVbmxpa2Ugd2l0aCBkaWN0aW9uYXJpZXMsIGtleXdvcmQgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLn0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2ZsdXNofXt9CitXcml0ZSBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIHRoZSBmaWxlc3lzdGVtLiBGb3Igc29tZSBcY2xhc3N7TWFpbGJveH0KK3N1YmNsYXNzZXMsIGNoYW5nZXMgYXJlIGFsd2F5cyB3cml0dGVuIGltbWVkaWF0ZWx5IGFuZCB0aGlzIG1ldGhvZCBkb2VzCitub3RoaW5nLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317bG9ja317fQorQWNxdWlyZSBhbiBleGNsdXNpdmUgYWR2aXNvcnkgbG9jayBvbiB0aGUgbWFpbGJveCBzbyB0aGF0IG90aGVyIHByb2Nlc3NlcyBrbm93Citub3QgdG8gbW9kaWZ5IGl0LiBBbiBcZXhjZXB0aW9ue0V4dGVybmFsQ2xhc2hFcnJvcn0gaXMgcmFpc2VkIGlmIHRoZSBsb2NrIGlzCitub3QgYXZhaWxhYmxlLiBUaGUgcGFydGljdWxhciBsb2NraW5nIG1lY2hhbmlzbXMgdXNlZCBkZXBlbmQgdXBvbiB0aGUgbWFpbGJveAorZm9ybWF0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317dW5sb2NrfXt9CitSZWxlYXNlIHRoZSBsb2NrIG9uIHRoZSBtYWlsYm94LCBpZiBhbnkuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtjbG9zZX17fQorRmx1c2ggdGhlIG1haWxib3gsIHVubG9jayBpdCBpZiBuZWNlc3NhcnksIGFuZCBjbG9zZSBhbnkgb3BlbiBmaWxlcy4gRm9yIHNvbWUKK1xjbGFzc3tNYWlsYm94fSBzdWJjbGFzc2VzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCitcZW5ke21ldGhvZGRlc2N9CisKKworXHN1YnN1YnNlY3Rpb257XGNsYXNze01haWxkaXJ9fQorXGxhYmVse21haWxib3gtbWFpbGRpcn0KKworXGJlZ2lue2NsYXNzZGVzY317TWFpbGRpcn17ZGlybmFtZVxvcHRpb25hbHssIGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2Vcb3B0aW9uYWx7LAorY3JlYXRlPVRydWV9fX0KK0Egc3ViY2xhc3Mgb2YgXGNsYXNze01haWxib3h9IGZvciBtYWlsYm94ZXMgaW4gTWFpbGRpciBmb3JtYXQuIFBhcmFtZXRlcgorXHZhcntmYWN0b3J5fSBpcyBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBmaWxlLWxpa2UgbWVzc2FnZQorcmVwcmVzZW50YXRpb24gKHdoaWNoIGJlaGF2ZXMgYXMgaWYgb3BlbmVkIGluIGJpbmFyeSBtb2RlKSBhbmQgcmV0dXJucyBhIGN1c3RvbQorcmVwcmVzZW50YXRpb24uIElmIFx2YXJ7ZmFjdG9yeX0gaXMgXGNvZGV7Tm9uZX0sIFxjbGFzc3tNYWlsZGlyTWVzc2FnZX0gaXMgdXNlZAorYXMgdGhlIGRlZmF1bHQgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gSWYgXHZhcntjcmVhdGV9IGlzIFxjb2Rle1RydWV9LCB0aGUKK21haWxib3ggaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKworSXQgaXMgZm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGF0IFx2YXJ7ZmFjdG9yeX0gZGVmYXVsdHMgdG8KK1xjbGFzc3tyZmM4MjIuTWVzc2FnZX0gYW5kIHRoYXQgXHZhcntkaXJuYW1lfSBpcyBuYW1lZCBhcyBzdWNoIHJhdGhlciB0aGFuCitcdmFye3BhdGh9LiBGb3IgYSBcY2xhc3N7TWFpbGRpcn0gaW5zdGFuY2UgdGhhdCBiZWhhdmVzIGxpa2UgaW5zdGFuY2VzIG9mIG90aGVyCitcY2xhc3N7TWFpbGJveH0gc3ViY2xhc3Nlcywgc2V0IFx2YXJ7ZmFjdG9yeX0gdG8gXGNvZGV7Tm9uZX0uCitcZW5ke2NsYXNzZGVzY30KKworTWFpbGRpciBpcyBhIGRpcmVjdG9yeS1iYXNlZCBtYWlsYm94IGZvcm1hdCBpbnZlbnRlZCBmb3IgdGhlIHFtYWlsIG1haWwKK3RyYW5zZmVyIGFnZW50IGFuZCBub3cgd2lkZWx5IHN1cHBvcnRlZCBieSBvdGhlciBwcm9ncmFtcy4gTWVzc2FnZXMgaW4gYQorTWFpbGRpciBtYWlsYm94IGFyZSBzdG9yZWQgaW4gc2VwYXJhdGUgZmlsZXMgd2l0aGluIGEgY29tbW9uIGRpcmVjdG9yeQorc3RydWN0dXJlLiBUaGlzIGRlc2lnbiBhbGxvd3MgTWFpbGRpciBtYWlsYm94ZXMgdG8gYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkIGJ5CittdWx0aXBsZSB1bnJlbGF0ZWQgcHJvZ3JhbXMgd2l0aG91dCBkYXRhIGNvcnJ1cHRpb24sIHNvIGZpbGUgbG9ja2luZyBpcwordW5uZWNlc3NhcnkuCisKK01haWxkaXIgbWFpbGJveGVzIGNvbnRhaW4gdGhyZWUgc3ViZGlyZWN0b3JpZXMsIG5hbWVseTogXGZpbGV7dG1wfSwgXGZpbGV7bmV3fSwKK2FuZCBcZmlsZXtjdXJ9LiBNZXNzYWdlcyBhcmUgY3JlYXRlZCBtb21lbnRhcmlseSBpbiB0aGUgXGZpbGV7dG1wfSBzdWJkaXJlY3RvcnkKK2FuZCB0aGVuIG1vdmVkIHRvIHRoZSBcZmlsZXtuZXd9IHN1YmRpcmVjdG9yeSB0byBmaW5hbGl6ZSBkZWxpdmVyeS4gQSBtYWlsIHVzZXIKK2FnZW50IG1heSBzdWJzZXF1ZW50bHkgbW92ZSB0aGUgbWVzc2FnZSB0byB0aGUgXGZpbGV7Y3VyfSBzdWJkaXJlY3RvcnkgYW5kCitzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIG1lc3NhZ2UgaW4gYSBzcGVjaWFsICJpbmZvIiBzZWN0aW9uCithcHBlbmRlZCB0byBpdHMgZmlsZSBuYW1lLgorCitGb2xkZXJzIG9mIHRoZSBzdHlsZSBpbnRyb2R1Y2VkIGJ5IHRoZSBDb3VyaWVyIG1haWwgdHJhbnNmZXIgYWdlbnQgYXJlIGFsc28KK3N1cHBvcnRlZC4gQW55IHN1YmRpcmVjdG9yeSBvZiB0aGUgbWFpbiBtYWlsYm94IGlzIGNvbnNpZGVyZWQgYSBmb2xkZXIgaWYKK1xjaGFyYWN0ZXJ7Ln0gaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBpdHMgbmFtZS4gRm9sZGVyIG5hbWVzIGFyZSByZXByZXNlbnRlZAorYnkgXGNsYXNze01haWxkaXJ9IHdpdGhvdXQgdGhlIGxlYWRpbmcgXGNoYXJhY3RlcnsufS4gRWFjaCBmb2xkZXIgaXMgaXRzZWxmIGEKK01haWxkaXIgbWFpbGJveCBidXQgc2hvdWxkIG5vdCBjb250YWluIG90aGVyIGZvbGRlcnMuIEluc3RlYWQsIGEgbG9naWNhbAorbmVzdGluZyBpcyBpbmRpY2F0ZWQgdXNpbmcgXGNoYXJhY3RlcnsufSB0byBkZWxpbWl0IGxldmVscywgZS5nLiwKKyJBcmNoaXZlZC4yMDA1LjA3Ii4KKworXGJlZ2lue25vdGljZX0KK1RoZSBNYWlsZGlyIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdGhlIHVzZSBvZiBhIGNvbG9uIChcY2hhcmFjdGVyezp9KSBpbgorY2VydGFpbiBtZXNzYWdlIGZpbGUgbmFtZXMuIEhvd2V2ZXIsIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgZG8gbm90IHBlcm1pdCB0aGlzCitjaGFyYWN0ZXIgaW4gZmlsZSBuYW1lcywgSWYgeW91IHdpc2ggdG8gdXNlIGEgTWFpbGRpci1saWtlIGZvcm1hdCBvbiBzdWNoIGFuCitvcGVyYXRpbmcgc3lzdGVtLCB5b3Ugc2hvdWxkIHNwZWNpZnkgYW5vdGhlciBjaGFyYWN0ZXIgdG8gdXNlIGluc3RlYWQuIFRoZQorZXhjbGFtYXRpb24gcG9pbnQgKFxjaGFyYWN0ZXJ7IX0pIGlzIGEgcG9wdWxhciBjaG9pY2UuIEZvciBleGFtcGxlOgorXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IG1haWxib3gKK21haWxib3guTWFpbGRpci5jb2xvbiA9ICchJworXGVuZHt2ZXJiYXRpbX0KK1RoZSBcbWVtYmVye2NvbG9ufSBhdHRyaWJ1dGUgbWF5IGFsc28gYmUgc2V0IG9uIGEgcGVyLWluc3RhbmNlIGJhc2lzLgorXGVuZHtub3RpY2V9CisKK1xjbGFzc3tNYWlsZGlyfSBpbnN0YW5jZXMgaGF2ZSBhbGwgb2YgdGhlIG1ldGhvZHMgb2YgXGNsYXNze01haWxib3h9IGluCithZGRpdGlvbiB0byB0aGUgZm9sbG93aW5nOgorCitcYmVnaW57bWV0aG9kZGVzY317bGlzdF9mb2xkZXJzfXt9CitSZXR1cm4gYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgZm9sZGVycy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9mb2xkZXJ9e2ZvbGRlcn0KK1JldHVybiBhIFxjbGFzc3tNYWlsZGlyfSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGZvbGRlciB3aG9zZSBuYW1lIGlzCitcdmFye2ZvbGRlcn0uIEEgXGV4Y2VwdGlvbntOb1N1Y2hNYWlsYm94RXJyb3J9IGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlCitmb2xkZXIgZG9lcyBub3QgZXhpc3QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXthZGRfZm9sZGVyfXtmb2xkZXJ9CitDcmVhdGUgYSBmb2xkZXIgd2hvc2UgbmFtZSBpcyBcdmFye2ZvbGRlcn0gYW5kIHJldHVybiBhIFxjbGFzc3tNYWlsZGlyfQoraW5zdGFuY2UgcmVwcmVzZW50aW5nIGl0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlX2ZvbGRlcn17Zm9sZGVyfQorRGVsZXRlIHRoZSBmb2xkZXIgd2hvc2UgbmFtZSBpcyBcdmFye2ZvbGRlcn0uIElmIHRoZSBmb2xkZXIgY29udGFpbnMgYW55CittZXNzYWdlcywgYSBcZXhjZXB0aW9ue05vdEVtcHR5RXJyb3J9IGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBhbmQgdGhlIGZvbGRlcgord2lsbCBub3QgYmUgZGVsZXRlZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2NsZWFufXt9CitEZWxldGUgdGVtcG9yYXJ5IGZpbGVzIGZyb20gdGhlIG1haWxib3ggdGhhdCBoYXZlIG5vdCBiZWVuIGFjY2Vzc2VkIGluIHRoZQorbGFzdCAzNiBob3Vycy4gVGhlIE1haWxkaXIgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgbWFpbC1yZWFkaW5nIHByb2dyYW1zCitzaG91bGQgZG8gdGhpcyBvY2Nhc2lvbmFsbHkuCitcZW5ke21ldGhvZGRlc2N9CisKK1NvbWUgXGNsYXNze01haWxib3h9IG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgXGNsYXNze01haWxkaXJ9IGRlc2VydmUgc3BlY2lhbAorcmVtYXJrczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZH17bWVzc2FnZX0KK1xtZXRob2RsaW5lW01haWxkaXJde19fc2V0aXRlbV9ffXtrZXksIG1lc3NhZ2V9CitcbWV0aG9kbGluZVtNYWlsZGlyXXt1cGRhdGV9e2FyZ30KK1x3YXJuaW5ne1RoZXNlIG1ldGhvZHMgZ2VuZXJhdGUgdW5pcXVlIGZpbGUgbmFtZXMgYmFzZWQgdXBvbiB0aGUgY3VycmVudAorcHJvY2VzcyBJRC4gV2hlbiB1c2luZyBtdWx0aXBsZSB0aHJlYWRzLCB1bmRldGVjdGVkIG5hbWUgY2xhc2hlcyBtYXkgb2NjdXIgYW5kCitjYXVzZSBjb3JydXB0aW9uIG9mIHRoZSBtYWlsYm94IHVubGVzcyB0aHJlYWRzIGFyZSBjb29yZGluYXRlZCB0byBhdm9pZCB1c2luZwordGhlc2UgbWV0aG9kcyB0byBtYW5pcHVsYXRlIHRoZSBzYW1lIG1haWxib3ggc2ltdWx0YW5lb3VzbHkufQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Zmx1c2h9e30KK0FsbCBjaGFuZ2VzIHRvIE1haWxkaXIgbWFpbGJveGVzIGFyZSBpbW1lZGlhdGVseSBhcHBsaWVkLCBzbyB0aGlzIG1ldGhvZCBkb2VzCitub3RoaW5nLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317bG9ja317fQorXG1ldGhvZGxpbmV7dW5sb2NrfXt9CitNYWlsZGlyIG1haWxib3hlcyBkbyBub3Qgc3VwcG9ydCAob3IgcmVxdWlyZSkgbG9ja2luZywgc28gdGhlc2UgbWV0aG9kcyBkbworbm90aGluZy4gCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtjbG9zZX17fQorXGNsYXNze01haWxkaXJ9IGluc3RhbmNlcyBkbyBub3Qga2VlcCBhbnkgb3BlbiBmaWxlcyBhbmQgdGhlIHVuZGVybHlpbmcKK21haWxib3hlcyBkbyBub3Qgc3VwcG9ydCBsb2NraW5nLCBzbyB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfZmlsZX17a2V5fQorRGVwZW5kaW5nIHVwb24gdGhlIGhvc3QgcGxhdGZvcm0sIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gbW9kaWZ5IG9yIHJlbW92ZQordGhlIHVuZGVybHlpbmcgbWVzc2FnZSB3aGlsZSB0aGUgcmV0dXJuZWQgZmlsZSByZW1haW5zIG9wZW4uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorICAgIFxzZWVsaW5re2h0dHA6Ly93d3cucW1haWwub3JnL21hbi9tYW41L21haWxkaXIuaHRtbH17bWFpbGRpciBtYW4gcGFnZSBmcm9tCisgICAgcW1haWx9e1RoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmb3JtYXQufQorICAgIFxzZWVsaW5re2h0dHA6Ly9jci55cC50by9wcm90by9tYWlsZGlyLmh0bWx9e1VzaW5nIG1haWxkaXIgZm9ybWF0fXtOb3RlcworICAgIG9uIE1haWxkaXIgYnkgaXRzIGludmVudG9yLiBJbmNsdWRlcyBhbiB1cGRhdGVkIG5hbWUtY3JlYXRpb24gc2NoZW1lIGFuZAorICAgIGRldGFpbHMgb24gImluZm8iIHNlbWFudGljcy59CisgICAgXHNlZWxpbmt7aHR0cDovL3d3dy5jb3VyaWVyLW10YS5vcmcvP21haWxkaXIuaHRtbH17bWFpbGRpciBtYW4gcGFnZSBmcm9tCisgICAgQ291cmllcn17QW5vdGhlciBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmb3JtYXQuIERlc2NyaWJlcyBhIGNvbW1vbiBleHRlbnNpb24KKyAgICBmb3Igc3VwcG9ydGluZyBmb2xkZXJzLn0KK1xlbmR7c2VlYWxzb30KKworXHN1YnN1YnNlY3Rpb257XGNsYXNze21ib3h9fQorXGxhYmVse21haWxib3gtbWJveH0KKworXGJlZ2lue2NsYXNzZGVzY317bWJveH17cGF0aFxvcHRpb25hbHssIGZhY3Rvcnk9Tm9uZVxvcHRpb25hbHssIGNyZWF0ZT1UcnVlfX19CitBIHN1YmNsYXNzIG9mIFxjbGFzc3tNYWlsYm94fSBmb3IgbWFpbGJveGVzIGluIG1ib3ggZm9ybWF0LiBQYXJhbWV0ZXIKK1x2YXJ7ZmFjdG9yeX0gaXMgYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBhY2NlcHRzIGEgZmlsZS1saWtlIG1lc3NhZ2UKK3JlcHJlc2VudGF0aW9uICh3aGljaCBiZWhhdmVzIGFzIGlmIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSkgYW5kIHJldHVybnMgYSBjdXN0b20KK3JlcHJlc2VudGF0aW9uLiBJZiBcdmFye2ZhY3Rvcnl9IGlzIFxjb2Rle05vbmV9LCBcY2xhc3N7bWJveE1lc3NhZ2V9IGlzIHVzZWQgYXMKK3RoZSBkZWZhdWx0IG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uIElmIFx2YXJ7Y3JlYXRlfSBpcyBcY29kZXtUcnVlfSwgdGhlIG1haWxib3gKK2lzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCitcZW5ke2NsYXNzZGVzY30KKworVGhlIG1ib3ggZm9ybWF0IGlzIHRoZSBjbGFzc2ljIGZvcm1hdCBmb3Igc3RvcmluZyBtYWlsIG9uIFxVTklYe30gc3lzdGVtcy4gQWxsCittZXNzYWdlcyBpbiBhbiBtYm94IG1haWxib3ggYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBmaWxlIHdpdGggdGhlIGJlZ2lubmluZyBvZgorZWFjaCBtZXNzYWdlIGluZGljYXRlZCBieSBhIGxpbmUgd2hvc2UgZmlyc3QgZml2ZSBjaGFyYWN0ZXJzIGFyZSAiRnJvbX4iLgorCitTZXZlcmFsIHZhcmlhdGlvbnMgb2YgdGhlIG1ib3ggZm9ybWF0IGV4aXN0IHRvIGFkZHJlc3MgcGVyY2VpdmVkIHNob3J0Y29taW5ncworaW4gdGhlIG9yaWdpbmFsLiBJbiB0aGUgaW50ZXJlc3Qgb2YgY29tcGF0aWJpbGl0eSwgXGNsYXNze21ib3h9IGltcGxlbWVudHMgdGhlCitvcmlnaW5hbCBmb3JtYXQsIHdoaWNoIGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBcZGZue21ib3hvfS4gVGhpcyBtZWFucyB0aGF0Cit0aGUgXG1haWxoZWFkZXJ7Q29udGVudC1MZW5ndGh9IGhlYWRlciwgaWYgcHJlc2VudCwgaXMgaWdub3JlZCBhbmQgdGhhdCBhbnkKK29jY3VycmVuY2VzIG9mICJGcm9tfiIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgaW4gYSBtZXNzYWdlIGJvZHkgYXJlCit0cmFuc2Zvcm1lZCB0byAiPkZyb21+IiB3aGVuIHN0b3JpbmcgdGhlIG1lc3NhZ2UsIGFsdGhvdWdoIG9jY3VyZW5jZXMgb2YKKyI+RnJvbX4iIGFyZSBub3QgdHJhbnNmb3JtZWQgdG8gIkZyb21+IiB3aGVuIHJlYWRpbmcgdGhlIG1lc3NhZ2UuCisKK1NvbWUgXGNsYXNze01haWxib3h9IG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgXGNsYXNze21ib3h9IGRlc2VydmUgc3BlY2lhbAorcmVtYXJrczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9maWxlfXtrZXl9CitVc2luZyB0aGUgZmlsZSBhZnRlciBjYWxsaW5nIFxtZXRob2R7Zmx1c2goKX0gb3IgXG1ldGhvZHtjbG9zZSgpfSBvbiB0aGUKK1xjbGFzc3ttYm94fSBpbnN0YW5jZSBtYXkgeWllbGQgdW5wcmVkaWN0YWJsZSByZXN1bHRzIG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2xvY2t9e30KK1xtZXRob2RsaW5le3VubG9ja317fQorVGhyZWUgbG9ja2luZyBtZWNoYW5pc21zIGFyZSB1c2VkLS0tZG90IGxvY2tpbmcgYW5kLCBpZiBhdmFpbGFibGUsIHRoZQorXGNmdW5jdGlvbntmbG9jaygpfSBhbmQgXGNmdW5jdGlvbntsb2NrZigpfSBzeXN0ZW0gY2FsbHMuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorICAgIFxzZWVsaW5re2h0dHA6Ly93d3cucW1haWwub3JnL21hbi9tYW41L21ib3guaHRtbH17bWJveCBtYW4gcGFnZSBmcm9tCisgICAgcW1haWx9e0Egc3BlY2lmaWNhdGlvbiBvZiB0aGUgZm9ybWF0IGFuZCBpdHMgdmFyaWF0aW9ucy59CisgICAgXHNlZWxpbmt7aHR0cDovL3d3dy50aW4ub3JnL2Jpbi9tYW4uY2dpP3NlY3Rpb249NVwmdG9waWM9bWJveH17bWJveCBtYW4KKyAgICBwYWdlIGZyb20gdGlufXtBbm90aGVyIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm1hdCwgd2l0aCBkZXRhaWxzIG9uCisgICAgbG9ja2luZy59CisgICAgXHNlZWxpbmt7aHR0cDovL2hvbWUubmV0c2NhcGUuY29tL2VuZy9tb3ppbGxhLzIuMC9yZWxub3Rlcy9kZW1vL2NvbnRlbnQtbGVuZ3RoLmh0bWx9CisgICAge0NvbmZpZ3VyaW5nIE5ldHNjYXBlIE1haWwgb24gXFVOSVh7fTogV2h5IFRoZSBDb250ZW50LUxlbmd0aCBGb3JtYXQgaXMKKyAgICBCYWR9e0FuIGFyZ3VtZW50IGZvciB1c2luZyB0aGUgb3JpZ2luYWwgbWJveCBmb3JtYXQgcmF0aGVyIHRoYW4gYQorICAgIHZhcmlhdGlvbi59CisgICAgXHNlZWxpbmt7aHR0cDovL2hvbWVwYWdlcy50ZXNjby5uZXQuL1x0aWxkZXt9Si5kZUJveW5lUG9sbGFyZC9GR0EvbWFpbC1tYm94LWZvcm1hdHMuaHRtbH0KKyAgICB7Im1ib3giIGlzIGEgZmFtaWx5IG9mIHNldmVyYWwgbXV0dWFsbHkgaW5jb21wYXRpYmxlIG1haWxib3ggZm9ybWF0c317QQorICAgIGhpc3Rvcnkgb2YgbWJveCB2YXJpYXRpb25zLn0KK1xlbmR7c2VlYWxzb30KKworXHN1YnN1YnNlY3Rpb257XGNsYXNze01IfX0KK1xsYWJlbHttYWlsYm94LW1ofQorCitcYmVnaW57Y2xhc3NkZXNjfXtNSH17cGF0aFxvcHRpb25hbHssIGZhY3Rvcnk9Tm9uZVxvcHRpb25hbHssIGNyZWF0ZT1UcnVlfX19CitBIHN1YmNsYXNzIG9mIFxjbGFzc3tNYWlsYm94fSBmb3IgbWFpbGJveGVzIGluIE1IIGZvcm1hdC4gUGFyYW1ldGVyCitcdmFye2ZhY3Rvcnl9IGlzIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgYWNjZXB0cyBhIGZpbGUtbGlrZSBtZXNzYWdlCityZXByZXNlbnRhdGlvbiAod2hpY2ggYmVoYXZlcyBhcyBpZiBvcGVuZWQgaW4gYmluYXJ5IG1vZGUpIGFuZCByZXR1cm5zIGEgY3VzdG9tCityZXByZXNlbnRhdGlvbi4gSWYgXHZhcntmYWN0b3J5fSBpcyBcY29kZXtOb25lfSwgXGNsYXNze01ITWVzc2FnZX0gaXMgdXNlZCBhcwordGhlIGRlZmF1bHQgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gSWYgXHZhcntjcmVhdGV9IGlzIFxjb2Rle1RydWV9LCB0aGUgbWFpbGJveAoraXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KK1xlbmR7Y2xhc3NkZXNjfQorCitNSCBpcyBhIGRpcmVjdG9yeS1iYXNlZCBtYWlsYm94IGZvcm1hdCBpbnZlbnRlZCBmb3IgdGhlIE1IIE1lc3NhZ2UgSGFuZGxpbmcKK1N5c3RlbSwgYSBtYWlsIHVzZXIgYWdlbnQuIEVhY2ggbWVzc2FnZSBpbiBhbiBNSCBtYWlsYm94IHJlc2lkZXMgaW4gaXRzIG93bgorZmlsZS4gQW4gTUggbWFpbGJveCBtYXkgY29udGFpbiBvdGhlciBNSCBtYWlsYm94ZXMgKGNhbGxlZCBcZGZue2ZvbGRlcnN9KSBpbgorYWRkaXRpb24gdG8gbWVzc2FnZXMuIEZvbGRlcnMgbWF5IGJlIG5lc3RlZCBpbmRlZmluaXRlbHkuIE1IIG1haWxib3hlcyBhbHNvCitzdXBwb3J0IFxkZm57c2VxdWVuY2VzfSwgd2hpY2ggYXJlIG5hbWVkIGxpc3RzIHVzZWQgdG8gbG9naWNhbGx5IGdyb3VwIG1lc3NhZ2VzCit3aXRob3V0IG1vdmluZyB0aGVtIHRvIHN1Yi1mb2xkZXJzLiBTZXF1ZW5jZXMgYXJlIGRlZmluZWQgaW4gYSBmaWxlIGNhbGxlZAorXGZpbGV7Lm1oX3NlcXVlbmNlc30gaW4gZWFjaCBmb2xkZXIuCisKK1RoZSBcY2xhc3N7TUh9IGNsYXNzIG1hbmlwdWxhdGVzIE1IIG1haWxib3hlcywgYnV0IGl0IGRvZXMgbm90IGF0dGVtcHQgdG8KK2VtdWxhdGUgYWxsIG9mIFxwcm9ncmFte21ofSdzIGJlaGF2aW9ycy4gSW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgbW9kaWZ5IGFuZAoraXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBcZmlsZXtjb250ZXh0fSBvciBcZmlsZXsubWhfcHJvZmlsZX0gZmlsZXMgdGhhdCBhcmUgdXNlZAorYnkgXHByb2dyYW17bWh9IHRvIHN0b3JlIGl0cyBzdGF0ZSBhbmQgY29uZmlndXJhdGlvbi4KKworXGNsYXNze01IfSBpbnN0YW5jZXMgaGF2ZSBhbGwgb2YgdGhlIG1ldGhvZHMgb2YgXGNsYXNze01haWxib3h9IGluIGFkZGl0aW9uIHRvCit0aGUgZm9sbG93aW5nOgorCitcYmVnaW57bWV0aG9kZGVzY317bGlzdF9mb2xkZXJzfXt9CitSZXR1cm4gYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgZm9sZGVycy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9mb2xkZXJ9e2ZvbGRlcn0KK1JldHVybiBhbiBcY2xhc3N7TUh9IGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgZm9sZGVyIHdob3NlIG5hbWUgaXMKK1x2YXJ7Zm9sZGVyfS4gQSBcZXhjZXB0aW9ue05vU3VjaE1haWxib3hFcnJvcn0gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUKK2ZvbGRlciBkb2VzIG5vdCBleGlzdC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9mb2xkZXJ9e2ZvbGRlcn0KK0NyZWF0ZSBhIGZvbGRlciB3aG9zZSBuYW1lIGlzIFx2YXJ7Zm9sZGVyfSBhbmQgcmV0dXJuIGFuIFxjbGFzc3tNSH0gaW5zdGFuY2UKK3JlcHJlc2VudGluZyBpdC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3JlbW92ZV9mb2xkZXJ9e2ZvbGRlcn0KK0RlbGV0ZSB0aGUgZm9sZGVyIHdob3NlIG5hbWUgaXMgXHZhcntmb2xkZXJ9LiBJZiB0aGUgZm9sZGVyIGNvbnRhaW5zIGFueQorbWVzc2FnZXMsIGEgXGV4Y2VwdGlvbntOb3RFbXB0eUVycm9yfSBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQgYW5kIHRoZSBmb2xkZXIKK3dpbGwgbm90IGJlIGRlbGV0ZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfc2VxdWVuY2VzfXt9CitSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIHNlcXVlbmNlIG5hbWVzIG1hcHBlZCB0byBrZXkgbGlzdHMuIElmIHRoZXJlIGFyZSBubworc2VxdWVuY2VzLCB0aGUgZW1wdHkgZGljdGlvbmFyeSBpcyByZXR1cm5lZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9zZXF1ZW5jZXN9e3NlcXVlbmNlc30KK1JlLWRlZmluZSB0aGUgc2VxdWVuY2VzIHRoYXQgZXhpc3QgaW4gdGhlIG1haWxib3ggYmFzZWQgdXBvbiBcdmFye3NlcXVlbmNlc30sIGEKK2RpY3Rpb25hcnkgb2YgbmFtZXMgbWFwcGVkIHRvIGtleSBsaXN0cywgbGlrZSByZXR1cm5lZCBieQorXG1ldGhvZHtnZXRfc2VxdWVuY2VzKCl9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317cGFja317fQorUmVuYW1lIG1lc3NhZ2VzIGluIHRoZSBtYWlsYm94IGFzIG5lY2Vzc2FyeSB0byBlbGltaW5hdGUgZ2FwcyBpbiBudW1iZXJpbmcuCitFbnRyaWVzIGluIHRoZSBzZXF1ZW5jZXMgbGlzdCBhcmUgdXBkYXRlZCBjb3JyZXNwb25kaW5nbHkuIFxub3Rle0FscmVhZHktaXNzdWVkCitrZXlzIGFyZSBpbnZhbGlkYXRlZCBieSB0aGlzIG9wZXJhdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBzdWJzZXF1ZW50bHkgdXNlZC59CitcZW5ke21ldGhvZGRlc2N9CisKK1NvbWUgXGNsYXNze01haWxib3h9IG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgXGNsYXNze01IfSBkZXNlcnZlIHNwZWNpYWwgcmVtYXJrczoKKworXGJlZ2lue21ldGhvZGRlc2N9e3JlbW92ZX17a2V5fQorXG1ldGhvZGxpbmV7X19kZWxpdGVtX199e2tleX0KK1xtZXRob2RsaW5le2Rpc2NhcmR9e2tleX0KK1RoZXNlIG1ldGhvZHMgaW1tZWRpYXRlbHkgZGVsZXRlIHRoZSBtZXNzYWdlLiBUaGUgTUggY29udmVudGlvbiBvZiBtYXJraW5nIGEKK21lc3NhZ2UgZm9yIGRlbGV0aW9uIGJ5IHByZXBlbmRpbmcgYSBjb21tYSB0byBpdHMgbmFtZSBpcyBub3QgdXNlZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2xvY2t9e30KK1xtZXRob2RsaW5le3VubG9ja317fQorVGhyZWUgbG9ja2luZyBtZWNoYW5pc21zIGFyZSB1c2VkLS0tZG90IGxvY2tpbmcgYW5kLCBpZiBhdmFpbGFibGUsIHRoZQorXGNmdW5jdGlvbntmbG9jaygpfSBhbmQgXGNmdW5jdGlvbntsb2NrZigpfSBzeXN0ZW0gY2FsbHMuIEZvciBNSCBtYWlsYm94ZXMsCitsb2NraW5nIHRoZSBtYWlsYm94IG1lYW5zIGxvY2tpbmcgdGhlIFxmaWxley5taF9zZXF1ZW5jZXN9IGZpbGUgYW5kLCBvbmx5IGZvcgordGhlIGR1cmF0aW9uIG9mIGFueSBvcGVyYXRpb25zIHRoYXQgYWZmZWN0IHRoZW0sIGxvY2tpbmcgaW5kaXZpZHVhbCBtZXNzYWdlCitmaWxlcy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9maWxlfXtrZXl9CitEZXBlbmRpbmcgdXBvbiB0aGUgaG9zdCBwbGF0Zm9ybSwgaXQgbWF5IG5vdCBiZSBwb3NzaWJsZSB0byByZW1vdmUgdGhlCit1bmRlcmx5aW5nIG1lc3NhZ2Ugd2hpbGUgdGhlIHJldHVybmVkIGZpbGUgcmVtYWlucyBvcGVuLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Zmx1c2h9e30KK0FsbCBjaGFuZ2VzIHRvIE1IIG1haWxib3hlcyBhcmUgaW1tZWRpYXRlbHkgYXBwbGllZCwgc28gdGhpcyBtZXRob2QgZG9lcworbm90aGluZy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9CitcY2xhc3N7TUh9IGluc3RhbmNlcyBkbyBub3Qga2VlcCBhbnkgb3BlbiBmaWxlcywgc28gdGhpcyBtZXRob2QgaXMgZXF1aXZlbGFudAordG8gXG1ldGhvZHt1bmxvY2soKX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorXHNlZWxpbmt7aHR0cDovL3d3dy5ub25nbnUub3JnL25taC99e25taCAtIE1lc3NhZ2UgSGFuZGxpbmcgU3lzdGVtfXtIb21lIHBhZ2UKK29mIFxwcm9ncmFte25taH0sIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgXHByb2dyYW17bWh9Ln0KK1xzZWVsaW5re2h0dHA6Ly93d3cuaWNzLnVjaS5lZHUvXHRpbGRle31taC9ib29rL317TUggXCYgbm1oOiBFbWFpbCBmb3IgVXNlcnMgXCYKK1Byb2dyYW1tZXJzfXtBIEdQTC1saWNlbnNlZCBib29rIG9uIFxwcm9ncmFte21ofSBhbmQgXHByb2dyYW17bm1ofSwgd2l0aCBzb21lCitpbmZvcm1hdGlvbiBvbiB0aGUgbWFpbGJveCBmb3JtYXQufQorXGVuZHtzZWVhbHNvfQorCitcc3Vic3Vic2VjdGlvbntcY2xhc3N7QmFieWx9fQorXGxhYmVse21haWxib3gtYmFieWx9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0JhYnlsfXtwYXRoXG9wdGlvbmFseywgZmFjdG9yeT1Ob25lXG9wdGlvbmFseywgY3JlYXRlPVRydWV9fX0KK0Egc3ViY2xhc3Mgb2YgXGNsYXNze01haWxib3h9IGZvciBtYWlsYm94ZXMgaW4gQmFieWwgZm9ybWF0LiBQYXJhbWV0ZXIKK1x2YXJ7ZmFjdG9yeX0gaXMgYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBhY2NlcHRzIGEgZmlsZS1saWtlIG1lc3NhZ2UKK3JlcHJlc2VudGF0aW9uICh3aGljaCBiZWhhdmVzIGFzIGlmIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSkgYW5kIHJldHVybnMgYSBjdXN0b20KK3JlcHJlc2VudGF0aW9uLiBJZiBcdmFye2ZhY3Rvcnl9IGlzIFxjb2Rle05vbmV9LCBcY2xhc3N7QmFieWxNZXNzYWdlfSBpcyB1c2VkCithcyB0aGUgZGVmYXVsdCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiBJZiBcdmFye2NyZWF0ZX0gaXMgXGNvZGV7VHJ1ZX0sIHRoZQorbWFpbGJveCBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorXGVuZHtjbGFzc2Rlc2N9CisKK0JhYnlsIGlzIGEgc2luZ2xlLWZpbGUgbWFpbGJveCBmb3JtYXQgdXNlZCBieSB0aGUgUm1haWwgbWFpbCB1c2VyIGFnZW50CitpbmNsdWRlZCB3aXRoIEVtYWNzLiBUaGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZSBpcyBpbmRpY2F0ZWQgYnkgYSBsaW5lCitjb250YWluaW5nIHRoZSB0d28gY2hhcmFjdGVycyBDb250cm9sLVVuZGVyc2NvcmUKKyhcY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNoMDM3fSkgYW5kIENvbnRyb2wtTCAoXGNoYXJhY3RlcntcdGV4dGJhY2tzbGFzaDAxNH0pLgorVGhlIGVuZCBvZiBhIG1lc3NhZ2UgaXMgaW5kaWNhdGVkIGJ5IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBtZXNzYWdlIG9yLCBpbiB0aGUKK2Nhc2Ugb2YgdGhlIGxhc3QgbWVzc2FnZSwgYSBsaW5lIGNvbnRhaW5pbmcgYSBDb250cm9sLVVuZGVyc2NvcmUKKyhcY2hhcmFjdGVye1x0ZXh0YmFja3NsYXNoMDM3fSkgY2hhcmFjdGVyLgorCitNZXNzYWdlcyBpbiBhIEJhYnlsIG1haWxib3ggaGF2ZSB0d28gc2V0cyBvZiBoZWFkZXJzLCBvcmlnaW5hbCBoZWFkZXJzIGFuZAorc28tY2FsbGVkIHZpc2libGUgaGVhZGVycy4gVmlzaWJsZSBoZWFkZXJzIGFyZSB0eXBpY2FsbHkgYSBzdWJzZXQgb2YgdGhlCitvcmlnaW5hbCBoZWFkZXJzIHRoYXQgaGF2ZSBiZWVuIHJlZm9ybWF0dGVkIG9yIGFicmlkZ2VkIHRvIGJlIG1vcmUgYXR0cmFjdGl2ZS4KK0VhY2ggbWVzc2FnZSBpbiBhIEJhYnlsIG1haWxib3ggYWxzbyBoYXMgYW4gYWNjb21wYW55aW5nIGxpc3Qgb2YgXGRmbntsYWJlbHN9LAorb3Igc2hvcnQgc3RyaW5ncyB0aGF0IHJlY29yZCBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVzc2FnZSwgYW5kIGEgbGlzdCBvZgorYWxsIHVzZXItZGVmaW5lZCBsYWJlbHMgZm91bmQgaW4gdGhlIG1haWxib3ggaXMga2VwdCBpbiB0aGUgQmFieWwgb3B0aW9ucworc2VjdGlvbi4KKworXGNsYXNze0JhYnlsfSBpbnN0YW5jZXMgaGF2ZSBhbGwgb2YgdGhlIG1ldGhvZHMgb2YgXGNsYXNze01haWxib3h9IGluIGFkZGl0aW9uCit0byB0aGUgZm9sbG93aW5nOgorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X2xhYmVsc317fQorUmV0dXJuIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHVzZXItZGVmaW5lZCBsYWJlbHMgdXNlZCBpbiB0aGUgbWFpbGJveC4KK1xub3Rle1RoZSBhY3R1YWwgbWVzc2FnZXMgYXJlIGluc3BlY3RlZCB0byBkZXRlcm1pbmUgd2hpY2ggbGFiZWxzIGV4aXN0IGluIHRoZQorbWFpbGJveCByYXRoZXIgdGhhbiBjb25zdWx0aW5nIHRoZSBsaXN0IG9mIGxhYmVscyBpbiB0aGUgQmFieWwgb3B0aW9ucyBzZWN0aW9uLAorYnV0IHRoZSBCYWJ5bCBzZWN0aW9uIGlzIHVwZGF0ZWQgd2hlbmV2ZXIgdGhlIG1haWxib3ggaXMgbW9kaWZpZWQufQorXGVuZHttZXRob2RkZXNjfQorCitTb21lIFxjbGFzc3tNYWlsYm94fSBtZXRob2RzIGltcGxlbWVudGVkIGJ5IFxjbGFzc3tCYWJ5bH0gZGVzZXJ2ZSBzcGVjaWFsCityZW1hcmtzOgorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X2ZpbGV9e2tleX0KK0luIEJhYnlsIG1haWxib3hlcywgdGhlIGhlYWRlcnMgb2YgYSBtZXNzYWdlIGFyZSBub3Qgc3RvcmVkIGNvbnRpZ3VvdXNseSB3aXRoCit0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4gVG8gZ2VuZXJhdGUgYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24sIHRoZSBoZWFkZXJzCithbmQgYm9keSBhcmUgY29waWVkIHRvZ2V0aGVyIGludG8gYSBcY2xhc3N7U3RyaW5nSU99IGluc3RhbmNlIChmcm9tIHRoZQorXG1vZHVsZXtTdHJpbmdJT30gbW9kdWxlKSwgd2hpY2ggaGFzIGFuIEFQSSBpZGVudGljYWwgdG8gdGhhdCBvZiBhIGZpbGUuIEFzIGEKK3Jlc3VsdCwgdGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgdHJ1bHkgaW5kZXBlbmRlbnQgb2YgdGhlIHVuZGVybHlpbmcgbWFpbGJveCBidXQKK2RvZXMgbm90IHNhdmUgbWVtb3J5IGNvbXBhcmVkIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317bG9ja317fQorXG1ldGhvZGxpbmV7dW5sb2NrfXt9CitUaHJlZSBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIHVzZWQtLS1kb3QgbG9ja2luZyBhbmQsIGlmIGF2YWlsYWJsZSwgdGhlCitcY2Z1bmN0aW9ue2Zsb2NrKCl9IGFuZCBcY2Z1bmN0aW9ue2xvY2tmKCl9IHN5c3RlbSBjYWxscy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue3NlZWFsc299Citcc2VlbGlua3todHRwOi8vcXVpbWJ5LmdudXMub3JnL25vdGVzL0JBQllMfXtGb3JtYXQgb2YgVmVyc2lvbiA1IEJhYnlsIEZpbGVzfXtBCitzcGVjaWZpY2F0aW9uIG9mIHRoZSBCYWJ5bCBmb3JtYXQufQorXHNlZWxpbmt7aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2VtYWNzL21hbnVhbC9odG1sX25vZGUvUm1haWwuaHRtbH17UmVhZGluZworTWFpbCB3aXRoIFJtYWlsfXtUaGUgUm1haWwgbWFudWFsLCB3aXRoIHNvbWUgaW5mb3JtYXRpb24gb24gQmFieWwgc2VtYW50aWNzLn0KK1xlbmR7c2VlYWxzb30KKworXHN1YnN1YnNlY3Rpb257XGNsYXNze01NREZ9fQorXGxhYmVse21haWxib3gtbW1kZn0KKworXGJlZ2lue2NsYXNzZGVzY317TU1ERn17cGF0aFxvcHRpb25hbHssIGZhY3Rvcnk9Tm9uZVxvcHRpb25hbHssIGNyZWF0ZT1UcnVlfX19CitBIHN1YmNsYXNzIG9mIFxjbGFzc3tNYWlsYm94fSBmb3IgbWFpbGJveGVzIGluIE1NREYgZm9ybWF0LiBQYXJhbWV0ZXIKK1x2YXJ7ZmFjdG9yeX0gaXMgYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBhY2NlcHRzIGEgZmlsZS1saWtlIG1lc3NhZ2UKK3JlcHJlc2VudGF0aW9uICh3aGljaCBiZWhhdmVzIGFzIGlmIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSkgYW5kIHJldHVybnMgYSBjdXN0b20KK3JlcHJlc2VudGF0aW9uLiBJZiBcdmFye2ZhY3Rvcnl9IGlzIFxjb2Rle05vbmV9LCBcY2xhc3N7TU1ERk1lc3NhZ2V9IGlzIHVzZWQgYXMKK3RoZSBkZWZhdWx0IG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uIElmIFx2YXJ7Y3JlYXRlfSBpcyBcY29kZXtUcnVlfSwgdGhlIG1haWxib3gKK2lzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuCitcZW5ke2NsYXNzZGVzY30KKworTU1ERiBpcyBhIHNpbmdsZS1maWxlIG1haWxib3ggZm9ybWF0IGludmVudGVkIGZvciB0aGUgTXVsdGljaGFubmVsIE1lbW9yYW5kdW0KK0Rpc3RyaWJ1dGlvbiBGYWNpbGl0eSwgYSBtYWlsIHRyYW5zZmVyIGFnZW50LiBFYWNoIG1lc3NhZ2UgaXMgaW4gdGhlIHNhbWUgZm9ybQorYXMgYW4gbWJveCBtZXNzYWdlIGJ1dCBpcyBicmFja2V0ZWQgYmVmb3JlIGFuZCBhZnRlciBieSBsaW5lcyBjb250YWluaW5nIGZvdXIKK0NvbnRyb2wtQSAoXGNoYXJhY3RlcntcdGV4dGJhY2tzbGFzaDAwMX0pIGNoYXJhY3RlcnMuIEFzIHdpdGggdGhlIG1ib3ggZm9ybWF0LAordGhlIGJlZ2lubmluZyBvZiBlYWNoIG1lc3NhZ2UgaXMgaW5kaWNhdGVkIGJ5IGEgbGluZSB3aG9zZSBmaXJzdCBmaXZlCitjaGFyYWN0ZXJzIGFyZSAiRnJvbX4iLCBidXQgYWRkaXRpb25hbCBvY2N1cnJlbmNlcyBvZiAiRnJvbX4iIGFyZSBub3QKK3RyYW5zZm9ybWVkIHRvICI+RnJvbX4iIHdoZW4gc3RvcmluZyBtZXNzYWdlcyBiZWNhdXNlIHRoZSBleHRyYSBtZXNzYWdlCitzZXBhcmF0b3IgbGluZXMgcHJldmVudCBtaXN0YWtpbmcgc3VjaCBvY2N1cnJlbmNlcyBmb3IgdGhlIHN0YXJ0cyBvZiBzdWJzZXF1ZW50CittZXNzYWdlcy4KKworU29tZSBcY2xhc3N7TWFpbGJveH0gbWV0aG9kcyBpbXBsZW1lbnRlZCBieSBcY2xhc3N7TU1ERn0gZGVzZXJ2ZSBzcGVjaWFsCityZW1hcmtzOgorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X2ZpbGV9e2tleX0KK1VzaW5nIHRoZSBmaWxlIGFmdGVyIGNhbGxpbmcgXG1ldGhvZHtmbHVzaCgpfSBvciBcbWV0aG9ke2Nsb3NlKCl9IG9uIHRoZQorXGNsYXNze01NREZ9IGluc3RhbmNlIG1heSB5aWVsZCB1bnByZWRpY3RhYmxlIHJlc3VsdHMgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317bG9ja317fQorXG1ldGhvZGxpbmV7dW5sb2NrfXt9CitUaHJlZSBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIHVzZWQtLS1kb3QgbG9ja2luZyBhbmQsIGlmIGF2YWlsYWJsZSwgdGhlCitcY2Z1bmN0aW9ue2Zsb2NrKCl9IGFuZCBcY2Z1bmN0aW9ue2xvY2tmKCl9IHN5c3RlbSBjYWxscy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue3NlZWFsc299Citcc2VlbGlua3todHRwOi8vd3d3LnRpbi5vcmcvYmluL21hbi5jZ2k/c2VjdGlvbj01XCZ0b3BpYz1tbWRmfXttbWRmIG1hbiBwYWdlCitmcm9tIHRpbn17QSBzcGVjaWZpY2F0aW9uIG9mIE1NREYgZm9ybWF0IGZyb20gdGhlIGRvY3VtZW50YXRpb24gb2YgdGluLCBhCituZXdzcmVhZGVyLn0KK1xzZWVsaW5re2h0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTU1ERn17TU1ERn17QSBXaWtpcGVkaWEgYXJ0aWNsZQorZGVzY3JpYmluZyB0aGUgTXVsdGljaGFubmVsIE1lbW9yYW5kdW0gRGlzdHJpYnV0aW9uIEZhY2lsaXR5Ln0KK1xlbmR7c2VlYWxzb30KKworXHN1YnNlY3Rpb257XGNsYXNze01lc3NhZ2V9IG9iamVjdHN9CitcbGFiZWx7bWFpbGJveC1tZXNzYWdlLW9iamVjdHN9CisKK1xiZWdpbntjbGFzc2Rlc2N9e01lc3NhZ2V9e1xvcHRpb25hbHttZXNzYWdlfX0KK0Egc3ViY2xhc3Mgb2YgdGhlIFxtb2R1bGV7ZW1haWwuTWVzc2FnZX0gbW9kdWxlJ3MgXGNsYXNze01lc3NhZ2V9LiBTdWJjbGFzc2VzCitvZiBcY2xhc3N7bWFpbGJveC5NZXNzYWdlfSBhZGQgbWFpbGJveC1mb3JtYXQtc3BlY2lmaWMgc3RhdGUgYW5kIGJlaGF2aW9yLgorCitJZiBcdmFye21lc3NhZ2V9IGlzIG9taXR0ZWQsIHRoZSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZCBpbiBhIGRlZmF1bHQsIGVtcHR5CitzdGF0ZS4gSWYgXHZhcnttZXNzYWdlfSBpcyBhbiBcY2xhc3N7ZW1haWwuTWVzc2FnZS5NZXNzYWdlfSBpbnN0YW5jZSwgaXRzCitjb250ZW50cyBhcmUgY29waWVkOyBmdXJ0aGVybW9yZSwgYW55IGZvcm1hdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBjb252ZXJ0ZWQKK2luc29mYXIgYXMgcG9zc2libGUgaWYgXHZhcnttZXNzYWdlfSBpcyBhIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZS4gSWYKK1x2YXJ7bWVzc2FnZX0gaXMgYSBzdHJpbmcgb3IgYSBmaWxlLCBpdCBzaG91bGQgY29udGFpbiBhbiBccmZjezI4MjJ9LWNvbXBsaWFudAorbWVzc2FnZSwgd2hpY2ggaXMgcmVhZCBhbmQgcGFyc2VkLgorXGVuZHtjbGFzc2Rlc2N9CisKK1RoZSBmb3JtYXQtc3BlY2lmaWMgc3RhdGUgYW5kIGJlaGF2aW9ycyBvZmZlcmVkIGJ5IHN1YmNsYXNzZXMgdmFyeSwgYnV0IGluCitnZW5lcmFsIGl0IGlzIG9ubHkgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBtYWlsYm94Cit0aGF0IGFyZSBzdXBwb3J0ZWQgKGFsdGhvdWdoIHByZXN1bWFibHkgdGhlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmljIHRvIGEKK3BhcnRpY3VsYXIgbWFpbGJveCBmb3JtYXQpLiBGb3IgZXhhbXBsZSwgZmlsZSBvZmZzZXRzIGZvciBzaW5nbGUtZmlsZSBtYWlsYm94Citmb3JtYXRzIGFuZCBmaWxlIG5hbWVzIGZvciBkaXJlY3RvcnktYmFzZWQgbWFpbGJveCBmb3JtYXRzIGFyZSBub3QgcmV0YWluZWQsCitiZWNhdXNlIHRoZXkgYXJlIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgb3JpZ2luYWwgbWFpbGJveC4gQnV0IHN0YXRlIHN1Y2ggYXMKK3doZXRoZXIgYSBtZXNzYWdlIGhhcyBiZWVuIHJlYWQgYnkgdGhlIHVzZXIgb3IgbWFya2VkIGFzIGltcG9ydGFudCBpcyByZXRhaW5lZCwKK2JlY2F1c2UgaXQgYXBwbGllcyB0byB0aGUgbWVzc2FnZSBpdHNlbGYuCisKK1RoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRoYXQgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlcyBiZSB1c2VkIHRvIHJlcHJlc2VudAorbWVzc2FnZXMgcmV0cmlldmVkIHVzaW5nIFxjbGFzc3tNYWlsYm94fSBpbnN0YW5jZXMuIEluIHNvbWUgc2l0dWF0aW9ucywgdGhlCit0aW1lIGFuZCBtZW1vcnkgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgXGNsYXNze01lc3NhZ2V9IHJlcHJlc2VudGF0aW9ucyBtaWdodCBub3QKK25vdCBhY2NlcHRhYmxlLiBGb3Igc3VjaCBzaXR1YXRpb25zLCBcY2xhc3N7TWFpbGJveH0gaW5zdGFuY2VzIGFsc28gb2ZmZXIKK3N0cmluZyBhbmQgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9ucywgYW5kIGEgY3VzdG9tIG1lc3NhZ2UgZmFjdG9yeSBtYXkgYmUKK3NwZWNpZmllZCB3aGVuIGEgXGNsYXNze01haWxib3h9IGluc3RhbmNlIGlzIGluaXRpYWxpemVkLiAKKworXHN1YnN1YnNlY3Rpb257XGNsYXNze01haWxkaXJNZXNzYWdlfX0KK1xsYWJlbHttYWlsYm94LW1haWxkaXJtZXNzYWdlfQorCitcYmVnaW57Y2xhc3NkZXNjfXtNYWlsZGlyTWVzc2FnZX17XG9wdGlvbmFse21lc3NhZ2V9fQorQSBtZXNzYWdlIHdpdGggTWFpbGRpci1zcGVjaWZpYyBiZWhhdmlvcnMuIFBhcmFtZXRlciBcdmFye21lc3NhZ2V9CitoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyB3aXRoIHRoZSBcY2xhc3N7TWVzc2FnZX0gY29uc3RydWN0b3IuCitcZW5ke2NsYXNzZGVzY30KKworVHlwaWNhbGx5LCBhIG1haWwgdXNlciBhZ2VudCBhcHBsaWNhdGlvbiBtb3ZlcyBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZQorXGZpbGV7bmV3fSBzdWJkaXJlY3RvcnkgdG8gdGhlIFxmaWxle2N1cn0gc3ViZGlyZWN0b3J5IGFmdGVyIHRoZSBmaXJzdCB0aW1lIHRoZQordXNlciBvcGVucyBhbmQgY2xvc2VzIHRoZSBtYWlsYm94LCByZWNvcmRpbmcgdGhhdCB0aGUgbWVzc2FnZXMgYXJlIG9sZCB3aGV0aGVyCitvciBub3QgdGhleSd2ZSBhY3R1YWxseSBiZWVuIHJlYWQuIEVhY2ggbWVzc2FnZSBpbiBcZmlsZXtjdXJ9IGhhcyBhbiAiaW5mbyIKK3NlY3Rpb24gYWRkZWQgdG8gaXRzIGZpbGUgbmFtZSB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBpdHMgc3RhdGUuIChTb21lIG1haWwKK3JlYWRlcnMgbWF5IGFsc28gYWRkIGFuICJpbmZvIiBzZWN0aW9uIHRvIG1lc3NhZ2VzIGluIFxmaWxle25ld30uKSBUaGUgImluZm8iCitzZWN0aW9uIG1heSB0YWtlIG9uZSBvZiB0d28gZm9ybXM6IGl0IG1heSBjb250YWluICIyLCIgZm9sbG93ZWQgYnkgYSBsaXN0IG9mCitzdGFuZGFyZGl6ZWQgZmxhZ3MgKGUuZy4sICIyLEZSIikgb3IgaXQgbWF5IGNvbnRhaW4gIjEsIiBmb2xsb3dlZCBieSBzby1jYWxsZWQKK2V4cGVyaW1lbnRhbCBpbmZvcm1hdGlvbi4gU3RhbmRhcmQgZmxhZ3MgZm9yIE1haWxkaXIgbWVzc2FnZXMgYXJlIGFzIGZvbGxvd3M6CisKK1xiZWdpbnt0YWJsZWlpaX17bHxsfGx9e3RleHRybX17RmxhZ317TWVhbmluZ317RXhwbGFuYXRpb259CitcbGluZWlpaXtEfXtEcmFmdH17VW5kZXIgY29tcG9zaXRpb259CitcbGluZWlpaXtGfXtGbGFnZ2VkfXtNYXJrZWQgYXMgaW1wb3J0YW50fQorXGxpbmVpaWl7UH17UGFzc2VkfXtGb3J3YXJkZWQsIHJlc2VudCwgb3IgYm91bmNlZH0KK1xsaW5laWlpe1J9e1JlcGxpZWR9e1JlcGxpZWQgdG99CitcbGluZWlpaXtTfXtTZWVufXtSZWFkfQorXGxpbmVpaWl7VH17VHJhc2hlZH17TWFya2VkIGZvciBzdWJzZXF1ZW50IGRlbGV0aW9ufQorXGVuZHt0YWJsZWlpaX0KKworXGNsYXNze01haWxkaXJNZXNzYWdlfSBpbnN0YW5jZXMgb2ZmZXIgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X3N1YmRpcn17fQorUmV0dXJuIGVpdGhlciAibmV3IiAoaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgXGZpbGV7bmV3fQorc3ViZGlyZWN0b3J5KSBvciAiY3VyIiAoaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgXGZpbGV7Y3VyfQorc3ViZGlyZWN0b3J5KS4gXG5vdGV7QSBtZXNzYWdlIGlzIHR5cGljYWxseSBtb3ZlZCBmcm9tIFxmaWxle25ld30gdG8gXGZpbGV7Y3VyfQorYWZ0ZXIgaXRzIG1haWxib3ggaGFzIGJlZW4gYWNjZXNzZWQsIHdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIGlzIGhhcyBiZWVuCityZWFkLiBBIG1lc3NhZ2UgXGNvZGV7bXNnfSBoYXMgYmVlbiByZWFkIGlmIFxjb2RleyJTIiBub3QgaW4gbXNnLmdldF9mbGFncygpfQoraXMgXGNvZGV7VHJ1ZX0ufQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2V0X3N1YmRpcn17c3ViZGlyfQorU2V0IHRoZSBzdWJkaXJlY3RvcnkgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHN0b3JlZCBpbi4gUGFyYW1ldGVyIFx2YXJ7c3ViZGlyfQorbXVzdCBiZSBlaXRoZXIgIm5ldyIgb3IgImN1ciIuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfZmxhZ3N9e30KK1JldHVybiBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmbGFncyB0aGF0IGFyZSBjdXJyZW50bHkgc2V0LiBJZiB0aGUgbWVzc2FnZQorY29tcGxpZXMgd2l0aCB0aGUgc3RhbmRhcmQgTWFpbGRpciBmb3JtYXQsIHRoZSByZXN1bHQgaXMgdGhlIGNvbmNhdGVuYXRpb24gaW4KK2FscGhhYmV0aWNhbCBvcmRlciBvZiB6ZXJvIG9yIG9uZSBvY2N1cnJlbmNlIG9mIGVhY2ggb2YgXGNoYXJhY3RlcntEfSwKK1xjaGFyYWN0ZXJ7Rn0sIFxjaGFyYWN0ZXJ7UH0sIFxjaGFyYWN0ZXJ7Un0sIFxjaGFyYWN0ZXJ7U30sIGFuZCBcY2hhcmFjdGVye1R9LgorVGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiBubyBmbGFncyBhcmUgc2V0IG9yIGlmICJpbmZvIiBjb250YWlucworZXhwZXJpbWVudGFsIHNlbWFudGljcy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9mbGFnc317ZmxhZ3N9CitTZXQgdGhlIGZsYWdzIHNwZWNpZmllZCBieSBcdmFye2ZsYWdzfSBhbmQgdW5zZXQgYWxsIG90aGVycy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9mbGFnfXtmbGFnfQorU2V0IHRoZSBmbGFnKHMpIHNwZWNpZmllZCBieSBcdmFye2ZsYWd9IHdpdGhvdXQgY2hhbmdpbmcgb3RoZXIgZmxhZ3MuIFRvIGFkZAorbW9yZSB0aGFuIG9uZSBmbGFnIGF0IGEgdGltZSwgXHZhcntmbGFnfSBtYXkgYmUgYSBzdHJpbmcgb2YgbW9yZSB0aGFuIG9uZQorY2hhcmFjdGVyLiBUaGUgY3VycmVudCAiaW5mbyIgaXMgb3ZlcndyaXR0ZW4gd2hldGhlciBvciBub3QgaXQgY29udGFpbnMKK2V4cGVyaW1lbnRhbCBpbmZvcm1hdGlvbiByYXRoZXIgdGhhbgorZmxhZ3MuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtyZW1vdmVfZmxhZ317ZmxhZ30KK1Vuc2V0IHRoZSBmbGFnKHMpIHNwZWNpZmllZCBieSBcdmFye2ZsYWd9IHdpdGhvdXQgY2hhbmdpbmcgb3RoZXIgZmxhZ3MuIFRvCityZW1vdmUgbW9yZSB0aGFuIG9uZSBmbGFnIGF0IGEgdGltZSwgXHZhcntmbGFnfSBtYXliZSBhIHN0cmluZyBvZiBtb3JlIHRoYW4gb25lCitjaGFyYWN0ZXIuIElmICJpbmZvIiBjb250YWlucyBleHBlcmltZW50YWwgaW5mb3JtYXRpb24gcmF0aGVyIHRoYW4gZmxhZ3MsIHRoZQorY3VycmVudCAiaW5mbyIgaXMgbm90IG1vZGlmaWVkLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X2RhdGV9e30KK1JldHVybiB0aGUgZGVsaXZlcnkgZGF0ZSBvZiB0aGUgbWVzc2FnZSBhcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlciByZXByZXNlbnRpbmcKK3NlY29uZHMgc2luY2UgdGhlIGVwb2NoLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2V0X2RhdGV9e2RhdGV9CitTZXQgdGhlIGRlbGl2ZXJ5IGRhdGUgb2YgdGhlIG1lc3NhZ2UgdG8gXHZhcntkYXRlfSwgYSBmbG9hdGluZy1wb2ludCBudW1iZXIKK3JlcHJlc2VudGluZyBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9pbmZvfXt9CitSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgImluZm8iIGZvciBhIG1lc3NhZ2UuIFRoaXMgaXMgdXNlZnVsIGZvcgorYWNjZXNzaW5nIGFuZCBtb2RpZnlpbmcgImluZm8iIHRoYXQgaXMgZXhwZXJpbWVudGFsIChpLmUuLCBub3QgYSBsaXN0IG9mCitmbGFncykuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtzZXRfaW5mb317aW5mb30KK1NldCAiaW5mbyIgdG8gXHZhcntpbmZvfSwgd2hpY2ggc2hvdWxkIGJlIGEgc3RyaW5nLgorXGVuZHttZXRob2RkZXNjfQorCitXaGVuIGEgXGNsYXNze01haWxkaXJNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYW4KK1xjbGFzc3ttYm94TWVzc2FnZX0gb3IgXGNsYXNze01NREZNZXNzYWdlfSBpbnN0YW5jZSwgdGhlIFxtYWlsaGVhZGVye1N0YXR1c30KK2FuZCBcbWFpbGhlYWRlcntYLVN0YXR1c30gaGVhZGVycyBhcmUgb21pdHRlZCBhbmQgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucwordGFrZSBwbGFjZToKKworXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQorICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3ttYm94TWVzc2FnZX0gb3IgXGNsYXNze01NREZNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7ImN1ciIgc3ViZGlyZWN0b3J5fXtPIGZsYWd9CitcbGluZWlpe0YgZmxhZ317RiBmbGFnfQorXGxpbmVpaXtSIGZsYWd9e0EgZmxhZ30KK1xsaW5laWl7UyBmbGFnfXtSIGZsYWd9CitcbGluZWlpe1QgZmxhZ317RCBmbGFnfQorXGVuZHt0YWJsZWlpfQorCitXaGVuIGEgXGNsYXNze01haWxkaXJNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYW4KK1xjbGFzc3tNSE1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6CisKK1xiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KKyAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7TUhNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7ImN1ciIgc3ViZGlyZWN0b3J5fXsidW5zZWVuIiBzZXF1ZW5jZX0KK1xsaW5laWl7ImN1ciIgc3ViZGlyZWN0b3J5IGFuZCBTIGZsYWd9e25vICJ1bnNlZW4iIHNlcXVlbmNlfQorXGxpbmVpaXtGIGZsYWd9eyJmbGFnZ2VkIiBzZXF1ZW5jZX0KK1xsaW5laWl7UiBmbGFnfXsicmVwbGllZCIgc2VxdWVuY2V9CitcZW5ke3RhYmxlaWl9CisKK1doZW4gYSBcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhCitcY2xhc3N7QmFieWxNZXNzYWdlfSBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucyB0YWtlIHBsYWNlOgorCitcYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19CisgICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze0JhYnlsTWVzc2FnZX0gc3RhdGV9CitcbGluZWlpeyJjdXIiIHN1YmRpcmVjdG9yeX17InVuc2VlbiIgbGFiZWx9CitcbGluZWlpeyJjdXIiIHN1YmRpcmVjdG9yeSBhbmQgUyBmbGFnfXtubyAidW5zZWVuIiBsYWJlbH0KK1xsaW5laWl7UCBmbGFnfXsiZm9yd2FyZGVkIiBvciAicmVzZW50IiBsYWJlbH0KK1xsaW5laWl7UiBmbGFnfXsiYW5zd2VyZWQiIGxhYmVsfQorXGxpbmVpaXtUIGZsYWd9eyJkZWxldGVkIiBsYWJlbH0KK1xlbmR7dGFibGVpaX0KKworXHN1YnN1YnNlY3Rpb257XGNsYXNze21ib3hNZXNzYWdlfX0KK1xsYWJlbHttYWlsYm94LW1ib3htZXNzYWdlfQorCitcYmVnaW57Y2xhc3NkZXNjfXttYm94TWVzc2FnZX17XG9wdGlvbmFse21lc3NhZ2V9fQorQSBtZXNzYWdlIHdpdGggbWJveC1zcGVjaWZpYyBiZWhhdmlvcnMuIFBhcmFtZXRlciBcdmFye21lc3NhZ2V9IGhhcyB0aGUgc2FtZQorbWVhbmluZyBhcyB3aXRoIHRoZSBcY2xhc3N7TWVzc2FnZX0gY29uc3RydWN0b3IuCitcZW5ke2NsYXNzZGVzY30KKworTWVzc2FnZXMgaW4gYW4gbWJveCBtYWlsYm94IGFyZSBzdG9yZWQgdG9nZXRoZXIgaW4gYSBzaW5nbGUgZmlsZS4gVGhlIHNlbmRlcidzCitlbnZlbG9wZSBhZGRyZXNzIGFuZCB0aGUgdGltZSBvZiBkZWxpdmVyeSBhcmUgdHlwaWNhbGx5IHN0b3JlZCBpbiBhIGxpbmUKK2JlZ2lubmluZyB3aXRoICJGcm9tfiIgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIG1lc3NhZ2UsIHRob3VnaAordGhlcmUgaXMgY29uc2lkZXJhYmxlIHZhcmlhdGlvbiBpbiB0aGUgZXhhY3QgZm9ybWF0IG9mIHRoaXMgZGF0YSBhbW9uZyBtYm94CitpbXBsZW1lbnRhdGlvbnMuIEZsYWdzIHRoYXQgaW5kaWNhdGUgdGhlIHN0YXRlIG9mIHRoZSBtZXNzYWdlLCBzdWNoIGFzIHdoZXRoZXIKK2l0IGhhcyBiZWVuIHJlYWQgb3IgbWFya2VkIGFzIGltcG9ydGFudCwgYXJlIHR5cGljYWxseSBzdG9yZWQgaW4KK1xtYWlsaGVhZGVye1N0YXR1c30gYW5kIFxtYWlsaGVhZGVye1gtU3RhdHVzfSBoZWFkZXJzLgorCitDb252ZW50aW9uYWwgZmxhZ3MgZm9yIG1ib3ggbWVzc2FnZXMgYXJlIGFzIGZvbGxvd3M6CisKK1xiZWdpbnt0YWJsZWlpaX17bHxsfGx9e3RleHRybX17RmxhZ317TWVhbmluZ317RXhwbGFuYXRpb259CitcbGluZWlpaXtSfXtSZWFkfXtSZWFkfQorXGxpbmVpaWl7T317T2xkfXtQcmV2aW91c2x5IGRldGVjdGVkIGJ5IE1VQX0KK1xsaW5laWlpe0R9e0RlbGV0ZWR9e01hcmtlZCBmb3Igc3Vic2VxdWVudCBkZWxldGlvbn0KK1xsaW5laWlpe0Z9e0ZsYWdnZWR9e01hcmtlZCBhcyBpbXBvcnRhbnR9CitcbGluZWlpaXtBfXtBbnN3ZXJlZH17UmVwbGllZCB0b30KK1xlbmR7dGFibGVpaWl9CisKK1RoZSAiUiIgYW5kICJPIiBmbGFncyBhcmUgc3RvcmVkIGluIHRoZSBcbWFpbGhlYWRlcntTdGF0dXN9IGhlYWRlciwgYW5kIHRoZQorIkQiLCAiRiIsIGFuZCAiQSIgZmxhZ3MgYXJlIHN0b3JlZCBpbiB0aGUgXG1haWxoZWFkZXJ7WC1TdGF0dXN9IGhlYWRlci4gVGhlCitmbGFncyBhbmQgaGVhZGVycyB0eXBpY2FsbHkgYXBwZWFyIGluIHRoZSBvcmRlciBtZW50aW9uZWQuCisKK1xjbGFzc3ttYm94TWVzc2FnZX0gaW5zdGFuY2VzIG9mZmVyIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9mcm9tfXt9CitSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSAiRnJvbX4iIGxpbmUgdGhhdCBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlCittZXNzYWdlIGluIGFuIG1ib3ggbWFpbGJveC4gVGhlIGxlYWRpbmcgIkZyb21+IiBhbmQgdGhlIHRyYWlsaW5nIG5ld2xpbmUgYXJlCitleGNsdWRlZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9mcm9tfXtmcm9tX1xvcHRpb25hbHssIHRpbWVfPU5vbmV9fQorU2V0IHRoZSAiRnJvbX4iIGxpbmUgdG8gXHZhcntmcm9tX30sIHdoaWNoIHNob3VsZCBiZSBzcGVjaWZpZWQgd2l0aG91dCBhCitsZWFkaW5nICJGcm9tfiIgb3IgdHJhaWxpbmcgbmV3bGluZS4gRm9yIGNvbnZlbmllbmNlLCBcdmFye3RpbWVffSBtYXkgYmUKK3NwZWNpZmllZCBhbmQgd2lsbCBiZSBmb3JtYXR0ZWQgYXBwcm9wcmlhdGVseSBhbmQgYXBwZW5kZWQgdG8gXHZhcntmcm9tX30uIElmCitcdmFye3RpbWVffSBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhIFxjbGFzc3tzdHJ1Y3RfdGltZX0gaW5zdGFuY2UsIGEgdHVwbGUKK3N1aXRhYmxlIGZvciBwYXNzaW5nIHRvIFxtZXRob2R7dGltZS5zdHJmdGltZSgpfSwgb3IgXGNvZGV7VHJ1ZX0gKHRvIHVzZQorXG1ldGhvZHt0aW1lLmdtdGltZSgpfSkuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfZmxhZ3N9e30KK1JldHVybiBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBmbGFncyB0aGF0IGFyZSBjdXJyZW50bHkgc2V0LiBJZiB0aGUgbWVzc2FnZQorY29tcGxpZXMgd2l0aCB0aGUgY29udmVudGlvbmFsIGZvcm1hdCwgdGhlIHJlc3VsdCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBpbiB0aGUKK2ZvbGxvd2luZyBvcmRlciBvZiB6ZXJvIG9yIG9uZSBvY2N1cnJlbmNlIG9mIGVhY2ggb2YgXGNoYXJhY3RlcntSfSwKK1xjaGFyYWN0ZXJ7T30sIFxjaGFyYWN0ZXJ7RH0sIFxjaGFyYWN0ZXJ7Rn0sIGFuZCBcY2hhcmFjdGVye0F9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2V0X2ZsYWdzfXtmbGFnc30KK1NldCB0aGUgZmxhZ3Mgc3BlY2lmaWVkIGJ5IFx2YXJ7ZmxhZ3N9IGFuZCB1bnNldCBhbGwgb3RoZXJzLiBQYXJhbWV0ZXIKK1x2YXJ7ZmxhZ3N9IHNob3VsZCBiZSB0aGUgY29uY2F0ZW5hdGlvbiBpbiBhbnkgb3JkZXIgb2YgemVybyBvciBtb3JlCitvY2N1cnJlbmNlcyBvZiBlYWNoIG9mIFxjaGFyYWN0ZXJ7Un0sIFxjaGFyYWN0ZXJ7T30sIFxjaGFyYWN0ZXJ7RH0sCitcY2hhcmFjdGVye0Z9LCBhbmQgXGNoYXJhY3RlcntBfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9mbGFnfXtmbGFnfQorU2V0IHRoZSBmbGFnKHMpIHNwZWNpZmllZCBieSBcdmFye2ZsYWd9IHdpdGhvdXQgY2hhbmdpbmcgb3RoZXIgZmxhZ3MuIFRvIGFkZAorbW9yZSB0aGFuIG9uZSBmbGFnIGF0IGEgdGltZSwgXHZhcntmbGFnfSBtYXkgYmUgYSBzdHJpbmcgb2YgbW9yZSB0aGFuIG9uZQorY2hhcmFjdGVyLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317cmVtb3ZlX2ZsYWd9e2ZsYWd9CitVbnNldCB0aGUgZmxhZyhzKSBzcGVjaWZpZWQgYnkgXHZhcntmbGFnfSB3aXRob3V0IGNoYW5naW5nIG90aGVyIGZsYWdzLiBUbworcmVtb3ZlIG1vcmUgdGhhbiBvbmUgZmxhZyBhdCBhIHRpbWUsIFx2YXJ7ZmxhZ30gbWF5YmUgYSBzdHJpbmcgb2YgbW9yZSB0aGFuIG9uZQorY2hhcmFjdGVyLgorXGVuZHttZXRob2RkZXNjfQorCitXaGVuIGFuIFxjbGFzc3ttYm94TWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGEKK1xjbGFzc3tNYWlsZGlyTWVzc2FnZX0gaW5zdGFuY2UsIGEgIkZyb21+IiBsaW5lIGlzIGdlbmVyYXRlZCBiYXNlZCB1cG9uIHRoZQorXGNsYXNze01haWxkaXJNZXNzYWdlfSBpbnN0YW5jZSdzIGRlbGl2ZXJ5IGRhdGUsIGFuZCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zCit0YWtlIHBsYWNlOgorCitcYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19CisgICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze01haWxkaXJNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7UiBmbGFnfXtTIGZsYWd9CitcbGluZWlpe08gZmxhZ317ImN1ciIgc3ViZGlyZWN0b3J5fQorXGxpbmVpaXtEIGZsYWd9e1QgZmxhZ30KK1xsaW5laWl7RiBmbGFnfXtGIGZsYWd9CitcbGluZWlpe0EgZmxhZ317UiBmbGFnfQorXGVuZHt0YWJsZWlpfQorCitXaGVuIGFuIFxjbGFzc3ttYm94TWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGFuIFxjbGFzc3tNSE1lc3NhZ2V9CitpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucyB0YWtlIHBsYWNlOgorCitcYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19CisgICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze01ITWVzc2FnZX0gc3RhdGV9CitcbGluZWlpe1IgZmxhZyBhbmQgTyBmbGFnfXtubyAidW5zZWVuIiBzZXF1ZW5jZX0KK1xsaW5laWl7TyBmbGFnfXsidW5zZWVuIiBzZXF1ZW5jZX0KK1xsaW5laWl7RiBmbGFnfXsiZmxhZ2dlZCIgc2VxdWVuY2V9CitcbGluZWlpe0EgZmxhZ317InJlcGxpZWQiIHNlcXVlbmNlfQorXGVuZHt0YWJsZWlpfQorCitXaGVuIGFuIFxjbGFzc3ttYm94TWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGEKK1xjbGFzc3tCYWJ5bE1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6CisKK1xiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KKyAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7QmFieWxNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7UiBmbGFnIGFuZCBPIGZsYWd9e25vICJ1bnNlZW4iIGxhYmVsfQorXGxpbmVpaXtPIGZsYWd9eyJ1bnNlZW4iIGxhYmVsfQorXGxpbmVpaXtEIGZsYWd9eyJkZWxldGVkIiBsYWJlbH0KK1xsaW5laWl7QSBmbGFnfXsiYW5zd2VyZWQiIGxhYmVsfQorXGVuZHt0YWJsZWlpfQorCitXaGVuIGEgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhbiBcY2xhc3N7TU1ERk1lc3NhZ2V9CitpbnN0YW5jZSwgdGhlICJGcm9tfiIgbGluZSBpcyBjb3BpZWQgYW5kIGFsbCBmbGFncyBkaXJlY3RseSBjb3JyZXNwb25kOgorCitcYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19CisgICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze01NREZNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7UiBmbGFnfXtSIGZsYWd9CitcbGluZWlpe08gZmxhZ317TyBmbGFnfQorXGxpbmVpaXtEIGZsYWd9e0QgZmxhZ30KK1xsaW5laWl7RiBmbGFnfXtGIGZsYWd9CitcbGluZWlpe0EgZmxhZ317QSBmbGFnfQorXGVuZHt0YWJsZWlpfQorCitcc3Vic3Vic2VjdGlvbntcY2xhc3N7TUhNZXNzYWdlfX0KK1xsYWJlbHttYWlsYm94LW1obWVzc2FnZX0KKworXGJlZ2lue2NsYXNzZGVzY317TUhNZXNzYWdlfXtcb3B0aW9uYWx7bWVzc2FnZX19CitBIG1lc3NhZ2Ugd2l0aCBNSC1zcGVjaWZpYyBiZWhhdmlvcnMuIFBhcmFtZXRlciBcdmFye21lc3NhZ2V9IGhhcyB0aGUgc2FtZQorbWVhbmluZyBhcyB3aXRoIHRoZSBcY2xhc3N7TWVzc2FnZX0gY29uc3RydWN0b3IuCitcZW5ke2NsYXNzZGVzY30KKworTUggbWVzc2FnZXMgZG8gbm90IHN1cHBvcnQgbWFya3Mgb3IgZmxhZ3MgaW4gdGhlIHRyYWRpdGlvbmFsIHNlbnNlLCBidXQgdGhleSBkbworc3VwcG9ydCBzZXF1ZW5jZXMsIHdoaWNoIGFyZSBsb2dpY2FsIGdyb3VwaW5ncyBvZiBhcmJpdHJhcnkgbWVzc2FnZXMuIFNvbWUgbWFpbAorcmVhZGluZyBwcm9ncmFtcyAoYWx0aG91Z2ggbm90IHRoZSBzdGFuZGFyZCBccHJvZ3JhbXttaH0gYW5kIFxwcm9ncmFte25taH0pIHVzZQorc2VxdWVuY2VzIGluIG11Y2ggdGhlIHNhbWUgd2F5IGZsYWdzIGFyZSB1c2VkIHdpdGggb3RoZXIgZm9ybWF0cywgYXMgZm9sbG93czoKKworXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfXtTZXF1ZW5jZX17RXhwbGFuYXRpb259CitcbGluZWlpe3Vuc2Vlbn17Tm90IHJlYWQsIGJ1dCBwcmV2aW91c2x5IGRldGVjdGVkIGJ5IE1VQX0KK1xsaW5laWl7cmVwbGllZH17UmVwbGllZCB0b30KK1xsaW5laWl7ZmxhZ2dlZH17TWFya2VkIGFzIGltcG9ydGFudH0KK1xlbmR7dGFibGVpaX0KKworXGNsYXNze01ITWVzc2FnZX0gaW5zdGFuY2VzIG9mZmVyIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zZXF1ZW5jZXN9e30KK1JldHVybiBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHNlcXVlbmNlcyB0aGF0IGluY2x1ZGUgdGhpcyBtZXNzYWdlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2V0X3NlcXVlbmNlc317c2VxdWVuY2VzfQorU2V0IHRoZSBsaXN0IG9mIHNlcXVlbmNlcyB0aGF0IGluY2x1ZGUgdGhpcyBtZXNzYWdlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317YWRkX3NlcXVlbmNlfXtzZXF1ZW5jZX0KK0FkZCBcdmFye3NlcXVlbmNlfSB0byB0aGUgbGlzdCBvZiBzZXF1ZW5jZXMgdGhhdCBpbmNsdWRlIHRoaXMgbWVzc2FnZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3JlbW92ZV9zZXF1ZW5jZX17c2VxdWVuY2V9CitSZW1vdmUgXHZhcntzZXF1ZW5jZX0gZnJvbSB0aGUgbGlzdCBvZiBzZXF1ZW5jZXMgdGhhdCBpbmNsdWRlIHRoaXMgbWVzc2FnZS4KK1xlbmR7bWV0aG9kZGVzY30KKworV2hlbiBhbiBcY2xhc3N7TUhNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYQorXGNsYXNze01haWxkaXJNZXNzYWdlfSBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucyB0YWtlIHBsYWNlOgorCitcYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19CisgICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze01haWxkaXJNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7InVuc2VlbiIgc2VxdWVuY2V9e25vIFMgZmxhZ30KK1xsaW5laWl7InJlcGxpZWQiIHNlcXVlbmNlfXtSIGZsYWd9CitcbGluZWlpeyJmbGFnZ2VkIiBzZXF1ZW5jZX17RiBmbGFnfQorXGVuZHt0YWJsZWlpfQorCitXaGVuIGFuIFxjbGFzc3tNSE1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhbiBcY2xhc3N7bWJveE1lc3NhZ2V9CitvciBcY2xhc3N7TU1ERk1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgXG1haWxoZWFkZXJ7U3RhdHVzfSBhbmQKK1xtYWlsaGVhZGVye1gtU3RhdHVzfSBoZWFkZXJzIGFyZSBvbWl0dGVkIGFuZCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UKK3BsYWNlOgorCitcYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19CisgICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze21ib3hNZXNzYWdlfSBvciBcY2xhc3N7TU1ERk1lc3NhZ2V9IHN0YXRlfQorXGxpbmVpaXsidW5zZWVuIiBzZXF1ZW5jZX17bm8gUiBmbGFnfQorXGxpbmVpaXsicmVwbGllZCIgc2VxdWVuY2V9e0EgZmxhZ30KK1xsaW5laWl7ImZsYWdnZWQiIHNlcXVlbmNlfXtGIGZsYWd9CitcZW5ke3RhYmxlaWl9CisKK1doZW4gYW4gXGNsYXNze01ITWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGEgXGNsYXNze0JhYnlsTWVzc2FnZX0KK2luc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6CisKK1xiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KKyAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7QmFieWxNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7InVuc2VlbiIgc2VxdWVuY2V9eyJ1bnNlZW4iIGxhYmVsfQorXGxpbmVpaXsicmVwbGllZCIgc2VxdWVuY2V9eyJhbnN3ZXJlZCIgbGFiZWx9CitcZW5ke3RhYmxlaWl9CisKK1xzdWJzdWJzZWN0aW9ue1xjbGFzc3tCYWJ5bE1lc3NhZ2V9fQorXGxhYmVse21haWxib3gtYmFieWxtZXNzYWdlfQorCitcYmVnaW57Y2xhc3NkZXNjfXtCYWJ5bE1lc3NhZ2V9e1xvcHRpb25hbHttZXNzYWdlfX0KK0EgbWVzc2FnZSB3aXRoIEJhYnlsLXNwZWNpZmljIGJlaGF2aW9ycy4gUGFyYW1ldGVyIFx2YXJ7bWVzc2FnZX0gaGFzIHRoZSBzYW1lCittZWFuaW5nIGFzIHdpdGggdGhlIFxjbGFzc3tNZXNzYWdlfSBjb25zdHJ1Y3Rvci4KK1xlbmR7Y2xhc3NkZXNjfQorCitDZXJ0YWluIG1lc3NhZ2UgbGFiZWxzLCBjYWxsZWQgXGRmbnthdHRyaWJ1dGVzfSwgYXJlIGRlZmluZWQgYnkgY29udmVudGlvbiB0bworaGF2ZSBzcGVjaWFsIG1lYW5pbmdzLiBUaGUgYXR0cmlidXRlcyBhcmUgYXMgZm9sbG93czoKKworXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfXtMYWJlbH17RXhwbGFuYXRpb259CitcbGluZWlpe3Vuc2Vlbn17Tm90IHJlYWQsIGJ1dCBwcmV2aW91c2x5IGRldGVjdGVkIGJ5IE1VQX0KK1xsaW5laWl7ZGVsZXRlZH17TWFya2VkIGZvciBzdWJzZXF1ZW50IGRlbGV0aW9ufQorXGxpbmVpaXtmaWxlZH17Q29waWVkIHRvIGFub3RoZXIgZmlsZSBvciBtYWlsYm94fQorXGxpbmVpaXthbnN3ZXJlZH17UmVwbGllZCB0b30KK1xsaW5laWl7Zm9yd2FyZGVkfXtGb3J3YXJkZWR9CitcbGluZWlpe2VkaXRlZH17TW9kaWZpZWQgYnkgdGhlIHVzZXJ9CitcbGluZWlpe3Jlc2VudH17UmVzZW50fQorXGVuZHt0YWJsZWlpfQorCitCeSBkZWZhdWx0LCBSbWFpbCBkaXNwbGF5cyBvbmx5Cit2aXNpYmxlIGhlYWRlcnMuIFRoZSBcY2xhc3N7QmFieWxNZXNzYWdlfSBjbGFzcywgdGhvdWdoLCB1c2VzIHRoZSBvcmlnaW5hbAoraGVhZGVycyBiZWNhdXNlIHRoZXkgYXJlIG1vcmUgY29tcGxldGUuIFZpc2libGUgaGVhZGVycyBtYXkgYmUgYWNjZXNzZWQKK2V4cGxpY2l0bHkgaWYgZGVzaXJlZC4KKworXGNsYXNze0JhYnlsTWVzc2FnZX0gaW5zdGFuY2VzIG9mZmVyIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9sYWJlbHN9e30KK1JldHVybiBhIGxpc3Qgb2YgbGFiZWxzIG9uIHRoZSBtZXNzYWdlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2V0X2xhYmVsc317bGFiZWxzfQorU2V0IHRoZSBsaXN0IG9mIGxhYmVscyBvbiB0aGUgbWVzc2FnZSB0byBcdmFye2xhYmVsc30uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXthZGRfbGFiZWx9e2xhYmVsfQorQWRkIFx2YXJ7bGFiZWx9IHRvIHRoZSBsaXN0IG9mIGxhYmVscyBvbiB0aGUgbWVzc2FnZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3JlbW92ZV9sYWJlbH17bGFiZWx9CitSZW1vdmUgXHZhcntsYWJlbH0gZnJvbSB0aGUgbGlzdCBvZiBsYWJlbHMgb24gdGhlIG1lc3NhZ2UuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfdmlzaWJsZX17fQorUmV0dXJuIGFuIFxjbGFzc3tNZXNzYWdlfSBpbnN0YW5jZSB3aG9zZSBoZWFkZXJzIGFyZSB0aGUgbWVzc2FnZSdzIHZpc2libGUKK2hlYWRlcnMgYW5kIHdob3NlIGJvZHkgaXMgZW1wdHkuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtzZXRfdmlzaWJsZX17dmlzaWJsZX0KK1NldCB0aGUgbWVzc2FnZSdzIHZpc2libGUgaGVhZGVycyB0byBiZSB0aGUgc2FtZSBhcyB0aGUgaGVhZGVycyBpbgorXHZhcnttZXNzYWdlfS4gUGFyYW1ldGVyIFx2YXJ7dmlzaWJsZX0gc2hvdWxkIGJlIGEgXGNsYXNze01lc3NhZ2V9IGluc3RhbmNlLCBhbgorXGNsYXNze2VtYWlsLk1lc3NhZ2UuTWVzc2FnZX0gaW5zdGFuY2UsIGEgc3RyaW5nLCBvciBhIGZpbGUtbGlrZSBvYmplY3QgKHdoaWNoCitzaG91bGQgYmUgb3BlbiBpbiB0ZXh0IG1vZGUpLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317dXBkYXRlX3Zpc2libGV9e30KK1doZW4gYSBcY2xhc3N7QmFieWxNZXNzYWdlfSBpbnN0YW5jZSdzIG9yaWdpbmFsIGhlYWRlcnMgYXJlIG1vZGlmaWVkLCB0aGUKK3Zpc2libGUgaGVhZGVycyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgbW9kaWZpZWQgdG8gY29ycmVzcG9uZC4gVGhpcyBtZXRob2QKK3VwZGF0ZXMgdGhlIHZpc2libGUgaGVhZGVycyBhcyBmb2xsb3dzOiBlYWNoIHZpc2libGUgaGVhZGVyIHdpdGggYQorY29ycmVzcG9uZGluZyBvcmlnaW5hbCBoZWFkZXIgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgaGVhZGVyLCBlYWNoCit2aXNpYmxlIGhlYWRlciB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBvcmlnaW5hbCBoZWFkZXIgaXMgcmVtb3ZlZCwgYW5kIGFueSBvZgorXG1haWxoZWFkZXJ7RGF0ZX0sIFxtYWlsaGVhZGVye0Zyb219LCBcbWFpbGhlYWRlcntSZXBseS1Ub30sIFxtYWlsaGVhZGVye1RvfSwKK1xtYWlsaGVhZGVye0NDfSwgYW5kIFxtYWlsaGVhZGVye1N1YmplY3R9IHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsCitoZWFkZXJzIGJ1dCBub3QgdGhlIHZpc2libGUgaGVhZGVycyBhcmUgYWRkZWQgdG8gdGhlIHZpc2libGUgaGVhZGVycy4KK1xlbmR7bWV0aG9kZGVzY30KKworV2hlbiBhIFxjbGFzc3tCYWJ5bE1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhCitcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6CisKK1xiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KKyAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IHN0YXRlfQorXGxpbmVpaXsidW5zZWVuIiBsYWJlbH17bm8gUyBmbGFnfQorXGxpbmVpaXsiZGVsZXRlZCIgbGFiZWx9e1QgZmxhZ30KK1xsaW5laWl7ImFuc3dlcmVkIiBsYWJlbH17UiBmbGFnfQorXGxpbmVpaXsiZm9yd2FyZGVkIiBsYWJlbH17UCBmbGFnfQorXGVuZHt0YWJsZWlpfQorCitXaGVuIGEgXGNsYXNze0JhYnlsTWVzc2FnZX0gaW5zdGFuY2UgaXMgY3JlYXRlZCBiYXNlZCB1cG9uIGFuCitcY2xhc3N7bWJveE1lc3NhZ2V9IG9yIFxjbGFzc3tNTURGTWVzc2FnZX0gaW5zdGFuY2UsIHRoZSBcbWFpbGhlYWRlcntTdGF0dXN9CithbmQgXG1haWxoZWFkZXJ7WC1TdGF0dXN9IGhlYWRlcnMgYXJlIG9taXR0ZWQgYW5kIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMKK3Rha2UgcGxhY2U6CisKK1xiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KKyAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7bWJveE1lc3NhZ2V9IG9yIFxjbGFzc3tNTURGTWVzc2FnZX0gc3RhdGV9CitcbGluZWlpeyJ1bnNlZW4iIGxhYmVsfXtubyBSIGZsYWd9CitcbGluZWlpeyJkZWxldGVkIiBsYWJlbH17RCBmbGFnfQorXGxpbmVpaXsiYW5zd2VyZWQiIGxhYmVsfXtBIGZsYWd9CitcZW5ke3RhYmxlaWl9CisKK1doZW4gYSBcY2xhc3N7QmFieWxNZXNzYWdlfSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIHVwb24gYW4gXGNsYXNze01ITWVzc2FnZX0KK2luc3RhbmNlLCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIHRha2UgcGxhY2U6CisKK1xiZWdpbnt0YWJsZWlpfXtsfGx9e3RleHRybX0KKyAgICB7UmVzdWx0aW5nIHN0YXRlfXtcY2xhc3N7TUhNZXNzYWdlfSBzdGF0ZX0KK1xsaW5laWl7InVuc2VlbiIgbGFiZWx9eyJ1bnNlZW4iIHNlcXVlbmNlfQorXGxpbmVpaXsiYW5zd2VyZWQiIGxhYmVsfXsicmVwbGllZCIgc2VxdWVuY2V9CitcZW5ke3RhYmxlaWl9CisKK1xzdWJzdWJzZWN0aW9ue1xjbGFzc3tNTURGTWVzc2FnZX19CitcbGFiZWx7bWFpbGJveC1tbWRmbWVzc2FnZX0KKworXGJlZ2lue2NsYXNzZGVzY317TU1ERk1lc3NhZ2V9e1xvcHRpb25hbHttZXNzYWdlfX0KK0EgbWVzc2FnZSB3aXRoIE1NREYtc3BlY2lmaWMgYmVoYXZpb3JzLiBQYXJhbWV0ZXIgXHZhcnttZXNzYWdlfSBoYXMgdGhlIHNhbWUKK21lYW5pbmcgYXMgd2l0aCB0aGUgXGNsYXNze01lc3NhZ2V9IGNvbnN0cnVjdG9yLgorXGVuZHtjbGFzc2Rlc2N9CisKK0FzIHdpdGggbWVzc2FnZSBpbiBhbiBtYm94IG1haWxib3gsIE1NREYgbWVzc2FnZXMgYXJlIHN0b3JlZCB3aXRoIHRoZSBzZW5kZXIncworYWRkcmVzcyBhbmQgdGhlIGRlbGl2ZXJ5IGRhdGUgaW4gYW4gaW5pdGlhbCBsaW5lIGJlZ2lubmluZyB3aXRoICJGcm9tICIuCitMaWtld2lzZSwgZmxhZ3MgdGhhdCBpbmRpY2F0ZSB0aGUgc3RhdGUgb2YgdGhlIG1lc3NhZ2UgYXJlIHR5cGljYWxseSBzdG9yZWQgaW4KK1xtYWlsaGVhZGVye1N0YXR1c30gYW5kIFxtYWlsaGVhZGVye1gtU3RhdHVzfSBoZWFkZXJzLgorCitDb252ZW50aW9uYWwgZmxhZ3MgZm9yIE1NREYgbWVzc2FnZXMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBvZiBtYm94IG1lc3NhZ2UgYW5kCithcmUgYXMgZm9sbG93czoKKworXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17dGV4dHJtfXtGbGFnfXtNZWFuaW5nfXtFeHBsYW5hdGlvbn0KK1xsaW5laWlpe1J9e1JlYWR9e1JlYWR9CitcbGluZWlpaXtPfXtPbGR9e1ByZXZpb3VzbHkgZGV0ZWN0ZWQgYnkgTVVBfQorXGxpbmVpaWl7RH17RGVsZXRlZH17TWFya2VkIGZvciBzdWJzZXF1ZW50IGRlbGV0aW9ufQorXGxpbmVpaWl7Rn17RmxhZ2dlZH17TWFya2VkIGFzIGltcG9ydGFudH0KK1xsaW5laWlpe0F9e0Fuc3dlcmVkfXtSZXBsaWVkIHRvfQorXGVuZHt0YWJsZWlpaX0KKworVGhlICJSIiBhbmQgIk8iIGZsYWdzIGFyZSBzdG9yZWQgaW4gdGhlIFxtYWlsaGVhZGVye1N0YXR1c30gaGVhZGVyLCBhbmQgdGhlCisiRCIsICJGIiwgYW5kICJBIiBmbGFncyBhcmUgc3RvcmVkIGluIHRoZSBcbWFpbGhlYWRlcntYLVN0YXR1c30gaGVhZGVyLiBUaGUKK2ZsYWdzIGFuZCBoZWFkZXJzIHR5cGljYWxseSBhcHBlYXIgaW4gdGhlIG9yZGVyIG1lbnRpb25lZC4KKworXGNsYXNze01NREZNZXNzYWdlfSBpbnN0YW5jZXMgb2ZmZXIgdGhlIGZvbGxvd2luZyBtZXRob2RzLCB3aGljaCBhcmUgaWRlbnRpY2FsCit0byB0aG9zZSBvZmZlcmVkIGJ5IFxjbGFzc3ttYm94TWVzc2FnZX06CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfZnJvbX17fQorUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgIkZyb21+IiBsaW5lIHRoYXQgbWFya3MgdGhlIHN0YXJ0IG9mIHRoZQorbWVzc2FnZSBpbiBhbiBtYm94IG1haWxib3guIFRoZSBsZWFkaW5nICJGcm9tfiIgYW5kIHRoZSB0cmFpbGluZyBuZXdsaW5lIGFyZQorZXhjbHVkZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtzZXRfZnJvbX17ZnJvbV9cb3B0aW9uYWx7LCB0aW1lXz1Ob25lfX0KK1NldCB0aGUgIkZyb21+IiBsaW5lIHRvIFx2YXJ7ZnJvbV99LCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGhvdXQgYQorbGVhZGluZyAiRnJvbX4iIG9yIHRyYWlsaW5nIG5ld2xpbmUuIEZvciBjb252ZW5pZW5jZSwgXHZhcnt0aW1lX30gbWF5IGJlCitzcGVjaWZpZWQgYW5kIHdpbGwgYmUgZm9ybWF0dGVkIGFwcHJvcHJpYXRlbHkgYW5kIGFwcGVuZGVkIHRvIFx2YXJ7ZnJvbV99LiBJZgorXHZhcnt0aW1lX30gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBcY2xhc3N7c3RydWN0X3RpbWV9IGluc3RhbmNlLCBhIHR1cGxlCitzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBcbWV0aG9ke3RpbWUuc3RyZnRpbWUoKX0sIG9yIFxjb2Rle1RydWV9ICh0byB1c2UKK1xtZXRob2R7dGltZS5nbXRpbWUoKX0pLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X2ZsYWdzfXt9CitSZXR1cm4gYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZmxhZ3MgdGhhdCBhcmUgY3VycmVudGx5IHNldC4gSWYgdGhlIG1lc3NhZ2UKK2NvbXBsaWVzIHdpdGggdGhlIGNvbnZlbnRpb25hbCBmb3JtYXQsIHRoZSByZXN1bHQgaXMgdGhlIGNvbmNhdGVuYXRpb24gaW4gdGhlCitmb2xsb3dpbmcgb3JkZXIgb2YgemVybyBvciBvbmUgb2NjdXJyZW5jZSBvZiBlYWNoIG9mIFxjaGFyYWN0ZXJ7Un0sCitcY2hhcmFjdGVye099LCBcY2hhcmFjdGVye0R9LCBcY2hhcmFjdGVye0Z9LCBhbmQgXGNoYXJhY3RlcntBfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9mbGFnc317ZmxhZ3N9CitTZXQgdGhlIGZsYWdzIHNwZWNpZmllZCBieSBcdmFye2ZsYWdzfSBhbmQgdW5zZXQgYWxsIG90aGVycy4gUGFyYW1ldGVyCitcdmFye2ZsYWdzfSBzaG91bGQgYmUgdGhlIGNvbmNhdGVuYXRpb24gaW4gYW55IG9yZGVyIG9mIHplcm8gb3IgbW9yZQorb2NjdXJyZW5jZXMgb2YgZWFjaCBvZiBcY2hhcmFjdGVye1J9LCBcY2hhcmFjdGVye099LCBcY2hhcmFjdGVye0R9LAorXGNoYXJhY3RlcntGfSwgYW5kIFxjaGFyYWN0ZXJ7QX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXthZGRfZmxhZ317ZmxhZ30KK1NldCB0aGUgZmxhZyhzKSBzcGVjaWZpZWQgYnkgXHZhcntmbGFnfSB3aXRob3V0IGNoYW5naW5nIG90aGVyIGZsYWdzLiBUbyBhZGQKK21vcmUgdGhhbiBvbmUgZmxhZyBhdCBhIHRpbWUsIFx2YXJ7ZmxhZ30gbWF5IGJlIGEgc3RyaW5nIG9mIG1vcmUgdGhhbiBvbmUKK2NoYXJhY3Rlci4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3JlbW92ZV9mbGFnfXtmbGFnfQorVW5zZXQgdGhlIGZsYWcocykgc3BlY2lmaWVkIGJ5IFx2YXJ7ZmxhZ30gd2l0aG91dCBjaGFuZ2luZyBvdGhlciBmbGFncy4gVG8KK3JlbW92ZSBtb3JlIHRoYW4gb25lIGZsYWcgYXQgYSB0aW1lLCBcdmFye2ZsYWd9IG1heWJlIGEgc3RyaW5nIG9mIG1vcmUgdGhhbiBvbmUKK2NoYXJhY3Rlci4KK1xlbmR7bWV0aG9kZGVzY30KKworV2hlbiBhbiBcY2xhc3N7TU1ERk1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhCitcY2xhc3N7TWFpbGRpck1lc3NhZ2V9IGluc3RhbmNlLCBhICJGcm9tfiIgbGluZSBpcyBnZW5lcmF0ZWQgYmFzZWQgdXBvbiB0aGUKK1xjbGFzc3tNYWlsZGlyTWVzc2FnZX0gaW5zdGFuY2UncyBkZWxpdmVyeSBkYXRlLCBhbmQgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucwordGFrZSBwbGFjZToKKworXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQorICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3tNYWlsZGlyTWVzc2FnZX0gc3RhdGV9CitcbGluZWlpe1IgZmxhZ317UyBmbGFnfQorXGxpbmVpaXtPIGZsYWd9eyJjdXIiIHN1YmRpcmVjdG9yeX0KK1xsaW5laWl7RCBmbGFnfXtUIGZsYWd9CitcbGluZWlpe0YgZmxhZ317RiBmbGFnfQorXGxpbmVpaXtBIGZsYWd9e1IgZmxhZ30KK1xlbmR7dGFibGVpaX0KKworV2hlbiBhbiBcY2xhc3N7TU1ERk1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhbiBcY2xhc3N7TUhNZXNzYWdlfQoraW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgdGFrZSBwbGFjZToKKworXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQorICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3tNSE1lc3NhZ2V9IHN0YXRlfQorXGxpbmVpaXtSIGZsYWcgYW5kIE8gZmxhZ317bm8gInVuc2VlbiIgc2VxdWVuY2V9CitcbGluZWlpe08gZmxhZ317InVuc2VlbiIgc2VxdWVuY2V9CitcbGluZWlpe0YgZmxhZ317ImZsYWdnZWQiIHNlcXVlbmNlfQorXGxpbmVpaXtBIGZsYWd9eyJyZXBsaWVkIiBzZXF1ZW5jZX0KK1xlbmR7dGFibGVpaX0KKworV2hlbiBhbiBcY2xhc3N7TU1ERk1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhCitcY2xhc3N7QmFieWxNZXNzYWdlfSBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucyB0YWtlIHBsYWNlOgorCitcYmVnaW57dGFibGVpaX17bHxsfXt0ZXh0cm19CisgICAge1Jlc3VsdGluZyBzdGF0ZX17XGNsYXNze0JhYnlsTWVzc2FnZX0gc3RhdGV9CitcbGluZWlpe1IgZmxhZyBhbmQgTyBmbGFnfXtubyAidW5zZWVuIiBsYWJlbH0KK1xsaW5laWl7TyBmbGFnfXsidW5zZWVuIiBsYWJlbH0KK1xsaW5laWl7RCBmbGFnfXsiZGVsZXRlZCIgbGFiZWx9CitcbGluZWlpe0EgZmxhZ317ImFuc3dlcmVkIiBsYWJlbH0KK1xlbmR7dGFibGVpaX0KKworV2hlbiBhbiBcY2xhc3N7TU1ERk1lc3NhZ2V9IGluc3RhbmNlIGlzIGNyZWF0ZWQgYmFzZWQgdXBvbiBhbgorXGNsYXNze21ib3hNZXNzYWdlfSBpbnN0YW5jZSwgdGhlICJGcm9tfiIgbGluZSBpcyBjb3BpZWQgYW5kIGFsbCBmbGFncyBkaXJlY3RseQorY29ycmVzcG9uZDoKKworXGJlZ2lue3RhYmxlaWl9e2x8bH17dGV4dHJtfQorICAgIHtSZXN1bHRpbmcgc3RhdGV9e1xjbGFzc3ttYm94TWVzc2FnZX0gc3RhdGV9CitcbGluZWlpe1IgZmxhZ317UiBmbGFnfQorXGxpbmVpaXtPIGZsYWd9e08gZmxhZ30KK1xsaW5laWl7RCBmbGFnfXtEIGZsYWd9CitcbGluZWlpe0YgZmxhZ317RiBmbGFnfQorXGxpbmVpaXtBIGZsYWd9e0EgZmxhZ30KK1xlbmR7dGFibGVpaX0KKworXHN1YnNlY3Rpb257RXhjZXB0aW9uc30KK1xsYWJlbHttYWlsYm94LWRlcHJlY2F0ZWR9CisKK1RoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGNsYXNzZXMgYXJlIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7bWFpbGJveH0gbW9kdWxlOgorCitcYmVnaW57Y2xhc3NkZXNjfXtFcnJvcn17fQorVGhlIGJhc2VkIGNsYXNzIGZvciBhbGwgb3RoZXIgbW9kdWxlLXNwZWNpZmljIGV4Y2VwdGlvbnMuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2NsYXNzZGVzY317Tm9TdWNoTWFpbGJveEVycm9yfXt9CitSYWlzZWQgd2hlbiBhIG1haWxib3ggaXMgZXhwZWN0ZWQgYnV0IGlzIG5vdCBmb3VuZCwgc3VjaCBhcyB3aGVuIGluc3RhbnRpYXRpbmcKK2EgXGNsYXNze01haWxib3h9IHN1YmNsYXNzIHdpdGggYSBwYXRoIHRoYXQgZG9lcyBub3QgZXhpc3QgKGFuZCB3aXRoIHRoZQorXHZhcntjcmVhdGV9IHBhcmFtZXRlciBzZXQgdG8gXGNvZGV7RmFsc2V9KSwgb3Igd2hlbiBvcGVuaW5nIGEgZm9sZGVyIHRoYXQgZG9lcworbm90IGV4aXN0LgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e05vdEVtcHR5RXJyb3JFcnJvcn17fQorUmFpc2VkIHdoZW4gYSBtYWlsYm94IGlzIG5vdCBlbXB0eSBidXQgaXMgZXhwZWN0ZWQgdG8gYmUsIHN1Y2ggYXMgd2hlbiBkZWxldGluZworYSBmb2xkZXIgdGhhdCBjb250YWlucyBtZXNzYWdlcy4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtFeHRlcm5hbENsYXNoRXJyb3J9e30KK1JhaXNlZCB3aGVuIHNvbWUgbWFpbGJveC1yZWxhdGVkIGNvbmRpdGlvbiBiZXlvbmQgdGhlIGNvbnRyb2wgb2YgdGhlIHByb2dyYW0KK2NhdXNlcyBpdCB0byBiZSB1bmFibGUgdG8gcHJvY2VlZCwgc3VjaCBhcyB3aGVuIGZhaWxpbmcgdG8gYWNxdWlyZSBhIGxvY2sgdGhhdAorYW5vdGhlciBwcm9ncmFtIGFscmVhZHkgaG9sZHMgYSBsb2NrLCBvciB3aGVuIGEgdW5pcXVlbHktZ2VuZXJhdGVkIGZpbGUgbmFtZQorYWxyZWFkeSBleGlzdHMuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2NsYXNzZGVzY317Rm9ybWF0RXJyb3J9e30KK1JhaXNlZCB3aGVuIHRoZSBkYXRhIGluIGEgZmlsZSBjYW5ub3QgYmUgcGFyc2VkLCBzdWNoIGFzIHdoZW4gYW4gXGNsYXNze01IfQoraW5zdGFuY2UgYXR0ZW1wdHMgdG8gcmVhZCBhIGNvcnJ1cHRlZCBcZmlsZXsubWhfc2VxdWVuY2VzfSBmaWxlLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xzdWJzZWN0aW9ue0RlcHJlY2F0ZWQgY2xhc3NlcyBhbmQgbWV0aG9kc30KK1xsYWJlbHttYWlsYm94LWRlcHJlY2F0ZWR9CisKK09sZGVyIHZlcnNpb25zIG9mIHRoZSBcbW9kdWxle21haWxib3h9IG1vZHVsZSBkbyBub3Qgc3VwcG9ydCBtb2RpZmljYXRpb24gb2YKK21haWxib3hlcywgc3VjaCBhcyBhZGRpbmcgb3IgcmVtb3ZpbmcgbWVzc2FnZSwgYW5kIGRvIG5vdCBwcm92aWRlIGNsYXNzZXMgdG8KK3JlcHJlc2VudCBmb3JtYXQtc3BlY2lmaWMgbWVzc2FnZSBwcm9wZXJ0aWVzLiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlCitvbGRlciBtYWlsYm94IGNsYXNzZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSwgYnV0IHRoZSBuZXdlciBjbGFzc2VzIHNob3VsZCBiZSB1c2VkCitpbiBwcmVmZXJlbmNlIHRvIHRoZW0uCisKK09sZGVyIG1haWxib3ggb2JqZWN0cyBzdXBwb3J0IG9ubHkgaXRlcmF0aW9uIGFuZCBwcm92aWRlIGEgc2luZ2xlIHB1YmxpYworbWV0aG9kOgorCitcYmVnaW57bWV0aG9kZGVzY317bmV4dH17fQorUmV0dXJuIHRoZSBuZXh0IG1lc3NhZ2UgaW4gdGhlIG1haWxib3gsIGNyZWF0ZWQgd2l0aCB0aGUgb3B0aW9uYWwgXHZhcntmYWN0b3J5fQorYXJndW1lbnQgcGFzc2VkIGludG8gdGhlIG1haWxib3ggb2JqZWN0J3MgY29uc3RydWN0b3IuIEJ5IGRlZmF1bHQgdGhpcyBpcyBhbgorXGNsYXNze3JmYzgyMi5NZXNzYWdlfSBvYmplY3QgKHNlZSB0aGUgXHJlZm1vZHVsZXtyZmM4MjJ9IG1vZHVsZSkuICBEZXBlbmRpbmcKK29uIHRoZSBtYWlsYm94IGltcGxlbWVudGF0aW9uIHRoZSBcdmFye2ZwfSBhdHRyaWJ1dGUgb2YgdGhpcyBvYmplY3QgbWF5IGJlIGEKK3RydWUgZmlsZSBvYmplY3Qgb3IgYSBjbGFzcyBpbnN0YW5jZSBzaW11bGF0aW5nIGEgZmlsZSBvYmplY3QsIHRha2luZyBjYXJlIG9mCit0aGluZ3MgbGlrZSBtZXNzYWdlIGJvdW5kYXJpZXMgaWYgbXVsdGlwbGUgbWFpbCBtZXNzYWdlcyBhcmUgY29udGFpbmVkIGluIGEKK3NpbmdsZSBmaWxlLCBldGMuICBJZiBubyBtb3JlIG1lc3NhZ2VzIGFyZSBhdmFpbGFibGUsIHRoaXMgbWV0aG9kIHJldHVybnMKK1xjb2Rle05vbmV9LgorXGVuZHttZXRob2RkZXNjfQorCitNb3N0IG9mIHRoZSBvbGRlciBtYWlsYm94IGNsYXNzZXMgaGF2ZSBuYW1lcyB0aGF0IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50CittYWlsYm94IGNsYXNzIG5hbWVzLCBleGNlcHQgZm9yIFxjbGFzc3tNYWlsZGlyfS4gRm9yIHRoaXMgcmVhc29uLCB0aGUgbmV3CitcY2xhc3N7TWFpbGRpcn0gY2xhc3MgZGVmaW5lcyBhIFxtZXRob2R7bmV4dCgpfSBtZXRob2QgYW5kIGl0cyBjb25zdHJ1Y3RvcgorZGlmZmVycyBzbGlnaHRseSBmcm9tIHRob3NlIG9mIHRoZSBvdGhlciBuZXcgbWFpbGJveCBjbGFzc2VzLgorCitUaGUgb2xkZXIgbWFpbGJveCBjbGFzc2VzIHdob3NlIG5hbWVzIGFyZSBub3QgdGhlIHNhbWUgYXMgdGhlaXIgbmV3ZXIKK2NvdW50ZXJwYXJ0cyBhcmUgYXMgZm9sbG93czoKIAogXGJlZ2lue2NsYXNzZGVzY317VW5peE1haWxib3h9e2ZwXG9wdGlvbmFseywgZmFjdG9yeX19CiBBY2Nlc3MgdG8gYSBjbGFzc2ljIFxVTklYLXN0eWxlIG1haWxib3gsIHdoZXJlIGFsbCBtZXNzYWdlcyBhcmUKQEAgLTY4LDEyICsxMzA5LDYgQEAKIFx2YXJ7ZmFjdG9yeX0gaXMgYXMgd2l0aCB0aGUgXGNsYXNze1VuaXhNYWlsYm94fSBjbGFzcy4KIFxlbmR7Y2xhc3NkZXNjfQogCi1cYmVnaW57Y2xhc3NkZXNjfXtNYWlsZGlyfXtkaXJuYW1lXG9wdGlvbmFseywgZmFjdG9yeX19Ci1BY2Nlc3MgYSBRbWFpbCBtYWlsIGRpcmVjdG9yeS4gIEFsbCBuZXcgYW5kIGN1cnJlbnQgbWFpbCBmb3IgdGhlCi1tYWlsYm94IHNwZWNpZmllZCBieSBcdmFye2Rpcm5hbWV9IGlzIG1hZGUgYXZhaWxhYmxlLgotXHZhcntmYWN0b3J5fSBpcyBhcyB3aXRoIHRoZSBcY2xhc3N7VW5peE1haWxib3h9IGNsYXNzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KIFxiZWdpbntjbGFzc2Rlc2N9e0JhYnlsTWFpbGJveH17ZnBcb3B0aW9uYWx7LCBmYWN0b3J5fX0KIEFjY2VzcyBhIEJhYnlsIG1haWxib3gsIHdoaWNoIGlzIHNpbWlsYXIgdG8gYW4gTU1ERiBtYWlsYm94LiAgSW4KIEJhYnlsIGZvcm1hdCwgZWFjaCBtZXNzYWdlIGhhcyB0d28gc2V0cyBvZiBoZWFkZXJzLCB0aGUKQEAgLTg5LDExICsxMzI0LDggQEAKIFxjbGFzc3tVbml4TWFpbGJveH0gY2xhc3MuCiBcZW5ke2NsYXNzZGVzY30KIAotTm90ZSB0aGF0IGJlY2F1c2UgdGhlIFxyZWZtb2R1bGV7cmZjODIyfSBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgaXQgaXMKLXJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSB0aGUgXHJlZm1vZHVsZXtlbWFpbH0gcGFja2FnZSB0byBjcmVhdGUKLW1lc3NhZ2Ugb2JqZWN0cyBmcm9tIGEgbWFpbGJveC4gIChUaGUgZGVmYXVsdCBjYW4ndCBiZSBjaGFuZ2VkIGZvcgotYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy4pICBUaGUgc2FmZXN0IHdheSB0byBkbyB0aGlzIGlzIHdpdGgKLWJpdCBvZiBjb2RlOgorSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBvbGRlciBtYWlsYm94IGNsYXNzZXMgd2l0aCB0aGUgXG1vZHVsZXtlbWFpbH0gbW9kdWxlCityYXRoZXIgdGhhbiB0aGUgZGVwcmVjYXRlZCBcbW9kdWxle3JmYzgyMn0gbW9kdWxlLCB5b3UgY2FuIGRvIHNvIGFzIGZvbGxvd3M6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGltcG9ydCBlbWFpbApAQCAtMTA1LDE3ICsxMzM3LDE0IEBACiAgICAgICAgIHJldHVybiBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKICAgICBleGNlcHQgZW1haWwuRXJyb3JzLk1lc3NhZ2VQYXJzZUVycm9yOgogICAgICAgICAjIERvbid0IHJldHVybiBOb25lIHNpbmNlIHRoYXQgd2lsbAotCSMgc3RvcCB0aGUgbWFpbGJveCBpdGVyYXRvcgotCXJldHVybiAnJworICAgICAgICAjIHN0b3AgdGhlIG1haWxib3ggaXRlcmF0b3IKKyAgICAgICAgcmV0dXJuICcnCiAKIG1ib3ggPSBtYWlsYm94LlVuaXhNYWlsYm94KGZwLCBtc2dmYWN0b3J5KQogXGVuZHt2ZXJiYXRpbX0KIAotVGhlIGFib3ZlIHdyYXBwZXIgaXMgZGVmZW5zaXZlIGFnYWluc3QgaWxsLWZvcm1lZCBNSU1FIG1lc3NhZ2VzIGluIHRoZQotbWFpbGJveCwgYnV0IHlvdSBoYXZlIHRvIGJlIHByZXBhcmVkIHRvIHJlY2VpdmUgdGhlIGVtcHR5IHN0cmluZyBmcm9tCi10aGUgbWFpbGJveCdzIFxmdW5jdGlvbntuZXh0KCl9IG1ldGhvZC4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UKLWtub3cgeW91ciBtYWlsYm94IGNvbnRhaW5zIG9ubHkgd2VsbC1mb3JtZWQgTUlNRSBtZXNzYWdlcywgeW91IGNhbgotc2ltcGxpZnkgdGhpcyB0bzoKK0FsdGVybmF0aXZlbHksIGlmIHlvdSBrbm93IHlvdXIgbWFpbGJveCBjb250YWlucyBvbmx5IHdlbGwtZm9ybWVkIE1JTUUKK21lc3NhZ2VzLCB5b3UgY2FuIHNpbXBsaWZ5IHRoaXMgdG86CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGltcG9ydCBlbWFpbApAQCAtMTI0LDM1ICsxMzUzLDU3IEBACiBtYm94ID0gbWFpbGJveC5Vbml4TWFpbGJveChmcCwgZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUpCiBcZW5ke3ZlcmJhdGltfQogCi1cYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cucW1haWwub3JnL21hbi9tYW41L21ib3guaHRtbF17bWJveCAtCi0gICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgbWFpbCBtZXNzYWdlc317RGVzY3JpcHRpb24gb2YgdGhlCi0gICAgICAgICAgICB0cmFkaXRpb25hbCBgYG1ib3gnJyBtYWlsYm94IGZvcm1hdC59Ci0gIFxzZWV0aXRsZVtodHRwOi8vd3d3LnFtYWlsLm9yZy9tYW4vbWFuNS9tYWlsZGlyLmh0bWxde21haWxkaXIgLQotICAgICAgICAgICAgZGlyZWN0b3J5IGZvciBpbmNvbWluZyBtYWlsIG1lc3NhZ2VzfXtEZXNjcmlwdGlvbiBvZiB0aGUKLSAgICAgICAgICAgIGBgbWFpbGRpcicnIG1haWxib3ggZm9ybWF0Ln0KLSAgXHNlZXRpdGxlW2h0dHA6Ly9ob21lLm5ldHNjYXBlLmNvbS9lbmcvbW96aWxsYS8yLjAvcmVsbm90ZXMvZGVtby9jb250ZW50LWxlbmd0aC5odG1sXXtDb25maWd1cmluZwotICAgICAgICAgICAgTmV0c2NhcGUgTWFpbCBvbiBcVU5JWDogV2h5IHRoZSBDb250ZW50LUxlbmd0aCBGb3JtYXQgaXMKLSAgICAgICAgICAgIEJhZH17QSBkZXNjcmlwdGlvbiBvZiBwcm9ibGVtcyB3aXRoIHJlbHlpbmcgb24gdGhlCi0gICAgICAgICAgICBcbWFpbGhlYWRlcntDb250ZW50LUxlbmd0aH0gaGVhZGVyIGZvciBtZXNzYWdlcyBzdG9yZWQgaW4KLSAgICAgICAgICAgIG1haWxib3ggZmlsZXMufQotXGVuZHtzZWVhbHNvfQorXHN1YnNlY3Rpb257RXhhbXBsZXN9CitcbGFiZWx7bWFpbGJveC1leGFtcGxlc30KIAorQSBzaW1wbGUgZXhhbXBsZSBvZiBwcmludGluZyB0aGUgc3ViamVjdHMgb2YgYWxsIG1lc3NhZ2VzIGluIGEgbWFpbGJveCB0aGF0CitzZWVtIGludGVyZXN0aW5nOgogCi1cc3Vic2VjdGlvbntNYWlsYm94IE9iamVjdHMgXGxhYmVse21haWxib3gtb2JqZWN0c319CitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgbWFpbGJveAorZm9yIG1lc3NhZ2UgaW4gbWFpbGJveC5tYm94KCd+L21ib3gnKToKKyAgICBzdWJqZWN0ID0gbWVzc2FnZVsnc3ViamVjdCddICAgICAgICMgQ291bGQgcG9zc2libHkgYmUgTm9uZS4KKyAgICBpZiBzdWJqZWN0IGFuZCAncHl0aG9uJyBpbiBzdWJqZWN0Lmxvd2VyKCk6CisgICAgICAgIHByaW50IHN1YmplY3QKK1xlbmR7dmVyYmF0aW19CiAKLUFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgbWFpbGJveCBvYmplY3RzIGFyZSBpdGVyYWJsZSBvYmplY3RzLCBhbmQKLWhhdmUgb25lIGV4dGVybmFsbHkgdmlzaWJsZSBtZXRob2QuICBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGl0ZXJhdG9ycwotY3JlYXRlZCBmcm9tIG1haWxib3ggb2JqZWN0cyBhbmQgbWF5IGFsc28gYmUgdXNlZCBkaXJlY3RseS4KK0EgKHN1cnByaXNpbmdseSkgc2ltcGxlIGV4YW1wbGUgb2YgY29weWluZyBhbGwgbWFpbCBmcm9tIGEgQmFieWwgbWFpbGJveCB0byBhbgorTUggbWFpbGJveCwgY29udmVydGluZyBhbGwgb2YgdGhlIGZvcm1hdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZQorY29udmVydGVkOgogCi1cYmVnaW57bWV0aG9kZGVzY31bbWFpbGJveF17bmV4dH17fQotUmV0dXJuIHRoZSBuZXh0IG1lc3NhZ2UgaW4gdGhlIG1haWxib3gsIGNyZWF0ZWQgd2l0aCB0aGUgb3B0aW9uYWwKLVx2YXJ7ZmFjdG9yeX0gYXJndW1lbnQgcGFzc2VkIGludG8gdGhlIG1haWxib3ggb2JqZWN0J3MgY29uc3RydWN0b3IuCi1CeSBkZWZhdWx0IHRoaXMgaXMgYW4gXGNsYXNze3JmYzgyMi5NZXNzYWdlfQotb2JqZWN0IChzZWUgdGhlIFxyZWZtb2R1bGV7cmZjODIyfSBtb2R1bGUpLiAgRGVwZW5kaW5nIG9uIHRoZSBtYWlsYm94Ci1pbXBsZW1lbnRhdGlvbiB0aGUgXHZhcntmcH0gYXR0cmlidXRlIG9mIHRoaXMgb2JqZWN0IG1heSBiZSBhIHRydWUKLWZpbGUgb2JqZWN0IG9yIGEgY2xhc3MgaW5zdGFuY2Ugc2ltdWxhdGluZyBhIGZpbGUgb2JqZWN0LCB0YWtpbmcgY2FyZQotb2YgdGhpbmdzIGxpa2UgbWVzc2FnZSBib3VuZGFyaWVzIGlmIG11bHRpcGxlIG1haWwgbWVzc2FnZXMgYXJlCi1jb250YWluZWQgaW4gYSBzaW5nbGUgZmlsZSwgZXRjLiAgSWYgbm8gbW9yZSBtZXNzYWdlcyBhcmUgYXZhaWxhYmxlLAotdGhpcyBtZXRob2QgcmV0dXJucyBcY29kZXtOb25lfS4KLVxlbmR7bWV0aG9kZGVzY30KK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBtYWlsYm94CitkZXN0aW5hdGlvbiA9IG1haWxib3guTUgoJ34vTWFpbCcpCitmb3IgbWVzc2FnZSBpbiBtYWlsYm94LkJhYnlsKCd+L1JNQUlMJyk6CisgICAgZGVzdGluYXRpb24uYWRkKE1ITWVzc2FnZShtZXNzYWdlKSkKK1xlbmR7dmVyYmF0aW19CisKK0FuIGV4YW1wbGUgb2Ygc29ydGluZyBtYWlsIGZyb20gbnVtZXJvdXMgbWFpbGluZyBsaXN0cywgYmVpbmcgY2FyZWZ1bCB0byBhdm9pZAorbWFpbCBjb3JydXB0aW9uIGR1ZSB0byBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBieSBvdGhlciBwcm9ncmFtcywgbWFpbCBsb3NzIGR1ZQordG8gaW50ZXJydXB0aW9uIG9mIHRoZSBwcm9ncmFtLCBvciBwcmVtYXR1cmUgdGVybWluYXRpb24gZHVlIHRvIG1hbGZvcm1lZAorbWVzc2FnZXMgaW4gdGhlIG1haWxib3g6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBtYWlsYm94CitpbXBvcnQgZW1haWwuRXJyb3JzCitsaXN0X25hbWVzID0gKCdweXRob24tbGlzdCcsICdweXRob24tZGV2JywgJ3B5dGhvbi1idWdzJykKK2JveGVzID0gZGljdCgobmFtZSwgbWFpbGJveC5tYm94KCd+L2VtYWlsLyVzJyAlIG5hbWUpKSBmb3IgbmFtZSBpbiBsaXN0X25hbWVzKQoraW5ib3ggPSBtYWlsYm94Lk1haWxkaXIoJ34vTWFpbGRpcicsIE5vbmUpCitmb3Iga2V5IGluIGluYm94Lml0ZXJrZXlzKCk6CisgICAgdHJ5OgorICAgICAgICBtZXNzYWdlID0gaW5ib3hba2V5XQorICAgIGV4Y2VwdCBlbWFpbC5FcnJvcnMuTWVzc2FnZVBhcnNlRXJyb3I6CisgICAgICAgIGNvbnRpbnVlICAgICAgICAgICAgICAgICMgVGhlIG1lc3NhZ2UgaXMgbWFsZm9ybWVkLiBKdXN0IGxlYXZlIGl0LgorICAgIGZvciBuYW1lIGluIGxpc3RfbmFtZXM6CisgICAgICAgIGxpc3RfaWQgPSBtZXNzYWdlWydsaXN0LWlkJ10KKyAgICAgICAgaWYgbGlzdF9pZCBhbmQgbmFtZSBpbiBsaXN0X2lkOgorICAgICAgICAgICAgYm94ID0gYm94ZXNbbmFtZV0KKyAgICAgICAgICAgIGJveC5sb2NrKCkKKyAgICAgICAgICAgIGJveC5hZGQobWVzc2FnZSkKKyAgICAgICAgICAgIGJveC5mbHVzaCgpICAgICAgICAgIyBXcml0ZSBjb3B5IHRvIGRpc2sgYmVmb3JlIHJlbW92aW5nIG9yaWdpbmFsLgorICAgICAgICAgICAgYm94LnVubG9jaygpCisgICAgICAgICAgICBpbmJveC5kaXNjYXJkKGtleSkKKyAgICAgICAgICAgIGJyZWFrICAgICAgICAgICAgICAgIyBGb3VuZCBkZXN0aW5hdGlvbiwgc28gc3RvcCBsb29raW5nLgorZm9yIGJveCBpbiBib3hlcy5pdGVydmFsdWVzKCk6CisgICAgYm94LmNsb3NlKCkKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYm1zaWxpYi50ZXggYi9Eb2MvbGliL2xpYm1zaWxpYi50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwNDRmNAotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvbGlibXNpbGliLnRleApAQCAtMCwwICsxLDQ4NSBAQAorXHNlY3Rpb257XG1vZHVsZXttc2lsaWJ9IC0tLQorICAgICAgICAgUmVhZCBhbmQgd3JpdGUgTWljcm9zb2Z0IEluc3RhbGxlciBmaWxlc30KKworXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e21zaWxpYn0KKyAgXHBsYXRmb3Jte1dpbmRvd3N9CitcbW9kdWxlc3lub3BzaXN7Q3JlYXRpb24gb2YgTWljcm9zb2Z0IEluc3RhbGxlciBmaWxlcywgYW5kIENBQiBmaWxlcy59CitcbW9kdWxlYXV0aG9ye01hcnRpbiB2LiBMXCJvd2lzfXttYXJ0aW5Adi5sb2V3aXMuZGV9Citcc2VjdGlvbmF1dGhvcntNYXJ0aW4gdi4gTFwib3dpc317bWFydGluQHYubG9ld2lzLmRlfQorCitcaW5kZXh7bXNpfQorCitcdmVyc2lvbmFkZGVkezIuNX0KKworVGhlIFxtb2R1bGV7bXNpbGlifSBzdXBwb3J0cyB0aGUgY3JlYXRpb24gb2YgTWljcm9zb2Z0IEluc3RhbGxlcgorKFxjb2Rley5tc2l9KSBmaWxlcy4gIEJlY2F1c2UgdGhlc2UgZmlsZXMgb2Z0ZW4gY29udGFpbiBhbiBlbWJlZGRlZAorYGBjYWJpbmV0JycgZmlsZSAoXGNvZGV7LmNhYn0pLCBpdCBhbHNvIGV4cG9zZXMgYW4gQVBJIHRvIGNyZWF0ZQorQ0FCIGZpbGVzLiBTdXBwb3J0IGZvciByZWFkaW5nIFxjb2Rley5jYWJ9IGZpbGVzIGlzIGN1cnJlbnRseSBub3QKK2ltcGxlbWVudGVkOyByZWFkIHN1cHBvcnQgZm9yIHRoZSBcY29kZXsubXNpfSBkYXRhYmFzZSBpcyBwb3NzaWJsZS4KKworVGhpcyBwYWNrYWdlIGFpbXMgdG8gcHJvdmlkZSBjb21wbGV0ZSBhY2Nlc3MgdG8gYWxsIHRhYmxlcyBpbiBhbgorXGNvZGV7Lm1zaX0gZmlsZSwgdGhlcmVmb3JlLCBpdCBpcyBhIGZhaXJseSBsb3ctbGV2ZWwgQVBJLiBUd28KK3ByaW1hcnkgYXBwbGljYXRpb25zIG9mIHRoaXMgcGFja2FnZSBhcmUgdGhlIFxtb2R1bGV7ZGlzdHV0aWxzfQorY29tbWFuZCBcY29kZXtiZGlzdF9tc2l9LCBhbmQgdGhlIGNyZWF0aW9uIG9mIFB5dGhvbiBpbnN0YWxsZXIKK3BhY2thZ2UgaXRzZWxmIChhbHRob3VnaCB0aGF0IGN1cnJlbnRseSB1c2VzIGEgZGlmZmVyZW50IHZlcnNpb24KK29mIFxjb2Rle21zaWxpYn0pLgorCitUaGUgcGFja2FnZSBjb250ZW50cyBjYW4gYmUgcm91Z2hseSBzcGxpdCBpbnRvIGZvdXIgcGFydHM6Citsb3ctbGV2ZWwgQ0FCIHJvdXRpbmVzLCBsb3ctbGV2ZWwgTVNJIHJvdXRpbmVzLCBoaWdoZXItbGV2ZWwKK01TSSByb3V0aW5lcywgYW5kIHN0YW5kYXJkIHRhYmxlIHN0cnVjdHVyZXMuCisKK1xiZWdpbntmdW5jZGVzY317RkNJQ3JlYXRlfXtjYWJuYW1lLCBmaWxlc30KKyAgQ3JlYXRlIGEgbmV3IENBQiBmaWxlIG5hbWVkIFx2YXJ7Y2FibmFtZX0uIFx2YXJ7ZmlsZXN9IG11c3QKKyAgYmUgYSBsaXN0IG9mIHR1cGxlcywgZWFjaCBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIG9uCisgIGRpc2ssIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbnNpZGUgdGhlIENBQiBmaWxlLgorCisgIFRoZSBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIENBQiBmaWxlIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcgorICBpbiB0aGUgbGlzdC4gQWxsIGZpbGVzIGFyZSBhZGRlZCBpbnRvIGEgc2luZ2xlIENBQiBmaWxlLAorICB1c2luZyB0aGUgTVNaSVAgY29tcHJlc3Npb24gYWxnb3JpdGhtLgorCisgIENhbGxiYWNrcyB0byBQeXRob24gZm9yIHRoZSB2YXJpb3VzIHN0ZXBzIG9mIE1TSSBjcmVhdGlvbgorICBhcmUgY3VycmVudGx5IG5vdCBleHBvc2VkLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtVVUlEQ3JlYXRlfXt9CisgIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbmV3IHVuaXF1ZSBpZGVudGlmaWVyLgorICBUaGlzIHdyYXBzIHRoZSBXaW5kb3dzIEFQSSBmdW5jdGlvbnMgXGNmdW5jdGlvbntVdWlkQ3JlYXRlfSBhbmQKKyAgXGNmdW5jdGlvbntVdWlkVG9TdHJpbmd9LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtPcGVuRGF0YWJhc2V9e3BhdGgsIHBlcnNpc3R9CisgIFJldHVybiBhIG5ldyBkYXRhYmFzZSBvYmplY3QgYnkgY2FsbGluZyBNc2lPcGVuRGF0YWJhc2UuICAKKyAgXHZhcntwYXRofSBpcyB0aGUgZmlsZSBuYW1lIG9mIHRoZQorICBNU0kgZmlsZTsgXHZhcntwZXJzaXN0fSBjYW4gYmUgb25lIG9mIHRoZSBjb25zdGFudHMgCisgIFxjb2Rle01TSURCT1BFTl9DUkVBVEVESVJFQ1R9LCBcY29kZXtNU0lEQk9QRU5fQ1JFQVRFfSwKKyAgXGNvZGV7TVNJREJPUEVOX0RJUkVDVH0sIFxjb2Rle01TSURCT1BFTl9SRUFET05MWX0sIG9yCisgIFxjb2Rle01TSURCT1BFTl9UUkFOU0FDVH0sIGFuZCBtYXkgaW5jbHVkZSB0aGUgZmxhZworICBcY29kZXtNU0lEQk9QRU5fUEFUQ0hGSUxFfS4gU2VlIHRoZSBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBmb3IKKyAgdGhlIG1lYW5pbmcgb2YgdGhlc2UgZmxhZ3M7IGRlcGVuZGluZyBvbiB0aGUgZmxhZ3MsCisgIGFuIGV4aXN0aW5nIGRhdGFiYXNlIGlzIG9wZW5lZCwgb3IgYSBuZXcgb25lIGNyZWF0ZWQuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e0NyZWF0ZVJlY29yZH17Y291bnR9CisgIFJldHVybiBhIG5ldyByZWNvcmQgb2JqZWN0IGJ5IGNhbGxpbmcgXGNmdW5jdGlvbntNU0lDcmVhdGVSZWNvcmR9LgorICBcdmFye2NvdW50fSBpcyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvZiB0aGUgcmVjb3JkLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtpbml0X2RhdGFiYXNlfXtuYW1lLCBzY2hlbWEsIFByb2R1Y3ROYW1lLCBQcm9kdWN0Q29kZSwgUHJvZHVjdFZlcnNpb24sIE1hbnVmYWN0dXJlcn0KKyAgQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgZGF0YWJhc2UgXHZhcntuYW1lfSwgaW5pdGlhbGl6ZSBpdCAKKyAgd2l0aCBcdmFye3NjaGVtYX0sICBhbmQgc2V0IHRoZSBwcm9wZXJ0aWVzIFx2YXJ7UHJvZHVjdE5hbWV9LAorICBcdmFye1Byb2R1Y3RDb2RlfSwgXHZhcntQcm9kdWN0VmVyc2lvbn0sIGFuZCBcdmFye01hbnVmYWN0dXJlcn0uCisKKyAgXHZhcntzY2hlbWF9IG11c3QgYmUgYSBtb2R1bGUgb2JqZWN0IGNvbnRhaW5pbmcgXGNvZGV7dGFibGVzfSBhbmQKKyAgXGNvZGV7X1ZhbGlkYXRpb25fcmVjb3Jkc30gYXR0cmlidXRlczsgdHlwaWNhbGx5LAorICBcbW9kdWxle21zaWxpYi5zY2hlbWF9IHNob3VsZCBiZSB1c2VkLgorCisgIFRoZSBkYXRhYmFzZSB3aWxsIGNvbnRhaW4ganVzdCB0aGUgc2NoZW1hIGFuZCB0aGUgdmFsaWRhdGlvbgorICByZWNvcmRzIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthZGRfZGF0YX17ZGF0YWJhc2UsIHJlY29yZHN9CisgIEFkZCBhbGwgXHZhcntyZWNvcmRzfSB0byBcdmFye2RhdGFiYXNlfS4gIFx2YXJ7cmVjb3Jkc30gc2hvdWxkCisgIGJlIGEgbGlzdCBvZiB0dXBsZXMsIGVhY2ggb25lIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBvZiBhIHJlY29yZAorICBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuICBGb3Igb3B0aW9uYWwgZmllbGRzLAorICBcY29kZXtOb25lfSBjYW4gYmUgcGFzc2VkLgorCisgIEZpZWxkIHZhbHVlcyBjYW4gYmUgaW50IG9yIGxvbmcgbnVtYmVycywgc3RyaW5ncywgb3IgaW5zdGFuY2VzCisgIG9mIHRoZSBCaW5hcnkgY2xhc3MuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtCaW5hcnl9e2ZpbGVuYW1lfQorICBSZXByZXNlbnRzIGVudHJpZXMgaW4gdGhlIEJpbmFyeSB0YWJsZTsgaW5zZXJ0aW5nIHN1Y2gKKyAgYW4gb2JqZWN0IHVzaW5nIFxmdW5jdGlvbnthZGRfZGF0YX0gcmVhZHMgdGhlIGZpbGUgbmFtZWQKKyAgXHZhcntmaWxlbmFtZX0gaW50byB0aGUgdGFibGUuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthZGRfdGFibGVzfXtkYXRhYmFzZSwgbW9kdWxlfQorICBBZGQgYWxsIHRhYmxlIGNvbnRlbnQgZnJvbSBcdmFye21vZHVsZX0gdG8gXHZhcntkYXRhYmFzZX0uCisgIFx2YXJ7bW9kdWxlfSBtdXN0IGNvbnRhaW4gYW4gYXR0cmlidXRlIFx2YXJ7dGFibGVzfQorICBsaXN0aW5nIGFsbCB0YWJsZXMgZm9yIHdoaWNoIGNvbnRlbnQgc2hvdWxkIGJlIGFkZGVkLAorICBhbmQgb25lIGF0dHJpYnV0ZSBwZXIgdGFibGUgdGhhdCBoYXMgdGhlIGFjdHVhbCBjb250ZW50LgorCisgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gaW5zdGFsbCB0aGUgc2VxdWVuY2UgdGFibGVzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthZGRfc3RyZWFtfXtkYXRhYmFzZSwgbmFtZSwgcGF0aH0KKyAgQWRkIHRoZSBmaWxlIFx2YXJ7cGF0aH0gaW50byB0aGUgXGNvZGV7X1N0cmVhbX0gdGFibGUKKyAgb2YgXHZhcntkYXRhYmFzZX0sIHdpdGggdGhlIHN0cmVhbSBuYW1lIFx2YXJ7bmFtZX0uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2dlbl91dWlkfXt9CisgIFJldHVybiBhIG5ldyBVVUlELCBpbiB0aGUgZm9ybWF0IHRoYXQgTVNJIHR5cGljYWxseQorICByZXF1aXJlcyAoaS5lLiBpbiBjdXJseSBicmFjZXMsIGFuZCB3aXRoIGFsbCBoZXhkaWdpdHMKKyAgaW4gdXBwZXItY2FzZSkuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57c2VlYWxzb30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvZGV2bm90ZXMvd2lucHJvZy9mY2ljcmVhdGUuYXNwXXtGQ0lDcmVhdGVGaWxlfXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL3JwYy9ycGMvdXVpZGNyZWF0ZS5hc3Bde1V1aWRDcmVhdGV9e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvcnBjL3JwYy91dWlkdG9zdHJpbmcuYXNwXXtVdWlkVG9TdHJpbmd9e30KK1xlbmR7c2VlYWxzb30KKworXHN1YnNlY3Rpb257RGF0YWJhc2UgT2JqZWN0c1xsYWJlbHtkYXRhYmFzZS1vYmplY3RzfX0KKworXGJlZ2lue21ldGhvZGRlc2N9e09wZW5WaWV3fXtzcWx9CisgIFJldHVybiBhIHZpZXcgb2JqZWN0LCBieSBjYWxsaW5nIFxjZnVuY3Rpb257TVNJRGF0YWJhc2VPcGVuVmlld30uCisgIFx2YXJ7c3FsfSBpcyB0aGUgU1FMIHN0YXRlbWVudCB0byBleGVjdXRlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Q29tbWl0fXt9CisgIENvbW1pdCB0aGUgY2hhbmdlcyBwZW5kaW5nIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLAorICBieSBjYWxsaW5nIFxjZnVuY3Rpb257TVNJRGF0YWJhc2VDb21taXR9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317R2V0U3VtbWFyeUluZm9ybWF0aW9ufXtjb3VudH0KKyAgUmV0dXJuIGEgbmV3IHN1bW1hcnkgaW5mb3JtYXRpb24gb2JqZWN0LCBieSBjYWxsaW5nCisgIFxjZnVuY3Rpb257TXNpR2V0U3VtbWFyeUluZm9ybWF0aW9ufS4gIFx2YXJ7Y291bnR9IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICB1cGRhdGVkIHZhbHVlcy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue3NlZWFsc299CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2lvcGVudmlldy5hc3Bde01TSU9wZW5WaWV3fXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2lkYXRhYmFzZWNvbW1pdC5hc3Bde01TSURhdGFiYXNlQ29tbWl0fXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2lnZXRzdW1tYXJ5aW5mb3JtYXRpb24uYXNwXXtNU0lHZXRTdW1tYXJ5SW5mb3JtYXRpb259e30KK1xlbmR7c2VlYWxzb30KKworXHN1YnNlY3Rpb257VmlldyBPYmplY3RzXGxhYmVse3ZpZXctb2JqZWN0c319CisKK1xiZWdpbnttZXRob2RkZXNjfXtFeGVjdXRlfXtcb3B0aW9uYWx7cGFyYW1zPU5vbmV9fQorICBFeGVjdXRlIHRoZSBTUUwgcXVlcnkgb2YgdGhlIHZpZXcsIHRocm91Z2ggXGNmdW5jdGlvbntNU0lWaWV3RXhlY3V0ZX0uCisgIFx2YXJ7cGFyYW1zfSBpcyBhbiBvcHRpb25hbCByZWNvcmQgZGVzY3JpYmluZyBhY3R1YWwgdmFsdWVzCisgIG9mIHRoZSBwYXJhbWV0ZXIgdG9rZW5zIGluIHRoZSBxdWVyeS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e0dldENvbHVtbkluZm99e2tpbmR9CisgIFJldHVybiBhIHJlY29yZCBkZXNjcmliaW5nIHRoZSBjb2x1bW5zIG9mIHRoZSB2aWV3LCB0aHJvdWdoCisgIGNhbGxpbmcgXGNmdW5jdGlvbntNc2lWaWV3R2V0Q29sdW1uSW5mb30uIFx2YXJ7a2luZH0gY2FuIGJlIGVpdGhlcgorICBcY29kZXtNU0lDT0xJTkZPX05BTUVTfSBvciBcY29kZXtNU0lDT0xJTkZPX1RZUEVTfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e0ZldGNofXt9CisgIFJldHVybiBhIHJlc3VsdCByZWNvcmQgb2YgdGhlIHF1ZXJ5LCB0aHJvdWdoIGNhbGxpbmcKKyAgXGNmdW5jdGlvbntNc2lWaWV3RmV0Y2h9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317TW9kaWZ5fXtraW5kLCBkYXRhfQorICBNb2RpZnkgdGhlIHZpZXcsIGJ5IGNhbGxpbmcgXGNmdW5jdGlvbntNc2lWaWV3TW9kaWZ5fS4gXHZhcntraW5kfQorICBjYW4gYmUgb25lIG9mICBcY29kZXtNU0lNT0RJRllfU0VFS30sIFxjb2Rle01TSU1PRElGWV9SRUZSRVNIfSwKKyAgXGNvZGV7TVNJTU9ESUZZX0lOU0VSVH0sIFxjb2Rle01TSU1PRElGWV9VUERBVEV9LCBcY29kZXtNU0lNT0RJRllfQVNTSUdOfSwKKyAgXGNvZGV7TVNJTU9ESUZZX1JFUExBQ0V9LCBcY29kZXtNU0lNT0RJRllfTUVSR0V9LCBcY29kZXtNU0lNT0RJRllfREVMRVRFfSwKKyAgXGNvZGV7TVNJTU9ESUZZX0lOU0VSVF9URU1QT1JBUll9LCBcY29kZXtNU0lNT0RJRllfVkFMSURBVEV9LAorICBcY29kZXtNU0lNT0RJRllfVkFMSURBVEVfTkVXfSwgXGNvZGV7TVNJTU9ESUZZX1ZBTElEQVRFX0ZJRUxEfSwgb3IKKyAgXGNvZGV7TVNJTU9ESUZZX1ZBTElEQVRFX0RFTEVURX0uCisKKyAgXHZhcntkYXRhfSBtdXN0IGJlIGEgcmVjb3JkIGRlc2NyaWJpbmcgdGhlIG5ldyBkYXRhLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Q2xvc2V9e30KKyAgQ2xvc2UgdGhlIHZpZXcsIHRocm91Z2ggXGNmdW5jdGlvbntNc2lWaWV3Q2xvc2V9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57c2VlYWxzb30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXZpZXdleGVjdXRlLmFzcF17TXNpVmlld0V4ZWN1dGV9e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXZpZXdnZXRjb2x1bW5pbmZvLmFzcF17TVNJVmlld0dldENvbHVtbkluZm99e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXZpZXdmZXRjaC5hc3Bde01zaVZpZXdGZXRjaH17fQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpdmlld21vZGlmeS5hc3Bde01zaVZpZXdNb2RpZnl9e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXZpZXdjbG9zZS5hc3Bde01zaVZpZXdDbG9zZX17fQorXGVuZHtzZWVhbHNvfQorCitcc3Vic2VjdGlvbntTdW1tYXJ5IEluZm9ybWF0aW9uIE9iamVjdHNcbGFiZWx7c3VtbWFyeS1vYmplY3RzfX0KKworXGJlZ2lue21ldGhvZGRlc2N9e0dldFByb3BlcnR5fXtmaWVsZH0KKyAgUmV0dXJuIGEgcHJvcGVydHkgb2YgdGhlIHN1bW1hcnksIHRocm91Z2ggXGNmdW5jdGlvbntNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5fS4KKyAgXHZhcntmaWVsZH0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LCBhbmQgY2FuIGJlIG9uZSBvZiB0aGUKKyAgY29uc3RhbnRzCisgIFxjb2Rle1BJRF9DT0RFUEFHRX0sIFxjb2Rle1BJRF9USVRMRX0sIFxjb2Rle1BJRF9TVUJKRUNUfSwKKyAgXGNvZGV7UElEX0FVVEhPUn0sIFxjb2Rle1BJRF9LRVlXT1JEU30sIFxjb2Rle1BJRF9DT01NRU5UU30sCisgIFxjb2Rle1BJRF9URU1QTEFURX0sIFxjb2Rle1BJRF9MQVNUQVVUSE9SfSwgXGNvZGV7UElEX1JFVk5VTUJFUn0sCisgIFxjb2Rle1BJRF9MQVNUUFJJTlRFRH0sIFxjb2Rle1BJRF9DUkVBVEVfRFRNfSwgXGNvZGV7UElEX0xBU1RTQVZFX0RUTX0sCisgIFxjb2Rle1BJRF9QQUdFQ09VTlR9LCBcY29kZXtQSURfV09SRENPVU5UfSwgXGNvZGV7UElEX0NIQVJDT1VOVH0sCisgIFxjb2Rle1BJRF9BUFBOQU1FfSwgb3IgXGNvZGV7UElEX1NFQ1VSSVRZfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e0dldFByb3BlcnR5Q291bnR9e30KKyAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3VtbWFyeSBwcm9wZXJ0aWVzLCB0aHJvdWdoCisgIFxjZnVuY3Rpb257TXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eUNvdW50fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e1NldFByb3BlcnR5fXtmaWVsZCwgdmFsdWV9CisgIFNldCBhIHByb3BlcnR5IHRocm91Z2ggXGNmdW5jdGlvbntNc2lTdW1tYXJ5SW5mb1NldFByb3BlcnR5fS4gXHZhcntmaWVsZH0KKyAgY2FuIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGFzIGluIFxtZXRob2R7R2V0UHJvcGVydHl9LCBcdmFye3ZhbHVlfQorICBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gUG9zc2libGUgdmFsdWUgdHlwZXMgYXJlIGludGVnZXIKKyAgYW5kIHN0cmluZy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e1BlcnNpc3R9e30KKyAgV3JpdGUgdGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgdG8gdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gc3RyZWFtLAorICB1c2luZyBcY2Z1bmN0aW9ue01zaVN1bW1hcnlJbmZvUGVyc2lzdH0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpc3VtbWFyeWluZm9nZXRwcm9wZXJ0eS5hc3Bde01zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHl9e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXN1bW1hcnlpbmZvZ2V0cHJvcGVydHljb3VudC5hc3Bde01zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudH17fQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpc3VtbWFyeWluZm9zZXRwcm9wZXJ0eS5hc3Bde01zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHl9e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXN1bW1hcnlpbmZvcGVyc2lzdC5hc3Bde01zaVN1bW1hcnlJbmZvUGVyc2lzdH17fQorXGVuZHtzZWVhbHNvfQorCitcc3Vic2VjdGlvbntSZWNvcmQgT2JqZWN0c1xsYWJlbHtyZWNvcmQtb2JqZWN0c319CisKK1xiZWdpbnttZXRob2RkZXNjfXtHZXRGaWVsZENvdW50fXt9CisgIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvZiB0aGUgcmVjb3JkLCB0aHJvdWdoIFxjZnVuY3Rpb257TXNpUmVjb3JkR2V0RmllbGRDb3VudH0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtTZXRTdHJpbmd9e2ZpZWxkLCB2YWx1ZX0KKyAgU2V0IFx2YXJ7ZmllbGR9IHRvIFx2YXJ7dmFsdWV9IHRocm91Z2ggXGNmdW5jdGlvbntNc2lSZWNvcmRTZXRTdHJpbmd9LgorICBcdmFye2ZpZWxkfSBtdXN0IGJlIGFuIGludGVnZXI7IFx2YXJ7dmFsdWV9IGEgc3RyaW5nLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317U2V0U3RyZWFtfXtmaWVsZCwgdmFsdWV9CisgIFNldCBcdmFye2ZpZWxkfSB0byB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgbmFtZWQgXHZhcnt2YWx1ZX0sCisgIHRocm91Z2ggXGNmdW5jdGlvbntNc2lSZWNvcmRTZXRTdHJlYW19LgorICBcdmFye2ZpZWxkfSBtdXN0IGJlIGFuIGludGVnZXI7IFx2YXJ7dmFsdWV9IGEgc3RyaW5nLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317U2V0SW50ZWdlcn17ZmllbGQsIHZhbHVlfQorICBTZXQgXHZhcntmaWVsZH0gdG8gXHZhcnt2YWx1ZX0gdGhyb3VnaCBcY2Z1bmN0aW9ue01zaVJlY29yZFNldEludGVnZXJ9LgorICBCb3RoIFx2YXJ7ZmllbGR9IGFuZCBcdmFye3ZhbHVlfSBtdXN0IGJlIGFuIGludGVnZXIuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtDbGVhckRhdGF9e30KKyAgU2V0IGFsbCBmaWVsZHMgb2YgdGhlIHJlY29yZCB0byAwLCB0aHJvdWdoIFxjZnVuY3Rpb257TXNpUmVjb3JkQ2xlYXJEYXRhfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue3NlZWFsc299CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2lyZWNvcmRnZXRmaWVsZGNvdW50LmFzcF17TXNpUmVjb3JkR2V0RmllbGRDb3VudH17fQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvbXNpcmVjb3Jkc2V0c3RyaW5nLmFzcF17TXNpUmVjb3JkU2V0U3RyaW5nfXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2lyZWNvcmRzZXRzdHJlYW0uYXNwXXtNc2lSZWNvcmRTZXRTdHJlYW19e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL21zaXJlY29yZHNldGludGVnZXIuYXNwXXtNc2lSZWNvcmRTZXRJbnRlZ2VyfXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZGVmYXVsdC5hc3A/dXJsPS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9tc2lyZWNvcmRjbGVhci5hc3Bde01zaVJlY29yZENsZWFyfXt9CitcZW5ke3NlZWFsc299CisKK1xzdWJzZWN0aW9ue0Vycm9yc1xsYWJlbHttc2ktZXJyb3JzfX0KKworQWxsIHdyYXBwZXJzIGFyb3VuZCBNU0kgZnVuY3Rpb25zIHJhaXNlIFxleGNlcHRpb257TXNpRXJyb3J9OwordGhlIHN0cmluZyBpbnNpZGUgdGhlIGV4Y2VwdGlvbiB3aWxsIGNvbnRhaW4gbW9yZSBkZXRhaWwuCisKK1xzdWJzZWN0aW9ue0NBQiBPYmplY3RzXGxhYmVse2NhYn19CisKK1xiZWdpbntjbGFzc2Rlc2N9e0NBQn17bmFtZX0KKyAgVGhlIGNsYXNzIFxjbGFzc3tDQUJ9IHJlcHJlc2VudHMgYSBDQUIgZmlsZS4gRHVyaW5nIE1TSSBjb25zdHJ1Y3Rpb24sCisgIGZpbGVzIHdpbGwgYmUgYWRkZWQgc2ltdWx0YW5lb3VzbHkgdG8gdGhlIFxjb2Rle0ZpbGVzfSB0YWJsZSwgYW5kCisgIHRvIGEgQ0FCIGZpbGUuIFRoZW4sIHdoZW4gYWxsIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCwgdGhlIENBQiBmaWxlCisgIGNhbiBiZSB3cml0dGVuLCB0aGVuIGFkZGVkIHRvIHRoZSBNU0kgZmlsZS4KKworICBcdmFye25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBDQUIgZmlsZSBpbiB0aGUgTVNJIGZpbGUuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NBQl17YXBwZW5kfXtmdWxsLCBsb2dpY2FsfQorICBBZGQgdGhlIGZpbGUgd2l0aCB0aGUgcGF0aG5hbWUgXHZhcntmdWxsfSB0byB0aGUgQ0FCIGZpbGUsCisgIHVuZGVyIHRoZSBuYW1lIFx2YXJ7bG9naWNhbH0uIElmIHRoZXJlIGlzIGFscmVhZHkgYSBmaWxlCisgIG5hbWVkIFx2YXJ7bG9naWNhbH0sIGEgbmV3IGZpbGUgbmFtZSBpcyBjcmVhdGVkLgorCisgIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpbGUgaW4gdGhlIENBQiBmaWxlLCBhbmQgdGhlCisgIG5ldyBuYW1lIG9mIHRoZSBmaWxlIGluc2lkZSB0aGUgQ0FCIGZpbGUuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDQUJde2FwcGVuZH17ZGF0YWJhc2V9CisgIEdlbmVyYXRlIGEgQ0FCIGZpbGUsIGFkZCBpdCBhcyBhIHN0cmVhbSB0byB0aGUgTVNJIGZpbGUsCisgIHB1dCBpdCBpbnRvIHRoZSBcY29kZXtNZWRpYX0gdGFibGUsIGFuZCByZW1vdmUgdGhlIGdlbmVyYXRlZAorICBmaWxlIGZyb20gdGhlIGRpc2suCitcZW5ke21ldGhvZGRlc2N9CisKK1xzdWJzZWN0aW9ue0RpcmVjdG9yeSBPYmplY3RzXGxhYmVse21zaS1kaXJlY3Rvcnl9fQorCitcYmVnaW57Y2xhc3NkZXNjfXtEaXJlY3Rvcnl9e2RhdGFiYXNlLCBjYWIsIGJhc2VkaXIsIHBoeXNpY2FsLCAKKyAgICAgICAgICAgICAgICAgIGxvZ2ljYWwsIGRlZmF1bHQsIGNvbXBvbmVudCwgXG9wdGlvbmFse2NvbXBvbmVudGZsYWdzfX0KKyAgQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBpbiB0aGUgRGlyZWN0b3J5IHRhYmxlLiBUaGVyZSBpcyBhIGN1cnJlbnQKKyAgY29tcG9uZW50IGF0IGVhY2ggcG9pbnQgaW4gdGltZSBmb3IgdGhlIGRpcmVjdG9yeSwgd2hpY2ggaXMgZWl0aGVyCisgIGV4cGxpY2l0bHkgY3JlYXRlZCB0aHJvdWdoIFxtZXRob2R7c3RhcnRfY29tcG9uZW50fSwgb3IgaW1wbGljaXRseSB3aGVuIGZpbGVzCisgIGFyZSBhZGRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuIEZpbGVzIGFyZSBhZGRlZCBpbnRvIHRoZSBjdXJyZW50CisgIGNvbXBvbmVudCwgYW5kIGludG8gdGhlIGNhYiBmaWxlLiAgVG8gY3JlYXRlIGEgZGlyZWN0b3J5LCBhIGJhc2UKKyAgZGlyZWN0b3J5IG9iamVjdCBuZWVkcyB0byBiZSBzcGVjaWZpZWQgKGNhbiBiZSBcY29kZXtOb25lfSksIHRoZSBwYXRoIHRvCisgIHRoZSBwaHlzaWNhbCBkaXJlY3RvcnksIGFuZCBhIGxvZ2ljYWwgZGlyZWN0b3J5IG5hbWUuICBcdmFye2RlZmF1bHR9CisgIHNwZWNpZmllcyB0aGUgRGVmYXVsdERpciBzbG90IGluIHRoZSBkaXJlY3RvcnkgdGFibGUuIFx2YXJ7Y29tcG9uZW50ZmxhZ3N9CisgIHNwZWNpZmllcyB0aGUgZGVmYXVsdCBmbGFncyB0aGF0IG5ldyBjb21wb25lbnRzIGdldC4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRGlyZWN0b3J5XXtzdGFydF9jb21wb25lbnR9e1xvcHRpb25hbHtjb21wb25lbnRcb3B0aW9uYWx7LAorICAgICAgZmVhdHVyZVxvcHRpb25hbHssIGZsYWdzXG9wdGlvbmFseywga2V5ZmlsZVxvcHRpb25hbHssIHV1aWR9fX19fX0KKyAgQWRkIGFuIGVudHJ5IHRvIHRoZSBDb21wb25lbnQgdGFibGUsIGFuZCBtYWtlIHRoaXMgY29tcG9uZW50IHRoZQorICBjdXJyZW50IGNvbXBvbmVudCBmb3IgdGhpcyBkaXJlY3RvcnkuIElmIG5vIGNvbXBvbmVudCBuYW1lIGlzIGdpdmVuLCB0aGUKKyAgZGlyZWN0b3J5IG5hbWUgaXMgdXNlZC4gSWYgbm8gXHZhcntmZWF0dXJlfSBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgZmVhdHVyZQorICBpcyB1c2VkLiBJZiBubyBcdmFye2ZsYWdzfSBhcmUgZ2l2ZW4sIHRoZSBkaXJlY3RvcnkncyBkZWZhdWx0IGZsYWdzIGFyZQorICB1c2VkLiBJZiBubyBcdmFye2tleWZpbGV9IGlzIGdpdmVuLCB0aGUgS2V5UGF0aCBpcyBsZWZ0IG51bGwgaW4gdGhlCisgIENvbXBvbmVudCB0YWJsZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RpcmVjdG9yeV17YWRkX2ZpbGV9e2ZpbGVcb3B0aW9uYWx7LCBzcmNcb3B0aW9uYWx7LAorICAgICAgdmVyc2lvblxvcHRpb25hbHssIGxhbmd1YWdlfX19fQorICBBZGQgYSBmaWxlIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudCBvZiB0aGUgZGlyZWN0b3J5LCBzdGFydGluZyBhIG5ldworICBvbmUgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBjb21wb25lbnQuIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIG5hbWUKKyAgaW4gdGhlIHNvdXJjZSBhbmQgdGhlIGZpbGUgdGFibGUgd2lsbCBiZSBpZGVudGljYWwuIElmIHRoZSBcdmFye3NyY30gZmlsZQorICBpcyBzcGVjaWZpZWQsIGl0IGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CisgIGRpcmVjdG9yeS4gT3B0aW9uYWxseSwgYSBcdmFye3ZlcnNpb259IGFuZCBhIFx2YXJ7bGFuZ3VhZ2V9IGNhbiBiZSBzcGVjaWZpZWQgZm9yCisgIHRoZSBlbnRyeSBpbiB0aGUgRmlsZSB0YWJsZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RpcmVjdG9yeV17Z2xvYn17cGF0dGVyblxvcHRpb25hbHssIGV4Y2x1ZGV9fQorICBBZGQgYSBsaXN0IG9mIGZpbGVzIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhcyBzcGVjaWZpZWQgaW4gdGhlIGdsb2IKKyAgcGF0dGVybi4gSW5kaXZpZHVhbCBmaWxlcyBjYW4gYmUgZXhjbHVkZWQgaW4gdGhlIFx2YXJ7ZXhjbHVkZX0gbGlzdC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RpcmVjdG9yeV17cmVtb3ZlX3B5Y317fQorICBSZW1vdmUgXGNvZGV7LnB5Y30vXGNvZGV7LnB5b30gZmlsZXMgb24gdW5pbnN0YWxsLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57c2VlYWxzb30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvZGlyZWN0b3J5X3RhYmxlLmFzcF17RGlyZWN0b3J5IFRhYmxlfXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL2ZpbGVfdGFibGUuYXNwXXtGaWxlIFRhYmxlfXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL2NvbXBvbmVudF90YWJsZS5hc3Bde0NvbXBvbmVudCBUYWJsZX17fQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9mZWF0dXJlY29tcG9uZW50c190YWJsZS5hc3Bde0ZlYXR1cmVDb21wb25lbnRzIFRhYmxlfXt9CitcZW5ke3NlZWFsc299CisKKworXHN1YnNlY3Rpb257RmVhdHVyZXNcbGFiZWx7ZmVhdHVyZXN9fQorCitcYmVnaW57Y2xhc3NkZXNjfXtGZWF0dXJlfXtkYXRhYmFzZSwgaWQsIHRpdGxlLCBkZXNjLCBkaXNwbGF5XG9wdGlvbmFseywKKyAgICBsZXZlbD0xXG9wdGlvbmFseywgcGFyZW50XG9wdGlvbmFsXHssIGRpcmVjdG9yeVxvcHRpb25hbHssIAorICAgIGF0dHJpYnV0ZXM9MH19fX0KKworICBBZGQgYSBuZXcgcmVjb3JkIHRvIHRoZSBcY29kZXtGZWF0dXJlfSB0YWJsZSwgdXNpbmcgdGhlIHZhbHVlcworICBcdmFye2lkfSwgXHZhcntwYXJlbnQuaWR9LCBcdmFye3RpdGxlfSwgXHZhcntkZXNjfSwgXHZhcntkaXNwbGF5fSwKKyAgXHZhcntsZXZlbH0sIFx2YXJ7ZGlyZWN0b3J5fSwgYW5kIFx2YXJ7YXR0cmlidXRlc30uIFRoZSByZXN1bHRpbmcKKyAgZmVhdHVyZSBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byB0aGUgXG1ldGhvZHtzdGFydF9jb21wb25lbnR9IG1ldGhvZAorICBvZiBcY2xhc3N7RGlyZWN0b3J5fS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRmVhdHVyZV17c2V0X2N1cnJlbnR9e30KKyAgTWFrZSB0aGlzIGZlYXR1cmUgdGhlIGN1cnJlbnQgZmVhdHVyZSBvZiBcbW9kdWxle21zaWxpYn0uCisgIE5ldyBjb21wb25lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBkZWZhdWx0IGZlYXR1cmUsCisgIHVubGVzcyBhIGZlYXR1cmUgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbntzZWVhbHNvfQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9mZWF0dXJlX3RhYmxlLmFzcF17RmVhdHVyZSBUYWJsZX17fQorXGVuZHtzZWVhbHNvfQorCitcc3Vic2VjdGlvbntHVUkgY2xhc3Nlc1xsYWJlbHttc2ktZ3VpfX0KKworXG1vZHVsZXttc2lsaWJ9IHByb3ZpZGVzIHNldmVyYWwgY2xhc3NlcyB0aGF0IHdyYXAgdGhlIEdVSSB0YWJsZXMgaW4KK2FuIE1TSSBkYXRhYmFzZS4gSG93ZXZlciwgbm8gc3RhbmRhcmQgdXNlciBpbnRlcmZhY2UgaXMgcHJvdmlkZWQ7IHVzZQorXG1vZHVsZXtiZGlzdF9tc2l9IHRvIGNyZWF0ZSBNU0kgZmlsZXMgd2l0aCBhIHVzZXItaW50ZXJmYWNlIGZvcgoraW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuCisKK1xiZWdpbntjbGFzc2Rlc2N9e0NvbnRyb2x9e2RsZywgbmFtZX0KKyAgQmFzZSBjbGFzcyBvZiB0aGUgZGlhbG9nIGNvbnRyb2xzLiBcdmFye2RsZ30gaXMgdGhlIGRpYWxvZyBvYmplY3QKKyAgdGhlIGNvbnRyb2wgYmVsb25ncyB0bywgYW5kIFx2YXJ7bmFtZX0gaXMgdGhlIGNvbnRyb2wncyBuYW1lLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250cm9sXXtldmVudH17ZXZlbnQsIGFyZ3VtZW50XG9wdGlvbmFseywgCisgICBjb25kaXRpb24gPSBgYDEnJ1xvcHRpb25hbHssIG9yZGVyaW5nfX19CisKKyAgTWFrZSBhbiBlbnRyeSBpbnRvIHRoZSBcY29kZXtDb250cm9sRXZlbnR9IHRhYmxlIGZvciB0aGlzIGNvbnRyb2wuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250cm9sXXttYXBwaW5nfXtldmVudCwgYXR0cmlidXRlfQorICBNYWtlIGFuIGVudHJ5IGludG8gdGhlIFxjb2Rle0V2ZW50TWFwcGluZ30gdGFibGUgZm9yIHRoaXMgY29udHJvbC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRyb2xde2NvbmRpdGlvbn17YWN0aW9uLCBjb25kaXRpb259CisgIE1ha2UgYW4gZW50cnkgaW50byB0aGUgXGNvZGV7Q29udHJvbENvbmRpdGlvbn0gdGFibGUgZm9yIHRoaXMgY29udHJvbC4KK1xlbmR7bWV0aG9kZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtSYWRpb0J1dHRvbkdyb3VwfXtkbGcsIG5hbWUsIHByb3BlcnR5fQorICBDcmVhdGUgYSByYWRpbyBidXR0b24gY29udHJvbCBuYW1lZCBcdmFye25hbWV9LiBcdmFye3Byb3BlcnR5fQorICBpcyB0aGUgaW5zdGFsbGVyIHByb3BlcnR5IHRoYXQgZ2V0cyBzZXQgd2hlbiBhIHJhZGlvIGJ1dHRvbgorICBpcyBzZWxlY3RlZC4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bUmFkaW9CdXR0b25Hcm91cF17YWRkfXtuYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7LCB2YWx1ZX19CisgIEFkZCBhIHJhZGlvIGJ1dHRvbiBuYW1lZCBcdmFye25hbWV9IHRvIHRoZSBncm91cCwgYXQgdGhlCisgIGNvb3JkaW5hdGVzIFx2YXJ7eH0sIFx2YXJ7eX0sIFx2YXJ7d2lkdGh9LCBcdmFye2hlaWdodH0sIGFuZAorICB3aXRoIHRoZSBsYWJlbCBcdmFye3RleHR9LiBJZiBcdmFye3ZhbHVlfSBpcyBvbWl0dGVkLCBpdAorICBkZWZhdWx0cyB0byBcdmFye25hbWV9LgorXGVuZHttZXRob2RkZXNjfQorICAgICAgICAgICAKK1xiZWdpbntjbGFzc2Rlc2N9e0RpYWxvZ317ZGIsIG5hbWUsIHgsIHksIHcsIGgsIGF0dHIsIHRpdGxlLCBmaXJzdCwgCisgICAgZGVmYXVsdCwgY2FuY2VsfQorICBSZXR1cm4gYSBuZXcgXGNsYXNze0RpYWxvZ30gb2JqZWN0LiBBbiBlbnRyeSBpbiB0aGUgXGNvZGV7RGlhbG9nfSB0YWJsZQorICBpcyBtYWRlLCB3aXRoIHRoZSBzcGVjaWZpZWQgY29vcmRpbmF0ZXMsIGRpYWxvZyBhdHRyaWJ1dGVzLCB0aXRsZSwKKyAgbmFtZSBvZiB0aGUgZmlyc3QsIGRlZmF1bHQsIGFuZCBjYW5jZWwgY29udHJvbHMuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ117Y29udHJvbH17bmFtZSwgdHlwZSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgCisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCBwcm9wZXJ0eSwgdGV4dCwgY29udHJvbF9uZXh0LCBoZWxwfQorICBSZXR1cm4gYSBuZXcgXGNsYXNze0NvbnRyb2x9IG9iamVjdC4gQW4gZW50cnkgaW4gdGhlIFxjb2Rle0NvbnRyb2x9IHRhYmxlCisgIGlzIG1hZGUgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisKKyAgVGhpcyBpcyBhIGdlbmVyaWMgbWV0aG9kOyBmb3Igc3BlY2lmaWMgdHlwZXMsIHNwZWNpYWxpemVkIG1ldGhvZHMKKyAgYXJlIHByb3ZpZGVkLgorXGVuZHttZXRob2RkZXNjfQorCisKK1xiZWdpbnttZXRob2RkZXNjfVtEaWFsb2dde3RleHR9e25hbWUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGF0dHJpYnV0ZXMsIHRleHR9CisgIEFkZCBhbmQgcmV0dXJuIGEgXGNvZGV7VGV4dH0gY29udHJvbC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ117Yml0bWFwfXtuYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB0ZXh0fQorICBBZGQgYW5kIHJldHVybiBhIFxjb2Rle0JpdG1hcH0gY29udHJvbC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ117bGluZX17bmFtZSwgeCwgeSwgd2lkdGgsIGhlaWdodH0KKyAgQWRkIGFuZCByZXR1cm4gYSBcY29kZXtMaW5lfSBjb250cm9sLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRGlhbG9nXXtwdXNoYnV0dG9ufXtuYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhdHRyaWJ1dGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsIG5leHRfY29udHJvbH0KKyAgQWRkIGFuZCByZXR1cm4gYSBcY29kZXtQdXNoQnV0dG9ufSBjb250cm9sLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bRGlhbG9nXXtyYWRpb2dyb3VwfXtuYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsIHByb3BlcnR5LCB0ZXh0LCBuZXh0X2NvbnRyb2x9CisgIEFkZCBhbmQgcmV0dXJuIGEgXGNvZGV7UmFkaW9CdXR0b25Hcm91cH0gY29udHJvbC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0RpYWxvZ117Y2hlY2tib3h9e25hbWUsIHgsIHksIHdpZHRoLCBoZWlnaHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywgcHJvcGVydHksIHRleHQsIG5leHRfY29udHJvbH0KKyAgQWRkIGFuZCByZXR1cm4gYSBcY29kZXtDaGVja0JveH0gY29udHJvbC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue3NlZWFsc299CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL2RpYWxvZ190YWJsZS5hc3Bde0RpYWxvZyBUYWJsZX17fQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9jb250cm9sX3RhYmxlLmFzcF17Q29udHJvbCBUYWJsZX17fQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9jb250cm9scy5hc3Bde0NvbnRyb2wgVHlwZXN9e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvY29udHJvbGNvbmRpdGlvbl90YWJsZS5hc3Bde0NvbnRyb2xDb25kaXRpb24gVGFibGV9e30KKyAgXHNlZXRpdGxlW2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9tc2kvc2V0dXAvY29udHJvbGV2ZW50X3RhYmxlLmFzcF17Q29udHJvbEV2ZW50IFRhYmxlfXt9CisgIFxzZWV0aXRsZVtodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvZW4tdXMvbXNpL3NldHVwL2V2ZW50bWFwcGluZ190YWJsZS5hc3Bde0V2ZW50TWFwcGluZyBUYWJsZX17fQorICBcc2VldGl0bGVbaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL21zaS9zZXR1cC9yYWRpb2J1dHRvbl90YWJsZS5hc3Bde1JhZGlvQnV0dG9uIFRhYmxlfXt9CitcZW5ke3NlZWFsc299CisKK1xzdWJzZWN0aW9ue1ByZWNvbXB1dGVkIHRhYmxlc1xsYWJlbHttc2ktdGFibGVzfX0KKworXG1vZHVsZXttc2lsaWJ9IHByb3ZpZGVzIGEgZmV3IHN1YnBhY2thZ2VzIHRoYXQgY29udGFpbgorb25seSBzY2hlbWEgYW5kIHRhYmxlIGRlZmluaXRpb25zLiBDdXJyZW50bHksIHRoZXNlIGRlZmluaXRpb25zCithcmUgYmFzZWQgb24gTVNJIHZlcnNpb24gMi4wLgorCitcYmVnaW57ZGF0YWRlc2N9e3NjaGVtYX0KKyAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgTVNJIHNjaGVtYSBmb3IgTVNJIDIuMCwgd2l0aCB0aGUKKyAgXHZhcnt0YWJsZXN9IHZhcmlhYmxlIHByb3ZpZGluZyBhIGxpc3Qgb2YgdGFibGUgZGVmaW5pdGlvbnMsCisgIGFuZCBcdmFye19WYWxpZGF0aW9uX3JlY29yZHN9IHByb3ZpZGluZyB0aGUgZGF0YSBmb3IKKyAgTVNJIHZhbGlkYXRpb24uCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e3NlcXVlbmNlfQorICBUaGlzIG1vZHVsZSBjb250YWlucyB0YWJsZSBjb250ZW50cyBmb3IgdGhlIHN0YW5kYXJkIHNlcXVlbmNlCisgIHRhYmxlczogXHZhcntBZG1pbkV4ZWN1dGVTZXF1ZW5jZX0sIFx2YXJ7QWRtaW5VSVNlcXVlbmNlfSwKKyAgXHZhcntBZHZ0RXhlY3V0ZVNlcXVlbmNlfSwgXHZhcntJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlfSwgYW5kCisgIFx2YXJ7SW5zdGFsbFVJU2VxdWVuY2V9LgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXt0ZXh0fQorICBUaGlzIG1vZHVsZSBjb250YWlucyBkZWZpbml0aW9ucyBmb3IgdGhlIFVJVGV4dCBhbmQgQWN0aW9uVGV4dAorICB0YWJsZXMsIGZvciB0aGUgc3RhbmRhcmQgaW5zdGFsbGVyIGFjdGlvbnMuCitcZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvcGVyYXRvci50ZXggYi9Eb2MvbGliL2xpYm9wZXJhdG9yLnRleAppbmRleCA0MWRhOWI3Li41YmEzMjA5IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYm9wZXJhdG9yLnRleAorKysgYi9Eb2MvbGliL2xpYm9wZXJhdG9yLnRleApAQCAtMzIwLDcgKzMyMCw3IEBACiAKIFxiZWdpbntmdW5jZGVzY317aXJzaGlmdH17YSwgYn0KIFxmdW5jbGluZXtfX2lyc2hpZnRfX317YSwgYn0KLVxjb2Rle2EgPSBpcnNoaWZ0KGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgPn1cY29kZXs+PSBifS4KK1xjb2Rle2EgPSBpcnNoaWZ0KGEsIGIpfSBpcyBlcXVpdmFsZW50IHRvIFxjb2Rle2EgPj49IGJ9LgogXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke2Z1bmNkZXNjfQogCkBAIC00OTksNyArNDk5LDcgQEAKICAgICAgICAgICB7XGNvZGV7bmVnKFx2YXJ7YX0pfX0KICAgXGxpbmVpaWl7TmVnYXRpb24gKExvZ2ljYWwpfXtcY29kZXtub3QgXHZhcnthfX19CiAgICAgICAgICAge1xjb2Rle25vdF8oXHZhcnthfSl9fQotICBcbGluZWlpaXtSaWdodCBTaGlmdH17XGNvZGV7XHZhcnthfSA+XGNvZGV7Pn0gXHZhcntifX19CisgIFxsaW5laWlpe1JpZ2h0IFNoaWZ0fXtcY29kZXtcdmFye2F9ID4+IFx2YXJ7Yn19fQogICAgICAgICAgIHtcY29kZXtyc2hpZnQoXHZhcnthfSwgXHZhcntifSl9fQogICBcbGluZWlpaXtTZXF1ZW5jZSBSZXBpdGl0aW9ufXtcY29kZXtcdmFye3NlcX0gKiBcdmFye2l9fX0KICAgICAgICAgICB7XGNvZGV7cmVwZWF0KFx2YXJ7c2VxfSwgXHZhcntpfSl9fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXggYi9Eb2MvbGliL2xpYm9wdHBhcnNlLnRleAppbmRleCA4YWNhNTAxLi5lYzQzZTNkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYm9wdHBhcnNlLnRleAorKysgYi9Eb2MvbGliL2xpYm9wdHBhcnNlLnRleApAQCAtMzUsOSArMzUsOSBAQAogXGVuZHt2ZXJiYXRpbX0KIAogQXMgaXQgcGFyc2VzIHRoZSBjb21tYW5kIGxpbmUsIFxjb2Rle29wdHBhcnNlfSBzZXRzIGF0dHJpYnV0ZXMgb2YgdGhlCi1cdmFye29wdGlvbnN9IG9iamVjdCByZXR1cm5lZCBieSBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0gYmFzZWQgb24gdXNlci1zdXBwbGllZAorXGNvZGV7b3B0aW9uc30gb2JqZWN0IHJldHVybmVkIGJ5IFxtZXRob2R7cGFyc2V7XF99YXJncygpfSBiYXNlZCBvbiB1c2VyLXN1cHBsaWVkCiBjb21tYW5kLWxpbmUgdmFsdWVzLiAgV2hlbiBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0gcmV0dXJucyBmcm9tIHBhcnNpbmcgdGhpcwotY29tbWFuZCBsaW5lLCBcdmFye29wdGlvbnMuZmlsZW5hbWV9IHdpbGwgYmUgXGNvZGV7Im91dGZpbGUifSBhbmQKK2NvbW1hbmQgbGluZSwgXGNvZGV7b3B0aW9ucy5maWxlbmFtZX0gd2lsbCBiZSBcY29kZXsib3V0ZmlsZSJ9IGFuZAogXGNvZGV7b3B0aW9ucy52ZXJib3NlfSB3aWxsIGJlIFxjb2Rle0ZhbHNlfS4gIFxjb2Rle29wdHBhcnNlfSBzdXBwb3J0cyBib3RoIGxvbmcKIGFuZCBzaG9ydCBvcHRpb25zLCBhbGxvd3Mgc2hvcnQgb3B0aW9ucyB0byBiZSBtZXJnZWQgdG9nZXRoZXIsIGFuZAogYWxsb3dzIG9wdGlvbnMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZWlyIGFyZ3VtZW50cyBpbiBhIHZhcmlldHkgb2YKQEAgLTEwMCw4ICsxMDAsOCBAQAogc2luZ2xlIGxldHRlciwgZS5nLiBcY29kZXsiLXgifSBvciBcY29kZXsiLUYifS4gIEFsc28sIHRyYWRpdGlvbmFsIFxVTklYe30KIHN5bnRheCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9ucyB0byBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBhcmd1bWVudCwKIGUuZy4gIFxjb2RleyIteCAtRiJ9IGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7Ii14RiJ9LiAgVGhlIEdOVSBwcm9qZWN0Ci1pbnRyb2R1Y2VkIFxjb2RleyJ7LS19In0gZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgaHlwaGVuLXNlcGFyYXRlZCB3b3JkcywKLWUuZy4gXGNvZGV7InstLX1maWxlIn0gb3IgXGNvZGV7InstLX1kcnktcnVuIn0uICBUaGVzZSBhcmUgdGhlIG9ubHkgdHdvIG9wdGlvbgoraW50cm9kdWNlZCBcY29kZXsiLXt9LSJ9IGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIGh5cGhlbi1zZXBhcmF0ZWQgd29yZHMsCitlLmcuIFxjb2RleyIte30tZmlsZSJ9IG9yIFxjb2RleyIte30tZHJ5LXJ1biJ9LiAgVGhlc2UgYXJlIHRoZSBvbmx5IHR3byBvcHRpb24KIHN5bnRheGVzIHByb3ZpZGVkIGJ5IFxtb2R1bGV7b3B0cGFyc2V9LgogCiBTb21lIG90aGVyIG9wdGlvbiBzeW50YXhlcyB0aGF0IHRoZSB3b3JsZCBoYXMgc2VlbiBpbmNsdWRlOgpAQCAtMTcwLDcgKzE3MCw3IEBACiBwcm9nIC12IC0tcmVwb3J0IC90bXAvcmVwb3J0LnR4dCBmb28gYmFyCiBcZW5ke3ZlcmJhdGltfQogCi1cY29kZXsiLXYifSBhbmQgXGNvZGV7InstLX1yZXBvcnQifSBhcmUgYm90aCBvcHRpb25zLiAgQXNzdW1pbmcgdGhhdAorXGNvZGV7Ii12In0gYW5kIFxjb2RleyIte30tcmVwb3J0In0gYXJlIGJvdGggb3B0aW9ucy4gIEFzc3VtaW5nIHRoYXQKIFxsb25ncHJvZ3JhbW9wdHtyZXBvcnR9IHRha2VzIG9uZSBhcmd1bWVudCwgXGNvZGV7Ii90bXAvcmVwb3J0LnR4dCJ9IGlzIGFuIG9wdGlvbgogYXJndW1lbnQuICBcY29kZXsiZm9vIn0gYW5kIFxjb2RleyJiYXIifSBhcmUgcG9zaXRpb25hbCBhcmd1bWVudHMuCiAKQEAgLTI4NywxMiArMjg3LDEyIEBACiBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0gcmV0dXJucyB0d28gdmFsdWVzOgogXGJlZ2lue2l0ZW1pemV9CiBcaXRlbSB7fSAKLVx2YXJ7b3B0aW9uc30sIGFuIG9iamVjdCBjb250YWluaW5nIHZhbHVlcyBmb3IgYWxsIG9mIHlvdXIgb3B0aW9uc3stLS19ZS5nLiBpZiBcY29kZXsiLXt9LWZpbGUifSB0YWtlcyBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQsIHRoZW4KLVx2YXJ7b3B0aW9ucy5maWxlfSB3aWxsIGJlIHRoZSBmaWxlbmFtZSBzdXBwbGllZCBieSB0aGUgdXNlciwgb3IKK1xjb2Rle29wdGlvbnN9LCBhbiBvYmplY3QgY29udGFpbmluZyB2YWx1ZXMgZm9yIGFsbCBvZiB5b3VyIG9wdGlvbnN7LS0tfWUuZy4gaWYgXGNvZGV7Ii17fS1maWxlIn0gdGFrZXMgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50LCB0aGVuCitcY29kZXtvcHRpb25zLmZpbGV9IHdpbGwgYmUgdGhlIGZpbGVuYW1lIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBvcgogXGNvZGV7Tm9uZX0gaWYgdGhlIHVzZXIgZGlkIG5vdCBzdXBwbHkgdGhhdCBvcHRpb24KIAogXGl0ZW0ge30gCi1cdmFye2FyZ3N9LCB0aGUgbGlzdCBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBsZWZ0b3ZlciBhZnRlciBwYXJzaW5nCitcY29kZXthcmdzfSwgdGhlIGxpc3Qgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgbGVmdG92ZXIgYWZ0ZXIgcGFyc2luZwogb3B0aW9ucwogCiBcZW5ke2l0ZW1pemV9CkBAIC0zMDksNyArMzA5LDcgQEAKIGFkZGluZyBuZXcgYWN0aW9ucyBpcyBhbiBhZHZhbmNlZCB0b3BpYyBjb3ZlcmVkIGluIHNlY3Rpb25+XHJlZntvcHRwYXJzZS1leHRlbmRpbmd9LCBFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX0uCiBNb3N0IGFjdGlvbnMgdGVsbCBcbW9kdWxle29wdHBhcnNlfSB0byBzdG9yZSBhIHZhbHVlIGluIHNvbWUgdmFyaWFibGV7LS0tfWZvcgogZXhhbXBsZSwgdGFrZSBhIHN0cmluZyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYW5kIHN0b3JlIGl0IGluIGFuCi1hdHRyaWJ1dGUgb2YgXHZhcntvcHRpb25zfS4KK2F0dHJpYnV0ZSBvZiBcY29kZXtvcHRpb25zfS4KIAogSWYgeW91IGRvbid0IHNwZWNpZnkgYW4gb3B0aW9uIGFjdGlvbiwgXG1vZHVsZXtvcHRwYXJzZX0gZGVmYXVsdHMgdG8gXGNvZGV7c3RvcmV9LgogCkBAIC0zMzMsOCArMzMzLDggQEAKIFxlbmR7dmVyYmF0aW19CiAKIFdoZW4gXG1vZHVsZXtvcHRwYXJzZX0gc2VlcyB0aGUgb3B0aW9uIHN0cmluZyBcY29kZXsiLWYifSwgaXQgY29uc3VtZXMgdGhlIG5leHQKLWFyZ3VtZW50LCBcY29kZXsiZm9vLnR4dCJ9LCBhbmQgc3RvcmVzIGl0IGluIFx2YXJ7b3B0aW9ucy5maWxlbmFtZX0uICBTbywKLWFmdGVyIHRoaXMgY2FsbCB0byBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0sIFx2YXJ7b3B0aW9ucy5maWxlbmFtZX0gaXMKK2FyZ3VtZW50LCBcY29kZXsiZm9vLnR4dCJ9LCBhbmQgc3RvcmVzIGl0IGluIFxjb2Rle29wdGlvbnMuZmlsZW5hbWV9LiAgU28sCithZnRlciB0aGlzIGNhbGwgdG8gXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9LCBcY29kZXtvcHRpb25zLmZpbGVuYW1lfSBpcwogXGNvZGV7ImZvby50eHQifS4KIAogU29tZSBvdGhlciBvcHRpb24gdHlwZXMgc3VwcG9ydGVkIGJ5IFxtb2R1bGV7b3B0cGFyc2V9IGFyZSBcY29kZXtpbnR9IGFuZCBcY29kZXtmbG9hdH0uCkBAIC0zNzksNyArMzc5LDcgQEAKIEZsYWcgb3B0aW9uc3stLS19c2V0IGEgdmFyaWFibGUgdG8gdHJ1ZSBvciBmYWxzZSB3aGVuIGEgcGFydGljdWxhciBvcHRpb24KIGlzIHNlZW57LS0tfWFyZSBxdWl0ZSBjb21tb24uICBcbW9kdWxle29wdHBhcnNlfSBzdXBwb3J0cyB0aGVtIHdpdGggdHdvIHNlcGFyYXRlCiBhY3Rpb25zLCBcY29kZXtzdG9yZXtcX310cnVlfSBhbmQgXGNvZGV7c3RvcmV7XF99ZmFsc2V9LiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIGEKLVx2YXJ7dmVyYm9zZX0gZmxhZyB0aGF0IGlzIHR1cm5lZCBvbiB3aXRoIFxjb2RleyItdiJ9IGFuZCBvZmYgd2l0aCBcY29kZXsiLXEifToKK1xjb2Rle3ZlcmJvc2V9IGZsYWcgdGhhdCBpcyB0dXJuZWQgb24gd2l0aCBcY29kZXsiLXYifSBhbmQgb2ZmIHdpdGggXGNvZGV7Ii1xIn06CiBcYmVnaW57dmVyYmF0aW19CiBwYXJzZXIuYWRkX29wdGlvbigiLXYiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ2ZXJib3NlIikKIHBhcnNlci5hZGRfb3B0aW9uKCItcSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIikKQEAgLTQyMSw3ICs0MjEsNyBAQAogZGVzdGluYXRpb24sIHdoaWNoIGlzIGFzc2lnbmVkIGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGlzIHBhcnNlZC4KIAogRmlyc3QsIGNvbnNpZGVyIHRoZSB2ZXJib3NlL3F1aWV0IGV4YW1wbGUuICBJZiB3ZSB3YW50IFxtb2R1bGV7b3B0cGFyc2V9IHRvIHNldAotXHZhcnt2ZXJib3NlfSB0byBcY29kZXtUcnVlfSB1bmxlc3MgXGNvZGV7Ii1xIn0gaXMgc2VlbiwgdGhlbiB3ZSBjYW4gZG8gdGhpczoKK1xjb2Rle3ZlcmJvc2V9IHRvIFxjb2Rle1RydWV9IHVubGVzcyBcY29kZXsiLXEifSBpcyBzZWVuLCB0aGVuIHdlIGNhbiBkbyB0aGlzOgogXGJlZ2lue3ZlcmJhdGltfQogcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0idmVyYm9zZSIsIGRlZmF1bHQ9VHJ1ZSkKIHBhcnNlci5hZGRfb3B0aW9uKCItcSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIikKQEAgLTQ0MSw3ICs0NDEsNyBAQAogcGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InZlcmJvc2UiLCBkZWZhdWx0PVRydWUpCiBcZW5ke3ZlcmJhdGltfQogCi1BZ2FpbiwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIFx2YXJ7dmVyYm9zZX0gd2lsbCBiZSBcY29kZXtUcnVlfTogdGhlIGxhc3QKK0FnYWluLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgXGNvZGV7dmVyYm9zZX0gd2lsbCBiZSBcY29kZXtUcnVlfTogdGhlIGxhc3QKIGRlZmF1bHQgdmFsdWUgc3VwcGxpZWQgZm9yIGFueSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIGlzIHRoZSBvbmUgdGhhdAogY291bnRzLgogCkBAIC01NjYsNyArNTY2LDcgQEAKIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT0iJXByb2cgWy1mXSBbLXFdIiwgdmVyc2lvbj0iJXByb2cgMS4wIikKIFxlbmR7dmVyYmF0aW19CiAKLU5vdGUgdGhhdCBcY29kZXsie1wlfXByb2cifSBpcyBleHBhbmRlZCBqdXN0IGxpa2UgaXQgaXMgaW4gXHZhcnt1c2FnZX0uICBBcGFydAorTm90ZSB0aGF0IFxjb2RleyJ7XCV9cHJvZyJ9IGlzIGV4cGFuZGVkIGp1c3QgbGlrZSBpdCBpcyBpbiBcY29kZXt1c2FnZX0uICBBcGFydAogZnJvbSB0aGF0LCBcY29kZXt2ZXJzaW9ufSBjYW4gY29udGFpbiBhbnl0aGluZyB5b3UgbGlrZS4gIFdoZW4geW91IHN1cHBseQogaXQsIFxtb2R1bGV7b3B0cGFyc2V9IGF1dG9tYXRpY2FsbHkgYWRkcyBhIFxjb2RleyIte30tdmVyc2lvbiJ9IG9wdGlvbiB0byB5b3VyIHBhcnNlci4KIElmIGl0IGVuY291bnRlcnMgdGhpcyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgZXhwYW5kcyB5b3VyCkBAIC01ODAsMTQgKzU4MCwxNCBAQAogXGVuZHt2ZXJiYXRpbX0KIAogCi1cc3Vic3Vic2VjdGlvbntIb3cgXG1vZHVsZXtvcHRwYXJzZX0gaGFuZGxlcyBlcnJvcnNcbGFiZWx7b3B0cGFyc2UtaG93LW9wdGlrLWhhbmRsZXMtZXJyb3JzfX0KK1xzdWJzdWJzZWN0aW9ue0hvdyBcbW9kdWxle29wdHBhcnNlfSBoYW5kbGVzIGVycm9yc1xsYWJlbHtvcHRwYXJzZS1ob3ctb3B0cGFyc2UtaGFuZGxlcy1lcnJvcnN9fQogCiBUaGVyZSBhcmUgdHdvIGJyb2FkIGNsYXNzZXMgb2YgZXJyb3JzIHRoYXQgXG1vZHVsZXtvcHRwYXJzZX0gaGFzIHRvIHdvcnJ5IGFib3V0OgogcHJvZ3JhbW1lciBlcnJvcnMgYW5kIHVzZXIgZXJyb3JzLiAgUHJvZ3JhbW1lciBlcnJvcnMgYXJlIHVzdWFsbHkKLWVycm9uZW91cyBjYWxscyB0byBcY29kZXtwYXJzZS5hZGR7XF99b3B0aW9uKCl9LCBlLmcuIGludmFsaWQgb3B0aW9uIHN0cmluZ3MsCitlcnJvbmVvdXMgY2FsbHMgdG8gXGNvZGV7cGFyc2VyLmFkZHtcX31vcHRpb24oKX0sIGUuZy4gaW52YWxpZCBvcHRpb24gc3RyaW5ncywKIHVua25vd24gb3B0aW9uIGF0dHJpYnV0ZXMsIG1pc3Npbmcgb3B0aW9uIGF0dHJpYnV0ZXMsIGV0Yy4gIFRoZXNlIGFyZQogZGVhbHQgd2l0aCBpbiB0aGUgdXN1YWwgd2F5OiByYWlzZSBhbiBleGNlcHRpb24gKGVpdGhlcgotXGV4Y2VwdGlvbntvcHRwYXJzZS5PcHRpb25FcnJvcn0gb3IgXGV4Y2VwdGlvbntUeXBlRXJyb3J9KSBhbmQgbGV0IHRoZSBwcm9ncmFtIGNyYXNoLgorXGNvZGV7b3B0cGFyc2UuT3B0aW9uRXJyb3J9IG9yIFxjb2Rle1R5cGVFcnJvcn0pIGFuZCBsZXQgdGhlIHByb2dyYW0gY3Jhc2guCiAKIEhhbmRsaW5nIHVzZXIgZXJyb3JzIGlzIG11Y2ggbW9yZSBpbXBvcnRhbnQsIHNpbmNlIHRoZXkgYXJlIGd1YXJhbnRlZWQKIHRvIGhhcHBlbiBubyBtYXR0ZXIgaG93IHN0YWJsZSB5b3VyIGNvZGUgaXMuICBcbW9kdWxle29wdHBhcnNlfSBjYW4gYXV0b21hdGljYWxseQpAQCAtNjU5LDEyICs2NTksNjYgQEAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgbWFpbigpCiBcZW5ke3ZlcmJhdGltfQotJSAkSWQ6IHR1dG9yaWFsLnR4dCA0MTUgMjAwNC0wOS0zMCAwMjoyNjoxN1ogZ3JlZyAkIAorJSAkSWQ6IHR1dG9yaWFsLnR4dCA1MDUgMjAwNS0wNy0yMiAwMTo1Mjo0MFogZ3dhcmQgJCAKIAogCiBcc3Vic2VjdGlvbntSZWZlcmVuY2UgR3VpZGVcbGFiZWx7b3B0cGFyc2UtcmVmZXJlbmNlLWd1aWRlfX0KIAogCitcc3Vic3Vic2VjdGlvbntDcmVhdGluZyB0aGUgcGFyc2VyXGxhYmVse29wdHBhcnNlLWNyZWF0aW5nLXBhcnNlcn19CisKK1RoZSBmaXJzdCBzdGVwIGluIHVzaW5nIFxtb2R1bGV7b3B0cGFyc2V9IGlzIHRvIGNyZWF0ZSBhbiBPcHRpb25QYXJzZXIgaW5zdGFuY2U6CitcYmVnaW57dmVyYmF0aW19CitwYXJzZXIgPSBPcHRpb25QYXJzZXIoLi4uKQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIE9wdGlvblBhcnNlciBjb25zdHJ1Y3RvciBoYXMgbm8gcmVxdWlyZWQgYXJndW1lbnRzLCBidXQgYSBudW1iZXIgb2YKK29wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLiAgWW91IHNob3VsZCBhbHdheXMgcGFzcyB0aGVtIGFzIGtleXdvcmQKK2FyZ3VtZW50cywgaS5lLiBkbyBub3QgcmVseSBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGFyZ3VtZW50cyBhcmUKK2RlY2xhcmVkLgorXGJlZ2lue3F1b3RlfQorXGJlZ2lue2Rlc2NyaXB0aW9ufQorXGl0ZW1bXGNvZGV7dXNhZ2V9IChkZWZhdWx0OiBcY29kZXsie1wlfXByb2cge1t9b3B0aW9uc10ifSldCitUaGUgdXNhZ2Ugc3VtbWFyeSB0byBwcmludCB3aGVuIHlvdXIgcHJvZ3JhbSBpcyBydW4gaW5jb3JyZWN0bHkgb3IKK3dpdGggYSBoZWxwIG9wdGlvbi4gIFdoZW4gXG1vZHVsZXtvcHRwYXJzZX0gcHJpbnRzIHRoZSB1c2FnZSBzdHJpbmcsIGl0IGV4cGFuZHMKK1xjb2Rle3tcJX1wcm9nfSB0byBcY29kZXtvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2e1t9MF0pfSAob3IgdG8gXGNvZGV7cHJvZ30gaWYKK3lvdSBwYXNzZWQgdGhhdCBrZXl3b3JkIGFyZ3VtZW50KS4gIFRvIHN1cHByZXNzIGEgdXNhZ2UgbWVzc2FnZSwKK3Bhc3MgdGhlIHNwZWNpYWwgdmFsdWUgXGNvZGV7b3B0cGFyc2UuU1VQUFJFU1N7XF99VVNBR0V9LgorXGl0ZW1bXGNvZGV7b3B0aW9ue1xffWxpc3R9IChkZWZhdWx0OiBcY29kZXt7W31dfSldCitBIGxpc3Qgb2YgT3B0aW9uIG9iamVjdHMgdG8gcG9wdWxhdGUgdGhlIHBhcnNlciB3aXRoLiAgVGhlIG9wdGlvbnMKK2luIFxjb2Rle29wdGlvbntcX31saXN0fSBhcmUgYWRkZWQgYWZ0ZXIgYW55IG9wdGlvbnMgaW4KK1xjb2Rle3N0YW5kYXJke1xffW9wdGlvbntcX31saXN0fSAoYSBjbGFzcyBhdHRyaWJ1dGUgdGhhdCBtYXkgYmUgc2V0IGJ5CitPcHRpb25QYXJzZXIgc3ViY2xhc3NlcyksIGJ1dCBiZWZvcmUgYW55IHZlcnNpb24gb3IgaGVscCBvcHRpb25zLgorRGVwcmVjYXRlZDsgdXNlIFxtZXRob2R7YWRke1xffW9wdGlvbigpfSBhZnRlciBjcmVhdGluZyB0aGUgcGFyc2VyIGluc3RlYWQuCitcaXRlbVtcY29kZXtvcHRpb257XF99Y2xhc3N9IChkZWZhdWx0OiBvcHRwYXJzZS5PcHRpb24pXQorQ2xhc3MgdG8gdXNlIHdoZW4gYWRkaW5nIG9wdGlvbnMgdG8gdGhlIHBhcnNlciBpbiBcbWV0aG9ke2FkZHtcX31vcHRpb24oKX0uCitcaXRlbVtcY29kZXt2ZXJzaW9ufSAoZGVmYXVsdDogXGNvZGV7Tm9uZX0pXQorQSB2ZXJzaW9uIHN0cmluZyB0byBwcmludCB3aGVuIHRoZSB1c2VyIHN1cHBsaWVzIGEgdmVyc2lvbiBvcHRpb24uCitJZiB5b3Ugc3VwcGx5IGEgdHJ1ZSB2YWx1ZSBmb3IgXGNvZGV7dmVyc2lvbn0sIFxtb2R1bGV7b3B0cGFyc2V9IGF1dG9tYXRpY2FsbHkgYWRkcworYSB2ZXJzaW9uIG9wdGlvbiB3aXRoIHRoZSBzaW5nbGUgb3B0aW9uIHN0cmluZyBcY29kZXsiLXt9LXZlcnNpb24ifS4gIFRoZQorc3Vic3RyaW5nIFxjb2RleyJ7XCV9cHJvZyJ9IGlzIGV4cGFuZGVkIHRoZSBzYW1lIGFzIGZvciBcY29kZXt1c2FnZX0uCitcaXRlbVtcY29kZXtjb25mbGljdHtcX31oYW5kbGVyfSAoZGVmYXVsdDogXGNvZGV7ImVycm9yIn0pXQorU3BlY2lmaWVzIHdoYXQgdG8gZG8gd2hlbiBvcHRpb25zIHdpdGggY29uZmxpY3Rpbmcgb3B0aW9uIHN0cmluZ3MKK2FyZSBhZGRlZCB0byB0aGUgcGFyc2VyOyBzZWUgc2VjdGlvbn5ccmVme29wdHBhcnNlLWNvbmZsaWN0cy1iZXR3ZWVuLW9wdGlvbnN9LCBDb25mbGljdHMgYmV0d2VlbiBvcHRpb25zLgorXGl0ZW1bXGNvZGV7ZGVzY3JpcHRpb259IChkZWZhdWx0OiBcY29kZXtOb25lfSldCitBIHBhcmFncmFwaCBvZiB0ZXh0IGdpdmluZyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHlvdXIgcHJvZ3JhbS4gIFxtb2R1bGV7b3B0cGFyc2V9CityZWZvcm1hdHMgdGhpcyBwYXJhZ3JhcGggdG8gZml0IHRoZSBjdXJyZW50IHRlcm1pbmFsIHdpZHRoIGFuZAorcHJpbnRzIGl0IHdoZW4gdGhlIHVzZXIgcmVxdWVzdHMgaGVscCAoYWZ0ZXIgXGNvZGV7dXNhZ2V9LCBidXQgYmVmb3JlCit0aGUgbGlzdCBvZiBvcHRpb25zKS4KK1xpdGVtW1xjb2Rle2Zvcm1hdHRlcn0gKGRlZmF1bHQ6IGEgbmV3IEluZGVudGVkSGVscEZvcm1hdHRlcildCitBbiBpbnN0YW5jZSBvZiBvcHRwYXJzZS5IZWxwRm9ybWF0dGVyIHRoYXQgd2lsbCBiZSB1c2VkIGZvcgorcHJpbnRpbmcgaGVscCB0ZXh0LiAgXG1vZHVsZXtvcHRwYXJzZX0gcHJvdmlkZXMgdHdvIGNvbmNyZXRlIGNsYXNzZXMgZm9yIHRoaXMKK3B1cnBvc2U6IEluZGVudGVkSGVscEZvcm1hdHRlciBhbmQgVGl0bGVkSGVscEZvcm1hdHRlci4KK1xpdGVtW1xjb2Rle2FkZHtcX31oZWxwe1xffW9wdGlvbn0gKGRlZmF1bHQ6IFxjb2Rle1RydWV9KV0KK0lmIHRydWUsIFxtb2R1bGV7b3B0cGFyc2V9IHdpbGwgYWRkIGEgaGVscCBvcHRpb24gKHdpdGggb3B0aW9uIHN0cmluZ3MgXGNvZGV7Ii1oIn0KK2FuZCBcY29kZXsiLXt9LWhlbHAifSkgdG8gdGhlIHBhcnNlci4KK1xpdGVtW1xjb2Rle3Byb2d9XQorVGhlIHN0cmluZyB0byB1c2Ugd2hlbiBleHBhbmRpbmcgXGNvZGV7IntcJX1wcm9nIn0gaW4gXGNvZGV7dXNhZ2V9IGFuZAorXGNvZGV7dmVyc2lvbn0gaW5zdGVhZCBvZiBcY29kZXtvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2e1t9MF0pfS4KK1xlbmR7ZGVzY3JpcHRpb259CitcZW5ke3F1b3RlfQorCisKIFxzdWJzdWJzZWN0aW9ue1BvcHVsYXRpbmcgdGhlIHBhcnNlclxsYWJlbHtvcHRwYXJzZS1wb3B1bGF0aW5nLXBhcnNlcn19CiAKIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gcG9wdWxhdGUgdGhlIHBhcnNlciB3aXRoIG9wdGlvbnMuICBUaGUKQEAgLTcwOCwzOCArNzYyLDM0IEBACiBzcGVjaWZ5IGFueSBudW1iZXIgb2Ygc2hvcnQgb3IgbG9uZyBvcHRpb24gc3RyaW5ncywgYnV0IHlvdSBtdXN0IHNwZWNpZnkKIGF0IGxlYXN0IG9uZSBvdmVyYWxsIG9wdGlvbiBzdHJpbmcuCiAKLVRoZSBjYW5vbmljYWwgd2F5IHRvIGNyZWF0ZSBhbiBPcHRpb24gaW5zdGFuY2UgaXMgYnkgY2FsbGluZwotXGZ1bmN0aW9ue21ha2V7XF99b3B0aW9uKCl9LCBzbyB0aGF0IGlzIHdoYXQgd2lsbCBiZSBzaG93biBoZXJlLiAgSG93ZXZlciwgdGhlCi1tb3N0IGNvbW1vbiBhbmQgY29udmVuaWVudCB3YXkgaXMgdG8gdXNlIFxjb2Rle3BhcnNlci5hZGR7XF99b3B0aW9uKCl9LiAgTm90ZQotdGhhdCBcZnVuY3Rpb257bWFrZXtcX31vcHRpb24oKX0gYW5kIFxjb2Rle3BhcnNlci5hZGR7XF99b3B0aW9uKCl9IGhhdmUgaWRlbnRpY2FsIGNhbGwKLXNpZ25hdHVyZXM6CitUaGUgY2Fub25pY2FsIHdheSB0byBjcmVhdGUgYW4gT3B0aW9uIGluc3RhbmNlIGlzIHdpdGggdGhlCitcbWV0aG9ke2FkZHtcX31vcHRpb24oKX0gbWV0aG9kIG9mIFxjbGFzc3tPcHRpb25QYXJzZXJ9OgogXGJlZ2lue3ZlcmJhdGltfQotbWFrZV9vcHRpb24ob3B0X3N0ciwgLi4uLCBhdHRyPXZhbHVlLCAuLi4pCi1wYXJzZXIuYWRkX29wdGlvbihvcHRfc3RyLCAuLi4sIGF0dHI9dmFsdWUsIC4uLikKK3BhcnNlci5hZGRfb3B0aW9uKG9wdF9zdHJbLCAuLi5dLCBhdHRyPXZhbHVlLCAuLi4pCiBcZW5ke3ZlcmJhdGltfQogCiBUbyBkZWZpbmUgYW4gb3B0aW9uIHdpdGggb25seSBhIHNob3J0IG9wdGlvbiBzdHJpbmc6CiBcYmVnaW57dmVyYmF0aW19Ci1tYWtlX29wdGlvbigiLWYiLCBhdHRyPXZhbHVlLCAuLi4pCitwYXJzZXIuYWRkX29wdGlvbigiLWYiLCBhdHRyPXZhbHVlLCAuLi4pCiBcZW5ke3ZlcmJhdGltfQogCiBBbmQgdG8gZGVmaW5lIGFuIG9wdGlvbiB3aXRoIG9ubHkgYSBsb25nIG9wdGlvbiBzdHJpbmc6CiBcYmVnaW57dmVyYmF0aW19Ci1tYWtlX29wdGlvbigiLS1mb28iLCBhdHRyPXZhbHVlLCAuLi4pCitwYXJzZXIuYWRkX29wdGlvbigiLS1mb28iLCBhdHRyPXZhbHVlLCAuLi4pCiBcZW5ke3ZlcmJhdGltfQogCi1UaGUgXGNvZGV7YXR0cj12YWx1ZX0ga2V5d29yZCBhcmd1bWVudHMgZGVmaW5lIG9wdGlvbiBhdHRyaWJ1dGVzLAotaS5lLiBhdHRyaWJ1dGVzIG9mIHRoZSBPcHRpb24gb2JqZWN0LiAgVGhlIG1vc3QgaW1wb3J0YW50IG9wdGlvbgotYXR0cmlidXRlIGlzIFxtZW1iZXJ7YWN0aW9ufSwgYW5kIGl0IGxhcmdlbHkgZGV0ZXJtaW5lcyB3aGF0IG90aGVyIGF0dHJpYnV0ZXMKLWFyZSByZWxldmFudCBvciByZXF1aXJlZC4gIElmIHlvdSBwYXNzIGlycmVsZXZhbnQgb3B0aW9uIGF0dHJpYnV0ZXMsIG9yCi1mYWlsIHRvIHBhc3MgcmVxdWlyZWQgb25lcywgXG1vZHVsZXtvcHRwYXJzZX0gcmFpc2VzIGFuIE9wdGlvbkVycm9yIGV4Y2VwdGlvbgotZXhwbGFpbmluZyB5b3VyIG1pc3Rha2UuCitUaGUga2V5d29yZCBhcmd1bWVudHMgZGVmaW5lIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBPcHRpb24gb2JqZWN0LiAgVGhlCittb3N0IGltcG9ydGFudCBvcHRpb24gYXR0cmlidXRlIGlzIFxtZW1iZXJ7YWN0aW9ufSwgYW5kIGl0IGxhcmdlbHkgZGV0ZXJtaW5lcword2hpY2ggb3RoZXIgYXR0cmlidXRlcyBhcmUgcmVsZXZhbnQgb3IgcmVxdWlyZWQuICBJZiB5b3UgcGFzcyBpcnJlbGV2YW50CitvcHRpb24gYXR0cmlidXRlcywgb3IgZmFpbCB0byBwYXNzIHJlcXVpcmVkIG9uZXMsIFxtb2R1bGV7b3B0cGFyc2V9IHJhaXNlcyBhbgorT3B0aW9uRXJyb3IgZXhjZXB0aW9uIGV4cGxhaW5pbmcgeW91ciBtaXN0YWtlLgogCi1BbiBvcHRpb25zJ3MgXGVtcGh7YWN0aW9ufSBkZXRlcm1pbmVzIHdoYXQgXG1vZHVsZXtvcHRwYXJzZX0gZG9lcyB3aGVuIGl0IGVuY291bnRlcnMKLXRoaXMgb3B0aW9uIG9uIHRoZSBjb21tYW5kLWxpbmUuICBUaGUgYWN0aW9ucyBoYXJkLWNvZGVkIGludG8gXG1vZHVsZXtvcHRwYXJzZX0gYXJlOgorQW4gb3B0aW9ucydzIFxlbXBoe2FjdGlvbn0gZGV0ZXJtaW5lcyB3aGF0IFxtb2R1bGV7b3B0cGFyc2V9IGRvZXMgd2hlbiBpdCBlbmNvdW50ZXJzIHRoaXMKK29wdGlvbiBvbiB0aGUgY29tbWFuZC1saW5lLiAgVGhlIHN0YW5kYXJkIG9wdGlvbiBhY3Rpb25zIGhhcmQtY29kZWQgaW50bworXG1vZHVsZXtvcHRwYXJzZX0gYXJlOgogXGJlZ2lue2Rlc2NyaXB0aW9ufQogXGl0ZW1bXGNvZGV7c3RvcmV9XQotc3RvcmUgdGhpcyBvcHRpb24ncyBhcmd1bWVudCB7W31kZWZhdWx0XQorc3RvcmUgdGhpcyBvcHRpb24ncyBhcmd1bWVudCAoZGVmYXVsdCkKIFxpdGVtW1xjb2Rle3N0b3Jle1xffWNvbnN0fV0KIHN0b3JlIGEgY29uc3RhbnQgdmFsdWUKIFxpdGVtW1xjb2Rle3N0b3Jle1xffXRydWV9XQpAQCAtNzQ4LDYgKzc5OCw4IEBACiBzdG9yZSBhIGZhbHNlIHZhbHVlCiBcaXRlbVtcY29kZXthcHBlbmR9XQogYXBwZW5kIHRoaXMgb3B0aW9uJ3MgYXJndW1lbnQgdG8gYSBsaXN0CitcaXRlbVtcY29kZXthcHBlbmR7XF99Y29uc3R9XQorYXBwZW5kIGEgY29uc3RhbnQgdmFsdWUgdG8gYSBsaXN0CiBcaXRlbVtcY29kZXtjb3VudH1dCiBpbmNyZW1lbnQgYSBjb3VudGVyIGJ5IG9uZQogXGl0ZW1bXGNvZGV7Y2FsbGJhY2t9XQpAQCAtNzYyLDI0ICs4MTQsMjUgQEAKIGJlbG93LikKIAogQXMgeW91IGNhbiBzZWUsIG1vc3QgYWN0aW9ucyBpbnZvbHZlIHN0b3Jpbmcgb3IgdXBkYXRpbmcgYSB2YWx1ZQotc29tZXdoZXJlLiAgXG1vZHVsZXtvcHRwYXJzZX0gYWx3YXlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7b3B0cGFyc2UuVmFsdWVzfQotc3BlY2lmaWNhbGx5IGZvciB0aGlzIHB1cnBvc2U7IHdlIHJlZmVyIHRvIHRoaXMgaW5zdGFuY2UgYXMgXHZhcntvcHRpb25zfS4KLU9wdGlvbiBhcmd1bWVudHMgKGFuZCB2YXJpb3VzIG90aGVyIHZhbHVlcykgYXJlIHN0b3JlZCBhcyBhdHRyaWJ1dGVzIG9mCi10aGlzIG9iamVjdCwgYWNjb3JkaW5nIHRvIHRoZSBcbWVtYmVye2Rlc3R9IChkZXN0aW5hdGlvbikgb3B0aW9uIGF0dHJpYnV0ZS4KK3NvbWV3aGVyZS4gIFxtb2R1bGV7b3B0cGFyc2V9IGFsd2F5cyBjcmVhdGVzIGEgc3BlY2lhbCBvYmplY3QgZm9yIHRoaXMsCitjb252ZW50aW9uYWxseSBjYWxsZWQgXGNvZGV7b3B0aW9uc30gKGl0IGhhcHBlbnMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YKK1xjb2Rle29wdHBhcnNlLlZhbHVlc30pLiAgT3B0aW9uIGFyZ3VtZW50cyAoYW5kIHZhcmlvdXMgb3RoZXIgdmFsdWVzKSBhcmUKK3N0b3JlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoaXMgb2JqZWN0LCBhY2NvcmRpbmcgdG8gdGhlIFxtZW1iZXJ7ZGVzdH0KKyhkZXN0aW5hdGlvbikgb3B0aW9uIGF0dHJpYnV0ZS4KIAogRm9yIGV4YW1wbGUsIHdoZW4geW91IGNhbGwKIFxiZWdpbnt2ZXJiYXRpbX0KIHBhcnNlci5wYXJzZV9hcmdzKCkKIFxlbmR7dmVyYmF0aW19CiAKLW9uZSBvZiB0aGUgZmlyc3QgdGhpbmdzIFxtb2R1bGV7b3B0cGFyc2V9IGRvZXMgaXMgY3JlYXRlIHRoZSBcdmFye29wdGlvbnN9IG9iamVjdDoKK29uZSBvZiB0aGUgZmlyc3QgdGhpbmdzIFxtb2R1bGV7b3B0cGFyc2V9IGRvZXMgaXMgY3JlYXRlIHRoZSBcY29kZXtvcHRpb25zfSBvYmplY3Q6CiBcYmVnaW57dmVyYmF0aW19CiBvcHRpb25zID0gVmFsdWVzKCkKIFxlbmR7dmVyYmF0aW19CiAKIElmIG9uZSBvZiB0aGUgb3B0aW9ucyBpbiB0aGlzIHBhcnNlciBpcyBkZWZpbmVkIHdpdGgKIFxiZWdpbnt2ZXJiYXRpbX0KLW1ha2Vfb3B0aW9uKCItZiIsICItLWZpbGUiLCBhY3Rpb249InN0b3JlIiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iZmlsZW5hbWUiKQorcGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJmaWxlbmFtZSIpCiBcZW5ke3ZlcmJhdGltfQogCiBhbmQgdGhlIGNvbW1hbmQtbGluZSBiZWluZyBwYXJzZWQgaW5jbHVkZXMgYW55IG9mIHRoZSBmb2xsb3dpbmc6CkBAIC03OTAsOCArODQzLDcgQEAKIC0tZmlsZSBmb28KIFxlbmR7dmVyYmF0aW19CiAKLXRoZW4gXG1vZHVsZXtvcHRwYXJzZX0sIG9uIHNlZWluZyB0aGUgXHByb2dyYW1vcHR7LWZ9IG9yIFxsb25ncHJvZ3JhbW9wdHtmaWxlfSBvcHRpb24sIHdpbGwgZG8gdGhlCi1lcXVpdmFsZW50IG9mCit0aGVuIFxtb2R1bGV7b3B0cGFyc2V9LCBvbiBzZWVpbmcgdGhpcyBvcHRpb24sIHdpbGwgZG8gdGhlIGVxdWl2YWxlbnQgb2YKIFxiZWdpbnt2ZXJiYXRpbX0KIG9wdGlvbnMuZmlsZW5hbWUgPSAiZm9vIgogXGVuZHt2ZXJiYXRpbX0KQEAgLTkxMiw2ICs5NjQsMTMgQEAKIFxlbmR7dmVyYmF0aW19CiAKIFxpdGVtIHt9IAorXGNvZGV7YXBwZW5ke1xffWNvbnN0fSB7W31yZXF1aXJlZDogXGNvZGV7Y29uc3R9OyByZWxldmFudDogXG1lbWJlcntkZXN0fV0KKworTGlrZSBcY29kZXtzdG9yZXtcX31jb25zdH0sIGJ1dCB0aGUgdmFsdWUgXGNvZGV7Y29uc3R9IGlzIGFwcGVuZGVkIHRvIFxtZW1iZXJ7ZGVzdH07CithcyB3aXRoIFxjb2Rle2FwcGVuZH0sIFxtZW1iZXJ7ZGVzdH0gZGVmYXVsdHMgdG8gXGNvZGV7Tm9uZX0sIGFuZCBhbiBhbiBlbXB0eSBsaXN0IGlzCithdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgdGhlIG9wdGlvbiBpcyBlbmNvdW50ZXJlZC4KKworXGl0ZW0ge30gCiBcY29kZXtjb3VudH0ge1t9cmVsZXZhbnQ6IFxtZW1iZXJ7ZGVzdH1dCiAKIEluY3JlbWVudCB0aGUgaW50ZWdlciBzdG9yZWQgYXQgXG1lbWJlcntkZXN0fS4gIElmIG5vIGRlZmF1bHQgdmFsdWUgaXMKQEAgLTkzOSwxNCArOTk4LDkgQEAKIFxjb2Rle2NhbGxiYWNrfSB7W31yZXF1aXJlZDogXGNvZGV7Y2FsbGJhY2t9OwogcmVsZXZhbnQ6IFxtZW1iZXJ7dHlwZX0sIFxjb2Rle25hcmdzfSwgXGNvZGV7Y2FsbGJhY2t7XF99YXJnc30sIFxjb2Rle2NhbGxiYWNre1xffWt3YXJnc31dCiAKLUNhbGwgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSBcY29kZXtjYWxsYmFja30uICBUaGUgc2lnbmF0dXJlIG9mCi10aGlzIGZ1bmN0aW9uIHNob3VsZCBiZQorQ2FsbCB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIGJ5IFxjb2Rle2NhbGxiYWNrfSwgd2hpY2ggaXMgY2FsbGVkIGFzCiBcYmVnaW57dmVyYmF0aW19Ci1mdW5jKG9wdGlvbiA6IE9wdGlvbiwKLSAgICAgb3B0IDogc3RyaW5nLAotICAgICB2YWx1ZSA6IGFueSwKLSAgICAgcGFyc2VyIDogT3B0aW9uUGFyc2VyLAotICAgICAqYXJncywgKiprd2FyZ3MpCitmdW5jKG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlciwgKmFyZ3MsICoqa3dhcmdzKQogXGVuZHt2ZXJiYXRpbX0KIAogU2VlIHNlY3Rpb25+XHJlZntvcHRwYXJzZS1vcHRpb24tY2FsbGJhY2tzfSwgT3B0aW9uIENhbGxiYWNrcyBmb3IgbW9yZSBkZXRhaWwuCkBAIC05NTYsNyArMTAxMCw3IEBACiAKIFByaW50cyBhIGNvbXBsZXRlIGhlbHAgbWVzc2FnZSBmb3IgYWxsIHRoZSBvcHRpb25zIGluIHRoZQogY3VycmVudCBvcHRpb24gcGFyc2VyLiAgVGhlIGhlbHAgbWVzc2FnZSBpcyBjb25zdHJ1Y3RlZCBmcm9tCi10aGUgXHZhcnt1c2FnZX0gc3RyaW5nIHBhc3NlZCB0byBPcHRpb25QYXJzZXIncyBjb25zdHJ1Y3RvciBhbmQKK3RoZSBcY29kZXt1c2FnZX0gc3RyaW5nIHBhc3NlZCB0byBPcHRpb25QYXJzZXIncyBjb25zdHJ1Y3RvciBhbmQKIHRoZSBcbWVtYmVye2hlbHB9IHN0cmluZyBwYXNzZWQgdG8gZXZlcnkgb3B0aW9uLgogCiBJZiBubyBcbWVtYmVye2hlbHB9IHN0cmluZyBpcyBzdXBwbGllZCBmb3IgYW4gb3B0aW9uLCBpdCB3aWxsIHN0aWxsIGJlCkBAIC0xMDA3LDYgKzEwNjEsODcgQEAKIFxlbmR7aXRlbWl6ZX0KIAogCitcc3Vic3Vic2VjdGlvbntPcHRpb24gYXR0cmlidXRlc1xsYWJlbHtvcHRwYXJzZS1vcHRpb24tYXR0cmlidXRlc319CisKK1RoZSBmb2xsb3dpbmcgb3B0aW9uIGF0dHJpYnV0ZXMgbWF5IGJlIHBhc3NlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cwordG8gXGNvZGV7cGFyc2VyLmFkZHtcX31vcHRpb24oKX0uICBJZiB5b3UgcGFzcyBhbiBvcHRpb24gYXR0cmlidXRlCit0aGF0IGlzIG5vdCByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgb3B0aW9uLCBvciBmYWlsIHRvIHBhc3MgYSByZXF1aXJlZAorb3B0aW9uIGF0dHJpYnV0ZSwgXG1vZHVsZXtvcHRwYXJzZX0gcmFpc2VzIE9wdGlvbkVycm9yLgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSB7fSAKK1xtZW1iZXJ7YWN0aW9ufSAoZGVmYXVsdDogXGNvZGV7InN0b3JlIn0pCisKK0RldGVybWluZXMgXG1vZHVsZXtvcHRwYXJzZX0ncyBiZWhhdmlvdXIgd2hlbiB0aGlzIG9wdGlvbiBpcyBzZWVuIG9uIHRoZSBjb21tYW5kCitsaW5lOyB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlIGRvY3VtZW50ZWQgYWJvdmUuCisKK1xpdGVtIHt9IAorXG1lbWJlcnt0eXBlfSAoZGVmYXVsdDogXGNvZGV7InN0cmluZyJ9KQorCitUaGUgYXJndW1lbnQgdHlwZSBleHBlY3RlZCBieSB0aGlzIG9wdGlvbiAoZS5nLiwgXGNvZGV7InN0cmluZyJ9IG9yCitcY29kZXsiaW50In0pOyB0aGUgYXZhaWxhYmxlIG9wdGlvbiB0eXBlcyBhcmUgZG9jdW1lbnRlZCBiZWxvdy4KKworXGl0ZW0ge30gCitcbWVtYmVye2Rlc3R9IChkZWZhdWx0OiBkZXJpdmVkIGZyb20gb3B0aW9uIHN0cmluZ3MpCisKK0lmIHRoZSBvcHRpb24ncyBhY3Rpb24gaW1wbGllcyB3cml0aW5nIG9yIG1vZGlmeWluZyBhIHZhbHVlIHNvbWV3aGVyZSwKK3RoaXMgdGVsbHMgXG1vZHVsZXtvcHRwYXJzZX0gd2hlcmUgdG8gd3JpdGUgaXQ6IFxtZW1iZXJ7ZGVzdH0gbmFtZXMgYW4gYXR0cmlidXRlIG9mIHRoZQorXGNvZGV7b3B0aW9uc30gb2JqZWN0IHRoYXQgXG1vZHVsZXtvcHRwYXJzZX0gYnVpbGRzIGFzIGl0IHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lLgorCitcaXRlbSB7fSAKK1xjb2Rle2RlZmF1bHR9IChkZXByZWNhdGVkKQorCitUaGUgdmFsdWUgdG8gdXNlIGZvciB0aGlzIG9wdGlvbidzIGRlc3RpbmF0aW9uIGlmIHRoZSBvcHRpb24gaXMgbm90CitzZWVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICBEZXByZWNhdGVkOyB1c2UgXGNvZGV7cGFyc2VyLnNldHtcX31kZWZhdWx0cygpfQoraW5zdGVhZC4KKworXGl0ZW0ge30gCitcY29kZXtuYXJnc30gKGRlZmF1bHQ6IDEpCisKK0hvdyBtYW55IGFyZ3VtZW50cyBvZiB0eXBlIFxtZW1iZXJ7dHlwZX0gc2hvdWxkIGJlIGNvbnN1bWVkIHdoZW4gdGhpcworb3B0aW9uIGlzIHNlZW4uICBJZiB7XHRleHRncmVhdGVyfSAxLCBcbW9kdWxle29wdHBhcnNlfSB3aWxsIHN0b3JlIGEgdHVwbGUgb2YgdmFsdWVzIHRvCitcbWVtYmVye2Rlc3R9LgorCitcaXRlbSB7fSAKK1xjb2Rle2NvbnN0fQorCitGb3IgYWN0aW9ucyB0aGF0IHN0b3JlIGEgY29uc3RhbnQgdmFsdWUsIHRoZSBjb25zdGFudCB2YWx1ZSB0byBzdG9yZS4KKworXGl0ZW0ge30gCitcY29kZXtjaG9pY2VzfQorCitGb3Igb3B0aW9ucyBvZiB0eXBlIFxjb2RleyJjaG9pY2UifSwgdGhlIGxpc3Qgb2Ygc3RyaW5ncyB0aGUgdXNlcgorbWF5IGNob29zZSBmcm9tLgorCitcaXRlbSB7fSAKK1xjb2Rle2NhbGxiYWNrfQorCitGb3Igb3B0aW9ucyB3aXRoIGFjdGlvbiBcY29kZXsiY2FsbGJhY2sifSwgdGhlIGNhbGxhYmxlIHRvIGNhbGwgd2hlbiB0aGlzCitvcHRpb24gaXMgc2Vlbi4gIFNlZSBzZWN0aW9uflxyZWZ7b3B0cGFyc2Utb3B0aW9uLWNhbGxiYWNrc30sIE9wdGlvbiBDYWxsYmFja3MgZm9yIGRldGFpbCBvbiB0aGUgYXJndW1lbnRzCitwYXNzZWQgdG8gXGNvZGV7Y2FsbGFibGV9LgorCitcaXRlbSB7fSAKK1xjb2Rle2NhbGxiYWNre1xffWFyZ3N9LCBcY29kZXtjYWxsYmFja3tcX31rd2FyZ3N9CisKK0FkZGl0aW9uYWwgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMgdG8gcGFzcyB0byBcY29kZXtjYWxsYmFja30KK2FmdGVyIHRoZSBmb3VyIHN0YW5kYXJkIGNhbGxiYWNrIGFyZ3VtZW50cy4KKworXGl0ZW0ge30gCitcbWVtYmVye2hlbHB9CisKK0hlbHAgdGV4dCB0byBwcmludCBmb3IgdGhpcyBvcHRpb24gd2hlbiBsaXN0aW5nIGFsbCBhdmFpbGFibGUgb3B0aW9ucworYWZ0ZXIgdGhlIHVzZXIgc3VwcGxpZXMgYSBcbWVtYmVye2hlbHB9IG9wdGlvbiAoc3VjaCBhcyBcY29kZXsiLXt9LWhlbHAifSkuCitJZiBubyBoZWxwIHRleHQgaXMgc3VwcGxpZWQsIHRoZSBvcHRpb24gd2lsbCBiZSBsaXN0ZWQgd2l0aG91dCBoZWxwCit0ZXh0LiAgVG8gaGlkZSB0aGlzIG9wdGlvbiwgdXNlIHRoZSBzcGVjaWFsIHZhbHVlIFxjb2Rle1NVUFBSRVNTe1xffUhFTFB9LgorCitcaXRlbSB7fSAKK1xjb2Rle21ldGF2YXJ9IChkZWZhdWx0OiBkZXJpdmVkIGZyb20gb3B0aW9uIHN0cmluZ3MpCisKK1N0YW5kLWluIGZvciB0aGUgb3B0aW9uIGFyZ3VtZW50KHMpIHRvIHVzZSB3aGVuIHByaW50aW5nIGhlbHAgdGV4dC4KK1NlZSBzZWN0aW9uflxyZWZ7b3B0cGFyc2UtdHV0b3JpYWx9LCB0aGUgdHV0b3JpYWwgZm9yIGFuIGV4YW1wbGUuCisKK1xlbmR7aXRlbWl6ZX0KKworCiBcc3Vic3Vic2VjdGlvbntTdGFuZGFyZCBvcHRpb24gdHlwZXNcbGFiZWx7b3B0cGFyc2Utc3RhbmRhcmQtb3B0aW9uLXR5cGVzfX0KIAogXG1vZHVsZXtvcHRwYXJzZX0gaGFzIHNpeCBidWlsdC1pbiBvcHRpb24gdHlwZXM6IFxjb2Rle3N0cmluZ30sIFxjb2Rle2ludH0sIFxjb2Rle2xvbmd9LApAQCAtMTAxNywyMiArMTE1Miw3NCBAQAogdGV4dCBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIHN0b3JlZCBpbiB0aGUgZGVzdGluYXRpb24gKG9yIHBhc3NlZCB0byB0aGUKIGNhbGxiYWNrKSBhcy1pcy4KIAotSW50ZWdlciBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBcY29kZXtpbnQoKX0gdG8gY29udmVydCB0aGVtIHRvIFB5dGhvbgotaW50ZWdlcnMuICBJZiBcY29kZXtpbnQoKX0gZmFpbHMsIHNvIHdpbGwgXG1vZHVsZXtvcHRwYXJzZX0sIGFsdGhvdWdoIHdpdGggYSBtb3JlCi11c2VmdWwgZXJyb3IgbWVzc2FnZS4gIChJbnRlcm5hbGx5LCBcbW9kdWxle29wdHBhcnNlfSByYWlzZXMKLVxleGNlcHRpb257T3B0aW9uVmFsdWVFcnJvcn07IE9wdGlvblBhcnNlciBjYXRjaGVzIHRoaXMgZXhjZXB0aW9uIGhpZ2hlcgotdXAgYW5kIHRlcm1pbmF0ZXMgeW91ciBwcm9ncmFtIHdpdGggYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4pCitJbnRlZ2VyIGFyZ3VtZW50cyAodHlwZSBcY29kZXtpbnR9IG9yIFxjb2Rle2xvbmd9KSBhcmUgcGFyc2VkIGFzIGZvbGxvd3M6CitcYmVnaW57cXVvdGV9CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIHt9IAoraWYgdGhlIG51bWJlciBzdGFydHMgd2l0aCBcY29kZXsweH0sIGl0IGlzIHBhcnNlZCBhcyBhIGhleGFkZWNpbWFsIG51bWJlcgogCi1MaWtld2lzZSwgXGNvZGV7ZmxvYXR9IGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIFxjb2Rle2Zsb2F0KCl9IGZvciBjb252ZXJzaW9uLAotXGNvZGV7bG9uZ30gYXJndW1lbnRzIHRvIFxjb2Rle2xvbmcoKX0sIGFuZCBcY29kZXtjb21wbGV4fSBhcmd1bWVudHMgdG8KLVxjb2Rle2NvbXBsZXgoKX0uICBBcGFydCBmcm9tIHRoYXQsIHRoZXkgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHkgdG8gaW50ZWdlcgotYXJndW1lbnRzLgorXGl0ZW0ge30gCitpZiB0aGUgbnVtYmVyIHN0YXJ0cyB3aXRoIFxjb2RlezB9LCBpdCBpcyBwYXJzZWQgYXMgYW4gb2N0YWwgbnVtYmVyCisKK1xpdGVtIHt9IAoraWYgdGhlIG51bWJlciBzdGFydHMgd2l0aCBcY29kZXswYn0sIGlzIGlzIHBhcnNlZCBhcyBhIGJpbmFyeSBudW1iZXIKKworXGl0ZW0ge30gCitvdGhlcndpc2UsIHRoZSBudW1iZXIgaXMgcGFyc2VkIGFzIGEgZGVjaW1hbCBudW1iZXIKKworXGVuZHtpdGVtaXplfQorXGVuZHtxdW90ZX0KKworVGhlIGNvbnZlcnNpb24gaXMgZG9uZSBieSBjYWxsaW5nIGVpdGhlciBcY29kZXtpbnQoKX0gb3IgXGNvZGV7bG9uZygpfSB3aXRoCit0aGUgYXBwcm9wcmlhdGUgYmFzZSAoMiwgOCwgMTAsIG9yIDE2KS4gIElmIHRoaXMgZmFpbHMsIHNvIHdpbGwgXG1vZHVsZXtvcHRwYXJzZX0sCithbHRob3VnaCB3aXRoIGEgbW9yZSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4KKworXGNvZGV7ZmxvYXR9IGFuZCBcY29kZXtjb21wbGV4fSBvcHRpb24gYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgZGlyZWN0bHkgd2l0aAorXGNvZGV7ZmxvYXQoKX0gYW5kIFxjb2Rle2NvbXBsZXgoKX0sIHdpdGggc2ltaWxhciBlcnJvci1oYW5kbGluZy4KIAogXGNvZGV7Y2hvaWNlfSBvcHRpb25zIGFyZSBhIHN1YnR5cGUgb2YgXGNvZGV7c3RyaW5nfSBvcHRpb25zLiAgVGhlIFxjb2Rle2Nob2ljZXN9CiBvcHRpb24gYXR0cmlidXRlIChhIHNlcXVlbmNlIG9mIHN0cmluZ3MpIGRlZmluZXMgdGhlIHNldCBvZiBhbGxvd2VkCi1vcHRpb24gYXJndW1lbnRzLiAgXGNvZGV7b3B0cGFyc2Uub3B0aW9uLmNoZWNre1xffWNob2ljZSgpfSBjb21wYXJlcworb3B0aW9uIGFyZ3VtZW50cy4gIFxjb2Rle29wdHBhcnNlLmNoZWNre1xffWNob2ljZSgpfSBjb21wYXJlcwogdXNlci1zdXBwbGllZCBvcHRpb24gYXJndW1lbnRzIGFnYWluc3QgdGhpcyBtYXN0ZXIgbGlzdCBhbmQgcmFpc2VzCi1cZXhjZXB0aW9ue09wdGlvblZhbHVlRXJyb3J9IGlmIGFuIGludmFsaWQgc3RyaW5nIGlzIGdpdmVuLgorT3B0aW9uVmFsdWVFcnJvciBpZiBhbiBpbnZhbGlkIHN0cmluZyBpcyBnaXZlbi4KKworCitcc3Vic3Vic2VjdGlvbntQYXJzaW5nIGFyZ3VtZW50c1xsYWJlbHtvcHRwYXJzZS1wYXJzaW5nLWFyZ3VtZW50c319CisKK1RoZSB3aG9sZSBwb2ludCBvZiBjcmVhdGluZyBhbmQgcG9wdWxhdGluZyBhbiBPcHRpb25QYXJzZXIgaXMgdG8gY2FsbAoraXRzIFxtZXRob2R7cGFyc2V7XF99YXJncygpfSBtZXRob2Q6CitcYmVnaW57dmVyYmF0aW19Cisob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzPU5vbmUsIG9wdGlvbnM9Tm9uZSkKK1xlbmR7dmVyYmF0aW19CisKK3doZXJlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZQorXGJlZ2lue2Rlc2NyaXB0aW9ufQorXGl0ZW1bXGNvZGV7YXJnc31dCit0aGUgbGlzdCBvZiBhcmd1bWVudHMgdG8gcHJvY2VzcyAoXGNvZGV7c3lzLmFyZ3Z7W30xOl19IGJ5IGRlZmF1bHQpCitcaXRlbVtcY29kZXtvcHRpb25zfV0KK29iamVjdCB0byBzdG9yZSBvcHRpb24gYXJndW1lbnRzIGluIChhIG5ldyBpbnN0YW5jZSBvZgorb3B0cGFyc2UuVmFsdWVzIGJ5IGRlZmF1bHQpCitcZW5ke2Rlc2NyaXB0aW9ufQorCithbmQgdGhlIHJldHVybiB2YWx1ZXMgYXJlCitcYmVnaW57ZGVzY3JpcHRpb259CitcaXRlbVtcY29kZXtvcHRpb25zfV0KK3RoZSBzYW1lIG9iamVjdCBhcyB3YXMgcGFzc2VkIGluIGFzIFxjb2Rle29wdGlvbnN9LCBvciB0aGUgbmV3CitvcHRwYXJzZS5WYWx1ZXMgaW5zdGFuY2UgY3JlYXRlZCBieSBcbW9kdWxle29wdHBhcnNlfQorXGl0ZW1bXGNvZGV7YXJnc31dCit0aGUgbGVmdG92ZXIgcG9zaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgYWxsIG9wdGlvbnMgaGF2ZSBiZWVuCitwcm9jZXNzZWQKK1xlbmR7ZGVzY3JpcHRpb259CisKK1RoZSBtb3N0IGNvbW1vbiB1c2FnZSBpcyB0byBzdXBwbHkgbmVpdGhlciBrZXl3b3JkIGFyZ3VtZW50LiAgSWYgeW91CitzdXBwbHkgYSBcY29kZXt2YWx1ZXN9IG9iamVjdCwgaXQgd2lsbCBiZSByZXBlYXRlZGx5IG1vZGlmaWVkIHdpdGggYQorXGNvZGV7c2V0YXR0cigpfSBjYWxsIGZvciBldmVyeSBvcHRpb24gYXJndW1lbnQgd3JpdHRlbiB0byBhbiBvcHRpb24KK2Rlc3RpbmF0aW9uLCBhbmQgZmluYWxseSByZXR1cm5lZCBieSBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0uCisKK0lmIFxtZXRob2R7cGFyc2V7XF99YXJncygpfSBlbmNvdW50ZXJzIGFueSBlcnJvcnMgaW4gdGhlIGFyZ3VtZW50IGxpc3QsIGl0IGNhbGxzCit0aGUgT3B0aW9uUGFyc2VyJ3MgXG1ldGhvZHtlcnJvcigpfSBtZXRob2Qgd2l0aCBhbiBhcHByb3ByaWF0ZSBlbmQtdXNlciBlcnJvcgorbWVzc2FnZS4gIFRoaXMgdWx0aW1hdGVseSB0ZXJtaW5hdGVzIHlvdXIgcHJvY2VzcyB3aXRoIGFuIGV4aXQgc3RhdHVzIG9mCisyICh0aGUgdHJhZGl0aW9uYWwgXFVOSVh7fSBleGl0IHN0YXR1cyBmb3IgY29tbWFuZC1saW5lIGVycm9ycykuCiAKIAogXHN1YnN1YnNlY3Rpb257UXVlcnlpbmcgYW5kIG1hbmlwdWxhdGluZyB5b3VyIG9wdGlvbiBwYXJzZXJcbGFiZWx7b3B0cGFyc2UtcXVlcnlpbmctbWFuaXB1bGF0aW5nLW9wdGlvbi1wYXJzZXJ9fQpAQCAtMTA1MCw5ICsxMjM3LDggQEAKIElmIHRoZSBPcHRpb25QYXJzZXIgaGFzIGFuIG9wdGlvbiBjb3JyZXNwb25kaW5nIHRvIFxjb2Rle29wdHtcX31zdHJ9LAogdGhhdCBvcHRpb24gaXMgcmVtb3ZlZC4gIElmIHRoYXQgb3B0aW9uIHByb3ZpZGVkIGFueSBvdGhlcgogb3B0aW9uIHN0cmluZ3MsIGFsbCBvZiB0aG9zZSBvcHRpb24gc3RyaW5ncyBiZWNvbWUgaW52YWxpZC4KLQogSWYgXGNvZGV7b3B0e1xffXN0cn0gZG9lcyBub3Qgb2NjdXIgaW4gYW55IG9wdGlvbiBiZWxvbmdpbmcgdG8gdGhpcwotT3B0aW9uUGFyc2VyLCByYWlzZXMgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfS4KK09wdGlvblBhcnNlciwgcmFpc2VzIFZhbHVlRXJyb3IuCiBcZW5ke2Rlc2NyaXB0aW9ufQogCiAKQEAgLTEwNzQsMjAgKzEyNjAsMjAgQEAKIG1lY2hhbmlzbS4gIFlvdSBjYW4gc2V0IHRoZSBjb25mbGljdC1oYW5kbGluZyBtZWNoYW5pc20gZWl0aGVyIGluIHRoZQogY29uc3RydWN0b3I6CiBcYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIgPSBPcHRpb25QYXJzZXIoLi4uLCBjb25mbGljdF9oYW5kbGVyPSIuLi4iKQorcGFyc2VyID0gT3B0aW9uUGFyc2VyKC4uLiwgY29uZmxpY3RfaGFuZGxlcj1oYW5kbGVyKQogXGVuZHt2ZXJiYXRpbX0KIAogb3Igd2l0aCBhIHNlcGFyYXRlIGNhbGw6CiBcYmVnaW57dmVyYmF0aW19Ci1wYXJzZXIuc2V0X2NvbmZsaWN0X2hhbmRsZXIoIi4uLiIpCitwYXJzZXIuc2V0X2NvbmZsaWN0X2hhbmRsZXIoaGFuZGxlcikKIFxlbmR7dmVyYmF0aW19CiAKLVRoZSBhdmFpbGFibGUgY29uZmxpY3QtaGFuZGxpbmcgbWVjaGFuaXNtcyBhcmU6CitUaGUgYXZhaWxhYmxlIGNvbmZsaWN0IGhhbmRsZXJzIGFyZToKIFxiZWdpbntxdW90ZX0KIFxiZWdpbntkZXNjcmlwdGlvbn0KIFxpdGVtW1xjb2Rle2Vycm9yfSAoZGVmYXVsdCldCiBhc3N1bWUgb3B0aW9uIGNvbmZsaWN0cyBhcmUgYSBwcm9ncmFtbWluZyBlcnJvciBhbmQgcmFpc2UgCi1cZXhjZXB0aW9ue09wdGlvbkNvbmZsaWN0RXJyb3J9CitPcHRpb25Db25mbGljdEVycm9yCiBcaXRlbVtcY29kZXtyZXNvbHZlfV0KIHJlc29sdmUgb3B0aW9uIGNvbmZsaWN0cyBpbnRlbGxpZ2VudGx5IChzZWUgYmVsb3cpCiBcZW5ke2Rlc2NyaXB0aW9ufQpAQCAtMTEzMSw3ICsxMzE3LDc4IEBACiAgIC1uLCAtLW5vaXN5ICAgYmUgbm9pc3kKICAgLS1kcnktcnVuICAgICBuZXcgZHJ5LXJ1biBvcHRpb24KIFxlbmR7dmVyYmF0aW19Ci0lICRJZDogcmVmZXJlbmNlLnR4dCA0MTUgMjAwNC0wOS0zMCAwMjoyNjoxN1ogZ3JlZyAkIAorCisKK1xzdWJzdWJzZWN0aW9ue0NsZWFudXBcbGFiZWx7b3B0cGFyc2UtY2xlYW51cH19CisKK09wdGlvblBhcnNlciBpbnN0YW5jZXMgaGF2ZSBzZXZlcmFsIGN5Y2xpYyByZWZlcmVuY2VzLiAgVGhpcyBzaG91bGQgbm90CitiZSBhIHByb2JsZW0gZm9yIFB5dGhvbidzIGdhcmJhZ2UgY29sbGVjdG9yLCBidXQgeW91IG1heSB3aXNoIHRvIGJyZWFrCit0aGUgY3ljbGljIHJlZmVyZW5jZXMgZXhwbGljaXRseSBieSBjYWxsaW5nIFxjb2Rle2Rlc3Ryb3koKX0gb24geW91cgorT3B0aW9uUGFyc2VyIG9uY2UgeW91IGFyZSBkb25lIHdpdGggaXQuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4KK2xvbmctcnVubmluZyBhcHBsaWNhdGlvbnMgd2hlcmUgbGFyZ2Ugb2JqZWN0IGdyYXBocyBhcmUgcmVhY2hhYmxlIGZyb20KK3lvdXIgT3B0aW9uUGFyc2VyLgorCisKK1xzdWJzdWJzZWN0aW9ue090aGVyIG1ldGhvZHNcbGFiZWx7b3B0cGFyc2Utb3RoZXItbWV0aG9kc319CisKK09wdGlvblBhcnNlciBzdXBwb3J0cyBzZXZlcmFsIG90aGVyIHB1YmxpYyBtZXRob2RzOgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSB7fSAKK1xjb2Rle3NldHtcX311c2FnZSh1c2FnZSl9CisKK1NldCB0aGUgdXNhZ2Ugc3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZGVzY3JpYmVkIGFib3ZlIGZvciB0aGUKK1xjb2Rle3VzYWdlfSBjb25zdHJ1Y3RvciBrZXl3b3JkIGFyZ3VtZW50LiAgUGFzc2luZyBcY29kZXtOb25lfSBzZXRzIHRoZQorZGVmYXVsdCB1c2FnZSBzdHJpbmc7IHVzZSBcY29kZXtTVVBQUkVTU3tcX31VU0FHRX0gdG8gc3VwcHJlc3MgYSB1c2FnZQorbWVzc2FnZS4KKworXGl0ZW0ge30gCitcY29kZXtlbmFibGV7XF99aW50ZXJzcGVyc2Vke1xffWFyZ3MoKX0sIFxjb2Rle2Rpc2FibGV7XF99aW50ZXJzcGVyc2Vke1xffWFyZ3MoKX0KKworRW5hYmxlL2Rpc2FibGUgcG9zaXRpb25hbCBhcmd1bWVudHMgaW50ZXJzcGVyc2VkIHdpdGggb3B0aW9ucywgc2ltaWxhcgordG8gR05VIGdldG9wdCAoZW5hYmxlZCBieSBkZWZhdWx0KS4gIEZvciBleGFtcGxlLCBpZiBcY29kZXsiLWEifSBhbmQKK1xjb2RleyItYiJ9IGFyZSBib3RoIHNpbXBsZSBvcHRpb25zIHRoYXQgdGFrZSBubyBhcmd1bWVudHMsIFxtb2R1bGV7b3B0cGFyc2V9Citub3JtYWxseSBhY2NlcHRzIHRoaXMgc3ludGF4OgorXGJlZ2lue3ZlcmJhdGltfQorcHJvZyAtYSBhcmcxIC1iIGFyZzIKK1xlbmR7dmVyYmF0aW19CisKK2FuZCB0cmVhdHMgaXQgYXMgZXF1aXZhbGVudCB0bworXGJlZ2lue3ZlcmJhdGltfQorcHJvZyAtYSAtYiBhcmcxIGFyZzIKK1xlbmR7dmVyYmF0aW19CisKK1RvIGRpc2FibGUgdGhpcyBmZWF0dXJlLCBjYWxsIFxjb2Rle2Rpc2FibGV7XF99aW50ZXJzcGVyc2Vke1xffWFyZ3MoKX0uICBUaGlzCityZXN0b3JlcyB0cmFkaXRpb25hbCBcVU5JWHt9IHN5bnRheCwgd2hlcmUgb3B0aW9uIHBhcnNpbmcgc3RvcHMgd2l0aCB0aGUKK2ZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQuCisKK1xpdGVtIHt9IAorXGNvZGV7c2V0e1xffWRlZmF1bHRzKGRlc3Q9dmFsdWUsIC4uLil9CisKK1NldCBkZWZhdWx0IHZhbHVlcyBmb3Igc2V2ZXJhbCBvcHRpb24gZGVzdGluYXRpb25zIGF0IG9uY2UuICBVc2luZworXG1ldGhvZHtzZXR7XF99ZGVmYXVsdHMoKX0gaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvcgorb3B0aW9ucywgc2luY2UgbXVsdGlwbGUgb3B0aW9ucyBjYW4gc2hhcmUgdGhlIHNhbWUgZGVzdGluYXRpb24uICBGb3IKK2V4YW1wbGUsIGlmIHNldmVyYWwgYGBtb2RlJycgb3B0aW9ucyBhbGwgc2V0IHRoZSBzYW1lIGRlc3RpbmF0aW9uLCBhbnkKK29uZSBvZiB0aGVtIGNhbiBzZXQgdGhlIGRlZmF1bHQsIGFuZCB0aGUgbGFzdCBvbmUgd2luczoKK1xiZWdpbnt2ZXJiYXRpbX0KK3BhcnNlci5hZGRfb3B0aW9uKCItLWFkdmFuY2VkIiwgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICBkZXN0PSJtb2RlIiwgY29uc3Q9ImFkdmFuY2VkIiwKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im5vdmljZSIpICAgICMgb3ZlcnJpZGRlbiBiZWxvdworcGFyc2VyLmFkZF9vcHRpb24oIi0tbm92aWNlIiwgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICBkZXN0PSJtb2RlIiwgY29uc3Q9Im5vdmljZSIsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJhZHZhbmNlZCIpICAjIG92ZXJyaWRlcyBhYm92ZSBzZXR0aW5nCitcZW5ke3ZlcmJhdGltfQorCitUbyBhdm9pZCB0aGlzIGNvbmZ1c2lvbiwgdXNlIFxtZXRob2R7c2V0e1xffWRlZmF1bHRzKCl9OgorXGJlZ2lue3ZlcmJhdGltfQorcGFyc2VyLnNldF9kZWZhdWx0cyhtb2RlPSJhZHZhbmNlZCIpCitwYXJzZXIuYWRkX29wdGlvbigiLS1hZHZhbmNlZCIsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgZGVzdD0ibW9kZSIsIGNvbnN0PSJhZHZhbmNlZCIpCitwYXJzZXIuYWRkX29wdGlvbigiLS1ub3ZpY2UiLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgIGRlc3Q9Im1vZGUiLCBjb25zdD0ibm92aWNlIikKK1xlbmR7dmVyYmF0aW19CisKK1xlbmR7aXRlbWl6ZX0KKyUgJElkOiByZWZlcmVuY2UudHh0IDUwNSAyMDA1LTA3LTIyIDAxOjUyOjQwWiBnd2FyZCAkIAogCiAKIFxzdWJzZWN0aW9ue09wdGlvbiBDYWxsYmFja3NcbGFiZWx7b3B0cGFyc2Utb3B0aW9uLWNhbGxiYWNrc319CkBAIC0xMjM0LDcgKzE0OTEsNyBAQAogdGhlIGN1cnJlbnQgbGlzdCBvZiBsZWZ0b3ZlciBhcmd1bWVudHMsIGllLiBhcmd1bWVudHMgdGhhdCBoYXZlCiBiZWVuIGNvbnN1bWVkIGJ1dCBhcmUgbmVpdGhlciBvcHRpb25zIG5vciBvcHRpb24gYXJndW1lbnRzLgogRmVlbCBmcmVlIHRvIG1vZGlmeSBcY29kZXtwYXJzZXIubGFyZ3N9LCBlLmcuIGJ5IGFkZGluZyBtb3JlCi1hcmd1bWVudHMgdG8gaXQuICAoVGhpcyBsaXN0IHdpbGwgYmVjb21lIFx2YXJ7YXJnc30sIHRoZSBzZWNvbmQKK2FyZ3VtZW50cyB0byBpdC4gIChUaGlzIGxpc3Qgd2lsbCBiZWNvbWUgXGNvZGV7YXJnc30sIHRoZSBzZWNvbmQKIHJldHVybiB2YWx1ZSBvZiBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0uKQogXGl0ZW1bXGNvZGV7cGFyc2VyLnJhcmdzfV0KIHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVtYWluaW5nIGFyZ3VtZW50cywgaWUuIHdpdGggXGNvZGV7b3B0e1xffXN0cn0gYW5kCkBAIC0xMjYwLDcgKzE1MTcsNyBAQAogCiBcc3Vic3Vic2VjdGlvbntSYWlzaW5nIGVycm9ycyBpbiBhIGNhbGxiYWNrXGxhYmVse29wdHBhcnNlLXJhaXNpbmctZXJyb3JzLWluLWNhbGxiYWNrfX0KIAotVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCByYWlzZSBcZXhjZXB0aW9ue09wdGlvblZhbHVlRXJyb3J9IGlmIHRoZXJlIGFyZSBhbnkKK1RoZSBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgcmFpc2UgT3B0aW9uVmFsdWVFcnJvciBpZiB0aGVyZSBhcmUgYW55CiBwcm9ibGVtcyB3aXRoIHRoZSBvcHRpb24gb3IgaXRzIGFyZ3VtZW50KHMpLiAgXG1vZHVsZXtvcHRwYXJzZX0gY2F0Y2hlcyB0aGlzIGFuZAogdGVybWluYXRlcyB0aGUgcHJvZ3JhbSwgcHJpbnRpbmcgdGhlIGVycm9yIG1lc3NhZ2UgeW91IHN1cHBseSB0bwogc3RkZXJyLiAgWW91ciBtZXNzYWdlIHNob3VsZCBiZSBjbGVhciwgY29uY2lzZSwgYWNjdXJhdGUsIGFuZCBtZW50aW9uCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnBkYi50ZXggYi9Eb2MvbGliL2xpYnBkYi50ZXgKaW5kZXggYTViMzZhNi4uYjI1MmFlYiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJwZGIudGV4CisrKyBiL0RvYy9saWIvbGlicGRiLnRleApAQCAtMTc4LDEyICsxNzgsMTIgQEAKIFxpdGVtW2Qob3duKV0KIAogTW92ZSB0aGUgY3VycmVudCBmcmFtZSBvbmUgbGV2ZWwgZG93biBpbiB0aGUgc3RhY2sgdHJhY2UKLSh0byBhbiBuZXdlciBmcmFtZSkuCisodG8gYSBuZXdlciBmcmFtZSkuCiAKIFxpdGVtW3UocCldCiAKIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgb25lIGxldmVsIHVwIGluIHRoZSBzdGFjayB0cmFjZQotKHRvIGEgb2xkZXIgZnJhbWUpLgorKHRvIGFuIG9sZGVyIGZyYW1lKS4KIAogXGl0ZW1bYihyZWFrKSBcb3B0aW9uYWx7XG9wdGlvbmFse1x2YXJ7ZmlsZW5hbWV9On1cdmFye2xpbmVub31cY29kZXtcTGFyZ2V7fH19XHZhcntmdW5jdGlvbn1cb3B0aW9uYWx7LCBcdmFye2NvbmRpdGlvbn19fV0KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJwb3NpeHBhdGgudGV4IGIvRG9jL2xpYi9saWJwb3NpeHBhdGgudGV4CmluZGV4IGNlYTk2M2UuLjlmMGRlMWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlicG9zaXhwYXRoLnRleAorKysgYi9Eb2MvbGliL2xpYnBvc2l4cGF0aC50ZXgKQEAgLTE0Niw4ICsxNDYsOSBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtqb2lufXtwYXRoMVxvcHRpb25hbHssIHBhdGgyXG9wdGlvbmFseywgLi4ufX19Ci1Kb2lucyBvbmUgb3IgbW9yZSBwYXRoIGNvbXBvbmVudHMgaW50ZWxsaWdlbnRseS4gIElmIGFueSBjb21wb25lbnQgaXMKLWFuIGFic29sdXRlIHBhdGgsIGFsbCBwcmV2aW91cyBjb21wb25lbnRzIGFyZSB0aHJvd24gYXdheSwgYW5kIGpvaW5pbmcKK0pvaW4gb25lIG9yIG1vcmUgcGF0aCBjb21wb25lbnRzIGludGVsbGlnZW50bHkuICBJZiBhbnkgY29tcG9uZW50IGlzCithbiBhYnNvbHV0ZSBwYXRoLCBhbGwgcHJldmlvdXMgY29tcG9uZW50cyAob24gV2luZG93cywgaW5jbHVkaW5nIHRoZQorcHJldmlvdXMgZHJpdmUgbGV0dGVyLCBpZiB0aGVyZSB3YXMgb25lKSBhcmUgdGhyb3duIGF3YXksIGFuZCBqb2luaW5nCiBjb250aW51ZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIFx2YXJ7cGF0aDF9LCBhbmQKIG9wdGlvbmFsbHkgXHZhcntwYXRoMn0sIGV0Yy4sIHdpdGggZXhhY3RseSBvbmUgZGlyZWN0b3J5IHNlcGFyYXRvcgogKFxjb2Rle29zLnNlcH0pIGluc2VydGVkIGJldHdlZW4gY29tcG9uZW50cywgdW5sZXNzIFx2YXJ7cGF0aDJ9IGlzCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnByb2ZpbGUudGV4IGIvRG9jL2xpYi9saWJwcm9maWxlLnRleAppbmRleCA5ZmY1YmEwLi4wMTA4YjIxIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnByb2ZpbGUudGV4CisrKyBiL0RvYy9saWIvbGlicHJvZmlsZS50ZXgKQEAgLTM4NCwxNCArMzg0LDE1IEBACiBcdmFye2NvbW1hbmR9IHN0cmluZy4KIFxlbmR7ZnVuY2Rlc2N9CiAKLUFuYWx5c2lzIG9mIHRoZSBwcm9maWxlciBkYXRhIGlzIGRvbmUgdXNpbmcgdGhpcyBjbGFzcyBmcm9tIHRoZQotXG1vZHVsZXtwc3RhdHN9IG1vZHVsZToKK0FuYWx5c2lzIG9mIHRoZSBwcm9maWxlciBkYXRhIGlzIGRvbmUgdXNpbmcgdGhlIFxjbGFzc3tTdGF0c30gY2xhc3MuCisKK1xub3Rle1RoZSBcY2xhc3N7U3RhdHN9IGNsYXNzIGlzIGRlZmluZWQgaW4gdGhlIFxtb2R1bGV7cHN0YXRzfSBtb2R1bGUufQogCiAlIG5vdyBzd2l0Y2ggbW9kdWxlcy4uLi4KICUgKFRoaXMgXHN0bW9kaW5kZXggdXNlIG1heSBiZSBoYXJkIHRvIGNoYW5nZSA7LSggKQogXHN0bW9kaW5kZXh7cHN0YXRzfQogCi1cYmVnaW57Y2xhc3NkZXNjfXtTdGF0c317ZmlsZW5hbWVcb3B0aW9uYWx7LCBcbW9yZWFyZ3Ncb3B0aW9uYWx7LCBzdHJlYW09c3lzLnN0ZG91dH19fQorXGJlZ2lue2NsYXNzZGVzY317U3RhdHN9e2ZpbGVuYW1lXG9wdGlvbmFseywgc3RyZWFtPXN5cy5zdGRvdXRcb3B0aW9uYWx7LCBcbW9yZWFyZ3N9fX0KIFRoaXMgY2xhc3MgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGBgc3RhdGlzdGljcyBvYmplY3QnJwogZnJvbSBhIFx2YXJ7ZmlsZW5hbWV9IChvciBzZXQgb2YgZmlsZW5hbWVzKS4gIFxjbGFzc3tTdGF0c30gb2JqZWN0cyBhcmUKIG1hbmlwdWxhdGVkIGJ5IG1ldGhvZHMsIGluIG9yZGVyIHRvIHByaW50IHVzZWZ1bCByZXBvcnRzLiAgWW91IG1heSBzcGVjaWZ5CkBAIC00MDksNiArNDEwLDggQEAKIHByb2Nlc3NlcyBjYW4gYmUgY29uc2lkZXJlZCBpbiBhIHNpbmdsZSByZXBvcnQuICBJZiBhZGRpdGlvbmFsIGZpbGVzCiBuZWVkIHRvIGJlIGNvbWJpbmVkIHdpdGggZGF0YSBpbiBhbiBleGlzdGluZyBcY2xhc3N7U3RhdHN9IG9iamVjdCwgdGhlCiBcbWV0aG9ke2FkZCgpfSBtZXRob2QgY2FuIGJlIHVzZWQuCisKK1x2ZXJzaW9uY2hhbmdlZFtUaGUgXHZhcntzdHJlYW19IHBhcmFtZXRlciB3YXMgYWRkZWRdezIuNX0KIFxlbmR7Y2xhc3NkZXNjfQogCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmxjb21wbGV0ZXIudGV4IGIvRG9jL2xpYi9saWJybGNvbXBsZXRlci50ZXgKaW5kZXggYjJhMWViYS4uY2IyYWM1OSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJybGNvbXBsZXRlci50ZXgKKysrIGIvRG9jL2xpYi9saWJybGNvbXBsZXRlci50ZXgKQEAgLTIsMTggKzIsMTcgQEAKICAgICAgICAgIENvbXBsZXRpb24gZnVuY3Rpb24gZm9yIEdOVSByZWFkbGluZX0KIAogXGRlY2xhcmVtb2R1bGV7c3RhbmRhcmR9e3JsY29tcGxldGVyfQotICBccGxhdGZvcm17VW5peH0KIFxzZWN0aW9uYXV0aG9ye01vc2hlIFphZGthfXttb3NoZXpAemFka2Euc2l0ZS5jby5pbH0KLVxtb2R1bGVzeW5vcHNpc3tQeXRob24gaWRlbnRpZmllciBjb21wbGV0aW9uIGZvciB0aGUgR05VIHJlYWRsaW5lIGxpYnJhcnkufQorXG1vZHVsZXN5bm9wc2lze1B5dGhvbiBpZGVudGlmaWVyIGNvbXBsZXRpb24sIHN1aXRhYmxlIGZvciB0aGUgR05VIHJlYWRsaW5lIGxpYnJhcnkufQogCi1UaGUgXG1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlIGRlZmluZXMgYSBjb21wbGV0aW9uIGZ1bmN0aW9uIGZvcgorVGhlIFxtb2R1bGV7cmxjb21wbGV0ZXJ9IG1vZHVsZSBkZWZpbmVzIGEgY29tcGxldGlvbiBmdW5jdGlvbiBzdWl0YWJsZSBmb3IKIHRoZSBccmVmbW9kdWxle3JlYWRsaW5lfSBtb2R1bGUgYnkgY29tcGxldGluZyB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMKIGFuZCBrZXl3b3Jkcy4KIAotVGhpcyBtb2R1bGUgaXMgXFVOSVgtc3BlY2lmaWMgZHVlIHRvIGl0cyBkZXBlbmRlbmNlIG9uIHRoZQotXHJlZm1vZHVsZXtyZWFkbGluZX0gbW9kdWxlLgotCi1UaGUgXG1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlIGRlZmluZXMgdGhlIFxjbGFzc3tDb21wbGV0ZXJ9IGNsYXNzLgorV2hlbiB0aGlzIG1vZHVsZSBpcyBpbXBvcnRlZCBvbiBhIFxVTklYXCBwbGF0Zm9ybSB3aXRoIHRoZSBcbW9kdWxle3JlYWRsaW5lfQorbW9kdWxlIGF2YWlsYWJsZSwgYW4gaW5zdGFuY2Ugb2YgdGhlIFxjbGFzc3tDb21wbGV0ZXJ9IGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkKK2NyZWF0ZWQgYW5kIGl0cyBcbWV0aG9ke2NvbXBsZXRlfSBtZXRob2QgaXMgc2V0IGFzIHRoZSBcbW9kdWxle3JlYWRsaW5lfQorY29tcGxldGVyLgogCiBFeGFtcGxlOgogCkBAIC00NCw2ICs0Myw5IEBACiBcZW5ke3ZlcmJhdGltfQogCiAKK09uIHBsYXRmb3JtcyB3aXRob3V0IFxtb2R1bGV7cmVhZGxpbmV9LCB0aGUgXGNsYXNze0NvbXBsZXRlcn0gY2xhc3MgZGVmaW5lZAorYnkgdGhpcyBtb2R1bGUgY2FuIHN0aWxsIGJlIHVzZWQgZm9yIGN1c3RvbSBwdXJwb3Nlcy4KKwogXHN1YnNlY3Rpb257Q29tcGxldGVyIE9iamVjdHMgXGxhYmVse2NvbXBsZXRlci1vYmplY3RzfX0KIAogQ29tcGxldGVyIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicnVucHkudGV4IGIvRG9jL2xpYi9saWJydW5weS50ZXgKaW5kZXggNGJlOTkwMS4uYzdhN2U1MSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJydW5weS50ZXgKKysrIGIvRG9jL2xpYi9saWJydW5weS50ZXgKQEAgLTEwLDcgKzEwLDcgQEAKIFx2ZXJzaW9uYWRkZWR7Mi41fQogCiBUaGUgXG1vZHVsZXtydW5weX0gbW9kdWxlIGlzIHVzZWQgdG8gbG9jYXRlIGFuZCBydW4gUHl0aG9uIG1vZHVsZXMKLXdpdGhvdXQgaW1wb3J0aW5nIHRoZW0gZmlyc3QuIEl0J3MgbWFpbiB1c2UgaXMgdG8gaW1wbGVtZW50IHRoZQord2l0aG91dCBpbXBvcnRpbmcgdGhlbSBmaXJzdC4gSXRzIG1haW4gdXNlIGlzIHRvIGltcGxlbWVudCB0aGUKIFxwcm9ncmFtb3B0ey1tfSBjb21tYW5kIGxpbmUgc3dpdGNoIHRoYXQgYWxsb3dzIHNjcmlwdHMgdG8gYmUgbG9jYXRlZAogdXNpbmcgdGhlIFB5dGhvbiBtb2R1bGUgbmFtZXNwYWNlIHJhdGhlciB0aGFuIHRoZSBmaWxlc3lzdGVtLgogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNxbGl0ZTMudGV4IGIvRG9jL2xpYi9saWJzcWxpdGUzLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzgwZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9saWJzcWxpdGUzLnRleApAQCAtMCwwICsxLDUwMyBAQAorXHNlY3Rpb257XG1vZHVsZXtzcWxpdGUzfSAtLS0KKyAgICAgICAgIERCLUFQSSAyLjAgaW50ZXJmYWNlIGZvciBTUUxpdGUgZGF0YWJhc2VzfQorCitcZGVjbGFyZW1vZHVsZXtidWlsdGlufXtzcWxpdGUzfQorXG1vZHVsZXN5bm9wc2lze0EgREItQVBJIDIuMCBpbXBsZW1lbnRhdGlvbiB1c2luZyBTUUxpdGUgMy54Ln0KK1xzZWN0aW9uYXV0aG9ye0dlcmhhcmQgSMOkcmluZ317Z2hAZ2hhZXJpbmcuZGV9CitcdmVyc2lvbmFkZGVkezIuNX0KKworXHN1YnNlY3Rpb257TW9kdWxlIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzXGxhYmVse3NxbGl0ZTMtTW9kdWxlLUNvbnRlbnRzfX0KKworXGJlZ2lue2RhdGFkZXNjfXtQQVJTRV9ERUNMVFlQRVN9CitUaGlzIGNvbnN0YW50IGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCB0aGUgXHZhcntkZXRlY3RfdHlwZXN9IHBhcmFtZXRlciBvZiB0aGUKK1xmdW5jdGlvbntjb25uZWN0fSBmdW5jdGlvbi4KKworU2V0dGluZyBpdCBtYWtlcyB0aGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgcGFyc2UgdGhlIGRlY2xhcmVkIHR5cGUgZm9yIGVhY2ggY29sdW1uIGl0CityZXR1cm5zLiAgSXQgd2lsbCBwYXJzZSBvdXQgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGRlY2xhcmVkIHR5cGUsIGkuIGUuIGZvcgorImludGVnZXIgcHJpbWFyeSBrZXkiLCBpdCB3aWxsIHBhcnNlIG91dCAiaW50ZWdlciIuIFRoZW4gZm9yIHRoYXQgY29sdW1uLCBpdAord2lsbCBsb29rIGludG8gdGhlIGNvbnZlcnRlcnMgZGljdGlvbmFyeSBhbmQgdXNlIHRoZSBjb252ZXJ0ZXIgZnVuY3Rpb24KK3JlZ2lzdGVyZWQgZm9yIHRoYXQgdHlwZSB0aGVyZS4gIENvbnZlcnRlciBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUhCitcZW5ke2RhdGFkZXNjfQorCisKK1xiZWdpbntkYXRhZGVzY317UEFSU0VfQ09MTkFNRVN9CitUaGlzIGNvbnN0YW50IGlzIG1lYW50IHRvIGJlIHVzZWQgd2l0aCB0aGUgXHZhcntkZXRlY3RfdHlwZXN9IHBhcmFtZXRlciBvZiB0aGUKK1xmdW5jdGlvbntjb25uZWN0fSBmdW5jdGlvbi4KKworU2V0dGluZyB0aGlzIG1ha2VzIHRoZSBTUUxpdGUgaW50ZXJmYWNlIHBhcnNlIHRoZSBjb2x1bW4gbmFtZSBmb3IgZWFjaCBjb2x1bW4KK2l0IHJldHVybnMuICBJdCB3aWxsIGxvb2sgZm9yIGEgc3RyaW5nIGZvcm1lZCBbbXl0eXBlXSBpbiB0aGVyZSwgYW5kIHRoZW4KK2RlY2lkZSB0aGF0ICdteXR5cGUnIGlzIHRoZSB0eXBlIG9mIHRoZSBjb2x1bW4uIEl0IHdpbGwgdHJ5IHRvIGZpbmQgYW4gZW50cnkgb2YKKydteXR5cGUnIGluIHRoZSBjb252ZXJ0ZXJzIGRpY3Rpb25hcnkgYW5kIHRoZW4gdXNlIHRoZSBjb252ZXJ0ZXIgZnVuY3Rpb24gZm91bmQKK3RoZXJlIHRvIHJldHVybiB0aGUgdmFsdWUuIFRoZSBjb2x1bW4gbmFtZSBmb3VuZCBpbiBcbWVtYmVye2N1cnNvci5kZXNjcmlwdGlvbn0gaXMgb25seQordGhlIGZpcnN0IHdvcmQgb2YgdGhlIGNvbHVtbiBuYW1lLCBpLiAgZS4gaWYgeW91IHVzZSBzb21ldGhpbmcgbGlrZQorXGNvZGV7J2FzICJ4IFtkYXRldGltZV0iJ30gaW4geW91ciBTUUwsIHRoZW4gd2Ugd2lsbCBwYXJzZSBvdXQgZXZlcnl0aGluZyB1bnRpbCB0aGUKK2ZpcnN0IGJsYW5rIGZvciB0aGUgY29sdW1uIG5hbWU6IHRoZSBjb2x1bW4gbmFtZSB3b3VsZCBzaW1wbHkgYmUgIngiLgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtjb25uZWN0fXtkYXRhYmFzZVxvcHRpb25hbHssIHRpbWVvdXQsIGlzb2xhdGlvbl9sZXZlbCwgZGV0ZWN0X3R5cGVzLCBmYWN0b3J5fX0KK09wZW5zIGEgY29ubmVjdGlvbiB0byB0aGUgU1FMaXRlIGRhdGFiYXNlIGZpbGUgXHZhcntkYXRhYmFzZX0uIFlvdSBjYW4gdXNlCitcY29kZXsiOm1lbW9yeToifSB0byBvcGVuIGEgZGF0YWJhc2UgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIHRoYXQgcmVzaWRlcyBpbgorUkFNIGluc3RlYWQgb2Ygb24gZGlzay4KKworV2hlbiBhIGRhdGFiYXNlIGlzIGFjY2Vzc2VkIGJ5IG11bHRpcGxlIGNvbm5lY3Rpb25zLCBhbmQgb25lIG9mIHRoZSBwcm9jZXNzZXMKK21vZGlmaWVzIHRoZSBkYXRhYmFzZSwgdGhlIFNRTGl0ZSBkYXRhYmFzZSBpcyBsb2NrZWQgdW50aWwgdGhhdCB0cmFuc2FjdGlvbiBpcworY29tbWl0dGVkLiBUaGUgXHZhcnt0aW1lb3V0fSBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBsb25nIHRoZSBjb25uZWN0aW9uIHNob3VsZAord2FpdCBmb3IgdGhlIGxvY2sgdG8gZ28gYXdheSB1bnRpbCByYWlzaW5nIGFuIGV4Y2VwdGlvbi4gVGhlIGRlZmF1bHQgZm9yIHRoZQordGltZW91dCBwYXJhbWV0ZXIgaXMgNS4wIChmaXZlIHNlY29uZHMpLiAKKworRm9yIHRoZSBcdmFye2lzb2xhdGlvbl9sZXZlbH0gcGFyYW1ldGVyLCBwbGVhc2Ugc2VlIFxtZW1iZXJ7aXNvbGF0aW9uX2xldmVsfQorXHJlZntzcWxpdGUzLUNvbm5lY3Rpb24tSXNvbGF0aW9uTGV2ZWx9IHByb3BlcnR5IG9mIFxjbGFzc3tDb25uZWN0aW9ufSBvYmplY3RzLgorCitTUUxpdGUgbmF0aXZlbHkgc3VwcG9ydHMgb25seSB0aGUgdHlwZXMgVEVYVCwgSU5URUdFUiwgRkxPQVQsIEJMT0IgYW5kIE5VTEwuIElmCit5b3Ugd2FudCB0byB1c2Ugb3RoZXIgdHlwZXMsIGxpa2UgeW91IGhhdmUgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZW0geW91cnNlbGYuCitUaGUgXHZhcntkZXRlY3RfdHlwZXN9IHBhcmFtZXRlciBhbmQgdGhlIHVzaW5nIGN1c3RvbSBcc3Ryb25ne2NvbnZlcnRlcnN9IHJlZ2lzdGVyZWQgd2l0aAordGhlIG1vZHVsZS1sZXZlbCBcZnVuY3Rpb257cmVnaXN0ZXJfY29udmVydGVyfSBmdW5jdGlvbiBhbGxvdyB5b3UgdG8gZWFzaWx5IGRvIHRoYXQuCisKK1x2YXJ7ZGV0ZWN0X3R5cGVzfSBkZWZhdWx0cyB0byAwIChpLiBlLiBvZmYsIG5vIHR5cGUgZGV0ZWN0aW9uKSwgeW91IGNhbiBzZXQgaXQKK3RvIGFueSBjb21iaW5hdGlvbiBvZiBcY29uc3RhbnR7UEFSU0VfREVDTFRZUEVTfSBhbmQgXGNvbnN0YW50e1BBUlNFX0NPTE5BTUVTfSB0byB0dXJuIHR5cGUKK2RldGVjdGlvbiBvbi4KKworQnkgZGVmYXVsdCwgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIHVzZXMgaXRzIFxjbGFzc3tDb25uZWN0aW9ufSBjbGFzcyBmb3IgdGhlCitjb25uZWN0IGNhbGwuICBZb3UgY2FuLCBob3dldmVyLCBzdWJjbGFzcyB0aGUgXGNsYXNze0Nvbm5lY3Rpb259IGNsYXNzIGFuZCBtYWtlCitcZnVuY3Rpb257Y29ubmVjdH0gdXNlIHlvdXIgY2xhc3MgaW5zdGVhZCBieSBwcm92aWRpbmcgeW91ciBjbGFzcyBmb3IgdGhlCitcdmFye2ZhY3Rvcnl9IHBhcmFtZXRlci4KKworQ29uc3VsdCB0aGUgc2VjdGlvbiBccmVme3NxbGl0ZTMtVHlwZXN9IG9mIHRoaXMgbWFudWFsIGZvciBkZXRhaWxzLgorCitUaGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgaW50ZXJuYWxseSB1c2VzIGEgc3RhdGVtZW50IGNhY2hlIHRvIGF2b2lkIFNRTCBwYXJzaW5nCitvdmVyaGVhZC4gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseSBzZXQgdGhlIG51bWJlciBvZiBzdGF0ZW1lbnRzIHRoYXQgYXJlCitjYWNoZWQgZm9yIHRoZSBjb25uZWN0aW9uLCB5b3UgY2FuIHNldCB0aGUgXHZhcntjYWNoZWRfc3RhdGVtZW50c30gcGFyYW1ldGVyLgorVGhlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBkZWZhdWx0IGlzIHRvIGNhY2hlIDEwMCBzdGF0ZW1lbnRzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtyZWdpc3Rlcl9jb252ZXJ0ZXJ9e3R5cGVuYW1lLCBjYWxsYWJsZX0KK1JlZ2lzdGVycyBhIGNhbGxhYmxlIHRvIGNvbnZlcnQgYSBieXRlc3RyaW5nIGZyb20gdGhlIGRhdGFiYXNlIGludG8gYSBjdXN0b20KK1B5dGhvbiB0eXBlLiBUaGUgY2FsbGFibGUgd2lsbCBiZSBpbnZva2VkIGZvciBhbGwgZGF0YWJhc2UgdmFsdWVzIHRoYXQgYXJlIG9mCit0aGUgdHlwZSBcdmFye3R5cGVuYW1lfS4gQ29uZmVyIHRoZSBwYXJhbWV0ZXIgXHZhcntkZXRlY3RfdHlwZXN9IG9mIHRoZQorXGZ1bmN0aW9ue2Nvbm5lY3R9IGZ1bmN0aW9uIGZvciBob3cgdGhlIHR5cGUgZGV0ZWN0aW9uIHdvcmtzLiBOb3RlIHRoYXQgdGhlIGNhc2Ugb2YKK1x2YXJ7dHlwZW5hbWV9IGFuZCB0aGUgbmFtZSBvZiB0aGUgdHlwZSBpbiB5b3VyIHF1ZXJ5IG11c3QgbWF0Y2ghCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3JlZ2lzdGVyX2FkYXB0ZXJ9e3R5cGUsIGNhbGxhYmxlfQorUmVnaXN0ZXJzIGEgY2FsbGFibGUgdG8gY29udmVydCB0aGUgY3VzdG9tIFB5dGhvbiB0eXBlIFx2YXJ7dHlwZX0gaW50byBvbmUgb2YKK1NRTGl0ZSdzIHN1cHBvcnRlZCB0eXBlcy4gVGhlIGNhbGxhYmxlIFx2YXJ7Y2FsbGFibGV9IGFjY2VwdHMgYXMgc2luZ2xlCitwYXJhbWV0ZXIgdGhlIFB5dGhvbiB2YWx1ZSwgYW5kIG11c3QgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKK2ludCwgbG9uZywgZmxvYXQsIHN0ciAoVVRGLTggZW5jb2RlZCksIHVuaWNvZGUgb3IgYnVmZmVyLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtjb21wbGV0ZV9zdGF0ZW1lbnR9e3NxbH0KK1JldHVybnMgXGNvbnN0YW50e1RydWV9IGlmIHRoZSBzdHJpbmcgXHZhcntzcWx9IG9uZSBvciBtb3JlIGNvbXBsZXRlIFNRTAorc3RhdGVtZW50cyB0ZXJtaW5hdGVkIGJ5IHNlbWljb2xvbnMuIEl0IGRvZXMgbm90IHZlcmlmeSBpZiB0aGUgU1FMIGlzCitzeW50YWN0aWNhbGx5IGNvcnJlY3QsIG9ubHkgaWYgdGhlcmUgYXJlIG5vIHVuY2xvc2VkIHN0cmluZyBsaXRlcmFscyBhbmQgaWYgdGhlCitzdGF0ZW1lbnQgaXMgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbi4KKworVGhpcyBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHNoZWxsIGZvciBTUUxpdGUsIGxpa2UgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisgICAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHl9CitcZW5ke2Z1bmNkZXNjfQorCitcc3Vic2VjdGlvbntDb25uZWN0aW9uIE9iamVjdHMgXGxhYmVse3NxbGl0ZTMtQ29ubmVjdGlvbi1PYmplY3RzfX0KKworQSBcY2xhc3N7Q29ubmVjdGlvbn0gaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQgbWV0aG9kczoKKworXGxhYmVse3NxbGl0ZTMtQ29ubmVjdGlvbi1Jc29sYXRpb25MZXZlbH0KK1xiZWdpbnttZW1iZXJkZXNjfXtpc29sYXRpb25fbGV2ZWx9CisgIEdldCBvciBzZXQgdGhlIGN1cnJlbnQgaXNvbGF0aW9uIGxldmVsLiBOb25lIGZvciBhdXRvY29tbWl0IG1vZGUgb3Igb25lIG9mCisgICJERUZFUlJFRCIsICJJTU1FRElBVEUiIG9yICJFWExVU0lWRSIuIFNlZSAgQ29udHJvbGxpbmcgVHJhbnNhY3Rpb25zCisgIFxyZWZ7c3FsaXRlMy1Db250cm9sbGluZy1UcmFuc2FjdGlvbnN9IGZvciBhIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24uCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtjdXJzb3J9e1xvcHRpb25hbHtjdXJzb3JDbGFzc319CisgIFRoZSBjdXJzb3IgbWV0aG9kIGFjY2VwdHMgYSBzaW5nbGUgb3B0aW9uYWwgcGFyYW1ldGVyIFx2YXJ7Y3Vyc29yQ2xhc3N9LgorICBUaGlzIGlzIGEgY3VzdG9tIGN1cnNvciBjbGFzcyB3aGljaCBtdXN0IGV4dGVuZCBcY2xhc3N7c3FsaXRlMy5DdXJzb3J9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZXhlY3V0ZX17c3FsLCBcb3B0aW9uYWx7cGFyYW1ldGVyc319CitUaGlzIGlzIGEgbm9uc3RhbmRhcmQgc2hvcnRjdXQgdGhhdCBjcmVhdGVzIGFuIGludGVybWVkaWF0ZSBjdXJzb3Igb2JqZWN0IGJ5CitjYWxsaW5nIHRoZSBjdXJzb3IgbWV0aG9kLCB0aGVuIGNhbGxzIHRoZSBjdXJzb3IncyBcbWV0aG9ke2V4ZWN1dGV9IG1ldGhvZCB3aXRoIHRoZQorcGFyYW1ldGVycyBnaXZlbi4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2V4ZWN1dGVtYW55fXtzcWwsIFxvcHRpb25hbHtwYXJhbWV0ZXJzfX0KK1RoaXMgaXMgYSBub25zdGFuZGFyZCBzaG9ydGN1dCB0aGF0IGNyZWF0ZXMgYW4gaW50ZXJtZWRpYXRlIGN1cnNvciBvYmplY3QgYnkKK2NhbGxpbmcgdGhlIGN1cnNvciBtZXRob2QsIHRoZW4gY2FsbHMgdGhlIGN1cnNvcidzIFxtZXRob2R7ZXhlY3V0ZW1hbnl9IG1ldGhvZCB3aXRoIHRoZQorcGFyYW1ldGVycyBnaXZlbi4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2V4ZWN1dGVzY3JpcHR9e3NxbF9zY3JpcHR9CitUaGlzIGlzIGEgbm9uc3RhbmRhcmQgc2hvcnRjdXQgdGhhdCBjcmVhdGVzIGFuIGludGVybWVkaWF0ZSBjdXJzb3Igb2JqZWN0IGJ5CitjYWxsaW5nIHRoZSBjdXJzb3IgbWV0aG9kLCB0aGVuIGNhbGxzIHRoZSBjdXJzb3IncyBcbWV0aG9ke2V4ZWN1dGVzY3JpcHR9IG1ldGhvZCB3aXRoIHRoZQorcGFyYW1ldGVycyBnaXZlbi4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2NyZWF0ZV9mdW5jdGlvbn17bmFtZSwgbnVtX3BhcmFtcywgZnVuY30KKworQ3JlYXRlcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiB0aGF0IHlvdSBjYW4gbGF0ZXIgdXNlIGZyb20gd2l0aGluIFNRTAorc3RhdGVtZW50cyB1bmRlciB0aGUgZnVuY3Rpb24gbmFtZSBcdmFye25hbWV9LiBcdmFye251bV9wYXJhbXN9IGlzIHRoZSBudW1iZXIKK29mIHBhcmFtZXRlcnMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMsIGFuZCBcdmFye2Z1bmN9IGlzIGEgUHl0aG9uIGNhbGxhYmxlIHRoYXQgaXMKK2NhbGxlZCBhcyBTUUwgZnVuY3Rpb24uCisKK1RoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGFueSBvZiB0aGUgdHlwZXMgc3VwcG9ydGVkIGJ5IFNRTGl0ZTogdW5pY29kZSwgc3RyLAoraW50LCBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLiAgRXhjZXB0aW9ucyBpbiB0aGUgZnVuY3Rpb24gYXJlIGlnbm9yZWQgYW5kCit0aGV5IGFyZSBoYW5kbGVkIGFzIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBOb25lLgorCitFeGFtcGxlOgorCisgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvbWQ1ZnVuYy5weX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2NyZWF0ZV9hZ2dyZWdhdGV9e25hbWUsIG51bV9wYXJhbXMsIGFnZ3JlZ2F0ZV9jbGFzc30KKworQ3JlYXRlcyBhIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgZnVuY3Rpb24uCisKK1RoZSBhZ2dyZWdhdGUgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSBcY29kZXtzdGVwfSBtZXRob2QsIHdoaWNoIGFjY2VwdHMgdGhlCitudW1iZXIgb2YgcGFyYW1ldGVycyBcdmFye251bV9wYXJhbXN9LCBhbmQgYSBcY29kZXtmaW5hbGl6ZX0gbWV0aG9kIHdoaWNoCit3aWxsIHJldHVybiB0aGUgZmluYWwgcmVzdWx0IG9mIHRoZSBhZ2dyZWdhdGUuCisKK1RoZSBcY29kZXtmaW5hbGl6ZX0gbWV0aG9kIGNhbiByZXR1cm4gYW55IG9mIHRoZSB0eXBlcyBzdXBwb3J0ZWQgYnkgU1FMaXRlOgordW5pY29kZSwgc3RyLCBpbnQsIGxvbmcsIGZsb2F0LCBidWZmZXIgYW5kIE5vbmUuIEFueSBleGNlcHRpb25zIGFyZSBpZ25vcmVkLgorCitFeGFtcGxlOgorCisgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvbXlzdW1hZ2dyLnB5fQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Y3JlYXRlX2NvbGxhdGlvbn17bmFtZSwgY2FsbGFibGV9CisKK0NyZWF0ZXMgYSBjb2xsYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIFx2YXJ7bmFtZX0gYW5kIFx2YXJ7Y2FsbGFibGV9LiBUaGUKK2NhbGxhYmxlIHdpbGwgYmUgcGFzc2VkIHR3byBzdHJpbmcgYXJndW1lbnRzLiBJdCBzaG91bGQgcmV0dXJuIC0xIGlmIHRoZSBmaXJzdAoraXMgb3JkZXJlZCBsb3dlciB0aGFuIHRoZSBzZWNvbmQsIDAgaWYgdGhleSBhcmUgb3JkZXJlZCBlcXVhbCBhbmQgMSBhbmQgaWYgdGhlCitmaXJzdCBpcyBvcmRlcmVkIGhpZ2hlciB0aGFuIHRoZSBzZWNvbmQuICBOb3RlIHRoYXQgdGhpcyBjb250cm9scyBzb3J0aW5nCisoT1JERVIgQlkgaW4gU1FMKSBzbyB5b3VyIGNvbXBhcmlzb25zIGRvbid0IGFmZmVjdCBvdGhlciBTUUwgb3BlcmF0aW9ucy4KKworTm90ZSB0aGF0IHRoZSBjYWxsYWJsZSB3aWxsIGdldCBpdHMgcGFyYW1ldGVycyBhcyBQeXRob24gYnl0ZXN0cmluZ3MsIHdoaWNoCit3aWxsIG5vcm1hbGx5IGJlIGVuY29kZWQgaW4gVVRGLTguCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIGN1c3RvbSBjb2xsYXRpb24gdGhhdCBzb3J0cyAidGhlIHdyb25nIHdheSI6CisKKyAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9jb2xsYXRpb25fcmV2ZXJzZS5weX0KKworVG8gcmVtb3ZlIGEgY29sbGF0aW9uLCBjYWxsIFxjb2Rle2NyZWF0ZV9jb2xsYXRpb259IHdpdGggTm9uZSBhcyBjYWxsYWJsZToKKworXGJlZ2lue3ZlcmJhdGltfQorICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJyZXZlcnNlIiwgTm9uZSkKK1xlbmR7dmVyYmF0aW19CitcZW5ke21ldGhvZGRlc2N9CisKKworXGJlZ2lue21lbWJlcmRlc2N9e3Jvd19mYWN0b3J5fQorICBZb3UgY2FuIGNoYW5nZSB0aGlzIGF0dHJpYnV0ZSB0byBhIGNhbGxhYmxlIHRoYXQgYWNjZXB0cyB0aGUgY3Vyc29yIGFuZAorICB0aGUgb3JpZ2luYWwgcm93IGFzIHR1cGxlIGFuZCB3aWxsIHJldHVybiB0aGUgcmVhbCByZXN1bHQgcm93LiAgVGhpcworICB3YXksIHlvdSBjYW4gaW1wbGVtZW50IG1vcmUgYWR2YW5jZWQgd2F5cyBvZiByZXR1cm5pbmcgcmVzdWx0cywgbGlrZQorICBvbmVzIHRoYXQgY2FuIGFsc28gYWNjZXNzIGNvbHVtbnMgYnkgbmFtZS4KKworICBFeGFtcGxlOgorCisgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvcm93X2ZhY3RvcnkucHl9CisKKyAgSWYgdGhlIHN0YW5kYXJkIHR1cGxlIHR5cGVzIGRvbid0IHN1ZmZpY2UgZm9yIHlvdSwgYW5kIHlvdSB3YW50IG5hbWUtYmFzZWQKKyAgYWNjZXNzIHRvIGNvbHVtbnMsIHlvdSBzaG91bGQgY29uc2lkZXIgc2V0dGluZyBcbWVtYmVye3Jvd19mYWN0b3J5fSB0byB0aGUKKyAgaGlnaGx5LW9wdGltaXplZCBzcWxpdGUzLlJvdyB0eXBlLiBJdCBwcm92aWRlcyBib3RoCisgIGluZGV4LWJhc2VkIGFuZCBjYXNlLWluc2Vuc2l0aXZlIG5hbWUtYmFzZWQgYWNjZXNzIHRvIGNvbHVtbnMgd2l0aCBhbG1vc3QKKyAgbm8gbWVtb3J5IG92ZXJoZWFkLiBNdWNoIGJldHRlciB0aGFuIHlvdXIgb3duIGN1c3RvbSBkaWN0aW9uYXJ5LWJhc2VkCisgIGFwcHJvYWNoIG9yIGV2ZW4gYSBkYl9yb3cgYmFzZWQgc29sdXRpb24uCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXt0ZXh0X2ZhY3Rvcnl9CisgIFVzaW5nIHRoaXMgYXR0cmlidXRlIHlvdSBjYW4gY29udHJvbCB3aGF0IG9iamVjdHMgYXJlIHJldHVybmVkIGZvciB0aGUKKyAgVEVYVCBkYXRhIHR5cGUuIEJ5IGRlZmF1bHQsIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBcY2xhc3N7dW5pY29kZX0gYW5kCisgIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSB3aWxsIHJldHVybiBVbmljb2RlIG9iamVjdHMgZm9yIFRFWFQuIElmIHlvdSB3YW50IHRvIHJldHVybgorICBieXRlc3RyaW5ncyBpbnN0ZWFkLCB5b3UgY2FuIHNldCBpdCB0byBcY2xhc3N7c3RyfS4KKworICBGb3IgZWZmaWNpZW5jeSByZWFzb25zLCB0aGVyZSdzIGFsc28gYSB3YXkgdG8gcmV0dXJuIFVuaWNvZGUgb2JqZWN0cyBvbmx5CisgIGZvciBub24tQVNDSUkgZGF0YSwgYW5kIGJ5dGVzdHJpbmdzIG90aGVyd2lzZS4gVG8gYWN0aXZhdGUgaXQsIHNldCB0aGlzCisgIGF0dHJpYnV0ZSB0byBcY29uc3RhbnR7c3FsaXRlMy5PcHRpbWl6ZWRVbmljb2RlfS4KKworICBZb3UgY2FuIGFsc28gc2V0IGl0IHRvIGFueSBvdGhlciBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgYnl0ZXN0cmluZworICBwYXJhbWV0ZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvYmplY3QuCisKKyAgU2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb2RlIGZvciBpbGx1c3RyYXRpb246CisKKyAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy90ZXh0X2ZhY3RvcnkucHl9CitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXt0b3RhbF9jaGFuZ2VzfQorICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YWJhc2Ugcm93cyB0aGF0IGhhdmUgYmUgbW9kaWZpZWQsIGluc2VydGVkLAorICBvciBkZWxldGVkIHNpbmNlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHdhcyBvcGVuZWQuCitcZW5ke21lbWJlcmRlc2N9CisKKworCisKKworXHN1YnNlY3Rpb257Q3Vyc29yIE9iamVjdHMgXGxhYmVse3NxbGl0ZTMtQ3Vyc29yLU9iamVjdHN9fQorCitBIFxjbGFzc3tDdXJzb3J9IGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYW5kIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfXtleGVjdXRlfXtzcWwsIFxvcHRpb25hbHtwYXJhbWV0ZXJzfX0KKworRXhlY3V0ZXMgYSBTUUwgc3RhdGVtZW50LiBUaGUgU1FMIHN0YXRlbWVudCBtYXkgYmUgcGFyYW1ldHJpemVkIChpLiBlLgorcGxhY2Vob2xkZXJzIGluc3RlYWQgb2YgU1FMIGxpdGVyYWxzKS4gVGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIHN1cHBvcnRzIHR3byBraW5kcyBvZgorcGxhY2Vob2xkZXJzOiBxdWVzdGlvbiBtYXJrcyAocW1hcmsgc3R5bGUpIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgKG5hbWVkCitzdHlsZSkuCisKK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIHBhcmFtZXRlcnMgd2l0aCBxbWFyayBzdHlsZToKKworICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvZXhlY3V0ZV8xLnB5fQorCitUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSB0aGUgbmFtZWQgc3R5bGU6CisKKyAgICBcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL2V4ZWN1dGVfMi5weX0KKworICAgIFxtZXRob2R7ZXhlY3V0ZX0gd2lsbCBvbmx5IGV4ZWN1dGUgYSBzaW5nbGUgU1FMIHN0YXRlbWVudC4gSWYgeW91IHRyeSB0bworICAgIGV4ZWN1dGUgbW9yZSB0aGFuIG9uZSBzdGF0ZW1lbnQgd2l0aCBpdCwgaXQgd2lsbCByYWlzZSBhIFdhcm5pbmcuIFVzZQorICAgIFxtZXRob2R7ZXhlY3V0ZXNjcmlwdH0gaWYgd2FudCB0byBleGVjdXRlIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIHdpdGggb25lCisgICAgY2FsbC4KK1xlbmR7bWV0aG9kZGVzY30KKworCitcYmVnaW57bWV0aG9kZGVzY317ZXhlY3V0ZW1hbnl9e3NxbCwgc2VxX29mX3BhcmFtZXRlcnN9CitFeGVjdXRlcyBhIFNRTCBjb21tYW5kIGFnYWluc3QgYWxsIHBhcmFtZXRlciBzZXF1ZW5jZXMgb3IgbWFwcGluZ3MgZm91bmQgaW4gdGhlCitzZXF1ZW5jZSBcdmFye3NxbH0uIFRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBhbHNvIGFsbG93cwordG8gdXNlIGFuIGl0ZXJhdG9yIHlpZWxkaW5nIHBhcmFtZXRlcnMgaW5zdGVhZCBvZiBhIHNlcXVlbmNlLgorCitcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL2V4ZWN1dGVtYW55XzEucHl9CisKK0hlcmUncyBhIHNob3J0ZXIgZXhhbXBsZSB1c2luZyBhIGdlbmVyYXRvcjoKKworXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9leGVjdXRlbWFueV8yLnB5fQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZXhlY3V0ZXNjcmlwdH17c3FsX3NjcmlwdH0KKworVGhpcyBpcyBhIG5vbnN0YW5kYXJkIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXhlY3V0aW5nIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzCithdCBvbmNlLiBJdCBpc3N1ZXMgYSBDT01NSVQgc3RhdGVtZW50IGJlZm9yZSwgdGhlbiBleGVjdXRlcyB0aGUgU1FMIHNjcmlwdCBpdAorZ2V0cyBhcyBhIHBhcmFtZXRlci4KKworXHZhcntzcWxfc2NyaXB0fSBjYW4gYmUgYSBieXRlc3RyaW5nIG9yIGEgVW5pY29kZSBzdHJpbmcuCisKK0V4YW1wbGU6CisKK1x2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvZXhlY3V0ZXNjcmlwdC5weX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3Jvd2NvdW50fQorICBBbHRob3VnaCB0aGUgXGNsYXNze0N1cnNvcn0gY2xhc3Mgb2YgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIGltcGxlbWVudHMgdGhpcworICBhdHRyaWJ1dGUsIHRoZSBkYXRhYmFzZSBlbmdpbmUncyBvd24gc3VwcG9ydCBmb3IgdGhlIGRldGVybWluYXRpb24gb2YgInJvd3MKKyAgYWZmZWN0ZWQiLyJyb3dzIHNlbGVjdGVkIiBpcyBxdWlya3kuCisKKyAgRm9yIFxjb2Rle1NFTEVDVH0gc3RhdGVtZW50cywgXG1lbWJlcntyb3djb3VudH0gaXMgYWx3YXlzIE5vbmUgYmVjYXVzZSB3ZSBjYW5ub3QKKyAgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygcm93cyBhIHF1ZXJ5IHByb2R1Y2VkIHVudGlsIGFsbCByb3dzIHdlcmUgZmV0Y2hlZC4KKworICBGb3IgXGNvZGV7REVMRVRFfSBzdGF0ZW1lbnRzLCBTUUxpdGUgcmVwb3J0cyBcbWVtYmVye3Jvd2NvdW50fSBhcyAwIGlmIHlvdSBtYWtlIGEKKyAgXGNvZGV7REVMRVRFIEZST00gdGFibGV9IHdpdGhvdXQgYW55IGNvbmRpdGlvbi4KKworICBGb3IgXG1ldGhvZHtleGVjdXRlbWFueX0gc3RhdGVtZW50cywgdGhlIG51bWJlciBvZiBtb2RpZmljYXRpb25zIGFyZSBzdW1tZWQKKyAgdXAgaW50byBcbWVtYmVye3Jvd2NvdW50fS4KKworICBBcyByZXF1aXJlZCBieSB0aGUgUHl0aG9uIERCIEFQSSBTcGVjLCB0aGUgXG1lbWJlcntyb3djb3VudH0gYXR0cmlidXRlICJpcyAtMQorICBpbiBjYXNlIG5vIGV4ZWN1dGVYWCgpIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgY3Vyc29yIG9yIHRoZSByb3djb3VudAorICBvZiB0aGUgbGFzdCBvcGVyYXRpb24gaXMgbm90IGRldGVybWluYWJsZSBieSB0aGUgaW50ZXJmYWNlIi4KK1xlbmR7bWVtYmVyZGVzY30KKworXHN1YnNlY3Rpb257U1FMaXRlIGFuZCBQeXRob24gdHlwZXNcbGFiZWx7c3FsaXRlMy1UeXBlc319CisKK1xzdWJzdWJzZWN0aW9ue0ludHJvZHVjdGlvbn0KKworU1FMaXRlIG5hdGl2ZWx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdHlwZXM6IE5VTEwsIElOVEVHRVIsIFJFQUwsIFRFWFQsIEJMT0IuCisKK1RoZSBmb2xsb3dpbmcgUHl0aG9uIHR5cGVzIGNhbiB0aHVzIGJlIHNlbnQgdG8gU1FMaXRlIHdpdGhvdXQgYW55IHByb2JsZW06CisKK1xiZWdpbnt0YWJsZWlpfSAge2N8bH17Y29kZX17UHl0aG9uIHR5cGV9e1NRTGl0ZSB0eXBlfQorXGxpbmVpaXtOb25lfXtOVUxMfQorXGxpbmVpaXtpbnR9e0lOVEVHRVJ9CitcbGluZWlpe2xvbmd9e0lOVEVHRVJ9CitcbGluZWlpe2Zsb2F0fXtSRUFMfQorXGxpbmVpaXtzdHIgKFVURjgtZW5jb2RlZCl9e1RFWFR9CitcbGluZWlpe3VuaWNvZGV9e1RFWFR9CitcbGluZWlpe2J1ZmZlcn17QkxPQn0KK1xlbmR7dGFibGVpaX0KKworVGhpcyBpcyBob3cgU1FMaXRlIHR5cGVzIGFyZSBjb252ZXJ0ZWQgdG8gUHl0aG9uIHR5cGVzIGJ5IGRlZmF1bHQ6CisKK1xiZWdpbnt0YWJsZWlpfSAge2N8bH17Y29kZX17U1FMaXRlIHR5cGV9e1B5dGhvbiB0eXBlfQorXGxpbmVpaXtOVUxMfXtOb25lfQorXGxpbmVpaXtJTlRFR0VSfXtpbnQgb3IgbG9uZywgZGVwZW5kaW5nIG9uIHNpemV9CitcbGluZWlpe1JFQUx9e2Zsb2F0fQorXGxpbmVpaXtURVhUfXtkZXBlbmRzIG9uIHRleHRfZmFjdG9yeSwgdW5pY29kZSBieSBkZWZhdWx0fQorXGxpbmVpaXtCTE9CfXtidWZmZXJ9CitcZW5ke3RhYmxlaWl9CisKK1RoZSB0eXBlIHN5c3RlbSBvZiB0aGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgaXMgZXh0ZW5zaWJsZSBpbiBib3RoIHdheXM6IHlvdSBjYW4gc3RvcmUKK2FkZGl0aW9uYWwgUHl0aG9uIHR5cGVzIGluIGEgU1FMaXRlIGRhdGFiYXNlIHZpYSBvYmplY3QgYWRhcHRhdGlvbiwgYW5kIHlvdSBjYW4KK2xldCB0aGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgY29udmVydCBTUUxpdGUgdHlwZXMgdG8gZGlmZmVyZW50IFB5dGhvbiB0eXBlcyB2aWEKK2NvbnZlcnRlcnMuCisKK1xzdWJzdWJzZWN0aW9ue1VzaW5nIGFkYXB0ZXJzIHRvIHN0b3JlIGFkZGl0aW9uYWwgUHl0aG9uIHR5cGVzIGluIFNRTGl0ZSBkYXRhYmFzZXN9CisKK0xpa2UgZGVzY3JpYmVkIGJlZm9yZSwgU1FMaXRlIHN1cHBvcnRzIG9ubHkgYSBsaW1pdGVkIHNldCBvZiB0eXBlcyBuYXRpdmVseS4gVG8KK3VzZSBvdGhlciBQeXRob24gdHlwZXMgd2l0aCBTUUxpdGUsIHlvdSBtdXN0IFxzdHJvbmd7YWRhcHR9IHRoZW0gdG8gb25lIG9mIHRoZSBzcWxpdGUzCittb2R1bGUncyBzdXBwb3J0ZWQgdHlwZXMgZm9yIFNRTGl0ZS4gU28sIG9uZSBvZiBOb25lVHlwZSwgaW50LCBsb25nLCBmbG9hdCwKK3N0ciwgdW5pY29kZSwgYnVmZmVyLgorCitUaGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgdXNlcyB0aGUgUHl0aG9uIG9iamVjdCBhZGFwdGF0aW9uLCBsaWtlIGRlc2NyaWJlZCBpbiBQRVAgMjQ2Citmb3IgdGhpcy4gIFRoZSBwcm90b2NvbCB0byB1c2UgaXMgXGNsYXNze1ByZXBhcmVQcm90b2NvbH0uCisKK1RoZXJlIGFyZSB0d28gd2F5cyB0byBlbmFibGUgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIHRvIGFkYXB0IGEgY3VzdG9tIFB5dGhvbiB0eXBlCit0byBvbmUgb2YgdGhlIHN1cHBvcnRlZCBvbmVzLgorCitccGFyYWdyYXBoe0xldHRpbmcgeW91ciBvYmplY3QgYWRhcHQgaXRzZWxmfQorCitUaGlzIGlzIGEgZ29vZCBhcHByb2FjaCBpZiB5b3Ugd3JpdGUgdGhlIGNsYXNzIHlvdXJzZWxmLiBMZXQncyBzdXBwb3NlIHlvdSBoYXZlCithIGNsYXNzIGxpa2UgdGhpczoKKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgUG9pbnQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6CisgICAgICAgIHNlbGYueCwgc2VsZi55ID0geCwgeQorXGVuZHt2ZXJiYXRpbX0KKworTm93IHlvdSB3YW50IHRvIHN0b3JlIHRoZSBwb2ludCBpbiBhIHNpbmdsZSBTUUxpdGUgY29sdW1uLiBZb3UnbGwgaGF2ZSB0bworY2hvb3NlIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHR5cGVzIGZpcnN0IHRoYXQgeW91IHVzZSB0byByZXByZXNlbnQgdGhlIHBvaW50IGluLgorTGV0J3MganVzdCB1c2Ugc3RyIGFuZCBzZXBhcmF0ZSB0aGUgY29vcmRpbmF0ZXMgdXNpbmcgYSBzZW1pY29sb24uIFRoZW4geW91CituZWVkIHRvIGdpdmUgeW91ciBjbGFzcyBhIG1ldGhvZCBcY29kZXtfX2NvbmZvcm1fXyhzZWxmLCBwcm90b2NvbCl9IHdoaWNoIG11c3QKK3JldHVybiB0aGUgY29udmVydGVkIHZhbHVlLiBUaGUgcGFyYW1ldGVyIFx2YXJ7cHJvdG9jb2x9IHdpbGwgYmUKK1xjbGFzc3tQcmVwYXJlUHJvdG9jb2x9LgorCitcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL2FkYXB0ZXJfcG9pbnRfMS5weX0KKworXHBhcmFncmFwaHtSZWdpc3RlcmluZyBhbiBhZGFwdGVyIGNhbGxhYmxlfQorCitUaGUgb3RoZXIgcG9zc2liaWxpdHkgaXMgdG8gY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyB0aGUgdHlwZSB0byB0aGUKK3N0cmluZyByZXByZXNlbnRhdGlvbiBhbmQgcmVnaXN0ZXIgdGhlIGZ1bmN0aW9uIHdpdGggXG1ldGhvZHtyZWdpc3Rlcl9hZGFwdGVyfS4KKworICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8yLnB5fQorCitcYmVnaW57bm90aWNlfQorVGhlIHR5cGUvY2xhc3MgdG8gYWRhcHQgbXVzdCBiZSBhIG5ldy1zdHlsZSBjbGFzcywgaS4gZS4gaXQgbXVzdCBoYXZlCitcY2xhc3N7b2JqZWN0fSBhcyBvbmUgb2YgaXRzIGJhc2VzLgorXGVuZHtub3RpY2V9CisKK1RoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBoYXMgdHdvIGRlZmF1bHQgYWRhcHRlcnMgZm9yIFB5dGhvbidzIGJ1aWx0aW4KK1xjbGFzc3tkYXRldGltZS5kYXRlfSBhbmQgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSB0eXBlcy4gTm93IGxldCdzIHN1cHBvc2Ugd2UKK3dhbnQgdG8gc3RvcmUgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSBvYmplY3RzIG5vdCBpbiBJU08gcmVwcmVzZW50YXRpb24sIGJ1dAorYXMgVW5peCB0aW1lc3RhbXAuCisKKyAgICBcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL2FkYXB0ZXJfZGF0ZXRpbWUucHl9CisKK1xzdWJzdWJzZWN0aW9ue0NvbnZlcnRpbmcgU1FMaXRlIHZhbHVlcyB0byBjdXN0b20gUHl0aG9uIHR5cGVzfQorCitOb3cgdGhhdCdzIGFsbCBuaWNlIGFuZCBkYW5keSB0aGF0IHlvdSBjYW4gc2VuZCBjdXN0b20gUHl0aG9uIHR5cGVzIHRvIFNRTGl0ZS4KK0J1dCB0byBtYWtlIGl0IHJlYWxseSB1c2VmdWwgd2UgbmVlZCB0byBtYWtlIHRoZSBQeXRob24gdG8gU1FMaXRlIHRvIFB5dGhvbgorcm91bmR0cmlwIHdvcmsuCisKK0VudGVyIGNvbnZlcnRlcnMuCisKK0xldCdzIGdvIGJhY2sgdG8gdGhlIFBvaW50IGNsYXNzLiBXZSBzdG9yZWQgdGhlIHggYW5kIHkgY29vcmRpbmF0ZXMgc2VwYXJhdGVkCit2aWEgc2VtaWNvbG9ucyBhcyBzdHJpbmdzIGluIFNRTGl0ZS4KKworTGV0J3MgZmlyc3QgZGVmaW5lIGEgY29udmVydGVyIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgc3RyaW5nIGFzIGEgcGFyYW1ldGVyIGFuZCBjb25zdHJ1Y3RzIGEgUG9pbnQgb2JqZWN0IGZyb20gaXQuCisKK1xiZWdpbntub3RpY2V9CitDb252ZXJ0ZXIgZnVuY3Rpb25zIFxzdHJvbmd7YWx3YXlzfSBnZXQgY2FsbGVkIHdpdGggYSBzdHJpbmcsIG5vIG1hdHRlcgordW5kZXIgd2hpY2ggZGF0YSB0eXBlIHlvdSBzZW50IHRoZSB2YWx1ZSB0byBTUUxpdGUuCitcZW5ke25vdGljZX0KKworXGJlZ2lue25vdGljZX0KK0NvbnZlcnRlciBuYW1lcyBhcmUgbG9va2VkIHVwIGluIGEgY2FzZS1zZW5zaXRpdmUgbWFubmVyLgorXGVuZHtub3RpY2V9CisKKworXGJlZ2lue3ZlcmJhdGltfQorICAgIGRlZiBjb252ZXJ0X3BvaW50KHMpOgorICAgICAgICB4LCB5ID0gbWFwKGZsb2F0LCBzLnNwbGl0KCI7IikpCisgICAgICAgIHJldHVybiBQb2ludCh4LCB5KQorXGVuZHt2ZXJiYXRpbX0KKworTm93IHlvdSBuZWVkIHRvIG1ha2UgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIGtub3cgdGhhdCB3aGF0IHlvdSBzZWxlY3QgZnJvbSB0aGUKK2RhdGFiYXNlIGlzIGFjdHVhbGx5IGEgcG9pbnQuIFRoZXJlIGFyZSB0d28gd2F5cyBvZiBkb2luZyB0aGlzOgorCitcYmVnaW57aXRlbWl6ZX0KKyBcaXRlbSBJbXBsaWNpdGx5IHZpYSB0aGUgZGVjbGFyZWQgdHlwZQorIFxpdGVtIEV4cGxpY2l0bHkgdmlhIHRoZSBjb2x1bW4gbmFtZQorXGVuZHtpdGVtaXplfQorCitCb3RoIHdheXMgYXJlIGRlc2NyaWJlZCBhdCBccmVme3NxbGl0ZTMtTW9kdWxlLUNvbnRlbnRzfSBpbiB0aGUgdGV4dCBleHBsYWluaW5nCit0aGUgY29uc3RhbnRzIFxjb25zdGFudHtQQVJTRV9ERUNMVFlQRVN9IGFuZCBcY29uc3RhbnR7UEFSU0VfQ09sTkFNRVN9LgorCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBib3RoIHdheXMuCisKKyAgICBcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL2NvbnZlcnRlcl9wb2ludC5weX0KKworXHN1YnN1YnNlY3Rpb257RGVmYXVsdCBhZGFwdGVycyBhbmQgY29udmVydGVyc30KKworVGhlcmUgYXJlIGRlZmF1bHQgYWRhcHRlcnMgZm9yIHRoZSBkYXRlIGFuZCBkYXRldGltZSB0eXBlcyBpbiB0aGUgZGF0ZXRpbWUKK21vZHVsZS4gVGhleSB3aWxsIGJlIHNlbnQgYXMgSVNPIGRhdGVzL0lTTyB0aW1lc3RhbXBzIHRvIFNRTGl0ZS4KKworVGhlIGRlZmF1bHQgY29udmVydGVycyBhcmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgbmFtZSAiZGF0ZSIgZm9yIGRhdGV0aW1lLmRhdGUKK2FuZCB1bmRlciB0aGUgbmFtZSAidGltZXN0YW1wIiBmb3IgZGF0ZXRpbWUuZGF0ZXRpbWUuCisKK1RoaXMgd2F5LCB5b3UgY2FuIHVzZSBkYXRlL3RpbWVzdGFtcHMgZnJvbSBQeXRob24gd2l0aG91dCBhbnkgYWRkaXRpb25hbAorZmlkZGxpbmcgaW4gbW9zdCBjYXNlcy4gVGhlIGZvcm1hdCBvZiB0aGUgYWRhcHRlcnMgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggdGhlCitleHBlcmltZW50YWwgU1FMaXRlIGRhdGUvdGltZSBmdW5jdGlvbnMuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhpcy4KKworICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvcHlzcWxpdGVfZGF0ZXRpbWUucHl9CisKK1xzdWJzZWN0aW9ue0NvbnRyb2xsaW5nIFRyYW5zYWN0aW9ucyBcbGFiZWx7c3FsaXRlMy1Db250cm9sbGluZy1UcmFuc2FjdGlvbnN9fQorCitCeSBkZWZhdWx0LCB0aGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgb3BlbnMgdHJhbnNhY3Rpb25zIGltcGxpY2l0bHkgYmVmb3JlIGEgRE1MCitzdGF0ZW1lbnQgKElOU0VSVC9VUERBVEUvREVMRVRFL1JFUExBQ0UpLCBhbmQgY29tbWl0cyB0cmFuc2FjdGlvbnMgaW1wbGljaXRseQorYmVmb3JlIGEgbm9uLURNTCwgbm9uLURRTCBzdGF0ZW1lbnQgKGkuIGUuIGFueXRoaW5nIG90aGVyIHRoYW4KK1NFTEVDVC9JTlNFUlQvVVBEQVRFL0RFTEVURS9SRVBMQUNFKS4KKworU28gaWYgeW91IGFyZSB3aXRoaW4gYSB0cmFuc2FjdGlvbiwgYW5kIGlzc3VlIGEgY29tbWFuZCBsaWtlIFxjb2Rle0NSRUFURSBUQUJMRQorLi4ufSwgXGNvZGV7VkFDVVVNfSwgXGNvZGV7UFJBR01BfSwgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIHdpbGwgY29tbWl0IGltcGxpY2l0bHkKK2JlZm9yZSBleGVjdXRpbmcgdGhhdCBjb21tYW5kLiBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgZm9yIGRvaW5nIHRoYXQuIFRoZSBmaXJzdAoraXMgdGhhdCBzb21lIG9mIHRoZXNlIGNvbW1hbmRzIGRvbid0IHdvcmsgd2l0aGluIHRyYW5zYWN0aW9ucy4gVGhlIG90aGVyIHJlYXNvbgoraXMgdGhhdCBweXNxbGl0ZSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSB0cmFuc2FjdGlvbiBzdGF0ZSAoaWYgYSB0cmFuc2FjdGlvbgoraXMgYWN0aXZlIG9yIG5vdCkuCisKK1lvdSBjYW4gY29udHJvbCB3aGljaCBraW5kIG9mICJCRUdJTiIgc3RhdGVtZW50cyBweXNxbGl0ZSBpbXBsaWNpdGx5IGV4ZWN1dGVzCisob3Igbm9uZSBhdCBhbGwpIHZpYSB0aGUgXHZhcntpc29sYXRpb25fbGV2ZWx9IHBhcmFtZXRlciB0byB0aGUKK1xmdW5jdGlvbntjb25uZWN0fSBjYWxsLCBvciB2aWEgdGhlIFxtZW1iZXJ7aXNvbGF0aW9uX2xldmVsfSBwcm9wZXJ0eSBvZgorY29ubmVjdGlvbnMuCisKK0lmIHlvdSB3YW50IFxzdHJvbmd7YXV0b2NvbW1pdCBtb2RlfSwgdGhlbiBzZXQgXG1lbWJlcntpc29sYXRpb25fbGV2ZWx9IHRvIE5vbmUuCisKK090aGVyd2lzZSBsZWF2ZSBpdCBhdCBpdCdzIGRlZmF1bHQsIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgcGxhaW4gIkJFR0lOIgorc3RhdGVtZW50LCBvciBzZXQgaXQgdG8gb25lIG9mIFNRTGl0ZSdzIHN1cHBvcnRlZCBpc29sYXRpb24gbGV2ZWxzOiBERUZFUlJFRCwKK0lNTUVESUFURSBvciBFWENMVVNJVkUuCisKK0FzIHRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSB0cmFuc2FjdGlvbiBzdGF0ZSwgeW91IHNob3VsZAorbm90IHVzZSBcY29kZXtPUiBST0xMQkFDS30gb3IgXGNvZGV7T04gQ09ORkxJQ1QgUk9MTEJBQ0t9IGluIHlvdXIgU1FMLiBJbnN0ZWFkLAorY2F0Y2ggdGhlIFxleGNlcHRpb257SW50ZWdyaXR5RXJyb3J9IGFuZCBjYWxsIHRoZSBcbWV0aG9ke3JvbGxiYWNrfSBtZXRob2Qgb2YKK3RoZSBjb25uZWN0aW9uIHlvdXJzZWxmLgorCitcc3Vic2VjdGlvbntVc2luZyBweXNxbGl0ZSBlZmZpY2llbnRseX0KKworXHN1YnN1YnNlY3Rpb257VXNpbmcgc2hvcnRjdXQgbWV0aG9kc30KKworVXNpbmcgdGhlIG5vbnN0YW5kYXJkIFxtZXRob2R7ZXhlY3V0ZX0sIFxtZXRob2R7ZXhlY3V0ZW1hbnl9IGFuZAorXG1ldGhvZHtleGVjdXRlc2NyaXB0fSBtZXRob2RzIG9mIHRoZSBcY2xhc3N7Q29ubmVjdGlvbn0gb2JqZWN0LCB5b3VyIGNvZGUgY2FuCitiZSB3cml0dGVuIG1vcmUgY29uY2lzZWx5LCBiZWNhdXNlIHlvdSBkb24ndCBoYXZlIHRvIGNyZWF0ZSB0aGUgLSBvZnRlbgorc3VwZXJmbHVvdXMgXGNsYXNze0N1cnNvcn0gb2JqZWN0cyBleHBsaWNpdGx5LiBJbnN0ZWFkLCB0aGUgXGNsYXNze0N1cnNvcn0KK29iamVjdHMgYXJlIGNyZWF0ZWQgaW1wbGljaXRseSBhbmQgdGhlc2Ugc2hvcnRjdXQgbWV0aG9kcyByZXR1cm4gdGhlIGN1cnNvcgorb2JqZWN0cy4gVGhpcyB3YXksIHlvdSBjYW4gZm9yIGV4YW1wbGUgZXhlY3V0ZSBhIFNFTEVDVCBzdGF0ZW1lbnQgYW5kIGl0ZXJhdGUKK292ZXIgaXQgZGlyZWN0bHkgdXNpbmcgb25seSBhIHNpbmdsZSBjYWxsIG9uIHRoZSBcY2xhc3N7Q29ubmVjdGlvbn0gb2JqZWN0LgorCisgICAgXHZlcmJhdGltaW5wdXR7c3FsaXRlMy9zaG9ydGN1dF9tZXRob2RzLnB5fQorCitcc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgY29sdW1ucyBieSBuYW1lIGluc3RlYWQgb2YgYnkgaW5kZXh9CisKK09uZSBjb29sIGZlYXR1cmUgb2YgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlIGlzIHRoZSBidWlsdGluIFxjbGFzc3tzcWxpdGUzLlJvd30gY2xhc3MKK2Rlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSByb3cgZmFjdG9yeS4KKworUm93cyB3cmFwcGVkIHdpdGggdGhpcyBjbGFzcyBjYW4gYmUgYWNjZXNzZWQgYm90aCBieSBpbmRleCAobGlrZSB0dXBsZXMpIGFuZAorY2FzZS1pbnNlbnNpdGl2ZWx5IGJ5IG5hbWU6CisKKyAgICBcdmVyYmF0aW1pbnB1dHtzcWxpdGUzL3Jvd2NsYXNzLnB5fQorCisKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RkdHlwZXMudGV4IGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKaW5kZXggOGQwMTFmZC4uZjQ0MzYwYiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKQEAgLTEsMTIgKzEsMTEgQEAKIFxzZWN0aW9ue0J1aWx0LWluIFR5cGVzIFxsYWJlbHt0eXBlc319CiAKIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgdGhlIHN0YW5kYXJkIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8KLXRoZSBpbnRlcnByZXRlci4gIEhpc3RvcmljYWxseSwgUHl0aG9uJ3MgYnVpbHQtaW4gdHlwZXMgaGF2ZSBkaWZmZXJlZAotZnJvbSB1c2VyLWRlZmluZWQgdHlwZXMgYmVjYXVzZSBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgYnVpbHQtaW4KLXR5cGVzIGFzIHRoZSBiYXNpcyBmb3Igb2JqZWN0LW9yaWVudGVkIGluaGVyaXRhbmNlLiBXaXRoIHRoZSAyLjIKLXJlbGVhc2UgdGhpcyBzaXR1YXRpb24gaGFzIHN0YXJ0ZWQgdG8gY2hhbmdlLCBhbHRob3VnaCB0aGUgaW50ZW5kZWQKLXVuaWZpY2F0aW9uIG9mIHVzZXItZGVmaW5lZCBhbmQgYnVpbHQtaW4gdHlwZXMgaXMgYXMgeWV0IGZhciBmcm9tCi1jb21wbGV0ZS4KK3RoZSBpbnRlcnByZXRlci4KK1xub3Rle0hpc3RvcmljYWxseSAodW50aWwgcmVsZWFzZSAyLjIpLCBQeXRob24ncyBidWlsdC1pbiB0eXBlcyBoYXZlCitkaWZmZXJlZCBmcm9tIHVzZXItZGVmaW5lZCB0eXBlcyBiZWNhdXNlIGl0IHdhcyBub3QgcG9zc2libGUgdG8gdXNlCit0aGUgYnVpbHQtaW4gdHlwZXMgYXMgdGhlIGJhc2lzIGZvciBvYmplY3Qtb3JpZW50ZWQgaW5oZXJpdGFuY2UuCitUaGlzIGxpbWl0YXRpb24gZG9lcyBub3QgZXhpc3QgYW55IGxvbmdlci59CiAKIFRoZSBwcmluY2lwYWwgYnVpbHQtaW4gdHlwZXMgYXJlIG51bWVyaWNzLCBzZXF1ZW5jZXMsIG1hcHBpbmdzLCBmaWxlcwogY2xhc3NlcywgaW5zdGFuY2VzIGFuZCBleGNlcHRpb25zLgpAQCAtMTksNyArMTgsNyBAQAogXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbikuICBUaGUgbGF0dGVyCiBmdW5jdGlvbiBpcyBpbXBsaWNpdGx5IHVzZWQgd2hlbiBhbiBvYmplY3QgaXMgd3JpdHRlbiBieSB0aGUKIFxrZXl3b3Jke3ByaW50fVxzdGluZGV4e3ByaW50fSBzdGF0ZW1lbnQuCi0oSW5mb3JtYXRpb24gb24gXHVsaW5re1xrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnR9ey4uL3JlZi9wcmludC5odG1sfQorKEluZm9ybWF0aW9uIG9uIHRoZSBcdWxpbmt7XGtleXdvcmR7cHJpbnR9IHN0YXRlbWVudH17Li4vcmVmL3ByaW50Lmh0bWx9CiBhbmQgb3RoZXIgbGFuZ3VhZ2Ugc3RhdGVtZW50cyBjYW4gYmUgZm91bmQgaW4gdGhlCiBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGFuZCB0aGUKIFxjaXRldGl0bGVbLi4vdHV0L3R1dC5odG1sXXtQeXRob24gVHV0b3JpYWx9LikKQEAgLTcyOCw2ICs3MjcsMTUgQEAKIFx2ZXJzaW9uY2hhbmdlZFtTdXBwb3J0IGZvciB0aGUgXHZhcntjaGFyc30gYXJndW1lbnRdezIuMi4yfQogXGVuZHttZXRob2RkZXNjfQogCitcYmVnaW57bWV0aG9kZGVzY31bc3RyaW5nXXtwYXJ0aXRpb259e3NlcH0KK1NwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHZhcntzZXB9LCBhbmQgcmV0dXJuCithIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvcgoraXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90Citmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieQordHdvIGVtcHR5IHN0cmluZ3MuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7bWV0aG9kZGVzY30KKwogXGJlZ2lue21ldGhvZGRlc2N9W3N0cmluZ117cmVwbGFjZX17b2xkLCBuZXdcb3B0aW9uYWx7LCBjb3VudH19CiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nCiBcdmFye29sZH0gcmVwbGFjZWQgYnkgXHZhcntuZXd9LiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50CkBAIC03NTUsNiArNzYzLDE1IEBACiBcdmVyc2lvbmNoYW5nZWRbU3VwcG9ydCBmb3IgdGhlIFx2YXJ7ZmlsbGNoYXJ9IGFyZ3VtZW50XXsyLjR9CiBcZW5ke21ldGhvZGRlc2N9CiAKK1xiZWdpbnttZXRob2RkZXNjfVtzdHJpbmdde3JwYXJ0aXRpb259e3NlcH0KK1NwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBcdmFye3NlcH0sIGFuZCByZXR1cm4KK2EgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yCitpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3QKK2ZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBpdHNlbGYsIGZvbGxvd2VkIGJ5Cit0d28gZW1wdHkgc3RyaW5ncy4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZXRob2RkZXNjfQorCiBcYmVnaW57bWV0aG9kZGVzY31bc3RyaW5nXXtyc3BsaXR9e1xvcHRpb25hbHtzZXAgXG9wdGlvbmFseyxtYXhzcGxpdH19fQogUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgXHZhcntzZXB9IGFzIHRoZQogZGVsaW1pdGVyIHN0cmluZy4gIElmIFx2YXJ7bWF4c3BsaXR9IGlzIGdpdmVuLCBhdCBtb3N0IFx2YXJ7bWF4c3BsaXR9CkBAIC05NzEsMjAgKzk4OCwyMiBAQAogICBcbGluZWlpaXt1fXtVbnNpZ25lZCBkZWNpbWFsLn17fQogICBcbGluZWlpaXt4fXtVbnNpZ25lZCBoZXhhZGVjaW1hbCAobG93ZXJjYXNlKS59eygyKX0KICAgXGxpbmVpaWl7WH17VW5zaWduZWQgaGV4YWRlY2ltYWwgKHVwcGVyY2FzZSkufXsoMil9Ci0gIFxsaW5laWlpe2V9e0Zsb2F0aW5nIHBvaW50IGV4cG9uZW50aWFsIGZvcm1hdCAobG93ZXJjYXNlKS59e30KLSAgXGxpbmVpaWl7RX17RmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYWwgZm9ybWF0ICh1cHBlcmNhc2UpLn17fQotICBcbGluZWlpaXtmfXtGbG9hdGluZyBwb2ludCBkZWNpbWFsIGZvcm1hdC59e30KLSAgXGxpbmVpaWl7Rn17RmxvYXRpbmcgcG9pbnQgZGVjaW1hbCBmb3JtYXQufXt9Ci0gIFxsaW5laWlpe2d9e1NhbWUgYXMgXGNoYXJhY3RlcntlfSBpZiBleHBvbmVudCBpcyBncmVhdGVyIHRoYW4gLTQgb3IKLSAgICAgICAgICAgICAgbGVzcyB0aGFuIHByZWNpc2lvbiwgXGNoYXJhY3RlcntmfSBvdGhlcndpc2UufXt9Ci0gIFxsaW5laWlpe0d9e1NhbWUgYXMgXGNoYXJhY3RlcntFfSBpZiBleHBvbmVudCBpcyBncmVhdGVyIHRoYW4gLTQgb3IKLSAgICAgICAgICAgICAgbGVzcyB0aGFuIHByZWNpc2lvbiwgXGNoYXJhY3RlcntGfSBvdGhlcndpc2UufXt9CisgIFxsaW5laWlpe2V9e0Zsb2F0aW5nIHBvaW50IGV4cG9uZW50aWFsIGZvcm1hdCAobG93ZXJjYXNlKS59eygzKX0KKyAgXGxpbmVpaWl7RX17RmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYWwgZm9ybWF0ICh1cHBlcmNhc2UpLn17KDMpfQorICBcbGluZWlpaXtmfXtGbG9hdGluZyBwb2ludCBkZWNpbWFsIGZvcm1hdC59eygzKX0KKyAgXGxpbmVpaWl7Rn17RmxvYXRpbmcgcG9pbnQgZGVjaW1hbCBmb3JtYXQufXsoMyl9CisgIFxsaW5laWlpe2d9e0Zsb2F0aW5nIHBvaW50IGZvcm1hdC4gVXNlcyBleHBvbmVudGlhbCBmb3JtYXQKKyAgICAgICAgICAgICAgaWYgZXhwb25lbnQgaXMgZ3JlYXRlciB0aGFuIC00IG9yIGxlc3MgdGhhbiBwcmVjaXNpb24sCisgICAgICAgICAgICAgIGRlY2ltYWwgZm9ybWF0IG90aGVyd2lzZS59eyg0KX0KKyAgXGxpbmVpaWl7R317RmxvYXRpbmcgcG9pbnQgZm9ybWF0LiBVc2VzIGV4cG9uZW50aWFsIGZvcm1hdAorICAgICAgICAgICAgICBpZiBleHBvbmVudCBpcyBncmVhdGVyIHRoYW4gLTQgb3IgbGVzcyB0aGFuIHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgZGVjaW1hbCBmb3JtYXQgb3RoZXJ3aXNlLn17KDQpfQogICBcbGluZWlpaXtjfXtTaW5nbGUgY2hhcmFjdGVyIChhY2NlcHRzIGludGVnZXIgb3Igc2luZ2xlIGNoYXJhY3RlcgogICAgICAgICAgICAgICBzdHJpbmcpLn17fQogICBcbGluZWlpaXtyfXtTdHJpbmcgKGNvbnZlcnRzIGFueSBweXRob24gb2JqZWN0IHVzaW5nCi0gICAgICAgICAgICAgIFxmdW5jdGlvbntyZXByKCl9KS59eygzKX0KKyAgICAgICAgICAgICAgXGZ1bmN0aW9ue3JlcHIoKX0pLn17KDUpfQogICBcbGluZWlpaXtzfXtTdHJpbmcgKGNvbnZlcnRzIGFueSBweXRob24gb2JqZWN0IHVzaW5nCi0gICAgICAgICAgICAgIFxmdW5jdGlvbntzdHIoKX0pLn17KDQpfQorICAgICAgICAgICAgICBcZnVuY3Rpb257c3RyKCl9KS59eyg2KX0KICAgXGxpbmVpaWl7XCV9e05vIGFyZ3VtZW50IGlzIGNvbnZlcnRlZCwgcmVzdWx0cyBpbiBhIFxjaGFyYWN0ZXJ7XCV9CiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdC59e30KIFxlbmR7dGFibGVpaWl9CkBAIC0xMDA0LDEwICsxMDIzLDI3IEBACiAgICAgZm9ybWF0dGluZyBvZiB0aGUgbnVtYmVyIGlmIHRoZSBsZWFkaW5nIGNoYXJhY3RlciBvZiB0aGUgcmVzdWx0IGlzCiAgICAgbm90IGFscmVhZHkgYSB6ZXJvLgogICBcaXRlbVsoMyldCi0gICAgVGhlIFxjb2Rle1wlcn0gY29udmVyc2lvbiB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuMC4KKyAgICBUaGUgYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIHRoZSByZXN1bHQgdG8gYWx3YXlzIGNvbnRhaW4gYSBkZWNpbWFsCisgICAgcG9pbnQsIGV2ZW4gaWYgbm8gZGlnaXRzIGZvbGxvdyBpdC4KKworICAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbAorICAgIHBvaW50IGFuZCBkZWZhdWx0cyB0byA2LgogICBcaXRlbVsoNCldCisgICAgVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyB0aGUgcmVzdWx0IHRvIGFsd2F5cyBjb250YWluIGEgZGVjaW1hbAorICAgIHBvaW50LCBhbmQgdHJhaWxpbmcgemVyb2VzIGFyZSBub3QgcmVtb3ZlZCBhcyB0aGV5IHdvdWxkCisgICAgb3RoZXJ3aXNlIGJlLgorCisgICAgVGhlIHByZWNpc2lvbiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIGJlZm9yZQorICAgIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBhbmQgZGVmYXVsdHMgdG8gNi4KKyAgXGl0ZW1bKDUpXQorICAgIFRoZSBcY29kZXtcJXJ9IGNvbnZlcnNpb24gd2FzIGFkZGVkIGluIFB5dGhvbiAyLjAuCisKKyAgICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG1heGltYWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXNlZC4KKyAgXGl0ZW1bKDYpXQogICAgIElmIHRoZSBvYmplY3Qgb3IgZm9ybWF0IHByb3ZpZGVkIGlzIGEgXGNsYXNze3VuaWNvZGV9IHN0cmluZywKICAgICB0aGUgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGFsc28gYmUgXGNsYXNze3VuaWNvZGV9LgorCisgICAgVGhlIHByZWNpc2lvbiBkZXRlcm1pbmVzIHRoZSBtYXhpbWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVzZWQuCiBcZW5ke2Rlc2NyaXB0aW9ufQogCiAlIFhYWCBFeGFtcGxlcz8KQEAgLTE3NDcsNiArMTc4Myw4NyBAQAogXGVuZHttZW1iZXJkZXNjfQogCiAKK1xzdWJzZWN0aW9ue0NvbnRleHQgTWFuYWdlciBUeXBlcyBcbGFiZWx7dHlwZWNvbnRleHRtYW5hZ2VyfX0KKworXHZlcnNpb25hZGRlZHsyLjV9CitcaW5kZXh7Y29udGV4dCBtYW5hZ2VyfQorXGluZGV4e2NvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbH0KK1xpbmRleHtwcm90b2NvbCFjb250ZXh0IG1hbmFnZW1lbnR9CisKK1B5dGhvbidzIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBzdXBwb3J0cyB0aGUgY29uY2VwdCBvZiBhIHJ1bnRpbWUKK2NvbnRleHQgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlci4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcKK3R3byBzZXBhcmF0ZSBtZXRob2RzIHRoYXQgYWxsb3cgdXNlci1kZWZpbmVkIGNsYXNzZXMgdG8gZGVmaW5lCithIHJ1bnRpbWUgY29udGV4dCB0aGF0IGlzIGVudGVyZWQgYmVmb3JlIHRoZSBzdGF0ZW1lbnQgYm9keSBpcworZXhlY3V0ZWQgYW5kIGV4aXRlZCB3aGVuIHRoZSBzdGF0ZW1lbnQgZW5kcy4KKworVGhlIFxkZm57Y29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sfSBjb25zaXN0cyBvZiBhIHBhaXIgb2YKK21ldGhvZHMgdGhhdCBuZWVkIHRvIGJlIHByb3ZpZGVkIGZvciBhIGNvbnRleHQgbWFuYWdlciBvYmplY3QgdG8KK2RlZmluZSBhIHJ1bnRpbWUgY29udGV4dDoKKworXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRleHQgbWFuYWdlcl17X19lbnRlcl9ffXt9CisgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgYW5kIHJldHVybiBlaXRoZXIgdGhpcyBvYmplY3Qgb3IgYW5vdGhlcgorICBvYmplY3QgcmVsYXRlZCB0byB0aGUgcnVudGltZSBjb250ZXh0LiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcworICBtZXRob2QgaXMgYm91bmQgdG8gdGhlIGlkZW50aWZpZXIgaW4gdGhlIFxrZXl3b3Jke2FzfSBjbGF1c2Ugb2YKKyAgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50cyB1c2luZyB0aGlzIGNvbnRleHQgbWFuYWdlci4KKworICBBbiBleGFtcGxlIG9mIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgcmV0dXJucyBpdHNlbGYgaXMgYSBmaWxlIG9iamVjdC4KKyAgRmlsZSBvYmplY3RzIHJldHVybiB0aGVtc2VsdmVzIGZyb20gX19lbnRlcl9fKCkgdG8gYWxsb3cKKyAgXGZ1bmN0aW9ue29wZW4oKX0gdG8gYmUgdXNlZCBhcyB0aGUgY29udGV4dCBleHByZXNzaW9uIGluIGEKKyAgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50LgorCisgIEFuIGV4YW1wbGUgb2YgYSBjb250ZXh0IG1hbmFnZXIgdGhhdCByZXR1cm5zIGEgcmVsYXRlZAorICBvYmplY3QgaXMgdGhlIG9uZSByZXR1cm5lZCBieSBcY29kZXtkZWNpbWFsLkNvbnRleHQuZ2V0X21hbmFnZXIoKX0uCisgIFRoZXNlIG1hbmFnZXJzIHNldCB0aGUgYWN0aXZlIGRlY2ltYWwgY29udGV4dCB0byBhIGNvcHkgb2YgdGhlCisgIG9yaWdpbmFsIGRlY2ltYWwgY29udGV4dCBhbmQgdGhlbiByZXR1cm4gdGhlIGNvcHkuIFRoaXMgYWxsb3dzCisgIGNoYW5nZXMgdG8gYmUgbWFkZSB0byB0aGUgY3VycmVudCBkZWNpbWFsIGNvbnRleHQgaW4gdGhlIGJvZHkgb2YKKyAgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCB3aXRob3V0IGFmZmVjdGluZyBjb2RlIG91dHNpZGUKKyAgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRleHQgbWFuYWdlcl17X19leGl0X199e2V4Y190eXBlLCBleGNfdmFsLCBleGNfdGJ9CisgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCBhbmQgcmV0dXJuIGEgQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgYW55CisgIGV4cGVjdGlvbiB0aGF0IG9jY3VycmVkIHNob3VsZCBiZSBzdXBwcmVzc2VkLiBJZiBhbiBleGNlcHRpb24KKyAgb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSBib2R5IG9mIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQsIHRoZQorICBhcmd1bWVudHMgY29udGFpbiB0aGUgZXhjZXB0aW9uIHR5cGUsIHZhbHVlIGFuZCB0cmFjZWJhY2sgaW5mb3JtYXRpb24uCisgIE90aGVyd2lzZSwgYWxsIHRocmVlIGFyZ3VtZW50cyBhcmUgXHZhcntOb25lfS4KKworICBSZXR1cm5pbmcgYSB0cnVlIHZhbHVlIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSB0aGUgXGtleXdvcmR7d2l0aH0KKyAgc3RhdGVtZW50IHRvIHN1cHByZXNzIHRoZSBleGNlcHRpb24gYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiB3aXRoIHRoZQorICBzdGF0ZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuIE90aGVyd2lzZQorICB0aGUgZXhjZXB0aW9uIGNvbnRpbnVlcyBwcm9wYWdhdGluZyBhZnRlciB0aGlzIG1ldGhvZCBoYXMgZmluaXNoZWQKKyAgZXhlY3V0aW5nLiBFeGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsCisgIHJlcGxhY2UgYW55IGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIGluIHRoZSBib2R5IG9mIHRoZSBca2V5d29yZHt3aXRofQorICBzdGF0ZW1lbnQuCisKKyAgVGhlIGV4Y2VwdGlvbiBwYXNzZWQgaW4gc2hvdWxkIG5ldmVyIGJlIHJlcmFpc2VkIGV4cGxpY2l0bHkgLSBpbnN0ZWFkLAorICB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgZmFsc2UgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWV0aG9kCisgIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIGRvZXMgbm90IHdhbnQgdG8gc3VwcHJlc3MgdGhlIHJhaXNlZAorICBleGNlcHRpb24uIFRoaXMgYWxsb3dzIGNvbnRleHQgbWFuYWdlbWVudCBjb2RlIChzdWNoIGFzCisgIFxjb2Rle2NvbnRleHRsaWIubmVzdGVkfSkgdG8gZWFzaWx5IGRldGVjdCB3aGV0aGVyIG9yIG5vdCBhbgorICBcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZCBoYXMgYWN0dWFsbHkgZmFpbGVkLgorXGVuZHttZXRob2RkZXNjfQorCitQeXRob24gZGVmaW5lcyBzZXZlcmFsIGNvbnRleHQgbWFuYWdlcnMgdG8gc3VwcG9ydCBlYXN5IHRocmVhZAorc3luY2hyb25pc2F0aW9uLCBwcm9tcHQgY2xvc3VyZSBvZiBmaWxlcyBvciBvdGhlciBvYmplY3RzLCBhbmQKK3NpbXBsZXIgbWFuaXB1bGF0aW9uIG9mIHRoZSBhY3RpdmUgZGVjaW1hbCBhcml0aG1ldGljCitjb250ZXh0LiBUaGUgc3BlY2lmaWMgdHlwZXMgYXJlIG5vdCB0cmVhdGVkIHNwZWNpYWxseSBiZXlvbmQKK3RoZWlyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wuCisKK1B5dGhvbidzIGdlbmVyYXRvcnMgYW5kIHRoZSBcY29kZXtjb250ZXh0bGliLmNvbnRleHRmYWN0b3J5fSBkZWNvcmF0b3IKK3Byb3ZpZGUgYSBjb252ZW5pZW50IHdheSB0byBpbXBsZW1lbnQgdGhlc2UgcHJvdG9jb2xzLiAgSWYgYSBnZW5lcmF0b3IKK2Z1bmN0aW9uIGlzIGRlY29yYXRlZCB3aXRoIHRoZSBcY29kZXtjb250ZXh0bGliLmNvbnRleHRmYWN0b3J5fQorZGVjb3JhdG9yLCBpdCB3aWxsIHJldHVybiBhIGNvbnRleHQgbWFuYWdlciBpbXBsZW1lbnRpbmcgdGhlIG5lY2Vzc2FyeQorXG1ldGhvZHtfX2VudGVyX18oKX0gYW5kIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kcywgcmF0aGVyIHRoYW4gdGhlCitpdGVyYXRvciBwcm9kdWNlZCBieSBhbiB1bmRlY29yYXRlZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisKK05vdGUgdGhhdCB0aGVyZSBpcyBubyBzcGVjaWZpYyBzbG90IGZvciBhbnkgb2YgdGhlc2UgbWV0aG9kcyBpbiB0aGUKK3R5cGUgc3RydWN0dXJlIGZvciBQeXRob24gb2JqZWN0cyBpbiB0aGUgUHl0aG9uL0MgQVBJLiBFeHRlbnNpb24KK3R5cGVzIHdhbnRpbmcgdG8gZGVmaW5lIHRoZXNlIG1ldGhvZHMgbXVzdCBwcm92aWRlIHRoZW0gYXMgYSBub3JtYWwKK1B5dGhvbiBhY2Nlc3NpYmxlIG1ldGhvZC4gQ29tcGFyZWQgdG8gdGhlIG92ZXJoZWFkIG9mIHNldHRpbmcgdXAgdGhlCitydW50aW1lIGNvbnRleHQsIHRoZSBvdmVyaGVhZCBvZiBhIHNpbmdsZSBjbGFzcyBkaWN0aW9uYXJ5IGxvb2t1cAoraXMgbmVnbGlnaWJsZS4KKworCiBcc3Vic2VjdGlvbntPdGhlciBCdWlsdC1pbiBUeXBlcyBcbGFiZWx7dHlwZXNvdGhlcn19CiAKIFRoZSBpbnRlcnByZXRlciBzdXBwb3J0cyBzZXZlcmFsIG90aGVyIGtpbmRzIG9mIG9iamVjdHMuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4IGIvRG9jL2xpYi9saWJzdWJwcm9jZXNzLnRleAppbmRleCA0NDE3Nzk3Li5iZGU5MmViIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4CisrKyBiL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXgKQEAgLTcwLDEwICs3MCwxMCBAQAogCiBUaGUgXHZhcntleGVjdXRhYmxlfSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZS4gSXQgaXMKIHZlcnkgc2VsZG9tIG5lZWRlZDogVXN1YWxseSwgdGhlIHByb2dyYW0gdG8gZXhlY3V0ZSBpcyBkZWZpbmVkIGJ5IHRoZQotXHZhcnthcmdzfSBhcmd1bWVudC4gSWYgXHZhcntzaGVsbD1UcnVlfSwgdGhlIFx2YXJ7ZXhlY3V0YWJsZX0KK1x2YXJ7YXJnc30gYXJndW1lbnQuIElmIFxjb2Rle3NoZWxsPVRydWV9LCB0aGUgXHZhcntleGVjdXRhYmxlfQogYXJndW1lbnQgc3BlY2lmaWVzIHdoaWNoIHNoZWxsIHRvIHVzZS4gT24gXFVOSVh7fSwgdGhlIGRlZmF1bHQgc2hlbGwKLWlzIC9iaW4vc2guICBPbiBXaW5kb3dzLCB0aGUgZGVmYXVsdCBzaGVsbCBpcyBzcGVjaWZpZWQgYnkgdGhlIENPTVNQRUMKLWVudmlyb25tZW50IHZhcmlhYmxlLgoraXMgXGZpbGV7L2Jpbi9zaH0uICBPbiBXaW5kb3dzLCB0aGUgZGVmYXVsdCBzaGVsbCBpcyBzcGVjaWZpZWQgYnkgdGhlCitcZW52dmFye0NPTVNQRUN9IGVudmlyb25tZW50IHZhcmlhYmxlLgogCiBcdmFye3N0ZGlufSwgXHZhcntzdGRvdXR9IGFuZCBcdmFye3N0ZGVycn0gc3BlY2lmeSB0aGUgZXhlY3V0ZWQKIHByb2dyYW1zJyBzdGFuZGFyZCBpbnB1dCwgc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBmaWxlCkBAIC04OCwxNiArODgsMTkgQEAKIAogSWYgXHZhcntwcmVleGVjX2ZufSBpcyBzZXQgdG8gYSBjYWxsYWJsZSBvYmplY3QsIHRoaXMgb2JqZWN0IHdpbGwgYmUKIGNhbGxlZCBpbiB0aGUgY2hpbGQgcHJvY2VzcyBqdXN0IGJlZm9yZSB0aGUgY2hpbGQgaXMgZXhlY3V0ZWQuCisoXFVOSVh7fSBvbmx5KQogCiBJZiBcdmFye2Nsb3NlX2Zkc30gaXMgdHJ1ZSwgYWxsIGZpbGUgZGVzY3JpcHRvcnMgZXhjZXB0IFxjb25zdGFudHswfSwKIFxjb25zdGFudHsxfSBhbmQgXGNvbnN0YW50ezJ9IHdpbGwgYmUgY2xvc2VkIGJlZm9yZSB0aGUgY2hpbGQgcHJvY2VzcyBpcwotZXhlY3V0ZWQuCitleGVjdXRlZC4gKFxVTklYe30gb25seSkKIAogSWYgXHZhcntzaGVsbH0gaXMgXGNvbnN0YW50e1RydWV9LCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2lsbCBiZQogZXhlY3V0ZWQgdGhyb3VnaCB0aGUgc2hlbGwuCiAKLUlmIFx2YXJ7Y3dkfSBpcyBub3QgXGNvZGV7Tm9uZX0sIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIGNoYW5nZWQKLXRvIGN3ZCBiZWZvcmUgdGhlIGNoaWxkIGlzIGV4ZWN1dGVkLgorSWYgXHZhcntjd2R9IGlzIG5vdCBcY29kZXtOb25lfSwgdGhlIGNoaWxkJ3MgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZQorY2hhbmdlZCB0byBcdmFye2N3ZH0gYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLiAgTm90ZSB0aGF0IHRoaXMgZGlyZWN0b3J5CitpcyBub3QgY29uc2lkZXJlZCB3aGVuIHNlYXJjaGluZyB0aGUgZXhlY3V0YWJsZSwgc28geW91IGNhbid0IHNwZWNpZnkKK3RoZSBwcm9ncmFtJ3MgcGF0aCByZWxhdGl2ZSB0byBcdmFye2N3ZH0uCiAKIElmIFx2YXJ7ZW52fSBpcyBub3QgXGNvZGV7Tm9uZX0sIGl0IGRlZmluZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwogZm9yIHRoZSBuZXcgcHJvY2Vzcy4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3lzLnRleCBiL0RvYy9saWIvbGlic3lzLnRleAppbmRleCAxYTU3ZGE0Li42YjViNzU1IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnN5cy50ZXgKKysrIGIvRG9jL2xpYi9saWJzeXMudGV4CkBAIC00MTAsNyArNDEwLDcgQEAKICAgU3RyaW5ncyBzcGVjaWZ5aW5nIHRoZSBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgcHJvbXB0IG9mIHRoZQogICBpbnRlcnByZXRlci4gIFRoZXNlIGFyZSBvbmx5IGRlZmluZWQgaWYgdGhlIGludGVycHJldGVyIGlzIGluCiAgIGludGVyYWN0aXZlIG1vZGUuICBUaGVpciBpbml0aWFsIHZhbHVlcyBpbiB0aGlzIGNhc2UgYXJlCi0gIFxjb2Rleyc+XGNvZGV7Pn0+ICd9IGFuZCBcY29kZXsnLi4uICd9LiAgSWYgYSBub24tc3RyaW5nIG9iamVjdCBpcworICBcY29kZXsnPj4+fid9IGFuZCBcY29kZXsnLi4ufid9LiAgSWYgYSBub24tc3RyaW5nIG9iamVjdCBpcwogICBhc3NpZ25lZCB0byBlaXRoZXIgdmFyaWFibGUsIGl0cyBcZnVuY3Rpb257c3RyKCl9IGlzIHJlLWV2YWx1YXRlZAogICBlYWNoIHRpbWUgdGhlIGludGVycHJldGVyIHByZXBhcmVzIHRvIHJlYWQgYSBuZXcgaW50ZXJhY3RpdmUKICAgY29tbWFuZDsgdGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSBkeW5hbWljIHByb21wdC4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXggYi9Eb2MvbGliL2xpYnRhcmZpbGUudGV4CmluZGV4IGY3MDVlOGQuLmNhNmU2NWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXgKKysrIGIvRG9jL2xpYi9saWJ0YXJmaWxlLnRleApAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgXHNlZW1vZHVsZXt6aXBmaWxlfXtEb2N1bWVudGF0aW9uIG9mIHRoZSBccmVmbW9kdWxle3ppcGZpbGV9CiAgICAgc3RhbmRhcmQgbW9kdWxlLn0KIAotICAgIFxzZWV0aXRsZVtodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGFyL21hbnVhbC9odG1sX2NoYXB0ZXIvdGFyXzguaHRtbFwjU0VDMTM0XQorICAgIFxzZWV0aXRsZVtodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGFyL21hbnVhbC9odG1sX25vZGUvdGFyXzEzNC5odG1sXCNTRUMxMzRdCiAgICAge0dOVSB0YXIgbWFudWFsLCBCYXNpYyBUYXIgRm9ybWF0fXtEb2N1bWVudGF0aW9uIGZvciB0YXIgYXJjaGl2ZSBmaWxlcywKICAgICBpbmNsdWRpbmcgR05VIHRhciBleHRlbnNpb25zLn0KIFxlbmR7c2VlYWxzb30KQEAgLTMzNCw4ICszMzQsMTIgQEAKICAgICBDcmVhdGUgYW5kIHJldHVybiBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QgZnJvbSBhIHN0cmluZyBidWZmZXIuCiBcZW5ke21ldGhvZGRlc2N9CiAKLVxiZWdpbnttZXRob2RkZXNjfXt0b2J1Zn17fQorXGJlZ2lue21ldGhvZGRlc2N9e3RvYnVmfXtwb3NpeH0KICAgICBDcmVhdGUgYSBzdHJpbmcgYnVmZmVyIGZyb20gYSBcY2xhc3N7VGFySW5mb30gb2JqZWN0LgorICAgIFNlZSBcY2xhc3N7VGFyRmlsZX0ncyBcbWVtYmVye3Bvc2l4fSBhdHRyaWJ1dGUgZm9yIGluZm9ybWF0aW9uCisgICAgb24gdGhlIFx2YXJ7cG9zaXh9IGFyZ3VtZW50LiBJdCBkZWZhdWx0cyB0byBcY29uc3RhbnR7RmFsc2V9LgorCisgICAgXHZlcnNpb25hZGRlZFtUaGUgXHZhcntwb3NpeH0gcGFyYW1ldGVyXXsyLjV9CiBcZW5ke21ldGhvZGRlc2N9CiAKIEEgXGNvZGV7VGFySW5mb30gb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIHB1YmxpYyBkYXRhIGF0dHJpYnV0ZXM6CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRocmVhZC50ZXggYi9Eb2MvbGliL2xpYnRocmVhZC50ZXgKaW5kZXggOWUwYzIwMi4uOTU3M2FiMyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ0aHJlYWQudGV4CisrKyBiL0RvYy9saWIvbGlidGhyZWFkLnRleApAQCAtNDQsOCArNDQsOCBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtpbnRlcnJ1cHRfbWFpbn17fQotUmFpc2UgYSBLZXlib2FyZEludGVycnVwdCBpbiB0aGUgbWFpbiB0aHJlYWQuICBBIHN1YnRocmVhZCBjYW4gdXNlIHRoaXMKLWZ1bmN0aW9uIHRvIGludGVycnVwdCB0aGUgbWFpbiB0aHJlYWQuCitSYWlzZSBhIFxleGNlcHRpb257S2V5Ym9hcmRJbnRlcnJ1cHR9IGV4Y2VwdGlvbiBpbiB0aGUgbWFpbiB0aHJlYWQuICBBIHN1YnRocmVhZAorY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGludGVycnVwdCB0aGUgbWFpbiB0aHJlYWQuCiBcdmVyc2lvbmFkZGVkezIuM30KIFxlbmR7ZnVuY2Rlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidG9rZW5pemUudGV4IGIvRG9jL2xpYi9saWJ0b2tlbml6ZS50ZXgKaW5kZXggY2RiYjRiOC4uOGM5YWQzZSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ0b2tlbml6ZS50ZXgKKysrIGIvRG9jL2xpYi9saWJ0b2tlbml6ZS50ZXgKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgY2FsbCB0byB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBvbmUgbGluZSBvZiBpbnB1dCBhcyBhIHN0cmluZy4KICAgQWx0ZXJuYXRlbHksIFx2YXJ7cmVhZGxpbmV9IG1heSBiZSBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IHNpZ25hbHMKICAgY29tcGxldGlvbiBieSByYWlzaW5nIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0uCi0gIFx2ZXJzaW9uY2hhbmdlZFtBZGRlZCBTdG9wSXRlcmF0aW9uIHN1cHBvcnRdezIuNX0KKyAgXHZlcnNpb25jaGFuZ2VkW0FkZGVkIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn0gc3VwcG9ydF17Mi41fQogCiAgIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBcdmFye3Rva2VuZWF0ZXJ9LCBtdXN0IGFsc28gYmUgYSBjYWxsYWJsZQogICBvYmplY3QuICBJdCBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCB0b2tlbiwgd2l0aCBmaXZlIGFyZ3VtZW50cywKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidHJhY2UudGV4IGIvRG9jL2xpYi9saWJ0cmFjZS50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2NWFhYwotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvbGlidHJhY2UudGV4CkBAIC0wLDAgKzEsMTI1IEBACitcc2VjdGlvbntcbW9kdWxle3RyYWNlfSAtLS0KKyAgICAgICAgIFRyYWNlIG9yIHRyYWNrIFB5dGhvbiBzdGF0ZW1lbnQgZXhlY3V0aW9ufQorCitcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17dHJhY2V9CitcbW9kdWxlc3lub3BzaXN7VHJhY2Ugb3IgdHJhY2sgUHl0aG9uIHN0YXRlbWVudCBleGVjdXRpb24ufQorCitUaGUgXG1vZHVsZXt0cmFjZX0gbW9kdWxlIGFsbG93cyB5b3UgdG8gdHJhY2UgcHJvZ3JhbSBleGVjdXRpb24sIGdlbmVyYXRlCithbm5vdGF0ZWQgc3RhdGVtZW50IGNvdmVyYWdlIGxpc3RpbmdzLCBwcmludCBjYWxsZXIvY2FsbGVlIHJlbGF0aW9uc2hpcHMgYW5kCitsaXN0IGZ1bmN0aW9ucyBleGVjdXRlZCBkdXJpbmcgYSBwcm9ncmFtIHJ1bi4gIEl0IGNhbiBiZSB1c2VkIGluIGFub3RoZXIKK3Byb2dyYW0gb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCitcc3Vic2VjdGlvbntDb21tYW5kIExpbmUgVXNhZ2VcbGFiZWx7dHJhY2UtY2xpfX0KKworVGhlIFxtb2R1bGV7dHJhY2V9IG1vZHVsZSBjYW4gYmUgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBJdCBjYW4gYmUKK2FzIHNpbXBsZSBhcworCitcYmVnaW57dmVyYmF0aW19CitweXRob24gLW0gdHJhY2UgLS1jb3VudCBzb21lZmlsZS5weSAuLi4KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBhYm92ZSB3aWxsIGdlbmVyYXRlIGFubm90YXRlZCBsaXN0aW5ncyBvZiBhbGwgUHl0aG9uIG1vZHVsZXMgaW1wb3J0ZWQKK2R1cmluZyB0aGUgZXhlY3V0aW9uIG9mIFxmaWxle3NvbWVmaWxlLnB5fS4KKworVGhlIGZvbGxvd2luZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQ6CisKK1xiZWdpbntkZXNjcmlwdGlvbn0KK1xpdGVtW1xsb25ncHJvZ3JhbW9wdHt0cmFjZX0sIFxwcm9ncmFtb3B0ey10fV0KK0Rpc3BsYXkgbGluZXMgYXMgdGhleSBhcmUgZXhlY3V0ZWQuCisKK1xpdGVtW1xsb25ncHJvZ3JhbW9wdHtjb3VudH0sIFxwcm9ncmFtb3B0ey1jfV0KK1Byb2R1Y2UgYSBzZXQgb2YgIGFubm90YXRlZCBsaXN0aW5nIGZpbGVzIHVwb24gcHJvZ3JhbQorY29tcGxldGlvbiB0aGF0IHNob3dzIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhdGVtZW50IHdhcyBleGVjdXRlZC4KKworXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e3JlcG9ydH0sIFxwcm9ncmFtb3B0ey1yfV0KK1Byb2R1Y2UgYW4gYW5ub3RhdGVkIGxpc3QgZnJvbSBhbiBlYXJsaWVyIHByb2dyYW0gcnVuIHRoYXQKK3VzZWQgdGhlIFxsb25ncHJvZ3JhbW9wdHtjb3VudH0gYW5kIFxsb25ncHJvZ3JhbW9wdHtmaWxlfSBhcmd1bWVudHMuCisKK1xpdGVtW1xsb25ncHJvZ3JhbW9wdHtuby1yZXBvcnR9LCBccHJvZ3JhbW9wdHstUn1dCitEbyBub3QgZ2VuZXJhdGUgYW5ub3RhdGVkIGxpc3RpbmdzLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGludGVuZCB0byBtYWtlCitzZXZlcmFsIHJ1bnMgd2l0aCBcbG9uZ3Byb2dyYW1vcHR7Y291bnR9IHRoZW4gcHJvZHVjZSBhIHNpbmdsZSBzZXQKK29mIGFubm90YXRlZCBsaXN0aW5ncyBhdCB0aGUgZW5kLgorCitcaXRlbVtcbG9uZ3Byb2dyYW1vcHR7bGlzdGZ1bmNzfSwgXHByb2dyYW1vcHR7LWx9XQorTGlzdCB0aGUgZnVuY3Rpb25zIGV4ZWN1dGVkIGJ5IHJ1bm5pbmcgdGhlIHByb2dyYW0uCisKK1xpdGVtW1xsb25ncHJvZ3JhbW9wdHt0cmFja2NhbGxzfSwgXHByb2dyYW1vcHR7LVR9XQorR2VuZXJhdGUgY2FsbGluZyByZWxhdGlvbnNoaXBzIGV4cG9zZWQgYnkgcnVubmluZyB0aGUgcHJvZ3JhbS4KKworXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e2ZpbGV9LCBccHJvZ3JhbW9wdHstZn1dCitOYW1lIGEgZmlsZSBjb250YWluaW5nIChvciB0byBjb250YWluKSBjb3VudHMuCisKK1xpdGVtW1xsb25ncHJvZ3JhbW9wdHtjb3ZlcmRpcn0sIFxwcm9ncmFtb3B0ey1DfV0KK05hbWUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gc2F2ZSBhbm5vdGF0ZWQgbGlzdGluZyBmaWxlcy4KKworXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e21pc3Npbmd9LCBccHJvZ3JhbW9wdHstbX1dCitXaGVuIGdlbmVyYXRpbmcgYW5ub3RhdGVkIGxpc3RpbmdzLCBtYXJrIGxpbmVzIHdoaWNoCit3ZXJlIG5vdCBleGVjdXRlZCB3aXRoIGBcY29kZXs+Pj4+Pj59Jy4KKworXGl0ZW1bXGxvbmdwcm9ncmFtb3B0e3N1bW1hcnl9LCBccHJvZ3JhbW9wdHstc31dCitXaGVuIHVzaW5nIFxsb25ncHJvZ3JhbW9wdHtjb3VudH0gb3IgXGxvbmdwcm9ncmFtb3B0e3JlcG9ydH0sIHdyaXRlIGEKK2JyaWVmIHN1bW1hcnkgdG8gc3Rkb3V0IGZvciBlYWNoIGZpbGUgcHJvY2Vzc2VkLgorCitcaXRlbVtcbG9uZ3Byb2dyYW1vcHR7aWdub3JlLW1vZHVsZX1dCitJZ25vcmUgdGhlIG5hbWVkIG1vZHVsZSBhbmQgaXRzIHN1Ym1vZHVsZXMgKGlmIGl0IGlzCithIHBhY2thZ2UpLiAgTWF5IGJlIGdpdmVuIG11bHRpcGxlIHRpbWVzLgorCitcaXRlbVtcbG9uZ3Byb2dyYW1vcHR7aWdub3JlLWRpcn1dCitJZ25vcmUgYWxsIG1vZHVsZXMgYW5kIHBhY2thZ2VzIGluIHRoZSBuYW1lZCBkaXJlY3RvcnkKK2FuZCBzdWJkaXJlY3Rvcmllcy4gIE1heSBiZSBnaXZlbiBtdWx0aXBsZSB0aW1lcy4KK1xlbmR7ZGVzY3JpcHRpb259CisKK1xzdWJzZWN0aW9ue1Byb2dyYW1taW5nIEludGVyZmFjZVxsYWJlbHt0cmFjZS1hcGl9fQorCitcYmVnaW57Y2xhc3NkZXNjfXtUcmFjZX17XG9wdGlvbmFse2NvdW50PTFcb3B0aW9uYWx7LCB0cmFjZT0xXG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGZ1bmNzPTBcb3B0aW9uYWx7LCBjb3VudGNhbGxlcnM9MFxvcHRpb25hbHssCisgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlbW9kcz0oKVxvcHRpb25hbHssIGlnbm9yZWRpcnM9KClcb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZmlsZT1Ob25lXG9wdGlvbmFseywgb3V0ZmlsZT1Ob25lfX19fX19fX19CitDcmVhdGUgYW4gb2JqZWN0IHRvIHRyYWNlIGV4ZWN1dGlvbiBvZiBhIHNpbmdsZSBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbi4KK0FsbCBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4gIFx2YXJ7Y291bnR9IGVuYWJsZXMgY291bnRpbmcgb2YgbGluZSBudW1iZXJzLgorXHZhcnt0cmFjZX0gZW5hYmxlcyBsaW5lIGV4ZWN1dGlvbiB0cmFjaW5nLiAgXHZhcntjb3VudGZ1bmNzfSBlbmFibGVzCitsaXN0aW5nIG9mIHRoZSBmdW5jdGlvbnMgY2FsbGVkIGR1cmluZyB0aGUgcnVuLiAgXHZhcntjb3VudGNhbGxlcnN9IGVuYWJsZXMKK2NhbGwgcmVsYXRpb25zaGlwIHRyYWNraW5nLiAgXHZhcntpZ25vcmVtb2RzfSBpcyBhIGxpc3Qgb2YgbW9kdWxlcyBvcgorcGFja2FnZXMgdG8gaWdub3JlLiAgXHZhcntpZ25vcmVkaXJzfSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hvc2UgbW9kdWxlcworb3IgcGFja2FnZXMgc2hvdWxkIGJlIGlnbm9yZWQuICBcdmFye2luZmlsZX0gaXMgdGhlIGZpbGUgZnJvbSB3aGljaCB0byByZWFkCitzdG9yZWQgY291bnQgaW5mb3JtYXRpb24uICBcdmFye291dGZpbGV9IGlzIGEgZmlsZSBpbiB3aGljaCB0byB3cml0ZSB1cGRhdGVkCitjb3VudCBpbmZvcm1hdGlvbi4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bVHJhY2Vde3J1bn17Y21kfQorUnVuIFx2YXJ7Y21kfSB1bmRlciBjb250cm9sIG9mIHRoZSBUcmFjZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCB0cmFjaW5nCitwYXJhbWV0ZXJzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bVHJhY2Vde3J1bmN0eH17Y21kXG9wdGlvbmFseywgZ2xvYmFscz1Ob25lXG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHM9Tm9uZX19fQorUnVuIFx2YXJ7Y21kfSB1bmRlciBjb250cm9sIG9mIHRoZSBUcmFjZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCB0cmFjaW5nCitwYXJhbWV0ZXJzIGluIHRoZSBkZWZpbmVkIGdsb2JhbCBhbmQgbG9jYWwgZW52aXJvbm1lbnRzLiAgSWYgbm90IGRlZmluZWQsCitcdmFye2dsb2JhbHN9IGFuZCBcdmFye2xvY2Fsc30gZGVmYXVsdCB0byBlbXB0eSBkaWN0aW9uYXJpZXMuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtUcmFjZV17cnVuZnVuY317ZnVuYywgKmFyZ3MsICoqa3dkc30KK0NhbGwgXHZhcntmdW5jfSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgdW5kZXIgY29udHJvbCBvZiB0aGUKK1xjbGFzc3tUcmFjZX0gb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgdHJhY2luZyBwYXJhbWV0ZXJzLgorXGVuZHttZXRob2RkZXNjfQorCitUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgc2hvd2luZyB0aGUgdXNlIG9mIHRoaXMgbW9kdWxlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgc3lzCitpbXBvcnQgdHJhY2UKKworIyBjcmVhdGUgYSBUcmFjZSBvYmplY3QsIHRlbGxpbmcgaXQgd2hhdCB0byBpZ25vcmUsIGFuZCB3aGV0aGVyIHRvCisjIGRvIHRyYWNpbmcgb3IgbGluZS1jb3VudGluZyBvciBib3RoLgordHJhY2VyID0gdHJhY2UuVHJhY2UoCisgICAgaWdub3JlZGlycz1bc3lzLnByZWZpeCwgc3lzLmV4ZWNfcHJlZml4XSwKKyAgICB0cmFjZT0wLAorICAgIGNvdW50PTEpCisKKyMgcnVuIHRoZSBuZXcgY29tbWFuZCB1c2luZyB0aGUgZ2l2ZW4gdHJhY2VyCit0cmFjZXIucnVuKCdtYWluKCknKQorCisjIG1ha2UgYSByZXBvcnQsIHBsYWNpbmcgb3V0cHV0IGluIC90bXAKK3IgPSB0cmFjZXIucmVzdWx0cygpCityLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIGNvdmVyZGlyPSIvdG1wIikKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVuaXR0ZXN0LnRleCBiL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CmluZGV4IDZjODc2OWQuLjUxYjMyMWUgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CisrKyBiL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CkBAIC0yMjYsNyArMjI2LDcgQEAKIGlkZW50aWZ5IHRoZSB0ZXN0IGNhc2UgYXMgYSBcZGZue2ZhaWx1cmV9LiAgT3RoZXIgZXhjZXB0aW9ucyB0aGF0IGRvCiBub3QgYXJpc2UgZnJvbSBjaGVja3MgbWFkZSB0aHJvdWdoIHRoZSBcbWV0aG9ke2Fzc2VydCooKX0gYW5kCiBcbWV0aG9ke2ZhaWwqKCl9IG1ldGhvZHMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHRlc3RpbmcgZnJhbWV3b3JrIGFzCi1kZm57ZXJyb3JzfS4KK1xkZm57ZXJyb3JzfS4KIAogVGhlIHdheSB0byBydW4gYSB0ZXN0IGNhc2Ugd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIuICBGb3Igbm93LCBub3RlCiB0aGF0IHRvIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBzdWNoIGEgdGVzdCBjYXNlLCB3ZSBjYWxsIGl0cwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1cmxsaWIyLnRleCBiL0RvYy9saWIvbGlidXJsbGliMi50ZXgKaW5kZXggZTBjNDU2OC4uN2M4YWQ1ZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ1cmxsaWIyLnRleAorKysgYi9Eb2MvbGliL2xpYnVybGxpYjIudGV4CkBAIC02MjEsMTQgKzYyMSwyMCBAQAogXHN1YnNlY3Rpb257QWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyIE9iamVjdHMKICAgICAgICAgICAgIFxsYWJlbHthYnN0cmFjdC1iYXNpYy1hdXRoLWhhbmRsZXJ9fQogCi1cYmVnaW57bWV0aG9kZGVzY31bQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyXXtoYW5kbGVfYXV0aGVudGljYXRpb25fcmVxdWVzdH0KK1xiZWdpbnttZXRob2RkZXNjfVtBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXJde2h0dHBfZXJyb3JfYXV0aF9yZXFlZH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2F1dGhyZXEsIGhvc3QsIHJlcSwgaGVhZGVyc30KIEhhbmRsZSBhbiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGJ5IGdldHRpbmcgYSB1c2VyL3Bhc3N3b3JkIHBhaXIsIGFuZAogcmUtdHJ5aW5nIHRoZSByZXF1ZXN0LiAgXHZhcnthdXRocmVxfSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGhlYWRlcgogd2hlcmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWFsbSBpcyBpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCwKLVx2YXJ7aG9zdH0gaXMgdGhlIGhvc3QgdG8gYXV0aGVudGljYXRlIHRvLCBcdmFye3JlcX0gc2hvdWxkIGJlIHRoZQotKGZhaWxlZCkgXGNsYXNze1JlcXVlc3R9IG9iamVjdCwgYW5kIFx2YXJ7aGVhZGVyc30gc2hvdWxkIGJlIHRoZSBlcnJvcgotaGVhZGVycy4KK1x2YXJ7aG9zdH0gc3BlY2lmaWVzIHRoZSBVUkwgYW5kIHBhdGggdG8gYXV0aGVudGljYXRlIGZvciwgXHZhcntyZXF9CitzaG91bGQgYmUgdGhlIChmYWlsZWQpIFxjbGFzc3tSZXF1ZXN0fSBvYmplY3QsIGFuZCBcdmFye2hlYWRlcnN9CitzaG91bGQgYmUgdGhlIGVycm9yIGhlYWRlcnMuCisKK1x2YXJ7aG9zdH0gaXMgZWl0aGVyIGFuIGF1dGhvcml0eSAoZS5nLiBcY29kZXsicHl0aG9uLm9yZyJ9KSBvciBhIFVSTAorY29udGFpbmluZyBhbiBhdXRob3JpdHkgY29tcG9uZW50IChlLmcuIFxjb2RleyJodHRwOi8vcHl0aG9uLm9yZy8ifSkuCitJbiBlaXRoZXIgY2FzZSwgdGhlIGF1dGhvcml0eSBtdXN0IG5vdCBjb250YWluIGEgdXNlcmluZm8gY29tcG9uZW50Cisoc28sIFxjb2RleyJweXRob24ub3JnIn0gYW5kIFxjb2RleyJweXRob24ub3JnOjgwIn0gYXJlIGZpbmUsCitcY29kZXsiam9lOnBhc3N3b3JkQHB5dGhvbi5vcmcifSBpcyBub3QpLgogXGVuZHttZXRob2RkZXNjfQogCiAKQEAgLTY1Myw3ICs2NTksNyBAQAogXHN1YnNlY3Rpb257QWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciBPYmplY3RzCiAgICAgICAgICAgICBcbGFiZWx7YWJzdHJhY3QtZGlnZXN0LWF1dGgtaGFuZGxlcn19CiAKLVxiZWdpbnttZXRob2RkZXNjfVtBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyXXtoYW5kbGVfYXV0aGVudGljYXRpb25fcmVxdWVzdH0KK1xiZWdpbnttZXRob2RkZXNjfVtBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyXXtodHRwX2Vycm9yX2F1dGhfcmVxZWR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthdXRocmVxLCBob3N0LCByZXEsIGhlYWRlcnN9CiBcdmFye2F1dGhyZXF9IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIHdoZXJlIHRoZSBpbmZvcm1hdGlvbiBhYm91dAogdGhlIHJlYWxtIGlzIGluY2x1ZGVkIGluIHRoZSByZXF1ZXN0LCBcdmFye2hvc3R9IHNob3VsZCBiZSB0aGUgaG9zdCB0bwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleCBiL0RvYy9saWIvbGlid2Vha3JlZi50ZXgKaW5kZXggODQwYjY3NC4uZmM5NDllNiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleAorKysgYi9Eb2MvbGliL2xpYndlYWtyZWYudGV4CkBAIC0xNDcsNiArMTQ3LDI0IEBACiAgICAgICAgIHRvIHZhbmlzaCAiYnkgbWFnaWMiIChhcyBhIHNpZGUgZWZmZWN0IG9mIGdhcmJhZ2UgY29sbGVjdGlvbikufQogXGVuZHtjbGFzc2Rlc2N9CiAKK1xjbGFzc3tXZWFrS2V5RGljdGlvbmFyeX0gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAorbWV0aG9kcy4gIFRoZXNlIGV4cG9zZSB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBkaXJlY3RseS4gIFRoZQorcmVmZXJlbmNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgYGBsaXZlJycgYXQgdGhlIHRpbWUgdGhleSBhcmUKK3VzZWQsIHNvIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgcmVmZXJlbmNlcyBuZWVkcyB0byBiZSBjaGVja2VkCitiZWZvcmUgYmVpbmcgdXNlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgcmVmZXJlbmNlcyB0aGF0Cit3aWxsIGNhdXNlIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0byBrZWVwIHRoZSBrZXlzIGFyb3VuZCBsb25nZXIgdGhhbgorbmVlZGVkLgorCitcYmVnaW57bWV0aG9kZGVzY317aXRlcmtleXJlZnN9e30KKyAgUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIGtleXMuCisgIFx2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317a2V5cmVmc317fQorICBSZXR1cm4gYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUga2V5cy4KKyAgXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke21ldGhvZGRlc2N9CisKIFxiZWdpbntjbGFzc2Rlc2N9e1dlYWtWYWx1ZURpY3Rpb25hcnl9e1xvcHRpb25hbHtkaWN0fX0KICAgTWFwcGluZyBjbGFzcyB0aGF0IHJlZmVyZW5jZXMgdmFsdWVzIHdlYWtseS4gIEVudHJpZXMgaW4gdGhlCiAgIGRpY3Rpb25hcnkgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiBubyBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZQpAQCAtMTYwLDYgKzE3OCwyMSBAQAogICAgICAgICB0byB2YW5pc2ggImJ5IG1hZ2ljIiAoYXMgYSBzaWRlIGVmZmVjdCBvZiBnYXJiYWdlIGNvbGxlY3Rpb24pLn0KIFxlbmR7Y2xhc3NkZXNjfQogCitcY2xhc3N7V2Vha1ZhbHVlRGljdGlvbmFyeX0gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAorbWV0aG9kcy4gIFRoZXNlIG1ldGhvZCBoYXZlIHRoZSBzYW1lIGlzc3VlcyBhcyB0aGUKK1xtZXRob2R7aXRlcmtleXJlZnMoKX0gYW5kIFxtZXRob2R7a2V5cmVmcygpfSBtZXRob2RzIG9mCitcY2xhc3N7V2Vha0tleURpY3Rpb25hcnl9IG9iamVjdHMuCisKK1xiZWdpbnttZXRob2RkZXNjfXtpdGVydmFsdWVyZWZzfXt9CisgIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyB0aGUgd2VhayByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMuCisgIFx2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317dmFsdWVyZWZzfXt9CisgIFJldHVybiBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMuCisgIFx2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZXRob2RkZXNjfQorCiBcYmVnaW57ZGF0YWRlc2N9e1JlZmVyZW5jZVR5cGV9CiAgIFRoZSB0eXBlIG9iamVjdCBmb3Igd2VhayByZWZlcmVuY2VzIG9iamVjdHMuCiBcZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ4bWxycGNsaWIudGV4IGIvRG9jL2xpYi9saWJ4bWxycGNsaWIudGV4CmluZGV4IDFjMzZmOTkuLjM2NDViODIgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlieG1scnBjbGliLnRleAorKysgYi9Eb2MvbGliL2xpYnhtbHJwY2xpYi50ZXgKQEAgLTgxLDkgKzgxLDExIEBACiBUaGlzIGlzIHRoZSBmdWxsIHNldCBvZiBkYXRhIHR5cGVzIHN1cHBvcnRlZCBieSBYTUwtUlBDLiAgTWV0aG9kIGNhbGxzCiBtYXkgYWxzbyByYWlzZSBhIHNwZWNpYWwgXGV4Y2VwdGlvbntGYXVsdH0gaW5zdGFuY2UsIHVzZWQgdG8gc2lnbmFsCiBYTUwtUlBDIHNlcnZlciBlcnJvcnMsIG9yIFxleGNlcHRpb257UHJvdG9jb2xFcnJvcn0gdXNlZCB0byBzaWduYWwgYW4KLWVycm9yIGluIHRoZSBIVFRQL0hUVFBTIHRyYW5zcG9ydCBsYXllci4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCBzdGFydGluZwotd2l0aCBQeXRob24gMi4yIHlvdSBjYW4gc3ViY2xhc3MgYnVpbHRpbiB0eXBlcywgdGhlIHhtbHJwY2xpYiBtb2R1bGUKLWN1cnJlbnRseSBkb2VzIG5vdCBtYXJzaGFsIGluc3RhbmNlcyBvZiBzdWNoIHN1YmNsYXNzZXMuCitlcnJvciBpbiB0aGUgSFRUUC9IVFRQUyB0cmFuc3BvcnQgbGF5ZXIuICBCb3RoIFxleGNlcHRpb257RmF1bHR9IGFuZAorXGV4Y2VwdGlvbntQcm90b2NvbEVycm9yfSBkZXJpdmUgZnJvbSBhIGJhc2UgY2xhc3MgY2FsbGVkCitcZXhjZXB0aW9ue0Vycm9yfS4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCBzdGFydGluZyB3aXRoIFB5dGhvbiAyLjIgeW91CitjYW4gc3ViY2xhc3MgYnVpbHRpbiB0eXBlcywgdGhlIHhtbHJwY2xpYiBtb2R1bGUgY3VycmVudGx5IGRvZXMgbm90CittYXJzaGFsIGluc3RhbmNlcyBvZiBzdWNoIHN1YmNsYXNzZXMuCiAKIFdoZW4gcGFzc2luZyBzdHJpbmdzLCBjaGFyYWN0ZXJzIHNwZWNpYWwgdG8gWE1MIHN1Y2ggYXMgXHNhbXB7PH0sCiBcc2FtcHs+fSwgYW5kIFxzYW1we1wmfSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZXNjYXBlZC4gIEhvd2V2ZXIsIGl0J3MKQEAgLTM0MCw2ICszNDIsNyBAQAogCiBcYmVnaW57dmVyYmF0aW19CiAjIHNpbXBsZSB0ZXN0IHByb2dyYW0gKGZyb20gdGhlIFhNTC1SUEMgc3BlY2lmaWNhdGlvbikKK2Zyb20geG1scnBjbGliIGltcG9ydCBTZXJ2ZXJQcm94eSwgRXJyb3IKIAogIyBzZXJ2ZXIgPSBTZXJ2ZXJQcm94eSgiaHR0cDovL2xvY2FsaG9zdDo4MDAwIikgIyBsb2NhbCBzZXJ2ZXIKIHNlcnZlciA9IFNlcnZlclByb3h5KCJodHRwOi8vYmV0dHkudXNlcmxhbmQuY29tIikKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliemxpYi50ZXggYi9Eb2MvbGliL2xpYnpsaWIudGV4CmluZGV4IGRmYmI0M2QuLjg3NmY4YzAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliemxpYi50ZXgKKysrIGIvRG9jL2xpYi9saWJ6bGliLnRleApAQCAtMTIzLDYgKzEyMywxMiBAQAogYWN0aW9uIGlzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LiAgCiBcZW5ke21ldGhvZGRlc2N9CiAKK1xiZWdpbnttZXRob2RkZXNjfVtDb21wcmVzc117Y29weX17fQorUmV0dXJucyBhIGNvcHkgb2YgdGhlIGNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gZWZmaWNpZW50bHkKK2NvbXByZXNzIGEgc2V0IG9mIGRhdGEgdGhhdCBzaGFyZSBhIGNvbW1vbiBpbml0aWFsIHByZWZpeC4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHttZXRob2RkZXNjfQorCiBEZWNvbXByZXNzaW9uIG9iamVjdHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1ldGhvZHMsIGFuZCB0d28gYXR0cmlidXRlczoKIAogXGJlZ2lue21lbWJlcmRlc2N9e3VudXNlZF9kYXRhfQpAQCAtMTc2LDYgKzE4MiwxMyBAQAogb3V0cHV0IGJ1ZmZlci4KIFxlbmR7bWV0aG9kZGVzY30KIAorXGJlZ2lue21ldGhvZGRlc2N9W0RlY29tcHJlc3Nde2NvcHl9e30KK1JldHVybnMgYSBjb3B5IG9mIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2F2ZSB0aGUKK3N0YXRlIG9mIHRoZSBkZWNvbXByZXNzb3IgbWlkd2F5IHRocm91Z2ggdGhlIGRhdGEgc3RyZWFtIGluIG9yZGVyIHRvIHNwZWVkIHVwCityYW5kb20gc2Vla3MgaW50byB0aGUgc3RyZWFtIGF0IGEgZnV0dXJlIHBvaW50LgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke21ldGhvZGRlc2N9CisKIFxiZWdpbntzZWVhbHNvfQogICBcc2VlbW9kdWxle2d6aXB9e1JlYWRpbmcgYW5kIHdyaXRpbmcgXHByb2dyYW17Z3ppcH0tZm9ybWF0IGZpbGVzLn0KICAgXHNlZXVybHtodHRwOi8vd3d3LnpsaWIubmV0fXtUaGUgemxpYiBsaWJyYXJ5IGhvbWUgcGFnZS59CmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9kYXRldGltZS5weSBiL0RvYy9saWIvc3FsaXRlMy9hZGFwdGVyX2RhdGV0aW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NjA0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9kYXRldGltZS5weQpAQCAtMCwwICsxLDE0IEBACitpbXBvcnQgc3FsaXRlMworaW1wb3J0IGRhdGV0aW1lLCB0aW1lCisKK2RlZiBhZGFwdF9kYXRldGltZSh0cyk6CisgICAgcmV0dXJuIHRpbWUubWt0aW1lKHRzLnRpbWV0dXBsZSgpKQorCitzcWxpdGUzLnJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZXRpbWUsIGFkYXB0X2RhdGV0aW1lKQorCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKK2N1ciA9IGNvbi5jdXJzb3IoKQorCitub3cgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKG5vdywpKQorcHJpbnQgY3VyLmZldGNob25lKClbMF0KZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9hZGFwdGVyX3BvaW50XzEucHkgYi9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8xLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDFmNmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8xLnB5CkBAIC0wLDAgKzEsMTYgQEAKK2ltcG9ydCBzcWxpdGUzCisKK2NsYXNzIFBvaW50KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHkKKworICAgIGRlZiBfX2NvbmZvcm1fXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIGlmIHByb3RvY29sIGlzIHNxbGl0ZTMuUHJlcGFyZVByb3RvY29sOgorICAgICAgICAgICAgcmV0dXJuICIlZjslZiIgJSAoc2VsZi54LCBzZWxmLnkpCisKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQorY3VyID0gY29uLmN1cnNvcigpCisKK3AgPSBQb2ludCg0LjAsIC0zLjIpCitjdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAocCwpKQorcHJpbnQgY3VyLmZldGNob25lKClbMF0KZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9hZGFwdGVyX3BvaW50XzIucHkgYi9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGEwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvYWRhcHRlcl9wb2ludF8yLnB5CkBAIC0wLDAgKzEsMTcgQEAKK2ltcG9ydCBzcWxpdGUzCisKK2NsYXNzIFBvaW50KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHkKKworZGVmIGFkYXB0X3BvaW50KHBvaW50KToKKyAgICByZXR1cm4gIiVmOyVmIiAlIChwb2ludC54LCBwb2ludC55KQorCitzcWxpdGUzLnJlZ2lzdGVyX2FkYXB0ZXIoUG9pbnQsIGFkYXB0X3BvaW50KQorCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKK2N1ciA9IGNvbi5jdXJzb3IoKQorCitwID0gUG9pbnQoNC4wLCAtMy4yKQorY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKHAsKSkKK3ByaW50IGN1ci5mZXRjaG9uZSgpWzBdCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvY29sbGF0aW9uX3JldmVyc2UucHkgYi9Eb2MvbGliL3NxbGl0ZTMvY29sbGF0aW9uX3JldmVyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1NjQwMgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9jb2xsYXRpb25fcmV2ZXJzZS5weQpAQCAtMCwwICsxLDE1IEBACitpbXBvcnQgc3FsaXRlMworCitkZWYgY29sbGF0ZV9yZXZlcnNlKHN0cmluZzEsIHN0cmluZzIpOgorICAgIHJldHVybiAtY21wKHN0cmluZzEsIHN0cmluZzIpCisKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQorY29uLmNyZWF0ZV9jb2xsYXRpb24oInJldmVyc2UiLCBjb2xsYXRlX3JldmVyc2UpCisKK2N1ciA9IGNvbi5jdXJzb3IoKQorY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpIikKK2N1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgWygiYSIsKSwgKCJiIiwpXSkKK2N1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3Qgb3JkZXIgYnkgeCBjb2xsYXRlIHJldmVyc2UiKQorZm9yIHJvdyBpbiBjdXI6CisgICAgcHJpbnQgcm93Citjb24uY2xvc2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2NvbXBsZXRlX3N0YXRlbWVudC5weSBiL0RvYy9saWIvc3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYzI1MAotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHkKQEAgLTAsMCArMSwzMCBAQAorIyBBIG1pbmltYWwgU1FMaXRlIHNoZWxsIGZvciBleHBlcmltZW50cworCitpbXBvcnQgc3FsaXRlMworCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKK2Nvbi5pc29sYXRpb25fbGV2ZWwgPSBOb25lCitjdXIgPSBjb24uY3Vyc29yKCkKKworYnVmZmVyID0gIiIKKworcHJpbnQgIkVudGVyIHlvdXIgU1FMIGNvbW1hbmRzIHRvIGV4ZWN1dGUgaW4gc3FsaXRlMy4iCitwcmludCAiRW50ZXIgYSBibGFuayBsaW5lIHRvIGV4aXQuIgorCit3aGlsZSBUcnVlOgorICAgIGxpbmUgPSByYXdfaW5wdXQoKQorICAgIGlmIGxpbmUgPT0gIiI6CisgICAgICAgIGJyZWFrCisgICAgYnVmZmVyICs9IGxpbmUKKyAgICBpZiBzcWxpdGUzLmNvbXBsZXRlX3N0YXRlbWVudChidWZmZXIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc3RyaXAoKQorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoYnVmZmVyKQorCisgICAgICAgICAgICBpZiBidWZmZXIubHN0cmlwKCkudXBwZXIoKS5zdGFydHN3aXRoKCJTRUxFQ1QiKToKKyAgICAgICAgICAgICAgICBwcmludCBjdXIuZmV0Y2hhbGwoKQorICAgICAgICBleGNlcHQgc3FsaXRlMy5FcnJvciwgZToKKyAgICAgICAgICAgIHByaW50ICJBbiBlcnJvciBvY2N1cmVkOiIsIGUuYXJnc1swXQorICAgICAgICBidWZmZXIgPSAiIgorCitjb24uY2xvc2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2Nvbm5lY3RfZGJfMS5weSBiL0RvYy9saWIvc3FsaXRlMy9jb25uZWN0X2RiXzEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5NzUyMwotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9jb25uZWN0X2RiXzEucHkKQEAgLTAsMCArMSwzIEBACitpbXBvcnQgc3FsaXRlMworCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIm15ZGIiKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2Nvbm5lY3RfZGJfMi5weSBiL0RvYy9saWIvc3FsaXRlMy9jb25uZWN0X2RiXzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3MjhiMwotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9jb25uZWN0X2RiXzIucHkKQEAgLTAsMCArMSwzIEBACitpbXBvcnQgc3FsaXRlMworCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9jb252ZXJ0ZXJfcG9pbnQucHkgYi9Eb2MvbGliL3NxbGl0ZTMvY29udmVydGVyX3BvaW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjBlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvY29udmVydGVyX3BvaW50LnB5CkBAIC0wLDAgKzEsNDcgQEAKK2ltcG9ydCBzcWxpdGUzCisKK2NsYXNzIFBvaW50KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIoJWY7JWYpIiAlIChzZWxmLngsIHNlbGYueSkKKworZGVmIGFkYXB0X3BvaW50KHBvaW50KToKKyAgICByZXR1cm4gIiVmOyVmIiAlIChwb2ludC54LCBwb2ludC55KQorCitkZWYgY29udmVydF9wb2ludChzKToKKyAgICB4LCB5ID0gbWFwKGZsb2F0LCBzLnNwbGl0KCI7IikpCisgICAgcmV0dXJuIFBvaW50KHgsIHkpCisKKyMgUmVnaXN0ZXIgdGhlIGFkYXB0ZXIKK3NxbGl0ZTMucmVnaXN0ZXJfYWRhcHRlcihQb2ludCwgYWRhcHRfcG9pbnQpCisKKyMgUmVnaXN0ZXIgdGhlIGNvbnZlcnRlcgorc3FsaXRlMy5yZWdpc3Rlcl9jb252ZXJ0ZXIoInBvaW50IiwgY29udmVydF9wb2ludCkKKworcCA9IFBvaW50KDQuMCwgLTMuMikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAxKSBVc2luZyBkZWNsYXJlZCB0eXBlcworY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUzLlBBUlNFX0RFQ0xUWVBFUykKK2N1ciA9IGNvbi5jdXJzb3IoKQorY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHAgcG9pbnQpIikKKworY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QocCkgdmFsdWVzICg/KSIsIChwLCkpCitjdXIuZXhlY3V0ZSgic2VsZWN0IHAgZnJvbSB0ZXN0IikKK3ByaW50ICJ3aXRoIGRlY2xhcmVkIHR5cGVzOiIsIGN1ci5mZXRjaG9uZSgpWzBdCitjdXIuY2xvc2UoKQorY29uLmNsb3NlKCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMSkgVXNpbmcgY29sdW1uIG5hbWVzCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZTMuUEFSU0VfQ09MTkFNRVMpCitjdXIgPSBjb24uY3Vyc29yKCkKK2N1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChwKSIpCisKK2N1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHApIHZhbHVlcyAoPykiLCAocCwpKQorY3VyLmV4ZWN1dGUoJ3NlbGVjdCBwIGFzICJwIFtwb2ludF0iIGZyb20gdGVzdCcpCitwcmludCAid2l0aCBjb2x1bW4gbmFtZXM6IiwgY3VyLmZldGNob25lKClbMF0KK2N1ci5jbG9zZSgpCitjb24uY2xvc2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2NvdW50Y3Vyc29ycy5weSBiL0RvYy9saWIvc3FsaXRlMy9jb3VudGN1cnNvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwNGNhZAotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9jb3VudGN1cnNvcnMucHkKQEAgLTAsMCArMSwxNSBAQAoraW1wb3J0IHNxbGl0ZTMKKworY2xhc3MgQ291bnRDdXJzb3JzQ29ubmVjdGlvbihzcWxpdGUzLkNvbm5lY3Rpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzcWxpdGUzLkNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLm51bWN1cnNvcnMgPSAwCisKKyAgICBkZWYgY3Vyc29yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYubnVtY3Vyc29ycyArPSAxCisgICAgICAgIHJldHVybiBzcWxpdGUzLkNvbm5lY3Rpb24uY3Vyc29yKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIsIGZhY3Rvcnk9Q291bnRDdXJzb3JzQ29ubmVjdGlvbikKK2N1cjEgPSBjb24uY3Vyc29yKCkKK2N1cjIgPSBjb24uY3Vyc29yKCkKK3ByaW50IGNvbi5udW1jdXJzb3JzCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvY3JlYXRlZGIucHkgYi9Eb2MvbGliL3NxbGl0ZTMvY3JlYXRlZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyOTUwYgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9jcmVhdGVkYi5weQpAQCAtMCwwICsxLDI4IEBACisjIE5vdCByZWZlcmVuY2VkIGZyb20gdGhlIGRvY3VtZW50YXRpb24sIGJ1dCBidWlsZHMgdGhlIGRhdGFiYXNlIGZpbGUgdGhlIG90aGVyCisjIGNvZGUgc25pcHBldHMgZXhwZWN0LgorCitpbXBvcnQgc3FsaXRlMworaW1wb3J0IG9zCisKK0RCX0ZJTEUgPSAibXlkYiIKKworaWYgb3MucGF0aC5leGlzdHMoREJfRklMRSk6CisgICAgb3MucmVtb3ZlKERCX0ZJTEUpCisKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdChEQl9GSUxFKQorY3VyID0gY29uLmN1cnNvcigpCitjdXIuZXhlY3V0ZSgiIiIKKyAgICAgICAgY3JlYXRlIHRhYmxlIHBlb3BsZQorICAgICAgICAoCisgICAgICAgICAgbmFtZV9sYXN0ICAgICAgdmFyY2hhcigyMCksCisgICAgICAgICAgYWdlICAgICAgICAgICAgaW50ZWdlcgorICAgICAgICApCisgICAgICAgICIiIikKKworY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHBlb3BsZSAobmFtZV9sYXN0LCBhZ2UpIHZhbHVlcyAoJ1llbHRzaW4nLCAgIDcyKSIpCitjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gcGVvcGxlIChuYW1lX2xhc3QsIGFnZSkgdmFsdWVzICgnUHV0aW4nLCAgICAgNTEpIikKKworY29uLmNvbW1pdCgpCisKK2N1ci5jbG9zZSgpCitjb24uY2xvc2UoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2V4ZWNzcWxfZmV0Y2hvbmVyb3cucHkgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3NxbF9mZXRjaG9uZXJvdy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQ0ZWNmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9zcWxpdGUzL2V4ZWNzcWxfZmV0Y2hvbmVyb3cucHkKQEAgLTAsMCArMSwxNyBAQAoraW1wb3J0IHNxbGl0ZTMKKworY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKKworY3VyID0gY29uLmN1cnNvcigpCitTRUxFQ1QgPSAic2VsZWN0IG5hbWVfbGFzdCwgYWdlIGZyb20gcGVvcGxlIG9yZGVyIGJ5IGFnZSwgbmFtZV9sYXN0IgorCisjIDEuIEl0ZXJhdGUgb3ZlciB0aGUgcm93cyBhdmFpbGFibGUgZnJvbSB0aGUgY3Vyc29yLCB1bnBhY2tpbmcgdGhlCisjIHJlc3VsdGluZyBzZXF1ZW5jZXMgdG8geWllbGQgdGhlaXIgZWxlbWVudHMgKG5hbWVfbGFzdCwgYWdlKToKK2N1ci5leGVjdXRlKFNFTEVDVCkKK2ZvciAobmFtZV9sYXN0LCBhZ2UpIGluIGN1cjoKKyAgICBwcmludCAnJXMgaXMgJWQgeWVhcnMgb2xkLicgJSAobmFtZV9sYXN0LCBhZ2UpCisKKyMgMi4gRXF1aXZhbGVudGx5OgorY3VyLmV4ZWN1dGUoU0VMRUNUKQorZm9yIHJvdyBpbiBjdXI6CisgICAgcHJpbnQgJyVzIGlzICVkIHllYXJzIG9sZC4nICUgKHJvd1swXSwgcm93WzFdKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2V4ZWNzcWxfcHJpbnRhbGxfMS5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjc3FsX3ByaW50YWxsXzEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI3ZDczNQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9leGVjc3FsX3ByaW50YWxsXzEucHkKQEAgLTAsMCArMSwxMyBAQAoraW1wb3J0IHNxbGl0ZTMKKworIyBDcmVhdGUgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZSBmaWxlICJteWRiIjoKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgibXlkYiIpCisKKyMgR2V0IGEgQ3Vyc29yIG9iamVjdCB0aGF0IG9wZXJhdGVzIGluIHRoZSBjb250ZXh0IG9mIENvbm5lY3Rpb24gY29uOgorY3VyID0gY29uLmN1cnNvcigpCisKKyMgRXhlY3V0ZSB0aGUgU0VMRUNUIHN0YXRlbWVudDoKK2N1ci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHBlb3BsZSBvcmRlciBieSBhZ2UiKQorCisjIFJldHJpZXZlIGFsbCByb3dzIGFzIGEgc2VxdWVuY2UgYW5kIHByaW50IHRoYXQgc2VxdWVuY2U6CitwcmludCBjdXIuZmV0Y2hhbGwoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2V4ZWN1dGVfMS5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzNzg0ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzEucHkKQEAgLTAsMCArMSwxMSBAQAoraW1wb3J0IHNxbGl0ZTMKKworY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKKworY3VyID0gY29uLmN1cnNvcigpCisKK3dobyA9ICJZZWx0c2luIgorYWdlID0gNzIKKworY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lX2xhc3QsIGFnZSBmcm9tIHBlb3BsZSB3aGVyZSBuYW1lX2xhc3Q9PyBhbmQgYWdlPT8iLCAod2hvLCBhZ2UpKQorcHJpbnQgY3VyLmZldGNob25lKCkKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzIucHkgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZV8yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmM4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZV8yLnB5CkBAIC0wLDAgKzEsMTIgQEAKK2ltcG9ydCBzcWxpdGUzCisKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgibXlkYiIpCisKK2N1ciA9IGNvbi5jdXJzb3IoKQorCit3aG8gPSAiWWVsdHNpbiIKK2FnZSA9IDcyCisKK2N1ci5leGVjdXRlKCJzZWxlY3QgbmFtZV9sYXN0LCBhZ2UgZnJvbSBwZW9wbGUgd2hlcmUgbmFtZV9sYXN0PTp3aG8gYW5kIGFnZT06YWdlIiwKKyAgICB7IndobyI6IHdobywgImFnZSI6IGFnZX0pCitwcmludCBjdXIuZmV0Y2hvbmUoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL2V4ZWN1dGVfMy5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0NjIxZgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlXzMucHkKQEAgLTAsMCArMSwxMiBAQAoraW1wb3J0IHNxbGl0ZTMKKworY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKKworY3VyID0gY29uLmN1cnNvcigpCisKK3dobyA9ICJZZWx0c2luIgorYWdlID0gNzIKKworY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lX2xhc3QsIGFnZSBmcm9tIHBlb3BsZSB3aGVyZSBuYW1lX2xhc3Q9OndobyBhbmQgYWdlPTphZ2UiLAorICAgIGxvY2FscygpKQorcHJpbnQgY3VyLmZldGNob25lKCkKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlbWFueV8xLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2V4ZWN1dGVtYW55XzEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzNTdjNQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlbWFueV8xLnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBzcWxpdGUzCisKK2NsYXNzIEl0ZXJDaGFyczoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY291bnQgPSBvcmQoJ2EnKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY291bnQgPiBvcmQoJ3onKToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgc2VsZi5jb3VudCArPSAxCisgICAgICAgIHJldHVybiAoY2hyKHNlbGYuY291bnQgLSAxKSwpICMgdGhpcyBpcyBhIDEtdHVwbGUKKworY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIpCitjdXIgPSBjb24uY3Vyc29yKCkKK2N1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgY2hhcmFjdGVycyhjKSIpCisKK3RoZUl0ZXIgPSBJdGVyQ2hhcnMoKQorY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byBjaGFyYWN0ZXJzKGMpIHZhbHVlcyAoPykiLCB0aGVJdGVyKQorCitjdXIuZXhlY3V0ZSgic2VsZWN0IGMgZnJvbSBjaGFyYWN0ZXJzIikKK3ByaW50IGN1ci5mZXRjaGFsbCgpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMi5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlbWFueV8yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODU3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZW1hbnlfMi5weQpAQCAtMCwwICsxLDE1IEBACitpbXBvcnQgc3FsaXRlMworCitkZWYgY2hhcl9nZW5lcmF0b3IoKToKKyAgICBpbXBvcnQgc3RyaW5nCisgICAgZm9yIGMgaW4gc3RyaW5nLmxldHRlcnNbOjI2XToKKyAgICAgICAgeWllbGQgKGMsKQorCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKK2N1ciA9IGNvbi5jdXJzb3IoKQorY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBjaGFyYWN0ZXJzKGMpIikKKworY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byBjaGFyYWN0ZXJzKGMpIHZhbHVlcyAoPykiLCBjaGFyX2dlbmVyYXRvcigpKQorCitjdXIuZXhlY3V0ZSgic2VsZWN0IGMgZnJvbSBjaGFyYWN0ZXJzIikKK3ByaW50IGN1ci5mZXRjaGFsbCgpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZXNjcmlwdC5weSBiL0RvYy9saWIvc3FsaXRlMy9leGVjdXRlc2NyaXB0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTViNDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvZXhlY3V0ZXNjcmlwdC5weQpAQCAtMCwwICsxLDI0IEBACitpbXBvcnQgc3FsaXRlMworCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKK2N1ciA9IGNvbi5jdXJzb3IoKQorY3VyLmV4ZWN1dGVzY3JpcHQoIiIiCisgICAgY3JlYXRlIHRhYmxlIHBlcnNvbigKKyAgICAgICAgZmlyc3RuYW1lLAorICAgICAgICBsYXN0bmFtZSwKKyAgICAgICAgYWdlCisgICAgKTsKKworICAgIGNyZWF0ZSB0YWJsZSBib29rKAorICAgICAgICB0aXRsZSwKKyAgICAgICAgYXV0aG9yLAorICAgICAgICBwdWJsaXNoZWQKKyAgICApOworCisgICAgaW5zZXJ0IGludG8gYm9vayh0aXRsZSwgYXV0aG9yLCBwdWJsaXNoZWQpCisgICAgdmFsdWVzICgKKyAgICAgICAgJ0RpcmsgR2VudGx5JydzIEhvbGlzdGljIERldGVjdGl2ZSBBZ2VuY3kKKyAgICAgICAgJ0RvdWdsYXMgQWRhbXMnLAorICAgICAgICAxOTg3CisgICAgKTsKKyAgICAiIiIpCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvaW5zZXJ0X21vcmVfcGVvcGxlLnB5IGIvRG9jL2xpYi9zcWxpdGUzL2luc2VydF9tb3JlX3Blb3BsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJjNzllCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9zcWxpdGUzL2luc2VydF9tb3JlX3Blb3BsZS5weQpAQCAtMCwwICsxLDE2IEBACitpbXBvcnQgc3FsaXRlMworCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIm15ZGIiKQorCitjdXIgPSBjb24uY3Vyc29yKCkKKworbmV3UGVvcGxlID0gKAorICAgICgnTGViZWQnICAgICAgICwgNTMpLAorICAgICgnWmhpcmlub3Zza3knICwgNTcpLAorICApCisKK2ZvciBwZXJzb24gaW4gbmV3UGVvcGxlOgorICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byBwZW9wbGUgKG5hbWVfbGFzdCwgYWdlKSB2YWx1ZXMgKD8sID8pIiwgcGVyc29uKQorCisjIFRoZSBjaGFuZ2VzIHdpbGwgbm90IGJlIHNhdmVkIHVubGVzcyB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIGV4cGxpY2l0bHk6Citjb24uY29tbWl0KCkKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9tZDVmdW5jLnB5IGIvRG9jL2xpYi9zcWxpdGUzL21kNWZ1bmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2OTY4NwotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9tZDVmdW5jLnB5CkBAIC0wLDAgKzEsMTEgQEAKK2ltcG9ydCBzcWxpdGUzCitpbXBvcnQgbWQ1CisKK2RlZiBtZDVzdW0odCk6CisgICAgcmV0dXJuIG1kNS5tZDUodCkuaGV4ZGlnZXN0KCkKKworY29uID0gc3FsaXRlMy5jb25uZWN0KCI6bWVtb3J5OiIpCitjb24uY3JlYXRlX2Z1bmN0aW9uKCJtZDUiLCAxLCBtZDVzdW0pCitjdXIgPSBjb24uY3Vyc29yKCkKK2N1ci5leGVjdXRlKCJzZWxlY3QgbWQ1KD8pIiwgKCJmb28iLCkpCitwcmludCBjdXIuZmV0Y2hvbmUoKVswXQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL215c3VtYWdnci5weSBiL0RvYy9saWIvc3FsaXRlMy9teXN1bWFnZ3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwY2Q1NQotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9teXN1bWFnZ3IucHkKQEAgLTAsMCArMSwyMCBAQAoraW1wb3J0IHNxbGl0ZTMKKworY2xhc3MgTXlTdW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgZGVmIHN0ZXAoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLmNvdW50ICs9IHZhbHVlCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvdW50CisKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQorY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm15c3VtIiwgMSwgTXlTdW0pCitjdXIgPSBjb24uY3Vyc29yKCkKK2N1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCitjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDEpIikKK2N1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoMikiKQorY3VyLmV4ZWN1dGUoInNlbGVjdCBteXN1bShpKSBmcm9tIHRlc3QiKQorcHJpbnQgY3VyLmZldGNob25lKClbMF0KZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9wYXJzZV9jb2xuYW1lcy5weSBiL0RvYy9saWIvc3FsaXRlMy9wYXJzZV9jb2xuYW1lcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2RlZDAwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9zcWxpdGUzL3BhcnNlX2NvbG5hbWVzLnB5CkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0IHNxbGl0ZTMKK2ltcG9ydCBkYXRldGltZQorCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZTMuUEFSU0VfQ09MTkFNRVMpCitjdXIgPSBjb24uY3Vyc29yKCkKK2N1ci5leGVjdXRlKCdzZWxlY3QgPyBhcyAieCBbdGltZXN0YW1wXSInLCAoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCksKSkKK2R0ID0gY3VyLmZldGNob25lKClbMF0KK3ByaW50IGR0LCB0eXBlKGR0KQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL3B5c3FsaXRlX2RhdGV0aW1lLnB5IGIvRG9jL2xpYi9zcWxpdGUzL3B5c3FsaXRlX2RhdGV0aW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTRiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvcHlzcWxpdGVfZGF0ZXRpbWUucHkKQEAgLTAsMCArMSwyMCBAQAoraW1wb3J0IHNxbGl0ZTMKK2ltcG9ydCBkYXRldGltZQorCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZTMuUEFSU0VfREVDTFRZUEVTfHNxbGl0ZTMuUEFSU0VfQ09MTkFNRVMpCitjdXIgPSBjb24uY3Vyc29yKCkKK2N1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChkIGRhdGUsIHRzIHRpbWVzdGFtcCkiKQorCit0b2RheSA9IGRhdGV0aW1lLmRhdGUudG9kYXkoKQorbm93ID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKKworY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZCwgdHMpIHZhbHVlcyAoPywgPykiLCAodG9kYXksIG5vdykpCitjdXIuZXhlY3V0ZSgic2VsZWN0IGQsIHRzIGZyb20gdGVzdCIpCityb3cgPSBjdXIuZmV0Y2hvbmUoKQorcHJpbnQgdG9kYXksICI9PiIsIHJvd1swXSwgdHlwZShyb3dbMF0pCitwcmludCBub3csICI9PiIsIHJvd1sxXSwgdHlwZShyb3dbMV0pCisKK2N1ci5leGVjdXRlKCdzZWxlY3QgY3VycmVudF9kYXRlIGFzICJkIFtkYXRlXSIsIGN1cnJlbnRfdGltZXN0YW1wIGFzICJ0cyBbdGltZXN0YW1wXSInKQorcm93ID0gY3VyLmZldGNob25lKCkKK3ByaW50ICJjdXJyZW50X2RhdGUiLCByb3dbMF0sIHR5cGUocm93WzBdKQorcHJpbnQgImN1cnJlbnRfdGltZXN0YW1wIiwgcm93WzFdLCB0eXBlKHJvd1sxXSkKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9yb3dfZmFjdG9yeS5weSBiL0RvYy9saWIvc3FsaXRlMy9yb3dfZmFjdG9yeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDY3NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9zcWxpdGUzL3Jvd19mYWN0b3J5LnB5CkBAIC0wLDAgKzEsMTMgQEAKK2ltcG9ydCBzcWxpdGUzCisKK2RlZiBkaWN0X2ZhY3RvcnkoY3Vyc29yLCByb3cpOgorICAgIGQgPSB7fQorICAgIGZvciBpZHgsIGNvbCBpbiBlbnVtZXJhdGUoY3Vyc29yLmRlc2NyaXB0aW9uKToKKyAgICAgICAgZFtjb2xbMF1dID0gcm93W2lkeF0KKyAgICByZXR1cm4gZAorCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIjptZW1vcnk6IikKK2Nvbi5yb3dfZmFjdG9yeSA9IGRpY3RfZmFjdG9yeQorY3VyID0gY29uLmN1cnNvcigpCitjdXIuZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSIpCitwcmludCBjdXIuZmV0Y2hvbmUoKVsiYSJdCmRpZmYgLS1naXQgYS9Eb2MvbGliL3NxbGl0ZTMvcm93Y2xhc3MucHkgYi9Eb2MvbGliL3NxbGl0ZTMvcm93Y2xhc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhMGI4NwotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9yb3djbGFzcy5weQpAQCAtMCwwICsxLDEyIEBACitpbXBvcnQgc3FsaXRlMworCitjb24gPSBzcWxpdGUzLmNvbm5lY3QoIm15ZGIiKQorY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKworY3VyID0gY29uLmN1cnNvcigpCitjdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWVfbGFzdCwgYWdlIGZyb20gcGVvcGxlIikKK2ZvciByb3cgaW4gY3VyOgorICAgIGFzc2VydCByb3dbMF0gPT0gcm93WyJuYW1lX2xhc3QiXQorICAgIGFzc2VydCByb3dbIm5hbWVfbGFzdCJdID09IHJvd1sibkFtRV9sQXNUIl0KKyAgICBhc3NlcnQgcm93WzFdID09IHJvd1siYWdlIl0KKyAgICBhc3NlcnQgcm93WzFdID09IHJvd1siQWdFIl0KZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9zaGFyZWRfY2FjaGUucHkgYi9Eb2MvbGliL3NxbGl0ZTMvc2hhcmVkX2NhY2hlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMWQ3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvc2hhcmVkX2NhY2hlLnB5CkBAIC0wLDAgKzEsNiBAQAoraW1wb3J0IHNxbGl0ZTMKKworIyBUaGUgc2hhcmVkIGNhY2hlIGlzIG9ubHkgYXZhaWxhYmxlIGluIFNRTGl0ZSB2ZXJzaW9ucyAzLjMuMyBvciBsYXRlcgorIyBTZWUgdGhlIFNRTGl0ZSBkb2N1bWVudGF0b24gZm9yIGRldGFpbHMuCisKK3NxbGl0ZTMuZW5hYmxlX3NoYXJlZF9jYWNoZShUcnVlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9zcWxpdGUzL3Nob3J0Y3V0X21ldGhvZHMucHkgYi9Eb2MvbGliL3NxbGl0ZTMvc2hvcnRjdXRfbWV0aG9kcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmVkNGIzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9zcWxpdGUzL3Nob3J0Y3V0X21ldGhvZHMucHkKQEAgLTAsMCArMSwyMSBAQAoraW1wb3J0IHNxbGl0ZTMKKworcGVyc29ucyA9IFsKKyAgICAoIkh1Z28iLCAiQm9zcyIpLAorICAgICgiQ2FsdmluIiwgIktsZWluIikKKyAgICBdCisKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQorCisjIENyZWF0ZSB0aGUgdGFibGUKK2Nvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgcGVyc29uKGZpcnN0bmFtZSwgbGFzdG5hbWUpIikKKworIyBGaWxsIHRoZSB0YWJsZQorY29uLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byBwZXJzb24oZmlyc3RuYW1lLCBsYXN0bmFtZSkgdmFsdWVzICg/LCA/KSIsIHBlcnNvbnMpCisKKyMgUHJpbnQgdGhlIHRhYmxlIGNvbnRlbnRzCitmb3Igcm93IGluIGNvbi5leGVjdXRlKCJzZWxlY3QgZmlyc3RuYW1lLCBsYXN0bmFtZSBmcm9tIHBlcnNvbiIpOgorICAgIHByaW50IHJvdworCisjIFVzaW5nIGEgZHVtbXkgV0hFUkUgY2xhdXNlIHRvIG5vdCBsZXQgU1FMaXRlIHRha2UgdGhlIHNob3J0Y3V0IHRhYmxlIGRlbGV0ZXMuCitwcmludCAiSSBqdXN0IGRlbGV0ZWQiLCBjb24uZXhlY3V0ZSgiZGVsZXRlIGZyb20gcGVyc29uIHdoZXJlIDE9MSIpLnJvd2NvdW50LCAicm93cyIKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9zaW1wbGVfdGFibGVwcmludGVyLnB5IGIvRG9jL2xpYi9zcWxpdGUzL3NpbXBsZV90YWJsZXByaW50ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlYTZhMgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWIvc3FsaXRlMy9zaW1wbGVfdGFibGVwcmludGVyLnB5CkBAIC0wLDAgKzEsMjYgQEAKK2ltcG9ydCBzcWxpdGUzCisKK0ZJRUxEX01BWF9XSURUSCA9IDIwCitUQUJMRV9OQU1FID0gJ3Blb3BsZScKK1NFTEVDVCA9ICdzZWxlY3QgKiBmcm9tICVzIG9yZGVyIGJ5IGFnZSwgbmFtZV9sYXN0JyAlIFRBQkxFX05BTUUKKworY29uID0gc3FsaXRlMy5jb25uZWN0KCJteWRiIikKKworY3VyID0gY29uLmN1cnNvcigpCitjdXIuZXhlY3V0ZShTRUxFQ1QpCisKKyMgUHJpbnQgYSBoZWFkZXIuCitmb3IgZmllbGREZXNjIGluIGN1ci5kZXNjcmlwdGlvbjoKKyAgICBwcmludCBmaWVsZERlc2NbMF0ubGp1c3QoRklFTERfTUFYX1dJRFRIKSAsCitwcmludCAjIEZpbmlzaCB0aGUgaGVhZGVyIHdpdGggYSBuZXdsaW5lLgorcHJpbnQgJy0nICogNzgKKworIyBGb3IgZWFjaCByb3csIHByaW50IHRoZSB2YWx1ZSBvZiBlYWNoIGZpZWxkIGxlZnQtanVzdGlmaWVkIHdpdGhpbgorIyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCBvZiB0aGF0IGZpZWxkLgorZmllbGRJbmRpY2VzID0gcmFuZ2UobGVuKGN1ci5kZXNjcmlwdGlvbikpCitmb3Igcm93IGluIGN1cjoKKyAgICBmb3IgZmllbGRJbmRleCBpbiBmaWVsZEluZGljZXM6CisgICAgICAgIGZpZWxkVmFsdWUgPSBzdHIocm93W2ZpZWxkSW5kZXhdKQorICAgICAgICBwcmludCBmaWVsZFZhbHVlLmxqdXN0KEZJRUxEX01BWF9XSURUSCkgLAorCisgICAgcHJpbnQgIyBGaW5pc2ggdGhlIHJvdyB3aXRoIGEgbmV3bGluZS4KZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy90ZXh0X2ZhY3RvcnkucHkgYi9Eb2MvbGliL3NxbGl0ZTMvdGV4dF9mYWN0b3J5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMTU3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL3NxbGl0ZTMvdGV4dF9mYWN0b3J5LnB5CkBAIC0wLDAgKzEsNDIgQEAKK2ltcG9ydCBzcWxpdGUzCisKK2NvbiA9IHNxbGl0ZTMuY29ubmVjdCgiOm1lbW9yeToiKQorY3VyID0gY29uLmN1cnNvcigpCisKKyMgQ3JlYXRlIHRoZSB0YWJsZQorY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBwZXJzb24obGFzdG5hbWUsIGZpcnN0bmFtZSkiKQorCitBVVNUUklBID0gdSJceGQ2c3RlcnJlaWNoIgorCisjIGJ5IGRlZmF1bHQsIHJvd3MgYXJlIHJldHVybmVkIGFzIFVuaWNvZGUKK2N1ci5leGVjdXRlKCJzZWxlY3QgPyIsIChBVVNUUklBLCkpCityb3cgPSBjdXIuZmV0Y2hvbmUoKQorYXNzZXJ0IHJvd1swXSA9PSBBVVNUUklBCisKKyMgYnV0IHdlIGNhbiBtYWtlIHB5c3FsaXRlIGFsd2F5cyByZXR1cm4gYnl0ZXN0cmluZ3MgLi4uCitjb24udGV4dF9mYWN0b3J5ID0gc3RyCitjdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoQVVTVFJJQSwpKQorcm93ID0gY3VyLmZldGNob25lKCkKK2Fzc2VydCB0eXBlKHJvd1swXSkgPT0gc3RyCisjIHRoZSBieXRlc3RyaW5ncyB3aWxsIGJlIGVuY29kZWQgaW4gVVRGLTgsIHVubGVzcyB5b3Ugc3RvcmVkIGdhcmJhZ2UgaW4gdGhlCisjIGRhdGFiYXNlIC4uLgorYXNzZXJ0IHJvd1swXSA9PSBBVVNUUklBLmVuY29kZSgidXRmLTgiKQorCisjIHdlIGNhbiBhbHNvIGltcGxlbWVudCBhIGN1c3RvbSB0ZXh0X2ZhY3RvcnkgLi4uCisjIGhlcmUgd2UgaW1wbGVtZW50IG9uZSB0aGF0IHdpbGwgaWdub3JlIFVuaWNvZGUgY2hhcmFjdGVycyB0aGF0IGNhbm5vdCBiZQorIyBkZWNvZGVkIGZyb20gVVRGLTgKK2Nvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogdW5pY29kZSh4LCAidXRmLTgiLCAiaWdub3JlIikKK2N1ci5leGVjdXRlKCJzZWxlY3QgPyIsICgidGhpcyBpcyBsYXRpbjEgYW5kIHdvdWxkIG5vcm1hbGx5IGNyZWF0ZSBlcnJvcnMiICsgdSJceGU0XHhmNlx4ZmMiLmVuY29kZSgibGF0aW4xIiksKSkKK3JvdyA9IGN1ci5mZXRjaG9uZSgpCithc3NlcnQgdHlwZShyb3dbMF0pID09IHVuaWNvZGUKKworIyBweXNxbGl0ZSBvZmZlcnMgYSBidWlsdGluIG9wdGltaXplZCB0ZXh0X2ZhY3RvcnkgdGhhdCB3aWxsIHJldHVybiBieXRlc3RyaW5nCisjIG9iamVjdHMsIGlmIHRoZSBkYXRhIGlzIGluIEFTQ0lJIG9ubHksIGFuZCBvdGhlcndpc2UgcmV0dXJuIHVuaWNvZGUgb2JqZWN0cworY29uLnRleHRfZmFjdG9yeSA9IHNxbGl0ZTMuT3B0aW1pemVkVW5pY29kZQorY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKEFVU1RSSUEsKSkKK3JvdyA9IGN1ci5mZXRjaG9uZSgpCithc3NlcnQgdHlwZShyb3dbMF0pID09IHVuaWNvZGUKKworY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKCJHZXJtYW55IiwpKQorcm93ID0gY3VyLmZldGNob25lKCkKK2Fzc2VydCB0eXBlKHJvd1swXSkgPT0gc3RyCmRpZmYgLS1naXQgYS9Eb2MvbWFjL3NjcmlwdGluZy50ZXggYi9Eb2MvbWFjL3NjcmlwdGluZy50ZXgKaW5kZXggYTZkNWRmNy4uNWVjNDk3OCAxMDA2NDQKLS0tIGEvRG9jL21hYy9zY3JpcHRpbmcudGV4CisrKyBiL0RvYy9tYWMvc2NyaXB0aW5nLnRleApAQCAtMTIsNyArMTIsNyBAQAogdGhlIGNvbmNlcHR1YWwgbW9kZWwgYW5kIHRoZSB0ZXJtaW5vbG9neSwgYW5kIGRvY3VtZW50cyB0aGUgc3RhbmRhcmQKIHN1aXRlLiBUaGUgIk9wZW4gU2NyaXB0aW5nIEFyY2hpdGVjdHVyZSIgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvIHVzZQogT1NBIGZyb20gYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lcnMgcG9pbnQgb2Ygdmlldy4gSW4gdGhlIEFwcGxlIEhlbHAKLVZpZXdlciB0aGVzZSBib29rIHNhcmUgbG9jYXRlZCBpbiB0aGUgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24sIENvcmUKK1ZpZXdlciB0aGVzZSBib29rcyBhcmUgbG9jYXRlZCBpbiB0aGUgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24sIENvcmUKIFRlY2hub2xvZ2llcyBzZWN0aW9uLgogCiAKQEAgLTQ5LDcgKzQ5LDcgQEAKIFRoZSBnZW5lcmF0ZWQgb3V0cHV0IGlzIGEgcGFja2FnZSB3aXRoIGEgbnVtYmVyIG9mIG1vZHVsZXMsIG9uZSBmb3IKIGV2ZXJ5IHN1aXRlIHVzZWQgaW4gdGhlIHByb2dyYW0gcGx1cyBhbiBcbW9kdWxle19faW5pdF9ffSBtb2R1bGUgdG8gZ2x1ZQogaXQgYWxsIHRvZ2V0aGVyLiBUaGUgUHl0aG9uIGluaGVyaXRhbmNlIGdyYXBoIGZvbGxvd3MgdGhlIEFwcGxlU2NyaXB0Ci1pbmhlcml0YW5jZSBncmFwaCwgc28gaWYgYSBwcm9ncmFtcyBkaWN0aW9uYXJ5IHNwZWNpZmllcyB0aGF0IGl0Citpbmhlcml0YW5jZSBncmFwaCwgc28gaWYgYSBwcm9ncmFtJ3MgZGljdGlvbmFyeSBzcGVjaWZpZXMgdGhhdCBpdAogaW5jbHVkZXMgc3VwcG9ydCBmb3IgdGhlIFN0YW5kYXJkIFN1aXRlLCBidXQgZXh0ZW5kcyBvbmUgb3IgdHdvIHZlcmJzCiB3aXRoIGV4dHJhIGFyZ3VtZW50cyB0aGVuIHRoZSBvdXRwdXQgc3VpdGUgd2lsbCBjb250YWluIGEgbW9kdWxlCiBcbW9kdWxle1N0YW5kYXJkX1N1aXRlfSB0aGF0IGltcG9ydHMgYW5kIHJlLWV4cG9ydHMgZXZlcnl0aGluZyBmcm9tCmRpZmYgLS1naXQgYS9Eb2MvcGVybC9sMmhpbml0LnBlcmwgYi9Eb2MvcGVybC9sMmhpbml0LnBlcmwKaW5kZXggODlkZWVkMC4uN2M1ZDEyMyAxMDA2NDQKLS0tIGEvRG9jL3BlcmwvbDJoaW5pdC5wZXJsCisrKyBiL0RvYy9wZXJsL2wyaGluaXQucGVybApAQCAtNCw3ICs0LDE3IEBACiAKIHVzZSBMMmhvczsKIAotJEhUTUxfVkVSU0lPTiA9IDQuMDsKKyRIVE1MX1ZFUlNJT04gPSA0LjAxOworJExPV0VSX0NBU0VfVEFHUyA9IDE7CiskTk9fRlJFTkNIX1FVT1RFUyA9IDE7CisKKyMgJycgaW4gXGNvZGV7Li4ufSBpcyBzdGlsbCBjb252ZXJ0ZWQsIHNvIHdlIGNhbid0IHVzZSB0aGlzIHlldC4KKyMkVVNFX0NVUkxZX1FVT1RFUyA9IDE7CisKKyMgRm9yY2UgVW5pY29kZSBzdXBwb3J0IHRvIGJlIGxvYWRlZDsgcmVxdWVzdCBVVEYtOCBvdXRwdXQuCitkb19yZXF1aXJlX2V4dGVuc2lvbigndW5pY29kZScpOworZG9fcmVxdWlyZV9leHRlbnNpb24oJ3V0ZjgnKTsKKyRIVE1MX09QVElPTlMgPSAndXRmOCc7CiAKICRNQVhfTElOS19ERVBUSCA9IDI7CiAkQUREUkVTUyA9ICcnOwpAQCAtMTA2LDYgKzExNiwxMyBAQAogICAgICAgICAkRU5WeydURVhJTlBVVFMnfSA9IHVuZGVmOwogICAgIH0KICAgICBwcmludCAiXG5TZXR0aW5nIFwkVEVYSU5QVVRTIHRvICRURVhJTlBVVFNcbiI7CisKKyAgICAjIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRvIGRlYWwgd2l0aCB0aGlzIGJvdGggaGVyZSBhbmQgYXQgdGhlIHRvcCwKKyAgICAjIGJ1dCB0aGlzIGlzIG5lZWRlZCB0byBhY3R1YWxseSBtYWtlIGl0IHdvcmsuCisgICAgZG9fcmVxdWlyZV9leHRlbnNpb24oJ3V0ZjgnKTsKKyAgICAkY2hhcnNldCA9ICR1dGY4X3N0cjsKKyAgICAkQ0hBUlNFVCA9ICR1dGY4X3N0cjsKKyAgICAkVVNFX1VURiA9IDE7CiB9CiAKIApkaWZmIC0tZ2l0IGEvRG9jL3BlcmwvcHl0aG9uLnBlcmwgYi9Eb2MvcGVybC9weXRob24ucGVybAppbmRleCA0MzdjNWNiLi5hYjkzYzdjIDEwMDY0NAotLS0gYS9Eb2MvcGVybC9weXRob24ucGVybAorKysgYi9Eb2MvcGVybC9weXRob24ucGVybApAQCAtNTMwLDcgKzUzMCw2IEBACiAKIHN1YiBuZXdfbGlua19uYW1lX2luZm8oKXsKICAgICBteSAkbmFtZSA9ICJsMmgtIiAuICsrJGdsb2JhbHN7J21heF9pZCd9OwotICAgIG15ICRhbmFtZSA9ICI8YSBpZD0nJG5hbWUnIHhtbDppZD0nJG5hbWUnPiI7CiAgICAgbXkgJGFocmVmID0gZ2VuX2xpbmsoJENVUlJFTlRfRklMRSwgJG5hbWUpOwogICAgIHJldHVybiAoJG5hbWUsICRhaHJlZik7CiB9CmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjIudGV4IGIvRG9jL3JlZi9yZWYyLnRleAppbmRleCAzNGU4YTllLi4yZWQ4YTVkIDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjIudGV4CisrKyBiL0RvYy9yZWYvcmVmMi50ZXgKQEAgLTMwOCwyMiArMzA4LDI4IEBACiBcaW5kZXh7cmVzZXJ2ZWQgd29yZH0KIAogXGJlZ2lue3ZlcmJhdGltfQotYW5kICAgICAgIGRlbCAgICAgICBmb3IgICAgICAgaXMgICAgICAgIHJhaXNlICAgIAotYXNzZXJ0ICAgIGVsaWYgICAgICBmcm9tICAgICAgbGFtYmRhICAgIHJldHVybiAgIAotYnJlYWsgICAgIGVsc2UgICAgICBnbG9iYWwgICAgbm90ICAgICAgIHRyeSAgICAgIAotY2xhc3MgICAgIGV4Y2VwdCAgICBpZiAgICAgICAgb3IgICAgICAgIHdoaWxlICAgIAotY29udGludWUgIGV4ZWMgICAgICBpbXBvcnQgICAgcGFzcyAgICAgIHlpZWxkICAgIAotZGVmICAgICAgIGZpbmFsbHkgICBpbiAgICAgICAgcHJpbnQgICAgICAgICAgICAgIAorYW5kICAgICAgIGRlbCAgICAgICBmcm9tICAgICAgbm90ICAgICAgIHdoaWxlICAgIAorYXMgICAgICAgIGVsaWYgICAgICBnbG9iYWwgICAgb3IgICAgICAgIHdpdGggICAgIAorYXNzZXJ0ICAgIGVsc2UgICAgICBpZiAgICAgICAgcGFzcyAgICAgIHlpZWxkICAgIAorYnJlYWsgICAgIGV4Y2VwdCAgICBpbXBvcnQgICAgcHJpbnQgICAgICAgICAgICAgIAorY2xhc3MgICAgIGV4ZWMgICAgICBpbiAgICAgICAgcmFpc2UgICAgICAgICAgICAgIAorY29udGludWUgIGZpbmFsbHkgICBpcyAgICAgICAgcmV0dXJuICAgICAgICAgICAgIAorZGVmICAgICAgIGZvciAgICAgICBsYW1iZGEgICAgdHJ5IAogXGVuZHt2ZXJiYXRpbX0KIAogJSBXaGVuIGFkZGluZyBrZXl3b3JkcywgdXNlIHJlc3dvcmRzLnB5IGZvciByZWZvcm1hdHRpbmcKIAotTm90ZSB0aGF0IGFsdGhvdWdoIHRoZSBpZGVudGlmaWVyIFxjb2Rle2FzfSBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZQotc3ludGF4IG9mIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50cywgaXQgaXMgbm90IGN1cnJlbnRseSBhIHJlc2VydmVkCi13b3JkLgorXHZlcnNpb25jaGFuZ2VkW1xjb25zdGFudHtOb25lfSBiZWNhbWUgYSBjb25zdGFudCBhbmQgaXMgbm93CityZWNvZ25pemVkIGJ5IHRoZSBjb21waWxlciBhcyBhIG5hbWUgZm9yIHRoZSBidWlsdC1pbiBvYmplY3QKK1xjb25zdGFudHtOb25lfS4gIEFsdGhvdWdoIGl0IGlzIG5vdCBhIGtleXdvcmQsIHlvdSBjYW5ub3QgYXNzaWduCithIGRpZmZlcmVudCBvYmplY3QgdG8gaXRdezIuNH0KIAotSW4gc29tZSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24sIHRoZSBpZGVudGlmaWVycyBcY29kZXthc30gYW5kCi1cY29kZXtOb25lfSB3aWxsIGJvdGggYmVjb21lIGtleXdvcmRzLgorXHZlcnNpb25jaGFuZ2VkW0JvdGggXGtleXdvcmR7YXN9IGFuZCBca2V5d29yZHt3aXRofSBhcmUgb25seSByZWNvZ25pemVkCit3aGVuIHRoZSBcY29kZXt3aXRoX3N0YXRlbWVudH0gZnV0dXJlIGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC4KK0l0IHdpbGwgYWx3YXlzIGJlIGVuYWJsZWQgaW4gUHl0aG9uIDIuNi4gIFNlZSBzZWN0aW9uflxyZWZ7d2l0aH0gZm9yCitkZXRhaWxzLiAgTm90ZSB0aGF0IHVzaW5nIFxrZXl3b3Jke2FzfSBhbmQgXGtleXdvcmR7d2l0aH0gYXMgaWRlbnRpZmllcnMKK3dpbGwgYWx3YXlzIGlzc3VlIGEgd2FybmluZywgZXZlbiB3aGVuIHRoZSBcY29kZXt3aXRoX3N0YXRlbWVudH0gZnV0dXJlCitkaXJlY3RpdmUgaXMgbm90IGluIGVmZmVjdF17Mi41fQogCiAKIFxzdWJzZWN0aW9ue1Jlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbGFiZWx7aWQtY2xhc3Nlc319CkBAIC02NTIsNyArNjU4LDcgQEAKIFxlbmR7dmVyYmF0aW19CiAKIE5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZQotXGNvZGV7LTF9IGlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIG9wZXJhdG9yCitcY29kZXstMX0gaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IKIFxjb2Rley19IGFuZCB0aGUgbGl0ZXJhbCBcY29kZXsxfS4KIAogCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjMudGV4IGIvRG9jL3JlZi9yZWYzLnRleAppbmRleCA5NjQwMTNmLi5kMGM4Y2NmIDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjMudGV4CisrKyBiL0RvYy9yZWYvcmVmMy50ZXgKQEAgLTE4NzUsOCArMTg3NSw4IEBACiBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIChcY29kZXsrfSwKIFxjb2Rley19LCBcY29kZXsqfSwgXGNvZGV7Ly99LCBcY29kZXtcJX0sCiBcZnVuY3Rpb257ZGl2bW9kKCl9XGJpZnVuY2luZGV4e2Rpdm1vZH0sCi1cZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30sIFxjb2RleyoqfSwgXGNvZGV7PH1cY29kZXs8fSwKLVxjb2Rlez59XGNvZGV7Pn0sIFxjb2Rle1wmfSwgXGNvZGV7XF59LCBcY29kZXt8fSkuICBGb3IgaW5zdGFuY2UsIHRvCitcZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30sIFxjb2RleyoqfSwgXGNvZGV7PDx9LAorXGNvZGV7Pj59LCBcY29kZXtcJn0sIFxjb2Rle1xefSwgXGNvZGV7fH0pLiAgRm9yIGluc3RhbmNlLCB0bwogZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gXHZhcnt4fVxjb2Rleyt9XHZhcnt5fSwgd2hlcmUgXHZhcnt4fSBpcyBhbgogaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiBcbWV0aG9ke19fYWRkX18oKX0gbWV0aG9kLAogXGNvZGV7XHZhcnt4fS5fX2FkZF9fKFx2YXJ7eX0pfSBpcyBjYWxsZWQuICBUaGUgXG1ldGhvZHtfX2Rpdm1vZF9fKCl9CkBAIC0xOTE1LDggKzE5MTUsOCBAQAogY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoXGNvZGV7K30sCiBcY29kZXstfSwgXGNvZGV7Kn0sIFxjb2Rley99LCBcY29kZXtcJX0sCiBcZnVuY3Rpb257ZGl2bW9kKCl9XGJpZnVuY2luZGV4e2Rpdm1vZH0sCi1cZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30sIFxjb2RleyoqfSwgXGNvZGV7PH1cY29kZXs8fSwKLVxjb2Rlez59XGNvZGV7Pn0sIFxjb2Rle1wmfSwgXGNvZGV7XF59LCBcY29kZXt8fSkgd2l0aCByZWZsZWN0ZWQKK1xmdW5jdGlvbntwb3coKX1cYmlmdW5jaW5kZXh7cG93fSwgXGNvZGV7Kip9LCBcY29kZXs8PH0sCitcY29kZXs+Pn0sIFxjb2Rle1wmfSwgXGNvZGV7XF59LCBcY29kZXt8fSkgd2l0aCByZWZsZWN0ZWQKIChzd2FwcGVkKSBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGxlZnQKIG9wZXJhbmQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24uICBGb3IgaW5zdGFuY2UsCiB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBcdmFye3h9XGNvZGV7LX1cdmFye3l9LCB3aGVyZSBcdmFye3l9IGlzIGFuCkBAIC0xOTQyLDcgKzE5NDIsNyBAQAogXG1ldGhvZGxpbmVbbnVtZXJpYyBvYmplY3Rde19faW9yX199e3NlbGYsIG90aGVyfQogVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWMKIG9wZXJhdGlvbnMgKFxjb2Rleys9fSwgXGNvZGV7LT19LCBcY29kZXsqPX0sIFxjb2Rley89fSwgXGNvZGV7XCU9fSwKLVxjb2RleyoqPX0sIFxjb2Rlezx9XGNvZGV7PD19LCBcY29kZXs+fVxjb2Rlez49fSwgXGNvZGV7XCY9fSwKK1xjb2RleyoqPX0sIFxjb2Rlezw8PX0sIFxjb2Rlez4+PX0sIFxjb2Rle1wmPX0sCiBcY29kZXtcdGV4dGFzY2lpY2lyY3VtPX0sIFxjb2Rle3w9fSkuICBUaGVzZSBtZXRob2RzIHNob3VsZCBhdHRlbXB0IHRvIGRvIHRoZQogb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgXHZhcntzZWxmfSkgYW5kIHJldHVybiB0aGUgcmVzdWx0ICh3aGljaAogY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCBcdmFye3NlbGZ9KS4gIElmIGEgc3BlY2lmaWMgbWV0aG9kCkBAIC0xOTgzLDkgKzE5ODMsOSBAQAogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bbnVtZXJpYyBvYmplY3Rde19faW5kZXhfX317c2VsZn0KLUNhbGxlZCB0byBpbXBsZW1lbnQgb3BlcmF0b3IuaW5kZXgoKS4gIEFsc28gY2FsbGVkIHdoZW5ldmVyIFB5dGhvbgotbmVlZHMgYW4gaW50ZWdlciBvYmplY3QgKHN1Y2ggYXMgaW4gc2xpY2luZykuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyCi0oaW50IG9yIGxvbmcpLgorQ2FsbGVkIHRvIGltcGxlbWVudCBcZnVuY3Rpb257b3BlcmF0b3IuaW5kZXgoKX0uICBBbHNvIGNhbGxlZCB3aGVuZXZlcgorUHl0aG9uIG5lZWRzIGFuIGludGVnZXIgb2JqZWN0IChzdWNoIGFzIGluIHNsaWNpbmcpLiAgTXVzdCByZXR1cm4gYW4KK2ludGVnZXIgKGludCBvciBsb25nKS4KIFx2ZXJzaW9uYWRkZWR7Mi41fQogXGVuZHttZXRob2RkZXNjfQogCkBAIC0yMTEyLDQ5ICsyMTEyLDQxIEBACiAKIFxlbmR7aXRlbWl6ZX0KIAotXHN1YnNlY3Rpb257Q29udGV4dCBNYW5hZ2VycyBhbmQgQ29udGV4dHNcbGFiZWx7Y29udGV4dC1tYW5hZ2Vyc319Citcc3Vic2VjdGlvbntXaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXGxhYmVse2NvbnRleHQtbWFuYWdlcnN9fQogCiBcdmVyc2lvbmFkZGVkezIuNX0KIAotQSBcZGZue2NvbnRleHQgbWFuYWdlcn0gaXMgYW4gb2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgZW50cnkgdG8sIGFuZCBleGl0Ci1mcm9tLCBhIFxkZm57Y29udGV4dH0gc3Vycm91bmRpbmcgYSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmUKLW5vcm1hbGx5IGludm9rZWQgdXNpbmcgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCAoZGVzY3JpYmVkIGluCi1zZWN0aW9uflxyZWZ7d2l0aH0pLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpcgotbWV0aG9kcy4KK0EgXGRmbntjb250ZXh0IG1hbmFnZXJ9IGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUKK2NvbnRleHQgdG8gYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSBca2V5d29yZHt3aXRofQorc3RhdGVtZW50LiBUaGUgY29udGV4dCBtYW5hZ2VyIGhhbmRsZXMgdGhlIGVudHJ5IGludG8sCithbmQgdGhlIGV4aXQgZnJvbSwgdGhlIGRlc2lyZWQgcnVudGltZSBjb250ZXh0IGZvciB0aGUgZXhlY3V0aW9uCitvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgbWFuYWdlcnMgYXJlIG5vcm1hbGx5IGludm9rZWQgdXNpbmcKK3RoZSBca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7d2l0aH0pLCBidXQKK2NhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIgbWV0aG9kcy4KKwogXHN0aW5kZXh7d2l0aH0KIFxpbmRleHtjb250ZXh0IG1hbmFnZXJ9Ci1caW5kZXh7Y29udGV4dH0KIAotVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzCi1raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkCi1maWxlcywgZXRjLgorVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kCityZXN0b3JpbmcgdmFyaW91cyBraW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZworcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZCBmaWxlcywgZXRjLgogCi1cYmVnaW57bWV0aG9kZGVzY31bY29udGV4dCBtYW5hZ2VyXXtfX2NvbnRleHRfX317c2VsZn0KLUludm9rZWQgd2hlbiB0aGUgb2JqZWN0IGlzIHVzZWQgYXMgdGhlIGNvbnRleHQgZXhwcmVzc2lvbiBvZiBhCi1ca2V5d29yZHt3aXRofSBzdGF0ZW1lbnQuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgaW1wbGVtZW50Ci1cbWV0aG9ke19fZW50ZXJfXygpfSBhbmQgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzLiAgU2ltcGxlIGNvbnRleHQKLW1hbmFnZXJzIHRoYXQgd2lzaCB0byBkaXJlY3RseQotaW1wbGVtZW50IFxtZXRob2R7X19lbnRlcl9fKCl9IGFuZCBcbWV0aG9ke19fZXhpdF9fKCl9IHNob3VsZCBqdXN0Ci1yZXR1cm4gXHZhcntzZWxmfS4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZQorYGBcdWxpbmt7Q29udGV4dCBUeXBlc317Li4vbGliL3R5cGVjb250ZXh0bWFuYWdlci5odG1sfScnIGluIHRoZQorXGNpdGV0aXRsZVsuLi9saWIvbGliLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0uCiAKLUNvbnRleHQgbWFuYWdlcnMgd3JpdHRlbiBpbiBQeXRob24gY2FuIGFsc28gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHVzaW5nCi1hIGdlbmVyYXRvciBmdW5jdGlvbiBkZWNvcmF0ZWQgd2l0aCB0aGUKLVxmdW5jdGlvbntjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyfSBkZWNvcmF0b3IsIGFzIHRoaXMgY2FuIGJlIHNpbXBsZXIKLXRoYW4gd3JpdGluZyBpbmRpdmlkdWFsIFxtZXRob2R7X19lbnRlcl9fKCl9IGFuZCBcbWV0aG9ke19fZXhpdF9fKCl9Ci1tZXRob2RzIHdoZW4gdGhlIHN0YXRlIHRvIGJlIG1hbmFnZWQgaXMgY29tcGxleC4KK1xiZWdpbnttZXRob2RkZXNjfVtjb250ZXh0IG1hbmFnZXJde19fZW50ZXJfX317c2VsZn0KK0VudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIFxrZXl3b3Jke3dpdGh9CitzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocykKK3NwZWNpZmllZCBpbiB0aGUgXGtleXdvcmR7YXN9IGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuCiBcZW5ke21ldGhvZGRlc2N9CiAKLVxiZWdpbnttZXRob2RkZXNjfVtjb250ZXh0XXtfX2VudGVyX199e3NlbGZ9Ci1FbnRlciB0aGUgY29udGV4dCBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0LiBUaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50Ci13aWxsIGJpbmQgdGhpcyBtZXRob2QncyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKSBzcGVjaWZpZWQgaW4gdGhlCi1ca2V5d29yZHthc30gY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRleHRde19fZXhpdF9ffXtleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2t9Ci1FeGl0IHRoZSBjb250ZXh0IGRlZmluZWQgYnkgdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzIGRlc2NyaWJlIHRoZQotZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlIGV4aXRlZC4gSWYgdGhlIGNvbnRleHQgd2FzCi1leGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbCBiZQotXGNvbnN0YW50e05vbmV9LgorXGJlZ2lue21ldGhvZGRlc2N9W2NvbnRleHQgbWFuYWdlcl17X19leGl0X199Cit7c2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrfQorRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzCitkZXNjcmliZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlIGV4aXRlZC4gSWYKK3RoZSBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMKK3dpbGwgYmUgXGNvbnN0YW50e05vbmV9LgogCiBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGUKIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGQgcmV0dXJuIGEKZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmNC50ZXggYi9Eb2MvcmVmL3JlZjQudGV4CmluZGV4IDZhM2E0ZWYuLmRjZGM4MjMgMTAwNjQ0Ci0tLSBhL0RvYy9yZWYvcmVmNC50ZXgKKysrIGIvRG9jL3JlZi9yZWY0LnRleApAQCAtMTI3LDcgKzEyNyw3IEBACiAKIElmIHRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIFxzYW1we2ltcG9ydCAqfSAtLS0gaXMgdXNlZCBpbiBhCiBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGggZnJlZQotdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIFN5bnRheEVycm9yLgordmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIFxleGNlcHRpb257U3ludGF4RXJyb3J9LgogCiBJZiBca2V5d29yZHtleGVjfSBpcyB1c2VkIGluIGEgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvcgogaXMgYSBuZXN0ZWQgYmxvY2sgd2l0aCBmcmVlIHZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYQpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWY1LnRleCBiL0RvYy9yZWYvcmVmNS50ZXgKaW5kZXggMWYyZGM1ZS4uODlmOTk3NyAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWY1LnRleAorKysgYi9Eb2MvcmVmL3JlZjUudGV4CkBAIC0yMiw5ICsyMiw5IEBACiAKIFdoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZQogYGB0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCcnIHRoZQotYXJndW1lbnRzIGFyZSBjb2VyY2VkIHVzaW5nIHRoZSBjb2VyY2lvbiBydWxlcyBsaXN0ZWQgYXQgdGhlIGVuZCBvZgotY2hhcHRlciBccmVme2RhdGFtb2RlbH0uICBJZiBib3RoIGFyZ3VtZW50cyBhcmUgc3RhbmRhcmQgbnVtZXJpYwotdHlwZXMsIHRoZSBmb2xsb3dpbmcgY29lcmNpb25zIGFyZSBhcHBsaWVkOgorYXJndW1lbnRzIGFyZSBjb2VyY2VkIHVzaW5nIHRoZSBjb2VyY2lvbiBydWxlcyBsaXN0ZWQgYXQKK35ccmVme2NvZXJjaW9uLXJ1bGVzfS4gIElmIGJvdGggYXJndW1lbnRzIGFyZSBzdGFuZGFyZCBudW1lcmljIHR5cGVzLAordGhlIGZvbGxvd2luZyBjb2VyY2lvbnMgYXJlIGFwcGxpZWQ6CiAKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0JSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQKQEAgLTM5MSw3ICszOTEsOCBAQAogCiBBIHNsaWNpbmcgc2VsZWN0cyBhIHJhbmdlIG9mIGl0ZW1zIGluIGEgc2VxdWVuY2Ugb2JqZWN0IChlLmcuLCBhCiBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgYXMKLXRhcmdldHMgaW4gYXNzaWdubWVudCBvciBkZWwgc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGEgc2xpY2luZzoKK3RhcmdldHMgaW4gYXNzaWdubWVudCBvciBca2V5d29yZHtkZWx9IHN0YXRlbWVudHMuICBUaGUgc3ludGF4IGZvciBhCitzbGljaW5nOgogXG9iaW5kZXh7c2VxdWVuY2V9CiBcb2JpbmRleHtzdHJpbmd9CiBcb2JpbmRleHt0dXBsZX0KQEAgLTExNTgsNyArMTE1OSw3IEBACiAgIFxobGluZQogICAgIFxsaW5laWl7XGNvZGV7XCZ9fQkJCQl7Qml0d2lzZSBBTkR9CiAgIFxobGluZQotICAgIFxsaW5laWl7XGNvZGV7PH1cY29kZXs8fSwgXGNvZGV7Pn1cY29kZXs+fX0Je1NoaWZ0c30KKyAgICBcbGluZWlpe1xjb2Rlezw8fSwgXGNvZGV7Pj59fQkJe1NoaWZ0c30KICAgXGhsaW5lCiAgICAgXGxpbmVpaXtcY29kZXsrfSwgXGNvZGV7LX19e0FkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbn0KICAgXGhsaW5lCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjYudGV4IGIvRG9jL3JlZi9yZWY2LnRleAppbmRleCAxZWIxMjU4Li4wNGRiMDEzIDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjYudGV4CisrKyBiL0RvYy9yZWYvcmVmNi50ZXgKQEAgLTM3Nyw3ICszNzcsNyBAQAogXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQogICBccHJvZHVjdGlvbntwcmludF9zdG10fQogICAgICAgICAgICAgIHsicHJpbnQiICggXG9wdGlvbmFse1x0b2tlbntleHByZXNzaW9ufSAoIiwiIFx0b2tlbntleHByZXNzaW9ufSkqIFxvcHRpb25hbHsiLCJ9fX0KLSAgXHByb2R1Y3Rpb25jb250e3wgIj5cY29kZXs+fSIgXHRva2Vue2V4cHJlc3Npb259CisgIFxwcm9kdWN0aW9uY29udHt8ICI+PiIgXHRva2Vue2V4cHJlc3Npb259CiAgICAgICAgICAgICAgICAgICBcb3B0aW9uYWx7KCIsIiBcdG9rZW57ZXhwcmVzc2lvbn0pKyBcb3B0aW9uYWx7IiwifX0gKX0KIFxlbmR7cHJvZHVjdGlvbmxpc3R9CiAKQEAgLTQxNyw3ICs0MTcsNyBAQAogXGtleXdvcmR7cHJpbnR9IGFsc28gaGFzIGFuIGV4dGVuZGVkXGluZGV4e2V4dGVuZGVkIHByaW50IHN0YXRlbWVudH0KIGZvcm0sIGRlZmluZWQgYnkgdGhlIHNlY29uZCBwb3J0aW9uIG9mIHRoZSBzeW50YXggZGVzY3JpYmVkIGFib3ZlLgogVGhpcyBmb3JtIGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBgYFxrZXl3b3Jke3ByaW50fSBjaGV2cm9uLicnCi1JbiB0aGlzIGZvcm0sIHRoZSBmaXJzdCBleHByZXNzaW9uIGFmdGVyIHRoZSBcY29kZXs+fVxjb2Rlez59IG11c3QKK0luIHRoaXMgZm9ybSwgdGhlIGZpcnN0IGV4cHJlc3Npb24gYWZ0ZXIgdGhlIFxjb2Rlez4+fSBtdXN0CiBldmFsdWF0ZSB0byBhIGBgZmlsZS1saWtlJycgb2JqZWN0LCBzcGVjaWZpY2FsbHkgYW4gb2JqZWN0IHRoYXQgaGFzIGEKIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIGFzIGRlc2NyaWJlZCBhYm92ZS4gIFdpdGggdGhpcyBleHRlbmRlZCBmb3JtLAogdGhlIHN1YnNlcXVlbnQgZXhwcmVzc2lvbnMgYXJlIHByaW50ZWQgdG8gdGhpcyBmaWxlIG9iamVjdC4gIElmIHRoZQpAQCAtODA5LDEzICs4MDksMTQgQEAKIFRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXQncyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50IHdpdGgKIG5vIHNwZWNpYWwgc2VtYW50aWNzIG9yIHN5bnRheCByZXN0cmljdGlvbnMuCiAKLUNvZGUgY29tcGlsZWQgYnkgYW4gZXhlYyBzdGF0ZW1lbnQgb3IgY2FsbHMgdG8gdGhlIGJ1aWx0aW4gZnVuY3Rpb25zCitDb2RlIGNvbXBpbGVkIGJ5IGFuIFxrZXl3b3Jke2V4ZWN9IHN0YXRlbWVudCBvciBjYWxscyB0byB0aGUgYnVpbHRpbiBmdW5jdGlvbnMKIFxmdW5jdGlvbntjb21waWxlKCl9IGFuZCBcZnVuY3Rpb257ZXhlY2ZpbGUoKX0gdGhhdCBvY2N1ciBpbiBhIG1vZHVsZQogXG1vZHVsZXtNfSBjb250YWluaW5nIGEgZnV0dXJlIHN0YXRlbWVudCB3aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhlIG5ldyAKIHN5bnRheCBvciBzZW1hbnRpY3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4sCiBzdGFydGluZyB3aXRoIFB5dGhvbiAyLjIgYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgdG8KLVxmdW5jdGlvbntjb21waWxlKCl9IC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBpbiB0aGUgCi1saWJyYXJ5IHJlZmVyZW5jZSBmb3IgZGV0YWlscy4KK1xmdW5jdGlvbntjb21waWxlKCl9IC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBpbiB0aGUKK1xjaXRldGl0bGVbLi4vbGliL2J1aWx0LWluLWZ1bmNzLmh0bWxde1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0gZm9yCitkZXRhaWxzLgogCiBBIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGwKIHRha2UgZWZmZWN0IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbi4gIElmIGFuCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjcudGV4IGIvRG9jL3JlZi9yZWY3LnRleAppbmRleCBhMmQ0NmE4Li42YmMwYjA4IDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjcudGV4CisrKyBiL0RvYy9yZWYvcmVmNy50ZXgKQEAgLTI4MSwxMSArMjgxLDggQEAKIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UuCiBJZiB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiBvcgogZXhlY3V0ZXMgYSBca2V5d29yZHtyZXR1cm59IG9yIFxrZXl3b3Jke2JyZWFrfSBzdGF0ZW1lbnQsIHRoZSBzYXZlZAotZXhjZXB0aW9uIGlzIGxvc3QuICBBIFxrZXl3b3Jke2NvbnRpbnVlfSBzdGF0ZW1lbnQgaXMgaWxsZWdhbCBpbiB0aGUKLVxrZXl3b3Jke2ZpbmFsbHl9IGNsYXVzZS4gIChUaGUgcmVhc29uIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50Ci1pbXBsZW1lbnRhdGlvbiAtLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuICBUaGUKLWV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZyBleGVjdXRpb24gb2YKLXRoZSBca2V5d29yZHtmaW5hbGx5fSBjbGF1c2UuCitleGNlcHRpb24gaXMgbG9zdC4gIFRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUKK3Byb2dyYW0gZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgXGtleXdvcmR7ZmluYWxseX0gY2xhdXNlLgogXGt3aW5kZXh7ZmluYWxseX0KIAogV2hlbiBhIFxrZXl3b3Jke3JldHVybn0sIFxrZXl3b3Jke2JyZWFrfSBvciBca2V5d29yZHtjb250aW51ZX0gc3RhdGVtZW50IGlzCkBAIC0zMTIsMzggKzMwOSwzNCBAQAogd2l0aCBtZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZQogc2VjdGlvbn5ccmVme2NvbnRleHQtbWFuYWdlcnN9KS4gVGhpcyBhbGxvd3MgY29tbW9uCiBca2V5d29yZHt0cnl9Li4uXGtleXdvcmR7ZXhjZXB0fS4uLlxrZXl3b3Jke2ZpbmFsbHl9IHVzYWdlIHBhdHRlcm5zIHRvCi1iZSBlbmNhcHN1bGF0ZWQgYXMgY29udGV4dCBtYW5hZ2VycyBmb3IgY29udmVuaWVudCByZXVzZS4KK2JlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS4KIAogXGJlZ2lue3Byb2R1Y3Rpb25saXN0fQogICBccHJvZHVjdGlvbnt3aXRoX3N0bXR9Ci0gIHsid2l0aCIgXHRva2Vue2V4cHJlc3Npb259IFsiYXMiIHRhcmdldF9saXN0XSAiOiIgXHRva2Vue3N1aXRlfX0KKyAgeyJ3aXRoIiBcdG9rZW57ZXhwcmVzc2lvbn0gWyJhcyIgdGFyZ2V0XSAiOiIgXHRva2Vue3N1aXRlfX0KIFxlbmR7cHJvZHVjdGlvbmxpc3R9CiAKIFRoZSBleGVjdXRpb24gb2YgdGhlIFxrZXl3b3Jke3dpdGh9IHN0YXRlbWVudCBwcm9jZWVkcyBhcyBmb2xsb3dzOgogCiBcYmVnaW57ZW51bWVyYXRlfQogCi1caXRlbSBUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlcgotb2JqZWN0LgorXGl0ZW0gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLgogCi1caXRlbSBUaGUgY29udGV4dCBtYW5hZ2VyJ3MgXG1ldGhvZHtfX2NvbnRleHRfXygpfSBtZXRob2QgaXMgaW52b2tlZCB0bwotb2J0YWluIGEgY29udGV4dCBvYmplY3QuCitcaXRlbSBUaGUgY29udGV4dCBtYW5hZ2VyJ3MgXG1ldGhvZHtfX2VudGVyX18oKX0gbWV0aG9kIGlzIGludm9rZWQuCiAKLVxpdGVtIFRoZSBjb250ZXh0IG9iamVjdCdzIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCBpcyBpbnZva2VkLgotCi1caXRlbSBJZiBhIHRhcmdldCBsaXN0IHdhcyBpbmNsdWRlZCBpbiB0aGUgXGtleXdvcmR7d2l0aH0KK1xpdGVtIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgXGtleXdvcmR7d2l0aH0KIHN0YXRlbWVudCwgdGhlIHJldHVybiB2YWx1ZSBmcm9tIFxtZXRob2R7X19lbnRlcl9fKCl9IGlzIGFzc2lnbmVkIHRvIGl0LgogCiBcbm90ZXtUaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUKIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4KIFxtZXRob2R7X19leGl0X18oKX0gd2lsbCBhbHdheXMgYmUgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMKIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGUgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcwotYW4gZXJyb3Igb2NjdXJyaW5nIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cufQorYW4gZXJyb3Igb2NjdXJyaW5nIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDUgYmVsb3cufQogCiBcaXRlbSBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuCiAKLVxpdGVtIFRoZSBjb250ZXh0IG9iamVjdCdzIFxtZXRob2R7X19leGl0X18oKX0gbWV0aG9kIGlzIGludm9rZWQuIElmIGFuCi1leGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kCitcaXRlbSBUaGUgY29udGV4dCBtYW5hZ2VyJ3MgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2QgaXMgaW52b2tlZC4gSWYKK2FuIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmQKIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBcbWV0aG9ke19fZXhpdF9fKCl9LiBPdGhlcndpc2UsCiB0aHJlZSBcY29uc3RhbnR7Tm9uZX0gYXJndW1lbnRzIGFyZSBzdXBwbGllZC4KIApkaWZmIC0tZ2l0IGEvRG9jL3RleGlucHV0cy9weXRob24uc3R5IGIvRG9jL3RleGlucHV0cy9weXRob24uc3R5CmluZGV4IDRjYjAyZGUuLjNjZTYyZjQgMTAwNjQ0Ci0tLSBhL0RvYy90ZXhpbnB1dHMvcHl0aG9uLnN0eQorKysgYi9Eb2MvdGV4aW5wdXRzL3B5dGhvbi5zdHkKQEAgLTg0OCw4ICs4NDgsMTcgQEAKICUgYnV0IG9ubHkgaWYgd2UgYWN0dWFsbHkgdXNlZCBoeXBlcnJlZjoKIFxpZnBkZgogICBcbmV3Y29tbWFuZHtcdXJsfVsxXXt7JQotICAgIFxweUBwZGZzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19IHVzZXJ7L1MgL1VSSSAvVVJJICgjMSl9JQotICAgIFxweUBMaW5rQ29sb3IlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3Igb2YgdGhlIGxpbmsgdGV4dAorICAgIFxweUBwZGZzdGFydGxpbmslCisgICAgYXR0cnsgL0JvcmRlciBbMCAwIDBdIH0lCisgICAgdXNlcnslCisgICAgICAvU3VidHlwZS9MaW5rJQorICAgICAgL0E8PCUKKyAgICAgIC9UeXBlL0FjdGlvbiUKKyAgICAgIC9TL1VSSSUKKyAgICAgIC9VUkkoIzEpJQorICAgICAgPj4lCisgICAgfSUKKyAgICBccHlATGlua0NvbG9yJSAgICAgICAgICAgICAgICAgICAgICBjb2xvciBvZiB0aGUgbGluayB0ZXh0CiAgICAgXHB5QHNtYWxsc2l6ZVxzZiAjMSUKICAgICBccHlATm9ybWFsQ29sb3IlICAgICAgICAgICAgICAgICAgICBUdXJuIGl0IGJhY2sgb2ZmOyB0aGVzZSBhcmUgZGVjbGFyYXRpdmUKICAgICBccGRmZW5kbGlua30lICAgICAgICAgICAgICAgICAgICAgICBhbmQgZG9uJ3QgYXBwZWFyIGJvdW5kIHRvIHRoZSBjdXJyZW50CkBAIC05MjUsNyArOTM0LDE2IEBACiBcaWZwZGYKICAgXG5ld2NvbW1hbmR7XHVsaW5rfVsyXXt7JQogICAgICUgRm9yIFBERiwgd2UgKnNob3VsZCogb25seSBnZW5lcmF0ZSBhIGxpbmsgd2hlbiB0aGUgVVJMIGlzIGFic29sdXRlLgotICAgIFxweUBwZGZzdGFydGxpbmsgYXR0cnsvQm9yZGVyIFswIDAgMF19IHVzZXJ7L1MgL1VSSSAvVVJJICgjMil9JQorICAgIFxweUBwZGZzdGFydGxpbmslCisgICAgYXR0cnsgL0JvcmRlciBbMCAwIDBdIH0lCisgICAgdXNlcnslCisgICAgICAvU3VidHlwZS9MaW5rJQorICAgICAgL0E8PCUKKyAgICAgIC9UeXBlL0FjdGlvbiUKKyAgICAgIC9TL1VSSSUKKyAgICAgIC9VUkkoIzIpJQorICAgICAgPj4lCisgICAgfSUKICAgICBccHlATGlua0NvbG9yJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIG9mIHRoZSBsaW5rIHRleHQKICAgICAjMSUKICAgICBccHlATm9ybWFsQ29sb3IlICAgICAgICAgICAgICAgICAgICBUdXJuIGl0IGJhY2sgb2ZmOyB0aGVzZSBhcmUgZGVjbGFyYXRpdmUKZGlmZiAtLWdpdCBhL0RvYy90dXQvZ2xvc3NhcnkudGV4IGIvRG9jL3R1dC9nbG9zc2FyeS50ZXgKaW5kZXggYzgwODJkNS4uMTdjYzc2NyAxMDA2NDQKLS0tIGEvRG9jL3R1dC9nbG9zc2FyeS50ZXgKKysrIGIvRG9jL3R1dC9nbG9zc2FyeS50ZXgKQEAgLTcsNyArNyw3IEBACiAKIAogXGluZGV4ez4+Pn0KLVxpdGVtW1xjb2Rlez5cY29kZXs+fT59XQorXGl0ZW1bXGNvZGV7Pj4+fV0KIFRoZSB0eXBpY2FsIFB5dGhvbiBwcm9tcHQgb2YgdGhlIGludGVyYWN0aXZlIHNoZWxsLiAgT2Z0ZW4gc2VlbiBmb3IKIGNvZGUgZXhhbXBsZXMgdGhhdCBjYW4gYmUgdHJpZWQgcmlnaHQgYXdheSBpbiB0aGUgaW50ZXJwcmV0ZXIuCiAKZGlmZiAtLWdpdCBhL0RvYy90dXQvdHV0LnRleCBiL0RvYy90dXQvdHV0LnRleAppbmRleCA3ZjlhN2VlLi40ZTBhMjZiIDEwMDY0NAotLS0gYS9Eb2MvdHV0L3R1dC50ZXgKKysrIGIvRG9jL3R1dC90dXQudGV4CkBAIC0yNjQsNyArMjY0LDcgQEAKIFdoZW4gY29tbWFuZHMgYXJlIHJlYWQgZnJvbSBhIHR0eSwgdGhlIGludGVycHJldGVyIGlzIHNhaWQgdG8gYmUgaW4KIFxlbXBoe2ludGVyYWN0aXZlIG1vZGV9LiAgSW4gdGhpcyBtb2RlIGl0IHByb21wdHMgZm9yIHRoZSBuZXh0IGNvbW1hbmQKIHdpdGggdGhlIFxlbXBoe3ByaW1hcnkgcHJvbXB0fSwgdXN1YWxseSB0aHJlZSBncmVhdGVyLXRoYW4gc2lnbnMKLShcc2FtcHs+XGNvZGV7Pn0+fn0pOyBmb3IgY29udGludWF0aW9uIGxpbmVzIGl0IHByb21wdHMgd2l0aCB0aGUKKyhcc2FtcHs+Pj5+fSk7IGZvciBjb250aW51YXRpb24gbGluZXMgaXQgcHJvbXB0cyB3aXRoIHRoZQogXGVtcGh7c2Vjb25kYXJ5IHByb21wdH0sIGJ5IGRlZmF1bHQgdGhyZWUgZG90cyAoXHNhbXB7Li4ufn0pLgogVGhlIGludGVycHJldGVyIHByaW50cyBhIHdlbGNvbWUgbWVzc2FnZSBzdGF0aW5nIGl0cyB2ZXJzaW9uIG51bWJlcgogYW5kIGEgY29weXJpZ2h0IG5vdGljZSBiZWZvcmUgcHJpbnRpbmcgdGhlIGZpcnN0IHByb21wdDoKQEAgLTQyMyw3ICs0MjMsNyBAQAogXGNoYXB0ZXJ7QW4gSW5mb3JtYWwgSW50cm9kdWN0aW9uIHRvIFB5dGhvbiBcbGFiZWx7aW5mb3JtYWx9fQogCiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCBpbnB1dCBhbmQgb3V0cHV0IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZQotcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBwcm9tcHRzIChcc2FtcHs+XGNvZGV7Pn0+fn0gYW5kIFxzYW1wey4uLn59KTogdG8gcmVwZWF0CitwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHByb21wdHMgKFxzYW1wez4+Pn59IGFuZCBcc2FtcHsuLi5+fSk6IHRvIHJlcGVhdAogdGhlIGV4YW1wbGUsIHlvdSBtdXN0IHR5cGUgZXZlcnl0aGluZyBhZnRlciB0aGUgcHJvbXB0LCB3aGVuIHRoZQogcHJvbXB0IGFwcGVhcnM7IGxpbmVzIHRoYXQgZG8gbm90IGJlZ2luIHdpdGggYSBwcm9tcHQgYXJlIG91dHB1dCBmcm9tCiB0aGUgaW50ZXJwcmV0ZXIuICUKQEAgLTQ1NSw3ICs0NTUsNyBAQAogXHNlY3Rpb257VXNpbmcgUHl0aG9uIGFzIGEgQ2FsY3VsYXRvciBcbGFiZWx7Y2FsY3VsYXRvcn19CiAKIExldCdzIHRyeSBzb21lIHNpbXBsZSBQeXRob24gY29tbWFuZHMuICBTdGFydCB0aGUgaW50ZXJwcmV0ZXIgYW5kIHdhaXQKLWZvciB0aGUgcHJpbWFyeSBwcm9tcHQsIFxzYW1wez5cY29kZXs+fT5+fS4gIChJdCBzaG91bGRuJ3QgdGFrZSBsb25nLikKK2ZvciB0aGUgcHJpbWFyeSBwcm9tcHQsIFxzYW1wez4+Pn59LiAgKEl0IHNob3VsZG4ndCB0YWtlIGxvbmcuKQogCiBcc3Vic2VjdGlvbntOdW1iZXJzIFxsYWJlbHtudW1iZXJzfX0KIApAQCAtMjcyMyw3ICsyNzIzLDcgQEAKICAnRmxvYXRpbmdQb2ludEVycm9yJywgJ0Z1dHVyZVdhcm5pbmcnLCAnSU9FcnJvcicsICdJbXBvcnRFcnJvcicsCiAgJ0luZGVudGF0aW9uRXJyb3InLCAnSW5kZXhFcnJvcicsICdLZXlFcnJvcicsICdLZXlib2FyZEludGVycnVwdCcsCiAgJ0xvb2t1cEVycm9yJywgJ01lbW9yeUVycm9yJywgJ05hbWVFcnJvcicsICdOb25lJywgJ05vdEltcGxlbWVudGVkJywKLSAnTm90SW1wbGVtZW50ZWRFcnJvcicsICdPU0Vycm9yJywgJ092ZXJmbG93RXJyb3InLCAnT3ZlcmZsb3dXYXJuaW5nJywKKyAnTm90SW1wbGVtZW50ZWRFcnJvcicsICdPU0Vycm9yJywgJ092ZXJmbG93RXJyb3InLCAKICAnUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZycsICdSZWZlcmVuY2VFcnJvcicsICdSdW50aW1lRXJyb3InLAogICdSdW50aW1lV2FybmluZycsICdTdGFuZGFyZEVycm9yJywgJ1N0b3BJdGVyYXRpb24nLCAnU3ludGF4RXJyb3InLAogICdTeW50YXhXYXJuaW5nJywgJ1N5c3RlbUVycm9yJywgJ1N5c3RlbUV4aXQnLCAnVGFiRXJyb3InLCAnVHJ1ZScsCkBAIC0zNzYzLDYgKzM3NjMsMzggQEAKIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdXNlIG9mIHRoZSByZXNvdXJjZSB3YXMgc3VjY2Vzc2Z1bC4KIAogCitcc2VjdGlvbntQcmVkZWZpbmVkIENsZWFuLXVwIEFjdGlvbnMgXGxhYmVse2NsZWFudXAtd2l0aH19CisKK1NvbWUgb2JqZWN0cyBkZWZpbmUgc3RhbmRhcmQgY2xlYW4tdXAgYWN0aW9ucyB0byBiZSB1bmRlcnRha2VuIHdoZW4KK3RoZSBvYmplY3QgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUKK29wZXJhdGlvbiB1c2luZyB0aGUgb2JqZWN0IHN1Y2NlZWRlZCBvciBmYWlsZWQuCitMb29rIGF0IHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgd2hpY2ggdHJpZXMgdG8gb3BlbiBhIGZpbGUgYW5kIHByaW50CitpdHMgY29udGVudHMgdG8gdGhlIHNjcmVlbi4KKworXGJlZ2lue3ZlcmJhdGltfQorZm9yIGxpbmUgaW4gb3BlbigibXlmaWxlLnR4dCIpOgorICAgIHByaW50IGxpbmUKK1xlbmR7dmVyYmF0aW19CisKK1RoZSBwcm9ibGVtIHdpdGggdGhpcyBjb2RlIGlzIHRoYXQgaXQgbGVhdmVzIHRoZSBmaWxlIG9wZW4gZm9yIGFuCitpbmRldGVybWluYXRlIGFtb3VudCBvZiB0aW1lIGFmdGVyIHRoZSBjb2RlIGhhcyBmaW5pc2hlZCBleGVjdXRpbmcuCitUaGlzIGlzIG5vdCBhbiBpc3N1ZSBpbiBzaW1wbGUgc2NyaXB0cywgYnV0IGNhbiBiZSBhIHByb2JsZW0gZm9yCitsYXJnZXIgYXBwbGljYXRpb25zLiBUaGUgXGtleXdvcmR7d2l0aH0gc3RhdGVtZW50IGFsbG93cworb2JqZWN0cyBsaWtlIGZpbGVzIHRvIGJlIHVzZWQgaW4gYSB3YXkgdGhhdCBlbnN1cmVzIHRoZXkgYXJlCithbHdheXMgY2xlYW5lZCB1cCBwcm9tcHRseSBhbmQgY29ycmVjdGx5LgorCitcYmVnaW57dmVyYmF0aW19Cit3aXRoIG9wZW4oIm15ZmlsZS50eHQiKSBhcyBmOgorICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgIHByaW50IGxpbmUKK1xlbmR7dmVyYmF0aW19CisKK0FmdGVyIHRoZSBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHRoZSBmaWxlIFx2YXJ7Zn0gaXMgYWx3YXlzIGNsb3NlZCwKK2V2ZW4gaWYgYSBwcm9ibGVtIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBsaW5lcy4gT3RoZXIKK29iamVjdHMgd2hpY2ggcHJvdmlkZSBwcmVkZWZpbmVkIGNsZWFuLXVwIGFjdGlvbnMgd2lsbCBpbmRpY2F0ZQordGhpcyBpbiB0aGVpciBkb2N1bWVudGF0aW9uLgorCisKIFxjaGFwdGVye0NsYXNzZXMgXGxhYmVse2NsYXNzZXN9fQogCiBQeXRob24ncyBjbGFzcyBtZWNoYW5pc20gYWRkcyBjbGFzc2VzIHRvIHRoZSBsYW5ndWFnZSB3aXRoIGEgbWluaW11bQpAQCAtNDc1Nyw3ICs0Nzg5LDcgQEAKIFxiZWdpbnt2ZXJiYXRpbX0KID4+PiBpbXBvcnQgdXJsbGliMgogPj4+IGZvciBsaW5lIGluIHVybGxpYjIudXJsb3BlbignaHR0cDovL3R5Y2hvLnVzbm8ubmF2eS5taWwvY2dpLWJpbi90aW1lci5wbCcpOgotLi4uICAgICBpZiAnRVNUJyBpbiBsaW5lOiAgICAgICMgbG9vayBmb3IgRWFzdGVybiBTdGFuZGFyZCBUaW1lCisuLi4gICAgIGlmICdFU1QnIGluIGxpbmUgb3IgJ0VEVCcgaW4gbGluZTogICMgbG9vayBmb3IgRWFzdGVybiBUaW1lCiAuLi4gICAgICAgICBwcmludCBsaW5lCiAgICAgCiA8QlI+Tm92LiAyNSwgMDk6NDM6MzIgUE0gRVNUCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXgKaW5kZXggYmY0NThmYS4uNTZkMTViOCAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzIwLnRleApAQCAtMzMwLDcgKzMzMCw3IEBACiBbIGV4cHJlc3Npb24gZm9yIGV4cHIgaW4gc2VxdWVuY2UxIAogICAgICAgICAgICAgIGZvciBleHByMiBpbiBzZXF1ZW5jZTIgLi4uCiAJICAgICBmb3IgZXhwck4gaW4gc2VxdWVuY2VOCi0gICAgICAgICAgICAgaWYgY29uZGl0aW9uCisgICAgICAgICAgICAgaWYgY29uZGl0aW9uIF0KIFxlbmR7dmVyYmF0aW19CiAKIFRoZSBca2V5d29yZHtmb3J9Li4uXGtleXdvcmR7aW59IGNsYXVzZXMgY29udGFpbiB0aGUgc2VxdWVuY2VzIHRvIGJlCkBAIC0zNTYsNyArMzU2LDcgQEAKICAgICAgICAgICAgICAgICAgICMgcmVzdWx0aW5nIGxpc3QuCiBcZW5ke3ZlcmJhdGltfQogCi1UaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGVyZSBhcmUgXGtleXdvcmR7Zm9yfS4uLlxrZXl3b3Jke2lufSBjbGF1c2VzLAorVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIFxrZXl3b3Jke2Zvcn0uLi5ca2V5d29yZHtpbn0gY2xhdXNlcywKIHRoZSByZXN1bHRpbmcgbGlzdCB3aWxsIGJlIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsZW5ndGhzIG9mIGFsbAogdGhlIHNlcXVlbmNlcy4gIElmIHlvdSBoYXZlIHR3byBsaXN0cyBvZiBsZW5ndGggMywgdGhlIG91dHB1dCBsaXN0IGlzCiA5IGVsZW1lbnRzIGxvbmc6CkBAIC00MDAsNyArNDAwLDcgQEAKICUgVGhlIGVtcHR5IGdyb3VwcyBiZWxvdyBwcmV2ZW50IGNvbnZlcnNpb24gdG8gZ3VpbGxlbWV0cy4KIFRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIGFzc2lnbm1lbnQgb3BlcmF0b3JzIGlzIFxjb2Rleys9fSwKIFxjb2Rley09fSwgXGNvZGV7Kj19LCBcY29kZXsvPX0sIFxjb2Rle1wlPX0sIFxjb2RleyoqPX0sIFxjb2Rle1wmPX0sCi1cY29kZXt8PX0sIFx2ZXJifF49fCwgXGNvZGV7Pnt9Pj19LCBhbmQgXGNvZGV7PHt9PD19LiAgUHl0aG9uIGNsYXNzZXMgY2FuCitcY29kZXt8PX0sIFx2ZXJifF49fCwgXGNvZGV7Pj49fSwgYW5kIFxjb2Rlezw8PX0uICBQeXRob24gY2xhc3NlcyBjYW4KIG92ZXJyaWRlIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBvcGVyYXRvcnMgYnkgZGVmaW5pbmcgbWV0aG9kcyBuYW1lZAogXG1ldGhvZHtfX2lhZGRfX30sIFxtZXRob2R7X19pc3ViX199LCBldGMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogXGNsYXNze051bWJlcn0gY2xhc3Mgc3RvcmVzIGEgbnVtYmVyIGFuZCBzdXBwb3J0cyB1c2luZyArPSB0byBjcmVhdGUgYQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjMudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjMudGV4CmluZGV4IGUyOWVjZGQuLmExMjIwODMgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIzLnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMy50ZXgKQEAgLTMxOCw3ICszMTgsNyBAQAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntQRVAgMjczOiBJbXBvcnRpbmcgTW9kdWxlcyBmcm9tIFppcCBBcmNoaXZlc30KK1xzZWN0aW9ue1BFUCAyNzM6IEltcG9ydGluZyBNb2R1bGVzIGZyb20gWklQIEFyY2hpdmVzfQogCiBUaGUgbmV3IFxtb2R1bGV7emlwaW1wb3J0fSBtb2R1bGUgYWRkcyBzdXBwb3J0IGZvciBpbXBvcnRpbmcKIG1vZHVsZXMgZnJvbSBhIFpJUC1mb3JtYXQgYXJjaGl2ZS4gIFlvdSBkb24ndCBuZWVkIHRvIGltcG9ydCB0aGUKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleAppbmRleCA3NTAxNjJmLi4zMDA2NjI0IDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKKysrIGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4CkBAIC0yLDEzICsyLDExIEBACiBcdXNlcGFja2FnZXtkaXN0dXRpbHN9CiAlICRJZCQKIAotJSBUaGUgZWFzeV9pbnN0YWxsIHN0dWZmCi0lIERlc2NyaWJlIHRoZSBwa2d1dGlsIG1vZHVsZQogJSBGaXggWFhYIGNvbW1lbnRzCiAlIENvdW50IHVwIHRoZSBwYXRjaGVzIGFuZCBidWdzCiAKIFx0aXRsZXtXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjV9Ci1ccmVsZWFzZXswLjF9CitccmVsZWFzZXswLjJ9CiBcYXV0aG9ye0EuTS4gS3VjaGxpbmd9CiBcYXV0aG9yYWRkcmVzc3tcZW1haWx7YW1rQGFtay5jYX19CiAKQEAgLTM0LDMyICszMiw2IEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BFUCAyNDM6IFVwbG9hZGluZyBNb2R1bGVzIHRvIFB5UElcbGFiZWx7cGVwLTI0M319Ci0KLVBFUCAyNDMgZGVzY3JpYmVzIGFuIEhUVFAtYmFzZWQgcHJvdG9jb2wgZm9yIHN1Ym1pdHRpbmcgc29mdHdhcmUKLXBhY2thZ2VzIHRvIGEgY2VudHJhbCBhcmNoaXZlLiAgVGhlIFB5dGhvbiBwYWNrYWdlIGluZGV4IGF0Ci1cdXJse2h0dHA6Ly9jaGVlc2VzaG9wLnB5dGhvbi5vcmd9IG5vdyBzdXBwb3J0cyBwYWNrYWdlIHVwbG9hZHMsIGFuZAotdGhlIG5ldyBcY29tbWFuZHt1cGxvYWR9IERpc3R1dGlscyBjb21tYW5kIHdpbGwgdXBsb2FkIGEgcGFja2FnZSB0byB0aGUKLXJlcG9zaXRvcnkuCi0KLUJlZm9yZSBhIHBhY2thZ2UgY2FuIGJlIHVwbG9hZGVkLCB5b3UgbXVzdCBiZSBhYmxlIHRvIGJ1aWxkIGEKLWRpc3RyaWJ1dGlvbiB1c2luZyB0aGUgXGNvbW1hbmR7c2Rpc3R9IERpc3R1dGlscyBjb21tYW5kLiAgT25jZSB0aGF0Ci13b3JrcywgeW91IGNhbiBydW4gXGNvZGV7cHl0aG9uIHNldHVwLnB5IHVwbG9hZH0gdG8gYWRkIHlvdXIgcGFja2FnZQotdG8gdGhlIFB5UEkgYXJjaGl2ZS4gIE9wdGlvbmFsbHkgeW91IGNhbiBHUEctc2lnbiB0aGUgcGFja2FnZSBieQotc3VwcGx5aW5nIHRoZSBcbG9uZ3Byb2dyYW1vcHR7c2lnbn0gYW5kCi1cbG9uZ3Byb2dyYW1vcHR7aWRlbnRpdHl9IG9wdGlvbnMuCi0KLVxiZWdpbntzZWVhbHNvfQotCi1cc2VlcGVwezI0M317TW9kdWxlIFJlcG9zaXRvcnkgVXBsb2FkIE1lY2hhbmlzbX17UEVQIHdyaXR0ZW4gYnkKLVNlYW4gUmVpZnNjaG5laWRlcjsgaW1wbGVtZW50ZWQgYnkgTWFydGluIHZvbn5MXCJvd2lzCi1hbmQgUmljaGFyZCBKb25lcy4gIE5vdGUgdGhhdCB0aGUgUEVQIGRvZXNuJ3QgZXhhY3RseSAKLWRlc2NyaWJlIHdoYXQncyBpbXBsZW1lbnRlZCBpbiBQeVBJLn0KLQotXGVuZHtzZWVhbHNvfQotCi0KLSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc2VjdGlvbntQRVAgMzA4OiBDb25kaXRpb25hbCBFeHByZXNzaW9uc1xsYWJlbHtwZXAtMzA4fX0KIAogRm9yIGEgbG9uZyB0aW1lLCBwZW9wbGUgaGF2ZSBiZWVuIHJlcXVlc3RpbmcgYSB3YXkgdG8gd3JpdGUKQEAgLTIzNiw2ICsyMDgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgJSBWRVJTSU9OKSwKICAgICAgKQogXGVuZHt2ZXJiYXRpbX0KKworQW5vdGhlciBuZXcgZW5oYW5jZW1lbnQgdG8gdGhlIFB5dGhvbiBwYWNrYWdlIGluZGV4IGF0CitcdXJse2h0dHA6Ly9jaGVlc2VzaG9wLnB5dGhvbi5vcmd9IGlzIHN0b3Jpbmcgc291cmNlIGFuZCBiaW5hcnkKK2FyY2hpdmVzIGZvciBhIHBhY2thZ2UuICBUaGUgbmV3IFxjb21tYW5ke3VwbG9hZH0gRGlzdHV0aWxzIGNvbW1hbmQKK3dpbGwgdXBsb2FkIGEgcGFja2FnZSB0byB0aGUgcmVwb3NpdG9yeS4KKworQmVmb3JlIGEgcGFja2FnZSBjYW4gYmUgdXBsb2FkZWQsIHlvdSBtdXN0IGJlIGFibGUgdG8gYnVpbGQgYQorZGlzdHJpYnV0aW9uIHVzaW5nIHRoZSBcY29tbWFuZHtzZGlzdH0gRGlzdHV0aWxzIGNvbW1hbmQuICBPbmNlIHRoYXQKK3dvcmtzLCB5b3UgY2FuIHJ1biBcY29kZXtweXRob24gc2V0dXAucHkgdXBsb2FkfSB0byBhZGQgeW91ciBwYWNrYWdlCit0byB0aGUgUHlQSSBhcmNoaXZlLiAgT3B0aW9uYWxseSB5b3UgY2FuIEdQRy1zaWduIHRoZSBwYWNrYWdlIGJ5CitzdXBwbHlpbmcgdGhlIFxsb25ncHJvZ3JhbW9wdHtzaWdufSBhbmQKK1xsb25ncHJvZ3JhbW9wdHtpZGVudGl0eX0gb3B0aW9ucy4KKworUGFja2FnZSB1cGxvYWRpbmcgd2FzIGltcGxlbWVudGVkIGJ5IE1hcnRpbiB2b25+TFwib3dpcyBhbmQgUmljaGFyZCBKb25lcy4gCiAgCiBcYmVnaW57c2VlYWxzb30KIApAQCAtMzk0LDEzICszODAsMTcgQEAKIFxlbmR7dmVyYmF0aW19CiAKIFRoZSBjb2RlIGluIFx2YXJ7YmxvY2stMX0gaXMgZXhlY3V0ZWQuICBJZiB0aGUgY29kZSByYWlzZXMgYW4KLWV4Y2VwdGlvbiwgdGhlIGhhbmRsZXJzIGFyZSB0cmllZCBpbiBvcmRlcjogXHZhcntoYW5kbGVyLTF9LAotXHZhcntoYW5kbGVyLTJ9LCAuLi4gIElmIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHRoZSBcdmFye2Vsc2UtYmxvY2t9Ci1pcyBleGVjdXRlZC4gIE5vIG1hdHRlciB3aGF0IGhhcHBlbmVkIHByZXZpb3VzbHksIHRoZQotXHZhcntmaW5hbC1ibG9ja30gaXMgZXhlY3V0ZWQgb25jZSB0aGUgY29kZSBibG9jayBpcyBjb21wbGV0ZSBhbmQgYW55Ci1yYWlzZWQgZXhjZXB0aW9ucyBoYW5kbGVkLiAgRXZlbiBpZiB0aGVyZSdzIGFuIGVycm9yIGluIGFuIGV4Y2VwdGlvbgotaGFuZGxlciBvciB0aGUgXHZhcntlbHNlLWJsb2NrfSBhbmQgYSBuZXcgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlCi1cdmFye2ZpbmFsLWJsb2NrfSBpcyBzdGlsbCBleGVjdXRlZC4KK2V4Y2VwdGlvbiwgdGhlIHZhcmlvdXMgXGtleXdvcmR7ZXhjZXB0fSBibG9ja3MgYXJlIHRlc3RlZDogaWYgdGhlCitleGNlcHRpb24gaXMgb2YgY2xhc3MgXGNsYXNze0V4Y2VwdGlvbjF9LCBcdmFye2hhbmRsZXItMX0gaXMgZXhlY3V0ZWQ7CitvdGhlcndpc2UgaWYgaXQncyBvZiBjbGFzcyBcY2xhc3N7RXhjZXB0aW9uMn0sIFx2YXJ7aGFuZGxlci0yfSBpcworZXhlY3V0ZWQsIGFuZCBzbyBmb3J0aC4gIElmIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHRoZQorXHZhcntlbHNlLWJsb2NrfSBpcyBleGVjdXRlZC4gIAorCitObyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCBwcmV2aW91c2x5LCB0aGUgXHZhcntmaW5hbC1ibG9ja30gaXMgZXhlY3V0ZWQKK29uY2UgdGhlIGNvZGUgYmxvY2sgaXMgY29tcGxldGUgYW5kIGFueSByYWlzZWQgZXhjZXB0aW9ucyBoYW5kbGVkLgorRXZlbiBpZiB0aGVyZSdzIGFuIGVycm9yIGluIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIG9yIHRoZQorXHZhcntlbHNlLWJsb2NrfSBhbmQgYSBuZXcgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlCitjb2RlIGluIHRoZSBcdmFye2ZpbmFsLWJsb2NrfSBpcyBzdGlsbCBydW4uCiAKIFxiZWdpbntzZWVhbHNvfQogCkBAIC00MTUsNyArNDA1LDcgQEAKIAogUHl0aG9uIDIuNSBhZGRzIGEgc2ltcGxlIHdheSB0byBwYXNzIHZhbHVlcyBcZW1waHtpbnRvfSBhIGdlbmVyYXRvci4KIEFzIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuMywgZ2VuZXJhdG9ycyBvbmx5IHByb2R1Y2Ugb3V0cHV0OyBvbmNlIGEKLWdlbmVyYXRvcidzIGNvZGUgaXMgaW52b2tlZCB0byBjcmVhdGUgYW4gaXRlcmF0b3IsIHRoZXJlJ3Mgbm8gd2F5IHRvCitnZW5lcmF0b3IncyBjb2RlIHdhcyBpbnZva2VkIHRvIGNyZWF0ZSBhbiBpdGVyYXRvciwgdGhlcmUgd2FzIG5vIHdheSB0bwogcGFzcyBhbnkgbmV3IGluZm9ybWF0aW9uIGludG8gdGhlIGZ1bmN0aW9uIHdoZW4gaXRzIGV4ZWN1dGlvbiBpcwogcmVzdW1lZC4gIFNvbWV0aW1lcyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIHNvbWUgaW5mb3JtYXRpb24gd291bGQgYmUKIHVzZWZ1bC4gIEhhY2tpc2ggc29sdXRpb25zIHRvIHRoaXMgaW5jbHVkZSBtYWtpbmcgdGhlIGdlbmVyYXRvcidzIGNvZGUKQEAgLTUyMiw5ICs1MTIsOSBAQAogICBcZXhjZXB0aW9ue0dlbmVyYXRvckV4aXR9IG9yIFxleGNlcHRpb257U3RvcEl0ZXJhdGlvbn07IGNhdGNoaW5nIHRoZSAKICAgZXhjZXB0aW9uIGFuZCBkb2luZyBhbnl0aGluZyBlbHNlIGlzIGlsbGVnYWwgYW5kIHdpbGwgdHJpZ2dlcgogICBhIFxleGNlcHRpb257UnVudGltZUVycm9yfS4gIFxtZXRob2R7Y2xvc2UoKX0gd2lsbCBhbHNvIGJlIGNhbGxlZCBieSAKLSAgUHl0aG9uJ3MgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gdGhlIGdlbmVyYXRvciBpcyBnYXJiYWdlLWNvbGxlY3RlZC4KKyAgUHl0aG9uJ3MgZ2FyYmFnZSBjb2xsZWN0b3Igd2hlbiB0aGUgZ2VuZXJhdG9yIGlzIGdhcmJhZ2UtY29sbGVjdGVkLgogCi0gIElmIHlvdSBuZWVkIHRvIHJ1biBjbGVhbnVwIGNvZGUgaW4gY2FzZSBvZiBhIFxleGNlcHRpb257R2VuZXJhdG9yRXhpdH0sCisgIElmIHlvdSBuZWVkIHRvIHJ1biBjbGVhbnVwIGNvZGUgd2hlbiBhIFxleGNlcHRpb257R2VuZXJhdG9yRXhpdH0gb2NjdXJzLAogICBJIHN1Z2dlc3QgdXNpbmcgYSBcY29kZXt0cnk6IC4uLiBmaW5hbGx5On0gc3VpdGUgaW5zdGVhZCBvZiAKICAgY2F0Y2hpbmcgXGV4Y2VwdGlvbntHZW5lcmF0b3JFeGl0fS4KIApAQCAtNTM1LDggKzUyNSw4IEBACiAKIEdlbmVyYXRvcnMgYWxzbyBiZWNvbWUgXGVtcGh7Y29yb3V0aW5lc30sIGEgbW9yZSBnZW5lcmFsaXplZCBmb3JtIG9mCiBzdWJyb3V0aW5lcy4gIFN1YnJvdXRpbmVzIGFyZSBlbnRlcmVkIGF0IG9uZSBwb2ludCBhbmQgZXhpdGVkIGF0Ci1hbm90aGVyIHBvaW50ICh0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbiwgYW5kIGEgXGtleXdvcmR7cmV0dXJuCi1zdGF0ZW1lbnR9KSwgYnV0IGNvcm91dGluZXMgY2FuIGJlIGVudGVyZWQsIGV4aXRlZCwgYW5kIHJlc3VtZWQgYXQKK2Fub3RoZXIgcG9pbnQgKHRoZSB0b3Agb2YgdGhlIGZ1bmN0aW9uLCBhbmQgYSBca2V5d29yZHtyZXR1cm59CitzdGF0ZW1lbnQpLCBidXQgY29yb3V0aW5lcyBjYW4gYmUgZW50ZXJlZCwgZXhpdGVkLCBhbmQgcmVzdW1lZCBhdAogbWFueSBkaWZmZXJlbnQgcG9pbnRzICh0aGUgXGtleXdvcmR7eWllbGR9IHN0YXRlbWVudHMpLiAgV2UnbGwgaGF2ZSB0bwogZmlndXJlIG91dCBwYXR0ZXJucyBmb3IgdXNpbmcgY29yb3V0aW5lcyBlZmZlY3RpdmVseSBpbiBQeXRob24uCiAKQEAgLTU3OSwxNCArNTY5LDEyIEBACiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogXHNlY3Rpb257UEVQIDM0MzogVGhlICd3aXRoJyBzdGF0ZW1lbnRcbGFiZWx7cGVwLTM0M319CiAKLVRoZSAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudCBhbGxvd3MgYSBjbGVhcmVyIHZlcnNpb24gb2YgY29kZSB0aGF0Ci11c2VzIFxjb2Rle3RyeS4uLmZpbmFsbHl9IGJsb2NrcyB0byBlbnN1cmUgdGhhdCBjbGVhbi11cCBjb2RlIGlzCi1leGVjdXRlZC4KLQotSW4gdGhpcyBzZWN0aW9uLCBJJ2xsIGRpc2N1c3MgdGhlIHN0YXRlbWVudCBhcyBpdCB3aWxsIGNvbW1vbmx5IGJlCi11c2VkLiAgSW4gdGhlIG5leHQgc2VjdGlvbiwgSSdsbCBleGFtaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCi1hbmQgc2hvdyBob3cgdG8gd3JpdGUgb2JqZWN0cyBjYWxsZWQgYGBjb250ZXh0IG1hbmFnZXJzJycgYW5kCi1gYGNvbnRleHRzJycgZm9yIHVzZSB3aXRoIHRoaXMgc3RhdGVtZW50LgorVGhlICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50IGNsYXJpZmllcyBjb2RlIHRoYXQgcHJldmlvdXNseSB3b3VsZAordXNlIFxjb2Rle3RyeS4uLmZpbmFsbHl9IGJsb2NrcyB0byBlbnN1cmUgdGhhdCBjbGVhbi11cCBjb2RlIGlzCitleGVjdXRlZC4gIEluIHRoaXMgc2VjdGlvbiwgSSdsbCBkaXNjdXNzIHRoZSBzdGF0ZW1lbnQgYXMgaXQgd2lsbAorY29tbW9ubHkgYmUgdXNlZC4gIEluIHRoZSBuZXh0IHNlY3Rpb24sIEknbGwgZXhhbWluZSB0aGUKK2ltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIHNob3cgaG93IHRvIHdyaXRlIG9iamVjdHMgZm9yIHVzZSB3aXRoIHRoaXMKK3N0YXRlbWVudC4KIAogVGhlICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50IGlzIGEgbmV3IGNvbnRyb2wtZmxvdyBzdHJ1Y3R1cmUgd2hvc2UKIGJhc2ljIHN0cnVjdHVyZSBpczoKQEAgLTU5NiwxMyArNTg0LDEzIEBACiAgICAgd2l0aC1ibG9jawogXGVuZHt2ZXJiYXRpbX0KIAotVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBhbmQgaXQgc2hvdWxkIHJlc3VsdCBpbiBhIHR5cGUgb2Ygb2JqZWN0Ci10aGF0J3MgY2FsbGVkIGEgY29udGV4dCBtYW5hZ2VyLiAgVGhlIGNvbnRleHQgbWFuYWdlciBjYW4gcmV0dXJuIGEKK1RoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgYW5kIGl0IHNob3VsZCByZXN1bHQgaW4gYW4gb2JqZWN0IHRoYXQKK3N1cHBvcnRzIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wuICBUaGlzIG9iamVjdCBtYXkgcmV0dXJuIGEKIHZhbHVlIHRoYXQgY2FuIG9wdGlvbmFsbHkgYmUgYm91bmQgdG8gdGhlIG5hbWUgXHZhcnt2YXJpYWJsZX0uICAoTm90ZQotY2FyZWZ1bGx5OiBcdmFye3ZhcmlhYmxlfSBpcyBcZW1waHtub3R9IGFzc2lnbmVkIHRoZSByZXN1bHQgb2YKLVx2YXJ7ZXhwcmVzc2lvbn0uKSAgT25lIG1ldGhvZCBvZiB0aGUgY29udGV4dCBtYW5hZ2VyIGlzIHJ1biBiZWZvcmUKLVx2YXJ7d2l0aC1ibG9ja30gaXMgZXhlY3V0ZWQsIGFuZCBhbm90aGVyIG1ldGhvZCBpcyBydW4gYWZ0ZXIgdGhlCi1ibG9jayBpcyBkb25lLCBldmVuIGlmIHRoZSBibG9jayByYWlzZWQgYW4gZXhjZXB0aW9uLgorY2FyZWZ1bGx5IHRoYXQgXHZhcnt2YXJpYWJsZX0gaXMgXGVtcGh7bm90fSBhc3NpZ25lZCB0aGUgcmVzdWx0IG9mCitcdmFye2V4cHJlc3Npb259LikgIFRoZSBvYmplY3QgY2FuIHRoZW4gcnVuIHNldC11cCBjb2RlCitiZWZvcmUgXHZhcnt3aXRoLWJsb2NrfSBpcyBleGVjdXRlZCBhbmQgc29tZSBjbGVhbi11cCBjb2RlCitpcyBleGVjdXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZG9uZSwgZXZlbiBpZiB0aGUgYmxvY2sgcmFpc2VkIGFuIGV4Y2VwdGlvbi4KIAogVG8gZW5hYmxlIHRoZSBzdGF0ZW1lbnQgaW4gUHl0aG9uIDIuNSwgeW91IG5lZWQgCiB0byBhZGQgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmUgdG8geW91ciBtb2R1bGU6CkBAIC02MTMsNyArNjAxLDggQEAKIAogVGhlIHN0YXRlbWVudCB3aWxsIGFsd2F5cyBiZSBlbmFibGVkIGluIFB5dGhvbiAyLjYuCiAKLVNvbWUgc3RhbmRhcmQgUHl0aG9uIG9iamVjdHMgY2FuIG5vdyBiZWhhdmUgYXMgY29udGV4dCBtYW5hZ2Vycy4gRmlsZQorU29tZSBzdGFuZGFyZCBQeXRob24gb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgY29udGV4dCBtYW5hZ2VtZW50Citwcm90b2NvbCBhbmQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQuIEZpbGUKIG9iamVjdHMgYXJlIG9uZSBleGFtcGxlOgogCiBcYmVnaW57dmVyYmF0aW19CkBAIC02MzcsMTIgKzYyNiwxMiBAQAogICAgIC4uLgogXGVuZHt2ZXJiYXRpbX0KIAotVGhlIGxvY2sgaXMgYWNxdWlyZWQgYmVmb3JlIHRoZSBibG9jayBpcyBleGVjdXRlZCwgYW5kIGFsd2F5cyByZWxlYXNlZCBvbmNlIAorVGhlIGxvY2sgaXMgYWNxdWlyZWQgYmVmb3JlIHRoZSBibG9jayBpcyBleGVjdXRlZCBhbmQgYWx3YXlzIHJlbGVhc2VkIG9uY2UgCiB0aGUgYmxvY2sgaXMgY29tcGxldGUuCiAKIFRoZSBcbW9kdWxle2RlY2ltYWx9IG1vZHVsZSdzIGNvbnRleHRzLCB3aGljaCBlbmNhcHN1bGF0ZSB0aGUgZGVzaXJlZAotcHJlY2lzaW9uIGFuZCByb3VuZGluZyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGNvbXB1dGF0aW9ucywgY2FuIGFsc28gYmUKLXVzZWQgYXMgY29udGV4dCBtYW5hZ2Vycy4KK3ByZWNpc2lvbiBhbmQgcm91bmRpbmcgY2hhcmFjdGVyaXN0aWNzIGZvciBjb21wdXRhdGlvbnMsIHByb3ZpZGUgYSAKK1xtZXRob2R7Y29udGV4dF9tYW5hZ2VyKCl9IG1ldGhvZCBmb3IgZ2V0dGluZyBhIGNvbnRleHQgbWFuYWdlcjoKIAogXGJlZ2lue3ZlcmJhdGltfQogaW1wb3J0IGRlY2ltYWwKQEAgLTY1MSw3ICs2NDAsOCBAQAogdjEgPSBkZWNpbWFsLkRlY2ltYWwoJzU3OCcpCiBwcmludCB2MS5zcXJ0KCkKIAotd2l0aCBkZWNpbWFsLkNvbnRleHQocHJlYz0xNik6CitjdHggPSBkZWNpbWFsLkNvbnRleHQocHJlYz0xNikgCit3aXRoIGN0eC5jb250ZXh0X21hbmFnZXIoKToKICAgICAjIEFsbCBjb2RlIGluIHRoaXMgYmxvY2sgdXNlcyBhIHByZWNpc2lvbiBvZiAxNiBkaWdpdHMuCiAgICAgIyBUaGUgb3JpZ2luYWwgY29udGV4dCBpcyByZXN0b3JlZCBvbiBleGl0aW5nIHRoZSBibG9jay4KICAgICBwcmludCB2MS5zcXJ0KCkKQEAgLTY2MCw0NyArNjUwLDQ1IEBACiBcc3Vic2VjdGlvbntXcml0aW5nIENvbnRleHQgTWFuYWdlcnNcbGFiZWx7Y29udGV4dC1tYW5hZ2Vyc319CiAKIFVuZGVyIHRoZSBob29kLCB0aGUgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgaXMgZmFpcmx5IGNvbXBsaWNhdGVkLgotTW9zdCBwZW9wbGUgd2lsbCBvbmx5IHVzZSAnXGtleXdvcmR7d2l0aH0nIGluIGNvbXBhbnkgd2l0aAotZXhpc3Rpbmcgb2JqZWN0cyB0aGF0IGFyZSBkb2N1bWVudGVkIHRvIHdvcmsgYXMgY29udGV4dCBtYW5hZ2VycywgYW5kCi1kb24ndCBuZWVkIHRvIGtub3cgdGhlc2UgZGV0YWlscywgc28geW91IGNhbiBza2lwIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBpZgoteW91IGxpa2UuICBBdXRob3JzIG9mIG5ldyBjb250ZXh0IG1hbmFnZXJzIHdpbGwgbmVlZCB0byB1bmRlcnN0YW5kIHRoZQotZGV0YWlscyBvZiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KK01vc3QgcGVvcGxlIHdpbGwgb25seSB1c2UgJ1xrZXl3b3Jke3dpdGh9JyBpbiBjb21wYW55IHdpdGggZXhpc3RpbmcKK29iamVjdHMgYW5kIGRvbid0IG5lZWQgdG8ga25vdyB0aGVzZSBkZXRhaWxzLCBzbyB5b3UgY2FuIHNraXAgdGhlIHJlc3QKK29mIHRoaXMgc2VjdGlvbiBpZiB5b3UgbGlrZS4gIEF1dGhvcnMgb2YgbmV3IG9iamVjdHMgd2lsbCBuZWVkIHRvCit1bmRlcnN0YW5kIHRoZSBkZXRhaWxzIG9mIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGFuZCBzaG91bGQKK2tlZXAgcmVhZGluZy4KIAogQSBoaWdoLWxldmVsIGV4cGxhbmF0aW9uIG9mIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wgaXM6CiAKIFxiZWdpbntpdGVtaXplfQorCiBcaXRlbSBUaGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYW5kIHNob3VsZCByZXN1bHQgaW4gYW4gb2JqZWN0Ci10aGF0J3MgYSBjb250ZXh0IG1hbmFnZXIsIG1lYW5pbmcgdGhhdCBpdCBoYXMgYSAKLVxtZXRob2R7X19jb250ZXh0X18oKX0gbWV0aG9kLgorY2FsbGVkIGEgYGBjb250ZXh0IG1hbmFnZXInJy4gIFRoZSBjb250ZXh0IG1hbmFnZXIgbXVzdCBoYXZlCitcbWV0aG9ke19fZW50ZXJfXygpfSBhbmQgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2RzLgogCi1caXRlbSBUaGlzIG9iamVjdCdzIFxtZXRob2R7X19jb250ZXh0X18oKX0gbWV0aG9kIGlzIGNhbGxlZCwgYW5kIG11c3QKLXJldHVybiBhIGNvbnRleHQgb2JqZWN0LiAgCi0KLVxpdGVtIFRoZSBjb250ZXh0J3MgXG1ldGhvZHtfX2VudGVyX18oKX0gbWV0aG9kIGlzIGNhbGxlZC4gCi1UaGUgdmFsdWUgcmV0dXJuZWQgaXMgYXNzaWduZWQgdG8gXHZhcntWQVJ9LiAgSWYgbm8gXGNvZGV7J2FzIFx2YXJ7VkFSfSd9IAotY2xhdXNlIGlzIHByZXNlbnQsIHRoZSB2YWx1ZSBpcyBzaW1wbHkgZGlzY2FyZGVkLgorXGl0ZW0gVGhlIGNvbnRleHQgbWFuYWdlcidzIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCBpcyBjYWxsZWQuICBUaGUgdmFsdWUKK3JldHVybmVkIGlzIGFzc2lnbmVkIHRvIFx2YXJ7VkFSfS4gIElmIG5vIFxjb2RleydhcyBcdmFye1ZBUn0nfSBjbGF1c2UKK2lzIHByZXNlbnQsIHRoZSB2YWx1ZSBpcyBzaW1wbHkgZGlzY2FyZGVkLgogCiBcaXRlbSBUaGUgY29kZSBpbiBcdmFye0JMT0NLfSBpcyBleGVjdXRlZC4KIAotXGl0ZW0gSWYgXHZhcntCTE9DS30gcmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIGNvbnRleHQgb2JqZWN0J3MKK1xpdGVtIElmIFx2YXJ7QkxPQ0t9IHJhaXNlcyBhbiBleGNlcHRpb24sIHRoZQogXG1ldGhvZHtfX2V4aXRfXyhcdmFye3R5cGV9LCBcdmFye3ZhbHVlfSwgXHZhcnt0cmFjZWJhY2t9KX0gaXMgY2FsbGVkCi13aXRoIHRoZSBleGNlcHRpb24ncyBpbmZvcm1hdGlvbiwgdGhlIHNhbWUgdmFsdWVzIHJldHVybmVkIGJ5Ci1cZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9LiAgVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZQotY29udHJvbHMgd2hldGhlciB0aGUgZXhjZXB0aW9uIGlzIHJlLXJhaXNlZDogYW55IGZhbHNlIHZhbHVlIAotcmUtcmFpc2VzIHRoZSBleGNlcHRpb24sIGFuZCBcY29kZXtUcnVlfSB3aWxsIHJlc3VsdCBpbiBzdXBwcmVzc2luZyBpdC4KLVlvdSdsbCBvbmx5IHJhcmVseSB3YW50IHRvIHN1cHByZXNzIHRoZSBleGNlcHRpb247IHRoZSAKLWF1dGhvciBvZiB0aGUgY29kZSBjb250YWluaW5nIHRoZSAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudCB3aWxsIAotbmV2ZXIgcmVhbGl6ZSBhbnl0aGluZyB3ZW50IHdyb25nLgord2l0aCB0aGUgZXhjZXB0aW9uIGRldGFpbHMsIHRoZSBzYW1lIHZhbHVlcyByZXR1cm5lZCBieQorXGZ1bmN0aW9ue3N5cy5leGNfaW5mbygpfS4gIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgY29udHJvbHMgd2hldGhlcgordGhlIGV4Y2VwdGlvbiBpcyByZS1yYWlzZWQ6IGFueSBmYWxzZSB2YWx1ZSByZS1yYWlzZXMgdGhlIGV4Y2VwdGlvbiwKK2FuZCBcY29kZXtUcnVlfSB3aWxsIHJlc3VsdCBpbiBzdXBwcmVzc2luZyBpdC4gIFlvdSdsbCBvbmx5IHJhcmVseQord2FudCB0byBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGlmIHlvdSBkbwordGhlIGF1dGhvciBvZiB0aGUgY29kZSBjb250YWluaW5nIHRoZQorJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgd2lsbCBuZXZlciByZWFsaXplIGFueXRoaW5nIHdlbnQgd3JvbmcuCiAKIFxpdGVtIElmIFx2YXJ7QkxPQ0t9IGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24sIAotdGhlIGNvbnRleHQgb2JqZWN0J3MgXG1ldGhvZHtfX2V4aXRfXygpfSBpcyBzdGlsbCBjYWxsZWQsCit0aGUgXG1ldGhvZHtfX2V4aXRfXygpfSBtZXRob2QgaXMgc3RpbGwgY2FsbGVkLAogYnV0IFx2YXJ7dHlwZX0sIFx2YXJ7dmFsdWV9LCBhbmQgXHZhcnt0cmFjZWJhY2t9IGFyZSBhbGwgXGNvZGV7Tm9uZX0uCiAKIFxlbmR7aXRlbWl6ZX0KIAogTGV0J3MgdGhpbmsgdGhyb3VnaCBhbiBleGFtcGxlLiAgSSB3b24ndCBwcmVzZW50IGRldGFpbGVkIGNvZGUgYnV0Ci13aWxsIG9ubHkgc2tldGNoIHRoZSBuZWNlc3NhcnkgY29kZS4gIFRoZSBleGFtcGxlIHdpbGwgYmUgd3JpdGluZyBhCi1jb250ZXh0IG1hbmFnZXIgZm9yIGEgZGF0YWJhc2UgdGhhdCBzdXBwb3J0cyB0cmFuc2FjdGlvbnMuCit3aWxsIG9ubHkgc2tldGNoIHRoZSBtZXRob2RzIG5lY2Vzc2FyeSBmb3IgYSBkYXRhYmFzZSB0aGF0IHN1cHBvcnRzCit0cmFuc2FjdGlvbnMuCiAKIChGb3IgcGVvcGxlIHVuZmFtaWxpYXIgd2l0aCBkYXRhYmFzZSB0ZXJtaW5vbG9neTogYSBzZXQgb2YgY2hhbmdlcyB0bwogdGhlIGRhdGFiYXNlIGFyZSBncm91cGVkIGludG8gYSB0cmFuc2FjdGlvbi4gIFRyYW5zYWN0aW9ucyBjYW4gYmUKQEAgLTcyMSwyMiArNzA5LDEzIEBACiAgICAgIyAuLi4gbW9yZSBvcGVyYXRpb25zIC4uLgogXGVuZHt2ZXJiYXRpbX0KIAotVGhlIHRyYW5zYWN0aW9uIHNob3VsZCBlaXRoZXIgYmUgY29tbWl0dGVkIGlmIHRoZSBjb2RlIGluIHRoZSBibG9jawotcnVucyBmbGF3bGVzc2x5LCBvciByb2xsZWQgYmFjayBpZiB0aGVyZSdzIGFuIGV4Y2VwdGlvbi4KLQotRmlyc3QsIHRoZSBcY2xhc3N7RGF0YWJhc2VDb25uZWN0aW9ufSBuZWVkcyBhIFxtZXRob2R7X19jb250ZXh0X18oKX0KLW1ldGhvZC4gIFNvbWV0aW1lcyBhbiBvYmplY3QgY2FuIGJlIGl0cyBvd24gY29udGV4dCBtYW5hZ2VyIGFuZCBjYW4KLXNpbXBseSByZXR1cm4gXGNvZGV7c2VsZn07IHRoZSBcbW9kdWxle3RocmVhZGluZ30gbW9kdWxlJ3MgbG9jayBvYmplY3RzIAotY2FuIGRvIHRoaXMuICBGb3Igb3VyIGRhdGFiYXNlIGV4YW1wbGUsIHRob3VnaCwgd2UgbmVlZCB0byAKLWNyZWF0ZSBhIG5ldyBvYmplY3Q7IEknbGwgY2FsbCB0aGlzIGNsYXNzIFxjbGFzc3tEYXRhYmFzZUNvbnRleHR9LgotT3VyIFxtZXRob2R7X19jb250ZXh0X18oKX0gbXVzdCB0aGVyZWZvcmUgbG9vayBsaWtlIHRoaXM6CitUaGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGNvbW1pdHRlZCBpZiB0aGUgY29kZSBpbiB0aGUgYmxvY2sKK3J1bnMgZmxhd2xlc3NseSBvciByb2xsZWQgYmFjayBpZiB0aGVyZSdzIGFuIGV4Y2VwdGlvbi4KK0hlcmUncyB0aGUgYmFzaWMgaW50ZXJmYWNlCitmb3IgXGNsYXNze0RhdGFiYXNlQ29ubmVjdGlvbn0gdGhhdCBJJ2xsIGFzc3VtZToKIAogXGJlZ2lue3ZlcmJhdGltfQogY2xhc3MgRGF0YWJhc2VDb25uZWN0aW9uOgotICAgIC4uLgotICAgIGRlZiBfX2NvbnRleHRfXyAoc2VsZik6Ci0gICAgICAgIHJldHVybiBEYXRhYmFzZUNvbnRleHQoc2VsZikKLQogICAgICMgRGF0YWJhc2UgaW50ZXJmYWNlCiAgICAgZGVmIGN1cnNvciAoc2VsZik6CiAgICAgICAgICJSZXR1cm5zIGEgY3Vyc29yIG9iamVjdCBhbmQgc3RhcnRzIGEgbmV3IHRyYW5zYWN0aW9uIgpAQCAtNzQ2LDI5ICs3MjUsMTggQEAKICAgICAgICAgIlJvbGxzIGJhY2sgY3VycmVudCB0cmFuc2FjdGlvbiIKIFxlbmR7dmVyYmF0aW19CiAKLVRoZSBjb250ZXh0IG5lZWRzIHRoZSBjb25uZWN0aW9uIG9iamVjdCBzbyB0aGF0IHRoZSBjb25uZWN0aW9uCi1vYmplY3QncyBcbWV0aG9ke2NvbW1pdCgpfSBvciBcbWV0aG9ke3JvbGxiYWNrKCl9IG1ldGhvZHMgY2FuIGJlCi1jYWxsZWQ6CitUaGUgXG1ldGhvZCB7X19lbnRlcl9fKCl9IG1ldGhvZCBpcyBwcmV0dHkgZWFzeSwgaGF2aW5nIG9ubHkgdG8gc3RhcnQKK2EgbmV3IHRyYW5zYWN0aW9uLiAgRm9yIHRoaXMgYXBwbGljYXRpb24gdGhlIHJlc3VsdGluZyBjdXJzb3Igb2JqZWN0Cit3b3VsZCBiZSBhIHVzZWZ1bCByZXN1bHQsIHNvIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaXQuICBUaGUgdXNlciBjYW4KK3RoZW4gYWRkIFxjb2Rle2FzIGN1cnNvcn0gdG8gdGhlaXIgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgdG8gYmluZAordGhlIGN1cnNvciB0byBhIHZhcmlhYmxlIG5hbWUuCiAKIFxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIERhdGFiYXNlQ29udGV4dDoKLSAgICBkZWYgX19pbml0X18gKHNlbGYsIGNvbm5lY3Rpb24pOgotICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uCi1cZW5ke3ZlcmJhdGltfQotCi1UaGUgXG1ldGhvZCB7X19lbnRlcl9fKCl9IG1ldGhvZCBpcyBwcmV0dHkgZWFzeSwgaGF2aW5nIG9ubHkKLXRvIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uLiAgSW4gdGhpcyBleGFtcGxlLAotdGhlIHJlc3VsdGluZyBjdXJzb3Igb2JqZWN0IHdvdWxkIGJlIGEgdXNlZnVsIHJlc3VsdCwKLXNvIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gaXQuICBUaGUgdXNlciBjYW4gCi10aGVuIGFkZCBcY29kZXthcyBjdXJzb3J9IHRvIHRoZWlyICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50Ci10byBiaW5kIHRoZSBjdXJzb3IgdG8gYSB2YXJpYWJsZSBuYW1lLgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBEYXRhYmFzZUNvbnRleHQ6CitjbGFzcyBEYXRhYmFzZUNvbm5lY3Rpb246CiAgICAgLi4uCiAgICAgZGVmIF9fZW50ZXJfXyAoc2VsZik6CiAgICAgICAgICMgQ29kZSB0byBzdGFydCBhIG5ldyB0cmFuc2FjdGlvbgotICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKKyAgICAgICAgY3Vyc29yID0gc2VsZi5jdXJzb3IoKQogICAgICAgICByZXR1cm4gY3Vyc29yCiBcZW5ke3ZlcmJhdGltfQogCkBAIC03NzYsMjEgKzc0NCwyMyBAQAogd2hlcmUgbW9zdCBvZiB0aGUgd29yayBoYXMgdG8gYmUgZG9uZS4gIFRoZSBtZXRob2QgaGFzIHRvIGNoZWNrIGlmIGFuCiBleGNlcHRpb24gb2NjdXJyZWQuICBJZiB0aGVyZSB3YXMgbm8gZXhjZXB0aW9uLCB0aGUgdHJhbnNhY3Rpb24gaXMKIGNvbW1pdHRlZC4gIFRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjayBpZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uLgotSGVyZSB0aGUgY29kZSB3aWxsIGp1c3QgZmFsbCBvZmYgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIHJldHVybmluZyAKLXRoZSBkZWZhdWx0IHZhbHVlIG9mIFxjb2Rle05vbmV9LiAgXGNvZGV7Tm9uZX0gaXMgZmFsc2UsIHNvIHRoZSBleGNlcHRpb24KLXdpbGwgYmUgcmUtcmFpc2VkIGF1dG9tYXRpY2FsbHkuICBJZiB5b3Ugd2lzaGVkLCB5b3UgY291bGQgYmUgbW9yZSBleHBsaWNpdAotYW5kIGFkZCBhIFxrZXl3b3Jke3JldHVybn0gYXQgdGhlIG1hcmtlZCBsb2NhdGlvbi4KKworSW4gdGhlIGNvZGUgYmVsb3csIGV4ZWN1dGlvbiB3aWxsIGp1c3QgZmFsbCBvZmYgdGhlIGVuZCBvZiB0aGUKK2Z1bmN0aW9uLCByZXR1cm5pbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgXGNvZGV7Tm9uZX0uICBcY29kZXtOb25lfSBpcworZmFsc2UsIHNvIHRoZSBleGNlcHRpb24gd2lsbCBiZSByZS1yYWlzZWQgYXV0b21hdGljYWxseS4gIElmIHlvdQord2lzaGVkLCB5b3UgY291bGQgYmUgbW9yZSBleHBsaWNpdCBhbmQgYWRkIGEgXGtleXdvcmR7cmV0dXJufQorc3RhdGVtZW50IGF0IHRoZSBtYXJrZWQgbG9jYXRpb24uCiAKIFxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIERhdGFiYXNlQ29udGV4dDoKK2NsYXNzIERhdGFiYXNlQ29ubmVjdGlvbjoKICAgICAuLi4KICAgICBkZWYgX19leGl0X18gKHNlbGYsIHR5cGUsIHZhbHVlLCB0Yik6CiAgICAgICAgIGlmIHRiIGlzIE5vbmU6CiAgICAgICAgICAgICAjIE5vIGV4Y2VwdGlvbiwgc28gY29tbWl0Ci0gICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKKyAgICAgICAgICAgIHNlbGYuY29tbWl0KCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgRXhjZXB0aW9uIG9jY3VycmVkLCBzbyByb2xsYmFjay4KLSAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5yb2xsYmFjaygpCisgICAgICAgICAgICBzZWxmLnJvbGxiYWNrKCkKICAgICAgICAgICAgICMgcmV0dXJuIEZhbHNlCiBcZW5ke3ZlcmJhdGltfQogCkBAIC03OTgsMjUgKzc2OCwyNiBAQAogXHN1YnNlY3Rpb257VGhlIGNvbnRleHRsaWIgbW9kdWxlXGxhYmVse21vZHVsZS1jb250ZXh0bGlifX0KIAogVGhlIG5ldyBcbW9kdWxle2NvbnRleHRsaWJ9IG1vZHVsZSBwcm92aWRlcyBzb21lIGZ1bmN0aW9ucyBhbmQgYQotZGVjb3JhdG9yIHRoYXQgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBjb250ZXh0IG1hbmFnZXJzLgorZGVjb3JhdG9yIHRoYXQgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBvYmplY3RzIGZvciB1c2Ugd2l0aCB0aGUKKydca2V5d29yZHt3aXRofScgc3RhdGVtZW50LgogCi1UaGUgZGVjb3JhdG9yIGlzIGNhbGxlZCBcZnVuY3Rpb257Y29udGV4dG1hbmFnZXJ9LCBhbmQgbGV0cyB5b3Ugd3JpdGUKLWEgc2ltcGxlIGNvbnRleHQgbWFuYWdlciBhcyBhIGdlbmVyYXRvci4gIFRoZSBnZW5lcmF0b3Igc2hvdWxkIHlpZWxkCi1leGFjdGx5IG9uZSB2YWx1ZS4gIFRoZSBjb2RlIHVwIHRvIHRoZSBca2V5d29yZHt5aWVsZH0gd2lsbCBiZQotZXhlY3V0ZWQgYXMgdGhlIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCwgYW5kIHRoZSB2YWx1ZSB5aWVsZGVkCi13aWxsIGJlIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgdGhhdCB3aWxsIGdldCBib3VuZCB0byB0aGUgdmFyaWFibGUKLWluIHRoZSAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudCdzIFxrZXl3b3Jke2FzfSBjbGF1c2UsIGlmIGFueS4gIFRoZQotY29kZSBhZnRlciB0aGUgXGtleXdvcmR7eWllbGR9IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlCi1cbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZC4gIEFueSBleGNlcHRpb24gcmFpc2VkIGluIHRoZSBibG9jayAKLXdpbGwgYmUgcmFpc2VkIGJ5IHRoZSBca2V5d29yZHt5aWVsZH0gc3RhdGVtZW50LgorVGhlIGRlY29yYXRvciBpcyBjYWxsZWQgXGZ1bmN0aW9ue2NvbnRleHRmYWN0b3J5fSwgYW5kIGxldHMgeW91IHdyaXRlCithIHNpbmdsZSBnZW5lcmF0b3IgZnVuY3Rpb24gaW5zdGVhZCBvZiBkZWZpbmluZyBhIG5ldyBjbGFzcy4gIFRoZSBnZW5lcmF0b3IKK3Nob3VsZCB5aWVsZCBleGFjdGx5IG9uZSB2YWx1ZS4gIFRoZSBjb2RlIHVwIHRvIHRoZSBca2V5d29yZHt5aWVsZH0KK3dpbGwgYmUgZXhlY3V0ZWQgYXMgdGhlIFxtZXRob2R7X19lbnRlcl9fKCl9IG1ldGhvZCwgYW5kIHRoZSB2YWx1ZQoreWllbGRlZCB3aWxsIGJlIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgdGhhdCB3aWxsIGdldCBib3VuZCB0byB0aGUKK3ZhcmlhYmxlIGluIHRoZSAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudCdzIFxrZXl3b3Jke2FzfSBjbGF1c2UsIGlmCithbnkuICBUaGUgY29kZSBhZnRlciB0aGUgXGtleXdvcmR7eWllbGR9IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlCitcbWV0aG9ke19fZXhpdF9fKCl9IG1ldGhvZC4gIEFueSBleGNlcHRpb24gcmFpc2VkIGluIHRoZSBibG9jayB3aWxsIGJlCityYWlzZWQgYnkgdGhlIFxrZXl3b3Jke3lpZWxkfSBzdGF0ZW1lbnQuCiAKIE91ciBkYXRhYmFzZSBleGFtcGxlIGZyb20gdGhlIHByZXZpb3VzIHNlY3Rpb24gY291bGQgYmUgd3JpdHRlbiAKIHVzaW5nIHRoaXMgZGVjb3JhdG9yIGFzOgogCiBcYmVnaW57dmVyYmF0aW19Ci1mcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRmYWN0b3J5CiAKLUBjb250ZXh0bWFuYWdlcgorQGNvbnRleHRmYWN0b3J5CiBkZWYgZGJfdHJhbnNhY3Rpb24gKGNvbm5lY3Rpb24pOgogICAgIGN1cnNvciA9IGNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICB0cnk6CkBAIC04MzIsMjkgKzgwMywxMSBAQAogICAgIC4uLgogXGVuZHt2ZXJiYXRpbX0KIAotWW91IGNhbiBhbHNvIHVzZSB0aGlzIGRlY29yYXRvciB0byB3cml0ZSB0aGUgXG1ldGhvZHtfX2NvbnRleHRfXygpfSBtZXRob2QKLWZvciBhIGNsYXNzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgY2xhc3MgZm9yIHRoZSBjb250ZXh0OgotCi1cYmVnaW57dmVyYmF0aW19Ci1jbGFzcyBEYXRhYmFzZUNvbm5lY3Rpb246Ci0KLSAgICBAY29udGV4dG1hbmFnZXIKLSAgICBkZWYgX19jb250ZXh0X18gKHNlbGYpOgotCWN1cnNvciA9IHNlbGYuY3Vyc29yKCkKLQl0cnk6Ci0JICAgIHlpZWxkIGN1cnNvcgotCWV4Y2VwdDoKLQkgICAgc2VsZi5yb2xsYmFjaygpCi0JICAgIHJhaXNlCi0JZWxzZToKLQkgICAgc2VsZi5jb21taXQoKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1UaGVyZSdzIGEgXGZ1bmN0aW9ue25lc3RlZChcdmFye21ncjF9LCBcdmFye21ncjJ9LCAuLi4pfSBtYW5hZ2VyIHRoYXQKLWNvbWJpbmVzIGEgbnVtYmVyIG9mIGNvbnRleHQgbWFuYWdlcnMgc28geW91IGRvbid0IG5lZWQgdG8gd3JpdGUKLW5lc3RlZCAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudHMuICBUaGlzIGV4YW1wbGUgc3RhdGVtZW50IGRvZXMgdHdvCi10aGluZ3MsIHN0YXJ0aW5nIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gYW5kIGFjcXVpcmluZyBhIHRocmVhZCBsb2NrOgorVGhlIFxtb2R1bGV7Y29udGV4dGxpYn0gbW9kdWxlIGFsc28gaGFzIGEgXGZ1bmN0aW9ue25lc3RlZChcdmFye21ncjF9LAorXHZhcnttZ3IyfSwgLi4uKX0gZnVuY3Rpb24gdGhhdCBjb21iaW5lcyBhIG51bWJlciBvZiBjb250ZXh0IG1hbmFnZXJzIHNvIHlvdQorZG9uJ3QgbmVlZCB0byB3cml0ZSBuZXN0ZWQgJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnRzLiAgSW4gdGhpcworZXhhbXBsZSwgdGhlIHNpbmdsZSAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudCBib3RoIHN0YXJ0cyBhIGRhdGFiYXNlCit0cmFuc2FjdGlvbiBhbmQgYWNxdWlyZXMgYSB0aHJlYWQgbG9jazoKIAogXGJlZ2lue3ZlcmJhdGltfQogbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKQEAgLTg2Miw3ICs4MTUsNyBAQAogICAgIC4uLgogXGVuZHt2ZXJiYXRpbX0KIAotRmluYWxseSwgdGhlIFxmdW5jdGlvbntjbG9zaW5nKFx2YXJ7b2JqZWN0fSl9IGNvbnRleHQgbWFuYWdlciAKK0ZpbmFsbHksIHRoZSBcZnVuY3Rpb257Y2xvc2luZyhcdmFye29iamVjdH0pfSBmdW5jdGlvbgogcmV0dXJucyBcdmFye29iamVjdH0gc28gdGhhdCBpdCBjYW4gYmUgYm91bmQgdG8gYSB2YXJpYWJsZSwKIGFuZCBjYWxscyBcY29kZXtcdmFye29iamVjdH0uY2xvc2UoKX0gYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2suCiAKQEAgLTg4MCw4ICs4MzMsNyBAQAogXHNlZXBlcHszNDN9e1RoZSBgYHdpdGgnJyBzdGF0ZW1lbnR9e1BFUCB3cml0dGVuIGJ5IEd1aWRvIHZhbn5Sb3NzdW0KIGFuZCBOaWNrIENvZ2hsYW47IGltcGxlbWVudGVkIGJ5IE1pa2UgQmxhbmQsIEd1aWRvIHZhbn5Sb3NzdW0sIGFuZAogTmVhbCBOb3J3aXR6LiAgVGhlIFBFUCBzaG93cyB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIGEgJ1xrZXl3b3Jke3dpdGh9Jwotc3RhdGVtZW50LCB3aGljaCBjYW4gYmUgaGVscGZ1bCBpbiBsZWFybmluZyBob3cgY29udGV4dCBtYW5hZ2Vycwotd29yay59CitzdGF0ZW1lbnQsIHdoaWNoIGNhbiBiZSBoZWxwZnVsIGluIGxlYXJuaW5nIGhvdyB0aGUgc3RhdGVtZW50IHdvcmtzLn0KIAogXHNlZXVybHsuLi9saWIvbW9kdWxlLWNvbnRleHRsaWIuaHRtbH17VGhlIGRvY3VtZW50YXRpb24gCiBmb3IgdGhlIFxtb2R1bGV7Y29udGV4dGxpYn0gbW9kdWxlLn0KQEAgLTEwNjQsNyArMTAxNiw3IEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue090aGVyIExhbmd1YWdlIENoYW5nZXN9Citcc2VjdGlvbntPdGhlciBMYW5ndWFnZSBDaGFuZ2VzXGxhYmVse290aGVyLWxhbmd9fQogCiBIZXJlIGFyZSBhbGwgb2YgdGhlIGNoYW5nZXMgdGhhdCBQeXRob24gMi41IG1ha2VzIHRvIHRoZSBjb3JlIFB5dGhvbgogbGFuZ3VhZ2UuCkBAIC0xMDkwLDYgKzEwNDIsMzYgQEAKIHByaW50IGRbM10sIGRbNF0gICAjIFByaW50cyAwLCAwCiBcZW5ke3ZlcmJhdGltfQogCitcaXRlbSBCb3RoIDgtYml0IGFuZCBVbmljb2RlIHN0cmluZ3MgaGF2ZSBuZXcgXG1ldGhvZHtwYXJ0aXRpb24oc2VwKX0gCithbmQgXG1ldGhvZHtycGFydGl0aW9uKHNlcCl9IG1ldGhvZHMgdGhhdCBzaW1wbGlmeSBhIGNvbW1vbiB1c2UgY2FzZS4KK1RoZSBcbWV0aG9ke2ZpbmQoUyl9IG1ldGhvZCBpcyBvZnRlbiB1c2VkIHRvIGdldCBhbiBpbmRleCB3aGljaCBpcwordGhlbiB1c2VkIHRvIHNsaWNlIHRoZSBzdHJpbmcgYW5kIG9idGFpbiB0aGUgcGllY2VzIHRoYXQgYXJlIGJlZm9yZQorYW5kIGFmdGVyIHRoZSBzZXBhcmF0b3IuICAKKworXG1ldGhvZHtwYXJ0aXRpb24oc2VwKX0gY29uZGVuc2VzIHRoaXMKK3BhdHRlcm4gaW50byBhIHNpbmdsZSBtZXRob2QgY2FsbCB0aGF0IHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcKK3RoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlCitzdWJzdHJpbmcgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXNuJ3QgZm91bmQsIHRoZQorZmlyc3QgZWxlbWVudCBvZiB0aGUgdHVwbGUgaXMgdGhlIGVudGlyZSBzdHJpbmcgYW5kIHRoZSBvdGhlciB0d28KK2VsZW1lbnRzIGFyZSBlbXB0eS4gIFxtZXRob2R7cnBhcnRpdGlvbihzZXApfSBhbHNvIHJldHVybnMgYSAzLXR1cGxlCitidXQgc3RhcnRzIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZzsgdGhlIFxzYW1we3J9IHN0YW5kcworZm9yICdyZXZlcnNlJy4KKworU29tZSBleGFtcGxlczoKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+ICgnaHR0cDovL3d3dy5weXRob24ub3JnJykucGFydGl0aW9uKCc6Ly8nKQorKCdodHRwJywgJzovLycsICd3d3cucHl0aG9uLm9yZycpCis+Pj4gKHUnU3ViamVjdDogYSBxdWljayBxdWVzdGlvbicpLnBhcnRpdGlvbignOicpCisodSdTdWJqZWN0JywgdSc6JywgdScgYSBxdWljayBxdWVzdGlvbicpCis+Pj4gKCdmaWxlOi91c3Ivc2hhcmUvZG9jL2luZGV4Lmh0bWwnKS5wYXJ0aXRpb24oJzovLycpCisoJ2ZpbGU6L3Vzci9zaGFyZS9kb2MvaW5kZXguaHRtbCcsICcnLCAnJykKKz4+PiAnd3d3LnB5dGhvbi5vcmcnLnJwYXJ0aXRpb24oJy4nKQorKCd3d3cucHl0aG9uJywgJy4nLCAnb3JnJykKK1xlbmR7dmVyYmF0aW19CisKKyhJbXBsZW1lbnRlZCBieSBGcmVkcmlrIEx1bmRoIGZvbGxvd2luZyBhIHN1Z2dlc3Rpb24gYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQorCiBcaXRlbSBUaGUgXGZ1bmN0aW9ue21pbigpfSBhbmQgXGZ1bmN0aW9ue21heCgpfSBidWlsdC1pbiBmdW5jdGlvbnMKIGdhaW5lZCBhIFxjb2Rle2tleX0ga2V5d29yZCBwYXJhbWV0ZXIgYW5hbG9nb3VzIHRvIHRoZSBcY29kZXtrZXl9CiBhcmd1bWVudCBmb3IgXG1ldGhvZHtzb3J0KCl9LiAgVGhpcyBwYXJhbWV0ZXIgc3VwcGxpZXMgYSBmdW5jdGlvbiB0aGF0CkBAIC0xMTI3LDYgKzExMDksMTQgQEAKICMgLSotIGNvZGluZzogbGF0aW4xIC0qLQogXGVuZHt2ZXJiYXRpbX0KIAorXGl0ZW0gT25lIGVycm9yIHRoYXQgUHl0aG9uIHByb2dyYW1tZXJzIHNvbWV0aW1lcyBtYWtlIGlzIGZvcmdldHRpbmcKK3RvIGluY2x1ZGUgYW4gXGZpbGV7X19pbml0X18ucHl9IG1vZHVsZSBpbiBhIHBhY2thZ2UgZGlyZWN0b3J5LgorRGVidWdnaW5nIHRoaXMgbWlzdGFrZSBjYW4gYmUgY29uZnVzaW5nLCBhbmQgdXN1YWxseSByZXF1aXJlcyBydW5uaW5nCitQeXRob24gd2l0aCB0aGUgXHByb2dyYW1vcHR7LXZ9IHN3aXRjaCB0byBsb2cgYWxsIHRoZSBwYXRocyBzZWFyY2hlZC4KK0luIFB5dGhvbiAyLjUsIGEgbmV3IFxleGNlcHRpb257SW1wb3J0V2FybmluZ30gd2FybmluZyBpcyByYWlzZWQgd2hlbgorYW4gaW1wb3J0IHdvdWxkIGhhdmUgcGlja2VkIHVwIGEgZGlyZWN0b3J5IGFzIGEgcGFja2FnZSBidXQgbm8KK1xmaWxle19faW5pdF9fLnB5fSB3YXMgZm91bmQuICAoSW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMuKQorCiBcaXRlbSBUaGUgbGlzdCBvZiBiYXNlIGNsYXNzZXMgaW4gYSBjbGFzcyBkZWZpbml0aW9uIGNhbiBub3cgYmUgZW1wdHkuICAKIEFzIGFuIGV4YW1wbGUsIHRoaXMgaXMgbm93IGxlZ2FsOgogCkBAIC0xMTQwLDcgKzExMzAsNyBAQAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntJbnRlcmFjdGl2ZSBJbnRlcnByZXRlciBDaGFuZ2VzfQorXHN1YnNlY3Rpb257SW50ZXJhY3RpdmUgSW50ZXJwcmV0ZXIgQ2hhbmdlc1xsYWJlbHtpbnRlcmFjdGl2ZX19CiAKIEluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciwgXGNvZGV7cXVpdH0gYW5kIFxjb2Rle2V4aXR9IAogaGF2ZSBsb25nIGJlZW4gc3RyaW5ncyBzbyB0aGF0IG5ldyB1c2VycyBnZXQgYSBzb21ld2hhdCBoZWxwZnVsIG1lc3NhZ2UKQEAgLTExNTgsNyArMTE0OCwxNCBAQAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntPcHRpbWl6YXRpb25zfQorXHN1YnNlY3Rpb257T3B0aW1pemF0aW9uc1xsYWJlbHtvcHRzfX0KKworU2V2ZXJhbCBvZiB0aGUgb3B0aW1pemF0aW9ucyB3ZXJlIGRldmVsb3BlZCBhdCB0aGUgTmVlZEZvclNwZWVkCitzcHJpbnQsIGFuIGV2ZW50IGhlbGQgaW4gUmV5a2phdmlrLCBJY2VsYW5kLCBmcm9tIE1heSAyMS0tMjggMjAwNi4KK1RoZSBzcHJpbnQgZm9jdXNlZCBvbiBzcGVlZCBlbmhhbmNlbWVudHMgdG8gdGhlIENQeXRob24gaW1wbGVtZW50YXRpb24KK2FuZCB3YXMgZnVuZGVkIGJ5IEVXVCBMTEMgd2l0aCBsb2NhbCBzdXBwb3J0IGZyb20gQ0NQIEdhbWVzLiAgVGhvc2UKK29wdGltaXphdGlvbnMgYWRkZWQgYXQgdGhpcyBzcHJpbnQgYXJlIHNwZWNpYWxseSBtYXJrZWQgaW4gdGhlCitmb2xsb3dpbmcgbGlzdC4KIAogXGJlZ2lue2l0ZW1pemV9CiAKQEAgLTExNjksMTUgKzExNjYsNTMgQEAKIGFuZCBhcyBhIHJlc3VsdCBzZXRzIHdpbGwgdXNlIGEgdGhpcmQgbGVzcyBtZW1vcnkgYW5kIGFyZSBzb21ld2hhdCBmYXN0ZXIuCiAoSW1wbGVtZW50ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCi1caXRlbSBUaGUgcGVyZm9ybWFuY2Ugb2Ygc29tZSBVbmljb2RlIG9wZXJhdGlvbnMsIHN1Y2ggYXMgCi1jaGFyYWN0ZXIgbWFwIGRlY29kaW5nLCBoYXMgYmVlbiBpbXByb3ZlZC4KK1xpdGVtIFRoZSBzcGVlZCBvZiBzb21lIFVuaWNvZGUgb3BlcmF0aW9ucywgc3VjaCBhcyAKK2ZpbmRpbmcgc3Vic3RyaW5ncywgc3RyaW5nIHNwbGl0dGluZywgYW5kIGNoYXJhY3RlciBtYXAgZGVjb2RpbmcsIGhhcworYmVlbiBpbXByb3ZlZC4gIChTdWJzdHJpbmcgc2VhcmNoIGFuZCBzcGxpdHRpbmcgaW1wcm92ZW1lbnRzIHdlcmUKK2FkZGVkIGJ5IEZyZWRyaWsgTHVuZGggYW5kIEFuZHJldyBEYWxrZSBhdCB0aGUgTmVlZEZvclNwZWVkCitzcHJpbnQuIENoYXJhY3RlciBtYXAgZGVjb2Rpbmcgd2FzIGltcHJvdmVkIGJ5IFdhbHRlciBEXCJvcndhbGQuKQogJSBQYXRjaCAxMzEzOTM5CiAKK1xpdGVtIFRoZSBcZnVuY3Rpb257bG9uZyhcdmFye3N0cn0sIFx2YXJ7YmFzZX0pfSBmdW5jdGlvbiBpcyBub3cKK2Zhc3RlciBvbiBsb25nIGRpZ2l0IHN0cmluZ3MgYmVjYXVzZSBmZXdlciBpbnRlcm1lZGlhdGUgcmVzdWx0cyBhcmUKK2NhbGN1bGF0ZWQuICBUaGUgcGVhayBpcyBmb3Igc3RyaW5ncyBvZiBhcm91bmQgODAwLS0xMDAwIGRpZ2l0cyB3aGVyZSAKK3RoZSBmdW5jdGlvbiBpcyA2IHRpbWVzIGZhc3Rlci4KKyhDb250cmlidXRlZCBieSBBbGFuIE1jSW50eXJlIGFuZCBjb21taXR0ZWQgYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQorJSBQYXRjaCAxNDQyOTI3CisKK1xpdGVtIFRoZSBcbW9kdWxle3N0cnVjdH0gbW9kdWxlIG5vdyBjb21waWxlcyBzdHJ1Y3R1cmUgZm9ybWF0IAorc3RyaW5ncyBpbnRvIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGFuZCBjYWNoZXMgdGhpcworcmVwcmVzZW50YXRpb24sIHlpZWxkaW5nIGEgMjBcJSBzcGVlZHVwLiAgKENvbnRyaWJ1dGVkIGJ5IEJvYiBJcHBvbGl0bworYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQorCiBcaXRlbSBUaGUgY29kZSBnZW5lcmF0b3IncyBwZWVwaG9sZSBvcHRpbWl6ZXIgbm93IHBlcmZvcm1zCiBzaW1wbGUgY29uc3RhbnQgZm9sZGluZyBpbiBleHByZXNzaW9ucy4gIElmIHlvdSB3cml0ZSBzb21ldGhpbmcgbGlrZQogXGNvZGV7YSA9IDIrM30sIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGRvIHRoZSBhcml0aG1ldGljIGFuZCBwcm9kdWNlCiBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gXGNvZGV7YSA9IDV9LgogCitcaXRlbSBGdW5jdGlvbiBjYWxscyBhcmUgbm93IGZhc3RlciBiZWNhdXNlIGNvZGUgb2JqZWN0cyBub3cga2VlcCAKK3RoZSBtb3N0IHJlY2VudGx5IGZpbmlzaGVkIGZyYW1lIChhIGBgem9tYmllIGZyYW1lJycpIGluIGFuIGludGVybmFsCitmaWVsZCBvZiB0aGUgY29kZSBvYmplY3QsIHJldXNpbmcgaXQgdGhlIG5leHQgdGltZSB0aGUgY29kZSBvYmplY3QgaXMKK2ludm9rZWQuICAoT3JpZ2luYWwgcGF0Y2ggYnkgTWljaGFlbCBIdWRzb24sIG1vZGlmaWVkIGJ5IEFybWluIFJpZ28KK2FuZCBSaWNoYXJkIEpvbmVzOyBjb21taXR0ZWQgYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQorJSBQYXRjaCA4NzYyMDYKKworRnJhbWUgb2JqZWN0cyBhcmUgYWxzbyBzbGlnaHRseSBzbWFsbGVyLCB3aGljaCBtYXkgaW1wcm92ZSBjYWNoZSBsb2NhbGl0eQorYW5kIHJlZHVjZSBtZW1vcnkgdXNhZ2UgYSBiaXQuICAoQ29udHJpYnV0ZWQgYnkgTmVhbCBOb3J3aXR6LikKKyUgUGF0Y2ggMTMzNzA1MQorCitcaXRlbSBQeXRob24ncyBidWlsdC1pbiBleGNlcHRpb25zIGFyZSBub3cgbmV3LXN0eWxlIGNsYXNzZXMsIGEgY2hhbmdlCit0aGF0IHNwZWVkcyB1cCBpbnN0YW50aWF0aW9uIGNvbnNpZGVyYWJseS4gIEV4Y2VwdGlvbiBoYW5kbGluZyBpbgorUHl0aG9uIDIuNSBpcyB0aGVyZWZvcmUgYWJvdXQgMzBcJSBmYXN0ZXIgdGhhbiBpbiAyLjQuCisoQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBKb25lcywgR2VvcmcgQnJhbmRsIGFuZCBTZWFuIFJlaWZzY2huZWlkZXIgYXQKK3RoZSBOZWVkRm9yU3BlZWQgc3ByaW50LikKKworXGl0ZW0gSW1wb3J0aW5nIG5vdyBjYWNoZXMgdGhlIHBhdGhzIHRyaWVkLCByZWNvcmRpbmcgd2hldGhlciAKK3RoZXkgZXhpc3Qgb3Igbm90IHNvIHRoYXQgdGhlIGludGVycHJldGVyIG1ha2VzIGZld2VyIAorXGNmdW5jdGlvbntvcGVuKCl9IGFuZCBcY2Z1bmN0aW9ue3N0YXQoKX0gY2FsbHMgb24gc3RhcnR1cC4KKyhDb250cmlidXRlZCBieSBNYXJ0aW4gdm9ufkxcIm93aXMgYW5kIEdlb3JnIEJyYW5kbC4pCislIFBhdGNoIDkyMTQ2NgorCiBcZW5ke2l0ZW1pemV9CiAKIFRoZSBuZXQgcmVzdWx0IG9mIHRoZSAyLjUgb3B0aW1pemF0aW9ucyBpcyB0aGF0IFB5dGhvbiAyLjUgcnVucyB0aGUKQEAgLTExODUsNyArMTIyMCw3IEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue05ldywgSW1wcm92ZWQsIGFuZCBSZW1vdmVkIE1vZHVsZXN9Citcc2VjdGlvbntOZXcsIEltcHJvdmVkLCBhbmQgUmVtb3ZlZCBNb2R1bGVzXGxhYmVse21vZHVsZXN9fQogCiBUaGUgc3RhbmRhcmQgbGlicmFyeSByZWNlaXZlZCBtYW55IGVuaGFuY2VtZW50cyBhbmQgYnVnIGZpeGVzIGluCiBQeXRob24gMi41LiAgSGVyZSdzIGEgcGFydGlhbCBsaXN0IG9mIHRoZSBtb3N0IG5vdGFibGUgY2hhbmdlcywgc29ydGVkCkBAIC0xMjU1LDcgKzEyOTAsNiBAQAogXGl0ZW0gTmV3IG1vZHVsZTogVGhlIFxtb2R1bGV7Y29udGV4dGxpYn0gbW9kdWxlIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgZm9yIHVzZSAKIHdpdGggdGhlIG5ldyAnXGtleXdvcmR7d2l0aH0nIHN0YXRlbWVudC4gIFNlZQogc2VjdGlvbn5ccmVme21vZHVsZS1jb250ZXh0bGlifSBmb3IgbW9yZSBhYm91dCB0aGlzIG1vZHVsZS4KLShDb250cmlidXRlZCBieSBQaGlsbGlwIEouIEVieS4pCiAKIFxpdGVtIE5ldyBtb2R1bGU6IFRoZSBcbW9kdWxle2NQcm9maWxlfSBtb2R1bGUgaXMgYSBDIGltcGxlbWVudGF0aW9uIG9mIAogdGhlIGV4aXN0aW5nIFxtb2R1bGV7cHJvZmlsZX0gbW9kdWxlIHRoYXQgaGFzIG11Y2ggbG93ZXIgb3ZlcmhlYWQuCkBAIC0xMjY2LDggKzEzMDAsOCBAQAogbW9kdWxlJ3MgaW50ZXJmYWNlLCB3aWxsIGNvbnRpbnVlIHRvIGJlIG1haW50YWluZWQgaW4gZnV0dXJlIHZlcnNpb25zCiBvZiBQeXRob24uICAoQ29udHJpYnV0ZWQgYnkgQXJtaW4gUmlnby4pCiAKLUFsc28sIHRoZSBcbW9kdWxle3BzdGF0c30gbW9kdWxlIHVzZWQgdG8gYW5hbHl6ZSB0aGUgZGF0YSBtZWFzdXJlZCBieQotdGhlIHByb2ZpbGVyIG5vdyBzdXBwb3J0cyBkaXJlY3RpbmcgdGhlIG91dHB1dCB0byBhbnkgZmlsZSBzdHJlYW0gCitBbHNvLCB0aGUgXG1vZHVsZXtwc3RhdHN9IG1vZHVsZSBmb3IgYW5hbHl6aW5nIHRoZSBkYXRhIG1lYXN1cmVkIGJ5Cit0aGUgcHJvZmlsZXIgbm93IHN1cHBvcnRzIGRpcmVjdGluZyB0aGUgb3V0cHV0IHRvIGFueSBmaWxlIG9iamVjdAogYnkgc3VwcGx5aW5nIGEgXHZhcntzdHJlYW19IGFyZ3VtZW50IHRvIHRoZSBcY2xhc3N7U3RhdHN9IGNvbnN0cnVjdG9yLgogKENvbnRyaWJ1dGVkIGJ5IFNraXAgTW9udGFuYXJvLikKIApAQCAtMTI5NSw2ICsxMzI5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICclSDolTTolUyAlWS0lbS0lZCcpCiBcZW5ke3ZlcmJhdGltfQogCitcaXRlbSBUaGUgXG1vZHVsZXtkb2N0ZXN0fSBtb2R1bGUgZ2FpbmVkIGEgXGNvZGV7U0tJUH0gb3B0aW9uIHRoYXQKK2tlZXBzIGFuIGV4YW1wbGUgZnJvbSBiZWluZyBleGVjdXRlZCBhdCBhbGwuICBUaGlzIGlzIGludGVuZGVkIGZvcgorY29kZSBzbmlwcGV0cyB0aGF0IGFyZSB1c2FnZSBleGFtcGxlcyBpbnRlbmRlZCBmb3IgdGhlIHJlYWRlciBhbmQKK2FyZW4ndCBhY3R1YWxseSB0ZXN0IGNhc2VzLgorCiBcaXRlbSBUaGUgXG1vZHVsZXtmaWxlaW5wdXR9IG1vZHVsZSB3YXMgbWFkZSBtb3JlIGZsZXhpYmxlLgogVW5pY29kZSBmaWxlbmFtZXMgYXJlIG5vdyBzdXBwb3J0ZWQsIGFuZCBhIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIHRoYXQKIGRlZmF1bHRzIHRvIFxjb2RleyJyIn0gd2FzIGFkZGVkIHRvIHRoZQpAQCAtMTM0NCw2ICsxMzgzLDM1IEBACiAKIChDb250cmlidXRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCiAKK1xpdGVtIFRoZSBcbW9kdWxle21haWxib3h9IG1vZHVsZSB1bmRlcndlbnQgYSBtYXNzaXZlIHJld3JpdGUgdG8gYWRkCit0aGUgY2FwYWJpbGl0eSB0byBtb2RpZnkgbWFpbGJveGVzIGluIGFkZGl0aW9uIHRvIHJlYWRpbmcgdGhlbS4gIEEgbmV3CitzZXQgb2YgY2xhc3NlcyB0aGF0IGluY2x1ZGUgXGNsYXNze21ib3h9LCBcY2xhc3N7TUh9LCBhbmQKK1xjbGFzc3tNYWlsZGlyfSBhcmUgdXNlZCB0byByZWFkIG1haWxib3hlcywgYW5kIGhhdmUgYW4KK1xtZXRob2R7YWRkKFx2YXJ7bWVzc2FnZX0pfSBtZXRob2QgdG8gYWRkIG1lc3NhZ2VzLAorXG1ldGhvZHtyZW1vdmUoXHZhcntrZXl9KX0gdG8gcmVtb3ZlIG1lc3NhZ2VzLCBhbmQKK1xtZXRob2R7bG9jaygpfS9cbWV0aG9ke3VubG9jaygpfSB0byBsb2NrL3VubG9jayB0aGUgbWFpbGJveC4gIFRoZQorZm9sbG93aW5nIGV4YW1wbGUgY29udmVydHMgYSBtYWlsZGlyLWZvcm1hdCBtYWlsYm94IGludG8gYW4gbWJveC1mb3JtYXQgb25lOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgbWFpbGJveAorCisjICdmYWN0b3J5PU5vbmUnIHVzZXMgZW1haWwuTWVzc2FnZS5NZXNzYWdlIGFzIHRoZSBjbGFzcyByZXByZXNlbnRpbmcKKyMgaW5kaXZpZHVhbCBtZXNzYWdlcy4KK3NyYyA9IG1haWxib3guTWFpbGRpcignbWFpbGRpcicsIGZhY3Rvcnk9Tm9uZSkKK2Rlc3QgPSBtYWlsYm94Lm1ib3goJy90bXAvbWJveCcpCisKK2ZvciBtc2cgaW4gc3JjOgorICAgIGRlc3QuYWRkKG1zZykKK1xlbmR7dmVyYmF0aW19CisKKyhDb250cmlidXRlZCBieSBHcmVnb3J5IEsuIEpvaG5zb24uICBGdW5kaW5nIHdhcyBwcm92aWRlZCBieSBHb29nbGUncworMjAwNSBTdW1tZXIgb2YgQ29kZS4pCisKK1xpdGVtIE5ldyBtb2R1bGU6IHRoZSBcbW9kdWxle21zaWxpYn0gbW9kdWxlIGFsbG93cyBjcmVhdGluZworTWljcm9zb2Z0IEluc3RhbGxlciBcZmlsZXsubXNpfSBmaWxlcyBhbmQgQ0FCIGZpbGVzLiAgU29tZSBzdXBwb3J0Citmb3IgcmVhZGluZyB0aGUgXGZpbGV7Lm1zaX0gZGF0YWJhc2UgaXMgYWxzbyBpbmNsdWRlZC4KKyhDb250cmlidXRlZCBieSBNYXJ0aW4gdm9ufkxcIm93aXMuKQorCiBcaXRlbSBUaGUgXG1vZHVsZXtuaXN9IG1vZHVsZSBub3cgc3VwcG9ydHMgYWNjZXNzaW5nIGRvbWFpbnMgb3RoZXIKIHRoYW4gdGhlIHN5c3RlbSBkZWZhdWx0IGRvbWFpbiBieSBzdXBwbHlpbmcgYSBcdmFye2RvbWFpbn0gYXJndW1lbnQgdG8KIHRoZSBcZnVuY3Rpb257bmlzLm1hdGNoKCl9IGFuZCBcZnVuY3Rpb257bmlzLm1hcHMoKX0gZnVuY3Rpb25zLgpAQCAtMTM1OCw2ICsxNDI2LDExIEBACiBsZXRzIHlvdSBlYXNpbHkgc29ydCBsaXN0cyB1c2luZyBtdWx0aXBsZSBmaWVsZHMuCiAoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCitcaXRlbSBUaGUgXG1vZHVsZXtvcHRwYXJzZX0gbW9kdWxlIHdhcyB1cGRhdGVkIHRvIHZlcnNpb24gMS41LjEgb2YgdGhlCitPcHRpayBsaWJyYXJ5LiAgVGhlIFxjbGFzc3tPcHRpb25QYXJzZXJ9IGNsYXNzIGdhaW5lZCBhbgorXG1lbWJlcntlcGlsb2d9IGF0dHJpYnV0ZSwgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHByaW50ZWQgYWZ0ZXIgdGhlCitoZWxwIG1lc3NhZ2UsIGFuZCBhIFxtZXRob2R7ZGVzdHJveSgpfSBtZXRob2QgdG8gYnJlYWsgcmVmZXJlbmNlCitjeWNsZXMgY3JlYXRlZCBieSB0aGUgb2JqZWN0LiAoQ29udHJpYnV0ZWQgYnkgR3JlZyBXYXJkLikKIAogXGl0ZW0gVGhlIFxtb2R1bGV7b3N9IG1vZHVsZSB1bmRlcndlbnQgc2V2ZXJhbCBjaGFuZ2VzLiAgVGhlCiBcbWVtYmVye3N0YXRfZmxvYXRfdGltZXN9IHZhcmlhYmxlIG5vdyBkZWZhdWx0cyB0byB0cnVlLCBtZWFuaW5nIHRoYXQKQEAgLTEzODksMTIgKzE0NjIsMzUgQEAKIChDb250cmlidXRlZCBieSBBbnR0aSBMb3VrbyBhbmQgIERpZWdvIFBldHRlblxgby4pCiAlIChQYXRjaCAxMTgwNjk1LCAxMjEyMTE3KQogCitcaXRlbSBUaGUgUHl0aG9uIGRlYnVnZ2VyIHByb3ZpZGVkIGJ5IHRoZSBcbW9kdWxle3BkYn0gbW9kdWxlCitjYW4gbm93IHN0b3JlIGxpc3RzIG9mIGNvbW1hbmRzIHRvIGV4ZWN1dGUgd2hlbiBhIGJyZWFrcG9pbnQgaXMKK3JlYWNoZWQgYW5kIGV4ZWN1dGlvbiBzdG9wcy4gIE9uY2UgYnJlYWtwb2ludCBcIzEgaGFzIGJlZW4gY3JlYXRlZCwKK2VudGVyIFxzYW1we2NvbW1hbmRzIDF9IGFuZCBlbnRlciBhIHNlcmllcyBvZiBjb21tYW5kcyB0byBiZSBleGVjdXRlZCwKK2ZpbmlzaGluZyB0aGUgbGlzdCB3aXRoIFxzYW1we2VuZH0uICBUaGUgY29tbWFuZCBsaXN0IGNhbiBpbmNsdWRlCitjb21tYW5kcyB0aGF0IHJlc3VtZSBleGVjdXRpb24sIHN1Y2ggYXMgXHNhbXB7Y29udGludWV9IG9yCitcc2FtcHtuZXh0fS4gIChDb250cmlidXRlZCBieSBHclwnZWdvaXJlIERvb21zLikKKyUgUGF0Y2ggNzkwNzEwCisKIFxpdGVtIFRoZSBcbW9kdWxle3BpY2tsZX0gYW5kIFxtb2R1bGV7Y1BpY2tsZX0gbW9kdWxlcyBubwogbG9uZ2VyIGFjY2VwdCBhIHJldHVybiB2YWx1ZSBvZiBcY29kZXtOb25lfSBmcm9tIHRoZQogXG1ldGhvZHtfX3JlZHVjZV9fKCl9IG1ldGhvZDsgdGhlIG1ldGhvZCBtdXN0IHJldHVybiBhIHR1cGxlIG9mCiBhcmd1bWVudHMgaW5zdGVhZC4gIFRoZSBhYmlsaXR5IHRvIHJldHVybiBcY29kZXtOb25lfSB3YXMgZGVwcmVjYXRlZAogaW4gUHl0aG9uIDIuNCwgc28gdGhpcyBjb21wbGV0ZXMgdGhlIHJlbW92YWwgb2YgdGhlIGZlYXR1cmUuCiAKK1xpdGVtIFRoZSBcbW9kdWxle3BrZ3V0aWx9IG1vZHVsZSwgY29udGFpbmluZyB2YXJpb3VzIHV0aWxpdHkKK2Z1bmN0aW9ucyBmb3IgZmluZGluZyBwYWNrYWdlcywgd2FzIGVuaGFuY2VkIHRvIHN1cHBvcnQgUEVQIDMwMidzCitpbXBvcnQgaG9va3MgYW5kIG5vdyBhbHNvIHdvcmtzIGZvciBwYWNrYWdlcyBzdG9yZWQgaW4gWklQLWZvcm1hdCBhcmNoaXZlcy4KKyhDb250cmlidXRlZCBieSBQaGlsbGlwIEouIEVieS4pCisKK1xpdGVtIFRoZSBweWJlbmNoIGJlbmNobWFyayBzdWl0ZSBieSBNYXJjLUFuZHJcJ2V+TGVtYnVyZyBpcyBub3cKK2luY2x1ZGVkIGluIHRoZSBcZmlsZXtUb29scy9weWJlbmNofSBkaXJlY3RvcnkuICBUaGUgcHliZW5jaCBzdWl0ZSBpcworYW4gaW1wcm92ZW1lbnQgb24gdGhlIGNvbW1vbmx5IHVzZWQgXGZpbGV7cHlzdG9uZS5weX0gcHJvZ3JhbSBiZWNhdXNlCitweWJlbmNoIHByb3ZpZGVzIGEgbW9yZSBkZXRhaWxlZCBtZWFzdXJlbWVudCBvZiB0aGUgaW50ZXJwcmV0ZXIncworc3BlZWQuICBJdCB0aW1lcyBwYXJ0aWN1bGFyIG9wZXJhdGlvbnMgc3VjaCBhcyBmdW5jdGlvbiBjYWxscywKK3R1cGxlIHNsaWNpbmcsIG1ldGhvZCBsb29rdXBzLCBhbmQgbnVtZXJpYyBvcGVyYXRpb25zLCBpbnN0ZWFkIG9mCitwZXJmb3JtaW5nIG1hbnkgZGlmZmVyZW50IG9wZXJhdGlvbnMgYW5kIHJlZHVjaW5nIHRoZSByZXN1bHQgdG8gYQorc2luZ2xlIG51bWJlciBhcyBcZmlsZXtweXN0b25lLnB5fSBkb2VzLgorCiBcaXRlbSBUaGUgb2xkIFxtb2R1bGV7cmVnZXh9IGFuZCBcbW9kdWxle3JlZ3N1Yn0gbW9kdWxlcywgd2hpY2ggaGF2ZSBiZWVuIAogZGVwcmVjYXRlZCBldmVyIHNpbmNlIFB5dGhvbiAyLjAsIGhhdmUgZmluYWxseSBiZWVuIGRlbGV0ZWQuICAKIE90aGVyIGRlbGV0ZWQgbW9kdWxlczogXG1vZHVsZXtzdGF0Y2FjaGV9LCBcbW9kdWxle3R6cGFyc2V9LApAQCAtMTQwNiw2ICsxNTAyLDEyIEBACiBcY29kZXtzeXMucGF0aH0sIHNvIHVubGVzcyB5b3VyIHByb2dyYW1zIGV4cGxpY2l0bHkgYWRkZWQgdGhlIGRpcmVjdG9yeSB0byAKIFxjb2Rle3N5cy5wYXRofSwgdGhpcyByZW1vdmFsIHNob3VsZG4ndCBhZmZlY3QgeW91ciBjb2RlLgogCitcaXRlbSBUaGUgXG1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlIGlzIG5vIGxvbmdlciAKK2RlcGVuZGVudCBvbiBpbXBvcnRpbmcgdGhlIFxtb2R1bGV7cmVhZGxpbmV9IG1vZHVsZSBhbmQKK3RoZXJlZm9yZSBub3cgd29ya3Mgb24gbm9uLXtcVU5JWH0gcGxhdGZvcm1zLgorKFBhdGNoIGZyb20gUm9iZXJ0IEtpZW5kbC4pCislIFBhdGNoICMxNDcyODU0CisKIFxpdGVtIFRoZSBcbW9kdWxle3NvY2tldH0gbW9kdWxlIG5vdyBzdXBwb3J0cyBcY29uc3RhbnR7QUZfTkVUTElOS30KIHNvY2tldHMgb24gTGludXgsIHRoYW5rcyB0byBhIHBhdGNoIGZyb20gUGhpbGlwcGUgQmlvbmRpLiAgCiBOZXRsaW5rIHNvY2tldHMgYXJlIGEgTGludXgtc3BlY2lmaWMgbWVjaGFuaXNtIGZvciBjb21tdW5pY2F0aW9ucwpAQCAtMTQxNCwyMCArMTUxNiw1MiBAQAogSW4gUHl0aG9uIGNvZGUsIG5ldGxpbmsgYWRkcmVzc2VzIGFyZSByZXByZXNlbnRlZCBhcyBhIHR1cGxlIG9mIDIgaW50ZWdlcnMsIAogXGNvZGV7KFx2YXJ7cGlkfSwgXHZhcntncm91cF9tYXNrfSl9LgogCi1Tb2NrZXQgb2JqZWN0cyBhbHNvIGdhaW5lZCBhY2Nlc3NvciBtZXRob2RzIFxtZXRob2R7Z2V0ZmFtaWx5KCl9LCAKLVxtZXRob2R7Z2V0dHlwZSgpfSwgYW5kIFxtZXRob2R7Z2V0cHJvdG8oKX0gbWV0aG9kcyB0byByZXRyaWV2ZSB0aGUKLWZhbWlseSwgdHlwZSwgYW5kIHByb3RvY29sIHZhbHVlcyBmb3IgdGhlIHNvY2tldC4KK1R3byBuZXcgbWV0aG9kcyBvbiBzb2NrZXQgb2JqZWN0cywgXG1ldGhvZHtyZWN2X2J1ZihcdmFye2J1ZmZlcn0pfSBhbmQKK1xtZXRob2R7cmVjdmZyb21fYnVmKFx2YXJ7YnVmZmVyfSl9LCBzdG9yZSB0aGUgcmVjZWl2ZWQgZGF0YSBpbiBhbiBvYmplY3QgCit0aGF0IHN1cHBvcnRzIHRoZSBidWZmZXIgcHJvdG9jb2wgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGRhdGEgYXMgYQorc3RyaW5nLiAgVGhpcyBtZWFucyB5b3UgY2FuIHB1dCB0aGUgZGF0YSBkaXJlY3RseSBpbnRvIGFuIGFycmF5IG9yIGEKK21lbW9yeS1tYXBwZWQgZmlsZS4KKworU29ja2V0IG9iamVjdHMgYWxzbyBnYWluZWQgXG1ldGhvZHtnZXRmYW1pbHkoKX0sIFxtZXRob2R7Z2V0dHlwZSgpfSwKK2FuZCBcbWV0aG9ke2dldHByb3RvKCl9IGFjY2Vzc29yIG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIGZhbWlseSwgdHlwZSwKK2FuZCBwcm90b2NvbCB2YWx1ZXMgZm9yIHRoZSBzb2NrZXQuCiAKIFxpdGVtIE5ldyBtb2R1bGU6IHRoZSBcbW9kdWxle3Nwd2R9IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yCiBhY2Nlc3NpbmcgdGhlIHNoYWRvdyBwYXNzd29yZCBkYXRhYmFzZSBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCAKIHNoYWRvdyBwYXNzd29yZHMuCiAKK1xpdGVtIFRoZSBcbW9kdWxle3N0cnVjdH0gaXMgbm93IGZhc3RlciBiZWNhdXNlIGl0IAorY29tcGlsZXMgZm9ybWF0IHN0cmluZ3MgaW50byBcY2xhc3N7U3RydWN0fSBvYmplY3RzCit3aXRoIFxtZXRob2R7cGFjaygpfSBhbmQgXG1ldGhvZHt1bnBhY2soKX0gbWV0aG9kcy4gIFRoaXMgaXMgc2ltaWxhcgordG8gaG93IHRoZSBcbW9kdWxle3JlfSBtb2R1bGUgbGV0cyB5b3UgY3JlYXRlIGNvbXBpbGVkIHJlZ3VsYXIKK2V4cHJlc3Npb24gb2JqZWN0cy4gIFlvdSBjYW4gc3RpbGwgdXNlIHRoZSBtb2R1bGUtbGV2ZWwgCitcZnVuY3Rpb257cGFjaygpfSBhbmQgXGZ1bmN0aW9ue3VucGFjaygpfSBmdW5jdGlvbnM7IHRoZXknbGwgY3JlYXRlIAorXGNsYXNze1N0cnVjdH0gb2JqZWN0cyBhbmQgY2FjaGUgdGhlbS4gIE9yIHlvdSBjYW4gdXNlIAorXGNsYXNze1N0cnVjdH0gaW5zdGFuY2VzIGRpcmVjdGx5OgorCitcYmVnaW57dmVyYmF0aW19CitzID0gc3RydWN0LlN0cnVjdCgnaWgzcycpCisKK2RhdGEgPSBzLnBhY2soMTk3MiwgMTg3LCAnYWJjJykKK3llYXIsIG51bWJlciwgbmFtZSA9IHMudW5wYWNrKGRhdGEpCitcZW5ke3ZlcmJhdGltfQorCitZb3UgY2FuIGFsc28gcGFjayBhbmQgdW5wYWNrIGRhdGEgdG8gYW5kIGZyb20gYnVmZmVyIG9iamVjdHMgZGlyZWN0bHkKK3VzaW5nIHRoZSBcbWV0aG9ke3BhY2tfdG8oXHZhcntidWZmZXJ9LCBcdmFye29mZnNldH0sIFx2YXJ7djF9LAorXHZhcnt2Mn0sIC4uLil9IGFuZCBcbWV0aG9ke3VucGFja19mcm9tKFx2YXJ7YnVmZmVyfSwgXHZhcntvZmZzZXR9KX0KK21ldGhvZHMuICBUaGlzIGxldHMgeW91IHN0b3JlIGRhdGEgZGlyZWN0bHkgaW50byBhbiBhcnJheSBvciBhCittZW1vcnktbWFwcGVkIGZpbGUuCisKKyhcY2xhc3N7U3RydWN0fSBvYmplY3RzIHdlcmUgaW1wbGVtZW50ZWQgYnkgQm9iIElwcG9saXRvIGF0IHRoZQorTmVlZEZvclNwZWVkIHNwcmludC4gIFN1cHBvcnQgZm9yIGJ1ZmZlciBvYmplY3RzIHdhcyBhZGRlZCBieSBNYXJ0aW4KK0JsYWlzLCBhbHNvIGF0IHRoZSBOZWVkRm9yU3BlZWQgc3ByaW50LikKKwogXGl0ZW0gVGhlIFB5dGhvbiBkZXZlbG9wZXJzIHN3aXRjaGVkIGZyb20gQ1ZTIHRvIFN1YnZlcnNpb24gZHVyaW5nIHRoZSAyLjUKLWRldmVsb3BtZW50IHByb2Nlc3MuICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhhY3QgYnVpbGQgdmVyc2lvbiBpcyAKLWF2YWlsYWJsZSBhcyB0aGUgXGNvZGV7c3lzLnN1YnZlcnNpb259IHZhcmlhYmxlLCBhIDMtdHVwbGUKLW9mIFxjb2RleyhcdmFye2ludGVycHJldGVyLW5hbWV9LCBcdmFye2JyYW5jaC1uYW1lfSwgXHZhcntyZXZpc2lvbi1yYW5nZX0pfS4KLUZvciBleGFtcGxlLCBhdCB0aGUgdGltZSBvZiB3cml0aW5nIAotbXkgY29weSBvZiAyLjUgd2FzIHJlcG9ydGluZyBcY29kZXsoJ0NQeXRob24nLCAndHJ1bmsnLCAnNDUzMTM6NDUzMTUnKX0uCitkZXZlbG9wbWVudCBwcm9jZXNzLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4YWN0IGJ1aWxkIHZlcnNpb24gaXMKK2F2YWlsYWJsZSBhcyB0aGUgXGNvZGV7c3lzLnN1YnZlcnNpb259IHZhcmlhYmxlLCBhIDMtdHVwbGUgb2YKK1xjb2RleyhcdmFye2ludGVycHJldGVyLW5hbWV9LCBcdmFye2JyYW5jaC1uYW1lfSwKK1x2YXJ7cmV2aXNpb24tcmFuZ2V9KX0uICBGb3IgZXhhbXBsZSwgYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyBteSBjb3B5CitvZiAyLjUgd2FzIHJlcG9ydGluZyBcY29kZXsoJ0NQeXRob24nLCAndHJ1bmsnLCAnNDUzMTM6NDUzMTUnKX0uCiAKIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdG8gQyBleHRlbnNpb25zIHZpYSB0aGUgCiBcY2Z1bmN0aW9ue1B5X0dldEJ1aWxkSW5mbygpfSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSAKQEAgLTE0NDksNyArMTU4Myw3IEBACiBcaXRlbSBUaGUgXG1vZHVsZXt1bmljb2RlZGF0YX0gbW9kdWxlIGhhcyBiZWVuIHVwZGF0ZWQgdG8gdXNlIHZlcnNpb24gNC4xLjAKIG9mIHRoZSBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZS4gIFZlcnNpb24gMy4yLjAgaXMgcmVxdWlyZWQgCiBieSBzb21lIHNwZWNpZmljYXRpb25zLCBzbyBpdCdzIHN0aWxsIGF2YWlsYWJsZSBhcyAKLVxtZW1iZXJ7dW5pY29kZWRhdGEuZGJfM18yXzB9LgorXG1lbWJlcnt1bmljb2RlZGF0YS51Y2RfM18yXzB9LgogCiBcaXRlbSBUaGUgXG1vZHVsZXt3ZWJicm93c2VyfSBtb2R1bGUgcmVjZWl2ZWQgYSBudW1iZXIgb2YKIGVuaGFuY2VtZW50cy4KQEAgLTE0NzQsMTMgKzE2MDgsMTkgQEAKICAgICAgIChDb250cmlidXRlZCBieSBTa2lwIE1vbnRhbmFyby4pCiAlIFBhdGNoIDExMjAzNTMKIAorXGl0ZW0gVGhlIFxtb2R1bGV7emxpYn0gbW9kdWxlJ3MgXGNsYXNze0NvbXByZXNzfSBhbmQgXGNsYXNze0RlY29tcHJlc3N9CitvYmplY3RzIG5vdyBzdXBwb3J0IGEgXG1ldGhvZHtjb3B5KCl9IG1ldGhvZCB0aGF0IG1ha2VzIGEgY29weSBvZiB0aGUgCitvYmplY3QncyBpbnRlcm5hbCBzdGF0ZSBhbmQgcmV0dXJucyBhIG5ldyAKK1xjbGFzc3tDb21wcmVzc30gb3IgXGNsYXNze0RlY29tcHJlc3N9IG9iamVjdC4gCisoQ29udHJpYnV0ZWQgYnkgQ2hyaXMgQXRMZWUuKQorJSBQYXRjaCAxNDM1NDIyCiAKIFxlbmR7aXRlbWl6ZX0KIAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc3Vic2VjdGlvbntUaGUgY3R5cGVzIHBhY2thZ2V9Citcc3Vic2VjdGlvbntUaGUgY3R5cGVzIHBhY2thZ2VcbGFiZWx7bW9kdWxlLWN0eXBlc319CiAKIFRoZSBcbW9kdWxle2N0eXBlc30gcGFja2FnZSwgd3JpdHRlbiBieSBUaG9tYXMgSGVsbGVyLCBoYXMgYmVlbiBhZGRlZCAKIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiAgXG1vZHVsZXtjdHlwZXN9IGxldHMgeW91IGNhbGwgYXJiaXRyYXJ5IGZ1bmN0aW9ucyAKQEAgLTE1NjIsMTAgKzE3MDIsMTAgQEAKIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257VGhlIEVsZW1lbnRUcmVlIHBhY2thZ2V9Citcc3Vic2VjdGlvbntUaGUgRWxlbWVudFRyZWUgcGFja2FnZVxsYWJlbHttb2R1bGUtZXRyZWV9fQogCiBBIHN1YnNldCBvZiBGcmVkcmlrIEx1bmRoJ3MgRWxlbWVudFRyZWUgbGlicmFyeSBmb3IgcHJvY2Vzc2luZyBYTUwgaGFzCi1iZWVuIGFkZGVkIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGFzIFxtb2R1bGV7eG1sY29yZS5ldHJlZX0uICBUaGUKK2JlZW4gYWRkZWQgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgYXMgXG1vZHVsZXt4bWwuZXRyZWV9LiAgVGhlCiBhdmFpbGFibGUgbW9kdWxlcyBhcmUKIFxtb2R1bGV7RWxlbWVudFRyZWV9LCBcbW9kdWxle0VsZW1lbnRQYXRofSwgYW5kCiBcbW9kdWxle0VsZW1lbnRJbmNsdWRlfSBmcm9tIEVsZW1lbnRUcmVlIDEuMi42LiAgIApAQCAtMTU4Nyw3ICsxNzI3LDcgQEAKIG9iamVjdCBhbmQgcmV0dXJucyBhbiBcY2xhc3N7RWxlbWVudFRyZWV9IGluc3RhbmNlOgogCiBcYmVnaW57dmVyYmF0aW19Ci1mcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCitmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKIAogdHJlZSA9IEVULnBhcnNlKCdleC0xLnhtbCcpCiAKQEAgLTE2MDUsNyArMTc0NSw3IEBACiBhcHByb2FjaGluZyB0aGUgY29udmVuaWVuY2Ugb2YgYW4gWE1MIGxpdGVyYWw6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLXN2ZyA9IGV0LlhNTCgiIiI8c3ZnIHdpZHRoPSIxMHB4IiB2ZXJzaW9uPSIxLjAiPgorc3ZnID0gRVQuWE1MKCIiIjxzdmcgd2lkdGg9IjEwcHgiIHZlcnNpb249IjEuMCI+CiAgICAgICAgICAgICAgPC9zdmc+IiIiKQogc3ZnLnNldCgnaGVpZ2h0JywgJzMyMHB4JykKIHN2Zy5hcHBlbmQoZWxlbTEpCkBAIC0xNjE5LDcgKzE3NTksNyBAQAogICBcbGluZWlpe2VsZW1bbl19e1JldHVybnMgbid0aCBjaGlsZCBlbGVtZW50Ln0KICAgXGxpbmVpaXtlbGVtW206bl19e1JldHVybnMgbGlzdCBvZiBtJ3RoIHRocm91Z2ggbid0aCBjaGlsZCBlbGVtZW50cy59CiAgIFxsaW5laWl7bGVuKGVsZW0pfXtSZXR1cm5zIG51bWJlciBvZiBjaGlsZCBlbGVtZW50cy59Ci0gIFxsaW5laWl7ZWxlbS5nZXRjaGlsZHJlbigpfXtSZXR1cm5zIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMufQorICBcbGluZWlpe2xpc3QoZWxlbSl9e1JldHVybnMgbGlzdCBvZiBjaGlsZCBlbGVtZW50cy59CiAgIFxsaW5laWl7ZWxlbS5hcHBlbmQoZWxlbTIpfXtBZGRzIFx2YXJ7ZWxlbTJ9IGFzIGEgY2hpbGQufQogICBcbGluZWlpe2VsZW0uaW5zZXJ0KGluZGV4LCBlbGVtMil9e0luc2VydHMgXHZhcntlbGVtMn0gYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi59CiAgIFxsaW5laWl7ZGVsIGVsZW1bbl19e0RlbGV0ZXMgbid0aCBjaGlsZCBlbGVtZW50Ln0KQEAgLTE2NTEsMTQgKzE3OTEsMTUgQEAKIAogIyBFbmNvZGluZyBpcyBVVEYtOAogZiA9IG9wZW4oJ291dHB1dC54bWwnLCAndycpCi10cmVlLndyaXRlKGYsICd1dGYtOCcpCit0cmVlLndyaXRlKGYsIGVuY29kaW5nPSd1dGYtOCcpCiBcZW5ke3ZlcmJhdGltfQogCi0oQ2F1dGlvbjogdGhlIGRlZmF1bHQgZW5jb2RpbmcgdXNlZCBmb3Igb3V0cHV0IGlzIEFTQ0lJLCB3aGljaCBpc24ndAotdmVyeSB1c2VmdWwgZm9yIGdlbmVyYWwgWE1MIHdvcmssIHJhaXNpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGFyZQotYW55IGNoYXJhY3RlcnMgd2l0aCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIFlvdSBzaG91bGQgYWx3YXlzCi1zcGVjaWZ5IGEgZGlmZmVyZW50IGVuY29kaW5nIHN1Y2ggYXMgVVRGLTggdGhhdCBjYW4gaGFuZGxlIGFueSBVbmljb2RlCi1jaGFyYWN0ZXIuKQorKENhdXRpb246IHRoZSBkZWZhdWx0IGVuY29kaW5nIHVzZWQgZm9yIG91dHB1dCBpcyBBU0NJSS4gIEZvciBnZW5lcmFsCitYTUwgd29yaywgd2hlcmUgYW4gZWxlbWVudCdzIG5hbWUgbWF5IGNvbnRhaW4gYXJiaXRyYXJ5IFVuaWNvZGUKK2NoYXJhY3RlcnMsIEFTQ0lJIGlzbid0IGEgdmVyeSB1c2VmdWwgZW5jb2RpbmcgYmVjYXVzZSBpdCB3aWxsIHJhaXNlCithbiBleGNlcHRpb24gaWYgYW4gZWxlbWVudCdzIG5hbWUgY29udGFpbnMgYW55IGNoYXJhY3RlcnMgd2l0aCB2YWx1ZXMKK2dyZWF0ZXIgdGhhbiAxMjcuICBUaGVyZWZvcmUsIGl0J3MgYmVzdCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50CitlbmNvZGluZyBzdWNoIGFzIFVURi04IHRoYXQgY2FuIGhhbmRsZSBhbnkgVW5pY29kZSBjaGFyYWN0ZXIuKQogCiBUaGlzIHNlY3Rpb24gaXMgb25seSBhIHBhcnRpYWwgZGVzY3JpcHRpb24gb2YgdGhlIEVsZW1lbnRUcmVlIGludGVyZmFjZXMuCiBQbGVhc2UgcmVhZCB0aGUgcGFja2FnZSdzIG9mZmljaWFsIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KQEAgLTE2NzMsNyArMTgxNCw3IEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue1RoZSBoYXNobGliIHBhY2thZ2V9Citcc3Vic2VjdGlvbntUaGUgaGFzaGxpYiBwYWNrYWdlXGxhYmVse21vZHVsZS1oYXNobGlifX0KIAogQSBuZXcgXG1vZHVsZXtoYXNobGlifSBtb2R1bGUsIHdyaXR0ZW4gYnkgR3JlZ29yeSBQLiBTbWl0aCwgCiBoYXMgYmVlbiBhZGRlZCB0byByZXBsYWNlIHRoZQpAQCAtMTcyMSw3ICsxODYyLDcgQEAKIAogCiAlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotXHN1YnNlY3Rpb257VGhlIHNxbGl0ZTMgcGFja2FnZX0KK1xzdWJzZWN0aW9ue1RoZSBzcWxpdGUzIHBhY2thZ2VcbGFiZWx7bW9kdWxlLXNxbGl0ZX19CiAKIFRoZSBweXNxbGl0ZSBtb2R1bGUgKFx1cmx7aHR0cDovL3d3dy5weXNxbGl0ZS5vcmd9KSwgYSB3cmFwcGVyIGZvciB0aGUKIFNRTGl0ZSBlbWJlZGRlZCBkYXRhYmFzZSwgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgdW5kZXIKQEAgLTE3ODYsNyArMTkyNyw3IEBACiAKICMgRG8gdGhpcyBpbnN0ZWFkCiB0ID0gKHN5bWJvbCwpCi1jLmV4ZWN1dGUoJ3NlbGVjdCAqIGZyb20gc3RvY2tzIHdoZXJlIHN5bWJvbD0/JywgKCdJQk0nLCkpCitjLmV4ZWN1dGUoJ3NlbGVjdCAqIGZyb20gc3RvY2tzIHdoZXJlIHN5bWJvbD0/JywgdCkKIAogIyBMYXJnZXIgZXhhbXBsZQogZm9yIHQgaW4gKCgnMjAwNi0wMy0yOCcsICdCVVknLCAnSUJNJywgMTAwMCwgNDUuMDApLApAQCAtMTgzNSw3ICsxOTc2LDcgQEAKIAogCiAlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue0J1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzfQorXHNlY3Rpb257QnVpbGQgYW5kIEMgQVBJIENoYW5nZXNcbGFiZWx7YnVpbGQtYXBpfX0KIAogQ2hhbmdlcyB0byBQeXRob24ncyBidWlsZCBwcm9jZXNzIGFuZCB0byB0aGUgQyBBUEkgaW5jbHVkZToKIApAQCAtMTkwMSw2ICsyMDQyLDIyIEBACiBcY29kZXsidHJ1bms6NDUzNTU6NDUzNTZNLCBBcHIgMTMgMjAwNiwgMDc6NDI6MTkifS4gIAogKENvbnRyaWJ1dGVkIGJ5IEJhcnJ5IFdhcnNhdy4pCiAKK1xpdGVtIFR3byBuZXcgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIEMgZnVuY3Rpb25zIHRoYXQgYXJlCitsb2NhbCB0byB0aGUgY3VycmVudCBmaWxlIHNvIHRoYXQgYSBmYXN0ZXIgY2FsbGluZyBjb252ZW50aW9uIGNhbiBiZQordXNlZC4gIFxjZnVuY3Rpb257UHlfTE9DQUwoXHZhcnt0eXBlfSl9IGRlY2xhcmVzIHRoZSBmdW5jdGlvbiBhcworcmV0dXJuaW5nIGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBcdmFye3R5cGV9IGFuZCB1c2VzIGEgZmFzdC1jYWxsaW5nCitxdWFsaWZpZXIuIFxjZnVuY3Rpb257UHlfTE9DQUxfSU5MSU5FKFx2YXJ7dHlwZX0pfSBkb2VzIHRoZSBzYW1lIHRoaW5nCithbmQgYWxzbyByZXF1ZXN0cyB0aGUgZnVuY3Rpb24gYmUgaW5saW5lZC4gIElmCitcY2Z1bmN0aW9ue1BZX0xPQ0FMX0FHR1JFU1NJVkV9IGlzIGRlZmluZWQgYmVmb3JlIFxmaWxle3B5dGhvbi5ofSBpcworaW5jbHVkZWQsIGEgc2V0IG9mIG1vcmUgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb25zIGFyZSBlbmFibGVkIGZvciB0aGUKK21vZHVsZTsgeW91IHNob3VsZCBiZW5jaG1hcmsgdGhlIHJlc3VsdHMgdG8gZmluZCBvdXQgaWYgdGhlc2UKK29wdGltaXphdGlvbnMgYWN0dWFsbHkgbWFrZSB0aGUgY29kZSBmYXN0ZXIuICAoQ29udHJpYnV0ZWQgYnkgRnJlZHJpaworTHVuZGggYXQgdGhlIE5lZWRGb3JTcGVlZCBzcHJpbnQuKQorCitcaXRlbSBcY2Z1bmN0aW9ue1B5RXJyX05ld0V4Y2VwdGlvbihcdmFye25hbWV9LCBcdmFye2Jhc2V9LAorXHZhcntkaWN0fSl9IGNhbiBub3cgYWNjZXB0IGEgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIGFzIGl0cyBcdmFye2Jhc2V9Cithcmd1bWVudC4gIChDb250cmlidXRlZCBieSBHZW9yZyBCcmFuZGwuKQorCiBcaXRlbSBUaGUgQ1B5dGhvbiBpbnRlcnByZXRlciBpcyBzdGlsbCB3cml0dGVuIGluIEMsIGJ1dCAKIHRoZSBjb2RlIGNhbiBub3cgYmUgY29tcGlsZWQgd2l0aCBhIHtcQ3BwfSBjb21waWxlciB3aXRob3V0IGVycm9ycy4gIAogKEltcGxlbWVudGVkIGJ5IEFudGhvbnkgQmF4dGVyLCBNYXJ0aW4gdm9ufkxcIm93aXMsIFNraXAgTW9udGFuYXJvLikKQEAgLTE5MTMsNyArMjA3MCw3IEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzdWJzZWN0aW9ue1BvcnQtU3BlY2lmaWMgQ2hhbmdlc30KK1xzdWJzZWN0aW9ue1BvcnQtU3BlY2lmaWMgQ2hhbmdlc1xsYWJlbHtwb3J0c319CiAKIFxiZWdpbntpdGVtaXplfQogCkBAIC0xOTIxLDYgKzIwNzgsMTEgQEAKIG5vdyB1c2VzIHRoZSBcY2Z1bmN0aW9ue2Rsb3BlbigpfSBmdW5jdGlvbiBpbnN0ZWFkIG9mIE1hY09TLXNwZWNpZmljCiBmdW5jdGlvbnMuCiAKK1xpdGVtIE1hY09TIFg6IGEgXGxvbmdwcm9ncmFtb3B0e2VuYWJsZS11bml2ZXJzYWxzZGt9IHN3aXRjaCB3YXMgYWRkZWQKK3RvIHRoZSBccHJvZ3JhbXtjb25maWd1cmV9IHNjcmlwdCB0aGF0IGNvbXBpbGVzIHRoZSBpbnRlcnByZXRlciBhcyBhCit1bml2ZXJzYWwgYmluYXJ5IGFibGUgdG8gcnVuIG9uIGJvdGggUG93ZXJQQyBhbmQgSW50ZWwgcHJvY2Vzc29ycy4KKyhDb250cmlidXRlZCBieSBSb25hbGQgT3Vzc29yZW4uKQorCiBcaXRlbSBXaW5kb3dzOiBcZmlsZXsuZGxsfSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFzIGEgZmlsZW5hbWUgZXh0ZW5zaW9uIGZvciAKIGV4dGVuc2lvbiBtb2R1bGVzLiAgXGZpbGV7LnB5ZH0gaXMgbm93IHRoZSBvbmx5IGZpbGVuYW1lIGV4dGVuc2lvbiB0aGF0IHdpbGwKIGJlIHNlYXJjaGVkIGZvci4KQEAgLTE5NzcsNyArMjEzOSw3IEBACiAKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVxzZWN0aW9ue1BvcnRpbmcgdG8gUHl0aG9uIDIuNX0KK1xzZWN0aW9ue1BvcnRpbmcgdG8gUHl0aG9uIDIuNVxsYWJlbHtwb3J0aW5nfX0KIAogVGhpcyBzZWN0aW9uIGxpc3RzIHByZXZpb3VzbHkgZGVzY3JpYmVkIGNoYW5nZXMgdGhhdCBtYXkgcmVxdWlyZQogY2hhbmdlcyB0byB5b3VyIGNvZGU6CkBAIC0yMDIzLDcgKzIxODUsNyBAQAogCiBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIGZvbGxvd2luZyBwZW9wbGUgZm9yIG9mZmVyaW5nCiBzdWdnZXN0aW9ucywgY29ycmVjdGlvbnMgYW5kIGFzc2lzdGFuY2Ugd2l0aCB2YXJpb3VzIGRyYWZ0cyBvZiB0aGlzCi1hcnRpY2xlOiBQaGlsbGlwIEouIEVieSwgS2VudCBKb2huc29uLCBNYXJ0aW4gdm9ufkxcIm93aXMsIEd1c3Rhdm8KLU5pZW1leWVyLCBNaWtlIFJvdm5lciwgVGhvbWFzIFdvdXRlcnMuCithcnRpY2xlOiBQaGlsbGlwIEouIEVieSwgS2VudCBKb2huc29uLCBNYXJ0aW4gdm9ufkxcIm93aXMsIEZyZWRyaWsgTHVuZGgsIAorR3VzdGF2byBOaWVtZXllciwgSmFtZXMgUHJ5b3IsIE1pa2UgUm92bmVyLCBTY290dCBXZWlrYXJ0LCBUaG9tYXMgV291dGVycy4KIAogXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL0dyYW1tYXIvR3JhbW1hciBiL0dyYW1tYXIvR3JhbW1hcgppbmRleCBhNjEzZGU2Li43YTdmNmJjIDEwMDY0NAotLS0gYS9HcmFtbWFyL0dyYW1tYXIKKysrIGIvR3JhbW1hci9HcmFtbWFyCkBAIC01MCw3ICs1MCw3IEBACiByYWlzZV9zdG10OiAncmFpc2UnIFt0ZXN0IFsnLCcgdGVzdCBbJywnIHRlc3RdXV0KIGltcG9ydF9zdG10OiBpbXBvcnRfbmFtZSB8IGltcG9ydF9mcm9tCiBpbXBvcnRfbmFtZTogJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzCi1pbXBvcnRfZnJvbTogKCdmcm9tJyAoJy4nKiBkb3R0ZWRfbmFtZSB8ICcuJykKK2ltcG9ydF9mcm9tOiAoJ2Zyb20nICgnLicqIGRvdHRlZF9uYW1lIHwgJy4nKykKICAgICAgICAgICAgICAgJ2ltcG9ydCcgKCcqJyB8ICcoJyBpbXBvcnRfYXNfbmFtZXMgJyknIHwgaW1wb3J0X2FzX25hbWVzKSkKIGltcG9ydF9hc19uYW1lOiBOQU1FIFsnYXMnIE5BTUVdCiBkb3R0ZWRfYXNfbmFtZTogZG90dGVkX25hbWUgWydhcycgTkFNRV0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvUHl0aG9uLmggYi9JbmNsdWRlL1B5dGhvbi5oCmluZGV4IGZmZmM2ODguLmNhMTZjNjQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvUHl0aG9uLmgKKysrIGIvSW5jbHVkZS9QeXRob24uaApAQCAtMzUsNyArMzUsOSBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgRE9OVF9IQVZFX0VSUk5PX0gKICNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaWZkZWYgSEFWRV9VTklTVERfSAogI2luY2x1ZGUgPHVuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9jb2RlLmggYi9JbmNsdWRlL2NvZGUuaAppbmRleCAyM2Q5ZTE3Li40MzJlYzhlIDEwMDY0NAotLS0gYS9JbmNsdWRlL2NvZGUuaAorKysgYi9JbmNsdWRlL2NvZGUuaApAQCAtMjQsNiArMjQsNyBAQAogICAgIFB5T2JqZWN0ICpjb19uYW1lOwkJLyogc3RyaW5nIChuYW1lLCBmb3IgcmVmZXJlbmNlKSAqLwogICAgIGludCBjb19maXJzdGxpbmVubzsJCS8qIGZpcnN0IHNvdXJjZSBsaW5lIG51bWJlciAqLwogICAgIFB5T2JqZWN0ICpjb19sbm90YWI7CS8qIHN0cmluZyAoZW5jb2RpbmcgYWRkcjwtPmxpbmVubyBtYXBwaW5nKSAqLworICAgIHZvaWQgKmNvX3pvbWJpZWZyYW1lOyAgICAgLyogZm9yIG9wdGltaXphdGlvbiBvbmx5IChzZWUgZnJhbWVvYmplY3QuYykgKi8KIH0gUHlDb2RlT2JqZWN0OwogCiAvKiBNYXNrcyBmb3IgY29fZmxhZ3MgYWJvdmUgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvZnJhbWVvYmplY3QuaCBiL0luY2x1ZGUvZnJhbWVvYmplY3QuaAppbmRleCA3ZGMxNGUzLi5jY2U1OThiIDEwMDY0NAotLS0gYS9JbmNsdWRlL2ZyYW1lb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9mcmFtZW9iamVjdC5oCkBAIC0yNiw3ICsyNiwxNiBAQAogICAgICAgIHRvIHRoZSBjdXJyZW50IHN0YWNrIHRvcC4gKi8KICAgICBQeU9iamVjdCAqKmZfc3RhY2t0b3A7CiAgICAgUHlPYmplY3QgKmZfdHJhY2U7CQkvKiBUcmFjZSBmdW5jdGlvbiAqLworCisgICAgLyogSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGlzIGZyYW1lLCB0aGUgbmV4dCB0aHJlZSBhcmUgdXNlZCB0bworICAgICAqIHJlY29yZCB0aGUgZXhjZXB0aW9uIGluZm8gKGlmIGFueSkgb3JpZ2luYWxseSBpbiB0aGUgdGhyZWFkIHN0YXRlLiAgU2VlCisgICAgICogY29tbWVudHMgYmVmb3JlIHNldF9leGNfaW5mbygpIC0tIGl0J3Mgbm90IG9idmlvdXMuCisgICAgICogSW52YXJpYW50OiAgaWYgX3R5cGUgaXMgTlVMTCwgdGhlbiBzbyBhcmUgX3ZhbHVlIGFuZCBfdHJhY2ViYWNrLgorICAgICAqIERlc2lyZWQgaW52YXJpYW50OiAgYWxsIHRocmVlIGFyZSBOVUxMLCBvciBhbGwgdGhyZWUgYXJlIG5vbi1OVUxMLiAgVGhhdAorICAgICAqIG9uZSBpc24ndCBjdXJyZW50bHkgdHJ1ZSwgYnV0ICJzaG91bGQgYmUiLgorICAgICAqLwogICAgIFB5T2JqZWN0ICpmX2V4Y190eXBlLCAqZl9leGNfdmFsdWUsICpmX2V4Y190cmFjZWJhY2s7CisKICAgICBQeVRocmVhZFN0YXRlICpmX3RzdGF0ZTsKICAgICBpbnQgZl9sYXN0aTsJCS8qIExhc3QgaW5zdHJ1Y3Rpb24gaWYgY2FsbGVkICovCiAgICAgLyogQXMgb2YgMi4zIGZfbGluZW5vIGlzIG9ubHkgdmFsaWQgd2hlbiB0cmFjaW5nIGlzIGFjdGl2ZSAoaS5lLiB3aGVuCkBAIC0zNiwxMCArNDUsNiBAQAogCQkJCSAgIGluIHRoaXMgc2NvcGUgKi8KICAgICBpbnQgZl9pYmxvY2s7CQkvKiBpbmRleCBpbiBmX2Jsb2Nrc3RhY2sgKi8KICAgICBQeVRyeUJsb2NrIGZfYmxvY2tzdGFja1tDT19NQVhCTE9DS1NdOyAvKiBmb3IgdHJ5IGFuZCBsb29wIGJsb2NrcyAqLwotICAgIGludCBmX25sb2NhbHM7CQkvKiBudW1iZXIgb2YgbG9jYWxzICovCi0gICAgaW50IGZfbmNlbGxzOwotICAgIGludCBmX25mcmVldmFyczsKLSAgICBpbnQgZl9zdGFja3NpemU7CQkvKiBzaXplIG9mIHZhbHVlIHN0YWNrICovCiAgICAgUHlPYmplY3QgKmZfbG9jYWxzcGx1c1sxXTsJLyogbG9jYWxzK3N0YWNrLCBkeW5hbWljYWxseSBzaXplZCAqLwogfSBQeUZyYW1lT2JqZWN0OwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL2xvbmdvYmplY3QuaCBiL0luY2x1ZGUvbG9uZ29iamVjdC5oCmluZGV4IDc3NTQ0ZWYuLmVlZjRlOWIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvbG9uZ29iamVjdC5oCisrKyBiL0luY2x1ZGUvbG9uZ29iamVjdC5oCkBAIC0yNSw2ICsyNSw3IEBACiBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeUxvbmdfQXNTc2l6ZV90KFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlMb25nX0Zyb21TaXplX3Qoc2l6ZV90KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5TG9uZ19Gcm9tU3NpemVfdChQeV9zc2l6ZV90KTsKK1B5QVBJX0RBVEEoaW50KSBfUHlMb25nX0RpZ2l0VmFsdWVbMjU2XTsKIAogLyogX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSByZXR1cm5zIGEgZG91YmxlIHggYW5kIGFuIGV4cG9uZW50IGUgc3VjaCB0aGF0CiAgICB0aGUgdHJ1ZSB2YWx1ZSBpcyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIHggKiAyKiooU0hJRlQqZSkuICBlIGlzID49IDAuCmRpZmYgLS1naXQgYS9JbmNsdWRlL29zZGVmcy5oIGIvSW5jbHVkZS9vc2RlZnMuaAppbmRleCA4MTkwYTc1Li42OTM3NjU5IDEwMDY0NAotLS0gYS9JbmNsdWRlL29zZGVmcy5oCisrKyBiL0luY2x1ZGUvb3NkZWZzLmgKQEAgLTM3LDggKzM3LDEyIEBACiAKIC8qIE1heCBwYXRobmFtZSBsZW5ndGggKi8KICNpZm5kZWYgTUFYUEFUSExFTgorI2lmIGRlZmluZWQoUEFUSF9NQVgpICYmIFBBVEhfTUFYID4gMTAyNAorI2RlZmluZSBNQVhQQVRITEVOIFBBVEhfTUFYCisjZWxzZQogI2RlZmluZSBNQVhQQVRITEVOIDEwMjQKICNlbmRpZgorI2VuZGlmCiAKIC8qIFNlYXJjaCBwYXRoIGVudHJ5IGRlbGltaXRlciAqLwogI2lmbmRlZiBERUxJTQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWVycm9ycy5oIGIvSW5jbHVkZS9weWVycm9ycy5oCmluZGV4IDBlNzcxOGMuLjYwMDZhYzcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHllcnJvcnMuaAorKysgYi9JbmNsdWRlL3B5ZXJyb3JzLmgKQEAgLTQsNiArNCw3MiBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorLyogRXJyb3Igb2JqZWN0cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICptZXNzYWdlOworfSBQeUJhc2VFeGNlcHRpb25PYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgUHlPYmplY3QgKm1zZzsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWU7CisgICAgUHlPYmplY3QgKmxpbmVubzsKKyAgICBQeU9iamVjdCAqb2Zmc2V0OworICAgIFB5T2JqZWN0ICp0ZXh0OworICAgIFB5T2JqZWN0ICpwcmludF9maWxlX2FuZF9saW5lOworfSBQeVN5bnRheEVycm9yT2JqZWN0OworCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBQeU9iamVjdCAqZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKm9iamVjdDsKKyAgICBQeU9iamVjdCAqc3RhcnQ7CisgICAgUHlPYmplY3QgKmVuZDsKKyAgICBQeU9iamVjdCAqcmVhc29uOworfSBQeVVuaWNvZGVFcnJvck9iamVjdDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIFB5T2JqZWN0ICpjb2RlOworfSBQeVN5c3RlbUV4aXRPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgUHlPYmplY3QgKm15ZXJybm87CisgICAgUHlPYmplY3QgKnN0cmVycm9yOworICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKK30gUHlFbnZpcm9ubWVudEVycm9yT2JqZWN0OworCisjaWZkZWYgTVNfV0lORE9XUwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBQeU9iamVjdCAqbXllcnJubzsKKyAgICBQeU9iamVjdCAqc3RyZXJyb3I7CisgICAgUHlPYmplY3QgKmZpbGVuYW1lOworICAgIFB5T2JqZWN0ICp3aW5lcnJvcjsKK30gUHlXaW5kb3dzRXJyb3JPYmplY3Q7CisjZW5kaWYKIAogLyogRXJyb3IgaGFuZGxpbmcgZGVmaW5pdGlvbnMgKi8KIApAQCAtOTcsMTAgKzE2Myw5IEBACiBQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZzsKIFB5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZzsKIFB5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfU3ludGF4V2FybmluZzsKLS8qIFB5RXhjX092ZXJmbG93V2FybmluZyB3aWxsIGdvIGF3YXkgZm9yIFB5dGhvbiAyLjUgKi8KLVB5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfT3ZlcmZsb3dXYXJuaW5nOwogUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19SdW50aW1lV2FybmluZzsKIFB5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfRnV0dXJlV2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfSW1wb3J0V2FybmluZzsKIAogCiAvKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlwb3J0LmggYi9JbmNsdWRlL3B5cG9ydC5oCmluZGV4IDJiY2U0MTUuLjc0Y2U5OTMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlwb3J0LmgKKysrIGIvSW5jbHVkZS9weXBvcnQuaApAQCAtMTM3LDYgKzEzNyw0MyBAQAogIyAgIGVuZGlmCiAjZW5kaWYKIAorLyogUHlfTE9DQUwgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBzdGF0aWMgdG8gZ2V0IHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGNhbGxpbmcKKyAqIGNvbnZlbnRpb24gZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBsb2NhbCB0byBhIGdpdmVuIG1vZHVsZS4KKyAqCisgKiBQeV9MT0NBTF9JTkxJTkUgZG9lcyB0aGUgc2FtZSB0aGluZywgYW5kIGFsc28gZXhwbGljaXRseSByZXF1ZXN0cyBpbmxpbmluZywKKyAqIGZvciBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoYXQuCisgKgorICogSWYgUFlfTE9DQUxfQUdHUkVTU0lWRSBpcyBkZWZpbmVkIGJlZm9yZSBweXRob24uaCBpcyBpbmNsdWRlZCwgbW9yZQorICogImFnZ3Jlc3NpdmUiIGlubGluaW5nL29wdGltaXphaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBlbnRpcmUgbW9kdWxlLiAgVGhpcworICogbWF5IGxlYWQgdG8gY29kZSBibG9hdCwgYW5kIG1heSBzbG93IHRoaW5ncyBkb3duIGZvciB0aG9zZSByZWFzb25zLiAgSXQgbWF5CisgKiBhbHNvIGxlYWQgdG8gZXJyb3JzLCBpZiB0aGUgY29kZSByZWxpZXMgb24gcG9pbnRlciBhbGlhc2luZy4gIFVzZSB3aXRoCisgKiBjYXJlLgorICoKKyAqIE5PVEU6IFlvdSBjYW4gb25seSB1c2UgdGhpcyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIGVudGlyZWx5IGxvY2FsIHRvIGEKKyAqIG1vZHVsZTsgZnVuY3Rpb25zIHRoYXQgYXJlIGV4cG9ydGVkIHZpYSBtZXRob2QgdGFibGVzLCBjYWxsYmFja3MsIGV0YywKKyAqIHNob3VsZCBrZWVwIHVzaW5nIHN0YXRpYy4KKyAqLworCisjdW5kZWYgVVNFX0lOTElORSAvKiBYWFggLSBzZXQgdmlhIGNvbmZpZ3VyZT8gKi8KKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjaWYgZGVmaW5lZChQWV9MT0NBTF9BR0dSRVNTSVZFKQorLyogZW5hYmxlIG1vcmUgYWdncmVzc2l2ZSBvcHRpbWl6YXRpb24gZm9yIHZpc3VhbCBzdHVkaW8gKi8KKyNwcmFnbWEgb3B0aW1pemUoImFndHciLCBvbikKKyNlbmRpZgorLyogaWdub3JlIHdhcm5pbmdzIGlmIHRoZSBjb21waWxlciBkZWNpZGVzIG5vdCB0byBpbmxpbmUgYSBmdW5jdGlvbiAqLyAKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NzEwKQorLyogZmFzdGVzdCBwb3NzaWJsZSBsb2NhbCBjYWxsIHVuZGVyIE1TVkMgKi8KKyNkZWZpbmUgUHlfTE9DQUwodHlwZSkgc3RhdGljIHR5cGUgX19mYXN0Y2FsbAorI2RlZmluZSBQeV9MT0NBTF9JTkxJTkUodHlwZSkgc3RhdGljIF9faW5saW5lIHR5cGUgX19mYXN0Y2FsbAorI2VsaWYgZGVmaW5lZChVU0VfSU5MSU5FKQorI2RlZmluZSBQeV9MT0NBTCh0eXBlKSBzdGF0aWMgdHlwZQorI2RlZmluZSBQeV9MT0NBTF9JTkxJTkUodHlwZSkgc3RhdGljIGlubGluZSB0eXBlCisjZWxzZQorI2RlZmluZSBQeV9MT0NBTCh0eXBlKSBzdGF0aWMgdHlwZQorI2RlZmluZSBQeV9MT0NBTF9JTkxJTkUodHlwZSkgc3RhdGljIHR5cGUKKyNlbmRpZgorCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlIDxtYXRoLmg+IC8qIE1vdmVkIGhlcmUgZnJvbSB0aGUgbWF0aCBzZWN0aW9uLCBiZWZvcmUgZXh0ZXJuICJDIiAqLwpAQCAtMjk1LDYgKzMzMiwxNSBAQAogI2RlZmluZSBQeV9JU19JTkZJTklUWShYKSAoKFgpICYmIChYKSowLjUgPT0gKFgpKQogI2VuZGlmCiAKKy8qIFB5X0lTX0ZJTklURShYKQorICogUmV0dXJuIDEgaWYgZmxvYXQgb3IgZG91YmxlIGFyZyBpcyBuZWl0aGVyIGluZmluaXRlIG5vciBOQU4sIGVsc2UgMC4KKyAqIFNvbWUgY29tcGlsZXJzIChlLmcuIFZpc3VhbFN0dWRpbykgaGF2ZSBpbnRyaXNpY3MgZm9yIHRoaXMsIHNvIGEgc3BlY2lhbAorICogbWFjcm8gZm9yIHRoaXMgcGFydGljdWxhciB0ZXN0IGlzIHVzZWZ1bAorICovCisjaWZuZGVmIFB5X0lTX0ZJTklURQorI2RlZmluZSBQeV9JU19GSU5JVEUoWCkgKCFQeV9JU19JTkZJTklUWShYKSAmJiAhUHlfSVNfTkFOKFgpKQorI2VuZGlmCisKIC8qIEhVR0VfVkFMIGlzIHN1cHBvc2VkIHRvIGV4cGFuZCB0byBhIHBvc2l0aXZlIGRvdWJsZSBpbmZpbml0eS4gIFB5dGhvbgogICogdXNlcyBQeV9IVUdFX1ZBTCBpbnN0ZWFkIGJlY2F1c2Ugc29tZSBwbGF0Zm9ybXMgYXJlIGJyb2tlbiBpbiB0aGlzCiAgKiByZXNwZWN0LiAgV2UgdXNlZCB0byBlbWJlZCBjb2RlIGluIHB5cG9ydC5oIHRvIHRyeSB0byB3b3JtIGFyb3VuZCB0aGF0LApAQCAtNjg1LDQgKzczMSwxNiBAQAogI3ByYWdtYSBlcnJvcl9tZXNzYWdlcyAob2ZmLEVfRU5EX09GX0xPT1BfQ09ERV9OT1RfUkVBQ0hFRCkKICNlbmRpZgogCisvKgorICogT2xkZXIgTWljcm9zb2Z0IGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IHRoZSBDOTkgbG9uZyBsb25nIGxpdGVyYWwgc3VmZml4ZXMsCisgKiBzbyB0aGVzZSB3aWxsIGJlIGRlZmluZWQgaW4gUEMvcHljb25maWcuaCBmb3IgdGhvc2UgY29tcGlsZXJzLgorICovCisjaWZuZGVmIFB5X0xMCisjZGVmaW5lIFB5X0xMKHgpIHgjI0xMCisjZW5kaWYKKworI2lmbmRlZiBQeV9VTEwKKyNkZWZpbmUgUHlfVUxMKHgpIFB5X0xMKHgjI1UpCisjZW5kaWYKKwogI2VuZGlmIC8qIFB5X1BZUE9SVF9IICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaCBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCmluZGV4IDkwMTIyNTcuLjA1MzFhZWQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCisrKyBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCkBAIC0xODQsMTEgKzE4NCwxMyBAQAogIyBkZWZpbmUgUHlVbmljb2RlX0dldE1heCBQeVVuaWNvZGVVQ1MyX0dldE1heAogIyBkZWZpbmUgUHlVbmljb2RlX0dldFNpemUgUHlVbmljb2RlVUNTMl9HZXRTaXplCiAjIGRlZmluZSBQeVVuaWNvZGVfSm9pbiBQeVVuaWNvZGVVQ1MyX0pvaW4KKyMgZGVmaW5lIFB5VW5pY29kZV9QYXJ0aXRpb24gUHlVbmljb2RlVUNTMl9QYXJ0aXRpb24KKyMgZGVmaW5lIFB5VW5pY29kZV9SUGFydGl0aW9uIFB5VW5pY29kZVVDUzJfUlBhcnRpdGlvbgorIyBkZWZpbmUgUHlVbmljb2RlX1JTcGxpdCBQeVVuaWNvZGVVQ1MyX1JTcGxpdAogIyBkZWZpbmUgUHlVbmljb2RlX1JlcGxhY2UgUHlVbmljb2RlVUNTMl9SZXBsYWNlCiAjIGRlZmluZSBQeVVuaWNvZGVfUmVzaXplIFB5VW5pY29kZVVDUzJfUmVzaXplCiAjIGRlZmluZSBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nIFB5VW5pY29kZVVDUzJfU2V0RGVmYXVsdEVuY29kaW5nCiAjIGRlZmluZSBQeVVuaWNvZGVfU3BsaXQgUHlVbmljb2RlVUNTMl9TcGxpdAotIyBkZWZpbmUgUHlVbmljb2RlX1JTcGxpdCBQeVVuaWNvZGVVQ1MyX1JTcGxpdAogIyBkZWZpbmUgUHlVbmljb2RlX1NwbGl0bGluZXMgUHlVbmljb2RlVUNTMl9TcGxpdGxpbmVzCiAjIGRlZmluZSBQeVVuaWNvZGVfVGFpbG1hdGNoIFB5VW5pY29kZVVDUzJfVGFpbG1hdGNoCiAjIGRlZmluZSBQeVVuaWNvZGVfVHJhbnNsYXRlIFB5VW5pY29kZVVDUzJfVHJhbnNsYXRlCkBAIC0yNTksNiArMjYxLDkgQEAKICMgZGVmaW5lIFB5VW5pY29kZV9HZXRNYXggUHlVbmljb2RlVUNTNF9HZXRNYXgKICMgZGVmaW5lIFB5VW5pY29kZV9HZXRTaXplIFB5VW5pY29kZVVDUzRfR2V0U2l6ZQogIyBkZWZpbmUgUHlVbmljb2RlX0pvaW4gUHlVbmljb2RlVUNTNF9Kb2luCisjIGRlZmluZSBQeVVuaWNvZGVfUGFydGl0aW9uIFB5VW5pY29kZVVDUzRfUGFydGl0aW9uCisjIGRlZmluZSBQeVVuaWNvZGVfUlBhcnRpdGlvbiBQeVVuaWNvZGVVQ1M0X1JQYXJ0aXRpb24KKyMgZGVmaW5lIFB5VW5pY29kZV9SU3BsaXQgUHlVbmljb2RlVUNTNF9SU3BsaXQKICMgZGVmaW5lIFB5VW5pY29kZV9SZXBsYWNlIFB5VW5pY29kZVVDUzRfUmVwbGFjZQogIyBkZWZpbmUgUHlVbmljb2RlX1Jlc2l6ZSBQeVVuaWNvZGVVQ1M0X1Jlc2l6ZQogIyBkZWZpbmUgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZyBQeVVuaWNvZGVVQ1M0X1NldERlZmF1bHRFbmNvZGluZwpAQCAtMzUyLDE3ICszNTcsMjcgQEAKICAgICAgICAgUHlfVU5JQ09ERV9JU0RJR0lUKGNoKSB8fCBcCiAgICAgICAgIFB5X1VOSUNPREVfSVNOVU1FUklDKGNoKSkKIAotI2RlZmluZSBQeV9VTklDT0RFX0NPUFkodGFyZ2V0LCBzb3VyY2UsIGxlbmd0aClcCi0gICAgKG1lbWNweSgodGFyZ2V0KSwgKHNvdXJjZSksIChsZW5ndGgpKnNpemVvZihQeV9VTklDT0RFKSkpCisvKiBtZW1jcHkgaGFzIGEgY29uc2lkZXJhYmxlIHNldHVwIG92ZXJoZWFkIG9uIG1hbnkgcGxhdGZvcm1zOyB1c2UgYQorICAgbG9vcCBmb3Igc2hvcnQgc3RyaW5ncyAodGhlICIxNiIgYmVsb3cgaXMgcHJldHR5IGFyYml0YXJ5KSAqLworI2RlZmluZSBQeV9VTklDT0RFX0NPUFkodGFyZ2V0LCBzb3VyY2UsIGxlbmd0aCkgZG9cCisgICAge1B5X3NzaXplX3QgaV87IFB5X1VOSUNPREUgKnRfID0gKHRhcmdldCk7IGNvbnN0IFB5X1VOSUNPREUgKnNfID0gKHNvdXJjZSk7XAorICAgICAgaWYgKGxlbmd0aCA+IDE2KVwKKyAgICAgICAgbWVtY3B5KHRfLCBzXywgKGxlbmd0aCkqc2l6ZW9mKFB5X1VOSUNPREUpKTtcCisgICAgICBlbHNlXAorICAgICAgICBmb3IgKGlfID0gMDsgaV8gPCAobGVuZ3RoKTsgaV8rKykgdF9baV9dID0gc19baV9dO1wKKyAgICB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFB5X1VOSUNPREVfRklMTCh0YXJnZXQsIHZhbHVlLCBsZW5ndGgpIGRvXAotICAgIHtpbnQgaTsgZm9yIChpID0gMDsgaSA8IChsZW5ndGgpOyBpKyspICh0YXJnZXQpW2ldID0gKHZhbHVlKTt9XAotICAgIHdoaWxlICgwKQorICAgIHtQeV9zc2l6ZV90IGlfOyBQeV9VTklDT0RFICp0XyA9ICh0YXJnZXQpOyBQeV9VTklDT0RFIHZfID0gKHZhbHVlKTtcCisgICAgICAgIGZvciAoaV8gPSAwOyBpXyA8IChsZW5ndGgpOyBpXysrKSB0X1tpX10gPSB2XztcCisgICAgfSB3aGlsZSAoMCkKIAotI2RlZmluZSBQeV9VTklDT0RFX01BVENIKHN0cmluZywgb2Zmc2V0LCBzdWJzdHJpbmcpXAotICAgICgoKigoc3RyaW5nKS0+c3RyICsgKG9mZnNldCkpID09ICooKHN1YnN0cmluZyktPnN0cikpICYmXAotICAgICAhbWVtY21wKChzdHJpbmcpLT5zdHIgKyAob2Zmc2V0KSwgKHN1YnN0cmluZyktPnN0cixcCi0gICAgICAgICAgICAgKHN1YnN0cmluZyktPmxlbmd0aCpzaXplb2YoUHlfVU5JQ09ERSkpKQorLyogY2hlY2sgaWYgc3Vic3RyaW5nIG1hdGNoZXMgYXQgZ2l2ZW4gb2Zmc2V0LiAgdGhlIG9mZnNldCBtdXN0IGJlCisgICB2YWxpZCwgYW5kIHRoZSBzdWJzdHJpbmcgbXVzdCBub3QgYmUgZW1wdHkgKi8KKyNkZWZpbmUgUHlfVU5JQ09ERV9NQVRDSChzdHJpbmcsIG9mZnNldCwgc3Vic3RyaW5nKSBcCisgICAgKCgqKChzdHJpbmcpLT5zdHIgKyAob2Zmc2V0KSkgPT0gKigoc3Vic3RyaW5nKS0+c3RyKSkgJiYgXAorICAgICgoKigoc3RyaW5nKS0+c3RyICsgKG9mZnNldCkgKyAoc3Vic3RyaW5nKS0+bGVuZ3RoLTEpID09ICooKHN1YnN0cmluZyktPnN0ciArIChzdWJzdHJpbmcpLT5sZW5ndGgtMSkpKSAmJiBcCisgICAgICFtZW1jbXAoKHN0cmluZyktPnN0ciArIChvZmZzZXQpLCAoc3Vic3RyaW5nKS0+c3RyLCAoc3Vic3RyaW5nKS0+bGVuZ3RoKnNpemVvZihQeV9VTklDT0RFKSkpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC0xMDA4LDYgKzEwMjMsMjEgQEAKICAgICBpbnQga2VlcGVuZHMJCS8qIElmIHRydWUsIGxpbmUgZW5kIG1hcmtlcnMgYXJlIGluY2x1ZGVkICovCiAgICAgKTsJCQogCisvKiBQYXJ0aXRpb24gYSBzdHJpbmcgdXNpbmcgYSBnaXZlbiBzZXBhcmF0b3IuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfUGFydGl0aW9uKAorICAgIFB5T2JqZWN0ICpzLAkJLyogU3RyaW5nIHRvIHBhcnRpdGlvbiAqLworICAgIFB5T2JqZWN0ICpzZXAJCS8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICApOwkJCisKKy8qIFBhcnRpdGlvbiBhIHN0cmluZyB1c2luZyBhIGdpdmVuIHNlcGFyYXRvciwgc2VhcmNoaW5nIGZyb20gdGhlIGVuZCBvZiB0aGUKKyAgIHN0cmluZy4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9SUGFydGl0aW9uKAorICAgIFB5T2JqZWN0ICpzLAkJLyogU3RyaW5nIHRvIHBhcnRpdGlvbiAqLworICAgIFB5T2JqZWN0ICpzZXAJCS8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICApOwkJCisKIC8qIFNwbGl0IGEgc3RyaW5nIGdpdmluZyBhIGxpc3Qgb2YgVW5pY29kZSBzdHJpbmdzLgogCiAgICBJZiBzZXAgaXMgTlVMTCwgc3BsaXR0aW5nIHdpbGwgYmUgZG9uZSBhdCBhbGwgd2hpdGVzcGFjZQpkaWZmIC0tZ2l0IGEvTGliL1VzZXJTdHJpbmcucHkgYi9MaWIvVXNlclN0cmluZy5weQppbmRleCA5NGViNjZkLi40NzNlZTg4IDEwMDc1NQotLS0gYS9MaWIvVXNlclN0cmluZy5weQorKysgYi9MaWIvVXNlclN0cmluZy5weQpAQCAtMTAyLDYgKzEwMiw4IEBACiAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEubGp1c3Qod2lkdGgsICphcmdzKSkKICAgICBkZWYgbG93ZXIoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEubG93ZXIoKSkKICAgICBkZWYgbHN0cmlwKHNlbGYsIGNoYXJzPU5vbmUpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmxzdHJpcChjaGFycykpCisgICAgZGVmIHBhcnRpdGlvbihzZWxmLCBzZXApOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnBhcnRpdGlvbihzZXApCiAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgb2xkLCBuZXcsIG1heHNwbGl0PS0xKToKICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5yZXBsYWNlKG9sZCwgbmV3LCBtYXhzcGxpdCkpCiAgICAgZGVmIHJmaW5kKHNlbGYsIHN1Yiwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOgpAQCAtMTEwLDYgKzExMiw4IEBACiAgICAgICAgIHJldHVybiBzZWxmLmRhdGEucmluZGV4KHN1Yiwgc3RhcnQsIGVuZCkKICAgICBkZWYgcmp1c3Qoc2VsZiwgd2lkdGgsICphcmdzKToKICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5yanVzdCh3aWR0aCwgKmFyZ3MpKQorICAgIGRlZiBycGFydGl0aW9uKHNlbGYsIHNlcCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucnBhcnRpdGlvbihzZXApCiAgICAgZGVmIHJzdHJpcChzZWxmLCBjaGFycz1Ob25lKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5yc3RyaXAoY2hhcnMpKQogICAgIGRlZiBzcGxpdChzZWxmLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpOgogICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnNwbGl0KHNlcCwgbWF4c3BsaXQpCmRpZmYgLS1naXQgYS9MaWIvX0xXUENvb2tpZUphci5weSBiL0xpYi9fTFdQQ29va2llSmFyLnB5CmluZGV4IDZkNWNlMTguLjJhNGZhN2IgMTAwNjQ0Ci0tLSBhL0xpYi9fTFdQQ29va2llSmFyLnB5CisrKyBiL0xpYi9fTFdQQ29va2llSmFyLnB5CkBAIC0xMSwxMCArMTEsMTEgQEAKIAogIiIiCiAKLWltcG9ydCB0aW1lLCByZSwgbG9nZ2luZwotZnJvbSBjb29raWVsaWIgaW1wb3J0IChyZXJhaXNlX3VubWFza2VkX2V4Y2VwdGlvbnMsIEZpbGVDb29raWVKYXIsIExvYWRFcnJvciwKLSAgICAgQ29va2llLCBNSVNTSU5HX0ZJTEVOQU1FX1RFWFQsIGpvaW5faGVhZGVyX3dvcmRzLCBzcGxpdF9oZWFkZXJfd29yZHMsCi0gICAgIGlzbzJ0aW1lLCB0aW1lMmlzb3opCitpbXBvcnQgdGltZSwgcmUKK2Zyb20gY29va2llbGliIGltcG9ydCAoX3dhcm5fdW5oYW5kbGVkX2V4Y2VwdGlvbiwgRmlsZUNvb2tpZUphciwgTG9hZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBDb29raWUsIE1JU1NJTkdfRklMRU5BTUVfVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgam9pbl9oZWFkZXJfd29yZHMsIHNwbGl0X2hlYWRlcl93b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgaXNvMnRpbWUsIHRpbWUyaXNveikKIAogZGVmIGx3cF9jb29raWVfc3RyKGNvb2tpZSk6CiAgICAgIiIiUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBDb29raWUgaW4gYW4gdGhlIExXUCBjb29raWUgZmlsZSBmb3JtYXQuCkBAIC05Miw3ICs5Myw4IEBACiAgICAgZGVmIF9yZWFsbHlfbG9hZChzZWxmLCBmLCBmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQsIGlnbm9yZV9leHBpcmVzKToKICAgICAgICAgbWFnaWMgPSBmLnJlYWRsaW5lKCkKICAgICAgICAgaWYgbm90IHJlLnNlYXJjaChzZWxmLm1hZ2ljX3JlLCBtYWdpYyk6Ci0gICAgICAgICAgICBtc2cgPSAiJXMgZG9lcyBub3Qgc2VlbSB0byBjb250YWluIGNvb2tpZXMiICUgZmlsZW5hbWUKKyAgICAgICAgICAgIG1zZyA9ICgiJXIgZG9lcyBub3QgbG9vayBsaWtlIGEgU2V0LUNvb2tpZTMgKExXUCkgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAiZmlsZSIgJSBmaWxlbmFtZSkKICAgICAgICAgICAgIHJhaXNlIExvYWRFcnJvcihtc2cpCiAKICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKQEAgLTE1OSw2ICsxNjEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjLmlzX2V4cGlyZWQobm93KToKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICByZXJhaXNlX3VubWFza2VkX2V4Y2VwdGlvbnMoKElPRXJyb3IsKSkKLSAgICAgICAgICAgIHJhaXNlIExvYWRFcnJvcigiaW52YWxpZCBTZXQtQ29va2llMyBmb3JtYXQgZmlsZSAlcyIgJSBmaWxlbmFtZSkKKworICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uKCkKKyAgICAgICAgICAgIHJhaXNlIExvYWRFcnJvcigiaW52YWxpZCBTZXQtQ29va2llMyBmb3JtYXQgZmlsZSAlcjogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsIGxpbmUpKQpkaWZmIC0tZ2l0IGEvTGliL19Nb3ppbGxhQ29va2llSmFyLnB5IGIvTGliL19Nb3ppbGxhQ29va2llSmFyLnB5CmluZGV4IDRmMmYzNzUuLjE3NzZiOTMgMTAwNjQ0Ci0tLSBhL0xpYi9fTW96aWxsYUNvb2tpZUphci5weQorKysgYi9MaWIvX01vemlsbGFDb29raWVKYXIucHkKQEAgLTEsOSArMSw5IEBACiAiIiJNb3ppbGxhIC8gTmV0c2NhcGUgY29va2llIGxvYWRpbmcgLyBzYXZpbmcuIiIiCiAKLWltcG9ydCByZSwgdGltZSwgbG9nZ2luZworaW1wb3J0IHJlLCB0aW1lCiAKLWZyb20gY29va2llbGliIGltcG9ydCAocmVyYWlzZV91bm1hc2tlZF9leGNlcHRpb25zLCBGaWxlQ29va2llSmFyLCBMb2FkRXJyb3IsCi0gICAgIENvb2tpZSwgTUlTU0lOR19GSUxFTkFNRV9URVhUKQorZnJvbSBjb29raWVsaWIgaW1wb3J0IChfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uLCBGaWxlQ29va2llSmFyLCBMb2FkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZSwgTUlTU0lOR19GSUxFTkFNRV9URVhUKQogCiBjbGFzcyBNb3ppbGxhQ29va2llSmFyKEZpbGVDb29raWVKYXIpOgogICAgICIiIgpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBpZiBub3QgcmUuc2VhcmNoKHNlbGYubWFnaWNfcmUsIG1hZ2ljKToKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgcmFpc2UgTG9hZEVycm9yKAotICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCBsb29rIGxpa2UgYSBOZXRzY2FwZSBmb3JtYXQgY29va2llcyBmaWxlIiAlCisgICAgICAgICAgICAgICAgIiVyIGRvZXMgbm90IGxvb2sgbGlrZSBhIE5ldHNjYXBlIGZvcm1hdCBjb29raWVzIGZpbGUiICUKICAgICAgICAgICAgICAgICBmaWxlbmFtZSkKIAogICAgICAgICB0cnk6CkBAIC0xMDQsOSArMTA0LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGMpCiAKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmVyYWlzZV91bm1hc2tlZF9leGNlcHRpb25zKChJT0Vycm9yLCkpCi0gICAgICAgICAgICByYWlzZSBMb2FkRXJyb3IoImludmFsaWQgTmV0c2NhcGUgZm9ybWF0IGZpbGUgJXM6ICVzIiAlCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIF93YXJuX3VuaGFuZGxlZF9leGNlcHRpb24oKQorICAgICAgICAgICAgcmFpc2UgTG9hZEVycm9yKCJpbnZhbGlkIE5ldHNjYXBlIGZvcm1hdCBjb29raWVzIGZpbGUgJXI6ICVyIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lLCBsaW5lKSkKIAogICAgIGRlZiBzYXZlKHNlbGYsIGZpbGVuYW1lPU5vbmUsIGlnbm9yZV9kaXNjYXJkPUZhbHNlLCBpZ25vcmVfZXhwaXJlcz1GYWxzZSk6CmRpZmYgLS1naXQgYS9MaWIvYmRiLnB5IGIvTGliL2JkYi5weQppbmRleCAwOGI0OGMzLi4wYzU2YjYzIDEwMDY0NAotLS0gYS9MaWIvYmRiLnB5CisrKyBiL0xpYi9iZGIucHkKQEAgLTQ3Myw3ICs0NzMsOSBAQAogICAgIGRlZiBkaXNhYmxlKHNlbGYpOgogICAgICAgICBzZWxmLmVuYWJsZWQgPSAwCiAKLSAgICBkZWYgYnBwcmludChzZWxmKToKKyAgICBkZWYgYnBwcmludChzZWxmLCBvdXQ9Tm9uZSk6CisgICAgICAgIGlmIG91dCBpcyBOb25lOgorICAgICAgICAgICAgb3V0ID0gc3lzLnN0ZG91dAogICAgICAgICBpZiBzZWxmLnRlbXBvcmFyeToKICAgICAgICAgICAgIGRpc3AgPSAnZGVsICAnCiAgICAgICAgIGVsc2U6CkBAIC00ODIsMTcgKzQ4NCwxNyBAQAogICAgICAgICAgICAgZGlzcCA9IGRpc3AgKyAneWVzICAnCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkaXNwID0gZGlzcCArICdubyAgICcKLSAgICAgICAgcHJpbnQgJyUtNGRicmVha3BvaW50ICAgJXMgYXQgJXM6JWQnICUgKHNlbGYubnVtYmVyLCBkaXNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGUsIHNlbGYubGluZSkKKyAgICAgICAgcHJpbnQgPj5vdXQsICclLTRkYnJlYWtwb2ludCAgICVzIGF0ICVzOiVkJyAlIChzZWxmLm51bWJlciwgZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGUsIHNlbGYubGluZSkKICAgICAgICAgaWYgc2VsZi5jb25kOgotICAgICAgICAgICAgcHJpbnQgJ1x0c3RvcCBvbmx5IGlmICVzJyAlIChzZWxmLmNvbmQsKQorICAgICAgICAgICAgcHJpbnQgPj5vdXQsICdcdHN0b3Agb25seSBpZiAlcycgJSAoc2VsZi5jb25kLCkKICAgICAgICAgaWYgc2VsZi5pZ25vcmU6Ci0gICAgICAgICAgICBwcmludCAnXHRpZ25vcmUgbmV4dCAlZCBoaXRzJyAlIChzZWxmLmlnbm9yZSkKKyAgICAgICAgICAgIHByaW50ID4+b3V0LCAnXHRpZ25vcmUgbmV4dCAlZCBoaXRzJyAlIChzZWxmLmlnbm9yZSkKICAgICAgICAgaWYgKHNlbGYuaGl0cyk6CiAgICAgICAgICAgICBpZiAoc2VsZi5oaXRzID4gMSk6IHNzID0gJ3MnCiAgICAgICAgICAgICBlbHNlOiBzcyA9ICcnCi0gICAgICAgICAgICBwcmludCAoJ1x0YnJlYWtwb2ludCBhbHJlYWR5IGhpdCAlZCB0aW1lJXMnICUKLSAgICAgICAgICAgICAgICAgICAoc2VsZi5oaXRzLCBzcykpCisgICAgICAgICAgICBwcmludCA+Pm91dCwgKCdcdGJyZWFrcG9pbnQgYWxyZWFkeSBoaXQgJWQgdGltZSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmhpdHMsIHNzKSkKIAogIyAtLS0tLS0tLS0tLWVuZCBvZiBCcmVha3BvaW50IGNsYXNzLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9MaWIvYmluaGV4LnB5IGIvTGliL2JpbmhleC5weQppbmRleCAxNjk4NWZiLi40ZjM4ODJhIDEwMDY0NAotLS0gYS9MaWIvYmluaGV4LnB5CisrKyBiL0xpYi9iaW5oZXgucHkKQEAgLTIxNyw3ICsyMTcsMTEgQEAKICAgICBkZWYgX3dyaXRlY3JjKHNlbGYpOgogICAgICAgICAjIFhYWFggU2hvdWxkIHRoaXMgYmUgaGVyZT8/CiAgICAgICAgICMgc2VsZi5jcmMgPSBiaW5hc2NpaS5jcmNfaHF4KCdcMFwwJywgc2VsZi5jcmMpCi0gICAgICAgIHNlbGYub2ZwLndyaXRlKHN0cnVjdC5wYWNrKCc+aCcsIHNlbGYuY3JjKSkKKyAgICAgICAgaWYgc2VsZi5jcmMgPCAwOgorICAgICAgICAgICAgZm10ID0gJz5oJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm10ID0gJz5IJworICAgICAgICBzZWxmLm9mcC53cml0ZShzdHJ1Y3QucGFjayhmbXQsIHNlbGYuY3JjKSkKICAgICAgICAgc2VsZi5jcmMgPSAwCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weSBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CmluZGV4IDQ0ZTNlOWMuLjMxOTY0ZjAgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CkBAIC0yNCw2ICsyNCwxMiBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGhhdmVfdGhyZWFkcyA9IEZhbHNlCiAKK3RyeToKKyAgICBXaW5kb3dzRXJyb3IKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgY2xhc3MgV2luZG93c0Vycm9yKEV4Y2VwdGlvbik6CisgICAgICAgIHBhc3MKKwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3RfYWxsIGltcG9ydCB2ZXJib3NlCiAKZGlmZiAtLWdpdCBhL0xpYi9jYWxlbmRhci5weSBiL0xpYi9jYWxlbmRhci5weQppbmRleCA3ODAwYWFlLi4wMDk0OGVmIDEwMDY0NAotLS0gYS9MaWIvY2FsZW5kYXIucHkKKysrIGIvTGliL2NhbGVuZGFyLnB5CkBAIC00ODQsOSArNDg0LDYgQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYWxlKToKICAgICAgICAgc2VsZi5sb2NhbGUgPSBsb2NhbGUKIAotICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQogICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIHNlbGYub2xkbG9jYWxlID0gbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfVElNRSwgc2VsZi5sb2NhbGUpCiAgICAgICAgIHJldHVybiBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FKVsxXQpkaWZmIC0tZ2l0IGEvTGliL2NvZGVvcC5weSBiL0xpYi9jb2Rlb3AucHkKaW5kZXggZGFhN2ViOC4uNTYxNmQ5MiAxMDA2NDQKLS0tIGEvTGliL2NvZGVvcC5weQorKysgYi9MaWIvY29kZW9wLnB5CkBAIC05NSwxNSArOTUsNyBAQAogCiAgICAgaWYgY29kZToKICAgICAgICAgcmV0dXJuIGNvZGUKLSAgICB0cnk6Ci0gICAgICAgIGUxID0gZXJyMS5fX2RpY3RfXwotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgZTEgPSBlcnIxCi0gICAgdHJ5OgotICAgICAgICBlMiA9IGVycjIuX19kaWN0X18KLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgIGUyID0gZXJyMgotICAgIGlmIG5vdCBjb2RlMSBhbmQgZTEgPT0gZTI6CisgICAgaWYgbm90IGNvZGUxIGFuZCByZXByKGVycjEpID09IHJlcHIoZXJyMik6CiAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCBlcnIxCiAKIGRlZiBfY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCBzeW1ib2wpOgpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL3B5Y29kZWdlbi5weSBiL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkKaW5kZXggYWFjMmRkYS4uYzA5MzEyOCAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVyL3B5Y29kZWdlbi5weQorKysgYi9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5CkBAIC04MzEsOCArODMxLDYgQEAKICAgICAgICAgc2VsZi5fX3dpdGhfY291bnQgKz0gMQogICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKICAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCi0gICAgICAgIHNlbGYuZW1pdCgnTE9BRF9BVFRSJywgJ19fY29udGV4dF9fJykKLSAgICAgICAgc2VsZi5lbWl0KCdDQUxMX0ZVTkNUSU9OJywgMCkKICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0FUVFInLCAnX19leGl0X18nKQogICAgICAgICBzZWxmLl9pbXBsaWNpdE5hbWVPcCgnU1RPUkUnLCBleGl0dmFyKQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5IGIvTGliL2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5CmluZGV4IDYwNGM1N2EuLjk2YmNjZTMgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlci90cmFuc2Zvcm1lci5weQorKysgYi9MaWIvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkKQEAgLTg0MSwxNyArODQxLDE1IEBACiAgICAgICAgICAgICBuYW1lcy5hcHBlbmQoc2VsZi5jb21fZnBkZWYobm9kZSkpCiAKICAgICAgICAgICAgIGkgPSBpICsgMQotICAgICAgICAgICAgaWYgaSA+PSBsZW4obm9kZWxpc3QpOgotICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgICAgIGlmIG5vZGVsaXN0W2ldWzBdID09IHRva2VuLkVRVUFMOgorICAgICAgICAgICAgaWYgaSA8IGxlbihub2RlbGlzdCkgYW5kIG5vZGVsaXN0W2ldWzBdID09IHRva2VuLkVRVUFMOgogICAgICAgICAgICAgICAgIGRlZmF1bHRzLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2kgKyAxXSkpCiAgICAgICAgICAgICAgICAgaSA9IGkgKyAyCiAgICAgICAgICAgICBlbGlmIGxlbihkZWZhdWx0cyk6Ci0gICAgICAgICAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgYmUgYSBzeW50YXggZXJyb3IuCi0gICAgICAgICAgICAgICAgIyBUcmVhdCAiKGE9MSwgYikiIGFzICIoYT0xLCBiPU5vbmUpIgotICAgICAgICAgICAgICAgIGRlZmF1bHRzLmFwcGVuZChDb25zdChOb25lKSkKKyAgICAgICAgICAgICAgICAjIHdlIGhhdmUgYWxyZWFkeSBzZWVuIGFuIGFyZ3VtZW50IHdpdGggZGVmYXVsdCwgYnV0IGhlcmUKKyAgICAgICAgICAgICAgICAjIGNhbWUgb25lIHdpdGhvdXQKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgIm5vbi1kZWZhdWx0IGFyZ3VtZW50IGZvbGxvd3MgZGVmYXVsdCBhcmd1bWVudCIKIAorICAgICAgICAgICAgIyBza2lwIHRoZSBjb21tYQogICAgICAgICAgICAgaSA9IGkgKyAxCiAKICAgICAgICAgcmV0dXJuIG5hbWVzLCBkZWZhdWx0cywgZmxhZ3MKZGlmZiAtLWdpdCBhL0xpYi9jb250ZXh0bGliLnB5IGIvTGliL2NvbnRleHRsaWIucHkKaW5kZXggYWE1MzM1ZC4uYTgwN2M0MiAxMDA2NDQKLS0tIGEvTGliL2NvbnRleHRsaWIucHkKKysrIGIvTGliL2NvbnRleHRsaWIucHkKQEAgLTEwLDkgKzEwLDYgQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZ2VuKToKICAgICAgICAgc2VsZi5nZW4gPSBnZW4KIAotICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQogICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmdlbi5uZXh0KCkKQEAgLTg4LDcgKzg1LDcgQEAKIAogCiBAY29udGV4dG1hbmFnZXIKLWRlZiBuZXN0ZWQoKmNvbnRleHRzKToKK2RlZiBuZXN0ZWQoKm1hbmFnZXJzKToKICAgICAiIiJTdXBwb3J0IG11bHRpcGxlIGNvbnRleHQgbWFuYWdlcnMgaW4gYSBzaW5nbGUgd2l0aC1zdGF0ZW1lbnQuCiAKICAgICBDb2RlIGxpa2UgdGhpczoKQEAgLTEwOSw4ICsxMDYsNyBAQAogICAgIGV4YyA9IChOb25lLCBOb25lLCBOb25lKQogICAgIHRyeToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZm9yIGNvbnRleHQgaW4gY29udGV4dHM6Ci0gICAgICAgICAgICAgICAgbWdyID0gY29udGV4dC5fX2NvbnRleHRfXygpCisgICAgICAgICAgICBmb3IgbWdyIGluIG1hbmFnZXJzOgogICAgICAgICAgICAgICAgIGV4aXQgPSBtZ3IuX19leGl0X18KICAgICAgICAgICAgICAgICBlbnRlciA9IG1nci5fX2VudGVyX18KICAgICAgICAgICAgICAgICB2YXJzLmFwcGVuZChlbnRlcigpKQpAQCAtMTI3LDEyICsxMjMsMTQgQEAKICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICBleGMgPSBzeXMuZXhjX2luZm8oKQogICAgICAgICBpZiBleGMgIT0gKE5vbmUsIE5vbmUsIE5vbmUpOgotICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICMgRG9uJ3QgcmVseSBvbiBzeXMuZXhjX2luZm8oKSBzdGlsbCBjb250YWluaW5nCisgICAgICAgICAgICAjIHRoZSByaWdodCBpbmZvcm1hdGlvbi4gQW5vdGhlciBleGNlcHRpb24gbWF5CisgICAgICAgICAgICAjIGhhdmUgYmVlbiByYWlzZWQgYW5kIGNhdWdodCBieSBhbiBleGl0IG1ldGhvZAorICAgICAgICAgICAgcmFpc2UgZXhjWzBdLCBleGNbMV0sIGV4Y1syXQogCiAKLUBjb250ZXh0bWFuYWdlcgotZGVmIGNsb3NpbmcodGhpbmcpOgotICAgICIiIkNvbnRleHQgbWFuYWdlciB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHNvbWV0aGluZyBhdCB0aGUgZW5kIG9mIGEgYmxvY2suCitjbGFzcyBjbG9zaW5nKG9iamVjdCk6CisgICAgIiIiQ29udGV4dCB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHNvbWV0aGluZyBhdCB0aGUgZW5kIG9mIGEgYmxvY2suCiAKICAgICBDb2RlIGxpa2UgdGhpczoKIApAQCAtMTQ4LDcgKzE0Niw5IEBACiAgICAgICAgICAgICBmLmNsb3NlKCkKIAogICAgICIiIgotICAgIHRyeToKLSAgICAgICAgeWllbGQgdGhpbmcKLSAgICBmaW5hbGx5OgotICAgICAgICB0aGluZy5jbG9zZSgpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRoaW5nKToKKyAgICAgICAgc2VsZi50aGluZyA9IHRoaW5nCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGhpbmcKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgc2VsZi50aGluZy5jbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvY29va2llbGliLnB5IGIvTGliL2Nvb2tpZWxpYi5weQppbmRleCBmMGE4OWE1Li5lOGZlZTBlIDEwMDY0NAotLS0gYS9MaWIvY29va2llbGliLnB5CisrKyBiL0xpYi9jb29raWVsaWIucHkKQEAgLTcsOSArNyw5IEBACiBhdHRyaWJ1dGVzIG9mIHRoZSBIVFRQIGNvb2tpZSBzeXN0ZW0gYXMgY29va2llLWF0dHJpYnV0ZXMsIHRvIGRpc3Rpbmd1aXNoCiB0aGVtIGNsZWFybHkgZnJvbSBQeXRob24gYXR0cmlidXRlcy4KIAotQ2xhc3MgZGlhZ3JhbSAobm90ZSB0aGF0IHRoZSBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZXJpdmUgZnJvbQotRmlsZUNvb2tpZUphciBhcmUgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5LCBidXQKLWFyZSBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3c2VhcmNoLnNmLm5ldC8pOgorQ2xhc3MgZGlhZ3JhbSAobm90ZSB0aGF0IEJTRERCQ29va2llSmFyIGFuZCB0aGUgTVNJRSogY2xhc3NlcyBhcmUgbm90CitkaXN0cmlidXRlZCB3aXRoIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSwgYnV0IGFyZSBhdmFpbGFibGUgZnJvbQoraHR0cDovL3d3d3NlYXJjaC5zZi5uZXQvKToKIAogICAgICAgICAgICAgICAgICAgICAgICAgQ29va2llSmFyX19fXwogICAgICAgICAgICAgICAgICAgICAgICAgLyAgICAgXCAgICAgIFwKQEAgLTI1LDcgKzI1LDEwIEBACiAKICIiIgogCi1pbXBvcnQgc3lzLCByZSwgdXJscGFyc2UsIGNvcHksIHRpbWUsIHVybGxpYiwgbG9nZ2luZworX19hbGxfXyA9IFsnQ29va2llJywgJ0Nvb2tpZUphcicsICdDb29raWVQb2xpY3knLCAnRGVmYXVsdENvb2tpZVBvbGljeScsCisgICAgICAgICAgICdGaWxlQ29va2llSmFyJywgJ0xXUENvb2tpZUphcicsICdMb2FkRXJyb3InLCAnTW96aWxsYUNvb2tpZUphciddCisKK2ltcG9ydCByZSwgdXJscGFyc2UsIGNvcHksIHRpbWUsIHVybGxpYgogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcgYXMgX3RocmVhZGluZwogZXhjZXB0IEltcG9ydEVycm9yOgpAQCAtMzMsMjEgKzM2LDI3IEBACiBpbXBvcnQgaHR0cGxpYiAgIyBvbmx5IGZvciB0aGUgZGVmYXVsdCBIVFRQIHBvcnQKIGZyb20gY2FsZW5kYXIgaW1wb3J0IHRpbWVnbQogCi1kZWJ1ZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb29raWVsaWIiKS5kZWJ1ZworZGVidWcgPSBGYWxzZSAgICMgc2V0IHRvIFRydWUgdG8gZW5hYmxlIGRlYnVnZ2luZyB2aWEgdGhlIGxvZ2dpbmcgbW9kdWxlCitsb2dnZXIgPSBOb25lCisKK2RlZiBfZGVidWcoKmFyZ3MpOgorICAgIGlmIG5vdCBkZWJ1ZzoKKyAgICAgICAgcmV0dXJuCisgICAgZ2xvYmFsIGxvZ2dlcgorICAgIGlmIG5vdCBsb2dnZXI6CisgICAgICAgIGltcG9ydCBsb2dnaW5nCisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb29raWVsaWIiKQorICAgIHJldHVybiBsb2dnZXIuZGVidWcoKmFyZ3MpCisKIAogREVGQVVMVF9IVFRQX1BPUlQgPSBzdHIoaHR0cGxpYi5IVFRQX1BPUlQpCiBNSVNTSU5HX0ZJTEVOQU1FX1RFWFQgPSAoImEgZmlsZW5hbWUgd2FzIG5vdCBzdXBwbGllZCAobm9yIHdhcyB0aGUgQ29va2llSmFyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2UgaW5pdGlhbGlzZWQgd2l0aCBvbmUpIikKIAotZGVmIHJlcmFpc2VfdW5tYXNrZWRfZXhjZXB0aW9ucyh1bm1hc2tlZD0oKSk6CitkZWYgX3dhcm5fdW5oYW5kbGVkX2V4Y2VwdGlvbigpOgogICAgICMgVGhlcmUgYXJlIGEgZmV3IGNhdGNoLWFsbCBleGNlcHQ6IHN0YXRlbWVudHMgaW4gdGhpcyBtb2R1bGUsIGZvcgotICAgICMgY2F0Y2hpbmcgaW5wdXQgdGhhdCdzIGJhZCBpbiB1bmV4cGVjdGVkIHdheXMuCi0gICAgIyBUaGlzIGZ1bmN0aW9uIHJlLXJhaXNlcyBzb21lIGV4Y2VwdGlvbnMgd2UgZG9uJ3Qgd2FudCB0byB0cmFwLgotICAgIHVubWFza2VkID0gdW5tYXNrZWQgKyAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQsIE1lbW9yeUVycm9yKQotICAgIGV0eXBlID0gc3lzLmV4Y19pbmZvKClbMF0KLSAgICBpZiBpc3N1YmNsYXNzKGV0eXBlLCB1bm1hc2tlZCk6Ci0gICAgICAgIHJhaXNlCi0gICAgIyBzd2FsbG93ZWQgYW4gZXhjZXB0aW9uCisgICAgIyBjYXRjaGluZyBpbnB1dCB0aGF0J3MgYmFkIGluIHVuZXhwZWN0ZWQgd2F5cy4gIFdhcm4gaWYgYW55CisgICAgIyBleGNlcHRpb25zIGFyZSBjYXVnaHQgdGhlcmUuCiAgICAgaW1wb3J0IHdhcm5pbmdzLCB0cmFjZWJhY2ssIFN0cmluZ0lPCiAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKE5vbmUsIGYpCkBAIC02MTMsNyArNjIyLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW50KHBvcnQpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgZGVidWcoIm5vbm51bWVyaWMgcG9ydDogJyVzJyIsIHBvcnQpCisgICAgICAgICAgICBfZGVidWcoIm5vbm51bWVyaWMgcG9ydDogJyVzJyIsIHBvcnQpCiAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgIGVsc2U6CiAgICAgICAgIHBvcnQgPSBERUZBVUxUX0hUVFBfUE9SVApAQCAtOTA0LDcgKzkxMyw3IEBACiAgICAgICAgIHN0cmljdCBhYm91dCB3aGljaCBjb29raWVzIHRvIGFjY2VwdCkuCiAKICAgICAgICAgIiIiCi0gICAgICAgIGRlYnVnKCIgLSBjaGVja2luZyBjb29raWUgJXM9JXMiLCBjb29raWUubmFtZSwgY29va2llLnZhbHVlKQorICAgICAgICBfZGVidWcoIiAtIGNoZWNraW5nIGNvb2tpZSAlcz0lcyIsIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCiAKICAgICAgICAgYXNzZXJ0IGNvb2tpZS5uYW1lIGlzIG5vdCBOb25lCiAKQEAgLTkyMCwyNSArOTI5LDI1IEBACiAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAjIFZlcnNpb24gaXMgYWx3YXlzIHNldCB0byAwIGJ5IHBhcnNlX25zX2hlYWRlcnMgaWYgaXQncyBhIE5ldHNjYXBlCiAgICAgICAgICAgICAjIGNvb2tpZSwgc28gdGhpcyBtdXN0IGJlIGFuIGludmFsaWQgUkZDIDI5NjUgY29va2llLgotICAgICAgICAgICAgZGVidWcoIiAgIFNldC1Db29raWUyIHdpdGhvdXQgdmVyc2lvbiBhdHRyaWJ1dGUgKCVzPSVzKSIsCi0gICAgICAgICAgICAgICAgICBjb29raWUubmFtZSwgY29va2llLnZhbHVlKQorICAgICAgICAgICAgX2RlYnVnKCIgICBTZXQtQ29va2llMiB3aXRob3V0IHZlcnNpb24gYXR0cmlidXRlICglcz0lcykiLAorICAgICAgICAgICAgICAgICAgIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBub3Qgc2VsZi5yZmMyOTY1OgotICAgICAgICAgICAgZGVidWcoIiAgIFJGQyAyOTY1IGNvb2tpZXMgYXJlIHN3aXRjaGVkIG9mZiIpCisgICAgICAgICAgICBfZGVidWcoIiAgIFJGQyAyOTY1IGNvb2tpZXMgYXJlIHN3aXRjaGVkIG9mZiIpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgZWxpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBub3Qgc2VsZi5uZXRzY2FwZToKLSAgICAgICAgICAgIGRlYnVnKCIgICBOZXRzY2FwZSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgX2RlYnVnKCIgICBOZXRzY2FwZSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICBkZWYgc2V0X29rX3ZlcmlmaWFiaWxpdHkoc2VsZiwgY29va2llLCByZXF1ZXN0KToKICAgICAgICAgaWYgcmVxdWVzdC5pc191bnZlcmlmaWFibGUoKSBhbmQgaXNfdGhpcmRfcGFydHkocmVxdWVzdCk6CiAgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIHNlbGYuc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlOgotICAgICAgICAgICAgICAgIGRlYnVnKCIgICB0aGlyZC1wYXJ0eSBSRkMgMjk2NSBjb29raWUgZHVyaW5nICIKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIHRoaXJkLXBhcnR5IFJGQyAyOTY1IGNvb2tpZSBkdXJpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW52ZXJpZmlhYmxlIHRyYW5zYWN0aW9uIikKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIGVsaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgc2VsZi5zdHJpY3RfbnNfdW52ZXJpZmlhYmxlOgotICAgICAgICAgICAgICAgIGRlYnVnKCIgICB0aGlyZC1wYXJ0eSBOZXRzY2FwZSBjb29raWUgZHVyaW5nICIKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIHRoaXJkLXBhcnR5IE5ldHNjYXBlIGNvb2tpZSBkdXJpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW52ZXJpZmlhYmxlIHRyYW5zYWN0aW9uIikKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgcmV0dXJuIFRydWUKQEAgLTk0OCw3ICs5NTcsNyBAQAogICAgICAgICAjIHNlcnZlcnMgdGhhdCBrbm93IGJvdGggVjAgYW5kIFYxIHByb3RvY29scy4KICAgICAgICAgaWYgKGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIHNlbGYuc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhciBhbmQKICAgICAgICAgICAgIGNvb2tpZS5uYW1lLnN0YXJ0c3dpdGgoIiQiKSk6Ci0gICAgICAgICAgICBkZWJ1ZygiICAgaWxsZWdhbCBuYW1lIChzdGFydHMgd2l0aCAnJCcpOiAnJXMnIiwgY29va2llLm5hbWUpCisgICAgICAgICAgICBfZGVidWcoIiAgIGlsbGVnYWwgbmFtZSAoc3RhcnRzIHdpdGggJyQnKTogJyVzJyIsIGNvb2tpZS5uYW1lKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCiAKQEAgLTk1OCwzMyArOTY3LDM2IEBACiAgICAgICAgICAgICBpZiAoKGNvb2tpZS52ZXJzaW9uID4gMCBvcgogICAgICAgICAgICAgICAgICAoY29va2llLnZlcnNpb24gPT0gMCBhbmQgc2VsZi5zdHJpY3RfbnNfc2V0X3BhdGgpKSBhbmQKICAgICAgICAgICAgICAgICBub3QgcmVxX3BhdGguc3RhcnRzd2l0aChjb29raWUucGF0aCkpOgotICAgICAgICAgICAgICAgIGRlYnVnKCIgICBwYXRoIGF0dHJpYnV0ZSAlcyBpcyBub3QgYSBwcmVmaXggb2YgcmVxdWVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgInBhdGggJXMiLCBjb29raWUucGF0aCwgcmVxX3BhdGgpCisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBwYXRoIGF0dHJpYnV0ZSAlcyBpcyBub3QgYSBwcmVmaXggb2YgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICJwYXRoICVzIiwgY29va2llLnBhdGgsIHJlcV9wYXRoKQogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgZGVmIHNldF9va19kb21haW4oc2VsZiwgY29va2llLCByZXF1ZXN0KToKICAgICAgICAgaWYgc2VsZi5pc19ibG9ja2VkKGNvb2tpZS5kb21haW4pOgotICAgICAgICAgICAgZGVidWcoIiAgIGRvbWFpbiAlcyBpcyBpbiB1c2VyIGJsb2NrLWxpc3QiLCBjb29raWUuZG9tYWluKQorICAgICAgICAgICAgX2RlYnVnKCIgICBkb21haW4gJXMgaXMgaW4gdXNlciBibG9jay1saXN0IiwgY29va2llLmRvbWFpbikKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBpZiBzZWxmLmlzX25vdF9hbGxvd2VkKGNvb2tpZS5kb21haW4pOgotICAgICAgICAgICAgZGVidWcoIiAgIGRvbWFpbiAlcyBpcyBub3QgaW4gdXNlciBhbGxvdy1saXN0IiwgY29va2llLmRvbWFpbikKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgZG9tYWluICVzIGlzIG5vdCBpbiB1c2VyIGFsbG93LWxpc3QiLCBjb29raWUuZG9tYWluKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGlmIGNvb2tpZS5kb21haW5fc3BlY2lmaWVkOgogICAgICAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCiAgICAgICAgICAgICBkb21haW4gPSBjb29raWUuZG9tYWluCiAgICAgICAgICAgICBpZiBzZWxmLnN0cmljdF9kb21haW4gYW5kIChkb21haW4uY291bnQoIi4iKSA+PSAyKToKKyAgICAgICAgICAgICAgICAjIFhYWCBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBjb21wYXJlZCB3aXRoIHRoZSBLb25xdWVyb3IKKyAgICAgICAgICAgICAgICAjIChrY29va2llamFyLmNwcCkgYW5kIE1vemlsbGEgaW1wbGVtZW50YXRpb25zLCBidXQgaXQncyBhCisgICAgICAgICAgICAgICAgIyBsb3NpbmcgYmF0dGxlLgogICAgICAgICAgICAgICAgIGkgPSBkb21haW4ucmZpbmQoIi4iKQogICAgICAgICAgICAgICAgIGogPSBkb21haW4ucmZpbmQoIi4iLCAwLCBpKQogICAgICAgICAgICAgICAgIGlmIGogPT0gMDogICMgZG9tYWluIGxpa2UgLmZvby5iYXIKICAgICAgICAgICAgICAgICAgICAgdGxkID0gZG9tYWluW2krMTpdCiAgICAgICAgICAgICAgICAgICAgIHNsZCA9IGRvbWFpbltqKzE6aV0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNsZC5sb3dlcigpIGluICgKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbyIsICJhYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tIiwgImVkdSIsICJvcmciLCAibmV0IiwgImdvdiIsICJtaWwiLCAiaW50IikgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW4odGxkKSA9PSAyKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2xkLmxvd2VyKCkgaW4gKCJjbyIsICJhYyIsICJjb20iLCAiZWR1IiwgIm9yZyIsICJuZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAiZ292IiwgIm1pbCIsICJpbnQiLCAiYWVybyIsICJiaXoiLCAiY2F0IiwgImNvb3AiLAorICAgICAgICAgICAgICAgICAgICAgICAiaW5mbyIsICJqb2JzIiwgIm1vYmkiLCAibXVzZXVtIiwgIm5hbWUiLCAicHJvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInRyYXZlbCIsICJldSIpIGFuZCBsZW4odGxkKSA9PSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gbGlrZSAuY28udWsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBjb3VudHJ5LWNvZGUgc2Vjb25kIGxldmVsIGRvbWFpbiAlcyIsIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgY291bnRyeS1jb2RlIHNlY29uZCBsZXZlbCBkb21haW4gJXMiLCBkb21haW4pCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIGlmIGRvbWFpbi5zdGFydHN3aXRoKCIuIik6CiAgICAgICAgICAgICAgICAgdW5kb3R0ZWRfZG9tYWluID0gZG9tYWluWzE6XQpAQCAtOTkyLDMwICsxMDA0LDMwIEBACiAgICAgICAgICAgICAgICAgdW5kb3R0ZWRfZG9tYWluID0gZG9tYWluCiAgICAgICAgICAgICBlbWJlZGRlZF9kb3RzID0gKHVuZG90dGVkX2RvbWFpbi5maW5kKCIuIikgPj0gMCkKICAgICAgICAgICAgIGlmIG5vdCBlbWJlZGRlZF9kb3RzIGFuZCBkb21haW4gIT0gIi5sb2NhbCI6Ci0gICAgICAgICAgICAgICAgZGVidWcoIiAgIG5vbi1sb2NhbCBkb21haW4gJXMgY29udGFpbnMgbm8gZW1iZWRkZWQgZG90IiwKLSAgICAgICAgICAgICAgICAgICAgICBkb21haW4pCisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBub24tbG9jYWwgZG9tYWluICVzIGNvbnRhaW5zIG5vIGVtYmVkZGVkIGRvdCIsCisgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbikKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID09IDA6CiAgICAgICAgICAgICAgICAgaWYgKG5vdCBlcmhuLmVuZHN3aXRoKGRvbWFpbikgYW5kCiAgICAgICAgICAgICAgICAgICAgIChub3QgZXJobi5zdGFydHN3aXRoKCIuIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICBub3QgKCIuIitlcmhuKS5lbmRzd2l0aChkb21haW4pKSk6Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIChldmVuIHdpdGggYWRkZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbCBkb3QpIGRvZXMgbm90IGVuZCBlbmQgd2l0aCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVyaG4sIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIChldmVuIHdpdGggYWRkZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWwgZG90KSBkb2VzIG5vdCBlbmQgZW5kIHdpdGggJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJobiwgZG9tYWluKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIGlmIChjb29raWUudmVyc2lvbiA+IDAgb3IKICAgICAgICAgICAgICAgICAoc2VsZi5zdHJpY3RfbnNfZG9tYWluICYgc2VsZi5Eb21haW5SRkMyOTY1TWF0Y2gpKToKICAgICAgICAgICAgICAgICBpZiBub3QgZG9tYWluX21hdGNoKGVyaG4sIGRvbWFpbik6Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIGRvZXMgbm90IGRvbWFpbi1tYXRjaCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIlcyIsIGVyaG4sIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIGRvZXMgbm90IGRvbWFpbi1tYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBlcmhuLCBkb21haW4pCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgaWYgKGNvb2tpZS52ZXJzaW9uID4gMCBvcgogICAgICAgICAgICAgICAgIChzZWxmLnN0cmljdF9uc19kb21haW4gJiBzZWxmLkRvbWFpblN0cmljdE5vRG90cykpOgogICAgICAgICAgICAgICAgIGhvc3RfcHJlZml4ID0gcmVxX2hvc3RbOi1sZW4oZG9tYWluKV0KICAgICAgICAgICAgICAgICBpZiAoaG9zdF9wcmVmaXguZmluZCgiLiIpID49IDAgYW5kCiAgICAgICAgICAgICAgICAgICAgIG5vdCBJUFY0X1JFLnNlYXJjaChyZXFfaG9zdCkpOgotICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgaG9zdCBwcmVmaXggJXMgZm9yIGRvbWFpbiAlcyBjb250YWlucyBhIGRvdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfcHJlZml4LCBkb21haW4pCisgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgaG9zdCBwcmVmaXggJXMgZm9yIGRvbWFpbiAlcyBjb250YWlucyBhIGRvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X3ByZWZpeCwgZG9tYWluKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgcmV0dXJuIFRydWUKIApAQCAtMTAzMCwxMyArMTA0MiwxMyBAQAogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgaW50KHApCiAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBiYWQgcG9ydCAlcyAobm90IG51bWVyaWMpIiwgcCkKKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBiYWQgcG9ydCAlcyAobm90IG51bWVyaWMpIiwgcCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICAgaWYgcCA9PSByZXFfcG9ydDoKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZGVidWcoIiAgIHJlcXVlc3QgcG9ydCAoJXMpIG5vdCBmb3VuZCBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVxX3BvcnQsIGNvb2tpZS5wb3J0KQorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgcmVxdWVzdCBwb3J0ICglcykgbm90IGZvdW5kIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxX3BvcnQsIGNvb2tpZS5wb3J0KQogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gVHJ1ZQogCkBAIC0xMDQ5LDcgKzEwNjEsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgIyBQYXRoIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBieSAucGF0aF9yZXR1cm5fb2soKSwgYW5kIGRvbWFpbgogICAgICAgICAjIGJsb2NraW5nIGRvbmUgYnkgLmRvbWFpbl9yZXR1cm5fb2soKS4KLSAgICAgICAgZGVidWcoIiAtIGNoZWNraW5nIGNvb2tpZSAlcz0lcyIsIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCisgICAgICAgIF9kZWJ1ZygiIC0gY2hlY2tpbmcgY29va2llICVzPSVzIiwgY29va2llLm5hbWUsIGNvb2tpZS52YWx1ZSkKIAogICAgICAgICBmb3IgbiBpbiAidmVyc2lvbiIsICJ2ZXJpZmlhYmlsaXR5IiwgInNlY3VyZSIsICJleHBpcmVzIiwgInBvcnQiLCAiZG9tYWluIjoKICAgICAgICAgICAgIGZuX25hbWUgPSAicmV0dXJuX29rXyIrbgpAQCAtMTA2MCwzNCArMTA3MiwzNCBAQAogCiAgICAgZGVmIHJldHVybl9va192ZXJzaW9uKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CiAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID4gMCBhbmQgbm90IHNlbGYucmZjMjk2NToKLSAgICAgICAgICAgIGRlYnVnKCIgICBSRkMgMjk2NSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgX2RlYnVnKCIgICBSRkMgMjk2NSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGVsaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgbm90IHNlbGYubmV0c2NhcGU6Ci0gICAgICAgICAgICBkZWJ1ZygiICAgTmV0c2NhcGUgY29va2llcyBhcmUgc3dpdGNoZWQgb2ZmIikKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgTmV0c2NhcGUgY29va2llcyBhcmUgc3dpdGNoZWQgb2ZmIikKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgZGVmIHJldHVybl9va192ZXJpZmlhYmlsaXR5KHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CiAgICAgICAgIGlmIHJlcXVlc3QuaXNfdW52ZXJpZmlhYmxlKCkgYW5kIGlzX3RoaXJkX3BhcnR5KHJlcXVlc3QpOgogICAgICAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBzZWxmLnN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZToKLSAgICAgICAgICAgICAgICBkZWJ1ZygiICAgdGhpcmQtcGFydHkgUkZDIDI5NjUgY29va2llIGR1cmluZyB1bnZlcmlmaWFibGUgIgotICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICB0aGlyZC1wYXJ0eSBSRkMgMjk2NSBjb29raWUgZHVyaW5nIHVudmVyaWZpYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICBlbGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIHNlbGYuc3RyaWN0X25zX3VudmVyaWZpYWJsZToKLSAgICAgICAgICAgICAgICBkZWJ1ZygiICAgdGhpcmQtcGFydHkgTmV0c2NhcGUgY29va2llIGR1cmluZyB1bnZlcmlmaWFibGUgIgotICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICB0aGlyZC1wYXJ0eSBOZXRzY2FwZSBjb29raWUgZHVyaW5nIHVudmVyaWZpYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICBkZWYgcmV0dXJuX29rX3NlY3VyZShzZWxmLCBjb29raWUsIHJlcXVlc3QpOgogICAgICAgICBpZiBjb29raWUuc2VjdXJlIGFuZCByZXF1ZXN0LmdldF90eXBlKCkgIT0gImh0dHBzIjoKLSAgICAgICAgICAgIGRlYnVnKCIgICBzZWN1cmUgY29va2llIHdpdGggbm9uLXNlY3VyZSByZXF1ZXN0IikKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgc2VjdXJlIGNvb2tpZSB3aXRoIG5vbi1zZWN1cmUgcmVxdWVzdCIpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgcmV0dXJuIFRydWUKIAogICAgIGRlZiByZXR1cm5fb2tfZXhwaXJlcyhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgogICAgICAgICBpZiBjb29raWUuaXNfZXhwaXJlZChzZWxmLl9ub3cpOgotICAgICAgICAgICAgZGVidWcoIiAgIGNvb2tpZSBleHBpcmVkIikKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgY29va2llIGV4cGlyZWQiKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCiAKQEAgLTExMDAsOCArMTExMiw4IEBACiAgICAgICAgICAgICAgICAgaWYgcCA9PSByZXFfcG9ydDoKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZGVidWcoIiAgIHJlcXVlc3QgcG9ydCAlcyBkb2VzIG5vdCBtYXRjaCBjb29raWUgcG9ydCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVxX3BvcnQsIGNvb2tpZS5wb3J0KQorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgcmVxdWVzdCBwb3J0ICVzIGRvZXMgbm90IG1hdGNoIGNvb2tpZSBwb3J0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxX3BvcnQsIGNvb2tpZS5wb3J0KQogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gVHJ1ZQogCkBAIC0xMTEzLDE3ICsxMTI1LDE3IEBACiAgICAgICAgIGlmIChjb29raWUudmVyc2lvbiA9PSAwIGFuZAogICAgICAgICAgICAgKHNlbGYuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuRG9tYWluU3RyaWN0Tm9uRG9tYWluKSBhbmQKICAgICAgICAgICAgIG5vdCBjb29raWUuZG9tYWluX3NwZWNpZmllZCBhbmQgZG9tYWluICE9IGVyaG4pOgotICAgICAgICAgICAgZGVidWcoIiAgIGNvb2tpZSB3aXRoIHVuc3BlY2lmaWVkIGRvbWFpbiBkb2VzIG5vdCBzdHJpbmctY29tcGFyZSAiCi0gICAgICAgICAgICAgICAgICAiZXF1YWwgdG8gcmVxdWVzdCBkb21haW4iKQorICAgICAgICAgICAgX2RlYnVnKCIgICBjb29raWUgd2l0aCB1bnNwZWNpZmllZCBkb21haW4gZG9lcyBub3Qgc3RyaW5nLWNvbXBhcmUgIgorICAgICAgICAgICAgICAgICAgICJlcXVhbCB0byByZXF1ZXN0IGRvbWFpbiIpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKIAogICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIG5vdCBkb21haW5fbWF0Y2goZXJobiwgZG9tYWluKToKLSAgICAgICAgICAgIGRlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUgJXMgZG9lcyBub3QgZG9tYWluLW1hdGNoICIKLSAgICAgICAgICAgICAgICAgICJSRkMgMjk2NSBjb29raWUgZG9tYWluICVzIiwgZXJobiwgZG9tYWluKQorICAgICAgICAgICAgX2RlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUgJXMgZG9lcyBub3QgZG9tYWluLW1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAiUkZDIDI5NjUgY29va2llIGRvbWFpbiAlcyIsIGVyaG4sIGRvbWFpbikKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBub3QgKCIuIitlcmhuKS5lbmRzd2l0aChkb21haW4pOgotICAgICAgICAgICAgZGVidWcoIiAgIHJlcXVlc3QtaG9zdCAlcyBkb2VzIG5vdCBtYXRjaCBOZXRzY2FwZSBjb29raWUgZG9tYWluICIKLSAgICAgICAgICAgICAgICAgICIlcyIsIHJlcV9ob3N0LCBkb21haW4pCisgICAgICAgICAgICBfZGVidWcoIiAgIHJlcXVlc3QtaG9zdCAlcyBkb2VzIG5vdCBtYXRjaCBOZXRzY2FwZSBjb29raWUgZG9tYWluICIKKyAgICAgICAgICAgICAgICAgICAiJXMiLCByZXFfaG9zdCwgZG9tYWluKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCiAKQEAgLTExMzYsMjQgKzExNDgsMjQgQEAKICAgICAgICAgaWYgbm90IGVyaG4uc3RhcnRzd2l0aCgiLiIpOgogICAgICAgICAgICAgZXJobiA9ICIuIitlcmhuCiAgICAgICAgIGlmIG5vdCAocmVxX2hvc3QuZW5kc3dpdGgoZG9tYWluKSBvciBlcmhuLmVuZHN3aXRoKGRvbWFpbikpOgotICAgICAgICAgICAgI2RlYnVnKCIgICByZXF1ZXN0IGRvbWFpbiAlcyBkb2VzIG5vdCBtYXRjaCBjb29raWUgZG9tYWluICVzIiwKLSAgICAgICAgICAgICMgICAgICByZXFfaG9zdCwgZG9tYWluKQorICAgICAgICAgICAgI19kZWJ1ZygiICAgcmVxdWVzdCBkb21haW4gJXMgZG9lcyBub3QgbWF0Y2ggY29va2llIGRvbWFpbiAlcyIsCisgICAgICAgICAgICAjICAgICAgIHJlcV9ob3N0LCBkb21haW4pCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKIAogICAgICAgICBpZiBzZWxmLmlzX2Jsb2NrZWQoZG9tYWluKToKLSAgICAgICAgICAgIGRlYnVnKCIgICBkb21haW4gJXMgaXMgaW4gdXNlciBibG9jay1saXN0IiwgZG9tYWluKQorICAgICAgICAgICAgX2RlYnVnKCIgICBkb21haW4gJXMgaXMgaW4gdXNlciBibG9jay1saXN0IiwgZG9tYWluKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGlmIHNlbGYuaXNfbm90X2FsbG93ZWQoZG9tYWluKToKLSAgICAgICAgICAgIGRlYnVnKCIgICBkb21haW4gJXMgaXMgbm90IGluIHVzZXIgYWxsb3ctbGlzdCIsIGRvbWFpbikKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgZG9tYWluICVzIGlzIG5vdCBpbiB1c2VyIGFsbG93LWxpc3QiLCBkb21haW4pCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKIAogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgZGVmIHBhdGhfcmV0dXJuX29rKHNlbGYsIHBhdGgsIHJlcXVlc3QpOgotICAgICAgICBkZWJ1ZygiLSBjaGVja2luZyBjb29raWUgcGF0aD0lcyIsIHBhdGgpCisgICAgICAgIF9kZWJ1ZygiLSBjaGVja2luZyBjb29raWUgcGF0aD0lcyIsIHBhdGgpCiAgICAgICAgIHJlcV9wYXRoID0gcmVxdWVzdF9wYXRoKHJlcXVlc3QpCiAgICAgICAgIGlmIG5vdCByZXFfcGF0aC5zdGFydHN3aXRoKHBhdGgpOgotICAgICAgICAgICAgZGVidWcoIiAgJXMgZG9lcyBub3QgcGF0aC1tYXRjaCAlcyIsIHJlcV9wYXRoLCBwYXRoKQorICAgICAgICAgICAgX2RlYnVnKCIgICVzIGRvZXMgbm90IHBhdGgtbWF0Y2ggJXMiLCByZXFfcGF0aCwgcGF0aCkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gVHJ1ZQogCkBAIC0xMjE1LDcgKzEyMjcsNyBAQAogICAgICAgICBjb29raWVzID0gW10KICAgICAgICAgaWYgbm90IHNlbGYuX3BvbGljeS5kb21haW5fcmV0dXJuX29rKGRvbWFpbiwgcmVxdWVzdCk6CiAgICAgICAgICAgICByZXR1cm4gW10KLSAgICAgICAgZGVidWcoIkNoZWNraW5nICVzIGZvciBjb29raWVzIHRvIHJldHVybiIsIGRvbWFpbikKKyAgICAgICAgX2RlYnVnKCJDaGVja2luZyAlcyBmb3IgY29va2llcyB0byByZXR1cm4iLCBkb21haW4pCiAgICAgICAgIGNvb2tpZXNfYnlfcGF0aCA9IHNlbGYuX2Nvb2tpZXNbZG9tYWluXQogICAgICAgICBmb3IgcGF0aCBpbiBjb29raWVzX2J5X3BhdGgua2V5cygpOgogICAgICAgICAgICAgaWYgbm90IHNlbGYuX3BvbGljeS5wYXRoX3JldHVybl9vayhwYXRoLCByZXF1ZXN0KToKQEAgLTEyMjMsOSArMTIzNSw5IEBACiAgICAgICAgICAgICBjb29raWVzX2J5X25hbWUgPSBjb29raWVzX2J5X3BhdGhbcGF0aF0KICAgICAgICAgICAgIGZvciBjb29raWUgaW4gY29va2llc19ieV9uYW1lLnZhbHVlcygpOgogICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9wb2xpY3kucmV0dXJuX29rKGNvb2tpZSwgcmVxdWVzdCk6Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBub3QgcmV0dXJuaW5nIGNvb2tpZSIpCisgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbm90IHJldHVybmluZyBjb29raWUiKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIGRlYnVnKCIgICBpdCdzIGEgbWF0Y2giKQorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgaXQncyBhIG1hdGNoIikKICAgICAgICAgICAgICAgICBjb29raWVzLmFwcGVuZChjb29raWUpCiAgICAgICAgIHJldHVybiBjb29raWVzCiAKQEAgLTEzMDIsNyArMTMxNCw3IEBACiAgICAgICAgIFRoZSBDb29raWUyIGhlYWRlciBpcyBhbHNvIGFkZGVkIHVubGVzcyBwb2xpY3kuaGlkZV9jb29raWUyIGlzIHRydWUuCiAKICAgICAgICAgIiIiCi0gICAgICAgIGRlYnVnKCJhZGRfY29va2llX2hlYWRlciIpCisgICAgICAgIF9kZWJ1ZygiYWRkX2Nvb2tpZV9oZWFkZXIiKQogICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCiAKICAgICAgICAgc2VsZi5fcG9saWN5Ll9ub3cgPSBzZWxmLl9ub3cgPSBpbnQodGltZS50aW1lKCkpCkBAIC0xMzc5LDcgKzEzOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIGlmIGsgPT0gImRvbWFpbiI6CiAgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCIgICBtaXNzaW5nIHZhbHVlIGZvciBkb21haW4gYXR0cmlidXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbWlzc2luZyB2YWx1ZSBmb3IgZG9tYWluIGF0dHJpYnV0ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICBiYWRfY29va2llID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgIyBSRkMgMjk2NSBzZWN0aW9uIDMuMy4zCkBAIC0xMzg5LDcgKzE0MDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIyBQcmVmZXIgbWF4LWFnZSB0byBleHBpcmVzIChsaWtlIE1vemlsbGEpCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgbWlzc2luZyBvciBpbnZhbGlkIHZhbHVlIGZvciBleHBpcmVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbWlzc2luZyBvciBpbnZhbGlkIHZhbHVlIGZvciBleHBpcmVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGU6IHRyZWF0aW5nIGFzIHNlc3Npb24gY29va2llIikKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgaWYgayA9PSAibWF4LWFnZSI6CkBAIC0xMzk3LDcgKzE0MDksNyBAQAogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gaW50KHYpCiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoIiAgIG1pc3Npbmcgb3IgaW52YWxpZCAobm9uLW51bWVyaWMpIHZhbHVlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIG1pc3Npbmcgb3IgaW52YWxpZCAobm9uLW51bWVyaWMpIHZhbHVlIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4LWFnZSBhdHRyaWJ1dGUiKQogICAgICAgICAgICAgICAgICAgICAgICAgYmFkX2Nvb2tpZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCkBAIC0xNDEwLDcgKzE0MjIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChrIGluIHZhbHVlX2F0dHJzKSBvciAoayBpbiBib29sZWFuX2F0dHJzKToKICAgICAgICAgICAgICAgICAgICAgaWYgKHYgaXMgTm9uZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIGsgbm90IGluICgicG9ydCIsICJjb21tZW50IiwgImNvbW1lbnR1cmwiKSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygiICAgbWlzc2luZyB2YWx1ZSBmb3IgJXMgYXR0cmlidXRlIiAlIGspCisgICAgICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIG1pc3NpbmcgdmFsdWUgZm9yICVzIGF0dHJpYnV0ZSIgJSBrKQogICAgICAgICAgICAgICAgICAgICAgICAgYmFkX2Nvb2tpZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkW2tdID0gdgpAQCAtMTQ5Niw4ICsxNTA4LDggQEAKICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyKGRvbWFpbiwgcGF0aCwgbmFtZSkKICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBkZWJ1ZygiRXhwaXJpbmcgY29va2llLCBkb21haW49JyVzJywgcGF0aD0nJXMnLCBuYW1lPSclcyciLAotICAgICAgICAgICAgICAgICAgZG9tYWluLCBwYXRoLCBuYW1lKQorICAgICAgICAgICAgX2RlYnVnKCJFeHBpcmluZyBjb29raWUsIGRvbWFpbj0nJXMnLCBwYXRoPSclcycsIG5hbWU9JyVzJyIsCisgICAgICAgICAgICAgICAgICAgZG9tYWluLCBwYXRoLCBuYW1lKQogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgICAgICByZXR1cm4gQ29va2llKHZlcnNpb24sCkBAIC0xNTUyLDggKzE1NjQsOCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBjb29raWVzID0gc2VsZi5fY29va2llc19mcm9tX2F0dHJzX3NldCgKICAgICAgICAgICAgICAgICBzcGxpdF9oZWFkZXJfd29yZHMocmZjMjk2NV9oZHJzKSwgcmVxdWVzdCkKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmVyYWlzZV91bm1hc2tlZF9leGNlcHRpb25zKCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIF93YXJuX3VuaGFuZGxlZF9leGNlcHRpb24oKQogICAgICAgICAgICAgY29va2llcyA9IFtdCiAKICAgICAgICAgaWYgbnNfaGRycyBhbmQgbmV0c2NhcGU6CkBAIC0xNTYxLDggKzE1NzMsOCBAQAogICAgICAgICAgICAgICAgICMgUkZDIDIxMDkgYW5kIE5ldHNjYXBlIGNvb2tpZXMKICAgICAgICAgICAgICAgICBuc19jb29raWVzID0gc2VsZi5fY29va2llc19mcm9tX2F0dHJzX3NldCgKICAgICAgICAgICAgICAgICAgICAgcGFyc2VfbnNfaGVhZGVycyhuc19oZHJzKSwgcmVxdWVzdCkKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICByZXJhaXNlX3VubWFza2VkX2V4Y2VwdGlvbnMoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uKCkKICAgICAgICAgICAgICAgICBuc19jb29raWVzID0gW10KICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NfcmZjMjEwOV9jb29raWVzKG5zX2Nvb2tpZXMpCiAKQEAgLTE2MTIsMTMgKzE2MjQsMTMgQEAKIAogICAgIGRlZiBleHRyYWN0X2Nvb2tpZXMoc2VsZiwgcmVzcG9uc2UsIHJlcXVlc3QpOgogICAgICAgICAiIiJFeHRyYWN0IGNvb2tpZXMgZnJvbSByZXNwb25zZSwgd2hlcmUgYWxsb3dhYmxlIGdpdmVuIHRoZSByZXF1ZXN0LiIiIgotICAgICAgICBkZWJ1ZygiZXh0cmFjdF9jb29raWVzOiAlcyIsIHJlc3BvbnNlLmluZm8oKSkKKyAgICAgICAgX2RlYnVnKCJleHRyYWN0X2Nvb2tpZXM6ICVzIiwgcmVzcG9uc2UuaW5mbygpKQogICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCiAgICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQogCiAgICAgICAgIGZvciBjb29raWUgaW4gc2VsZi5tYWtlX2Nvb2tpZXMocmVzcG9uc2UsIHJlcXVlc3QpOgogICAgICAgICAgICAgaWYgc2VsZi5fcG9saWN5LnNldF9vayhjb29raWUsIHJlcXVlc3QpOgotICAgICAgICAgICAgICAgIGRlYnVnKCIgc2V0dGluZyBjb29raWU6ICVzIiwgY29va2llKQorICAgICAgICAgICAgICAgIF9kZWJ1ZygiIHNldHRpbmcgY29va2llOiAlcyIsIGNvb2tpZSkKICAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQogICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX19pbml0X18ucHkgYi9MaWIvY3R5cGVzL19faW5pdF9fLnB5CmluZGV4IDI4YWMxODAuLmYyZGRiYWEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvX19pbml0X18ucHkKKysrIGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQpAQCAtMyw3ICszLDcgQEAKIGltcG9ydCBvcyBhcyBfb3MsIHN5cyBhcyBfc3lzCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4gYXMgX2NoYWluCiAKLV9fdmVyc2lvbl9fID0gIjAuOS45LjQiCitfX3ZlcnNpb25fXyA9ICIwLjkuOS42IgogCiBmcm9tIF9jdHlwZXMgaW1wb3J0IFVuaW9uLCBTdHJ1Y3R1cmUsIEFycmF5CiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9Qb2ludGVyCkBAIC0yMyw4ICsyMyw2IEBACiBmcm9tIF9jdHlwZXMgaW1wb3J0IEZVTkNGTEFHX0NERUNMIGFzIF9GVU5DRkxBR19DREVDTCwgXAogICAgICBGVU5DRkxBR19QWVRIT05BUEkgYXMgX0ZVTkNGTEFHX1BZVEhPTkFQSQogCi1mcm9tIGN0eXBlcy5fbG9hZGVyIGltcG9ydCBMaWJyYXJ5TG9hZGVyCi0KICIiIgogV0lOT0xFQVBJIC0+IEhSRVNVTFQKIFdJTk9MRUFQSV8odHlwZSkKQEAgLTcyLDkgKzcwLDExIEBACiAgICAgVGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBjYW4gYmUgY2FsbGVkIGluIHRocmVlIHdheXMgdG8gY3JlYXRlIGEKICAgICBjYWxsYWJsZSBvYmplY3Q6CiAKLSAgICBwcm90b3R5cGUoZnVuY3QpIC0gcmV0dXJucyBhIEMgY2FsbGFibGUgZnVuY3Rpb24gY2FsbGluZyBmdW5jdAotICAgIHByb3RvdHlwZSh2dGJsX2luZGV4LCBtZXRob2RfbmFtZVssIHBhcmFtZmxhZ3NdKSAtIGEgUHl0aG9uIGNhbGxhYmxlIHRoYXQgY2FsbHMgYSBDT00gbWV0aG9kCi0gICAgcHJvdG90eXBlKGZ1bmN0X25hbWUsIGRsbFssIHBhcmFtZmxhZ3NdKSAtIGEgUHl0aG9uIGNhbGxhYmxlIHRoYXQgY2FsbHMgYW4gZXhwb3J0ZWQgZnVuY3Rpb24gaW4gYSBkbGwKKyAgICBwcm90b3R5cGUoaW50ZWdlciBhZGRyZXNzKSAtPiBmb3JlaWduIGZ1bmN0aW9uCisgICAgcHJvdG90eXBlKGNhbGxhYmxlKSAtPiBjcmVhdGUgYW5kIHJldHVybiBhIEMgY2FsbGFibGUgZnVuY3Rpb24gZnJvbSBjYWxsYWJsZQorICAgIHByb3RvdHlwZShpbnRlZ2VyIGluZGV4LCBtZXRob2QgbmFtZVssIHBhcmFtZmxhZ3NdKSAtPiBmb3JlaWduIGZ1bmN0aW9uIGNhbGxpbmcgYSBDT00gbWV0aG9kCisgICAgcHJvdG90eXBlKChvcmRpbmFsIG51bWJlciwgZGxsIG9iamVjdClbLCBwYXJhbWZsYWdzXSkgLT4gZm9yZWlnbiBmdW5jdGlvbiBleHBvcnRlZCBieSBvcmRpbmFsCisgICAgcHJvdG90eXBlKChmdW5jdGlvbiBuYW1lLCBkbGwgb2JqZWN0KVssIHBhcmFtZmxhZ3NdKSAtPiBmb3JlaWduIGZ1bmN0aW9uIGV4cG9ydGVkIGJ5IG5hbWUKICAgICAiIiIKICAgICB0cnk6CiAgICAgICAgIHJldHVybiBfY19mdW5jdHlwZV9jYWNoZVsocmVzdHlwZSwgYXJndHlwZXMpXQpAQCAtMzUyLDYgKzM1MiwyMyBAQAogICAgICAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19TVERDQUxMCiAgICAgICAgICAgICBfcmVzdHlwZV8gPSBIUkVTVUxUCiAKK2NsYXNzIExpYnJhcnlMb2FkZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGxsdHlwZSk6CisgICAgICAgIHNlbGYuX2RsbHR5cGUgPSBkbGx0eXBlCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWVbMF0gPT0gJ18nOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKyAgICAgICAgZGxsID0gc2VsZi5fZGxsdHlwZShuYW1lKQorICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGRsbCkKKyAgICAgICAgcmV0dXJuIGRsbAorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBuYW1lKQorCisgICAgZGVmIExvYWRMaWJyYXJ5KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGxsdHlwZShuYW1lKQorCiBjZGxsID0gTGlicmFyeUxvYWRlcihDRExMKQogcHlkbGwgPSBMaWJyYXJ5TG9hZGVyKFB5RExMKQogCkBAIC00MDIsNyArNDE5LDEyIEBACiAgICAgICAgIF9yZXN0eXBlXyA9IHJlc3R5cGUKICAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19DREVDTCB8IF9GVU5DRkxBR19QWVRIT05BUEkKICAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQotY2FzdCA9IFBZRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgcHlfb2JqZWN0KShfY2FzdF9hZGRyKQorX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCkoX2Nhc3RfYWRkcikKKworZGVmIGNhc3Qob2JqLCB0eXApOgorICAgIHJlc3VsdCA9IF9jYXN0KG9iaiwgdHlwKQorICAgIHJlc3VsdC5fX2tlZXByZWYgPSBvYmoKKyAgICByZXR1cm4gcmVzdWx0CiAKIF9zdHJpbmdfYXQgPSBDRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF9zdHJpbmdfYXRfYWRkcikKIGRlZiBzdHJpbmdfYXQocHRyLCBzaXplPTApOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9fbG9hZGVyLnB5IGIvTGliL2N0eXBlcy9fbG9hZGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQ4YzFjLi4wMDAwMDAwCi0tLSBhL0xpYi9jdHlwZXMvX2xvYWRlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi1pbXBvcnQgc3lzLCBvcwotaW1wb3J0IGN0eXBlcwotCi1pZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKLSAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IExvYWRMaWJyYXJ5IGFzIGRsb3BlbgotZWxzZToKLSAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IGRsb3BlbgotZnJvbSBfY3R5cGVzIGltcG9ydCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAotCi0jIF9maW5kTGliKG5hbWUpIHJldHVybnMgYW4gaXRlcmFibGUgb2YgcG9zc2libGUgbmFtZXMgZm9yIGEgbGlicmFyeS4KLWlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgotICAgIGRlZiBfZmluZExpYihuYW1lKToKLSAgICAgICAgcmV0dXJuIFtuYW1lXQotCi1pZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKLSAgICBmcm9tIGN0eXBlcy5tYWNob2xpYi5keWxkIGltcG9ydCBkeWxkX2ZpbmQgYXMgX2R5bGRfZmluZAotICAgIGRlZiBfZmluZExpYihuYW1lKToKLSAgICAgICAgcG9zc2libGUgPSBbJ2xpYiVzLmR5bGliJyAlIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICclcy5keWxpYicgJSBuYW1lLAotICAgICAgICAgICAgICAgICAgICAnJXMuZnJhbWV3b3JrLyVzJyAlIChuYW1lLCBuYW1lKV0KLSAgICAgICAgZm9yIG5hbWUgaW4gcG9zc2libGU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtfZHlsZF9maW5kKG5hbWUpXQotICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgcmV0dXJuIFtdCi0KLWVsaWYgb3MubmFtZSA9PSAicG9zaXgiOgotICAgICMgQW5kcmVhcyBEZWdlcnQncyBmaW5kIGZ1bmN0aW9ucywgdXNpbmcgZ2NjLCAvc2Jpbi9sZGNvbmZpZywgb2JqZHVtcAotICAgIGltcG9ydCByZSwgdGVtcGZpbGUKLQotICAgIGRlZiBfZmluZExpYl9nY2MobmFtZSk6Ci0gICAgICAgIGV4cHIgPSAnW15cKFwpXHNdKmxpYiVzXC5bXlwoXClcc10qJyAlIG5hbWUKLSAgICAgICAgY21kID0gJ2lmIHR5cGUgZ2NjICY+L2Rldi9udWxsOyB0aGVuIENDPWdjYzsgZWxzZSBDQz1jYzsgZmk7JyBcCi0gICAgICAgICAgICAgICckQ0MgLVdsLC10IC1vIC9kZXYvbnVsbCAyPiYxIC1sJyArIG5hbWUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmRvdXQsIG91dGZpbGUgPSAgdGVtcGZpbGUubWtzdGVtcCgpCi0gICAgICAgICAgICBmZCA9IG9zLnBvcGVuKGNtZCkKLSAgICAgICAgICAgIHRyYWNlID0gZmQucmVhZCgpCi0gICAgICAgICAgICBlcnIgPSBmZC5jbG9zZSgpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MudW5saW5rKG91dGZpbGUpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKLSAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIHRyYWNlKQotICAgICAgICBpZiBub3QgcmVzOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgwKQotCi0gICAgZGVmIF9maW5kTGliX2xkKG5hbWUpOgotICAgICAgICBleHByID0gJy9bXlwoXClcc10qbGliJXNcLlteXChcKVxzXSonICUgbmFtZQotICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgb3MucG9wZW4oJy9zYmluL2xkY29uZmlnIC1wIDI+L2Rldi9udWxsJykucmVhZCgpKQotICAgICAgICBpZiBub3QgcmVzOgotICAgICAgICAgICAgY21kID0gJ2xkZCAlcyAyPi9kZXYvbnVsbCcgJSBzeXMuZXhlY3V0YWJsZQotICAgICAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIG9zLnBvcGVuKGNtZCkucmVhZCgpKQotICAgICAgICAgICAgaWYgbm90IHJlczoKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gcmVzLmdyb3VwKDApCi0KLSAgICBkZWYgX2dldF9zb25hbWUoZik6Ci0gICAgICAgIGNtZCA9ICJvYmpkdW1wIC1wIC1qIC5keW5hbWljIDI+L2Rldi9udWxsICIgKyBmCi0gICAgICAgIHJlcyA9IHJlLnNlYXJjaChyJ1xzU09OQU1FXHMrKFteXHNdKyknLCBvcy5wb3BlbihjbWQpLnJlYWQoKSkKLSAgICAgICAgaWYgbm90IHJlczoKLSAgICAgICAgICAgIHJldHVybiBmCi0gICAgICAgIHJldHVybiByZXMuZ3JvdXAoMSkKLQotICAgIGRlZiBfZmluZExpYihuYW1lKToKLSAgICAgICAgbGliID0gX2ZpbmRMaWJfbGQobmFtZSkKLSAgICAgICAgaWYgbm90IGxpYjoKLSAgICAgICAgICAgIGxpYiA9IF9maW5kTGliX2djYyhuYW1lKQotICAgICAgICAgICAgaWYgbm90IGxpYjoKLSAgICAgICAgICAgICAgICByZXR1cm4gW25hbWVdCi0gICAgICAgIHJldHVybiBbX2dldF9zb25hbWUobGliKV0KLQotY2xhc3MgTGlicmFyeUxvYWRlcihvYmplY3QpOgotICAgICIiIkxvYWRlciBmb3Igc2hhcmVkIGxpYnJhcmllcy4KLQotICAgIFNoYXJlZCBsaWJyYXJpZXMgYXJlIGFjY2Vzc2VkIHdoZW4gY29tcGlsaW5nL2xpbmtpbmcgYSBwcm9ncmFtLAotICAgIGFuZCB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4gIFRoZSBwdXJwb3NlIG9mIHRoZSAnZmluZCcgbWV0aG9kIGlzCi0gICAgdG8gbG9jYXRlIGEgbGlicmFyeSBzaW1pbGFyIHRvIHdoYXQgdGhlIGNvbXBpbGVyIGRvZXMgKG9uIG1hY2hpbmVzCi0gICAgd2l0aCBzZXZlcmFsIHZlcnNpb25zIG9mIGEgc2hhcmVkIGxpYnJhcnkgdGhlIG1vc3QgcmVjZW50IHNob3VsZAotICAgIGJlIGxvYWRlZCksIHdoaWxlICdsb2FkJyBhY3RzIGxpa2Ugd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4sIGFuZAotICAgIHVzZXMgdGhlIHJ1bnRpbWUgbG9hZGVyIGRpcmVjdGx5LiAgJ2xvYWRfdmVyc2lvbicgd29ya3MgbGlrZQotICAgICdsb2FkJyBidXQgdHJpZXMgdG8gYmUgcGxhdGZvcm0gaW5kZXBlbmRlbmQgKGZvciBjYXNlcyB3aGVyZSB0aGlzCi0gICAgbWFrZXMgc2Vuc2UpLiAgTG9hZGluZyB2aWEgYXR0cmlidXRlIGFjY2VzcyBpcyBhIHNob3J0aGFuZAotICAgIG5vdGF0aW9uIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBpbnRlcmFjdGl2ZSB1c2UuIiIiCi0KLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkbGx0eXBlLCBtb2RlPVJUTERfTE9DQUwpOgotICAgICAgICAiIiJDcmVhdGUgYSBsaWJyYXJ5IGxvYWRlciBpbnN0YW5jZSB3aGljaCBsb2FkcyBsaWJyYXJpZXMgYnkKLSAgICAgICAgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgJ2RsbHR5cGUnLiAgJ21vZGUnIGNhbiBiZSBSVExEX0xPQ0FMCi0gICAgICAgIG9yIFJUTERfR0xPQkFMLCBpdCBpcyBpZ25vcmVkIG9uIFdpbmRvd3MuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLl9kbGx0eXBlID0gZGxsdHlwZQotICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQotCi0gICAgZGVmIGxvYWQoc2VsZiwgbGlibmFtZSwgbW9kZT1Ob25lKToKLSAgICAgICAgIiIiTG9hZCBhbmQgcmV0dXJuIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIGxpYm5hbWUuICBPbgotICAgICAgICBtb3N0IHN5c3RlbXMgJ2xpYm5hbWUnIGlzIHRoZSBmaWxlbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnk7Ci0gICAgICAgIHdoZW4gaXQncyBub3QgYSBwYXRobmFtZSBpdCB3aWxsIGJlIHNlYXJjaGVkIGluIGEgc3lzdGVtCi0gICAgICAgIGRlcGVuZGVuZCBsaXN0IG9mIGxvY2F0aW9ucyAob24gbWFueSBzeXN0ZW1zIGFkZGl0aW9uYWwgc2VhcmNoCi0gICAgICAgIHBhdGhzIGNhbiBiZSBzcGVjaWZpZWQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUpLiAgU29tZXRpbWVzCi0gICAgICAgIHRoZSBleHRlbnNpb24gKGxpa2UgJy5kbGwnIG9uIFdpbmRvd3MpIGNhbiBiZSBvbWl0dGVkLgotCi0gICAgICAgICdtb2RlJyBhbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmxhZ3Mgc3BlY2lmaWVkIGluIHRoZQotICAgICAgICBjb25zdHJ1Y3RvciwgaXQgaXMgaWdub3JlZCBvbiBXaW5kb3dzLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgbW9kZSBpcyBOb25lOgotICAgICAgICAgICAgbW9kZSA9IHNlbGYuX21vZGUKLSAgICAgICAgcmV0dXJuIHNlbGYuX2xvYWQobGlibmFtZSwgbW9kZSkKLQotICAgIGRlZiBsb2FkX2xpYnJhcnkoc2VsZiwgbGlibmFtZSwgbW9kZT1Ob25lKToKLSAgICAgICAgIiIiTG9hZCBhbmQgcmV0dXJuIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIGxpYm5hbWUuICBUaGlzCi0gICAgICAgIG1ldGhvZCBwYXNzZXMgdGhlIHNwZWNpZmllZCAnbGlibmFtZScgZGlyZWN0bHkgdG8gdGhlCi0gICAgICAgIHBsYXRmb3JtJ3MgbGlicmFyeSBsb2FkaW5nIGZ1bmN0aW9uIChkbG9wZW4sIG9yIExvYWRMaWJyYXJ5KS4KLQotICAgICAgICAnbW9kZScgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZsYWdzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAgICAgY29uc3RydWN0b3IsIGl0IGlzIGlnbm9yZWQgb24gV2luZG93cy4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIG1vZGUgaXMgTm9uZToKLSAgICAgICAgICAgIG1vZGUgPSBzZWxmLl9tb2RlCi0gICAgICAgIHJldHVybiBzZWxmLl9kbGx0eXBlKGxpYm5hbWUsIG1vZGUpCi0KLSAgICAjIGFsaWFzIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxpdHkKLSAgICBMb2FkTGlicmFyeSA9IGxvYWRfbGlicmFyeQotCi0gICAgIyBIZWxwZXJzIGZvciBsb2FkIGFuZCBsb2FkX3ZlcnNpb24gLSBhc3NlbWJsZXMgYSBmaWxlbmFtZSBmcm9tIG5hbWUgYW5kIGZpbGVuYW1lCi0gICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6Ci0gICAgICAgICMgV2luZG93cyAoWFhYIHdoYXQgYWJvdXQgY3lnd2luPykKLSAgICAgICAgZGVmIF9wbGF0X2xvYWRfdmVyc2lvbihzZWxmLCBuYW1lLCB2ZXJzaW9uLCBtb2RlKToKLSAgICAgICAgICAgICMgbm90IHN1cmUgaWYgdGhpcyBtYWtlcyBzZW5zZQotICAgICAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkKG5hbWUgKyB2ZXJzaW9uLCBtb2RlKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZChuYW1lLCBtb2RlKQotCi0gICAgICAgIF9sb2FkID0gbG9hZF9saWJyYXJ5Ci0KLSAgICBlbGlmIG9zLm5hbWUgPT0gInBvc2l4IiBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotICAgICAgICAjIE1hYyBPUyBYCi0gICAgICAgIGRlZiBfcGxhdF9sb2FkX3ZlcnNpb24oc2VsZiwgbmFtZSwgdmVyc2lvbiwgbW9kZSk6Ci0gICAgICAgICAgICBpZiB2ZXJzaW9uOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWQoImxpYiVzLiVzLmR5bGliIiAlIChuYW1lLCB2ZXJzaW9uKSwgbW9kZSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWQoImxpYiVzLmR5bGliIiAlIG5hbWUsIG1vZGUpCi0KLSAgICAgICAgZGVmIF9sb2FkKHNlbGYsIGxpYm5hbWUsIG1vZGUpOgotICAgICAgICAgICAgIyBfZHlsZF9maW5kIHJhaXNlcyBWYWx1ZUVycm9yLCBjb252ZXJ0IHRoaXMgaW50byBPU0Vycm9yCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBfZHlsZF9maW5kKGxpYm5hbWUpCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSBPU0Vycm9yKCJMaWJyYXJ5ICVzIGNvdWxkIG5vdCBiZSBmb3VuZCIgJSBsaWJuYW1lKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZF9saWJyYXJ5KHBhdGhuYW1lLCBtb2RlKQotCi0gICAgZWxpZiBvcy5uYW1lID09ICJwb3NpeCI6Ci0gICAgICAgICMgUG9zaXgKLSAgICAgICAgZGVmIF9wbGF0X2xvYWRfdmVyc2lvbihzZWxmLCBuYW1lLCB2ZXJzaW9uLCBtb2RlKToKLSAgICAgICAgICAgIGlmIHZlcnNpb246Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZCgibGliJXMuc28uJXMiICUgKG5hbWUsIHZlcnNpb24pLCBtb2RlKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZCgibGliJXMuc28iICUgbmFtZSwgbW9kZSkKLQotICAgICAgICBfbG9hZCA9IGxvYWRfbGlicmFyeQotCi0gICAgZWxzZToKLSAgICAgICAgIyBPdGhlcnMsIFRCRAotICAgICAgICBkZWYgX3BsYXRfbG9hZF92ZXJzaW9uKHNlbGYsIG5hbWUsIHZlcnNpb24sIG1vZGU9Tm9uZSk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkKG5hbWUsIG1vZGUpCi0KLSAgICAgICAgX2xvYWQgPSBsb2FkX2xpYnJhcnkKLQotICAgIGRlZiBsb2FkX3ZlcnNpb24oc2VsZiwgbmFtZSwgdmVyc2lvbj1Ob25lLCBtb2RlPU5vbmUpOgotICAgICAgICAiIiJCdWlsZCBhIChzeXN0ZW0gZGVwZW5kZW5kKSBmaWxlbmFtZSBmcm9tICduYW1lJyBhbmQKLSAgICAgICAgJ3ZlcnNpb24nLCB0aGVuIGxvYWQgYW5kIHJldHVybiBpdC4gICduYW1lJyBpcyB0aGUgbGlicmFyeQotICAgICAgICBuYW1lIHdpdGhvdXQgYW55IHByZWZpeCBsaWtlICdsaWInIGFuZCBzdWZmaXggbGlrZSAnLnNvJyBvcgotICAgICAgICAnLmR5bGliJy4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGlmIGEgbGlicmFyeSBpcwotICAgICAgICBhdmFpbGFibGUgb24gZGlmZmVyZW50IHBsYXRmb3JtcywgdXNpbmcgdGhlIHBhcnRpY3VsYXIgbmFtaW5nCi0gICAgICAgIGNvbnZlbnRpb24gb2YgZWFjaCBwbGF0Zm9ybS4KLQotICAgICAgICAnbW9kZScgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGZsYWdzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAgICAgY29uc3RydWN0b3IsIGl0IGlzIGlnbm9yZWQgb24gV2luZG93cy4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmLl9wbGF0X2xvYWRfdmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBtb2RlKQotCi0gICAgZGVmIGZpbmQoc2VsZiwgbmFtZSwgbW9kZT1Ob25lKToKLSAgICAgICAgIiIiVHJ5IHRvIGZpbmQgYSBsaWJyYXJ5LCBsb2FkIGFuZCByZXR1cm4gaXQuICAnbmFtZScgaXMgdGhlCi0gICAgICAgIGxpYnJhcnkgbmFtZSB3aXRob3V0IGFueSBwcmVmaXggbGlrZSAnbGliJywgc3VmZml4IGxpa2UgJy5zbycsCi0gICAgICAgICcuZHlsaWInIG9yIHZlcnNpb24gbnVtYmVyICh0aGlzIGlzIHRoZSBmb3JtIHVzZWQgZm9yIHRoZQotICAgICAgICBwb3NpeCBsaW5rZXIgb3B0aW9uICctbCcpLgotCi0gICAgICAgICdtb2RlJyBhbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZmxhZ3Mgc3BlY2lmaWVkIGluIHRoZQotICAgICAgICBjb25zdHJ1Y3RvciwgaXQgaXMgaWdub3JlZCBvbiBXaW5kb3dzLgotCi0gICAgICAgIE9uIHdpbmRvd3MsIHRoaXMgbWV0aG9kIGRvZXMgdGhlIHNhbWUgYXMgdGhlICdsb2FkJyBtZXRob2QuCi0KLSAgICAgICAgT24gb3RoZXIgcGxhdGZvcm1zLCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGNhbGwgb3RoZXIgcHJvZ3JhbXMKLSAgICAgICAgbGlrZSB0aGUgY29tcGlsZXIgdG8gZmluZCB0aGUgbGlicmFyeS4gIFdoZW4gdXNpbmcgY3R5cGVzIHRvCi0gICAgICAgIHdyaXRlIGEgc2hhcmVkIGxpYnJhcnkgd3JhcHBpbmcsIGNvbnNpZGVyIHVzaW5nIC5sb2FkKCkgb3IKLSAgICAgICAgLmxvYWRfdmVyc2lvbigpIGluc3RlYWQuCi0gICAgICAgICIiIgotICAgICAgICBmb3IgbGlibmFtZSBpbiBfZmluZExpYihuYW1lKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkKGxpYm5hbWUsIG1vZGUpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICByYWlzZSBPU0Vycm9yKCJMaWJyYXJ5ICVyIG5vdCBmb3VuZCIgJSBuYW1lKQotCi0gICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgotICAgICAgICAiIiJMb2FkIGEgbGlicmFyeSB2aWEgYXR0cmlidXRlIGFjY2Vzcy4gIENhbGxzCi0gICAgICAgIC5sb2FkX3ZlcnNpb24oKS4gIFRoZSByZXN1bHQgaXMgY2FjaGVkLiIiIgotICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoIl8iKToKLSAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCi0gICAgICAgIGRsbCA9IHNlbGYubG9hZF92ZXJzaW9uKG5hbWUpCi0gICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgZGxsKQotICAgICAgICByZXR1cm4gZGxsCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgdGVzdCBjb2RlCi0KLWNsYXNzIENETEwob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZSk6Ci0gICAgICAgIHNlbGYuX2hhbmRsZSA9IGRsb3BlbihuYW1lLCBtb2RlKQotICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gIjwlcyAnJXMnLCBoYW5kbGUgJXggYXQgJXg+IiAlIFwKLSAgICAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fbmFtZSwKLSAgICAgICAgICAgICAgICAoc2VsZi5faGFuZGxlICYgKHN5cy5tYXhpbnQqMiArIDEpKSwKLSAgICAgICAgICAgICAgICBpZChzZWxmKSkKLQotY2RsbCA9IExpYnJhcnlMb2FkZXIoQ0RMTCkKLQotZGVmIHRlc3QoKToKLSAgICBpZiBvcy5uYW1lID09ICJudCI6Ci0gICAgICAgIHByaW50IGNkbGwubXN2Y3J0Ci0gICAgICAgIHByaW50IGNkbGwubG9hZCgibXN2Y3J0IikKLSAgICAgICAgIyBsb2FkX3ZlcnNpb24gbG9va3MgbW9yZSBsaWtlIGFuIGFydGVmYWN0OgotICAgICAgICBwcmludCBjZGxsLmxvYWRfdmVyc2lvbigibXN2Y3IiLCAidCIpCi0gICAgICAgIHByaW50IGNkbGwuZmluZCgibXN2Y3J0IikKLQotICAgIGlmIG9zLm5hbWUgPT0gInBvc2l4IjoKLSAgICAgICAgIyBmaW5kIGFuZCBsb2FkX3ZlcnNpb24KLSAgICAgICAgcHJpbnQgY2RsbC5maW5kKCJtIikKLSAgICAgICAgcHJpbnQgY2RsbC5maW5kKCJjIikKLSAgICAgICAgcHJpbnQgY2RsbC5sb2FkX3ZlcnNpb24oImNyeXB0byIsICIwLjkuNyIpCi0KLSAgICAgICAgIyBnZXRhdHRyCi0gICAgICAgIHByaW50IGNkbGwubQotICAgICAgICBwcmludCBjZGxsLmJ6MgotCi0gICAgICAgICMgbG9hZAotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6Ci0gICAgICAgICAgICBwcmludCBjZGxsLmxvYWQoImxpYm0uZHlsaWIiKQotICAgICAgICAgICAgcHJpbnQgY2RsbC5sb2FkKCJsaWJjcnlwdG8uZHlsaWIiKQotICAgICAgICAgICAgcHJpbnQgY2RsbC5sb2FkKCJsaWJTeXN0ZW0uZHlsaWIiKQotICAgICAgICAgICAgcHJpbnQgY2RsbC5sb2FkKCJTeXN0ZW0uZnJhbWV3b3JrL1N5c3RlbSIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCBjZGxsLmxvYWQoImxpYm0uc28iKQotICAgICAgICAgICAgcHJpbnQgY2RsbC5sb2FkKCJsaWJjcnlwdC5zbyIpCi0gICAgICAgICAgICBwcmludCBjZGxsLmZpbmQoImNyeXB0IikKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQppbmRleCA1NGVhODM5Li45MmM0NjY5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CkBAIC0yNCw3ICsyNCw3IEBACiAgICAgICAgICAgICAgICAgKCJSIiwgY19zaG9ydCwgNiksCiAgICAgICAgICAgICAgICAgKCJTIiwgY19zaG9ydCwgNyldCiAKLWZ1bmMgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS51bnBhY2tfYml0ZmllbGRzCitmdW5jID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLnVucGFja19iaXRmaWVsZHMKIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKEJJVFMpLCBjX2NoYXIKIAogIyNmb3IgbiBpbiAiQUJDREVGR0hJTU5PUFFSUyI6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CmluZGV4IGQwYWRhNDAuLjFmNjg5OTIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CkBAIC0xNSw3ICsxNSw3IEBACiAKIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBYX3Rlc3Qoc2VsZik6Ci0gICAgICAgIHByaW50IHN5cy5ieXRlb3JkZXIKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIHN5cy5ieXRlb3JkZXIKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIpOgogICAgICAgICAgICAgYml0cyA9IEJJVFMoKQogICAgICAgICAgICAgc2V0YXR0cihiaXRzLCAiaSVzIiAlIGksIDEpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKaW5kZXggYTZlZTE1MC4uOWQ5NmE1NCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQpAQCAtMTE1LDcgKzExNSw3IEBACiAKICAgICBkZWYgdGVzdF9pbnRlZ3JhdGUoc2VsZik6CiAgICAgICAgICMgRGVyaXZlZCBmcm9tIHNvbWUgdGhlbiBub24td29ya2luZyBjb2RlLCBwb3N0ZWQgYnkgRGF2aWQgRm9zdGVyCi0gICAgICAgIGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogCiAgICAgICAgICMgVGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBjYWxsZWQgYnkgJ2ludGVncmF0ZSc6IGRvdWJsZSBmdW5jKGRvdWJsZSk7CiAgICAgICAgIENBTExCQUNLID0gQ0ZVTkNUWVBFKGNfZG91YmxlLCBjX2RvdWJsZSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CmluZGV4IDZmMjVmZWIuLjgyMWNlM2YgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtMjMsMzMgKzIzLDI0IEBACiAgICAgZGVmIHRlc3RfYWRkcmVzczJwb2ludGVyKHNlbGYpOgogICAgICAgICBhcnJheSA9IChjX2ludCAqIDMpKDQyLCAxNywgMikKIAotICAgICAgICAjIG9uIEFNRDY0LCBzaXplb2YoaW50KSA9PSA0IGFuZCBzaXplb2Yodm9pZCAqKSA9PSA4LgotICAgICAgICAjIEJ5IGRlZmF1bHQsIGNhc3Qgd291bGQgY29udmVydCBhIFB5dGhvbiBpbnQgKG9yIGxvbmcpIGludG8KLSAgICAgICAgIyBhIEMgaW50LCB3aGljaCB3b3VsZCBiZSB0b28gc2hvcnQgdG8gcmVwcmVzZW50IGEgcG9pbnRlcgotICAgICAgICAjIG9uIHRoaXMgcGxhdGZvcm0uCi0KLSAgICAgICAgIyBTbyB3ZSBoYXZlIHRvIHdyYXAgdGhlIGFkZHJlc3MgaW50byBhIGNfdm9pZF9wIGZvciB0aGlzIHRvIHdvcmsuCi0gICAgICAgICMKLSAgICAgICAgIyBYWFggQmV0dGVyIHdvdWxkIGJlIHRvIGhpZGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBjYXN0IGZ1bmN0aW9uLgogICAgICAgICBhZGRyZXNzID0gYWRkcmVzc29mKGFycmF5KQogICAgICAgICBwdHIgPSBjYXN0KGNfdm9pZF9wKGFkZHJlc3MpLCBQT0lOVEVSKGNfaW50KSkKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQogCisgICAgICAgIHB0ciA9IGNhc3QoYWRkcmVzcywgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKwogCiAgICAgZGVmIHRlc3RfcHRyMmFycmF5KHNlbGYpOgogICAgICAgICBhcnJheSA9IChjX2ludCAqIDMpKDQyLCAxNywgMikKIAotIyMgICAgICAgICMgSG0sIGFscmVhZHkgdGVzdGVkIGFib3ZlLgotIyMgICAgICAgIHB0ciA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19pbnQpKQotIyMgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGdldHJlZmNvdW50CiAKLSMgICAgICAgIHByaW50IGNhc3QoYWRkcmVzc29mKGFycmF5KSwgY19pbnQgKiAzKVs6XQotIyMgICAgICAgIHB0ciA9IGNhc3QoYWRkcmVzc29mKHB0cikKLQotIyMgICAgICAgIHByaW50IHB0clswXSwgcHRyWzFdLCBwdHJbMl0KLSMjICAgICAgICBwdHIgPSBQT0lOVEVSKGNfaW50KS5mcm9tX2FkZHJlc3MoYWRkcmVzc29mKGFycmF5KSkKLSMjICAgICAgICAjIFhYWCB0aGlzIGNyYXNoZXM6Ci0jIyAgICAgICAgcHJpbnQgcHRyWzBdLCBwdHJbMV0sIHB0clsyXQorICAgICAgICBiZWZvcmUgPSBnZXRyZWZjb3VudChhcnJheSkKKyAgICAgICAgcHRyID0gY2FzdChhcnJheSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdldHJlZmNvdW50KGFycmF5KSwgYmVmb3JlICsgMSkKKyAgICAgICAgZGVsIHB0cgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnZXRyZWZjb3VudChhcnJheSksIGJlZm9yZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQppbmRleCA2ZTA3OThkLi45ZDhkYjFmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CkBAIC03LDcgKzcsNyBAQAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCiBjbGFzcyBDRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBfZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICBfZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKICAgICBkZWYgUyhzZWxmKToKICAgICAgICAgcmV0dXJuIGNfbG9uZ2xvbmcuaW5fZGxsKHNlbGYuX2RsbCwgImxhc3RfdGZfYXJnX3MiKS52YWx1ZQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQppbmRleCAzNDRkMGJjLi5lMDU1YzQ5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQpAQCAtMTQsNyArMTQsNyBAQAogICAgIGRlZiB0ZXN0X2NoZWNrcmV0dmFsKHNlbGYpOgogCiAgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKLSAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCiAKICAgICAgICAgZGxsLl90ZXN0ZnVuY19wX3AucmVzdHlwZSA9IENIRUNLRUQKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDQ2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CkBAIC0wLDAgKzEsMTA0IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcywgc3lzCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Citmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBpc19yZXNvdXJjZV9lbmFibGVkCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgIGxpYl9nbCA9IGZpbmRfbGlicmFyeSgiT3BlbkdMMzIiKQorICAgIGxpYl9nbHUgPSBmaW5kX2xpYnJhcnkoIkdsdTMyIikKKyAgICBsaWJfZ2x1dCA9IGZpbmRfbGlicmFyeSgiZ2x1dDMyIikKKyAgICBsaWJfZ2xlID0gTm9uZQorZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgbGliX2dsID0gbGliX2dsdSA9IGZpbmRfbGlicmFyeSgiT3BlbkdMIikKKyAgICBsaWJfZ2x1dCA9IGZpbmRfbGlicmFyeSgiR0xVVCIpCisgICAgbGliX2dsZSA9IE5vbmUKK2Vsc2U6CisgICAgbGliX2dsID0gZmluZF9saWJyYXJ5KCJHTCIpCisgICAgbGliX2dsdSA9IGZpbmRfbGlicmFyeSgiR0xVIikKKyAgICBsaWJfZ2x1dCA9IGZpbmRfbGlicmFyeSgiZ2x1dCIpCisgICAgbGliX2dsZSA9IGZpbmRfbGlicmFyeSgiZ2xlIikKKworIyMgcHJpbnQsIGZvciBkZWJ1Z2dpbmcKK2lmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CisgICAgaWYgbGliX2dsIG9yIGxpYl9nbHUgb3IgbGliX2dsdXQgb3IgbGliX2dsZToKKyAgICAgICAgcHJpbnQgIk9wZW5HTCBsaWJyYXJpZXM6IgorICAgICAgICBmb3IgaXRlbSBpbiAoKCJHTCIsIGxpYl9nbCksCisgICAgICAgICAgICAgICAgICAgICAoIkdMVSIsIGxpYl9nbHUpLAorICAgICAgICAgICAgICAgICAgICAgKCJnbHV0IiwgbGliX2dsdXQpLAorICAgICAgICAgICAgICAgICAgICAgKCJnbGUiLCBsaWJfZ2xlKSk6CisgICAgICAgICAgICBwcmludCAiXHQiLCBpdGVtCisKKworIyBPbiBzb21lIHN5c3RlbXMsIGxvYWRpbmcgdGhlIE9wZW5HTCBsaWJyYXJpZXMgbmVlZHMgdGhlIFJUTERfR0xPQkFMIG1vZGUuCitjbGFzcyBUZXN0X09wZW5HTF9saWJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZ2wgPSBzZWxmLmdsdSA9IHNlbGYuZ2xlID0gc2VsZi5nbHV0ID0gTm9uZQorICAgICAgICBpZiBsaWJfZ2w6CisgICAgICAgICAgICBzZWxmLmdsID0gQ0RMTChsaWJfZ2wsIG1vZGU9UlRMRF9HTE9CQUwpCisgICAgICAgIGlmIGxpYl9nbHU6CisgICAgICAgICAgICBzZWxmLmdsdSA9IENETEwobGliX2dsdSwgUlRMRF9HTE9CQUwpCisgICAgICAgIGlmIGxpYl9nbHV0OgorICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMsIGFkZGl0aW9uYWwgbGlicmFyaWVzIHNlZW0gdG8gYmUKKyAgICAgICAgICAgICMgcmVxdWlyZWQsIGxvYWRpbmcgZ2x1dCBmYWlscyB3aXRoCisgICAgICAgICAgICAjICJPU0Vycm9yOiAvdXNyL2xpYi9saWJnbHV0LnNvLjM6IHVuZGVmaW5lZCBzeW1ib2w6IFhHZXRFeHRlbnNpb25WZXJzaW9uIgorICAgICAgICAgICAgIyBJIGNhbm5vdCBmaWd1cmUgb3V0IGhvdyB0byByZXBhaXIgdGhlIHRlc3Qgb24gdGhlc2UKKyAgICAgICAgICAgICMgc3lzdGVtcyAocmVkIGhhdCksIHNvIHdlIGlnbm9yZSBpdCB3aGVuIHRoZSBnbHV0IG9yIGdsZQorICAgICAgICAgICAgIyBsaWJyYXJpZXMgY2Fubm90IGJlIGxvYWRlZC4gIFNlZSBhbHNvOgorICAgICAgICAgICAgIyBodHRwczovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhdGlkPTEwNTQ3MCZhaWQ9MTQ3ODI1MyZncm91cF9pZD01NDcwCisgICAgICAgICAgICAjIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwNi1NYXkvMDY0Nzg5Lmh0bWwKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmdsdXQgPSBDRExMKGxpYl9nbHV0KQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBsaWJfZ2xlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZ2xlID0gQ0RMTChsaWJfZ2xlKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgaWYgbGliX2dsOgorICAgICAgICBkZWYgdGVzdF9nbChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuZ2w6CisgICAgICAgICAgICAgICAgc2VsZi5nbC5nbENsZWFySW5kZXgKKworICAgIGlmIGxpYl9nbHU6CisgICAgICAgIGRlZiB0ZXN0X2dsdShzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuZ2x1OgorICAgICAgICAgICAgICAgIHNlbGYuZ2x1LmdsdUJlZ2luQ3VydmUKKworICAgIGlmIGxpYl9nbHV0OgorICAgICAgICBkZWYgdGVzdF9nbHV0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5nbHV0OgorICAgICAgICAgICAgICAgIHNlbGYuZ2x1dC5nbHV0V2lyZVRldHJhaGVkcm9uCisKKyAgICBpZiBsaWJfZ2xlOgorICAgICAgICBkZWYgdGVzdF9nbGUoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmdsZToKKyAgICAgICAgICAgICAgICBzZWxmLmdsZS5nbGVHZXRKb2luU3R5bGUKKworIyNpZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSAhPSAiZGFyd2luIjoKKworIyMgICAgIyBPbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgc3VmZml4IGlzICcuc28nLAorIyMgICAgIyBhdCBsZWFzdCBzb21lIGxpYnJhcmllcyBjYW4gYmUgbG9hZGVkIGFzIGF0dHJpYnV0ZXMgb2YgdGhlIGNkbGwKKyMjICAgICMgb2JqZWN0LCBzaW5jZSBjdHlwZXMgbm93IHRyaWVzIGxvYWRpbmcgdGhlIGxpYiBhZ2FpbgorIyMgICAgIyB3aXRoICcuc28nIGFwcGVuZGVkIG9mIHRoZSBmaXJzdCB0cnkgZmFpbHMuCisjIyAgICAjCisjIyAgICAjIFdvbid0IHdvcmsgZm9yIGxpYmMsIHVuZm9ydHVuYXRlbHkuICBPVE9ILCBpdCBpc24ndAorIyMgICAgIyBuZWVkZWQgZm9yIGxpYmMgc2luY2UgdGhpcyBpcyBhbHJlYWR5IG1hcHBlZCBpbnRvIHRoZSBjdXJyZW50CisjIyAgICAjIHByb2Nlc3MgKD8pCisjIyAgICAjCisjIyAgICAjIE9uIE1BQyBPU1gsIGl0IHdvbid0IHdvcmsgZWl0aGVyLCBiZWNhdXNlIGRsb3BlbigpIG5lZWRzIGEgZnVsbCBwYXRoLAorIyMgICAgIyBhbmQgdGhlIGRlZmF1bHQgc3VmZml4IGlzIGVpdGhlciBub25lIG9yICcuZHlsaWInLgorCisjIyAgICBjbGFzcyBMb2FkTGlicyh1bml0dGVzdC5UZXN0Q2FzZSk6CisjIyAgICAgICAgZGVmIHRlc3RfbGlibShzZWxmKToKKyMjICAgICAgICAgICAgaW1wb3J0IG1hdGgKKyMjICAgICAgICAgICAgbGlibSA9IGNkbGwubGlibQorIyMgICAgICAgICAgICBzcXJ0ID0gbGlibS5zcXJ0CisjIyAgICAgICAgICAgIHNxcnQuYXJndHlwZXMgPSAoY19kb3VibGUsKQorIyMgICAgICAgICAgICBzcXJ0LnJlc3R5cGUgPSBjX2RvdWJsZQorIyMgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzcXJ0KDIpLCBtYXRoLnNxcnQoMikpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weQppbmRleCA4OWI5M2M0Li43ZWE4NzNmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKQEAgLTgsNyArOCw3IEBACiAgICAgV0lORlVOQ1RZUEUgPSBDRlVOQ1RZUEUKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAotbGliID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKK2xpYiA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogCiBjbGFzcyBDRnVuY1B0clRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weQppbmRleCBhZGE5ZGVmLi5iZmEwY2FkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5CkBAIC0xNSw5ICsxNSw5IEBACiAgICAgV0lORlVOQ1RZUEUgPSBDRlVOQ1RZUEUKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAotZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKK2RsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6Ci0gICAgd2luZGxsID0gd2luZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgIHdpbmRsbCA9IFdpbkRMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CiAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCldCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weQppbmRleCA4ZmQyNzg5Li5jMzlmMzUwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkKQEAgLTQsNyArNCw3IEBACiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogaW1wb3J0IF9jdHlwZXNfdGVzdAogCi1saWIgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorbGliID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKIGNsYXNzIExpYlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3NxcnQoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQppbmRleCA0NTU4NDE3Li40NTU4NWFlIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKQEAgLTEsNiArMSw4IEBACiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogaW1wb3J0IHN5cywgdW5pdHRlc3QKIGltcG9ydCBvcywgU3RyaW5nSU8KK2Zyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgaXNfcmVzb3VyY2VfZW5hYmxlZAogCiBsaWJjX25hbWUgPSBOb25lCiBpZiBvcy5uYW1lID09ICJudCI6CkBAIC0xOCwzOSArMjAsNDkgQEAKICAgICAgICAgICAgICAgICBsaWJjX25hbWUgPSBsaW5lLnNwbGl0KClbNF0KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgbGliY19uYW1lID0gbGluZS5zcGxpdCgpWzJdCi0jIyAgICAgICAgICAgIHByaW50ICJsaWJjX25hbWUgaXMiLCBsaWJjX25hbWUKICAgICAgICAgICAgIGJyZWFrCiAKK2lmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CisgICAgcHJpbnQgImxpYmNfbmFtZSBpcyIsIGxpYmNfbmFtZQorCiBjbGFzcyBMb2FkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIHVua25vd25kbGwgPSAieHhyYW5kb21uYW1leHgiCiAKICAgICBpZiBsaWJjX25hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgIGRlZiB0ZXN0X2xvYWQoc2VsZik6Ci0gICAgICAgICAgICBjZGxsLmxvYWQobGliY19uYW1lKQotICAgICAgICAgICAgY2RsbC5sb2FkKG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZCwgc2VsZi51bmtub3duZGxsKQorICAgICAgICAgICAgQ0RMTChsaWJjX25hbWUpCisgICAgICAgICAgICBDRExMKG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIENETEwsIHNlbGYudW5rbm93bmRsbCkKIAogICAgIGlmIGxpYmNfbmFtZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5iYXNlbmFtZShsaWJjX25hbWUpID09ICJsaWJjLnNvLjYiOgogICAgICAgICBkZWYgdGVzdF9sb2FkX3ZlcnNpb24oc2VsZik6Ci0gICAgICAgICAgICBjZGxsLmxvYWRfdmVyc2lvbigiYyIsICI2IikKKyAgICAgICAgICAgIGNkbGwuTG9hZExpYnJhcnkoImxpYmMuc28uNiIpCiAgICAgICAgICAgICAjIGxpbnV4IHVzZXMgdmVyc2lvbiwgbGliYyA5IHNob3VsZCBub3QgZXhpc3QKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCAiYyIsICI5IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCBzZWxmLnVua25vd25kbGwsICIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5Mb2FkTGlicmFyeSwgImxpYmMuc28uOSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLkxvYWRMaWJyYXJ5LCBzZWxmLnVua25vd25kbGwpCiAKLSAgICAgICAgZGVmIHRlc3RfZmluZChzZWxmKToKLSAgICAgICAgICAgIG5hbWUgPSAiYyIKLSAgICAgICAgICAgIGNkbGwuZmluZChuYW1lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5maW5kLCBzZWxmLnVua25vd25kbGwpCisgICAgZGVmIHRlc3RfZmluZChzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gKCJjIiwgIm0iKToKKyAgICAgICAgICAgIGxpYiA9IGZpbmRfbGlicmFyeShuYW1lKQorICAgICAgICAgICAgaWYgbGliOgorICAgICAgICAgICAgICAgIGNkbGwuTG9hZExpYnJhcnkobGliKQorICAgICAgICAgICAgICAgIENETEwobGliKQogCiAgICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CiAgICAgICAgIGRlZiB0ZXN0X2xvYWRfbGlicmFyeShzZWxmKToKKyAgICAgICAgICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CisgICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJrZXJuZWwzMiIpCisgICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJ1c2VyMzIiKQorCiAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6Ci0gICAgICAgICAgICAgICAgd2luZGxsLmxvYWRfbGlicmFyeSgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICB3aW5kbGxbImtlcm5lbDMyIl0uR2V0TW9kdWxlSGFuZGxlVwogICAgICAgICAgICAgICAgIHdpbmRsbC5Mb2FkTGlicmFyeSgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCiAgICAgICAgICAgICAgICAgV2luRExMKCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKICAgICAgICAgICAgIGVsaWYgb3MubmFtZSA9PSAiY2UiOgotICAgICAgICAgICAgICAgIHdpbmRsbC5sb2FkX2xpYnJhcnkoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgd2luZGxsLmNvcmVkbGwuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIHdpbmRsbFsiY29yZWRsbCJdLkdldE1vZHVsZUhhbmRsZVcKICAgICAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCiAgICAgICAgICAgICAgICAgV2luRExMKCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CmluZGV4IDNhMzI0YTYuLjYwMGJiNzUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CkBAIC0yMCw3ICsyMCw3IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIEEsIGNfdWxvbmcoMzMpKQogCiAgICAgZGVmIHRlc3RfcGFzc19wb2ludGVycyhzZWxmKToKLSAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIGZ1bmMgPSBkbGwuX3Rlc3RmdW5jX3BfcAogICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2xvbmcKIApAQCAtMzUsNyArMzUsNyBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbMF0sIDEyMzQ1Njc4KQogCiAgICAgZGVmIHRlc3RfY2hhbmdlX3BvaW50ZXJzKHNlbGYpOgotICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgICAgICAgZnVuYyA9IGRsbC5fdGVzdGZ1bmNfcF9wCiAKICAgICAgICAgaSA9IGNfaW50KDg3NjU0KQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgY2FsbGJhY2sgPSBQUk9UT1RZUEUoZnVuYykKIAotICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgYSBmdW5jdGlvbiBwb2ludGVyLAogICAgICAgICAjIGFuZCBjYWxscyB0aGlzIHdpdGggYW4gaW50ZWdlciBwb2ludGVyIGFzIHBhcmFtZXRlci4KICAgICAgICAgIyBUaGUgaW50IHBvaW50ZXIgcG9pbnRzIHRvIGEgdGFibGUgY29udGFpbmluZyB0aGUgbnVtYmVycyAxLi4xMApAQCAtMTMzLDMwICsxMzMsOSBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzBdLCA0MikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocC5jb250ZW50cy52YWx1ZSwgNDIpCiAKLSAgICBkZWYgdGVzdF9pbmNvbXBsZXRlKHNlbGYpOgotICAgICAgICBscGNlbGwgPSBQT0lOVEVSKCJjZWxsIikKLSAgICAgICAgY2xhc3MgY2VsbChTdHJ1Y3R1cmUpOgotICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ2YWx1ZSIsIGNfaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgibmV4dCIsIGxwY2VsbCldCi0gICAgICAgIFNldFBvaW50ZXJUeXBlKGxwY2VsbCwgY2VsbCkKLQotICAgICAgICAjIE1ha2UgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHBvaW50ZXIgdG8gaXRzZWxmOgotICAgICAgICBjID0gY2VsbCgpCi0gICAgICAgIGMudmFsdWUgPSA0MgotICAgICAgICBjLm5leHQgPSBwb2ludGVyKGMpCi0KLSAgICAgICAgcmVzdWx0ID0gW10KLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMudmFsdWUpCi0gICAgICAgICAgICBjID0gYy5uZXh0WzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgWzQyXSAqIDgpCi0KLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKLSAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbY2VsbF0KLQogICAgIGRlZiB0ZXN0X2NoYXJwcCggc2VsZiApOgogICAgICAgICAiIiJUZXN0IHRoYXQgYSBjaGFyYWN0ZXIgcG9pbnRlci10by1wb2ludGVyIGlzIGNvcnJlY3RseSBwYXNzZWQiIiIKLSAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIGZ1bmMgPSBkbGwuX3Rlc3RmdW5jX2NfcF9wCiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfY2hhcl9wCiAgICAgICAgIGFyZ3YgPSAoY19jaGFyX3AgKiAyKSgpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb3NpeC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Bvc2l4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBhNDBhLi4wMDAwMDAwCi0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Bvc2l4LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotaW1wb3J0IHVuaXR0ZXN0LCBvcywgc3lzCi1mcm9tIGN0eXBlcyBpbXBvcnQgKgotCi1pZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSA9PSAibGludXgyIjoKLSAgICAjIEkgZG9uJ3QgcmVhbGx5IGtub3cgb24gd2hpY2ggcGxhdGZvcm1zIHRoaXMgd29ya3MsCi0gICAgIyBsYXRlciBpdCBzaG91bGQgdXNlIHRoZSBmaW5kX2xpYnJhcnkgc3R1ZmYgdG8gYXZvaWQKLSAgICAjIGhhcmRjb2RpbmcgdGhlIG5hbWVzLgotCi0gICAgY2xhc3MgVGVzdFJUTERfR0xPQkFMKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgZGVmIHRlc3RfR0woc2VsZik6Ci0gICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9saWIvbGliR0wuc28nKToKLSAgICAgICAgICAgICAgICBjZGxsLmxvYWQoJ2xpYkdMLnNvJywgbW9kZT1SVExEX0dMT0JBTCkKLSAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCcvdXNyL2xpYi9saWJHTFUuc28nKToKLSAgICAgICAgICAgICAgICBjZGxsLmxvYWQoJ2xpYkdMVS5zbycpCi0KLSMjaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gIT0gImRhcndpbiI6Ci0KLSMjICAgICMgT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCBpcyAnLnNvJywKLSMjICAgICMgYXQgbGVhc3Qgc29tZSBsaWJyYXJpZXMgY2FuIGJlIGxvYWRlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoZSBjZGxsCi0jIyAgICAjIG9iamVjdCwgc2luY2UgY3R5cGVzIG5vdyB0cmllcyBsb2FkaW5nIHRoZSBsaWIgYWdhaW4KLSMjICAgICMgd2l0aCAnLnNvJyBhcHBlbmRlZCBvZiB0aGUgZmlyc3QgdHJ5IGZhaWxzLgotIyMgICAgIwotIyMgICAgIyBXb24ndCB3b3JrIGZvciBsaWJjLCB1bmZvcnR1bmF0ZWx5LiAgT1RPSCwgaXQgaXNuJ3QKLSMjICAgICMgbmVlZGVkIGZvciBsaWJjIHNpbmNlIHRoaXMgaXMgYWxyZWFkeSBtYXBwZWQgaW50byB0aGUgY3VycmVudAotIyMgICAgIyBwcm9jZXNzICg/KQotIyMgICAgIwotIyMgICAgIyBPbiBNQUMgT1NYLCBpdCB3b24ndCB3b3JrIGVpdGhlciwgYmVjYXVzZSBkbG9wZW4oKSBuZWVkcyBhIGZ1bGwgcGF0aCwKLSMjICAgICMgYW5kIHRoZSBkZWZhdWx0IHN1ZmZpeCBpcyBlaXRoZXIgbm9uZSBvciAnLmR5bGliJy4KLQotIyMgICAgY2xhc3MgTG9hZExpYnModW5pdHRlc3QuVGVzdENhc2UpOgotIyMgICAgICAgIGRlZiB0ZXN0X2xpYm0oc2VsZik6Ci0jIyAgICAgICAgICAgIGltcG9ydCBtYXRoCi0jIyAgICAgICAgICAgIGxpYm0gPSBjZGxsLmxpYm0KLSMjICAgICAgICAgICAgc3FydCA9IGxpYm0uc3FydAotIyMgICAgICAgICAgICBzcXJ0LmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKLSMjICAgICAgICAgICAgc3FydC5yZXN0eXBlID0gY19kb3VibGUKLSMjICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3FydCgyKSwgbWF0aC5zcXJ0KDIpKQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKaW5kZXggNDdmNWRhMS4uYWFhYTQ3YSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CkBAIC0yMiw3ICsyMiw3IEBACiAjIEluIHRoaXMgY2FzZSwgdGhlcmUgd291bGQgaGF2ZSB0byBiZSBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgYXJndW1lbnQuLi4KIAogaW1wb3J0IF9jdHlwZXNfdGVzdAotdGVzdGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCit0ZXN0ZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKICMgUmV0dXJuIG1hY2hpbmUgYWRkcmVzcyBgYWAgYXMgYSAocG9zc2libHkgbG9uZykgbm9uLW5lZ2F0aXZlIGludGVnZXIuCiAjIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNSwgaWQoYW55dGhpbmcpIGlzIGFsd2F5cyBub24tbmVnYXRpdmUsIGFuZApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKaW5kZXggYzI5YjcyMS4uNzhlMDIzMSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5CkBAIC0xLDUgKzEsNiBAQAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKIGltcG9ydCB1bml0dGVzdCwgc3lzCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBpc19yZXNvdXJjZV9lbmFibGVkCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGN0eXBlc1xfX2luaXRfXy5weSwgd2hlbiBpdCdzIHJlYWR5LgpAQCAtMzMsMjAgKzM0LDI0IEBACiAgICAgICAgIGRlbCBweW9iCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhzKSwgcmVmY250KQogCi0gICAgZGVmIHRlc3RfUHlJbnRfTG9uZyhzZWxmKToKLSAgICAgICAgcmVmNDIgPSBncmMoNDIpCi0gICAgICAgIHB5dGhvbmFwaS5QeUludF9Gcm9tTG9uZy5yZXN0eXBlID0gcHlfb2JqZWN0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHB5dGhvbmFwaS5QeUludF9Gcm9tTG9uZyg0MiksIDQyKQorICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInJlZmNvdW50Iik6CisgICAgICAgICMgVGhpcyB0ZXN0IGlzIHVucmVsaWFibGUsIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCBjb2RlIGluCisgICAgICAgICMgdW5pdHRlc3QgY2hhbmdlcyB0aGUgcmVmY291bnQgb2YgdGhlICc0MicgaW50ZWdlci4gIFNvLCBpdAorICAgICAgICAjIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgIGRlZiB0ZXN0X1B5SW50X0xvbmcoc2VsZik6CisgICAgICAgICAgICByZWY0MiA9IGdyYyg0MikKKyAgICAgICAgICAgIHB5dGhvbmFwaS5QeUludF9Gcm9tTG9uZy5yZXN0eXBlID0gcHlfb2JqZWN0CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChweXRob25hcGkuUHlJbnRfRnJvbUxvbmcoNDIpLCA0MikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMoNDIpLCByZWY0MikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyg0MiksIHJlZjQyKQogCi0gICAgICAgIHB5dGhvbmFwaS5QeUludF9Bc0xvbmcuYXJndHlwZXMgPSAocHlfb2JqZWN0LCkKLSAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5yZXN0eXBlID0gY19sb25nCisgICAgICAgICAgICBweXRob25hcGkuUHlJbnRfQXNMb25nLmFyZ3R5cGVzID0gKHB5X29iamVjdCwpCisgICAgICAgICAgICBweXRob25hcGkuUHlJbnRfQXNMb25nLnJlc3R5cGUgPSBjX2xvbmcKIAotICAgICAgICByZXMgPSBweXRob25hcGkuUHlJbnRfQXNMb25nKDQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMocmVzKSwgcmVmNDIgKyAxKQotICAgICAgICBkZWwgcmVzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyg0MiksIHJlZjQyKQorICAgICAgICAgICAgcmVzID0gcHl0aG9uYXBpLlB5SW50X0FzTG9uZyg0MikKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhyZXMpLCByZWY0MiArIDEpCisgICAgICAgICAgICBkZWwgcmVzCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMoNDIpLCByZWY0MikKIAogICAgIGRlZiB0ZXN0X1B5T2JqX0Zyb21QdHIoc2VsZik6CiAgICAgICAgIHMgPSAiYWJjIGRlZiBnaGkgamtsIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5CmluZGV4IDBjNjJiZjIuLjQ0OGYyOTIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHkKQEAgLTYsNyArNiw3IEBACiBPdGhlckNhbGxiYWNrID0gY3R5cGVzLkNGVU5DVFlQRShjdHlwZXMuY19pbnQsIGN0eXBlcy5jX2ludCwgY3R5cGVzLmNfdWxvbmdsb25nKQogCiBpbXBvcnQgX2N0eXBlc190ZXN0Ci1kbGwgPSBjdHlwZXMuY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKK2RsbCA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKIAogY2xhc3MgUmVmY291bnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKaW5kZXggZWYxZjZmZC4uODhkY2NmMiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKQEAgLTgsNyArOCw3IEBACiAgICAgZGVmIHRlc3Rfd2l0aF9wcm90b3R5cGUoc2VsZik6CiAgICAgICAgICMgVGhlIF9jdHlwZXNfdGVzdCBzaGFyZWQgbGliL2RsbCBleHBvcnRzIHF1aXRlIHNvbWUgZnVuY3Rpb25zIGZvciB0ZXN0aW5nLgogICAgICAgICAjIFRoZSBnZXRfc3RyY2hyIGZ1bmN0aW9uIHJldHVybnMgYSAqcG9pbnRlciogdG8gdGhlIEMgc3RyY2hyIGZ1bmN0aW9uLgotICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgICAgICAgZ2V0X3N0cmNociA9IGRsbC5nZXRfc3RyY2hyCiAgICAgICAgIGdldF9zdHJjaHIucmVzdHlwZSA9IENGVU5DVFlQRShjX2NoYXJfcCwgY19jaGFyX3AsIGNfY2hhcikKICAgICAgICAgc3RyY2hyID0gZ2V0X3N0cmNocigpCkBAIC0xOCw3ICsxOCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3RyY2hyLCAiYWJjZGVmIikKIAogICAgIGRlZiB0ZXN0X3dpdGhvdXRfcHJvdG90eXBlKHNlbGYpOgotICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgICAgICAgZ2V0X3N0cmNociA9IGRsbC5nZXRfc3RyY2hyCiAgICAgICAgICMgdGhlIGRlZmF1bHQgJ2NfaW50JyB3b3VsZCBub3Qgd29yayBvbiBzeXN0ZW1zIHdoZXJlIHNpemVvZihpbnQpICE9IHNpemVvZih2b2lkICopCiAgICAgICAgIGdldF9zdHJjaHIucmVzdHlwZSA9IGNfdm9pZF9wCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQppbmRleCAzMDZjNTg1Li4wOGM4MTFlIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKQEAgLTM3LDE4ICszNywyMSBAQAogICAgIGRlZiB0ZXN0X2NoYXJfcHRyKHNlbGYpOgogICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCiAKLSAgICAgICAgZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IFBPSU5URVIoY19jaGFyKQorICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQogICAgICAgICByZXMgPSBkbGwubXlfc3RyZHVwKHMpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpXSwgcykKIAogICAgICAgICBpbXBvcnQgb3BlcmF0b3IKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCAwLCA1LCB1ImFiY2RlIikKKyAgICAgICAgZGxsLm15X2ZyZWUocmVzKQogCiAgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IFBPSU5URVIoY19ieXRlKQogICAgICAgICByZXMgPSBkbGwubXlfc3RyZHVwKHMpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpLTFdLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIGRsbC5teV9mcmVlKHJlcykKIAogICAgIGRlZiB0ZXN0X2NoYXJfYXJyYXkoc2VsZik6CiAgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcMCIKQEAgLTY1LDE1ICs2OCwxNyBAQAogICAgICAgICBkZWYgdGVzdF93Y2hhcl9wdHIoc2VsZik6CiAgICAgICAgICAgICBzID0gdSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgogCi0gICAgICAgICAgICBkbGwgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfd2NoYXIpCiAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLmFyZ3R5cGVzID0gUE9JTlRFUihjX3djaGFyKSwKKyAgICAgICAgICAgIGRsbC5teV9mcmVlLnJlc3R5cGUgPSBOb25lCiAgICAgICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKV0sIHMpCiAKICAgICAgICAgICAgIGltcG9ydCBvcGVyYXRvcgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgMCwgNSwgdSJhYmNkZSIpCisgICAgICAgICAgICBkbGwubXlfZnJlZShyZXMpCiAKICAgICAgICAgICAgIGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19zaG9ydCk6CiAgICAgICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX3Nob3J0KQpAQCAtODEsOCArODYsMTEgQEAKICAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfaW50KQogICAgICAgICAgICAgZWxpZiBzaXplb2YoY193Y2hhcikgPT0gc2l6ZW9mKGNfbG9uZyk6CiAgICAgICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX2xvbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgcmVzID0gZGxsLm15X3djc2R1cChzKQogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyktMV0sIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKKyAgICAgICAgICAgIGRsbC5teV9mcmVlKHJlcykKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHkKaW5kZXggMTgzYTYwYy4uNmVlNmFlMCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weQpAQCAtMyw3ICszLDcgQEAKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCi1saWIgPSBjZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorbGliID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKIGNsYXNzIFN0cmluZ1B0clRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKaW5kZXggYjZlYWFjNC4uNTM0MGY3OSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CkBAIC0yOTQsMjAgKzI5NCwyMCBAQAogICAgICAgICAjIEluIFB5dGhvbiAyLjUsIEV4Y2VwdGlvbiBpcyBhIG5ldy1zdHlsZSBjbGFzcywgYW5kIHRoZSByZXByIGNoYW5nZWQKICAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6CiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8Y2xhc3MgJ2V4Y2VwdGlvbnMuVHlwZUVycm9yJz46ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIDx0eXBlICdleGNlcHRpb25zLlR5cGVFcnJvcic+OiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0LCBpbnQgZm91bmQiKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIFR5cGVFcnJvcjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKIAogICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sICJTb21lb25lIiwgKCJhIiwgImIiLCAiYyIpKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKICAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6CiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8Y2xhc3MgJ2V4Y2VwdGlvbnMuVmFsdWVFcnJvcic+OiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPHR5cGUgJ2V4Y2VwdGlvbnMuVmFsdWVFcnJvcic+OiB0b28gbWFueSBpbml0aWFsaXplcnMiKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLCAiKFBob25lKSBleGNlcHRpb25zLlZhbHVlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csICIoUGhvbmUpIFZhbHVlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCiAKIAogICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5CmluZGV4IGJiMzk3NDYuLjc4YzVjZjggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtOCw3ICs4LDcgQEAKICAgICBwYXNzCiBlbHNlOgogICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKLSAgICBkbGwgPSBjdHlwZXMuY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICBkbGwgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgd2NzbGVuID0gZGxsLm15X3djc2xlbgogICAgIHdjc2xlbi5hcmd0eXBlcyA9IFtjdHlwZXMuY193Y2hhcl9wXQogCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCiAKICAgICBpbXBvcnQgX2N0eXBlc190ZXN0Ci0gICAgZnVuYyA9IGN0eXBlcy5jZGxsLmxvYWQoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCisgICAgZnVuYyA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykuX3Rlc3RmdW5jX3BfcAogCiAgICAgY2xhc3MgU3RyaW5nVGVzdENhc2UoVW5pY29kZVRlc3RDYXNlKToKICAgICAgICAgZGVmIHNldFVwKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CmluZGV4IDFmMjVmOWIuLjdiYTNlMjEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKQEAgLTEwLDcgKzEwLDcgQEAKIGNsYXNzIFZhbHVlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2FuX2ludGVnZXIoc2VsZik6Ci0gICAgICAgIGN0ZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgY3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgICAgICAgYW5faW50ZWdlciA9IGNfaW50LmluX2RsbChjdGRsbCwgImFuX2ludGVnZXIiKQogICAgICAgICB4ID0gYW5faW50ZWdlci52YWx1ZQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LCBjdGRsbC5nZXRfYW5faW50ZWdlcigpKQpAQCAtMTgsNyArMTgsNyBAQAogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4KjIsIGN0ZGxsLmdldF9hbl9pbnRlZ2VyKCkpCiAKICAgICBkZWYgdGVzdF91bmRlZmluZWQoc2VsZik6Ci0gICAgICAgIGN0ZGxsID0gY2RsbC5sb2FkKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgY3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19pbnQuaW5fZGxsLCBjdGRsbCwgIlVuZGVmaW5lZF9TeW1ib2wiKQogCiAgICAgY2xhc3MgV2luX1ZhbHVlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKaW5kZXggM2QwYjgyNS4uODI0N2QzNyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICgicmlnaHQiLCBjX2xvbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJib3R0b20iLCBjX2xvbmcpXQogCi0gICAgICAgIGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogCiAgICAgICAgIHB0ID0gUE9JTlQoMTAsIDEwKQogICAgICAgICByZWN0ID0gUkVDVCgwLCAwLCAyMCwgMjApCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3V0aWwucHkgYi9MaWIvY3R5cGVzL3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1NmMxYwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdXRpbC5weQpAQCAtMCwwICsxLDEyMiBAQAoraW1wb3J0IHN5cywgb3MKK2ltcG9ydCBjdHlwZXMKKworIyBmaW5kX2xpYnJhcnkobmFtZSkgcmV0dXJucyB0aGUgcGF0aG5hbWUgb2YgYSBsaWJyYXJ5LCBvciBOb25lLgoraWYgb3MubmFtZSA9PSAibnQiOgorICAgIGRlZiBmaW5kX2xpYnJhcnkobmFtZSk6CisgICAgICAgICMgU2VlIE1TRE4gZm9yIHRoZSBSRUFMIHNlYXJjaCBvcmRlci4KKyAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBvcy5lbnZpcm9uWydQQVRIJ10uc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgICAgICBmbmFtZSA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZuYW1lCisgICAgICAgICAgICBpZiBmbmFtZS5sb3dlcigpLmVuZHN3aXRoKCIuZGxsIik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZuYW1lID0gZm5hbWUgKyAiLmRsbCIKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm5hbWUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworaWYgb3MubmFtZSA9PSAiY2UiOgorICAgICMgc2VhcmNoIHBhdGggYWNjb3JkaW5nIHRvIE1TRE46CisgICAgIyAtIGFic29sdXRlIHBhdGggc3BlY2lmaWVkIGJ5IGZpbGVuYW1lCisgICAgIyAtIFRoZSAuZXhlIGxhdW5jaCBkaXJlY3RvcnkKKyAgICAjIC0gdGhlIFdpbmRvd3MgZGlyZWN0b3J5CisgICAgIyAtIFJPTSBkbGwgZmlsZXMgKHdoZXJlIGFyZSB0aGV5PykKKyAgICAjIC0gT0VNIHNwZWNpZmllZCBzZWFyY2ggcGF0aDogSEtMTVxMb2FkZXJcU3lzdGVtUGF0aAorICAgIGRlZiBmaW5kX2xpYnJhcnkobmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lCisKK2lmIG9zLm5hbWUgPT0gInBvc2l4IiBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgIGZyb20gY3R5cGVzLm1hY2hvbGliLmR5bGQgaW1wb3J0IGR5bGRfZmluZCBhcyBfZHlsZF9maW5kCisgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKKyAgICAgICAgcG9zc2libGUgPSBbJ2xpYiVzLmR5bGliJyAlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICclcy5keWxpYicgJSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAnJXMuZnJhbWV3b3JrLyVzJyAlIChuYW1lLCBuYW1lKV0KKyAgICAgICAgZm9yIG5hbWUgaW4gcG9zc2libGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9keWxkX2ZpbmQobmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHJldHVybiBOb25lCisKK2VsaWYgb3MubmFtZSA9PSAicG9zaXgiOgorICAgICMgQW5kcmVhcyBEZWdlcnQncyBmaW5kIGZ1bmN0aW9ucywgdXNpbmcgZ2NjLCAvc2Jpbi9sZGNvbmZpZywgb2JqZHVtcAorICAgIGltcG9ydCByZSwgdGVtcGZpbGUKKworICAgIGRlZiBfZmluZExpYl9nY2MobmFtZSk6CisgICAgICAgIGV4cHIgPSAnW15cKFwpXHNdKmxpYiVzXC5bXlwoXClcc10qJyAlIG5hbWUKKyAgICAgICAgY21kID0gJ2lmIHR5cGUgZ2NjICY+L2Rldi9udWxsOyB0aGVuIENDPWdjYzsgZWxzZSBDQz1jYzsgZmk7JyBcCisgICAgICAgICAgICAgICckQ0MgLVdsLC10IC1vIC9kZXYvbnVsbCAyPiYxIC1sJyArIG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmRvdXQsIG91dGZpbGUgPSAgdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICBmZCA9IG9zLnBvcGVuKGNtZCkKKyAgICAgICAgICAgIHRyYWNlID0gZmQucmVhZCgpCisgICAgICAgICAgICBlcnIgPSBmZC5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKG91dGZpbGUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIHRyYWNlKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgwKQorCisgICAgZGVmIF9maW5kTGliX2xkKG5hbWUpOgorICAgICAgICBleHByID0gJy9bXlwoXClcc10qbGliJXNcLlteXChcKVxzXSonICUgbmFtZQorICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgb3MucG9wZW4oJy9zYmluL2xkY29uZmlnIC1wIDI+L2Rldi9udWxsJykucmVhZCgpKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgIyBIbSwgdGhpcyB3b3JrcyBvbmx5IGZvciBsaWJzIG5lZWRlZCBieSB0aGUgcHl0aG9uIGV4ZWN1dGFibGUuCisgICAgICAgICAgICBjbWQgPSAnbGRkICVzIDI+L2Rldi9udWxsJyAlIHN5cy5leGVjdXRhYmxlCisgICAgICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgb3MucG9wZW4oY21kKS5yZWFkKCkpCisgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiByZXMuZ3JvdXAoMCkKKworICAgIGRlZiBfZ2V0X3NvbmFtZShmKToKKyAgICAgICAgY21kID0gIm9iamR1bXAgLXAgLWogLmR5bmFtaWMgMj4vZGV2L251bGwgIiArIGYKKyAgICAgICAgcmVzID0gcmUuc2VhcmNoKHInXHNTT05BTUVccysoW15cc10rKScsIG9zLnBvcGVuKGNtZCkucmVhZCgpKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgxKQorCisgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKKyAgICAgICAgbGliID0gX2ZpbmRMaWJfbGQobmFtZSkgb3IgX2ZpbmRMaWJfZ2NjKG5hbWUpCisgICAgICAgIGlmIG5vdCBsaWI6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gX2dldF9zb25hbWUobGliKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHRlc3QgY29kZQorCitkZWYgdGVzdCgpOgorICAgIGZyb20gY3R5cGVzIGltcG9ydCBjZGxsCisgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICBwcmludCBjZGxsLm1zdmNydAorICAgICAgICBwcmludCBjZGxsLmxvYWQoIm1zdmNydCIpCisgICAgICAgIHByaW50IGZpbmRfbGlicmFyeSgibXN2Y3J0IikKKworICAgIGlmIG9zLm5hbWUgPT0gInBvc2l4IjoKKyAgICAgICAgIyBmaW5kIGFuZCBsb2FkX3ZlcnNpb24KKyAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJtIikKKyAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJjIikKKyAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJiejIiKQorCisgICAgICAgICMgZ2V0YXR0cgorIyMgICAgICAgIHByaW50IGNkbGwubQorIyMgICAgICAgIHByaW50IGNkbGwuYnoyCisKKyAgICAgICAgIyBsb2FkCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgIHByaW50IGNkbGwuTG9hZExpYnJhcnkoImxpYm0uZHlsaWIiKQorICAgICAgICAgICAgcHJpbnQgY2RsbC5Mb2FkTGlicmFyeSgibGliY3J5cHRvLmR5bGliIikKKyAgICAgICAgICAgIHByaW50IGNkbGwuTG9hZExpYnJhcnkoImxpYlN5c3RlbS5keWxpYiIpCisgICAgICAgICAgICBwcmludCBjZGxsLkxvYWRMaWJyYXJ5KCJTeXN0ZW0uZnJhbWV3b3JrL1N5c3RlbSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJtLnNvIikKKyAgICAgICAgICAgIHByaW50IGNkbGwuTG9hZExpYnJhcnkoImxpYmNyeXB0LnNvIikKKyAgICAgICAgICAgIHByaW50IGZpbmRfbGlicmFyeSgiY3J5cHQiKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL2RlY2ltYWwucHkgYi9MaWIvZGVjaW1hbC5weQppbmRleCA5ODE1YWIzLi4yMTBkYjUyIDEwMDY0NAotLS0gYS9MaWIvZGVjaW1hbC5weQorKysgYi9MaWIvZGVjaW1hbC5weQpAQCAtNzMxLDcgKzczMSw3IEBACiAgICAgICAgICIiInguX19oYXNoX18oKSA8PT0+IGhhc2goeCkiIiIKICAgICAgICAgIyBEZWNpbWFsIGludGVnZXJzIG11c3QgaGFzaCB0aGUgc2FtZSBhcyB0aGUgaW50cwogICAgICAgICAjIE5vbi1pbnRlZ2VyIGRlY2ltYWxzIGFyZSBub3JtYWxpemVkIGFuZCBoYXNoZWQgYXMgc3RyaW5ncwotICAgICAgICAjIE5vcm1hbGl6YXRpb24gYXNzdXJlcyB0aGF0IGhhc3QoMTAwRS0xKSA9PSBoYXNoKDEwKQorICAgICAgICAjIE5vcm1hbGl6YXRpb24gYXNzdXJlcyB0aGF0IGhhc2goMTAwRS0xKSA9PSBoYXNoKDEwKQogICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgogICAgICAgICAgICAgaWYgc2VsZi5faXNuYW4oKToKICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBoYXNoIGEgTmFOIHZhbHVlLicpCkBAIC0yMjQ2LDcgKzIyNDYsNyBAQAogICAgICAgICBzLmFwcGVuZCgndHJhcHM9WycgKyAnLCAnLmpvaW4oW3QuX19uYW1lX18gZm9yIHQsIHYgaW4gc2VsZi50cmFwcy5pdGVtcygpIGlmIHZdKSArICddJykKICAgICAgICAgcmV0dXJuICcsICcuam9pbihzKSArICcpJwogCi0gICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgorICAgIGRlZiBnZXRfbWFuYWdlcihzZWxmKToKICAgICAgICAgcmV0dXJuIENvbnRleHRNYW5hZ2VyKHNlbGYuY29weSgpKQogCiAgICAgZGVmIGNsZWFyX2ZsYWdzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jY29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL2Njb21waWxlci5weQppbmRleCA2ZGFkNzU3Li4xMzQ5YWJlIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2Njb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL2Njb21waWxlci5weQpAQCAtMTUsNyArMTUsNiBAQAogZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBtb3ZlX2ZpbGUKIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBta3BhdGgKIGZyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9wYWlyd2lzZSwgbmV3ZXJfZ3JvdXAKLWZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgcHl0aG9uX2J1aWxkCiBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzcGxpdF9xdW90ZWQsIGV4ZWN1dGUKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKIApAQCAtMzY4LDcgKzM2Nyw3IEBACiAKICAgICAgICAgIyBHZXQgdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgb3V0cHV0IChvYmplY3QpIGZpbGVzCiAgICAgICAgIG9iamVjdHMgPSBzZWxmLm9iamVjdF9maWxlbmFtZXMoc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9kaXI9cHl0aG9uX2J1aWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX2Rpcj0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9b3V0ZGlyKQogICAgICAgICBhc3NlcnQgbGVuKG9iamVjdHMpID09IGxlbihzb3VyY2VzKQogCkBAIC00NzUsOCArNDc0LDcgQEAKICAgICAgICAgd2hpY2ggc291cmNlIGZpbGVzIGNhbiBiZSBza2lwcGVkLgogICAgICAgICAiIiIKICAgICAgICAgIyBHZXQgdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgb3V0cHV0IChvYmplY3QpIGZpbGVzCi0gICAgICAgIG9iamVjdHMgPSBzZWxmLm9iamVjdF9maWxlbmFtZXMoc291cmNlcywgc3RyaXBfZGlyPXB5dGhvbl9idWlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPW91dHB1dF9kaXIpCisgICAgICAgIG9iamVjdHMgPSBzZWxmLm9iamVjdF9maWxlbmFtZXMoc291cmNlcywgb3V0cHV0X2Rpcj1vdXRwdXRfZGlyKQogICAgICAgICBhc3NlcnQgbGVuKG9iamVjdHMpID09IGxlbihzb3VyY2VzKQogCiAgICAgICAgIGlmIHNlbGYuZm9yY2U6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQppbmRleCBmMDVkNjZjLi43NWRiODc3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkKQEAgLTEsNSArMSw1IEBACiAjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCi0jIENvcHlyaWdodCAoQykgMjAwNSBNYXJ0aW4gdi4gTPZ3aXMKKyMgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE1hcnRpbiB2LiBM9ndpcwogIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCiAjIFRoZSBiZGlzdF93aW5pbnN0IGNvbW1hbmQgcHJvcGVyCiAjIGJhc2VkIG9uIGJkaXN0X3dpbmluc3QKQEAgLTE2LDcgKzE2LDcgQEAKIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKIGltcG9ydCBtc2lsaWIKLWZyb20gbXNpbGliIGltcG9ydCBzY2hlbWEsIHNlcXVlbmNlLCB1aXNhbXBsZQorZnJvbSBtc2lsaWIgaW1wb3J0IHNjaGVtYSwgc2VxdWVuY2UsIHRleHQKIGZyb20gbXNpbGliIGltcG9ydCBEaXJlY3RvcnksIEZlYXR1cmUsIERpYWxvZywgYWRkX2RhdGEKIAogY2xhc3MgUHlEaWFsb2coRGlhbG9nKToKQEAgLTM3NCw4ICszNzQsOCBAQAogICAgICAgICAgICAgICAgICAgKCJNYWludGVuYW5jZVR5cGVEbGciLCAiSW5zdGFsbGVkIEFORCBOT1QgUkVTVU1FIEFORCBOT1QgUHJlc2VsZWN0ZWQiLCAxMjUwKSwKICAgICAgICAgICAgICAgICAgICgiUHJvZ3Jlc3NEbGciLCBOb25lLCAxMjgwKV0pCiAKLSAgICAgICAgYWRkX2RhdGEoZGIsICdBY3Rpb25UZXh0JywgdWlzYW1wbGUuQWN0aW9uVGV4dCkKLSAgICAgICAgYWRkX2RhdGEoZGIsICdVSVRleHQnLCB1aXNhbXBsZS5VSVRleHQpCisgICAgICAgIGFkZF9kYXRhKGRiLCAnQWN0aW9uVGV4dCcsIHRleHQuQWN0aW9uVGV4dCkKKyAgICAgICAgYWRkX2RhdGEoZGIsICdVSVRleHQnLCB0ZXh0LlVJVGV4dCkKICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAgICAgICMgU3RhbmRhcmQgZGlhbG9nczogRmF0YWxFcnJvciwgVXNlckV4aXQsIEV4aXREaWFsb2cKICAgICAgICAgZmF0YWw9UHlEaWFsb2coZGIsICJGYXRhbEVycm9yIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLApAQCAtNTAyLDkgKzUwMiw5IEBACiAKICAgICAgICAgc2VsZGxnLmJhY2soIjwgQmFjayIsIE5vbmUsIGFjdGl2ZT0wKQogICAgICAgICBjID0gc2VsZGxnLm5leHQoIk5leHQgPiIsICJDYW5jZWwiKQotICAgICAgICBjLmV2ZW50KCJTZXRUYXJnZXRQYXRoIiwgIlRBUkdFVERJUiIsIG9yZGVyPTEpCi0gICAgICAgIGMuZXZlbnQoIlNwYXduV2FpdERpYWxvZyIsICJXYWl0Rm9yQ29zdGluZ0RsZyIsIG9yZGVyPTIpCi0gICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iLCBvcmRlcj0zKQorICAgICAgICBjLmV2ZW50KCJTZXRUYXJnZXRQYXRoIiwgIlRBUkdFVERJUiIsIG9yZGVyaW5nPTEpCisgICAgICAgIGMuZXZlbnQoIlNwYXduV2FpdERpYWxvZyIsICJXYWl0Rm9yQ29zdGluZ0RsZyIsIG9yZGVyaW5nPTIpCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iLCBvcmRlcmluZz0zKQogCiAgICAgICAgIGMgPSBzZWxkbGcuY2FuY2VsKCJDYW5jZWwiLCAiRGlyZWN0b3J5Q29tYm8iKQogICAgICAgICBjLmV2ZW50KCJTcGF3bkRpYWxvZyIsICJDYW5jZWxEbGciKQpAQCAtNTYxLDcgKzU2MSw3IEBACiAKICAgICAgICAgYyA9IHdoaWNodXNlcnMubmV4dCgiTmV4dCA+IiwgIkNhbmNlbCIpCiAgICAgICAgIGMuZXZlbnQoIltBTExVU0VSU10iLCAiMSIsICdXaGljaFVzZXJzPSJBTEwiJywgMSkKLSAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIsIG9yZGVyID0gMikKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIsIG9yZGVyaW5nID0gMikKIAogICAgICAgICBjID0gd2hpY2h1c2Vycy5jYW5jZWwoIkNhbmNlbCIsICJBZG1pbkluc3RhbGwiKQogICAgICAgICBjLmV2ZW50KCJTcGF3bkRpYWxvZyIsICJDYW5jZWxEbGciKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKaW5kZXggNTc3MTI1Mi4uOTYyNjcxMCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CkBAIC02ODksNiArNjg5LDExIEBACiAgICAgICAgICAgICAjIGRvbid0IGV4dGVuZCBleHQubGlicmFyaWVzLCBpdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKICAgICAgICAgICAgICMgZXh0ZW5zaW9ucywgaXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGxpc3QKICAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzICsgW3B5dGhvbmxpYiwgIm0iXSArIGV4dHJhCisKKyAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAjIERvbid0IHVzZSB0aGUgZGVmYXVsdCBjb2RlIGJlbG93CisgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcworCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCiAgICAgICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CmluZGV4IDZmNGNlODEuLjRhOWVkMzkgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQpAQCAtNiw3ICs2LDcgQEAKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgogZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwotZnJvbSBtZDUgaW1wb3J0IG1kNQorZnJvbSBoYXNobGliIGltcG9ydCBtZDUKIGltcG9ydCBvcwogaW1wb3J0IHNvY2tldAogaW1wb3J0IHBsYXRmb3JtCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CmluZGV4IGY4OGYzNjUuLmQyNGQwYWMgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CkBAIC02MTgsNyArNjE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgdGhlIGV4cGVjdGVkIHJlZ2lzdHJ5IHNldHRpbmdzIGFyZSBub3QgcHJlc2VudC5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBhdCBsZWFzdCBydW4gdGhlIFZpc3VhbCBTdHVkaW8gR1VJIG9uY2UgIgogICAgICAgICAgICAgICAgICAgICAgICAgInNvIHRoYXQgdGhlc2UgZW50cmllcyBhcmUgY3JlYXRlZC4iKQotICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIHJldHVybiBbXQogCiAgICAgZGVmIHNldF9wYXRoX2Vudl92YXIoc2VsZiwgbmFtZSk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IDQ5NTM2ZjAuLmUxMzk3YTEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC0zNjYsOCArMzY2LDggQEAKICAgICAjIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVDogY29uZmlndXJlIGJhc2VzIHNvbWUgY2hvaWNlcyBvbiBpdCBzbwogICAgICMgaXQgbmVlZHMgdG8gYmUgY29tcGF0aWJsZS4KICAgICAjIElmIGl0IGlzbid0IHNldCB3ZSBzZXQgaXQgdG8gdGhlIGNvbmZpZ3VyZS10aW1lIHZhbHVlCi0gICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBnLmhhc19rZXkoJ0NPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnKToKLSAgICAgICAgY2ZnX3RhcmdldCA9IGdbJ0NPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnXQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgZy5oYXNfa2V5KCdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnKToKKyAgICAgICAgY2ZnX3RhcmdldCA9IGdbJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddCiAgICAgICAgIGN1cl90YXJnZXQgPSBvcy5nZXRlbnYoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcsICcnKQogICAgICAgICBpZiBjdXJfdGFyZ2V0ID09ICcnOgogICAgICAgICAgICAgY3VyX3RhcmdldCA9IGNmZ190YXJnZXQKQEAgLTUwMCw2ICs1MDAsMjEgQEAKICAgICAgICAgX2NvbmZpZ192YXJzWydwcmVmaXgnXSA9IFBSRUZJWAogICAgICAgICBfY29uZmlnX3ZhcnNbJ2V4ZWNfcHJlZml4J10gPSBFWEVDX1BSRUZJWAogCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGtlcm5lbF92ZXJzaW9uID0gb3MudW5hbWUoKVsyXSAjIEtlcm5lbCB2ZXJzaW9uICg4LjQuMykKKyAgICAgICAgICAgIG1ham9yX3ZlcnNpb24gPSBpbnQoa2VybmVsX3ZlcnNpb24uc3BsaXQoJy4nKVswXSkKKworICAgICAgICAgICAgaWYgbWFqb3JfdmVyc2lvbiA8IDg6CisgICAgICAgICAgICAgICAgIyBPbiBNYWMgT1MgWCBiZWZvcmUgMTAuNCwgY2hlY2sgaWYgLWFyY2ggYW5kIC1pc3lzcm9vdAorICAgICAgICAgICAgICAgICMgYXJlIGluIENGTEFHUyBvciBMREZMQUdTIGFuZCByZW1vdmUgdGhlbSBpZiB0aGV5IGFyZS4KKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIHdoZW4gYnVpbGRpbmcgZXh0ZW5zaW9ucyBvbiBhIDEwLjMgc3lzdGVtCisgICAgICAgICAgICAgICAgIyB1c2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiBweXRob24uCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycpOgorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1trZXldCisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qICcsICcgJywgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1trZXldID0gZmxhZ3MKKwogICAgIGlmIGFyZ3M6CiAgICAgICAgIHZhbHMgPSBbXQogICAgICAgICBmb3IgbmFtZSBpbiBhcmdzOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CmluZGV4IDU2OTk4YzMuLjMyNDgxOWQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkKQEAgLTQyLDYgKzQyLDQ4IEBACiAjICAgICBzaG91bGQganVzdCBoYXBwaWx5IHN0dWZmIHRoZW0gaW50byB0aGUgcHJlcHJvY2Vzc29yL2NvbXBpbGVyL2xpbmtlcgogIyAgICAgb3B0aW9ucyBhbmQgY2Fycnkgb24uCiAKK2RlZiBfZGFyd2luX2NvbXBpbGVyX2ZpeHVwKGNvbXBpbGVyX3NvLCBjY19hcmdzKToKKyAgICAiIiIKKyAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgc3RyaXAgJy1pc3lzcm9vdCBQQVRIJyBhbmQgJy1hcmNoIEFSQ0gnIGZyb20gdGhlCisgICAgY29tcGlsZSBmbGFncyBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIG9uZSB0aGVtIGluIGV4dHJhX2NvbXBpbGVfZmxhZ3MuCisKKyAgICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlICctYXJjaCBBUkNIJyBhZGRzIGFub3RoZXIgYXJjaGl0ZWN0dXJlIHRvIHRoZQorICAgIGJ1aWxkLCB3aXRob3V0IGEgd2F5IHRvIHJlbW92ZSBhbiBhcmNoaXRlY3R1cmUuIEZ1cnRoZXJtb3JlIEdDQyB3aWxsCisgICAgYmFyZiBpZiBtdWx0aXBsZSAnLWlzeXNyb290JyBhcmd1bWVudHMgYXJlIHByZXNlbnQuCisgICAgIiIiCisgICAgc3RyaXBBcmNoID0gc3RyaXBTeXNyb290ID0gMAorCisgICAgY29tcGlsZXJfc28gPSBsaXN0KGNvbXBpbGVyX3NvKQorICAgIGtlcm5lbF92ZXJzaW9uID0gb3MudW5hbWUoKVsyXSAjIDguNC4zCisgICAgbWFqb3JfdmVyc2lvbiA9IGludChrZXJuZWxfdmVyc2lvbi5zcGxpdCgnLicpWzBdKQorCisgICAgaWYgbWFqb3JfdmVyc2lvbiA8IDg6CisgICAgICAgICMgT1NYIGJlZm9yZSAxMC40LjAsIHRoZXNlIGRvbid0IHN1cHBvcnQgLWFyY2ggYW5kIC1pc3lzcm9vdCBhdAorICAgICAgICAjIGFsbC4KKyAgICAgICAgc3RyaXBBcmNoID0gc3RyaXBTeXNyb290ID0gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHN0cmlwQXJjaCA9ICctYXJjaCcgaW4gY2NfYXJncworICAgICAgICBzdHJpcFN5c3Jvb3QgPSAnLWlzeXNyb290JyBpbiBjY19hcmdzCisKKyAgICBpZiBzdHJpcEFyY2g6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW5kZXggPSBjb21waWxlcl9zby5pbmRleCgnLWFyY2gnKQorICAgICAgICAgICAgICAgICMgU3RyaXAgdGhpcyBhcmd1bWVudCBhbmQgdGhlIG5leHQgb25lOgorICAgICAgICAgICAgICAgIGRlbCBjb21waWxlcl9zb1tpbmRleDppbmRleCsyXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGlmIHN0cmlwU3lzcm9vdDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5kZXggPSBjb21waWxlcl9zby5pbmRleCgnLWlzeXNyb290JykKKyAgICAgICAgICAgICMgU3RyaXAgdGhpcyBhcmd1bWVudCBhbmQgdGhlIG5leHQgb25lOgorICAgICAgICAgICAgZGVsIGNvbXBpbGVyX3NvW2luZGV4OmluZGV4KzFdCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgcmV0dXJuIGNvbXBpbGVyX3NvCisKIGNsYXNzIFVuaXhDQ29tcGlsZXIoQ0NvbXBpbGVyKToKIAogICAgIGNvbXBpbGVyX3R5cGUgPSAndW5peCcKQEAgLTEwOCw4ICsxNTAsMTEgQEAKICAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZwogCiAgICAgZGVmIF9jb21waWxlKHNlbGYsIG9iaiwgc3JjLCBleHQsIGNjX2FyZ3MsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzKToKKyAgICAgICAgY29tcGlsZXJfc28gPSBzZWxmLmNvbXBpbGVyX3NvCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGNvbXBpbGVyX3NvID0gX2Rhcndpbl9jb21waWxlcl9maXh1cChjb21waWxlcl9zbywgY2NfYXJncyArIGV4dHJhX3Bvc3RhcmdzKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLnNwYXduKHNlbGYuY29tcGlsZXJfc28gKyBjY19hcmdzICsgW3NyYywgJy1vJywgb2JqXSArCisgICAgICAgICAgICBzZWxmLnNwYXduKGNvbXBpbGVyX3NvICsgY2NfYXJncyArIFtzcmMsICctbycsIG9ial0gKwogICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncykKICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgogICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yLCBtc2cKQEAgLTE3Miw3ICsyMTcsMjIgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBsaW5rZXIgPSBzZWxmLmxpbmtlcl9zb1s6XQogICAgICAgICAgICAgICAgIGlmIHRhcmdldF9sYW5nID09ICJjKysiIGFuZCBzZWxmLmNvbXBpbGVyX2N4eDoKLSAgICAgICAgICAgICAgICAgICAgbGlua2VyWzBdID0gc2VsZi5jb21waWxlcl9jeHhbMF0KKyAgICAgICAgICAgICAgICAgICAgIyBza2lwIG92ZXIgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0dGluZ3MgaWYgL3Vzci9iaW4vZW52CisgICAgICAgICAgICAgICAgICAgICMgaXMgdXNlZCB0byBzZXQgdXAgdGhlIGxpbmtlcidzIGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIG9uIE9TWC4gTm90ZTogdGhpcyBhc3N1bWVzIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICMgbm9ybWFsIGFuZCBDKysgY29tcGlsZXIgaGF2ZSB0aGUgc2FtZSBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAjIHNldHRpbmdzLgorICAgICAgICAgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKGxpbmtlclswXSkgPT0gImVudiI6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgJz0nIGluIGxpbmtlcltpXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKworICAgICAgICAgICAgICAgICAgICBsaW5rZXJbaV0gPSBzZWxmLmNvbXBpbGVyX2N4eFtpXQorCisgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgICAgICBsaW5rZXIgPSBfZGFyd2luX2NvbXBpbGVyX2ZpeHVwKGxpbmtlciwgbGRfYXJncykKKwogICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24obGlua2VyICsgbGRfYXJncykKICAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKICAgICAgICAgICAgICAgICByYWlzZSBMaW5rRXJyb3IsIG1zZwpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy91dGlsLnB5IGIvTGliL2Rpc3R1dGlscy91dGlsLnB5CmluZGV4IDg4OWJmMTMuLjEyNjVmNGMgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3V0aWwucHkKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICBvc25hbWUgPSBzdHJpbmcubG93ZXIob3NuYW1lKQogICAgIG9zbmFtZSA9IHN0cmluZy5yZXBsYWNlKG9zbmFtZSwgJy8nLCAnJykKICAgICBtYWNoaW5lID0gc3RyaW5nLnJlcGxhY2UobWFjaGluZSwgJyAnLCAnXycpCisgICAgbWFjaGluZSA9IHN0cmluZy5yZXBsYWNlKG1hY2hpbmUsICcvJywgJy0nKQogCiAgICAgaWYgb3NuYW1lWzo1XSA9PSAibGludXgiOgogICAgICAgICAjIEF0IGxlYXN0IG9uIExpbnV4L0ludGVsLCAnbWFjaGluZScgaXMgdGhlIHByb2Nlc3NvciAtLQpAQCAtNjYsNiArNjcsNTQgQEAKICAgICAgICAgbSA9IHJlbF9yZS5tYXRjaChyZWxlYXNlKQogICAgICAgICBpZiBtOgogICAgICAgICAgICAgcmVsZWFzZSA9IG0uZ3JvdXAoKQorICAgIGVsaWYgb3NuYW1lWzo2XSA9PSAiZGFyd2luIjoKKyAgICAgICAgIworICAgICAgICAjIEZvciBvdXIgcHVycG9zZXMsIHdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBzeXN0ZW0gdmVyc2lvbiBmcm9tCisgICAgICAgICMgZGlzdHV0aWxzJyBwZXJzcGVjdGl2ZSBpcyB3aGF0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBpcyBzZXQKKyAgICAgICAgIyB0by4gVGhpcyBtYWtlcyB0aGUgY29tcGF0aWJpbGl0eSBzdG9yeSBhIGJpdCBtb3JlIHNhbmUgYmVjYXVzZSB0aGUKKyAgICAgICAgIyBtYWNoaW5lIGlzIGdvaW5nIHRvIGNvbXBpbGUgYW5kIGxpbmsgYXMgaWYgaXQgd2VyZQorICAgICAgICAjIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC4KKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcnMKKyAgICAgICAgY2ZndmFycyA9IGdldF9jb25maWdfdmFycygpCisKKyAgICAgICAgbWFjdmVyID0gb3MuZW52aXJvbi5nZXQoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpCisgICAgICAgIGlmIG5vdCBtYWN2ZXI6CisgICAgICAgICAgICBtYWN2ZXIgPSBjZmd2YXJzLmdldCgnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykKKworICAgICAgICBpZiBub3QgbWFjdmVyOgorICAgICAgICAgICAgIyBHZXQgdGhlIHN5c3RlbSB2ZXJzaW9uLiBSZWFkaW5nIHRoaXMgcGxpc3QgaXMgYSBkb2N1bWVudGVkCisgICAgICAgICAgICAjIHdheSB0byBnZXQgdGhlIHN5c3RlbSB2ZXJzaW9uIChzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCisgICAgICAgICAgICAjIHRoZSBHZXN0YWx0IE1hbmFnZXIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAjIFdlJ3JlIG9uIGEgcGxhaW4gZGFyd2luIGJveCwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgIyBiZWhhdmlvdXIuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKAorICAgICAgICAgICAgICAgICAgICAgICAgcic8a2V5PlByb2R1Y3RVc2VyVmlzaWJsZVZlcnNpb248L2tleT5ccyonICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHInPHN0cmluZz4oLio/KTwvc3RyaW5nPicsIGYucmVhZCgpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG1hY3ZlciA9ICcuJy5qb2luKG0uZ3JvdXAoMSkuc3BsaXQoJy4nKVs6Ml0pCisgICAgICAgICAgICAgICAgIyBlbHNlOiBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3VyCisKKyAgICAgICAgaWYgbWFjdmVyOgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcnMKKyAgICAgICAgICAgIHJlbGVhc2UgPSBtYWN2ZXIKKyAgICAgICAgICAgIG9zbmFtZSA9ICJtYWNvc3giCisKKworICAgICAgICAgICAgaWYgKHJlbGVhc2UgKyAnLicpIDwgJzEwLjQuJyBhbmQgXAorICAgICAgICAgICAgICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKS5nZXQoJ1VOSVZFUlNBTFNESycsICcnKS5zdHJpcCgpOgorICAgICAgICAgICAgICAgICMgVGhlIHVuaXZlcnNhbCBidWlsZCB3aWxsIGJ1aWxkIGZhdCBiaW5hcmllcywgYnV0IG5vdCBvbgorICAgICAgICAgICAgICAgICMgc3lzdGVtcyBiZWZvcmUgMTAuNAorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JworCisgICAgICAgICAgICBlbGlmIG1hY2hpbmUgaW4gKCdQb3dlclBDJywgJ1Bvd2VyX01hY2ludG9zaCcpOgorICAgICAgICAgICAgICAgICMgUGljayBhIHNhbmUgbmFtZSBmb3IgdGhlIFBQQyBhcmNoaXRlY3R1cmUuCisgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdwcGMnCiAKICAgICByZXR1cm4gIiVzLSVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCiAKZGlmZiAtLWdpdCBhL0xpYi9kb2N0ZXN0LnB5IGIvTGliL2RvY3Rlc3QucHkKaW5kZXggNzBjMzU1YS4uODU3YmMxYSAxMDA2NDQKLS0tIGEvTGliL2RvY3Rlc3QucHkKKysrIGIvTGliL2RvY3Rlc3QucHkKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAnRE9OVF9BQ0NFUFRfQkxBTktMSU5FJywKICAgICAnTk9STUFMSVpFX1dISVRFU1BBQ0UnLAogICAgICdFTExJUFNJUycsCisgICAgJ1NLSVAnLAogICAgICdJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCcsCiAgICAgJ0NPTVBBUklTT05fRkxBR1MnLAogICAgICdSRVBPUlRfVURJRkYnLApAQCAtMTI4LDIwICsxMjksMjEgQEAKIAogT1BUSU9ORkxBR1NfQllfTkFNRSA9IHt9CiBkZWYgcmVnaXN0ZXJfb3B0aW9uZmxhZyhuYW1lKToKLSAgICBmbGFnID0gMSA8PCBsZW4oT1BUSU9ORkxBR1NfQllfTkFNRSkKLSAgICBPUFRJT05GTEFHU19CWV9OQU1FW25hbWVdID0gZmxhZwotICAgIHJldHVybiBmbGFnCisgICAgIyBDcmVhdGUgYSBuZXcgZmxhZyB1bmxlc3MgYG5hbWVgIGlzIGFscmVhZHkga25vd24uCisgICAgcmV0dXJuIE9QVElPTkZMQUdTX0JZX05BTUUuc2V0ZGVmYXVsdChuYW1lLCAxIDw8IGxlbihPUFRJT05GTEFHU19CWV9OQU1FKSkKIAogRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMSA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ0RPTlRfQUNDRVBUX1RSVUVfRk9SXzEnKQogRE9OVF9BQ0NFUFRfQkxBTktMSU5FID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnRE9OVF9BQ0NFUFRfQkxBTktMSU5FJykKIE5PUk1BTElaRV9XSElURVNQQUNFID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnTk9STUFMSVpFX1dISVRFU1BBQ0UnKQogRUxMSVBTSVMgPSByZWdpc3Rlcl9vcHRpb25mbGFnKCdFTExJUFNJUycpCitTS0lQID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnU0tJUCcpCiBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ0lHTk9SRV9FWENFUFRJT05fREVUQUlMJykKIAogQ09NUEFSSVNPTl9GTEFHUyA9IChET05UX0FDQ0VQVF9UUlVFX0ZPUl8xIHwKICAgICAgICAgICAgICAgICAgICAgRE9OVF9BQ0NFUFRfQkxBTktMSU5FIHwKICAgICAgICAgICAgICAgICAgICAgTk9STUFMSVpFX1dISVRFU1BBQ0UgfAogICAgICAgICAgICAgICAgICAgICBFTExJUFNJUyB8CisgICAgICAgICAgICAgICAgICAgIFNLSVAgfAogICAgICAgICAgICAgICAgICAgICBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCkKIAogUkVQT1JUX1VESUZGID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnUkVQT1JUX1VESUZGJykKQEAgLTM1MCw3ICszNTIsNyBAQAogICAgICIiIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXQpOgogICAgICAgICBzZWxmLl9fb3V0ID0gb3V0Ci0gICAgICAgIHBkYi5QZGIuX19pbml0X18oc2VsZikKKyAgICAgICAgcGRiLlBkYi5fX2luaXRfXyhzZWxmLCBzdGRvdXQ9b3V0KQogCiAgICAgZGVmIHRyYWNlX2Rpc3BhdGNoKHNlbGYsICphcmdzKToKICAgICAgICAgIyBSZWRpcmVjdCBzdGRvdXQgdG8gdGhlIGdpdmVuIHN0cmVhbS4KQEAgLTEyMzMsNiArMTIzNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25mbGFncyAmPSB+b3B0aW9uZmxhZwogCisgICAgICAgICAgICAjIElmICdTS0lQJyBpcyBzZXQsIHRoZW4gc2tpcCB0aGlzIGV4YW1wbGUuCisgICAgICAgICAgICBpZiBzZWxmLm9wdGlvbmZsYWdzICYgU0tJUDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCiAgICAgICAgICAgICAjIFJlY29yZCB0aGF0IHdlIHN0YXJ0ZWQgdGhpcyBleGFtcGxlLgogICAgICAgICAgICAgdHJpZXMgKz0gMQogICAgICAgICAgICAgaWYgbm90IHF1aWV0OgpAQCAtMTc5Miw2ICsxNzk4LDcgQEAKICAgICAgICAgRE9OVF9BQ0NFUFRfQkxBTktMSU5FCiAgICAgICAgIE5PUk1BTElaRV9XSElURVNQQUNFCiAgICAgICAgIEVMTElQU0lTCisgICAgICAgIFNLSVAKICAgICAgICAgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKICAgICAgICAgUkVQT1JUX1VESUZGCiAgICAgICAgIFJFUE9SVF9DRElGRgpAQCAtMTkxNCw2ICsxOTIxLDcgQEAKICAgICAgICAgRE9OVF9BQ0NFUFRfQkxBTktMSU5FCiAgICAgICAgIE5PUk1BTElaRV9XSElURVNQQUNFCiAgICAgICAgIEVMTElQU0lTCisgICAgICAgIFNLSVAKICAgICAgICAgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKICAgICAgICAgUkVQT1JUX1VESUZGCiAgICAgICAgIFJFUE9SVF9DRElGRgpkaWZmIC0tZ2l0IGEvTGliL2R1bW15X3RocmVhZC5weSBiL0xpYi9kdW1teV90aHJlYWQucHkKaW5kZXggZDY5ZDg0MC4uMjFmZDAzZiAxMDA2NDQKLS0tIGEvTGliL2R1bW15X3RocmVhZC5weQorKysgYi9MaWIvZHVtbXlfdGhyZWFkLnB5CkBAIC0xMTgsOSArMTE4LDYgQEAKICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwLCB2YWwsIHRiKToKICAgICAgICAgc2VsZi5yZWxlYXNlKCkKIAotICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQogICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgICAiIiJSZWxlYXNlIHRoZSBkdW1teSBsb2NrLiIiIgogICAgICAgICAjIFhYWCBQZXJoYXBzIHNob3VsZG4ndCBhY3R1YWxseSBib3RoZXIgdG8gdGVzdD8gIENvdWxkIGxlYWQKZGlmZiAtLWdpdCBhL0xpYi9lYXN5X2luc3RhbGwucHkgYi9MaWIvZWFzeV9pbnN0YWxsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODdlOTg0Li4wMDAwMDAwCi0tLSBhL0xpYi9lYXN5X2luc3RhbGwucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSIiIlJ1biB0aGUgRWFzeUluc3RhbGwgY29tbWFuZCIiIgotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL19wYXJzZWFkZHIucHkgYi9MaWIvZW1haWwvX3BhcnNlYWRkci5weQppbmRleCA1ODIxZGRmLi5hMDhjNDNlIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvX3BhcnNlYWRkci5weQorKysgYi9MaWIvZW1haWwvX3BhcnNlYWRkci5weQpAQCAtMzY3LDYgKzM2Nyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsaWYgYWxsb3djb21tZW50cyBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgogICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgIyBoYXZlIGFscmVhZHkgYWR2YW5jZWQgcG9zIGZyb20gZ2V0Y29tbWVudAogICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnXFwnOgogICAgICAgICAgICAgICAgIHF1b3RlID0gVHJ1ZQogICAgICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CmluZGV4IGQ5Nzc2OTMuLmExOTdhMzYgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQpAQCAtMjIxNSw2ICsyMjE1LDEyIEBACiAgICAgICAgICAgIFsnZm9vOiA7JywgJyJKYXNvbiBSLiBNYXN0YWxlciIgPGphc29uQGRvbS5haW4+J10pLAogICAgICAgICAgICBbKCcnLCAnJyksICgnSmFzb24gUi4gTWFzdGFsZXInLCAnamFzb25AZG9tLmFpbicpXSkKIAorICAgIGRlZiB0ZXN0X2dldGFkZHJlc3Nlc19lbWJlZGRlZF9jb21tZW50KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHByb3BlciBoYW5kbGluZyBvZiBhIG5lc3RlZCBjb21tZW50IiIiCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBhZGRycyA9IFV0aWxzLmdldGFkZHJlc3NlcyhbJ1VzZXIgKChuZXN0ZWQgY29tbWVudCkpIDxmb29AYmFyLmNvbT4nXSkKKyAgICAgICAgZXEoYWRkcnNbMF1bMV0sICdmb29AYmFyLmNvbScpCisKICAgICBkZWYgdGVzdF91dGlsc19xdW90ZV91bnF1b3RlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgbXNnID0gTWVzc2FnZSgpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKaW5kZXggNGFjMmVlOS4uOTVkMDZjYiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CisrKyBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpAQCAtMjIyMSw2ICsyMjIxLDEyIEBACiAgICAgICAgICAgIFsnZm9vOiA7JywgJyJKYXNvbiBSLiBNYXN0YWxlciIgPGphc29uQGRvbS5haW4+J10pLAogICAgICAgICAgICBbKCcnLCAnJyksICgnSmFzb24gUi4gTWFzdGFsZXInLCAnamFzb25AZG9tLmFpbicpXSkKIAorICAgIGRlZiB0ZXN0X2dldGFkZHJlc3Nlc19lbWJlZGRlZF9jb21tZW50KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHByb3BlciBoYW5kbGluZyBvZiBhIG5lc3RlZCBjb21tZW50IiIiCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBhZGRycyA9IHV0aWxzLmdldGFkZHJlc3NlcyhbJ1VzZXIgKChuZXN0ZWQgY29tbWVudCkpIDxmb29AYmFyLmNvbT4nXSkKKyAgICAgICAgZXEoYWRkcnNbMF1bMV0sICdmb29AYmFyLmNvbScpCisKICAgICBkZWYgdGVzdF91dGlsc19xdW90ZV91bnF1b3RlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgbXNnID0gTWVzc2FnZSgpCmRpZmYgLS1naXQgYS9MaWIvZ3ppcC5weSBiL0xpYi9nemlwLnB5CmluZGV4IDNjMWViZjIuLjg2MGFjY2MgMTAwNjQ0Ci0tLSBhL0xpYi9nemlwLnB5CisrKyBiL0xpYi9nemlwLnB5CkBAIC0xMDcsNiArMTA3LDggQEAKICAgICAgICAgICAgIHNlbGYuZXh0cmFidWYgPSAiIgogICAgICAgICAgICAgc2VsZi5leHRyYXNpemUgPSAwCiAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgICAgICMgU3RhcnRzIHNtYWxsLCBzY2FsZXMgZXhwb25lbnRpYWxseQorICAgICAgICAgICAgc2VsZi5taW5fcmVhZHNpemUgPSAxMDAKIAogICAgICAgICBlbGlmIG1vZGVbMDoxXSA9PSAndycgb3IgbW9kZVswOjFdID09ICdhJzoKICAgICAgICAgICAgIHNlbGYubW9kZSA9IFdSSVRFCkBAIC0zODEsMzIgKzM4MywzNSBAQAogICAgICAgICAgICAgc2VsZi5yZWFkKGNvdW50ICUgMTAyNCkKIAogICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKLSAgICAgICAgaWYgc2l6ZSA8IDA6IHNpemUgPSBzeXMubWF4aW50CisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgc2l6ZSA9IHN5cy5tYXhpbnQKKyAgICAgICAgICAgIHJlYWRzaXplID0gc2VsZi5taW5fcmVhZHNpemUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlYWRzaXplID0gc2l6ZQogICAgICAgICBidWZzID0gW10KLSAgICAgICAgcmVhZHNpemUgPSBtaW4oMTAwLCBzaXplKSAgICAjIFJlYWQgZnJvbSB0aGUgZmlsZSBpbiBzbWFsbCBjaHVua3MKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGlmIHNpemUgPT0gMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIiIuam9pbihidWZzKSAjIFJldHVybiByZXN1bHRpbmcgbGluZQotCisgICAgICAgIHdoaWxlIHNpemUgIT0gMDoKICAgICAgICAgICAgIGMgPSBzZWxmLnJlYWQocmVhZHNpemUpCiAgICAgICAgICAgICBpID0gYy5maW5kKCdcbicpCi0gICAgICAgICAgICBpZiBzaXplIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICMgV2Ugc2V0IGk9c2l6ZSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AgdW5kZXIgdHdvCi0gICAgICAgICAgICAgICAgIyBjb25kaXRpb25zOiAxKSB0aGVyZSdzIG5vIG5ld2xpbmUsIGFuZCB0aGUgY2h1bmsgaXMKLSAgICAgICAgICAgICAgICAjIGxhcmdlciB0aGFuIHNpemUsIG9yIDIpIHRoZXJlIGlzIGEgbmV3bGluZSwgYnV0IHRoZQotICAgICAgICAgICAgICAgICMgcmVzdWx0aW5nIGxpbmUgd291bGQgYmUgbG9uZ2VyIHRoYW4gJ3NpemUnLgotICAgICAgICAgICAgICAgIGlmIGk9PS0xIGFuZCBsZW4oYykgPiBzaXplOiBpPXNpemUtMQotICAgICAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSBpOiBpID0gc2l6ZSAtMQorCisgICAgICAgICAgICAjIFdlIHNldCBpPXNpemUgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wIHVuZGVyIHR3bworICAgICAgICAgICAgIyBjb25kaXRpb25zOiAxKSB0aGVyZSdzIG5vIG5ld2xpbmUsIGFuZCB0aGUgY2h1bmsgaXMKKyAgICAgICAgICAgICMgbGFyZ2VyIHRoYW4gc2l6ZSwgb3IgMikgdGhlcmUgaXMgYSBuZXdsaW5lLCBidXQgdGhlCisgICAgICAgICAgICAjIHJlc3VsdGluZyBsaW5lIHdvdWxkIGJlIGxvbmdlciB0aGFuICdzaXplJy4KKyAgICAgICAgICAgIGlmIChzaXplIDw9IGkpIG9yIChpID09IC0xIGFuZCBsZW4oYykgPiBzaXplKToKKyAgICAgICAgICAgICAgICBpID0gc2l6ZSAtIDEKIAogICAgICAgICAgICAgaWYgaSA+PSAwIG9yIGMgPT0gJyc6Ci0gICAgICAgICAgICAgICAgYnVmcy5hcHBlbmQoY1s6aSsxXSkgICAgIyBBZGQgcG9ydGlvbiBvZiBsYXN0IGNodW5rCi0gICAgICAgICAgICAgICAgc2VsZi5fdW5yZWFkKGNbaSsxOl0pICAgIyBQdXNoIGJhY2sgcmVzdCBvZiBjaHVuawotICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2luKGJ1ZnMpICAgICMgUmV0dXJuIHJlc3VsdGluZyBsaW5lCisgICAgICAgICAgICAgICAgYnVmcy5hcHBlbmQoY1s6aSArIDFdKSAgICAjIEFkZCBwb3J0aW9uIG9mIGxhc3QgY2h1bmsKKyAgICAgICAgICAgICAgICBzZWxmLl91bnJlYWQoY1tpICsgMTpdKSAgICMgUHVzaCBiYWNrIHJlc3Qgb2YgY2h1bmsKKyAgICAgICAgICAgICAgICBicmVhawogCiAgICAgICAgICAgICAjIEFwcGVuZCBjaHVuayB0byBsaXN0LCBkZWNyZWFzZSAnc2l6ZScsCiAgICAgICAgICAgICBidWZzLmFwcGVuZChjKQogICAgICAgICAgICAgc2l6ZSA9IHNpemUgLSBsZW4oYykKICAgICAgICAgICAgIHJlYWRzaXplID0gbWluKHNpemUsIHJlYWRzaXplICogMikKKyAgICAgICAgaWYgcmVhZHNpemUgPiBzZWxmLm1pbl9yZWFkc2l6ZToKKyAgICAgICAgICAgIHNlbGYubWluX3JlYWRzaXplID0gbWluKHJlYWRzaXplLCBzZWxmLm1pbl9yZWFkc2l6ZSAqIDIsIDUxMikKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oYnVmcykgIyBSZXR1cm4gcmVzdWx0aW5nIGxpbmUKIAogICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQ9MCk6CiAgICAgICAgICMgTmVnYXRpdmUgbnVtYmVycyByZXN1bHQgaW4gcmVhZGluZyBhbGwgdGhlIGxpbmVzCmRpZmYgLS1naXQgYS9MaWIvaHR0cGxpYi5weSBiL0xpYi9odHRwbGliLnB5CmluZGV4IGI0YmQ1MzYuLjM2MzgxZGUgMTAwNjQ0Ci0tLSBhL0xpYi9odHRwbGliLnB5CisrKyBiL0xpYi9odHRwbGliLnB5CkBAIC03OTYsMTEgKzc5NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICBuaWwsIG5ldGxvYywgbmlsLCBuaWwsIG5pbCA9IHVybHNwbGl0KHVybCkKIAogICAgICAgICAgICAgICAgIGlmIG5ldGxvYzoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0hvc3QnLCBuZXRsb2MuZW5jb2RlKCJpZG5hIikpCi0gICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvcnQgPT0gSFRUUF9QT1JUOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignSG9zdCcsIHNlbGYuaG9zdC5lbmNvZGUoImlkbmEiKSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jX2VuYyA9IG5ldGxvYy5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldGxvY19lbmMgPSBuZXRsb2MuZW5jb2RlKCJpZG5hIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0hvc3QnLCBuZXRsb2NfZW5jKQogICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdIb3N0JywgIiVzOiVzIiAlIChzZWxmLmhvc3QuZW5jb2RlKCJpZG5hIiksIHNlbGYucG9ydCkpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfZW5jID0gc2VsZi5ob3N0LmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9lbmMgPSBzZWxmLmhvc3QuZW5jb2RlKCJpZG5hIikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5wb3J0ID09IEhUVFBfUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdIb3N0JywgaG9zdF9lbmMpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignSG9zdCcsICIlczolcyIgJSAoaG9zdF9lbmMsIHNlbGYucG9ydCkpCiAKICAgICAgICAgICAgICMgbm90ZTogd2UgYXJlIGFzc3VtaW5nIHRoYXQgY2xpZW50cyB3aWxsIG5vdCBhdHRlbXB0IHRvIHNldCB0aGVzZQogICAgICAgICAgICAgIyAgICAgICBoZWFkZXJzIHNpbmNlICp0aGlzKiBsaWJyYXJ5IG11c3QgZGVhbCB3aXRoIHRoZQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTkVXUy50eHQgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dAppbmRleCA4MTYzMzMwLi4yNWU1ZDQwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ORVdTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dApAQCAtMSwzICsxLDggQEAKK1doYXQncyBOZXcgaW4gSURMRSAxLjJhMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjctQVBSLTIwMDYqCisKIFdoYXQncyBOZXcgaW4gSURMRSAxLjJhMT8KID09PT09PT09PT09PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkgYi9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQppbmRleCAzZGIxZTBhLi44OTI0Zjc5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQorKysgYi9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQpAQCAtMTUxLDYgKzE1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAjIE1hYyBTYWZhcmkgaW5zaXN0cyBvbiB1c2luZyB0aGUgVVJJIGZvcm0gZm9yIGxvY2FsIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gbGlzdChzZWxmLnJlc3VsdCkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRbMV0gPSAiZmlsZTovLyIgKyBwYXRoCiAgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5IGIvTGliL2lkbGVsaWIvaWRsZXZlci5weQppbmRleCBmYmRlNTZjLi5iN2RlYjNmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKQEAgLTEgKzEgQEAKLUlETEVfVkVSU0lPTiA9ICIxLjJhMSIKK0lETEVfVkVSU0lPTiA9ICIxLjJhMiIKZGlmZiAtLWdpdCBhL0xpYi9pbXB1dGlsLnB5IGIvTGliL2ltcHV0aWwucHkKaW5kZXggZTZhZDdlYy4uOGE0OWJiMSAxMDA2NDQKLS0tIGEvTGliL2ltcHV0aWwucHkKKysrIGIvTGliL2ltcHV0aWwucHkKQEAgLTEzMSw5ICsxMzEsMTIgQEAKICAgICAgICAgaWYgaW1wb3J0ZXI6CiAgICAgICAgICAgICByZXR1cm4gaW1wb3J0ZXIuX2ZpbmlzaF9pbXBvcnQodG9wX21vZHVsZSwgcGFydHNbMTpdLCBmcm9tbGlzdCkKIAotICAgICAgICAjIEdycnIsIHNvbWUgcGVvcGxlICJpbXBvcnQgb3MucGF0aCIKKyAgICAgICAgIyBHcnJyLCBzb21lIHBlb3BsZSAiaW1wb3J0IG9zLnBhdGgiIG9yIGRvICJmcm9tIG9zLnBhdGggaW1wb3J0IC4uLiIKICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyIGFuZCBoYXNhdHRyKHRvcF9tb2R1bGUsIHBhcnRzWzFdKToKLSAgICAgICAgICAgIHJldHVybiB0b3BfbW9kdWxlCisgICAgICAgICAgICBpZiBmcm9tbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cih0b3BfbW9kdWxlLCBwYXJ0c1sxXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvcF9tb2R1bGUKIAogICAgICAgICAjIElmIHRoZSBpbXBvcnRlciBkb2VzIG5vdCBleGlzdCwgdGhlbiB3ZSBoYXZlIHRvIGJhaWwuIEEgbWlzc2luZwogICAgICAgICAjIGltcG9ydGVyIG1lYW5zIHRoYXQgc29tZXRoaW5nIGVsc2UgaW1wb3J0ZWQgdGhlIG1vZHVsZSwgYW5kIHdlIGhhdmUKZGlmZiAtLWdpdCBhL0xpYi9pbnNwZWN0LnB5IGIvTGliL2luc3BlY3QucHkKaW5kZXggMmU0ZDk4Ny4uYmY3ZjAwNiAxMDA2NDQKLS0tIGEvTGliL2luc3BlY3QucHkKKysrIGIvTGliL2luc3BlY3QucHkKQEAgLTM1Myw3ICszNTMsMTMgQEAKICAgICAgICAgaWYgJ2InIGluIG1vZGUgYW5kIHN0cmluZy5sb3dlcihmaWxlbmFtZVstbGVuKHN1ZmZpeCk6XSkgPT0gc3VmZml4OgogICAgICAgICAgICAgIyBMb29rcyBsaWtlIGEgYmluYXJ5IGZpbGUuICBXZSB3YW50IHRvIG9ubHkgcmV0dXJuIGEgdGV4dCBmaWxlLgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkgb3IgaGFzYXR0cihnZXRtb2R1bGUob2JqZWN0KSwgJ19fbG9hZGVyX18nKToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBmaWxlbmFtZQorICAgICMgVWdseSBidXQgbmVjZXNzYXJ5IC0gJzxzdGRpbj4nIGFuZCAnPHN0cmluZz4nIG1lYW4gdGhhdCBnZXRtb2R1bGUoKQorICAgICMgd291bGQgaW5maW5pdGVseSByZWN1cnNlLCBiZWNhdXNlIHRoZXkncmUgbm90IHJlYWwgZmlsZXMgbm9yIGxvYWRhYmxlCisgICAgIyBOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IHdyaXRpbmcgYSBQRVAgMzAyIGxvYWRlciB0aGF0IHVzZXMgJzwnCisgICAgIyBhdCB0aGUgc3RhcnQgb2YgYSBmaWxlbmFtZSBpcyBub3cgbm90IGEgZ29vZCBpZGVhLiAgOigKKyAgICBpZiBmaWxlbmFtZVs6MV0hPSc8JyBhbmQgaGFzYXR0cihnZXRtb2R1bGUob2JqZWN0KSwgJ19fbG9hZGVyX18nKToKICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAKIGRlZiBnZXRhYnNmaWxlKG9iamVjdCk6CkBAIC00MDYsNyArNDEyLDExIEBACiAgICAgaW4gdGhlIGZpbGUgYW5kIHRoZSBsaW5lIG51bWJlciBpbmRleGVzIGEgbGluZSBpbiB0aGF0IGxpc3QuICBBbiBJT0Vycm9yCiAgICAgaXMgcmFpc2VkIGlmIHRoZSBzb3VyY2UgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkLiIiIgogICAgIGZpbGUgPSBnZXRzb3VyY2VmaWxlKG9iamVjdCkgb3IgZ2V0ZmlsZShvYmplY3QpCi0gICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZSwgZ2V0bW9kdWxlKG9iamVjdCkuX19kaWN0X18pCisgICAgbW9kdWxlID0gZ2V0bW9kdWxlKG9iamVjdCkKKyAgICBpZiBtb2R1bGU6CisgICAgICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKGZpbGUsIG1vZHVsZS5fX2RpY3RfXykKKyAgICBlbHNlOgorICAgICAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlKQogICAgIGlmIG5vdCBsaW5lczoKICAgICAgICAgcmFpc2UgSU9FcnJvcignY291bGQgbm90IGdldCBzb3VyY2UgY29kZScpCiAKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdHVydGxlLnB5IGIvTGliL2xpYi10ay90dXJ0bGUucHkKaW5kZXggYTM5NTYxMy4uZDY4ZTQwNSAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90dXJ0bGUucHkKKysrIGIvTGliL2xpYi10ay90dXJ0bGUucHkKQEAgLTEsOCArMSwyNCBAQAogIyBMb2dvTWF0aW9uLWxpa2UgdHVydGxlIGdyYXBoaWNzCiAKKyIiIgorVHVydGxlIGdyYXBoaWNzIGlzIGEgcG9wdWxhciB3YXkgZm9yIGludHJvZHVjaW5nIHByb2dyYW1taW5nIHRvCitraWRzLiBJdCB3YXMgcGFydCBvZiB0aGUgb3JpZ2luYWwgTG9nbyBwcm9ncmFtbWluZyBsYW5ndWFnZSBkZXZlbG9wZWQKK2J5IFdhbGx5IEZldXJ6ZWlnIGFuZCBTZXltb3VyIFBhcGVydCBpbiAxOTY2LgorCitJbWFnaW5lIGEgcm9ib3RpYyB0dXJ0bGUgc3RhcnRpbmcgYXQgKDAsIDApIGluIHRoZSB4LXkgcGxhbmUuIEdpdmUgaXQKK3RoZSBjb21tYW5kIHR1cnRsZS5mb3J3YXJkKDE1KSwgYW5kIGl0IG1vdmVzIChvbi1zY3JlZW4hKSAxNSBwaXhlbHMgaW4KK3RoZSBkaXJlY3Rpb24gaXQgaXMgZmFjaW5nLCBkcmF3aW5nIGEgbGluZSBhcyBpdCBtb3Zlcy4gR2l2ZSBpdCB0aGUKK2NvbW1hbmQgdHVydGxlLmxlZnQoMjUpLCBhbmQgaXQgcm90YXRlcyBpbi1wbGFjZSAyNSBkZWdyZWVzIGNsb2Nrd2lzZS4KKworQnkgY29tYmluaW5nIHRvZ2V0aGVyIHRoZXNlIGFuZCBzaW1pbGFyIGNvbW1hbmRzLCBpbnRyaWNhdGUgc2hhcGVzIGFuZAorcGljdHVyZXMgY2FuIGVhc2lseSBiZSBkcmF3bi4KKyIiIgorCiBmcm9tIG1hdGggaW1wb3J0ICogIyBBbHNvIGZvciBleHBvcnQKIGltcG9ydCBUa2ludGVyCiAKK3NwZWVkcyA9IFsnZmFzdGVzdCcsICdmYXN0JywgJ25vcm1hbCcsICdzbG93JywgJ3Nsb3dlc3QnXQorCiBjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIHBhc3MKIApAQCAtMTMsMTcgKzI5LDQyIEBACiAgICAgICAgIHNlbGYuX2l0ZW1zID0gW10KICAgICAgICAgc2VsZi5fdHJhY2luZyA9IDEKICAgICAgICAgc2VsZi5fYXJyb3cgPSAwCisgICAgICAgIHNlbGYuX2RlbGF5ID0gMTAgICAgICMgZGVmYXVsdCBkZWxheSBmb3IgZHJhd2luZwogICAgICAgICBzZWxmLmRlZ3JlZXMoKQogICAgICAgICBzZWxmLnJlc2V0KCkKIAogICAgIGRlZiBkZWdyZWVzKHNlbGYsIGZ1bGxjaXJjbGU9MzYwLjApOgorICAgICAgICAiIiIgU2V0IGFuZ2xlIG1lYXN1cmVtZW50IHVuaXRzIHRvIGRlZ3JlZXMuCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS5kZWdyZWVzKCkKKyAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX2Z1bGxjaXJjbGUgPSBmdWxsY2lyY2xlCiAgICAgICAgIHNlbGYuX2ludnJhZGlhbiA9IHBpIC8gKGZ1bGxjaXJjbGUgKiAwLjUpCiAKICAgICBkZWYgcmFkaWFucyhzZWxmKToKKyAgICAgICAgIiIiIFNldCB0aGUgYW5nbGUgbWVhc3VyZW1lbnQgdW5pdHMgdG8gcmFkaWFucy4KKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLnJhZGlhbnMoKQorICAgICAgICAiIiIKICAgICAgICAgc2VsZi5kZWdyZWVzKDIuMCpwaSkKIAogICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiIENsZWFyIHRoZSBzY3JlZW4sIHJlLWNlbnRlciB0aGUgcGVuLCBhbmQgc2V0IHZhcmlhYmxlcyB0bworICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZXMuCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFswLjAsIC0yMi4wXQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAxMDAuMAorICAgICAgICA+Pj4gdHVydGxlLnJlc2V0KCkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFswLjAsIDAuMF0KKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgMC4wCisgICAgICAgICIiIgogICAgICAgICBjYW52YXMgPSBzZWxmLl9jYW52YXMKICAgICAgICAgc2VsZi5fY2FudmFzLnVwZGF0ZSgpCiAgICAgICAgIHdpZHRoID0gY2FudmFzLndpbmZvX3dpZHRoKCkKQEAgLTQ1LDYgKzg2LDExIEBACiAgICAgICAgIGNhbnZhcy5fcm9vdCgpLnRrcmFpc2UoKQogCiAgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAiIiIgQ2xlYXIgdGhlIHNjcmVlbi4gVGhlIHR1cnRsZSBkb2VzIG5vdCBtb3ZlLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUuY2xlYXIoKQorICAgICAgICAiIiIKICAgICAgICAgc2VsZi5maWxsKDApCiAgICAgICAgIGNhbnZhcyA9IHNlbGYuX2NhbnZhcwogICAgICAgICBpdGVtcyA9IHNlbGYuX2l0ZW1zCkBAIC01NSwzNyArMTAxLDEzMCBAQAogICAgICAgICBzZWxmLl9kcmF3X3R1cnRsZSgpCiAKICAgICBkZWYgdHJhY2VyKHNlbGYsIGZsYWcpOgorICAgICAgICAiIiIgU2V0IHRyYWNpbmcgb24gaWYgZmxhZyBpcyBUcnVlLCBhbmQgb2ZmIGlmIGl0IGlzIEZhbHNlLgorICAgICAgICBUcmFjaW5nIG1lYW5zIGxpbmUgYXJlIGRyYXduIG1vcmUgc2xvd2x5LCB3aXRoIGFuCisgICAgICAgIGFuaW1hdGlvbiBvZiBhbiBhcnJvdyBhbG9uZyB0aGUgbGluZS4KKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLnRyYWNlcihGYWxzZSkgICAjIHR1cm5zIG9mZiBUcmFjZXIKKyAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX3RyYWNpbmcgPSBmbGFnCiAgICAgICAgIGlmIG5vdCBzZWxmLl90cmFjaW5nOgogICAgICAgICAgICAgc2VsZi5fZGVsZXRlX3R1cnRsZSgpCiAgICAgICAgIHNlbGYuX2RyYXdfdHVydGxlKCkKIAogICAgIGRlZiBmb3J3YXJkKHNlbGYsIGRpc3RhbmNlKToKKyAgICAgICAgIiIiIEdvIGZvcndhcmQgZGlzdGFuY2Ugc3RlcHMuCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFswLjAsIDAuMF0KKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDI1KQorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgWzI1LjAsIDAuMF0KKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKC03NSkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFstNTAuMCwgMC4wXQorICAgICAgICAiIiIKICAgICAgICAgeDAsIHkwID0gc3RhcnQgPSBzZWxmLl9wb3NpdGlvbgogICAgICAgICB4MSA9IHgwICsgZGlzdGFuY2UgKiBjb3Moc2VsZi5fYW5nbGUqc2VsZi5faW52cmFkaWFuKQogICAgICAgICB5MSA9IHkwIC0gZGlzdGFuY2UgKiBzaW4oc2VsZi5fYW5nbGUqc2VsZi5faW52cmFkaWFuKQogICAgICAgICBzZWxmLl9nb3RvKHgxLCB5MSkKIAogICAgIGRlZiBiYWNrd2FyZChzZWxmLCBkaXN0YW5jZSk6CisgICAgICAgICIiIiBHbyBiYWNrd2FyZHMgZGlzdGFuY2Ugc3RlcHMuCisKKyAgICAgICAgVGhlIHR1cnRsZSdzIGhlYWRpbmcgZG9lcyBub3QgY2hhbmdlLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICBbMC4wLCAwLjBdCisgICAgICAgID4+PiB0dXJ0bGUuYmFja3dhcmQoMzApCisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICBbLTMwLjAsIDAuMF0KKyAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuZm9yd2FyZCgtZGlzdGFuY2UpCiAKICAgICBkZWYgbGVmdChzZWxmLCBhbmdsZSk6CisgICAgICAgICIiIiBUdXJuIGxlZnQgYW5nbGUgdW5pdHMgKHVuaXRzIGFyZSBieSBkZWZhdWx0IGRlZ3JlZXMsCisgICAgICAgIGJ1dCBjYW4gYmUgc2V0IHZpYSB0aGUgZGVncmVlcygpIGFuZCByYWRpYW5zKCkgZnVuY3Rpb25zLikKKworICAgICAgICBXaGVuIHZpZXdlZCBmcm9tIGFib3ZlLCB0aGUgdHVybmluZyBoYXBwZW5zIGluLXBsYWNlIGFyb3VuZAorICAgICAgICBpdHMgZnJvbnQgdGlwLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDIyCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg0NSkKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgNjcuMAorICAgICAgICAiIiIKICAgICAgICAgc2VsZi5fYW5nbGUgPSAoc2VsZi5fYW5nbGUgKyBhbmdsZSkgJSBzZWxmLl9mdWxsY2lyY2xlCiAgICAgICAgIHNlbGYuX2RyYXdfdHVydGxlKCkKIAogICAgIGRlZiByaWdodChzZWxmLCBhbmdsZSk6CisgICAgICAgICIiIiBUdXJuIHJpZ2h0IGFuZ2xlIHVuaXRzICh1bml0cyBhcmUgYnkgZGVmYXVsdCBkZWdyZWVzLAorICAgICAgICBidXQgY2FuIGJlIHNldCB2aWEgdGhlIGRlZ3JlZXMoKSBhbmQgcmFkaWFucygpIGZ1bmN0aW9ucy4pCisKKyAgICAgICAgV2hlbiB2aWV3ZWQgZnJvbSBhYm92ZSwgdGhlIHR1cm5pbmcgaGFwcGVucyBpbi1wbGFjZSBhcm91bmQKKyAgICAgICAgaXRzIGZyb250IHRpcC4KKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAyMgorICAgICAgICA+Pj4gdHVydGxlLnJpZ2h0KDQ1KQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAzMzcuMAorICAgICAgICAiIiIKICAgICAgICAgc2VsZi5sZWZ0KC1hbmdsZSkKIAogICAgIGRlZiB1cChzZWxmKToKKyAgICAgICAgIiIiIFB1bGwgdGhlIHBlbiB1cCAtLSBubyBkcmF3aW5nIHdoZW4gbW92aW5nLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUudXAoKQorICAgICAgICAiIiIKICAgICAgICAgc2VsZi5fZHJhd2luZyA9IDAKIAogICAgIGRlZiBkb3duKHNlbGYpOgorICAgICAgICAiIiIgUHV0IHRoZSBwZW4gZG93biAtLSBkcmF3IHdoZW4gbW92aW5nLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUuZG93bigpCisgICAgICAgICIiIgogICAgICAgICBzZWxmLl9kcmF3aW5nID0gMQogCiAgICAgZGVmIHdpZHRoKHNlbGYsIHdpZHRoKToKKyAgICAgICAgIiIiIFNldCB0aGUgbGluZSB0byB0aGlja25lc3MgdG8gd2lkdGguCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS53aWR0aCgxMCkKKyAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX3dpZHRoID0gZmxvYXQod2lkdGgpCiAKICAgICBkZWYgY29sb3Ioc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiIgU2V0IHRoZSBwZW4gY29sb3IuCisKKyAgICAgICAgVGhyZWUgaW5wdXQgZm9ybWF0cyBhcmUgYWxsb3dlZDoKKworICAgICAgICAgICAgY29sb3IocykKKyAgICAgICAgICAgIHMgaXMgYSBUayBzcGVjaWZpY2F0aW9uIHN0cmluZywgc3VjaCBhcyAicmVkIiBvciAieWVsbG93IgorCisgICAgICAgICAgICBjb2xvcigociwgZywgYikpCisgICAgICAgICAgICAqYSB0dXBsZSogb2YgciwgZywgYW5kIGIsIHdoaWNoIHJlcHJlc2VudCwgYW4gUkdCIGNvbG9yLAorICAgICAgICAgICAgYW5kIGVhY2ggb2YgciwgZywgYW5kIGIgYXJlIGluIHRoZSByYW5nZSBbMC4uMV0KKworICAgICAgICAgICAgY29sb3IociwgZywgYikKKyAgICAgICAgICAgIHIsIGcsIGFuZCBiIHJlcHJlc2VudCBhbiBSR0IgY29sb3IsIGFuZCBlYWNoIG9mIHIsIGcsIGFuZCBiCisgICAgICAgICAgICBhcmUgaW4gdGhlIHJhbmdlIFswLi4xXQorCisgICAgICAgIEV4YW1wbGU6CisKKyAgICAgICAgPj4+IHR1cnRsZS5jb2xvcignYnJvd24nKQorICAgICAgICA+Pj4gdHVwID0gKDAuMiwgMC44LCAwLjU1KQorICAgICAgICA+Pj4gdHVydGxlLmNvbG9yKHR1cCkKKyAgICAgICAgPj4+IHR1cnRsZS5jb2xvcigwLCAuNSwgMCkKKyAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJubyBjb2xvciBhcmd1bWVudHMiCiAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgpAQCAtMTE4LDExICsyNTcsMjAgQEAKICAgICAgICAgc2VsZi5fY29sb3IgPSBjb2xvcgogICAgICAgICBzZWxmLl9kcmF3X3R1cnRsZSgpCiAKLSAgICBkZWYgd3JpdGUoc2VsZiwgYXJnLCBtb3ZlPTApOgotICAgICAgICB4LCB5ID0gc3RhcnQgPSBzZWxmLl9wb3NpdGlvbgorICAgIGRlZiB3cml0ZShzZWxmLCB0ZXh0LCBtb3ZlPUZhbHNlKToKKyAgICAgICAgIiIiIFdyaXRlIHRleHQgYXQgdGhlIGN1cnJlbnQgcGVuIHBvc2l0aW9uLgorCisgICAgICAgIElmIG1vdmUgaXMgdHJ1ZSwgdGhlIHBlbiBpcyBtb3ZlZCB0byB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lcgorICAgICAgICBvZiB0aGUgdGV4dC4gQnkgZGVmYXVsdCwgbW92ZSBpcyBGYWxzZS4KKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLndyaXRlKCdUaGUgcmFjZSBpcyBvbiEnKQorICAgICAgICA+Pj4gdHVydGxlLndyaXRlKCdIb21lID0gKDAsIDApJywgVHJ1ZSkKKyAgICAgICAgIiIiCisgICAgICAgIHgsIHkgID0gc2VsZi5fcG9zaXRpb24KICAgICAgICAgeCA9IHgtMSAjIGNvcnJlY3Rpb24gLS0gY2FsaWJyYXRlZCBmb3IgV2luZG93cwogICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV90ZXh0KHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1zdHIoYXJnKSwgYW5jaG9yPSJzdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1zdHIodGV4dCksIGFuY2hvcj0ic3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9c2VsZi5fY29sb3IpCiAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKQogICAgICAgICBpZiBtb3ZlOgpAQCAtMTMxLDYgKzI3OSwyMCBAQAogICAgICAgICBzZWxmLl9kcmF3X3R1cnRsZSgpCiAKICAgICBkZWYgZmlsbChzZWxmLCBmbGFnKToKKyAgICAgICAgIiIiIENhbGwgZmlsbCgxKSBiZWZvcmUgZHJhd2luZyB0aGUgc2hhcGUgeW91CisgICAgICAgICB3YW50IHRvIGZpbGwsIGFuZCBmaWxsKDApIHdoZW4gZG9uZS4KKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLmZpbGwoMSkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5maWxsKDApCisgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLl9maWxsaW5nOgogICAgICAgICAgICAgcGF0aCA9IHR1cGxlKHNlbGYuX3BhdGgpCiAgICAgICAgICAgICBzbW9vdGggPSBzZWxmLl9maWxsaW5nIDwgMApAQCAtMTM5LDcgKzMwMSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnZmlsbCc6IHNlbGYuX2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ntb290aCc6IHNtb290aH0pCiAgICAgICAgICAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pCi0gICAgICAgICAgICAgICAgc2VsZi5fY2FudmFzLmxvd2VyKGl0ZW0pCiAgICAgICAgICAgICAgICAgaWYgc2VsZi5fdG9maWxsOgogICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl90b2ZpbGw6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYW52YXMuaXRlbWNvbmZpZ3VyZShpdGVtLCBmaWxsPXNlbGYuX2NvbG9yKQpAQCAtMTUxLDE2ICszMTIsNjIgQEAKICAgICAgICAgICAgIHNlbGYuX3BhdGguYXBwZW5kKHNlbGYuX3Bvc2l0aW9uKQogICAgICAgICBzZWxmLmZvcndhcmQoMCkKIAorICAgIGRlZiBiZWdpbl9maWxsKHNlbGYpOgorICAgICAgICAiIiIgQ2FsbGVkIGp1c3QgYmVmb3JlIGRyYXdpbmcgYSBzaGFwZSB0byBiZSBmaWxsZWQuCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS5iZWdpbl9maWxsKCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5lbmRfZmlsbCgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZpbGwoMSkKKworICAgIGRlZiBlbmRfZmlsbChzZWxmKToKKyAgICAgICAgIiIiIENhbGxlZCBhZnRlciBkcmF3aW5nIGEgc2hhcGUgdG8gYmUgZmlsbGVkLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUuYmVnaW5fZmlsbCgpCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUuZW5kX2ZpbGwoKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxsKDApCisKICAgICBkZWYgY2lyY2xlKHNlbGYsIHJhZGl1cywgZXh0ZW50PU5vbmUpOgorICAgICAgICAiIiIgRHJhdyBhIGNpcmNsZSB3aXRoIGdpdmVuIHJhZGl1cy4KKyAgICAgICAgVGhlIGNlbnRlciBpcyByYWRpdXMgdW5pdHMgbGVmdCBvZiB0aGUgdHVydGxlOyBleHRlbnQKKyAgICAgICAgZGV0ZXJtaW5lcyB3aGljaCBwYXJ0IG9mIHRoZSBjaXJjbGUgaXMgZHJhd24uIElmIG5vdCBnaXZlbiwKKyAgICAgICAgdGhlIGVudGlyZSBjaXJjbGUgaXMgZHJhd24uCisKKyAgICAgICAgSWYgZXh0ZW50IGlzIG5vdCBhIGZ1bGwgY2lyY2xlLCBvbmUgZW5kcG9pbnQgb2YgdGhlIGFyYyBpcyB0aGUKKyAgICAgICAgY3VycmVudCBwZW4gcG9zaXRpb24uIFRoZSBhcmMgaXMgZHJhd24gaW4gYSBjb3VudGVyIGNsb2Nrd2lzZQorICAgICAgICBkaXJlY3Rpb24gaWYgcmFkaXVzIGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgaW4gYSBjbG9ja3dpc2UKKyAgICAgICAgZGlyZWN0aW9uLiBJbiB0aGUgcHJvY2VzcywgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHVydGxlIGlzCisgICAgICAgIGNoYW5nZWQgYnkgdGhlIGFtb3VudCBvZiB0aGUgZXh0ZW50LgorCisgICAgICAgID4+PiB0dXJ0bGUuY2lyY2xlKDUwKQorICAgICAgICA+Pj4gdHVydGxlLmNpcmNsZSgxMjAsIDE4MCkgICMgaGFsZiBhIGNpcmNsZQorICAgICAgICAiIiIKICAgICAgICAgaWYgZXh0ZW50IGlzIE5vbmU6CiAgICAgICAgICAgICBleHRlbnQgPSBzZWxmLl9mdWxsY2lyY2xlCiAgICAgICAgIHgwLCB5MCA9IHNlbGYuX3Bvc2l0aW9uCiAgICAgICAgIHhjID0geDAgLSByYWRpdXMgKiBzaW4oc2VsZi5fYW5nbGUgKiBzZWxmLl9pbnZyYWRpYW4pCiAgICAgICAgIHljID0geTAgLSByYWRpdXMgKiBjb3Moc2VsZi5fYW5nbGUgKiBzZWxmLl9pbnZyYWRpYW4pCiAgICAgICAgIGlmIHJhZGl1cyA+PSAwLjA6Ci0gICAgICAgICAgICBzdGFydCA9IHNlbGYuX2FuZ2xlIC0gOTAuMAorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLl9hbmdsZSAtIChzZWxmLl9mdWxsY2lyY2xlIC8gNC4wKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3RhcnQgPSBzZWxmLl9hbmdsZSArIDkwLjAKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5fYW5nbGUgKyAoc2VsZi5fZnVsbGNpcmNsZSAvIDQuMCkKICAgICAgICAgICAgIGV4dGVudCA9IC1leHRlbnQKICAgICAgICAgaWYgc2VsZi5fZmlsbGluZzoKICAgICAgICAgICAgIGlmIGFicyhleHRlbnQpID49IHNlbGYuX2Z1bGxjaXJjbGU6CkBAIC0yMDIsNDAgKzQwOSwxNDUgQEAKICAgICAgICAgc2VsZi5fZHJhd190dXJ0bGUoKQogCiAgICAgZGVmIGhlYWRpbmcoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm4gdGhlIHR1cnRsZSdzIGN1cnJlbnQgaGVhZGluZy4KKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICA2Ny4wCisgICAgICAgICIiIgogICAgICAgICByZXR1cm4gc2VsZi5fYW5nbGUKIAogICAgIGRlZiBzZXRoZWFkaW5nKHNlbGYsIGFuZ2xlKToKKyAgICAgICAgIiIiIFNldCB0aGUgdHVydGxlIGZhY2luZyB0aGUgZ2l2ZW4gYW5nbGUuCisKKyAgICAgICAgSGVyZSBhcmUgc29tZSBjb21tb24gZGlyZWN0aW9ucyBpbiBkZWdyZWVzOgorCisgICAgICAgICAgIDAgLSBlYXN0CisgICAgICAgICAgOTAgLSBub3J0aAorICAgICAgICAgMTgwIC0gd2VzdAorICAgICAgICAgMjcwIC0gc291dGgKKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLnNldGhlYWRpbmcoOTApCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDkwCisgICAgICAgID4+PiB0dXJ0bGUuc2V0aGVhZGluZygxMjgpCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDEyOAorICAgICAgICAiIiIKICAgICAgICAgc2VsZi5fYW5nbGUgPSBhbmdsZQogICAgICAgICBzZWxmLl9kcmF3X3R1cnRsZSgpCiAKICAgICBkZWYgd2luZG93X3dpZHRoKHNlbGYpOgorICAgICAgICAiIiIgUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIHR1cnRsZSB3aW5kb3cuCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS53aW5kb3dfd2lkdGgoKQorICAgICAgICA2NDAKKyAgICAgICAgIiIiCiAgICAgICAgIHdpZHRoID0gc2VsZi5fY2FudmFzLndpbmZvX3dpZHRoKCkKICAgICAgICAgaWYgd2lkdGggPD0gMTogICMgdGhlIHdpbmRvdyBpc24ndCBtYW5hZ2VkIGJ5IGEgZ2VvbWV0cnkgbWFuYWdlcgogICAgICAgICAgICAgd2lkdGggPSBzZWxmLl9jYW52YXNbJ3dpZHRoJ10KICAgICAgICAgcmV0dXJuIHdpZHRoCiAKICAgICBkZWYgd2luZG93X2hlaWdodChzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSB0dXJ0bGUgd2luZG93LgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUud2luZG93X2hlaWdodCgpCisgICAgICAgIDc2OAorICAgICAgICAiIiIKICAgICAgICAgaGVpZ2h0ID0gc2VsZi5fY2FudmFzLndpbmZvX2hlaWdodCgpCiAgICAgICAgIGlmIGhlaWdodCA8PSAxOiAjIHRoZSB3aW5kb3cgaXNuJ3QgbWFuYWdlZCBieSBhIGdlb21ldHJ5IG1hbmFnZXIKICAgICAgICAgICAgIGhlaWdodCA9IHNlbGYuX2NhbnZhc1snaGVpZ2h0J10KICAgICAgICAgcmV0dXJuIGhlaWdodAogCiAgICAgZGVmIHBvc2l0aW9uKHNlbGYpOgorICAgICAgICAiIiIgUmV0dXJuIHRoZSBjdXJyZW50ICh4LCB5KSBsb2NhdGlvbiBvZiB0aGUgdHVydGxlLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICBbMC4wLCAyNDAuMF0KKyAgICAgICAgIiIiCiAgICAgICAgIHgwLCB5MCA9IHNlbGYuX29yaWdpbgogICAgICAgICB4MSwgeTEgPSBzZWxmLl9wb3NpdGlvbgogICAgICAgICByZXR1cm4gW3gxLXgwLCAteTEreTBdCiAKICAgICBkZWYgc2V0eChzZWxmLCB4cG9zKToKKyAgICAgICAgIiIiIFNldCB0aGUgdHVydGxlJ3MgeCBjb29yZGluYXRlIHRvIGJlIHhwb3MuCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFsxMC4wLCAyNDAuMF0KKyAgICAgICAgPj4+IHR1cnRsZS5zZXR4KDEwKQorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgWzEwLjAsIDI0MC4wXQorICAgICAgICAiIiIKICAgICAgICAgeDAsIHkwID0gc2VsZi5fb3JpZ2luCiAgICAgICAgIHgxLCB5MSA9IHNlbGYuX3Bvc2l0aW9uCiAgICAgICAgIHNlbGYuX2dvdG8oeDAreHBvcywgeTEpCiAKICAgICBkZWYgc2V0eShzZWxmLCB5cG9zKToKKyAgICAgICAgIiIiIFNldCB0aGUgdHVydGxlJ3MgeSBjb29yZGluYXRlIHRvIGJlIHlwb3MuCisKKyAgICAgICAgRXhhbXBsZToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFswLjAsIDAuMF0KKyAgICAgICAgPj4+IHR1cnRsZS5zZXR5KC0yMikKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFswLjAsIC0yMi4wXQorICAgICAgICAiIiIKICAgICAgICAgeDAsIHkwID0gc2VsZi5fb3JpZ2luCiAgICAgICAgIHgxLCB5MSA9IHNlbGYuX3Bvc2l0aW9uCiAgICAgICAgIHNlbGYuX2dvdG8oeDEsIHkwLXlwb3MpCiAKKyAgICBkZWYgdG93YXJkcyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJldHVycyB0aGUgYW5nbGUsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBsaW5lCisgICAgICAgIGZyb20gdHVydGxlLXBvc2l0aW9uIHRvIHBvaW50ICh4LHkpLgorCisgICAgICAgIEFyZ3VtZW50IGNhbiBiZSB0d28gY29vcmRpbmF0ZXMgb3Igb25lIHBhaXIgb2YgY29vcmRpbmF0ZXMKKyAgICAgICAgb3IgYSBSYXdQZW4vUGVuIGluc3RhbmNlLgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICBbMTAuMCwgMTAuMF0KKyAgICAgICAgPj4+IHR1cnRsZS50b3dhcmRzKDAsMCkKKyAgICAgICAgMjI1LjAKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgeCwgeSA9IGFyZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZyA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBSYXdQZW4pOgorICAgICAgICAgICAgICAgIHgsIHkgPSBhcmcucG9zaXRpb24oKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB4LCB5ID0gYXJnCisgICAgICAgIHgwLCB5MCA9IHNlbGYucG9zaXRpb24oKQorICAgICAgICBkeCA9IHggLSB4MAorICAgICAgICBkeSA9IHkgLSB5MAorICAgICAgICByZXR1cm4gKGF0YW4yKGR5LGR4KSAvIHNlbGYuX2ludnJhZGlhbikgJSBzZWxmLl9mdWxsY2lyY2xlCisKICAgICBkZWYgZ290byhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIiBHbyB0byB0aGUgZ2l2ZW4gcG9pbnQuCisKKyAgICAgICAgSWYgdGhlIHBlbiBpcyBkb3duLCB0aGVuIGEgbGluZSB3aWxsIGJlIGRyYXduLiBUaGUgdHVydGxlJ3MKKyAgICAgICAgb3JpZW50YXRpb24gZG9lcyBub3QgY2hhbmdlLgorCisgICAgICAgIFR3byBpbnB1dCBmb3JtYXRzIGFyZSBhY2NlcHRlZDoKKworICAgICAgICAgICBnb3RvKHgsIHkpCisgICAgICAgICAgIGdvIHRvIHBvaW50ICh4LCB5KQorCisgICAgICAgICAgIGdvdG8oKHgsIHkpKQorICAgICAgICAgICBnbyB0byBwb2ludCAoeCwgeSkKKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgWzAuMCwgMC4wXQorICAgICAgICA+Pj4gdHVydGxlLmdvdG8oNTAsIC00NSkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgIFs1MC4wLCAtNDUuMF0KKyAgICAgICAgIiIiCiAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHgsIHkgPSBhcmdzWzBdCkBAIC0yNTAsNyArNTYyLDcgQEAKICAgICAgICAgc2VsZi5fZ290byh4MCt4LCB5MC15KQogCiAgICAgZGVmIF9nb3RvKHNlbGYsIHgxLCB5MSk6Ci0gICAgICAgIHgwLCB5MCA9IHN0YXJ0ID0gc2VsZi5fcG9zaXRpb24KKyAgICAgICAgeDAsIHkwID0gc2VsZi5fcG9zaXRpb24KICAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBtYXAoZmxvYXQsICh4MSwgeTEpKQogICAgICAgICBpZiBzZWxmLl9maWxsaW5nOgogICAgICAgICAgICAgc2VsZi5fcGF0aC5hcHBlbmQoc2VsZi5fcG9zaXRpb24pCkBAIC0yNzAsNyArNTgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbnZhcy5jb29yZHMoaXRlbSwgeDAsIHkwLCB4LCB5KQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHJhd190dXJ0bGUoKHgseSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYW52YXMudXBkYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbnZhcy5hZnRlcigxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbnZhcy5hZnRlcihzZWxmLl9kZWxheSkKICAgICAgICAgICAgICAgICAgICAgIyBpbiBjYXNlIG5ob3BzPT0wCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbnZhcy5jb29yZHMoaXRlbSwgeDAsIHkwLCB4MSwgeTEpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbnZhcy5pdGVtY29uZmlndXJlKGl0ZW0sIGFycm93PSJub25lIikKQEAgLTI4NSw3ICs1OTcsNDIgQEAKICAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChpdGVtKQogICAgICAgICBzZWxmLl9kcmF3X3R1cnRsZSgpCiAKLSAgICBkZWYgX2RyYXdfdHVydGxlKHNlbGYscG9zaXRpb249W10pOgorICAgIGRlZiBzcGVlZChzZWxmLCBzcGVlZCk6CisgICAgICAgICIiIiBTZXQgdGhlIHR1cnRsZSdzIHNwZWVkLgorCisgICAgICAgIHNwZWVkIG11c3Qgb25lIG9mIHRoZXNlIGZpdmUgc3RyaW5nczoKKworICAgICAgICAgICAgJ2Zhc3Rlc3QnIGlzIGEgMCBtcyBkZWxheQorICAgICAgICAgICAgJ2Zhc3QnIGlzIGEgNSBtcyBkZWxheQorICAgICAgICAgICAgJ25vcm1hbCcgaXMgYSAxMCBtcyBkZWxheQorICAgICAgICAgICAgJ3Nsb3cnIGlzIGEgMTUgbXMgZGVsYXkKKyAgICAgICAgICAgICdzbG93ZXN0JyBpcyBhIDIwIG1zIGRlbGF5CisKKyAgICAgICAgIEV4YW1wbGU6CisgICAgICAgICA+Pj4gdHVydGxlLnNwZWVkKCdzbG93JykKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNwZWVkID0gc3BlZWQuc3RyaXAoKS5sb3dlcigpCisgICAgICAgICAgICBzZWxmLl9kZWxheSA9IHNwZWVkcy5pbmRleChzcGVlZCkgKiA1CisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVyIGlzIG5vdCBhIHZhbGlkIHNwZWVkLiBzcGVlZCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uZSBvZiAlcyIgJSAoc3BlZWQsIHNwZWVkcykpCisKKworICAgIGRlZiBkZWxheShzZWxmLCBkZWxheSk6CisgICAgICAgICIiIiBTZXQgdGhlIGRyYXdpbmcgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLgorCisgICAgICAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWxsb3cgZmluZXIgY29udHJvbCBvZiB0aGUgZHJhd2luZyBzcGVlZAorICAgICAgICB0aGFuIHRoZSBzcGVlZCgpIG1ldGhvZAorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiB0dXJ0bGUuZGVsYXkoMTUpCisgICAgICAgICIiIgorICAgICAgICBpZiBpbnQoZGVsYXkpIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRlbGF5IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAiKQorICAgICAgICBzZWxmLl9kZWxheSA9IGludChkZWxheSkKKworICAgIGRlZiBfZHJhd190dXJ0bGUoc2VsZiwgcG9zaXRpb249W10pOgogICAgICAgICBpZiBub3Qgc2VsZi5fdHJhY2luZzoKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBwb3NpdGlvbiA9PSBbXToKQEAgLTMwNSwxMyArNjUyLDE3IEBACiAgICAgZGVmIF9kZWxldGVfdHVydGxlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9hcnJvdyAhPSAwOgogICAgICAgICAgICAgc2VsZi5fY2FudmFzLmRlbGV0ZShzZWxmLl9hcnJvdykKLSAgICAgICAgc2VsZi5fYXJyb3cgPSAwCi0KKyAgICAgICAgICAgIHNlbGYuX2Fycm93ID0gMAogCiAKIF9yb290ID0gTm9uZQogX2NhbnZhcyA9IE5vbmUKIF9wZW4gPSBOb25lCitfd2lkdGggPSAwLjUwICAgICAgICAgICAgICAgICAgIyA1MCUgb2Ygd2luZG93IHdpZHRoCitfaGVpZ2h0ID0gMC43NSAgICAgICAgICAgICAgICAgIyA3NSUgb2Ygd2luZG93IGhlaWdodAorX3N0YXJ0eCA9IE5vbmUKK19zdGFydHkgPSBOb25lCitfdGl0bGUgPSAiVHVydGxlIEdyYXBoaWNzIiAgICAgIyBkZWZhdWx0IHRpdGxlCiAKIGNsYXNzIFBlbihSYXdQZW4pOgogCkBAIC0zMjAsMTAgKzY3MSwxNSBAQAogICAgICAgICBpZiBfcm9vdCBpcyBOb25lOgogICAgICAgICAgICAgX3Jvb3QgPSBUa2ludGVyLlRrKCkKICAgICAgICAgICAgIF9yb290LndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5fZGVzdHJveSkKKyAgICAgICAgICAgIF9yb290LnRpdGxlKF90aXRsZSkKKwogICAgICAgICBpZiBfY2FudmFzIGlzIE5vbmU6CiAgICAgICAgICAgICAjIFhYWCBTaG91bGQgaGF2ZSBzY3JvbGwgYmFycwogICAgICAgICAgICAgX2NhbnZhcyA9IFRraW50ZXIuQ2FudmFzKF9yb290LCBiYWNrZ3JvdW5kPSJ3aGl0ZSIpCiAgICAgICAgICAgICBfY2FudmFzLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQorCisgICAgICAgIHNldHVwKHdpZHRoPV93aWR0aCwgaGVpZ2h0PSBfaGVpZ2h0LCBzdGFydHg9X3N0YXJ0eCwgc3RhcnR5PV9zdGFydHkpCisKICAgICAgICAgUmF3UGVuLl9faW5pdF9fKHNlbGYsIF9jYW52YXMpCiAKICAgICBkZWYgX2Rlc3Ryb3koc2VsZik6CkBAIC0zMzUsMTMgKzY5MSwxOCBAQAogICAgICAgICAgICAgX2NhbnZhcyA9IE5vbmUKICAgICAgICAgcm9vdC5kZXN0cm95KCkKIAotCiBkZWYgX2dldHBlbigpOgogICAgIGdsb2JhbCBfcGVuCi0gICAgcGVuID0gX3BlbgotICAgIGlmIG5vdCBwZW46Ci0gICAgICAgIF9wZW4gPSBwZW4gPSBQZW4oKQotICAgIHJldHVybiBwZW4KKyAgICBpZiBub3QgX3BlbjoKKyAgICAgICAgX3BlbiA9IFBlbigpCisgICAgcmV0dXJuIF9wZW4KKworY2xhc3MgVHVydGxlKFBlbik6CisgICAgcGFzcworCisiIiJGb3IgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzZWUKKyAgIHRoZSBSYXdQZW4gbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWVzCisiIiIKIAogZGVmIGRlZ3JlZXMoKTogX2dldHBlbigpLmRlZ3JlZXMoKQogZGVmIHJhZGlhbnMoKTogX2dldHBlbigpLnJhZGlhbnMoKQpAQCAtMzU4LDYgKzcxOSw4IEBACiBkZWYgY29sb3IoKmFyZ3MpOiBfZ2V0cGVuKCkuY29sb3IoKmFyZ3MpCiBkZWYgd3JpdGUoYXJnLCBtb3ZlPTApOiBfZ2V0cGVuKCkud3JpdGUoYXJnLCBtb3ZlKQogZGVmIGZpbGwoZmxhZyk6IF9nZXRwZW4oKS5maWxsKGZsYWcpCitkZWYgYmVnaW5fZmlsbCgpOiBfZ2V0cGVuKCkuYmVnaW5fZmlsbCgpCitkZWYgZW5kX2ZpbGwoKTogX2dldHBlbi5lbmRfZmlsbCgpCiBkZWYgY2lyY2xlKHJhZGl1cywgZXh0ZW50PU5vbmUpOiBfZ2V0cGVuKCkuY2lyY2xlKHJhZGl1cywgZXh0ZW50KQogZGVmIGdvdG8oKmFyZ3MpOiBfZ2V0cGVuKCkuZ290bygqYXJncykKIGRlZiBoZWFkaW5nKCk6IHJldHVybiBfZ2V0cGVuKCkuaGVhZGluZygpCkBAIC0zNjcsNiArNzMwLDEwNiBAQAogZGVmIHdpbmRvd19oZWlnaHQoKTogcmV0dXJuIF9nZXRwZW4oKS53aW5kb3dfaGVpZ2h0KCkKIGRlZiBzZXR4KHhwb3MpOiBfZ2V0cGVuKCkuc2V0eCh4cG9zKQogZGVmIHNldHkoeXBvcyk6IF9nZXRwZW4oKS5zZXR5KHlwb3MpCitkZWYgdG93YXJkcygqYXJncyk6IHJldHVybiBfZ2V0cGVuKCkudG93YXJkcygqYXJncykKKworZGVmIGRvbmUoKTogX3Jvb3QubWFpbmxvb3AoKQorZGVmIGRlbGF5KGRlbGF5KTogcmV0dXJuIF9nZXRwZW4oKS5kZWxheShkZWxheSkKK2RlZiBzcGVlZChzcGVlZCk6IHJldHVybiBfZ2V0cGVuKCkuc3BlZWQoc3BlZWQpCisKK2ZvciBtZXRob2RuYW1lIGluIGRpcihSYXdQZW4pOgorICAgICIiIiBjb3BpZXMgUmF3UGVuIGRvY3N0cmluZ3MgdG8gbW9kdWxlIGZ1bmN0aW9ucyBvZiBzYW1lIG5hbWUgIiIiCisgICAgaWYgbm90IG1ldGhvZG5hbWUuc3RhcnRzd2l0aCgiXyIpOgorICAgICAgICBldmFsKG1ldGhvZG5hbWUpLl9fZG9jX18gPSBSYXdQZW4uX19kaWN0X19bbWV0aG9kbmFtZV0uX19kb2NfXworCisKK2RlZiBzZXR1cCgqKmdlb21ldHJ5KToKKyAgICAiIiIgU2V0cyB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIG1haW4gd2luZG93LgorCisgICAgS2V5d29yZHMgYXJlIHdpZHRoLCBoZWlnaHQsIHN0YXJ0eCBhbmQgc3RhcnR5CisKKyAgICB3aWR0aDogZWl0aGVyIGEgc2l6ZSBpbiBwaXhlbHMgb3IgYSBmcmFjdGlvbiBvZiB0aGUgc2NyZWVuLgorICAgICAgRGVmYXVsdCBpcyA1MCUgb2Ygc2NyZWVuLgorICAgIGhlaWdodDogZWl0aGVyIHRoZSBoZWlnaHQgaW4gcGl4ZWxzIG9yIGEgZnJhY3Rpb24gb2YgdGhlIHNjcmVlbi4KKyAgICAgIERlZmF1bHQgaXMgNzUlIG9mIHNjcmVlbi4KKworICAgIFNldHRpbmcgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCB0byBOb25lIGJlZm9yZSBkcmF3aW5nIHdpbGwgZm9yY2UKKyAgICAgIHVzZSBvZiBkZWZhdWx0IGdlb21ldHJ5IGFzIGluIG9sZGVyIHZlcnNpb25zIG9mIHR1cnRsZS5weQorCisgICAgc3RhcnR4OiBzdGFydGluZyBwb3NpdGlvbiBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBzY3JlZW4uCisgICAgICBEZWZhdWx0IGlzIHRvIGNlbnRlciB3aW5kb3cuIFNldHRpbmcgc3RhcnR4IHRvIE5vbmUgaXMgdGhlIGRlZmF1bHQKKyAgICAgIGFuZCBjZW50ZXJzIHdpbmRvdyBob3Jpem9udGFsbHkgb24gc2NyZWVuLgorCisgICAgc3RhcnR5OiBzdGFydGluZyBwb3NpdGlvbiBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIHNjcmVlbi4KKyAgICAgIERlZmF1bHQgaXMgdG8gY2VudGVyIHdpbmRvdy4gU2V0dGluZyBzdGFydHkgdG8gTm9uZSBpcyB0aGUgZGVmYXVsdAorICAgICAgYW5kIGNlbnRlcnMgd2luZG93IHZlcnRpY2FsbHkgb24gc2NyZWVuLgorCisgICAgRXhhbXBsZXM6CisgICAgPj4+IHNldHVwICh3aWR0aD0yMDAsIGhlaWdodD0yMDAsIHN0YXJ0eD0wLCBzdGFydHk9MCkKKworICAgIHNldHMgd2luZG93IHRvIDIwMHgyMDAgcGl4ZWxzLCBpbiB1cHBlciBsZWZ0IG9mIHNjcmVlbgorCisgICAgPj4+IHNldHVwKHdpZHRoPS43NSwgaGVpZ2h0PTAuNSwgc3RhcnR4PU5vbmUsIHN0YXJ0eT1Ob25lKQorCisgICAgc2V0cyB3aW5kb3cgdG8gNzUlIG9mIHNjcmVlbiBieSA1MCUgb2Ygc2NyZWVuIGFuZCBjZW50ZXJzCisKKyAgICA+Pj4gc2V0dXAod2lkdGg9Tm9uZSkKKworICAgIGZvcmNlcyB1c2Ugb2YgZGVmYXVsdCBnZW9tZXRyeSBhcyBpbiBvbGRlciB2ZXJzaW9ucyBvZiB0dXJ0bGUucHkKKyAgICAiIiIKKworICAgIGdsb2JhbCBfd2lkdGgsIF9oZWlnaHQsIF9zdGFydHgsIF9zdGFydHkKKworICAgIHdpZHRoID0gZ2VvbWV0cnkuZ2V0KCd3aWR0aCcsX3dpZHRoKQorICAgIGlmIHdpZHRoID49IDAgb3Igd2lkdGggPT0gTm9uZToKKyAgICAgICAgX3dpZHRoID0gd2lkdGgKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAid2lkdGggY2FuIG5vdCBiZSBsZXNzIHRoYW4gMCIKKworICAgIGhlaWdodCA9IGdlb21ldHJ5LmdldCgnaGVpZ2h0JyxfaGVpZ2h0KQorICAgIGlmIGhlaWdodCA+PSAwIG9yIGhlaWdodCA9PSBOb25lOgorICAgICAgICBfaGVpZ2h0ID0gaGVpZ2h0CisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImhlaWdodCBjYW4gbm90IGJlIGxlc3MgdGhhbiAwIgorCisgICAgc3RhcnR4ID0gZ2VvbWV0cnkuZ2V0KCdzdGFydHgnLCBfc3RhcnR4KQorICAgIGlmIHN0YXJ0eCA+PSAwIG9yIHN0YXJ0eCA9PSBOb25lOgorICAgICAgICBfc3RhcnR4ID0gX3N0YXJ0eAorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJzdGFydHggY2FuIG5vdCBiZSBsZXNzIHRoYW4gMCIKKworICAgIHN0YXJ0eSA9IGdlb21ldHJ5LmdldCgnc3RhcnR5JywgX3N0YXJ0eSkKKyAgICBpZiBzdGFydHkgPj0gMCBvciBzdGFydHkgPT0gTm9uZToKKyAgICAgICAgX3N0YXJ0eSA9IHN0YXJ0eQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJzdGFydHggY2FuIG5vdCBiZSBsZXNzIHRoYW4gMCIKKworCisgICAgaWYgX3Jvb3QgYW5kIF93aWR0aCBhbmQgX2hlaWdodDoKKyAgICAgICAgaWYgMCA8IF93aWR0aCA8PSAxOgorICAgICAgICAgICAgX3dpZHRoID0gX3Jvb3Qud2luZm9fc2NyZWVud2lkdGgoKSAqICt3aWR0aAorICAgICAgICBpZiAwIDwgX2hlaWdodCA8PSAxOgorICAgICAgICAgICAgX2hlaWdodCA9IF9yb290LndpbmZvX3NjcmVlbmhlaWdodCgpICogX2hlaWdodAorCisgICAgICAgICMgY2VudGVyIHdpbmRvdyBvbiBzY3JlZW4KKyAgICAgICAgaWYgX3N0YXJ0eCBpcyBOb25lOgorICAgICAgICAgICAgX3N0YXJ0eCA9IChfcm9vdC53aW5mb19zY3JlZW53aWR0aCgpIC0gX3dpZHRoKSAvIDIKKworICAgICAgICBpZiBfc3RhcnR5IGlzIE5vbmU6CisgICAgICAgICAgICBfc3RhcnR5ID0gKF9yb290LndpbmZvX3NjcmVlbmhlaWdodCgpIC0gX2hlaWdodCkgLyAyCisKKyAgICAgICAgX3Jvb3QuZ2VvbWV0cnkoIiVkeCVkKyVkKyVkIiAlIChfd2lkdGgsIF9oZWlnaHQsIF9zdGFydHgsIF9zdGFydHkpKQorCitkZWYgdGl0bGUodGl0bGUpOgorICAgICIiIiBzZXQgdGhlIHdpbmRvdyB0aXRsZS4KKworICAgIEJ5IGRlZmF1bHQgdGhpcyBpcyBzZXQgdG8gJ1R1cnRsZSBHcmFwaGljcycKKworICAgIEV4YW1wbGU6CisgICAgPj4+IHRpdGxlKCJNeSBXaW5kb3ciKQorICAgICIiIgorCisgICAgZ2xvYmFsIF90aXRsZQorICAgIF90aXRsZSA9IHRpdGxlCiAKIGRlZiBkZW1vKCk6CiAgICAgcmVzZXQoKQpAQCAtNDE3LDEwICs4ODAsOTQgQEAKICAgICAgICAgZm9yd2FyZCgyMCkKICAgICAgICAgcmlnaHQoOTApCiAgICAgZmlsbCgwKQorICAgIHRyYWNlcigxKQogICAgICMgbW9yZSB0ZXh0CiAgICAgd3JpdGUoImVuZCIpCi0gICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICAgICAgX3Jvb3QubWFpbmxvb3AoKQorCitkZWYgZGVtbzIoKToKKyAgICAjIGV4ZXJjaXNlcyBzb21lIG5ldyBhbmQgaW1wcm92ZWQgZmVhdHVyZXMKKyAgICBzcGVlZCgnZmFzdCcpCisgICAgd2lkdGgoMykKKworICAgICMgZHJhdyBhIHNlZ21lbnRlZCBoYWxmLWNpcmNsZQorICAgIHNldGhlYWRpbmcodG93YXJkcygwLDApKQorICAgIHgseSA9IHBvc2l0aW9uKCkKKyAgICByID0gKHgqKjIreSoqMikqKi41LzIuMAorICAgIHJpZ2h0KDkwKQorICAgIHBlbmRvd24gPSBUcnVlCisgICAgZm9yIGkgaW4gcmFuZ2UoMTgpOgorICAgICAgICBpZiBwZW5kb3duOgorICAgICAgICAgICAgdXAoKQorICAgICAgICAgICAgcGVuZG93biA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkb3duKCkKKyAgICAgICAgICAgIHBlbmRvd24gPSBUcnVlCisgICAgICAgIGNpcmNsZShyLDEwKQorICAgIHNsZWVwKDIpCisKKyAgICByZXNldCgpCisgICAgbGVmdCg5MCkKKworICAgICMgZHJhdyBhIHNlcmllcyBvZiB0cmlhbmdsZXMKKyAgICBsID0gMTAKKyAgICBjb2xvcigiZ3JlZW4iKQorICAgIHdpZHRoKDMpCisgICAgbGVmdCgxODApCisgICAgc3AgPSA1CisgICAgZm9yIGkgaW4gcmFuZ2UoLTIsMTYpOgorICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgIGNvbG9yKDEuMC0wLjA1KmksMCwwLjA1KmkpCisgICAgICAgICAgICBmaWxsKDEpCisgICAgICAgICAgICBjb2xvcigiZ3JlZW4iKQorICAgICAgICBmb3IgaiBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIGZvcndhcmQobCkKKyAgICAgICAgICAgIGxlZnQoMTIwKQorICAgICAgICBsICs9IDEwCisgICAgICAgIGxlZnQoMTUpCisgICAgICAgIGlmIHNwID4gMDoKKyAgICAgICAgICAgIHNwID0gc3AtMQorICAgICAgICAgICAgc3BlZWQoc3BlZWRzW3NwXSkKKyAgICBjb2xvcigwLjI1LDAsMC43NSkKKyAgICBmaWxsKDApCisgICAgY29sb3IoImdyZWVuIikKKworICAgIGxlZnQoMTMwKQorICAgIHVwKCkKKyAgICBmb3J3YXJkKDkwKQorICAgIGNvbG9yKCJyZWQiKQorICAgIHNwZWVkKCdmYXN0ZXN0JykKKyAgICBkb3duKCk7CisKKyAgICAjIGNyZWF0ZSBhIHNlY29uZCB0dXJ0bGUgYW5kIG1ha2UgdGhlIG9yaWdpbmFsIHB1cnN1ZSBhbmQgY2F0Y2ggaXQKKyAgICB0dXJ0bGU9VHVydGxlKCkKKyAgICB0dXJ0bGUucmVzZXQoKQorICAgIHR1cnRsZS5sZWZ0KDkwKQorICAgIHR1cnRsZS5zcGVlZCgnbm9ybWFsJykKKyAgICB0dXJ0bGUudXAoKQorICAgIHR1cnRsZS5nb3RvKDI4MCw0MCkKKyAgICB0dXJ0bGUubGVmdCgyNCkKKyAgICB0dXJ0bGUuZG93bigpCisgICAgdHVydGxlLnNwZWVkKCdmYXN0JykKKyAgICB0dXJ0bGUuY29sb3IoImJsdWUiKQorICAgIHR1cnRsZS53aWR0aCgyKQorICAgIHNwZWVkKCdmYXN0ZXN0JykKKworICAgICMgdHVybiBkZWZhdWx0IHR1cnRsZSB0b3dhcmRzIG5ldyB0dXJ0bGUgb2JqZWN0CisgICAgc2V0aGVhZGluZyh0b3dhcmRzKHR1cnRsZSkpCisgICAgd2hpbGUgKCBhYnMocG9zaXRpb24oKVswXS10dXJ0bGUucG9zaXRpb24oKVswXSk+NCBvcgorICAgICAgICAgICAgYWJzKHBvc2l0aW9uKClbMV0tdHVydGxlLnBvc2l0aW9uKClbMV0pPjQpOgorICAgICAgICB0dXJ0bGUuZm9yd2FyZCgzLjUpCisgICAgICAgIHR1cnRsZS5sZWZ0KDAuNikKKyAgICAgICAgIyB0dXJuIGRlZmF1bHQgdHVydGxlIHRvd2FyZHMgbmV3IHR1cnRsZSBvYmplY3QKKyAgICAgICAgc2V0aGVhZGluZyh0b3dhcmRzKHR1cnRsZSkpCisgICAgICAgIGZvcndhcmQoNCkKKyAgICB3cml0ZSgiQ0FVR0hUISAiLCBtb3ZlPVRydWUpCisKKwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gdGltZSBpbXBvcnQgc2xlZXAKICAgICBkZW1vKCkKKyAgICBzbGVlcCgzKQorICAgIGRlbW8yKCkKKyAgICBkb25lKCkKZGlmZiAtLWdpdCBhL0xpYi9sb2NhbGUucHkgYi9MaWIvbG9jYWxlLnB5CmluZGV4IGNmYzY5YjEuLmZkNTQ5YmIgMTAwNjQ0Ci0tLSBhL0xpYi9sb2NhbGUucHkKKysrIGIvTGliL2xvY2FsZS5weQpAQCAtODgsMTMgKzg4LDE2IEBACiAjIyMgTnVtYmVyIGZvcm1hdHRpbmcgQVBJcwogCiAjIEF1dGhvcjogTWFydGluIHZvbiBMb2V3aXMKKyMgaW1wcm92ZWQgYnkgR2VvcmcgQnJhbmRsCiAKICNwZXJmb3JtIHRoZSBncm91cGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKLWRlZiBfZ3JvdXAocyk6Ci0gICAgY29udj1sb2NhbGVjb252KCkKLSAgICBncm91cGluZz1jb252Wydncm91cGluZyddCi0gICAgaWYgbm90IGdyb3VwaW5nOnJldHVybiAocywgMCkKLSAgICByZXN1bHQ9IiIKK2RlZiBfZ3JvdXAocywgbW9uZXRhcnk9RmFsc2UpOgorICAgIGNvbnYgPSBsb2NhbGVjb252KCkKKyAgICB0aG91c2FuZHNfc2VwID0gY29udlttb25ldGFyeSBhbmQgJ21vbl90aG91c2FuZHNfc2VwJyBvciAndGhvdXNhbmRzX3NlcCddCisgICAgZ3JvdXBpbmcgPSBjb252W21vbmV0YXJ5IGFuZCAnbW9uX2dyb3VwaW5nJyBvciAnZ3JvdXBpbmcnXQorICAgIGlmIG5vdCBncm91cGluZzoKKyAgICAgICAgcmV0dXJuIChzLCAwKQorICAgIHJlc3VsdCA9ICIiCiAgICAgc2VwcyA9IDAKICAgICBzcGFjZXMgPSAiIgogICAgIGlmIHNbLTFdID09ICcgJzoKQEAgLTEwMyw2MyArMTA2LDE0MiBAQAogICAgICAgICBzID0gc1s6c3BdCiAgICAgd2hpbGUgcyBhbmQgZ3JvdXBpbmc6CiAgICAgICAgICMgaWYgZ3JvdXBpbmcgaXMgLTEsIHdlIGFyZSBkb25lCi0gICAgICAgIGlmIGdyb3VwaW5nWzBdPT1DSEFSX01BWDoKKyAgICAgICAgaWYgZ3JvdXBpbmdbMF0gPT0gQ0hBUl9NQVg6CiAgICAgICAgICAgICBicmVhawogICAgICAgICAjIDA6IHJlLXVzZSBsYXN0IGdyb3VwIGFkIGluZmluaXR1bQotICAgICAgICBlbGlmIGdyb3VwaW5nWzBdIT0wOgorICAgICAgICBlbGlmIGdyb3VwaW5nWzBdICE9IDA6CiAgICAgICAgICAgICAjcHJvY2VzcyBsYXN0IGdyb3VwCi0gICAgICAgICAgICBncm91cD1ncm91cGluZ1swXQotICAgICAgICAgICAgZ3JvdXBpbmc9Z3JvdXBpbmdbMTpdCisgICAgICAgICAgICBncm91cCA9IGdyb3VwaW5nWzBdCisgICAgICAgICAgICBncm91cGluZyA9IGdyb3VwaW5nWzE6XQogICAgICAgICBpZiByZXN1bHQ6Ci0gICAgICAgICAgICByZXN1bHQ9c1stZ3JvdXA6XStjb252Wyd0aG91c2FuZHNfc2VwJ10rcmVzdWx0CisgICAgICAgICAgICByZXN1bHQgPSBzWy1ncm91cDpdICsgdGhvdXNhbmRzX3NlcCArIHJlc3VsdAogICAgICAgICAgICAgc2VwcyArPSAxCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXN1bHQ9c1stZ3JvdXA6XQotICAgICAgICBzPXNbOi1ncm91cF0KKyAgICAgICAgICAgIHJlc3VsdCA9IHNbLWdyb3VwOl0KKyAgICAgICAgcyA9IHNbOi1ncm91cF0KICAgICAgICAgaWYgcyBhbmQgc1stMV0gbm90IGluICIwMTIzNDU2Nzg5IjoKICAgICAgICAgICAgICMgdGhlIGxlYWRpbmcgc3RyaW5nIGlzIG9ubHkgc3BhY2VzIGFuZCBzaWducwotICAgICAgICAgICAgcmV0dXJuIHMrcmVzdWx0K3NwYWNlcyxzZXBzCisgICAgICAgICAgICByZXR1cm4gcyArIHJlc3VsdCArIHNwYWNlcywgc2VwcwogICAgIGlmIG5vdCByZXN1bHQ6Ci0gICAgICAgIHJldHVybiBzK3NwYWNlcyxzZXBzCisgICAgICAgIHJldHVybiBzICsgc3BhY2VzLCBzZXBzCiAgICAgaWYgczoKLSAgICAgICAgcmVzdWx0PXMrY29udlsndGhvdXNhbmRzX3NlcCddK3Jlc3VsdAorICAgICAgICByZXN1bHQgPSBzICsgdGhvdXNhbmRzX3NlcCArIHJlc3VsdAogICAgICAgICBzZXBzICs9IDEKLSAgICByZXR1cm4gcmVzdWx0K3NwYWNlcyxzZXBzCisgICAgcmV0dXJuIHJlc3VsdCArIHNwYWNlcywgc2VwcwogCi1kZWYgZm9ybWF0KGYsdmFsLGdyb3VwaW5nPTApOgotICAgICIiIkZvcm1hdHMgYSB2YWx1ZSBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgJSBmb3JtYXR0aW5nIHdvdWxkIHVzZSwKK2RlZiBmb3JtYXQocGVyY2VudCwgdmFsdWUsIGdyb3VwaW5nPUZhbHNlLCBtb25ldGFyeT1GYWxzZSwgKmFkZGl0aW9uYWwpOgorICAgICIiIlJldHVybnMgdGhlIGxvY2FsZS1hd2FyZSBzdWJzdGl0dXRpb24gb2YgYSAlPyBzcGVjaWZpZXIKKyAgICAocGVyY2VudCkuCisKKyAgICBhZGRpdGlvbmFsIGlzIGZvciBmb3JtYXQgc3RyaW5ncyB3aGljaCBjb250YWluIG9uZSBvciBtb3JlCisgICAgJyonIG1vZGlmaWVycy4iIiIKKyAgICAjIHRoaXMgaXMgb25seSBmb3Igb25lLXBlcmNlbnQtc3BlY2lmaWVyIHN0cmluZ3MgYW5kIHRoaXMgc2hvdWxkIGJlIGNoZWNrZWQKKyAgICBpZiBwZXJjZW50WzBdICE9ICclJzoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZm9ybWF0KCkgbXVzdCBiZSBnaXZlbiBleGFjdGx5IG9uZSAlY2hhciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXIiKQorICAgIGlmIGFkZGl0aW9uYWw6CisgICAgICAgIGZvcm1hdHRlZCA9IHBlcmNlbnQgJSAoKHZhbHVlLCkgKyBhZGRpdGlvbmFsKQorICAgIGVsc2U6CisgICAgICAgIGZvcm1hdHRlZCA9IHBlcmNlbnQgJSB2YWx1ZQorICAgICMgZmxvYXRzIGFuZCBkZWNpbWFsIGludHMgbmVlZCBzcGVjaWFsIGFjdGlvbiEKKyAgICBpZiBwZXJjZW50Wy0xXSBpbiAnZUVmRmdHJzoKKyAgICAgICAgc2VwcyA9IDAKKyAgICAgICAgcGFydHMgPSBmb3JtYXR0ZWQuc3BsaXQoJy4nKQorICAgICAgICBpZiBncm91cGluZzoKKyAgICAgICAgICAgIHBhcnRzWzBdLCBzZXBzID0gX2dyb3VwKHBhcnRzWzBdLCBtb25ldGFyeT1tb25ldGFyeSkKKyAgICAgICAgZGVjaW1hbF9wb2ludCA9IGxvY2FsZWNvbnYoKVttb25ldGFyeSBhbmQgJ21vbl9kZWNpbWFsX3BvaW50JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICdkZWNpbWFsX3BvaW50J10KKyAgICAgICAgZm9ybWF0dGVkID0gZGVjaW1hbF9wb2ludC5qb2luKHBhcnRzKQorICAgICAgICB3aGlsZSBzZXBzOgorICAgICAgICAgICAgc3AgPSBmb3JtYXR0ZWQuZmluZCgnICcpCisgICAgICAgICAgICBpZiBzcCA9PSAtMTogYnJlYWsKKyAgICAgICAgICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZFs6c3BdICsgZm9ybWF0dGVkW3NwKzE6XQorICAgICAgICAgICAgc2VwcyAtPSAxCisgICAgZWxpZiBwZXJjZW50Wy0xXSBpbiAnZGl1JzoKKyAgICAgICAgaWYgZ3JvdXBpbmc6CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBfZ3JvdXAoZm9ybWF0dGVkLCBtb25ldGFyeT1tb25ldGFyeSlbMF0KKyAgICByZXR1cm4gZm9ybWF0dGVkCisKK2ltcG9ydCByZSwgb3BlcmF0b3IKK19wZXJjZW50X3JlID0gcmUuY29tcGlsZShyJyUoPzpcKCg/UDxrZXk+Lio/KVwpKT8nCisgICAgICAgICAgICAgICAgICAgICAgICAgcicoP1A8bW9kaWZpZXJzPlstIzAtOSArKi5obExdKj8pW2VFZkZnR2Rpb3V4WGNycyVdJykKKworZGVmIGZvcm1hdF9zdHJpbmcoZiwgdmFsLCBncm91cGluZz1GYWxzZSk6CisgICAgIiIiRm9ybWF0cyBhIHN0cmluZyBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgJSBmb3JtYXR0aW5nIHdvdWxkIHVzZSwKICAgICBidXQgdGFrZXMgdGhlIGN1cnJlbnQgbG9jYWxlIGludG8gYWNjb3VudC4KICAgICBHcm91cGluZyBpcyBhcHBsaWVkIGlmIHRoZSB0aGlyZCBwYXJhbWV0ZXIgaXMgdHJ1ZS4iIiIKLSAgICByZXN1bHQgPSBmICUgdmFsCi0gICAgZmllbGRzID0gcmVzdWx0LnNwbGl0KCIuIikKLSAgICBzZXBzID0gMAotICAgIGlmIGdyb3VwaW5nOgotICAgICAgICBmaWVsZHNbMF0sc2Vwcz1fZ3JvdXAoZmllbGRzWzBdKQotICAgIGlmIGxlbihmaWVsZHMpPT0yOgotICAgICAgICByZXN1bHQgPSBmaWVsZHNbMF0rbG9jYWxlY29udigpWydkZWNpbWFsX3BvaW50J10rZmllbGRzWzFdCi0gICAgZWxpZiBsZW4oZmllbGRzKT09MToKLSAgICAgICAgcmVzdWx0ID0gZmllbGRzWzBdCisgICAgcGVyY2VudHMgPSBsaXN0KF9wZXJjZW50X3JlLmZpbmRpdGVyKGYpKQorICAgIG5ld19mID0gX3BlcmNlbnRfcmUuc3ViKCclcycsIGYpCisKKyAgICBpZiBpc2luc3RhbmNlKHZhbCwgdHVwbGUpOgorICAgICAgICBuZXdfdmFsID0gbGlzdCh2YWwpCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBwZXJjIGluIHBlcmNlbnRzOgorICAgICAgICAgICAgc3RhcmNvdW50ID0gcGVyYy5ncm91cCgnbW9kaWZpZXJzJykuY291bnQoJyonKQorICAgICAgICAgICAgbmV3X3ZhbFtpXSA9IGZvcm1hdChwZXJjLmdyb3VwKCksIG5ld192YWxbaV0sIGdyb3VwaW5nLCBGYWxzZSwgKm5ld192YWxbaSsxOmkrMStzdGFyY291bnRdKQorICAgICAgICAgICAgZGVsIG5ld192YWxbaSsxOmkrMStzdGFyY291bnRdCisgICAgICAgICAgICBpICs9ICgxICsgc3RhcmNvdW50KQorICAgICAgICB2YWwgPSB0dXBsZShuZXdfdmFsKQorICAgIGVsaWYgb3BlcmF0b3IuaXNNYXBwaW5nVHlwZSh2YWwpOgorICAgICAgICBmb3IgcGVyYyBpbiBwZXJjZW50czoKKyAgICAgICAgICAgIGtleSA9IHBlcmMuZ3JvdXAoImtleSIpCisgICAgICAgICAgICB2YWxba2V5XSA9IGZvcm1hdChwZXJjLmdyb3VwKCksIHZhbFtrZXldLCBncm91cGluZykKICAgICBlbHNlOgotICAgICAgICByYWlzZSBFcnJvciwgIlRvbyBtYW55IGRlY2ltYWwgcG9pbnRzIGluIHJlc3VsdCBzdHJpbmciCisgICAgICAgICMgdmFsIGlzIGEgc2luZ2xlIHZhbHVlCisgICAgICAgIHZhbCA9IGZvcm1hdChwZXJjZW50c1swXS5ncm91cCgpLCB2YWwsIGdyb3VwaW5nKQogCi0gICAgd2hpbGUgc2VwczoKLSAgICAgICAgIyBJZiB0aGUgbnVtYmVyIHdhcyBmb3JtYXR0ZWQgZm9yIGEgc3BlY2lmaWMgd2lkdGgsIHRoZW4gaXQKLSAgICAgICAgIyBtaWdodCBoYXZlIGJlZW4gZmlsbGVkIHdpdGggc3BhY2VzIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0LiBJZgotICAgICAgICAjIHNvLCBraWxsIGFzIG11Y2ggc3BhY2VzIGFzIHRoZXJlIHdoZXJlIHNlcGFyYXRvcnMuCi0gICAgICAgICMgTGVhZGluZyB6ZXJvZXMgYXMgZmlsbGVycyBhcmUgbm90IHlldCBkZWFsdCB3aXRoLCBhcyBpdCBpcwotICAgICAgICAjIG5vdCBjbGVhciBob3cgdGhleSBzaG91bGQgaW50ZXJhY3Qgd2l0aCBncm91cGluZy4KLSAgICAgICAgc3AgPSByZXN1bHQuZmluZCgiICIpCi0gICAgICAgIGlmIHNwPT0tMTpicmVhawotICAgICAgICByZXN1bHQgPSByZXN1bHRbOnNwXStyZXN1bHRbc3ArMTpdCi0gICAgICAgIHNlcHMgLT0gMQorICAgIHJldHVybiBuZXdfZiAlIHZhbAogCi0gICAgcmV0dXJuIHJlc3VsdAorZGVmIGN1cnJlbmN5KHZhbCwgc3ltYm9sPVRydWUsIGdyb3VwaW5nPUZhbHNlLCBpbnRlcm5hdGlvbmFsPUZhbHNlKToKKyAgICAiIiJGb3JtYXRzIHZhbCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbmN5IHNldHRpbmdzCisgICAgaW4gdGhlIGN1cnJlbnQgbG9jYWxlLiIiIgorICAgIGNvbnYgPSBsb2NhbGVjb252KCkKKworICAgICMgY2hlY2sgZm9yIGlsbGVnYWwgdmFsdWVzCisgICAgZGlnaXRzID0gY29udltpbnRlcm5hdGlvbmFsIGFuZCAnaW50X2ZyYWNfZGlnaXRzJyBvciAnZnJhY19kaWdpdHMnXQorICAgIGlmIGRpZ2l0cyA9PSAxMjc6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkN1cnJlbmN5IGZvcm1hdHRpbmcgaXMgbm90IHBvc3NpYmxlIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhlICdDJyBsb2NhbGUuIikKKworICAgIHMgPSBmb3JtYXQoJyUlLiVpZicgJSBkaWdpdHMsIGFicyh2YWwpLCBncm91cGluZywgbW9uZXRhcnk9VHJ1ZSkKKyAgICAjICc8JyBhbmQgJz4nIGFyZSBtYXJrZXJzIGlmIHRoZSBzaWduIG11c3QgYmUgaW5zZXJ0ZWQgYmV0d2VlbiBzeW1ib2wgYW5kIHZhbHVlCisgICAgcyA9ICc8JyArIHMgKyAnPicKKworICAgIGlmIHN5bWJvbDoKKyAgICAgICAgc21iID0gY29udltpbnRlcm5hdGlvbmFsIGFuZCAnaW50X2N1cnJfc3ltYm9sJyBvciAnY3VycmVuY3lfc3ltYm9sJ10KKyAgICAgICAgcHJlY2VkZXMgPSBjb252W3ZhbDwwIGFuZCAnbl9jc19wcmVjZWRlcycgb3IgJ3BfY3NfcHJlY2VkZXMnXQorICAgICAgICBzZXBhcmF0ZWQgPSBjb252W3ZhbDwwIGFuZCAnbl9zZXBfYnlfc3BhY2UnIG9yICdwX3NlcF9ieV9zcGFjZSddCisKKyAgICAgICAgaWYgcHJlY2VkZXM6CisgICAgICAgICAgICBzID0gc21iICsgKHNlcGFyYXRlZCBhbmQgJyAnIG9yICcnKSArIHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSBzICsgKHNlcGFyYXRlZCBhbmQgJyAnIG9yICcnKSArIHNtYgorCisgICAgc2lnbl9wb3MgPSBjb252W3ZhbDwwIGFuZCAnbl9zaWduX3Bvc24nIG9yICdwX3NpZ25fcG9zbiddCisgICAgc2lnbiA9IGNvbnZbdmFsPDAgYW5kICduZWdhdGl2ZV9zaWduJyBvciAncG9zaXRpdmVfc2lnbiddCisKKyAgICBpZiBzaWduX3BvcyA9PSAwOgorICAgICAgICBzID0gJygnICsgcyArICcpJworICAgIGVsaWYgc2lnbl9wb3MgPT0gMToKKyAgICAgICAgcyA9IHNpZ24gKyBzCisgICAgZWxpZiBzaWduX3BvcyA9PSAyOgorICAgICAgICBzID0gcyArIHNpZ24KKyAgICBlbGlmIHNpZ25fcG9zID09IDM6CisgICAgICAgIHMgPSBzLnJlcGxhY2UoJzwnLCBzaWduKQorICAgIGVsaWYgc2lnbl9wb3MgPT0gNDoKKyAgICAgICAgcyA9IHMucmVwbGFjZSgnPicsIHNpZ24pCisgICAgZWxzZToKKyAgICAgICAgIyB0aGUgZGVmYXVsdCBpZiBub3RoaW5nIHNwZWNpZmllZDsKKyAgICAgICAgIyB0aGlzIHNob3VsZCBiZSB0aGUgbW9zdCBmaXR0aW5nIHNpZ24gcG9zaXRpb24KKyAgICAgICAgcyA9IHNpZ24gKyBzCisKKyAgICByZXR1cm4gcy5yZXBsYWNlKCc8JywgJycpLnJlcGxhY2UoJz4nLCAnJykKIAogZGVmIHN0cih2YWwpOgogICAgICIiIkNvbnZlcnQgZmxvYXQgdG8gaW50ZWdlciwgdGFraW5nIHRoZSBsb2NhbGUgaW50byBhY2NvdW50LiIiIgotICAgIHJldHVybiBmb3JtYXQoIiUuMTJnIix2YWwpCisgICAgcmV0dXJuIGZvcm1hdCgiJS4xMmciLCB2YWwpCiAKLWRlZiBhdG9mKHN0cmluZyxmdW5jPWZsb2F0KToKK2RlZiBhdG9mKHN0cmluZywgZnVuYz1mbG9hdCk6CiAgICAgIlBhcnNlcyBhIHN0cmluZyBhcyBhIGZsb2F0IGFjY29yZGluZyB0byB0aGUgbG9jYWxlIHNldHRpbmdzLiIKICAgICAjRmlyc3QsIGdldCByaWQgb2YgdGhlIGdyb3VwaW5nCiAgICAgdHMgPSBsb2NhbGVjb252KClbJ3Rob3VzYW5kc19zZXAnXQpAQCAtMTc5LDEwICsyNjEsMTAgQEAKIGRlZiBfdGVzdCgpOgogICAgIHNldGxvY2FsZShMQ19BTEwsICIiKQogICAgICNkbyBncm91cGluZwotICAgIHMxPWZvcm1hdCgiJWQiLCAxMjM0NTY3ODksMSkKKyAgICBzMSA9IGZvcm1hdCgiJWQiLCAxMjM0NTY3ODksMSkKICAgICBwcmludCBzMSwgImlzIiwgYXRvaShzMSkKICAgICAjc3RhbmRhcmQgZm9ybWF0dGluZwotICAgIHMxPXN0cigzLjE0KQorICAgIHMxID0gc3RyKDMuMTQpCiAgICAgcHJpbnQgczEsICJpcyIsIGF0b2YoczEpCiAKICMjIyBMb2NhbGUgbmFtZSBhbGlhc2luZyBlbmdpbmUKZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5IGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKaW5kZXggOTc5ODkzMS4uYzY1ZDA3ZiAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKKysrIGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKQEAgLTQwLDcgKzQwLDcgQEAKICAgICB0aHJlYWQgPSBOb25lCiAKIF9fYXV0aG9yX18gID0gIlZpbmF5IFNhamlwIDx2aW5heV9zYWppcEByZWQtZG92ZS5jb20+IgotX19zdGF0dXNfXyAgPSAiYmV0YSIKK19fc3RhdHVzX18gID0gInByb2R1Y3Rpb24iCiBfX3ZlcnNpb25fXyA9ICIwLjQuOS45IgogX19kYXRlX18gICAgPSAiMDYgRmVicnVhcnkgMjAwNiIKIApkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQppbmRleCA4ZTU2OWE3Li5lMGRhMjU0IDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQorKysgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQpAQCAtNDQsNiArNDQsOCBAQAogREVGQVVMVF9TT0FQX0xPR0dJTkdfUE9SVCAgID0gOTAyMwogU1lTTE9HX1VEUF9QT1JUICAgICAgICAgICAgID0gNTE0CiAKK19NSUROSUdIVCA9IDI0ICogNjAgKiA2MCAgIyBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhIGRheQorCiBjbGFzcyBCYXNlUm90YXRpbmdIYW5kbGVyKGxvZ2dpbmcuRmlsZUhhbmRsZXIpOgogICAgICIiIgogICAgIEJhc2UgY2xhc3MgZm9yIGhhbmRsZXJzIHRoYXQgcm90YXRlIGxvZyBmaWxlcyBhdCBhIGNlcnRhaW4gcG9pbnQuCkBAIC0yMTcsMTIgKzIxOSw4IEBACiAgICAgICAgICAgICBjdXJyZW50TWludXRlID0gdFs0XQogICAgICAgICAgICAgY3VycmVudFNlY29uZCA9IHRbNV0KICAgICAgICAgICAgICMgciBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgbGVmdCBiZXR3ZWVuIG5vdyBhbmQgbWlkbmlnaHQKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWludXRlID09IDApIGFuZCAoY3VycmVudFNlY29uZCA9PSAwKToKLSAgICAgICAgICAgICAgICByID0gKDI0IC0gY3VycmVudEhvdXIpICogNjAgKiA2MCAjIG51bWJlciBvZiBob3VycyBpbiBzZWNvbmRzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHIgPSAoMjMgLSBjdXJyZW50SG91cikgKiA2MCAqIDYwCi0gICAgICAgICAgICAgICAgciA9IHIgKyAoNTkgLSBjdXJyZW50TWludXRlKSAqIDYwICMgcGx1cyB0aGUgbnVtYmVyIG9mIG1pbnV0ZXMgKGluIHNlY3MpCi0gICAgICAgICAgICAgICAgciA9IHIgKyAoNjAgLSBjdXJyZW50U2Vjb25kKSAjIHBsdXMgdGhlIG51bWJlciBvZiBzZWNvbmRzCisgICAgICAgICAgICByID0gX01JRE5JR0hUIC0gKChjdXJyZW50SG91ciAqIDYwICsgY3VycmVudE1pbnV0ZSkgKiA2MCArCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWNvbmQpCiAgICAgICAgICAgICBzZWxmLnJvbGxvdmVyQXQgPSBjdXJyZW50VGltZSArIHIKICAgICAgICAgICAgICMgSWYgd2UgYXJlIHJvbGxpbmcgb3ZlciBvbiBhIGNlcnRhaW4gZGF5LCBhZGQgaW4gdGhlIG51bWJlciBvZiBkYXlzIHVudGlsCiAgICAgICAgICAgICAjIHRoZSBuZXh0IHJvbGxvdmVyLCBidXQgb2Zmc2V0IGJ5IDEgc2luY2Ugd2UganVzdCBjYWxjdWxhdGVkIHRoZSB0aW1lCmRpZmYgLS1naXQgYS9MaWIvbWFpbGJveC5weSBiL0xpYi9tYWlsYm94LnB5CmluZGV4IGM4OWMxYTQuLmJiMTE1ZTEgMTAwNzU1Ci0tLSBhL0xpYi9tYWlsYm94LnB5CisrKyBiL0xpYi9tYWlsYm94LnB5CkBAIC0xLDEzICsxLDE4ODIgQEAKICMhIC91c3IvYmluL2VudiBweXRob24KIAotIiIiQ2xhc3NlcyB0byBoYW5kbGUgVW5peCBzdHlsZSwgTU1ERiBzdHlsZSwgYW5kIE1IIHN0eWxlIG1haWxib3hlcy4iIiIKKyIiIlJlYWQvd3JpdGUgc3VwcG9ydCBmb3IgTWFpbGRpciwgbWJveCwgTUgsIEJhYnlsLCBhbmQgTU1ERiBtYWlsYm94ZXMuIiIiCiAKLQotaW1wb3J0IHJmYzgyMgoraW1wb3J0IHN5cwogaW1wb3J0IG9zCitpbXBvcnQgdGltZQoraW1wb3J0IGNhbGVuZGFyCitpbXBvcnQgc29ja2V0CitpbXBvcnQgZXJybm8KK2ltcG9ydCBjb3B5CitpbXBvcnQgZW1haWwKK2ltcG9ydCBlbWFpbC5NZXNzYWdlCitpbXBvcnQgZW1haWwuR2VuZXJhdG9yCitpbXBvcnQgcmZjODIyCitpbXBvcnQgU3RyaW5nSU8KK3RyeToKKyAgICBpbXBvcnQgZm5jdGwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmY250bCA9IE5vbmUKIAotX19hbGxfXyA9IFsiVW5peE1haWxib3giLCJNbWRmTWFpbGJveCIsIk1ITWFpbGJveCIsIk1haWxkaXIiLCJCYWJ5bE1haWxib3giLAotICAgICAgICAgICAiUG9ydGFibGVVbml4TWFpbGJveCJdCitfX2FsbF9fID0gWyAnTWFpbGJveCcsICdNYWlsZGlyJywgJ21ib3gnLCAnTUgnLCAnQmFieWwnLCAnTU1ERicsCisgICAgICAgICAgICAnTWVzc2FnZScsICdNYWlsZGlyTWVzc2FnZScsICdtYm94TWVzc2FnZScsICdNSE1lc3NhZ2UnLAorICAgICAgICAgICAgJ0JhYnlsTWVzc2FnZScsICdNTURGTWVzc2FnZScsICdVbml4TWFpbGJveCcsCisgICAgICAgICAgICAnUG9ydGFibGVVbml4TWFpbGJveCcsICdNbWRmTWFpbGJveCcsICdNSE1haWxib3gnLCAnQmFieWxNYWlsYm94JyBdCisKK2NsYXNzIE1haWxib3g6CisgICAgIiIiQSBncm91cCBvZiBtZXNzYWdlcyBpbiBhIHBhcnRpY3VsYXIgcGxhY2UuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBNYWlsYm94IGluc3RhbmNlLiIiIgorICAgICAgICBzZWxmLl9wYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZXhwYW5kdXNlcihwYXRoKSkKKyAgICAgICAgc2VsZi5fZmFjdG9yeSA9IGZhY3RvcnkKKworICAgIGRlZiBhZGQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkFkZCBtZXNzYWdlIGFuZCByZXR1cm4gYXNzaWduZWQga2V5LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYucmVtb3ZlKGtleSkKKworICAgIGRlZiBkaXNjYXJkKHNlbGYsIGtleSk6CisgICAgICAgICIiIklmIHRoZSBrZXllZCBtZXNzYWdlIGV4aXN0cywgcmVtb3ZlIGl0LiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJlbW92ZShrZXkpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIG1lc3NhZ2UpOgorICAgICAgICAiIiJSZXBsYWNlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBrZXllZCBtZXNzYWdlLCBvciBkZWZhdWx0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZ2V0aXRlbV9fKGtleSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9mYWN0b3J5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X21lc3NhZ2Uoa2V5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhY3Rvcnkoc2VsZi5nZXRfZmlsZShrZXkpKQorCisgICAgZGVmIGdldF9tZXNzYWdlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIE1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGdldF9zdHJpbmcoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBnZXRfZmlsZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBrZXlzLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBrZXlzLiIiIgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJrZXlzKCkpCisKKyAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIG1lc3NhZ2VzLiIiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuaXRlcmtleXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB5aWVsZCB2YWx1ZQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pdGVydmFsdWVzKCkKKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbWVzc2FnZXMuIE1lbW9yeSBpbnRlbnNpdmUuIiIiCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQorCisgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgKGtleSwgbWVzc2FnZSkgdHVwbGVzLiIiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuaXRlcmtleXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB5aWVsZCAoa2V5LCB2YWx1ZSkKKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiAoa2V5LCBtZXNzYWdlKSB0dXBsZXMuIE1lbW9yeSBpbnRlbnNpdmUuIiIiCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcml0ZW1zKCkpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUga2V5ZWQgbWVzc2FnZSBleGlzdHMsIEZhbHNlIG90aGVyd2lzZS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi5oYXNfa2V5KGtleSkKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjb3VudCBvZiBtZXNzYWdlcyBpbiB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAiIiJEZWxldGUgYWxsIG1lc3NhZ2VzLiIiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuaXRlcmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuZGlzY2FyZChrZXkpCisKKyAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSBrZXllZCBtZXNzYWdlIGFuZCByZXR1cm4gaXQsIG9yIGRlZmF1bHQuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgICAgICBzZWxmLmRpc2NhcmQoa2V5KQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcG9waXRlbShzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlIGFuIGFyYml0cmFyeSAoa2V5LCBtZXNzYWdlKSBwYWlyIGFuZCByZXR1cm4gaXQuIiIiCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5pdGVya2V5cygpOgorICAgICAgICAgICAgcmV0dXJuIChrZXksIHNlbGYucG9wKGtleSkpICAgICAjIFRoaXMgaXMgb25seSBydW4gb25jZS4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlcyBpbiBtYWlsYm94JykKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgYXJnPU5vbmUpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIG1lc3NhZ2VzIHRoYXQgY29ycmVzcG9uZCB0byBjZXJ0YWluIGtleXMuIiIiCisgICAgICAgIGlmIGhhc2F0dHIoYXJnLCAnaXRlcml0ZW1zJyk6CisgICAgICAgICAgICBzb3VyY2UgPSBhcmcuaXRlcml0ZW1zKCkKKyAgICAgICAgZWxpZiBoYXNhdHRyKGFyZywgJ2l0ZW1zJyk6CisgICAgICAgICAgICBzb3VyY2UgPSBhcmcuaXRlbXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc291cmNlID0gYXJnCisgICAgICAgIGJhZF9rZXkgPSBGYWxzZQorICAgICAgICBmb3Iga2V5LCBtZXNzYWdlIGluIHNvdXJjZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBtZXNzYWdlCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgYmFkX2tleSA9IFRydWUKKyAgICAgICAgaWYgYmFkX2tleToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5KHMpJykKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiV3JpdGUgYW55IHBlbmRpbmcgY2hhbmdlcyB0byB0aGUgZGlzay4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGxvY2soc2VsZik6CisgICAgICAgICIiIkxvY2sgdGhlIG1haWxib3guIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiB1bmxvY2soc2VsZik6CisgICAgICAgICIiIlVubG9jayB0aGUgbWFpbGJveCBpZiBpdCBpcyBsb2NrZWQuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggYW5kIGNsb3NlIHRoZSBtYWlsYm94LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgX2R1bXBfbWVzc2FnZShzZWxmLCBtZXNzYWdlLCB0YXJnZXQsIG1hbmdsZV9mcm9tXz1GYWxzZSk6CisgICAgICAgICMgTW9zdCBmaWxlcyBhcmUgb3BlbmVkIGluIGJpbmFyeSBtb2RlIHRvIGFsbG93IHByZWRpY3RhYmxlIHNlZWtpbmcuCisgICAgICAgICMgVG8gZ2V0IG5hdGl2ZSBsaW5lIGVuZGluZ3Mgb24gZGlzaywgdGhlIHVzZXItZnJpZW5kbHkgXG4gbGluZSBlbmRpbmdzCisgICAgICAgICMgdXNlZCBpbiBzdHJpbmdzIGFuZCBieSBlbWFpbC5NZXNzYWdlIGFyZSB0cmFuc2xhdGVkIGhlcmUuCisgICAgICAgICIiIkR1bXAgbWVzc2FnZSBjb250ZW50cyB0byB0YXJnZXQgZmlsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBlbWFpbC5NZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAgICAgYnVmZmVyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgZ2VuID0gZW1haWwuR2VuZXJhdG9yLkdlbmVyYXRvcihidWZmZXIsIG1hbmdsZV9mcm9tXywgMCkKKyAgICAgICAgICAgIGdlbi5mbGF0dGVuKG1lc3NhZ2UpCisgICAgICAgICAgICBidWZmZXIuc2VlaygwKQorICAgICAgICAgICAgdGFyZ2V0LndyaXRlKGJ1ZmZlci5yZWFkKCkucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIHN0cik6CisgICAgICAgICAgICBpZiBtYW5nbGVfZnJvbV86CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnXG5Gcm9tICcsICdcbj5Gcm9tICcpCisgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApCisgICAgICAgICAgICB0YXJnZXQud3JpdGUobWVzc2FnZSkKKyAgICAgICAgZWxpZiBoYXNhdHRyKG1lc3NhZ2UsICdyZWFkJyk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBtZXNzYWdlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG1hbmdsZV9mcm9tXyBhbmQgbGluZS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJz5Gcm9tICcgKyBsaW5lWzU6XQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkKKyAgICAgICAgICAgICAgICB0YXJnZXQud3JpdGUobGluZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignSW52YWxpZCBtZXNzYWdlIHR5cGU6ICVzJyAlIHR5cGUobWVzc2FnZSkpCisKKworY2xhc3MgTWFpbGRpcihNYWlsYm94KToKKyAgICAiIiJBIHFtYWlsLXN0eWxlIE1haWxkaXIgbWFpbGJveC4iIiIKKworICAgIGNvbG9uID0gJzonCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlybmFtZSwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSwgY3JlYXRlPVRydWUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgTWFpbGRpciBpbnN0YW5jZS4iIiIKKyAgICAgICAgTWFpbGJveC5fX2luaXRfXyhzZWxmLCBkaXJuYW1lLCBmYWN0b3J5LCBjcmVhdGUpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLl9wYXRoKToKKyAgICAgICAgICAgIGlmIGNyZWF0ZToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihzZWxmLl9wYXRoLCAwNzAwKQorICAgICAgICAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAndG1wJyksIDA3MDApCisgICAgICAgICAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICduZXcnKSwgMDcwMCkKKyAgICAgICAgICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2N1cicpLCAwNzAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb1N1Y2hNYWlsYm94RXJyb3Ioc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fdG9jID0ge30KKworICAgIGRlZiBhZGQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkFkZCBtZXNzYWdlIGFuZCByZXR1cm4gYXNzaWduZWQga2V5LiIiIgorICAgICAgICB0bXBfZmlsZSA9IHNlbGYuX2NyZWF0ZV90bXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9kdW1wX21lc3NhZ2UobWVzc2FnZSwgdG1wX2ZpbGUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0bXBfZmlsZS5jbG9zZSgpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgc3ViZGlyID0gbWVzc2FnZS5nZXRfc3ViZGlyKCkKKyAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuY29sb24gKyBtZXNzYWdlLmdldF9pbmZvKCkKKyAgICAgICAgICAgIGlmIHN1ZmZpeCA9PSBzZWxmLmNvbG9uOgorICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWJkaXIgPSAnbmV3JworICAgICAgICAgICAgc3VmZml4ID0gJycKKyAgICAgICAgdW5pcSA9IG9zLnBhdGguYmFzZW5hbWUodG1wX2ZpbGUubmFtZSkuc3BsaXQoc2VsZi5jb2xvbilbMF0KKyAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIsIHVuaXEgKyBzdWZmaXgpCisgICAgICAgIG9zLnJlbmFtZSh0bXBfZmlsZS5uYW1lLCBkZXN0KQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1haWxkaXJNZXNzYWdlKToKKyAgICAgICAgICAgIG9zLnV0aW1lKGRlc3QsIChvcy5wYXRoLmdldGF0aW1lKGRlc3QpLCBtZXNzYWdlLmdldF9kYXRlKCkpKQorICAgICAgICByZXR1cm4gdW5pcQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc2VsZi5fbG9va3VwKGtleSkpKQorCisgICAgZGVmIGRpc2NhcmQoc2VsZiwga2V5KToKKyAgICAgICAgIiIiSWYgdGhlIGtleWVkIG1lc3NhZ2UgZXhpc3RzLCByZW1vdmUgaXQuIiIiCisgICAgICAgICMgVGhpcyBvdmVycmlkZXMgYW4gaW5hcHBsaWNhYmxlIGltcGxlbWVudGF0aW9uIGluIHRoZSBzdXBlcmNsYXNzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJlbW92ZShrZXkpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgbWVzc2FnZSk6CisgICAgICAgICIiIlJlcGxhY2UgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIG9sZF9zdWJwYXRoID0gc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgdGVtcF9rZXkgPSBzZWxmLmFkZChtZXNzYWdlKQorICAgICAgICB0ZW1wX3N1YnBhdGggPSBzZWxmLl9sb29rdXAodGVtcF9rZXkpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgIyB0ZW1wJ3Mgc3ViZGlyIGFuZCBzdWZmaXggd2VyZSBzcGVjaWZpZWQgYnkgbWVzc2FnZS4KKyAgICAgICAgICAgIGRvbWluYW50X3N1YnBhdGggPSB0ZW1wX3N1YnBhdGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdGVtcCdzIHN1YmRpciBhbmQgc3VmZml4IHdlcmUgZGVmYXVsdHMgZnJvbSBhZGQoKS4KKyAgICAgICAgICAgIGRvbWluYW50X3N1YnBhdGggPSBvbGRfc3VicGF0aAorICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZG9taW5hbnRfc3VicGF0aCkKKyAgICAgICAgaWYgc2VsZi5jb2xvbiBpbiBkb21pbmFudF9zdWJwYXRoOgorICAgICAgICAgICAgc3VmZml4ID0gc2VsZi5jb2xvbiArIGRvbWluYW50X3N1YnBhdGguc3BsaXQoc2VsZi5jb2xvbilbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWZmaXggPSAnJworICAgICAgICBzZWxmLmRpc2NhcmQoa2V5KQorICAgICAgICBuZXdfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIsIGtleSArIHN1ZmZpeCkKKyAgICAgICAgb3MucmVuYW1lKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCB0ZW1wX3N1YnBhdGgpLCBuZXdfcGF0aCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBvcy51dGltZShuZXdfcGF0aCwgKG9zLnBhdGguZ2V0YXRpbWUobmV3X3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldF9kYXRlKCkpKQorCisgICAgZGVmIGdldF9tZXNzYWdlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIE1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgc3VicGF0aCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJwYXRoKSwgJ3InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBNYWlsZGlyTWVzc2FnZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHN1YmRpciwgbmFtZSA9IG9zLnBhdGguc3BsaXQoc3VicGF0aCkKKyAgICAgICAgbXNnLnNldF9zdWJkaXIoc3ViZGlyKQorICAgICAgICBpZiBzZWxmLmNvbG9uIGluIG5hbWU6CisgICAgICAgICAgICBtc2cuc2V0X2luZm8obmFtZS5zcGxpdChzZWxmLmNvbG9uKVstMV0pCisgICAgICAgIG1zZy5zZXRfZGF0ZShvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJwYXRoKSkpCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBnZXRfc3RyaW5nKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc2VsZi5fbG9va3VwKGtleSkpLCAncicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X2ZpbGUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzZWxmLl9sb29rdXAoa2V5KSksICdyYicpCisgICAgICAgIHJldHVybiBfUHJveHlGaWxlKGYpCisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIGtleXMuIiIiCisgICAgICAgIHNlbGYuX3JlZnJlc2goKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX3RvYzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB5aWVsZCBrZXkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBrZXllZCBtZXNzYWdlIGV4aXN0cywgRmFsc2Ugb3RoZXJ3aXNlLiIiIgorICAgICAgICBzZWxmLl9yZWZyZXNoKCkKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl90b2MKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjb3VudCBvZiBtZXNzYWdlcyBpbiB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5fcmVmcmVzaCgpCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fdG9jKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIGRpc2suIiIiCisgICAgICAgIHJldHVybiAgIyBNYWlsZGlyIGNoYW5nZXMgYXJlIGFsd2F5cyB3cml0dGVuIGltbWVkaWF0ZWx5LgorCisgICAgZGVmIGxvY2soc2VsZik6CisgICAgICAgICIiIkxvY2sgdGhlIG1haWxib3guIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHVubG9jayhzZWxmKToKKyAgICAgICAgIiIiVW5sb2NrIHRoZSBtYWlsYm94IGlmIGl0IGlzIGxvY2tlZC4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkZsdXNoIGFuZCBjbG9zZSB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgbGlzdF9mb2xkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGZvbGRlciBuYW1lcy4iIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIoc2VsZi5fcGF0aCk6CisgICAgICAgICAgICBpZiBsZW4oZW50cnkpID4gMSBhbmQgZW50cnlbMF0gPT0gJy4nIGFuZCBcCisgICAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBlbnRyeSkpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnlbMTpdKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0X2ZvbGRlcihzZWxmLCBmb2xkZXIpOgorICAgICAgICAiIiJSZXR1cm4gYSBNYWlsZGlyIGluc3RhbmNlIGZvciB0aGUgbmFtZWQgZm9sZGVyLiIiIgorICAgICAgICByZXR1cm4gTWFpbGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy4nICsgZm9sZGVyKSwgY3JlYXRlPUZhbHNlKQorCisgICAgZGVmIGFkZF9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgZm9sZGVyIGFuZCByZXR1cm4gYSBNYWlsZGlyIGluc3RhbmNlIHJlcHJlc2VudGluZyBpdC4iIiIKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLicgKyBmb2xkZXIpCisgICAgICAgIHJlc3VsdCA9IE1haWxkaXIocGF0aCkKKyAgICAgICAgbWFpbGRpcmZvbGRlcl9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdtYWlsZGlyZm9sZGVyJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG1haWxkaXJmb2xkZXJfcGF0aCk6CisgICAgICAgICAgICBvcy5jbG9zZShvcy5vcGVuKG1haWxkaXJmb2xkZXJfcGF0aCwgb3MuT19DUkVBVCB8IG9zLk9fV1JPTkxZKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHJlbW92ZV9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSBuYW1lZCBmb2xkZXIsIHdoaWNoIG11c3QgYmUgZW1wdHkuIiIiCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy4nICsgZm9sZGVyKQorICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4ocGF0aCwgJ25ldycpKSArIFwKKyAgICAgICAgICAgICAgICAgICAgIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBhdGgsICdjdXInKSk6CisgICAgICAgICAgICBpZiBsZW4oZW50cnkpIDwgMSBvciBlbnRyeVswXSAhPSAnLic6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90RW1wdHlFcnJvcignRm9sZGVyIGNvbnRhaW5zIG1lc3NhZ2Uocyk6ICVzJyAlIGZvbGRlcikKKyAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICBpZiBlbnRyeSAhPSAnbmV3JyBhbmQgZW50cnkgIT0gJ2N1cicgYW5kIGVudHJ5ICE9ICd0bXAnIGFuZCBcCisgICAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoLCBlbnRyeSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEVtcHR5RXJyb3IoIkZvbGRlciBjb250YWlucyBzdWJkaXJlY3RvcnkgJyVzJzogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xkZXIsIGVudHJ5KSkKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCwgdG9wZG93bj1GYWxzZSk6CisgICAgICAgICAgICBmb3IgZW50cnkgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBlbnRyeSkpCisgICAgICAgICAgICBmb3IgZW50cnkgaW4gZGlyczoKKyAgICAgICAgICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4ocm9vdCwgZW50cnkpKQorICAgICAgICBvcy5ybWRpcihwYXRoKQorCisgICAgZGVmIGNsZWFuKHNlbGYpOgorICAgICAgICAiIiJEZWxldGUgb2xkIGZpbGVzIGluICJ0bXAiLiIiIgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcpKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcsIGVudHJ5KQorICAgICAgICAgICAgaWYgbm93IC0gb3MucGF0aC5nZXRhdGltZShwYXRoKSA+IDEyOTYwMDogICAjIDYwICogNjAgKiAzNgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorCisgICAgX2NvdW50ID0gMSAgIyBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIGZpbGUgbmFtZXMuCisKKyAgICBkZWYgX2NyZWF0ZV90bXAoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBhIGZpbGUgaW4gdGhlIHRtcCBzdWJkaXJlY3RvcnkgYW5kIG9wZW4gYW5kIHJldHVybiBpdC4iIiIKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgaG9zdG5hbWUgPSBzb2NrZXQuZ2V0aG9zdG5hbWUoKQorICAgICAgICBpZiAnLycgaW4gaG9zdG5hbWU6CisgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoJy8nLCByJ1wwNTcnKQorICAgICAgICBpZiAnOicgaW4gaG9zdG5hbWU6CisgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoJzonLCByJ1wwNzInKQorICAgICAgICB1bmlxID0gIiVzLk0lc1Alc1Elcy4lcyIgJSAoaW50KG5vdyksIGludChub3cgJSAxICogMWU2KSwgb3MuZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWlsZGlyLl9jb3VudCwgaG9zdG5hbWUpCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcsIHVuaXEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnN0YXQocGF0aCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICBNYWlsZGlyLl9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW4ocGF0aCwgJ3diKycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ05hbWUgY2xhc2ggcHJldmVudGVkIGZpbGUgY3JlYXRpb246ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCkKKworICAgIGRlZiBfcmVmcmVzaChzZWxmKToKKyAgICAgICAgIiIiVXBkYXRlIHRhYmxlIG9mIGNvbnRlbnRzIG1hcHBpbmcuIiIiCisgICAgICAgIHNlbGYuX3RvYyA9IHt9CisgICAgICAgIGZvciBzdWJkaXIgaW4gKCduZXcnLCAnY3VyJyk6CisgICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyKSk6CisgICAgICAgICAgICAgICAgdW5pcSA9IGVudHJ5LnNwbGl0KHNlbGYuY29sb24pWzBdCisgICAgICAgICAgICAgICAgc2VsZi5fdG9jW3VuaXFdID0gb3MucGF0aC5qb2luKHN1YmRpciwgZW50cnkpCisKKyAgICBkZWYgX2xvb2t1cChzZWxmLCBrZXkpOgorICAgICAgICAiIiJVc2UgVE9DIHRvIHJldHVybiBzdWJwYXRoIGZvciBnaXZlbiBrZXksIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzZWxmLl90b2Nba2V5XSkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl90b2Nba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuX3JlZnJlc2goKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdG9jW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKworICAgICMgVGhpcyBtZXRob2QgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seS4KKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IG1lc3NhZ2UgaW4gYSBvbmUtdGltZSBpdGVyYXRpb24uIiIiCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdfb25ldGltZV9rZXlzJyk6CisgICAgICAgICAgICBzZWxmLl9vbmV0aW1lX2tleXMgPSBzZWxmLml0ZXJrZXlzKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZltzZWxmLl9vbmV0aW1lX2tleXMubmV4dCgpXQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisKK2NsYXNzIF9zaW5nbGVmaWxlTWFpbGJveChNYWlsYm94KToKKyAgICAiIiJBIHNpbmdsZS1maWxlIG1haWxib3guIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBzaW5nbGUtZmlsZSBtYWlsYm94LiIiIgorICAgICAgICBNYWlsYm94Ll9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3RvcnksIGNyZWF0ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5fcGF0aCwgJ3JiKycpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgaWYgY3JlYXRlOgorICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihzZWxmLl9wYXRoLCAnd2IrJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOb1N1Y2hNYWlsYm94RXJyb3Ioc2VsZi5fcGF0aCkKKyAgICAgICAgICAgIGVsaWYgZS5lcnJubyA9PSBlcnJuby5FQUNDRVM6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5fcGF0aCwgJ3JiJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5fZmlsZSA9IGYKKyAgICAgICAgc2VsZi5fdG9jID0gTm9uZQorICAgICAgICBzZWxmLl9uZXh0X2tleSA9IDAKKyAgICAgICAgc2VsZi5fcGVuZGluZyA9IEZhbHNlICAgIyBObyBjaGFuZ2VzIHJlcXVpcmUgcmV3cml0aW5nIHRoZSBmaWxlLgorICAgICAgICBzZWxmLl9sb2NrZWQgPSBGYWxzZQorCisgICAgZGVmIGFkZChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2UgYW5kIHJldHVybiBhc3NpZ25lZCBrZXkuIiIiCisgICAgICAgIHNlbGYuX2xvb2t1cCgpCisgICAgICAgIHNlbGYuX3RvY1tzZWxmLl9uZXh0X2tleV0gPSBzZWxmLl9hcHBlbmRfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICBzZWxmLl9uZXh0X2tleSArPSAxCisgICAgICAgIHNlbGYuX3BlbmRpbmcgPSBUcnVlCisgICAgICAgIHJldHVybiBzZWxmLl9uZXh0X2tleSAtIDEKKworICAgIGRlZiByZW1vdmUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBkZWwgc2VsZi5fdG9jW2tleV0KKyAgICAgICAgc2VsZi5fcGVuZGluZyA9IFRydWUKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIG1lc3NhZ2UpOgorICAgICAgICAiIiJSZXBsYWNlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBzZWxmLl90b2Nba2V5XSA9IHNlbGYuX2FwcGVuZF9tZXNzYWdlKG1lc3NhZ2UpCisgICAgICAgIHNlbGYuX3BlbmRpbmcgPSBUcnVlCisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIGtleXMuIiIiCisgICAgICAgIHNlbGYuX2xvb2t1cCgpCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fdG9jLmtleXMoKToKKyAgICAgICAgICAgIHlpZWxkIGtleQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIGtleWVkIG1lc3NhZ2UgZXhpc3RzLCBGYWxzZSBvdGhlcndpc2UuIiIiCisgICAgICAgIHNlbGYuX2xvb2t1cCgpCisgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fdG9jCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgY291bnQgb2YgbWVzc2FnZXMgaW4gdGhlIG1haWxib3guIiIiCisgICAgICAgIHNlbGYuX2xvb2t1cCgpCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fdG9jKQorCisgICAgZGVmIGxvY2soc2VsZik6CisgICAgICAgICIiIkxvY2sgdGhlIG1haWxib3guIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBfbG9ja19maWxlKHNlbGYuX2ZpbGUpCisgICAgICAgICAgICBzZWxmLl9sb2NrZWQgPSBUcnVlCisKKyAgICBkZWYgdW5sb2NrKHNlbGYpOgorICAgICAgICAiIiJVbmxvY2sgdGhlIG1haWxib3ggaWYgaXQgaXMgbG9ja2VkLiIiIgorICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIHNlbGYuX2xvY2tlZCA9IEZhbHNlCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIldyaXRlIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gZGlzay4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX3BlbmRpbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fbG9va3VwKCkKKyAgICAgICAgbmV3X2ZpbGUgPSBfY3JlYXRlX3RlbXBvcmFyeShzZWxmLl9wYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXdfdG9jID0ge30KKyAgICAgICAgICAgIHNlbGYuX3ByZV9tYWlsYm94X2hvb2sobmV3X2ZpbGUpCisgICAgICAgICAgICBmb3Iga2V5IGluIHNvcnRlZChzZWxmLl90b2Mua2V5cygpKToKKyAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYuX3RvY1trZXldCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHN0YXJ0KQorICAgICAgICAgICAgICAgIHNlbGYuX3ByZV9tZXNzYWdlX2hvb2sobmV3X2ZpbGUpCisgICAgICAgICAgICAgICAgbmV3X3N0YXJ0ID0gbmV3X2ZpbGUudGVsbCgpCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gc2VsZi5fZmlsZS5yZWFkKG1pbig0MDk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgLSBzZWxmLl9maWxlLnRlbGwoKSkpCisgICAgICAgICAgICAgICAgICAgIGlmIGJ1ZmZlciA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIG5ld19maWxlLndyaXRlKGJ1ZmZlcikKKyAgICAgICAgICAgICAgICBuZXdfdG9jW2tleV0gPSAobmV3X3N0YXJ0LCBuZXdfZmlsZS50ZWxsKCkpCisgICAgICAgICAgICAgICAgc2VsZi5fcG9zdF9tZXNzYWdlX2hvb2sobmV3X2ZpbGUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIG5ld19maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShuZXdfZmlsZS5uYW1lKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgbmV3X2ZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVuYW1lKG5ld19maWxlLm5hbWUsIHNlbGYuX3BhdGgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuX3BhdGgpCisgICAgICAgICAgICAgICAgb3MucmVuYW1lKG5ld19maWxlLm5hbWUsIHNlbGYuX3BhdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKHNlbGYuX3BhdGgsICdyYisnKQorICAgICAgICBzZWxmLl90b2MgPSBuZXdfdG9jCisgICAgICAgIHNlbGYuX3BlbmRpbmcgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBfbG9ja19maWxlKG5ld19maWxlLCBkb3Rsb2NrPUZhbHNlKQorCisgICAgZGVmIF9wcmVfbWFpbGJveF9ob29rKHNlbGYsIGYpOgorICAgICAgICAiIiJDYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG1haWxib3ggdG8gZmlsZSBmLiIiIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBfcHJlX21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIF9wb3N0X21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGFmdGVyIHdyaXRpbmcgZWFjaCBtZXNzYWdlIHRvIGZpbGUgZi4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkZsdXNoIGFuZCBjbG9zZSB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIHNlbGYudW5sb2NrKCkKKyAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisKKyAgICBkZWYgX2xvb2t1cChzZWxmLCBrZXk9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiAoc3RhcnQsIHN0b3ApIG9yIHJhaXNlIEtleUVycm9yLiIiIgorICAgICAgICBpZiBzZWxmLl90b2MgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2dlbmVyYXRlX3RvYygpCisgICAgICAgIGlmIGtleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdG9jW2tleV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8gbWVzc2FnZSB3aXRoIGtleTogJXMnICUga2V5KQorCisgICAgZGVmIF9hcHBlbmRfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQXBwZW5kIG1lc3NhZ2UgdG8gbWFpbGJveCBhbmQgcmV0dXJuIChzdGFydCwgc3RvcCkgb2Zmc2V0cy4iIiIKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDAsIDIpCisgICAgICAgIHNlbGYuX3ByZV9tZXNzYWdlX2hvb2soc2VsZi5fZmlsZSkKKyAgICAgICAgb2Zmc2V0cyA9IHNlbGYuX2luc3RhbGxfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICBzZWxmLl9wb3N0X21lc3NhZ2VfaG9vayhzZWxmLl9maWxlKQorICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIG9mZnNldHMKKworCisKK2NsYXNzIF9tYm94TU1ERihfc2luZ2xlZmlsZU1haWxib3gpOgorICAgICIiIkFuIG1ib3ggb3IgTU1ERiBtYWlsYm94LiIiIgorCisgICAgX21hbmdsZV9mcm9tXyA9IFRydWUKKworICAgIGRlZiBnZXRfbWVzc2FnZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHN0YXJ0KQorICAgICAgICBmcm9tX2xpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkucmVwbGFjZShvcy5saW5lc2VwLCAnJykKKyAgICAgICAgc3RyaW5nID0gc2VsZi5fZmlsZS5yZWFkKHN0b3AgLSBzZWxmLl9maWxlLnRlbGwoKSkKKyAgICAgICAgbXNnID0gc2VsZi5fbWVzc2FnZV9mYWN0b3J5KHN0cmluZy5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpKQorICAgICAgICBtc2cuc2V0X2Zyb20oZnJvbV9saW5lWzU6XSkKKyAgICAgICAgcmV0dXJuIG1zZworCisgICAgZGVmIGdldF9zdHJpbmcoc2VsZiwga2V5LCBmcm9tXz1GYWxzZSk6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzdGFydCkKKyAgICAgICAgaWYgbm90IGZyb21fOgorICAgICAgICAgICAgc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHN0cmluZyA9IHNlbGYuX2ZpbGUucmVhZChzdG9wIC0gc2VsZi5fZmlsZS50ZWxsKCkpCisgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKQorCisgICAgZGVmIGdldF9maWxlKHNlbGYsIGtleSwgZnJvbV89RmFsc2UpOgorICAgICAgICAiIiJSZXR1cm4gYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc3RhcnQpCisgICAgICAgIGlmIG5vdCBmcm9tXzoKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICByZXR1cm4gX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIHNlbGYuX2ZpbGUudGVsbCgpLCBzdG9wKQorCisgICAgZGVmIF9pbnN0YWxsX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkZvcm1hdCBhIG1lc3NhZ2UgYW5kIGJsaW5kbHkgd3JpdGUgdG8gc2VsZi5fZmlsZS4iIiIKKyAgICAgICAgZnJvbV9saW5lID0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIHN0cikgYW5kIG1lc3NhZ2Uuc3RhcnRzd2l0aCgnRnJvbSAnKToKKyAgICAgICAgICAgIG5ld2xpbmUgPSBtZXNzYWdlLmZpbmQoJ1xuJykKKyAgICAgICAgICAgIGlmIG5ld2xpbmUgIT0gLTE6CisgICAgICAgICAgICAgICAgZnJvbV9saW5lID0gbWVzc2FnZVs6bmV3bGluZV0KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVtuZXdsaW5lICsgMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZyb21fbGluZSA9IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gJycKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIF9tYm94TU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgZnJvbV9saW5lID0gJ0Zyb20gJyArIG1lc3NhZ2UuZ2V0X2Zyb20oKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgZW1haWwuTWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgICAgIGZyb21fbGluZSA9IG1lc3NhZ2UuZ2V0X3VuaXhmcm9tKCkgICMgTWF5IGJlIE5vbmUuCisgICAgICAgIGlmIGZyb21fbGluZSBpcyBOb25lOgorICAgICAgICAgICAgZnJvbV9saW5lID0gJ0Zyb20gTUFJTEVSLURBRU1PTiAlcycgJSB0aW1lLmFzY3RpbWUodGltZS5nbXRpbWUoKSkKKyAgICAgICAgc3RhcnQgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKGZyb21fbGluZSArIG9zLmxpbmVzZXApCisgICAgICAgIHNlbGYuX2R1bXBfbWVzc2FnZShtZXNzYWdlLCBzZWxmLl9maWxlLCBzZWxmLl9tYW5nbGVfZnJvbV8pCisgICAgICAgIHN0b3AgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICByZXR1cm4gKHN0YXJ0LCBzdG9wKQorCisKK2NsYXNzIG1ib3goX21ib3hNTURGKToKKyAgICAiIiJBIGNsYXNzaWMgbWJveCBtYWlsYm94LiIiIgorCisgICAgX21hbmdsZV9mcm9tXyA9IFRydWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBtYm94IG1haWxib3guIiIiCisgICAgICAgIHNlbGYuX21lc3NhZ2VfZmFjdG9yeSA9IG1ib3hNZXNzYWdlCisgICAgICAgIF9tYm94TU1ERi5fX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5LCBjcmVhdGUpCisKKyAgICBkZWYgX3ByZV9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBiZWZvcmUgd3JpdGluZyBlYWNoIG1lc3NhZ2UgdG8gZmlsZSBmLiIiIgorICAgICAgICBpZiBmLnRlbGwoKSAhPSAwOgorICAgICAgICAgICAgZi53cml0ZShvcy5saW5lc2VwKQorCisgICAgZGVmIF9nZW5lcmF0ZV90b2Moc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIGtleS10by0oc3RhcnQsIHN0b3ApIHRhYmxlIG9mIGNvbnRlbnRzLiIiIgorICAgICAgICBzdGFydHMsIHN0b3BzID0gW10sIFtdCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZV9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgIGlmIGxlbihzdG9wcykgPCBsZW4oc3RhcnRzKToKKyAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zIC0gbGVuKG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgIHN0YXJ0cy5hcHBlbmQobGluZV9wb3MpCisgICAgICAgICAgICBlbGlmIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuX3RvYyA9IGRpY3QoZW51bWVyYXRlKHppcChzdGFydHMsIHN0b3BzKSkpCisgICAgICAgIHNlbGYuX25leHRfa2V5ID0gbGVuKHNlbGYuX3RvYykKKworCitjbGFzcyBNTURGKF9tYm94TU1ERik6CisgICAgIiIiQW4gTU1ERiBtYWlsYm94LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZSwgY3JlYXRlPVRydWUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIE1NREYgbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5fbWVzc2FnZV9mYWN0b3J5ID0gTU1ERk1lc3NhZ2UKKyAgICAgICAgX21ib3hNTURGLl9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3RvcnksIGNyZWF0ZSkKKworICAgIGRlZiBfcHJlX21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUoJ1wwMDFcMDAxXDAwMVwwMDEnICsgb3MubGluZXNlcCkKKworICAgIGRlZiBfcG9zdF9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBhZnRlciB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUob3MubGluZXNlcCArICdcMDAxXDAwMVwwMDFcMDAxJyArIG9zLmxpbmVzZXApCisKKyAgICBkZWYgX2dlbmVyYXRlX3RvYyhzZWxmKToKKyAgICAgICAgIiIiR2VuZXJhdGUga2V5LXRvLShzdGFydCwgc3RvcCkgdGFibGUgb2YgY29udGVudHMuIiIiCisgICAgICAgIHN0YXJ0cywgc3RvcHMgPSBbXSwgW10KKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDApCisgICAgICAgIG5leHRfcG9zID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZV9wb3MgPSBuZXh0X3BvcworICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgbmV4dF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdcMDAxXDAwMVwwMDFcMDAxJyArIG9zLmxpbmVzZXApOgorICAgICAgICAgICAgICAgIHN0YXJ0cy5hcHBlbmQobmV4dF9wb3MpCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgbGluZV9wb3MgPSBuZXh0X3BvcworICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIG5leHRfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnXDAwMVwwMDFcMDAxXDAwMScgKyBvcy5saW5lc2VwOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zIC0gbGVuKG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLl90b2MgPSBkaWN0KGVudW1lcmF0ZSh6aXAoc3RhcnRzLCBzdG9wcykpKQorICAgICAgICBzZWxmLl9uZXh0X2tleSA9IGxlbihzZWxmLl90b2MpCisKKworY2xhc3MgTUgoTWFpbGJveCk6CisgICAgIiIiQW4gTUggbWFpbGJveC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBNSCBpbnN0YW5jZS4iIiIKKyAgICAgICAgTWFpbGJveC5fX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5LCBjcmVhdGUpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLl9wYXRoKToKKyAgICAgICAgICAgIGlmIGNyZWF0ZToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihzZWxmLl9wYXRoLCAwNzAwKQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKG9zLm9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcubWhfc2VxdWVuY2VzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX0NSRUFUIHwgb3MuT19FWENMIHwgb3MuT19XUk9OTFksIDA2MDApKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb1N1Y2hNYWlsYm94RXJyb3Ioc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fbG9ja2VkID0gRmFsc2UKKworICAgIGRlZiBhZGQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkFkZCBtZXNzYWdlIGFuZCByZXR1cm4gYXNzaWduZWQga2V5LiIiIgorICAgICAgICBrZXlzID0gc2VsZi5rZXlzKCkKKyAgICAgICAgaWYgbGVuKGtleXMpID09IDA6CisgICAgICAgICAgICBuZXdfa2V5ID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3X2tleSA9IG1heChrZXlzKSArIDEKKyAgICAgICAgbmV3X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKG5ld19rZXkpKQorICAgICAgICBmID0gX2NyZWF0ZV9jYXJlZnVsbHkobmV3X3BhdGgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICBfbG9ja19maWxlKGYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZHVtcF9tZXNzYWdlKG1lc3NhZ2UsIGYpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNSE1lc3NhZ2UpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdW1wX3NlcXVlbmNlcyhtZXNzYWdlLCBuZXdfa2V5KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiBuZXdfa2V5CisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3JiKycpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgIF9sb2NrX2ZpbGUoZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgbWVzc2FnZSk6CisgICAgICAgICIiIlJlcGxhY2UgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICdyYisnKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICBfbG9ja19maWxlKGYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MuY2xvc2Uob3Mub3BlbihwYXRoLCBvcy5PX1dST05MWSB8IG9zLk9fVFJVTkMpKQorICAgICAgICAgICAgICAgIHNlbGYuX2R1bXBfbWVzc2FnZShtZXNzYWdlLCBmKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTUhNZXNzYWdlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHVtcF9zZXF1ZW5jZXMobWVzc2FnZSwga2V5KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwgJ3IrJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwgJ3InKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICBfbG9ja19maWxlKGYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbXNnID0gTUhNZXNzYWdlKGYpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgX3VubG9ja19maWxlKGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZm9yIG5hbWUsIGtleV9saXN0IGluIHNlbGYuZ2V0X3NlcXVlbmNlcygpOgorICAgICAgICAgICAgaWYga2V5IGluIGtleV9saXN0OgorICAgICAgICAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UobmFtZSkKKyAgICAgICAgcmV0dXJuIG1zZworCisgICAgZGVmIGdldF9zdHJpbmcoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLCAncisnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLCAncicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgIF9sb2NrX2ZpbGUoZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGdldF9maWxlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIGZpbGUtbGlrZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLCAncmInKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBfUHJveHlGaWxlKGYpCisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIGtleXMuIiIiCisgICAgICAgIHJldHVybiBpdGVyKHNvcnRlZChpbnQoZW50cnkpIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHNlbGYuX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5LmlzZGlnaXQoKSkpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUga2V5ZWQgbWVzc2FnZSBleGlzdHMsIEZhbHNlIG90aGVyd2lzZS4iIiIKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgY291bnQgb2YgbWVzc2FnZXMgaW4gdGhlIG1haWxib3guIiIiCisgICAgICAgIHJldHVybiBsZW4obGlzdChzZWxmLml0ZXJrZXlzKCkpKQorCisgICAgZGVmIGxvY2soc2VsZik6CisgICAgICAgICIiIkxvY2sgdGhlIG1haWxib3guIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBzZWxmLl9maWxlID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy5taF9zZXF1ZW5jZXMnKSwgJ3JiKycpCisgICAgICAgICAgICBfbG9ja19maWxlKHNlbGYuX2ZpbGUpCisgICAgICAgICAgICBzZWxmLl9sb2NrZWQgPSBUcnVlCisKKyAgICBkZWYgdW5sb2NrKHNlbGYpOgorICAgICAgICAiIiJVbmxvY2sgdGhlIG1haWxib3ggaWYgaXQgaXMgbG9ja2VkLiIiIgorICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZGVsIHNlbGYuX2ZpbGUKKyAgICAgICAgICAgIHNlbGYuX2xvY2tlZCA9IEZhbHNlCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIldyaXRlIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gdGhlIGRpc2suIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbmQgY2xvc2UgdGhlIG1haWxib3guIiIiCisgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIHNlbGYudW5sb2NrKCkKKworICAgIGRlZiBsaXN0X2ZvbGRlcnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZm9sZGVyIG5hbWVzLiIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihzZWxmLl9wYXRoKToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGVudHJ5KSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGdldF9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIE1IIGluc3RhbmNlIGZvciB0aGUgbmFtZWQgZm9sZGVyLiIiIgorICAgICAgICByZXR1cm4gTUgob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGZvbGRlciksIGNyZWF0ZT1GYWxzZSkKKworICAgIGRlZiBhZGRfZm9sZGVyKHNlbGYsIGZvbGRlcik6CisgICAgICAgICIiIkNyZWF0ZSBhIGZvbGRlciBhbmQgcmV0dXJuIGFuIE1IIGluc3RhbmNlIHJlcHJlc2VudGluZyBpdC4iIiIKKyAgICAgICAgcmV0dXJuIE1IKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBmb2xkZXIpKQorCisgICAgZGVmIHJlbW92ZV9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSBuYW1lZCBmb2xkZXIsIHdoaWNoIG11c3QgYmUgZW1wdHkuIiIiCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZm9sZGVyKQorICAgICAgICBlbnRyaWVzID0gb3MubGlzdGRpcihwYXRoKQorICAgICAgICBpZiBlbnRyaWVzID09IFsnLm1oX3NlcXVlbmNlcyddOgorICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihwYXRoLCAnLm1oX3NlcXVlbmNlcycpKQorICAgICAgICBlbGlmIGVudHJpZXMgPT0gW106CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOb3RFbXB0eUVycm9yKCdGb2xkZXIgbm90IGVtcHR5OiAlcycgJSBzZWxmLl9wYXRoKQorICAgICAgICBvcy5ybWRpcihwYXRoKQorCisgICAgZGVmIGdldF9zZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIG5hbWUtdG8ta2V5LWxpc3QgZGljdGlvbmFyeSB0byBkZWZpbmUgZWFjaCBzZXF1ZW5jZS4iIiIKKyAgICAgICAgcmVzdWx0cyA9IHt9CisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcycpLCAncicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFsbF9rZXlzID0gc2V0KHNlbGYua2V5cygpKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG5hbWUsIGNvbnRlbnRzID0gbGluZS5zcGxpdCgnOicpCisgICAgICAgICAgICAgICAgICAgIGtleXMgPSBzZXQoKQorICAgICAgICAgICAgICAgICAgICBmb3Igc3BlYyBpbiBjb250ZW50cy5zcGxpdCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3BlYy5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5hZGQoaW50KHNwZWMpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCA9IChpbnQoeCkgZm9yIHggaW4gc3BlYy5zcGxpdCgnLScpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMudXBkYXRlKHJhbmdlKHN0YXJ0LCBzdG9wICsgMSkpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbbmFtZV0gPSBba2V5IGZvciBrZXkgaW4gc29ydGVkKGtleXMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYga2V5IGluIGFsbF9rZXlzXQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocmVzdWx0c1tuYW1lXSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCByZXN1bHRzW25hbWVdCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEZvcm1hdEVycm9yKCdJbnZhbGlkIHNlcXVlbmNlIHNwZWNpZmljYXRpb246ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucnN0cmlwKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiBzZXRfc2VxdWVuY2VzKHNlbGYsIHNlcXVlbmNlcyk6CisgICAgICAgICIiIlNldCBzZXF1ZW5jZXMgdXNpbmcgdGhlIGdpdmVuIG5hbWUtdG8ta2V5LWxpc3QgZGljdGlvbmFyeS4iIiIKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcubWhfc2VxdWVuY2VzJyksICdyKycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNsb3NlKG9zLm9wZW4oZi5uYW1lLCBvcy5PX1dST05MWSB8IG9zLk9fVFJVTkMpKQorICAgICAgICAgICAgZm9yIG5hbWUsIGtleXMgaW4gc2VxdWVuY2VzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGxlbihrZXlzKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGYud3JpdGUoJyVzOicgJSBuYW1lKQorICAgICAgICAgICAgICAgIHByZXYgPSBOb25lCisgICAgICAgICAgICAgICAgY29tcGxldGluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBzb3J0ZWQoc2V0KGtleXMpKToKKyAgICAgICAgICAgICAgICAgICAgaWYga2V5IC0gMSA9PSBwcmV2OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNvbXBsZXRpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGluZyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCctJykKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBjb21wbGV0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclcyAlcycgJSAocHJldiwga2V5KSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyAlcycgJSBrZXkpCisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBrZXkKKyAgICAgICAgICAgICAgICBpZiBjb21wbGV0aW5nOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKHN0cihwcmV2KSArICdcbicpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgcGFjayhzZWxmKToKKyAgICAgICAgIiIiUmUtbmFtZSBtZXNzYWdlcyB0byBlbGltaW5hdGUgbnVtYmVyaW5nIGdhcHMuIEludmFsaWRhdGVzIGtleXMuIiIiCisgICAgICAgIHNlcXVlbmNlcyA9IHNlbGYuZ2V0X3NlcXVlbmNlcygpCisgICAgICAgIHByZXYgPSAwCisgICAgICAgIGNoYW5nZXMgPSBbXQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuaXRlcmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSAtIDEgIT0gcHJldjoKKyAgICAgICAgICAgICAgICBjaGFuZ2VzLmFwcGVuZCgoa2V5LCBwcmV2ICsgMSkpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwgJ3IrJykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9sb2NrX2ZpbGUoZikKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKHByZXYgKyAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKHByZXYgKyAxKSkpCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VubG9ja19maWxlKGYpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBwcmV2ICs9IDEKKyAgICAgICAgc2VsZi5fbmV4dF9rZXkgPSBwcmV2ICsgMQorICAgICAgICBpZiBsZW4oY2hhbmdlcykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgbmFtZSwga2V5X2xpc3QgaW4gc2VxdWVuY2VzLml0ZW1zKCk6CisgICAgICAgICAgICBmb3Igb2xkLCBuZXcgaW4gY2hhbmdlczoKKyAgICAgICAgICAgICAgICBpZiBvbGQgaW4ga2V5X2xpc3Q6CisgICAgICAgICAgICAgICAgICAgIGtleV9saXN0W2tleV9saXN0LmluZGV4KG9sZCldID0gbmV3CisgICAgICAgIHNlbGYuc2V0X3NlcXVlbmNlcyhzZXF1ZW5jZXMpCisKKyAgICBkZWYgX2R1bXBfc2VxdWVuY2VzKHNlbGYsIG1lc3NhZ2UsIGtleSk6CisgICAgICAgICIiIkluc3BlY3QgYSBuZXcgTUhNZXNzYWdlIGFuZCB1cGRhdGUgc2VxdWVuY2VzIGFwcHJvcHJpYXRlbHkuIiIiCisgICAgICAgIHBlbmRpbmdfc2VxdWVuY2VzID0gbWVzc2FnZS5nZXRfc2VxdWVuY2VzKCkKKyAgICAgICAgYWxsX3NlcXVlbmNlcyA9IHNlbGYuZ2V0X3NlcXVlbmNlcygpCisgICAgICAgIGZvciBuYW1lLCBrZXlfbGlzdCBpbiBhbGxfc2VxdWVuY2VzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBwZW5kaW5nX3NlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBrZXlfbGlzdC5hcHBlbmQoa2V5KQorICAgICAgICAgICAgZWxpZiBrZXkgaW4ga2V5X2xpc3Q6CisgICAgICAgICAgICAgICAgZGVsIGtleV9saXN0W2tleV9saXN0LmluZGV4KGtleSldCisgICAgICAgIGZvciBzZXF1ZW5jZSBpbiBwZW5kaW5nX3NlcXVlbmNlczoKKyAgICAgICAgICAgIGlmIHNlcXVlbmNlIG5vdCBpbiBhbGxfc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIGFsbF9zZXF1ZW5jZXNbc2VxdWVuY2VdID0gW2tleV0KKyAgICAgICAgc2VsZi5zZXRfc2VxdWVuY2VzKGFsbF9zZXF1ZW5jZXMpCisKKworY2xhc3MgQmFieWwoX3NpbmdsZWZpbGVNYWlsYm94KToKKyAgICAiIiJBbiBSbWFpbC1zdHlsZSBCYWJ5bCBtYWlsYm94LiIiIgorCisgICAgX3NwZWNpYWxfbGFiZWxzID0gZnJvemVuc2V0KCgndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLCAnYW5zd2VyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcndhcmRlZCcsICdlZGl0ZWQnLCAncmVzZW50JykpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBCYWJ5bCBtYWlsYm94LiIiIgorICAgICAgICBfc2luZ2xlZmlsZU1haWxib3guX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeSwgY3JlYXRlKQorICAgICAgICBzZWxmLl9sYWJlbHMgPSB7fQorCisgICAgZGVmIGFkZChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2UgYW5kIHJldHVybiBhc3NpZ25lZCBrZXkuIiIiCisgICAgICAgIGtleSA9IF9zaW5nbGVmaWxlTWFpbGJveC5hZGQoc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5fbGFiZWxzW2tleV0gPSBtZXNzYWdlLmdldF9sYWJlbHMoKQorICAgICAgICByZXR1cm4ga2V5CisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgX3NpbmdsZWZpbGVNYWlsYm94LnJlbW92ZShzZWxmLCBrZXkpCisgICAgICAgIGlmIGtleSBpbiBzZWxmLl9sYWJlbHM6CisgICAgICAgICAgICBkZWwgc2VsZi5fbGFiZWxzW2tleV0KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIG1lc3NhZ2UpOgorICAgICAgICAiIiJSZXBsYWNlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBfc2luZ2xlZmlsZU1haWxib3guX19zZXRpdGVtX18oc2VsZiwga2V5LCBtZXNzYWdlKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIEJhYnlsTWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLl9sYWJlbHNba2V5XSA9IG1lc3NhZ2UuZ2V0X2xhYmVscygpCisKKyAgICBkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzdGFydCkKKyAgICAgICAgc2VsZi5fZmlsZS5yZWFkbGluZSgpICAgIyBTa2lwICcxLCcgbGluZSBzcGVjaWZ5aW5nIGxhYmVscy4KKyAgICAgICAgb3JpZ2luYWxfaGVhZGVycyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG9yaWdpbmFsX2hlYWRlcnMud3JpdGUobGluZS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpKQorICAgICAgICB2aXNpYmxlX2hlYWRlcnMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09IG9zLmxpbmVzZXAgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdmlzaWJsZV9oZWFkZXJzLndyaXRlKGxpbmUucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSkKKyAgICAgICAgYm9keSA9IHNlbGYuX2ZpbGUucmVhZChzdG9wIC0gc2VsZi5fZmlsZS50ZWxsKCkpLnJlcGxhY2Uob3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJykKKyAgICAgICAgbXNnID0gQmFieWxNZXNzYWdlKG9yaWdpbmFsX2hlYWRlcnMuZ2V0dmFsdWUoKSArIGJvZHkpCisgICAgICAgIG1zZy5zZXRfdmlzaWJsZSh2aXNpYmxlX2hlYWRlcnMuZ2V0dmFsdWUoKSkKKyAgICAgICAgaWYga2V5IGluIHNlbGYuX2xhYmVsczoKKyAgICAgICAgICAgIG1zZy5zZXRfbGFiZWxzKHNlbGYuX2xhYmVsc1trZXldKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICBkZWYgZ2V0X3N0cmluZyhzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc3RhcnQpCisgICAgICAgIHNlbGYuX2ZpbGUucmVhZGxpbmUoKSAgICMgU2tpcCAnMSwnIGxpbmUgc3BlY2lmeWluZyBsYWJlbHMuCisgICAgICAgIG9yaWdpbmFsX2hlYWRlcnMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09ICcqKiogRU9PSCAqKionICsgb3MubGluZXNlcCBvciBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvcmlnaW5hbF9oZWFkZXJzLndyaXRlKGxpbmUucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gb3MubGluZXNlcCBvciBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBvcmlnaW5hbF9oZWFkZXJzLmdldHZhbHVlKCkgKyBcCisgICAgICAgICAgICAgICBzZWxmLl9maWxlLnJlYWQoc3RvcCAtIHNlbGYuX2ZpbGUudGVsbCgpKS5yZXBsYWNlKG9zLmxpbmVzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicpCisKKyAgICBkZWYgZ2V0X2ZpbGUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLmdldF9zdHJpbmcoa2V5KS5yZXBsYWNlKCdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorCisgICAgZGVmIGdldF9sYWJlbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgdXNlci1kZWZpbmVkIGxhYmVscyBpbiB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5fbG9va3VwKCkKKyAgICAgICAgbGFiZWxzID0gc2V0KCkKKyAgICAgICAgZm9yIGxhYmVsX2xpc3QgaW4gc2VsZi5fbGFiZWxzLnZhbHVlcygpOgorICAgICAgICAgICAgbGFiZWxzLnVwZGF0ZShsYWJlbF9saXN0KQorICAgICAgICBsYWJlbHMuZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5fc3BlY2lhbF9sYWJlbHMpCisgICAgICAgIHJldHVybiBsaXN0KGxhYmVscykKKworICAgIGRlZiBfZ2VuZXJhdGVfdG9jKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBrZXktdG8tKHN0YXJ0LCBzdG9wKSB0YWJsZSBvZiBjb250ZW50cy4iIiIKKyAgICAgICAgc3RhcnRzLCBzdG9wcyA9IFtdLCBbXQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoMCkKKyAgICAgICAgbmV4dF9wb3MgPSAwCisgICAgICAgIGxhYmVsX2xpc3RzID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmVfcG9zID0gbmV4dF9wb3MKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIG5leHRfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1wwMzdcMDE0JyArIG9zLmxpbmVzZXA6CisgICAgICAgICAgICAgICAgaWYgbGVuKHN0b3BzKSA8IGxlbihzdGFydHMpOgorICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgc3RhcnRzLmFwcGVuZChuZXh0X3BvcykKKyAgICAgICAgICAgICAgICBsYWJlbHMgPSBbbGFiZWwuc3RyaXAoKSBmb3IgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzZWxmLl9maWxlLnJlYWRsaW5lKClbMTpdLnNwbGl0KCcsJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsYWJlbC5zdHJpcCgpICE9ICcnXQorICAgICAgICAgICAgICAgIGxhYmVsX2xpc3RzLmFwcGVuZChsYWJlbHMpCisgICAgICAgICAgICBlbGlmIGxpbmUgPT0gJ1wwMzcnIG9yIGxpbmUgPT0gJ1wwMzcnICsgb3MubGluZXNlcDoKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RvcHMpIDwgbGVuKHN0YXJ0cyk6CisgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcyAtIGxlbihvcy5saW5lc2VwKSkKKyAgICAgICAgICAgIGVsaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5fdG9jID0gZGljdChlbnVtZXJhdGUoemlwKHN0YXJ0cywgc3RvcHMpKSkKKyAgICAgICAgc2VsZi5fbGFiZWxzID0gZGljdChlbnVtZXJhdGUobGFiZWxfbGlzdHMpKQorICAgICAgICBzZWxmLl9uZXh0X2tleSA9IGxlbihzZWxmLl90b2MpCisKKyAgICBkZWYgX3ByZV9tYWlsYm94X2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgbWFpbGJveCB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUoJ0JBQllMIE9QVElPTlM6JXNWZXJzaW9uOiA1JXNMYWJlbHM6JXMlc1wwMzcnICUKKyAgICAgICAgICAgICAgICAob3MubGluZXNlcCwgb3MubGluZXNlcCwgJywnLmpvaW4oc2VsZi5nZXRfbGFiZWxzKCkpLAorICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKworICAgIGRlZiBfcHJlX21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUoJ1wwMTQnICsgb3MubGluZXNlcCkKKworICAgIGRlZiBfcG9zdF9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBhZnRlciB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUob3MubGluZXNlcCArICdcMDM3JykKKworICAgIGRlZiBfaW5zdGFsbF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJXcml0ZSBtZXNzYWdlIGNvbnRlbnRzIGFuZCByZXR1cm4gKHN0YXJ0LCBzdG9wKS4iIiIKKyAgICAgICAgc3RhcnQgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIEJhYnlsTWVzc2FnZSk6CisgICAgICAgICAgICBzcGVjaWFsX2xhYmVscyA9IFtdCisgICAgICAgICAgICBsYWJlbHMgPSBbXQorICAgICAgICAgICAgZm9yIGxhYmVsIGluIG1lc3NhZ2UuZ2V0X2xhYmVscygpOgorICAgICAgICAgICAgICAgIGlmIGxhYmVsIGluIHNlbGYuX3NwZWNpYWxfbGFiZWxzOgorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsX2xhYmVscy5hcHBlbmQobGFiZWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmFwcGVuZChsYWJlbCkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJzEnKQorICAgICAgICAgICAgZm9yIGxhYmVsIGluIHNwZWNpYWxfbGFiZWxzOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJywgJyArIGxhYmVsKQorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnLCwnKQorICAgICAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcgJyArIGxhYmVsICsgJywnKQorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShvcy5saW5lc2VwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnMSwsJyArIG9zLmxpbmVzZXApCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgZW1haWwuTWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgICAgIG9yaWdfYnVmZmVyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgb3JpZ19nZW5lcmF0b3IgPSBlbWFpbC5HZW5lcmF0b3IuR2VuZXJhdG9yKG9yaWdfYnVmZmVyLCBGYWxzZSwgMCkKKyAgICAgICAgICAgIG9yaWdfZ2VuZXJhdG9yLmZsYXR0ZW4obWVzc2FnZSkKKyAgICAgICAgICAgIG9yaWdfYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgbGluZSA9IG9yaWdfYnVmZmVyLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGxpbmUucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICdcbicgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIHZpc19idWZmZXIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICAgICAgdmlzX2dlbmVyYXRvciA9IGVtYWlsLkdlbmVyYXRvci5HZW5lcmF0b3IodmlzX2J1ZmZlciwgRmFsc2UsIDApCisgICAgICAgICAgICAgICAgdmlzX2dlbmVyYXRvci5mbGF0dGVuKG1lc3NhZ2UuZ2V0X3Zpc2libGUoKSkKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gdmlzX2J1ZmZlci5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobGluZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICdcbicgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9yaWdfYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gb3JpZ19idWZmZXIucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGxpbmUucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnXG4nIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBvcmlnX2J1ZmZlci5yZWFkKDQwOTYpICMgQnVmZmVyIHNpemUgaXMgYXJiaXRyYXJ5LgorICAgICAgICAgICAgICAgIGlmIGJ1ZmZlciA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGJ1ZmZlci5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgc3RyKToKKyAgICAgICAgICAgIGJvZHlfc3RhcnQgPSBtZXNzYWdlLmZpbmQoJ1xuXG4nKSArIDIKKyAgICAgICAgICAgIGlmIGJvZHlfc3RhcnQgLSAyICE9IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobWVzc2FnZVs6Ym9keV9zdGFydF0ucmVwbGFjZSgnXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcqKiogRU9PSCAqKionICsgb3MubGluZXNlcCkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKG1lc3NhZ2VbOmJvZHlfc3RhcnRdLnJlcGxhY2UoJ1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShtZXNzYWdlW2JvZHlfc3RhcnQ6XS5yZXBsYWNlKCdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcqKiogRU9PSCAqKionICsgb3MubGluZXNlcCArIG9zLmxpbmVzZXApCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShtZXNzYWdlLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgIGVsaWYgaGFzYXR0cihtZXNzYWdlLCAncmVhZGxpbmUnKToKKyAgICAgICAgICAgIG9yaWdpbmFsX3BvcyA9IG1lc3NhZ2UudGVsbCgpCisgICAgICAgICAgICBmaXJzdF9wYXNzID0gVHJ1ZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gbWVzc2FnZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShsaW5lLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnXG4nIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwKQorICAgICAgICAgICAgICAgICAgICBpZiBmaXJzdF9wYXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcGFzcyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlZWsob3JpZ2luYWxfcG9zKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgYnVmZmVyID0gbWVzc2FnZS5yZWFkKDQwOTYpICAgICAjIEJ1ZmZlciBzaXplIGlzIGFyYml0cmFyeS4KKyAgICAgICAgICAgICAgICBpZiBidWZmZXIgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShidWZmZXIucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignSW52YWxpZCBtZXNzYWdlIHR5cGU6ICVzJyAlIHR5cGUobWVzc2FnZSkpCisgICAgICAgIHN0b3AgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICByZXR1cm4gKHN0YXJ0LCBzdG9wKQorCisKK2NsYXNzIE1lc3NhZ2UoZW1haWwuTWVzc2FnZS5NZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggbWFpbGJveC1mb3JtYXQtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgTWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBlbWFpbC5NZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5fYmVjb21lX21lc3NhZ2UoY29weS5kZWVwY29weShtZXNzYWdlKSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWVzc2FnZSk6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5fZXhwbGFpbl90byhzZWxmKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgc3RyKToKKyAgICAgICAgICAgIHNlbGYuX2JlY29tZV9tZXNzYWdlKGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobWVzc2FnZSkpCisgICAgICAgIGVsaWYgaGFzYXR0cihtZXNzYWdlLCAicmVhZCIpOgorICAgICAgICAgICAgc2VsZi5fYmVjb21lX21lc3NhZ2UoZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUobWVzc2FnZSkpCisgICAgICAgIGVsaWYgbWVzc2FnZSBpcyBOb25lOgorICAgICAgICAgICAgZW1haWwuTWVzc2FnZS5NZXNzYWdlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0ludmFsaWQgbWVzc2FnZSB0eXBlOiAlcycgJSB0eXBlKG1lc3NhZ2UpKQorCisgICAgZGVmIF9iZWNvbWVfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQXNzdW1lIHRoZSBub24tZm9ybWF0LXNwZWNpZmljIHN0YXRlIG9mIG1lc3NhZ2UuIiIiCisgICAgICAgIGZvciBuYW1lIGluICgnX2hlYWRlcnMnLCAnX3VuaXhmcm9tJywgJ19wYXlsb2FkJywgJ19jaGFyc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICdwcmVhbWJsZScsICdlcGlsb2d1ZScsICdkZWZlY3RzJywgJ19kZWZhdWx0X3R5cGUnKToKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSBtZXNzYWdlLl9fZGljdF9fW25hbWVdCisKKyAgICBkZWYgX2V4cGxhaW5fdG8oc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkNvcHkgZm9ybWF0LXNwZWNpZmljIHN0YXRlIHRvIG1lc3NhZ2UgaW5zb2ZhciBhcyBwb3NzaWJsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHJldHVybiAgIyBUaGVyZSdzIG5vdGhpbmcgZm9ybWF0LXNwZWNpZmljIHRvIGV4cGxhaW4uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHRvIHNwZWNpZmllZCB0eXBlJykKKworCitjbGFzcyBNYWlsZGlyTWVzc2FnZShNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggTWFpbGRpci1zcGVjaWZpYyBwcm9wZXJ0aWVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBNYWlsZGlyTWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5fc3ViZGlyID0gJ25ldycKKyAgICAgICAgc2VsZi5faW5mbyA9ICcnCisgICAgICAgIHNlbGYuX2RhdGUgPSB0aW1lLnRpbWUoKQorICAgICAgICBNZXNzYWdlLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKyAgICBkZWYgZ2V0X3N1YmRpcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuICduZXcnIG9yICdjdXInLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc3ViZGlyCisKKyAgICBkZWYgc2V0X3N1YmRpcihzZWxmLCBzdWJkaXIpOgorICAgICAgICAiIiJTZXQgc3ViZGlyIHRvICduZXcnIG9yICdjdXInLiIiIgorICAgICAgICBpZiBzdWJkaXIgPT0gJ25ldycgb3Igc3ViZGlyID09ICdjdXInOgorICAgICAgICAgICAgc2VsZi5fc3ViZGlyID0gc3ViZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdWJkaXIgbXVzdCBiZSAnbmV3JyBvciAnY3VyJzogJXMiICUgc3ViZGlyKQorCisgICAgZGVmIGdldF9mbGFncyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFzIGEgc3RyaW5nIHRoZSBmbGFncyB0aGF0IGFyZSBzZXQuIiIiCisgICAgICAgIGlmIHNlbGYuX2luZm8uc3RhcnRzd2l0aCgnMiwnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pbmZvWzI6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICBkZWYgc2V0X2ZsYWdzKHNlbGYsIGZsYWdzKToKKyAgICAgICAgIiIiU2V0IHRoZSBnaXZlbiBmbGFncyBhbmQgdW5zZXQgYWxsIG90aGVycy4iIiIKKyAgICAgICAgc2VsZi5faW5mbyA9ICcyLCcgKyAnJy5qb2luKHNvcnRlZChmbGFncykpCisKKyAgICBkZWYgYWRkX2ZsYWcoc2VsZiwgZmxhZyk6CisgICAgICAgICIiIlNldCB0aGUgZ2l2ZW4gZmxhZyhzKSB3aXRob3V0IGNoYW5naW5nIG90aGVycy4iIiIKKyAgICAgICAgc2VsZi5zZXRfZmxhZ3MoJycuam9pbihzZXQoc2VsZi5nZXRfZmxhZ3MoKSkgfCBzZXQoZmxhZykpKQorCisgICAgZGVmIHJlbW92ZV9mbGFnKHNlbGYsIGZsYWcpOgorICAgICAgICAiIiJVbnNldCB0aGUgZ2l2ZW4gc3RyaW5nIGZsYWcocykgd2l0aG91dCBjaGFuZ2luZyBvdGhlcnMuIiIiCisgICAgICAgIGlmIHNlbGYuZ2V0X2ZsYWdzKCkgIT0gJyc6CisgICAgICAgICAgICBzZWxmLnNldF9mbGFncygnJy5qb2luKHNldChzZWxmLmdldF9mbGFncygpKSAtIHNldChmbGFnKSkpCisKKyAgICBkZWYgZ2V0X2RhdGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBkZWxpdmVyeSBkYXRlIG9mIG1lc3NhZ2UsIGluIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZGF0ZQorCisgICAgZGVmIHNldF9kYXRlKHNlbGYsIGRhdGUpOgorICAgICAgICAiIiJTZXQgZGVsaXZlcnkgZGF0ZSBvZiBtZXNzYWdlLCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZGF0ZSA9IGZsb2F0KGRhdGUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW4ndCBjb252ZXJ0IHRvIGZsb2F0OiAlcyIgJSBkYXRlKQorCisgICAgZGVmIGdldF9pbmZvKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIG1lc3NhZ2UncyAiaW5mbyIgYXMgYSBzdHJpbmcuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pbmZvCisKKyAgICBkZWYgc2V0X2luZm8oc2VsZiwgaW5mbyk6CisgICAgICAgICIiIlNldCB0aGUgbWVzc2FnZSdzICJpbmZvIiBzdHJpbmcuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKToKKyAgICAgICAgICAgIHNlbGYuX2luZm8gPSBpbmZvCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2luZm8gbXVzdCBiZSBhIHN0cmluZzogJXMnICUgdHlwZShpbmZvKSkKKworICAgIGRlZiBfZXhwbGFpbl90byhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQ29weSBNYWlsZGlyLXNwZWNpZmljIHN0YXRlIHRvIG1lc3NhZ2UgaW5zb2ZhciBhcyBwb3NzaWJsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBtZXNzYWdlLnNldF9mbGFncyhzZWxmLmdldF9mbGFncygpKQorICAgICAgICAgICAgbWVzc2FnZS5zZXRfc3ViZGlyKHNlbGYuZ2V0X3N1YmRpcigpKQorICAgICAgICAgICAgbWVzc2FnZS5zZXRfZGF0ZShzZWxmLmdldF9kYXRlKCkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBfbWJveE1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUycgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUicpCisgICAgICAgICAgICBpZiBzZWxmLmdldF9zdWJkaXIoKSA9PSAnY3VyJzoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdPJykKKyAgICAgICAgICAgIGlmICdUJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdEJykKKyAgICAgICAgICAgIGlmICdGJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdGJykKKyAgICAgICAgICAgIGlmICdSJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdBJykKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X2Zyb20oJ01BSUxFUi1EQUVNT04nLCB0aW1lLmdtdGltZShzZWxmLmdldF9kYXRlKCkpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTUhNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUycgbm90IGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICAgICAgaWYgJ1InIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgICAgIGlmICdGJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgZmxhZ3MgPSBzZXQoc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIGlmICdTJyBub3QgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ3Vuc2VlbicpCisgICAgICAgICAgICBpZiAnVCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2RlbGV0ZWQnKQorICAgICAgICAgICAgaWYgJ1InIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdhbnN3ZXJlZCcpCisgICAgICAgICAgICBpZiAnUCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2ZvcndhcmRlZCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gc3BlY2lmaWVkIHR5cGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShtZXNzYWdlKSkKKworCitjbGFzcyBfbWJveE1NREZNZXNzYWdlKE1lc3NhZ2UpOgorICAgICIiIk1lc3NhZ2Ugd2l0aCBtYm94LSBvciBNTURGLXNwZWNpZmljIHByb3BlcnRpZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBtYm94TU1ERk1lc3NhZ2UgaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYuc2V0X2Zyb20oJ01BSUxFUi1EQUVNT04nLCBUcnVlKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIGVtYWlsLk1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICAgICAgICB1bml4ZnJvbSA9IG1lc3NhZ2UuZ2V0X3VuaXhmcm9tKCkKKyAgICAgICAgICAgIGlmIHVuaXhmcm9tIGlzIG5vdCBOb25lIGFuZCB1bml4ZnJvbS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Zyb20odW5peGZyb21bNTpdKQorICAgICAgICBNZXNzYWdlLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKyAgICBkZWYgZ2V0X2Zyb20oc2VsZik6CisgICAgICAgICIiIlJldHVybiBjb250ZW50cyBvZiAiRnJvbSAiIGxpbmUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9mcm9tCisKKyAgICBkZWYgc2V0X2Zyb20oc2VsZiwgZnJvbV8sIHRpbWVfPU5vbmUpOgorICAgICAgICAiIiJTZXQgIkZyb20gIiBsaW5lLCBmb3JtYXR0aW5nIGFuZCBhcHBlbmRpbmcgdGltZV8gaWYgc3BlY2lmaWVkLiIiIgorICAgICAgICBpZiB0aW1lXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHRpbWVfIGlzIFRydWU6CisgICAgICAgICAgICAgICAgdGltZV8gPSB0aW1lLmdtdGltZSgpCisgICAgICAgICAgICBmcm9tXyArPSAnICcgKyB0aW1lLmFzY3RpbWUodGltZV8pCisgICAgICAgIHNlbGYuX2Zyb20gPSBmcm9tXworCisgICAgZGVmIGdldF9mbGFncyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFzIGEgc3RyaW5nIHRoZSBmbGFncyB0aGF0IGFyZSBzZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldCgnU3RhdHVzJywgJycpICsgc2VsZi5nZXQoJ1gtU3RhdHVzJywgJycpCisKKyAgICBkZWYgc2V0X2ZsYWdzKHNlbGYsIGZsYWdzKToKKyAgICAgICAgIiIiU2V0IHRoZSBnaXZlbiBmbGFncyBhbmQgdW5zZXQgYWxsIG90aGVycy4iIiIKKyAgICAgICAgZmxhZ3MgPSBzZXQoZmxhZ3MpCisgICAgICAgIHN0YXR1c19mbGFncywgeHN0YXR1c19mbGFncyA9ICcnLCAnJworICAgICAgICBmb3IgZmxhZyBpbiAoJ1InLCAnTycpOgorICAgICAgICAgICAgaWYgZmxhZyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBzdGF0dXNfZmxhZ3MgKz0gZmxhZworICAgICAgICAgICAgICAgIGZsYWdzLnJlbW92ZShmbGFnKQorICAgICAgICBmb3IgZmxhZyBpbiAoJ0QnLCAnRicsICdBJyk6CisgICAgICAgICAgICBpZiBmbGFnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIHhzdGF0dXNfZmxhZ3MgKz0gZmxhZworICAgICAgICAgICAgICAgIGZsYWdzLnJlbW92ZShmbGFnKQorICAgICAgICB4c3RhdHVzX2ZsYWdzICs9ICcnLmpvaW4oc29ydGVkKGZsYWdzKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXBsYWNlX2hlYWRlcignU3RhdHVzJywgc3RhdHVzX2ZsYWdzKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ1N0YXR1cycsIHN0YXR1c19mbGFncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXBsYWNlX2hlYWRlcignWC1TdGF0dXMnLCB4c3RhdHVzX2ZsYWdzKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ1gtU3RhdHVzJywgeHN0YXR1c19mbGFncykKKworICAgIGRlZiBhZGRfZmxhZyhzZWxmLCBmbGFnKToKKyAgICAgICAgIiIiU2V0IHRoZSBnaXZlbiBmbGFnKHMpIHdpdGhvdXQgY2hhbmdpbmcgb3RoZXJzLiIiIgorICAgICAgICBzZWxmLnNldF9mbGFncygnJy5qb2luKHNldChzZWxmLmdldF9mbGFncygpKSB8IHNldChmbGFnKSkpCisKKyAgICBkZWYgcmVtb3ZlX2ZsYWcoc2VsZiwgZmxhZyk6CisgICAgICAgICIiIlVuc2V0IHRoZSBnaXZlbiBzdHJpbmcgZmxhZyhzKSB3aXRob3V0IGNoYW5naW5nIG90aGVycy4iIiIKKyAgICAgICAgaWYgJ1N0YXR1cycgaW4gc2VsZiBvciAnWC1TdGF0dXMnIGluIHNlbGY6CisgICAgICAgICAgICBzZWxmLnNldF9mbGFncygnJy5qb2luKHNldChzZWxmLmdldF9mbGFncygpKSAtIHNldChmbGFnKSkpCisKKyAgICBkZWYgX2V4cGxhaW5fdG8oc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkNvcHkgbWJveC0gb3IgTU1ERi1zcGVjaWZpYyBzdGF0ZSB0byBtZXNzYWdlIGluc29mYXIgYXMgcG9zc2libGUuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgZmxhZ3MgPSBzZXQoc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIGlmICdPJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgICAgICBpZiAnRicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnRicpCisgICAgICAgICAgICBpZiAnQScgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUicpCisgICAgICAgICAgICBpZiAnUicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUycpCisgICAgICAgICAgICBpZiAnRCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnVCcpCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsnc3RhdHVzJ10KKyAgICAgICAgICAgIGRlbCBtZXNzYWdlWyd4LXN0YXR1cyddCisgICAgICAgICAgICBtYXliZV9kYXRlID0gJyAnLmpvaW4oc2VsZi5nZXRfZnJvbSgpLnNwbGl0KClbLTU6XSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9kYXRlKGNhbGVuZGFyLnRpbWVnbSh0aW1lLnN0cnB0aW1lKG1heWJlX2RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJWEgJWIgJWQgJUg6JU06JVMgJVknKSkpCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIF9tYm94TU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgbWVzc2FnZS5zZXRfZmxhZ3Moc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X2Zyb20oc2VsZi5nZXRfZnJvbSgpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTUhNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUicgbm90IGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICAgICAgaWYgJ0EnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgICAgIGlmICdGJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsnc3RhdHVzJ10KKyAgICAgICAgICAgIGRlbCBtZXNzYWdlWyd4LXN0YXR1cyddCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgZmxhZ3MgPSBzZXQoc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIGlmICdSJyBub3QgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ3Vuc2VlbicpCisgICAgICAgICAgICBpZiAnRCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2RlbGV0ZWQnKQorICAgICAgICAgICAgaWYgJ0EnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdhbnN3ZXJlZCcpCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsnc3RhdHVzJ10KKyAgICAgICAgICAgIGRlbCBtZXNzYWdlWyd4LXN0YXR1cyddCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gc3BlY2lmaWVkIHR5cGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShtZXNzYWdlKSkKKworCitjbGFzcyBtYm94TWVzc2FnZShfbWJveE1NREZNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggbWJveC1zcGVjaWZpYyBwcm9wZXJ0aWVzLiIiIgorCisKK2NsYXNzIE1ITWVzc2FnZShNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggTUgtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIE1ITWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5fc2VxdWVuY2VzID0gW10KKyAgICAgICAgTWVzc2FnZS5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorCisgICAgZGVmIGdldF9zZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc2VxdWVuY2VzIHRoYXQgaW5jbHVkZSB0aGUgbWVzc2FnZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NlcXVlbmNlc1s6XQorCisgICAgZGVmIHNldF9zZXF1ZW5jZXMoc2VsZiwgc2VxdWVuY2VzKToKKyAgICAgICAgIiIiU2V0IHRoZSBsaXN0IG9mIHNlcXVlbmNlcyB0aGF0IGluY2x1ZGUgdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHNlbGYuX3NlcXVlbmNlcyA9IGxpc3Qoc2VxdWVuY2VzKQorCisgICAgZGVmIGFkZF9zZXF1ZW5jZShzZWxmLCBzZXF1ZW5jZSk6CisgICAgICAgICIiIkFkZCBzZXF1ZW5jZSB0byBsaXN0IG9mIHNlcXVlbmNlcyBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VxdWVuY2UsIHN0cik6CisgICAgICAgICAgICBpZiBub3Qgc2VxdWVuY2UgaW4gc2VsZi5fc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIHNlbGYuX3NlcXVlbmNlcy5hcHBlbmQoc2VxdWVuY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3NlcXVlbmNlIG11c3QgYmUgYSBzdHJpbmc6ICVzJyAlIHR5cGUoc2VxdWVuY2UpKQorCisgICAgZGVmIHJlbW92ZV9zZXF1ZW5jZShzZWxmLCBzZXF1ZW5jZSk6CisgICAgICAgICIiIlJlbW92ZSBzZXF1ZW5jZSBmcm9tIHRoZSBsaXN0IG9mIHNlcXVlbmNlcyBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3NlcXVlbmNlcy5yZW1vdmUoc2VxdWVuY2UpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9leHBsYWluX3RvKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJDb3B5IE1ILXNwZWNpZmljIHN0YXRlIHRvIG1lc3NhZ2UgaW5zb2ZhciBhcyBwb3NzaWJsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBzZXF1ZW5jZXMgPSBzZXQoc2VsZi5nZXRfc2VxdWVuY2VzKCkpCisgICAgICAgICAgICBpZiAndW5zZWVuJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUycpCisgICAgICAgICAgICBpZiAnZmxhZ2dlZCcgaW4gc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ0YnKQorICAgICAgICAgICAgaWYgJ3JlcGxpZWQnIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdSJykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIF9tYm94TU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgc2VxdWVuY2VzID0gc2V0KHNlbGYuZ2V0X3NlcXVlbmNlcygpKQorICAgICAgICAgICAgaWYgJ3Vuc2Vlbicgbm90IGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdSTycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ08nKQorICAgICAgICAgICAgaWYgJ2ZsYWdnZWQnIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdGJykKKyAgICAgICAgICAgIGlmICdyZXBsaWVkJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnQScpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNSE1lc3NhZ2UpOgorICAgICAgICAgICAgZm9yIHNlcXVlbmNlIGluIHNlbGYuZ2V0X3NlcXVlbmNlcygpOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKHNlcXVlbmNlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgQmFieWxNZXNzYWdlKToKKyAgICAgICAgICAgIHNlcXVlbmNlcyA9IHNldChzZWxmLmdldF9zZXF1ZW5jZXMoKSkKKyAgICAgICAgICAgIGlmICd1bnNlZW4nIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9sYWJlbCgndW5zZWVuJykKKyAgICAgICAgICAgIGlmICdyZXBsaWVkJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2Fuc3dlcmVkJykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1lc3NhZ2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB0byBzcGVjaWZpZWQgdHlwZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKG1lc3NhZ2UpKQorCisKK2NsYXNzIEJhYnlsTWVzc2FnZShNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggQmFieWwtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIEJhYnlsTWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5fbGFiZWxzID0gW10KKyAgICAgICAgc2VsZi5fdmlzaWJsZSA9IE1lc3NhZ2UoKQorICAgICAgICBNZXNzYWdlLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKyAgICBkZWYgZ2V0X2xhYmVscyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBsYWJlbHMgb24gdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9sYWJlbHNbOl0KKworICAgIGRlZiBzZXRfbGFiZWxzKHNlbGYsIGxhYmVscyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBsYWJlbHMgb24gdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHNlbGYuX2xhYmVscyA9IGxpc3QobGFiZWxzKQorCisgICAgZGVmIGFkZF9sYWJlbChzZWxmLCBsYWJlbCk6CisgICAgICAgICIiIkFkZCBsYWJlbCB0byBsaXN0IG9mIGxhYmVscyBvbiB0aGUgbWVzc2FnZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShsYWJlbCwgc3RyKToKKyAgICAgICAgICAgIGlmIGxhYmVsIG5vdCBpbiBzZWxmLl9sYWJlbHM6CisgICAgICAgICAgICAgICAgc2VsZi5fbGFiZWxzLmFwcGVuZChsYWJlbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbGFiZWwgbXVzdCBiZSBhIHN0cmluZzogJXMnICUgdHlwZShsYWJlbCkpCisKKyAgICBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGxhYmVsKToKKyAgICAgICAgIiIiUmVtb3ZlIGxhYmVsIGZyb20gdGhlIGxpc3Qgb2YgbGFiZWxzIG9uIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9sYWJlbHMucmVtb3ZlKGxhYmVsKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfdmlzaWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB2aXNpYmxlIGhlYWRlcnMuIiIiCisgICAgICAgIHJldHVybiBNZXNzYWdlKHNlbGYuX3Zpc2libGUpCisKKyAgICBkZWYgc2V0X3Zpc2libGUoc2VsZiwgdmlzaWJsZSk6CisgICAgICAgICIiIlNldCB0aGUgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB2aXNpYmxlIGhlYWRlcnMuIiIiCisgICAgICAgIHNlbGYuX3Zpc2libGUgPSBNZXNzYWdlKHZpc2libGUpCisKKyAgICBkZWYgdXBkYXRlX3Zpc2libGUoc2VsZik6CisgICAgICAgICIiIlVwZGF0ZSBhbmQvb3Igc2Vuc2libHkgZ2VuZXJhdGUgYSBzZXQgb2YgdmlzaWJsZSBoZWFkZXJzLiIiIgorICAgICAgICBmb3IgaGVhZGVyIGluIHNlbGYuX3Zpc2libGUua2V5cygpOgorICAgICAgICAgICAgaWYgaGVhZGVyIGluIHNlbGY6CisgICAgICAgICAgICAgICAgc2VsZi5fdmlzaWJsZS5yZXBsYWNlX2hlYWRlcihoZWFkZXIsIHNlbGZbaGVhZGVyXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX3Zpc2libGVbaGVhZGVyXQorICAgICAgICBmb3IgaGVhZGVyIGluICgnRGF0ZScsICdGcm9tJywgJ1JlcGx5LVRvJywgJ1RvJywgJ0NDJywgJ1N1YmplY3QnKToKKyAgICAgICAgICAgIGlmIGhlYWRlciBpbiBzZWxmIGFuZCBoZWFkZXIgbm90IGluIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICAgICAgc2VsZi5fdmlzaWJsZVtoZWFkZXJdID0gc2VsZltoZWFkZXJdCisKKyAgICBkZWYgX2V4cGxhaW5fdG8oc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkNvcHkgQmFieWwtc3BlY2lmaWMgc3RhdGUgdG8gbWVzc2FnZSBpbnNvZmFyIGFzIHBvc3NpYmxlLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1haWxkaXJNZXNzYWdlKToKKyAgICAgICAgICAgIGxhYmVscyA9IHNldChzZWxmLmdldF9sYWJlbHMoKSkKKyAgICAgICAgICAgIGlmICd1bnNlZW4nIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdTJykKKyAgICAgICAgICAgIGlmICdmb3J3YXJkZWQnIGluIGxhYmVscyBvciAncmVzZW50JyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUCcpCisgICAgICAgICAgICBpZiAnYW5zd2VyZWQnIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdSJykKKyAgICAgICAgICAgIGlmICdkZWxldGVkJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnVCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBfbWJveE1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIGxhYmVscyA9IHNldChzZWxmLmdldF9sYWJlbHMoKSkKKyAgICAgICAgICAgIGlmICd1bnNlZW4nIG5vdCBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUk8nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdPJykKKyAgICAgICAgICAgIGlmICdkZWxldGVkJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnRCcpCisgICAgICAgICAgICBpZiAnYW5zd2VyZWQnIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdBJykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1ITWVzc2FnZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBzZXQoc2VsZi5nZXRfbGFiZWxzKCkpCisgICAgICAgICAgICBpZiAndW5zZWVuJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfc2VxdWVuY2UoJ3Vuc2VlbicpCisgICAgICAgICAgICBpZiAnYW5zd2VyZWQnIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgbWVzc2FnZS5zZXRfdmlzaWJsZShzZWxmLmdldF92aXNpYmxlKCkpCisgICAgICAgICAgICBmb3IgbGFiZWwgaW4gc2VsZi5nZXRfbGFiZWxzKCk6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwobGFiZWwpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gc3BlY2lmaWVkIHR5cGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShtZXNzYWdlKSkKKworCitjbGFzcyBNTURGTWVzc2FnZShfbWJveE1NREZNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggTU1ERi1zcGVjaWZpYyBwcm9wZXJ0aWVzLiIiIgorCisKK2NsYXNzIF9Qcm94eUZpbGU6CisgICAgIiIiQSByZWFkLW9ubHkgd3JhcHBlciBvZiBhIGZpbGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgcG9zPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgX1Byb3h5RmlsZS4iIiIKKyAgICAgICAgc2VsZi5fZmlsZSA9IGYKKyAgICAgICAgaWYgcG9zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9wb3MgPSBmLnRlbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcG9zID0gcG9zCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICAiIiJSZWFkIGJ5dGVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZChzaXplLCBzZWxmLl9maWxlLnJlYWQpCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBhIGxpbmUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkKHNpemUsIHNlbGYuX2ZpbGUucmVhZGxpbmUpCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50PU5vbmUpOgorICAgICAgICAiIiJSZWFkIG11bHRpcGxlIGxpbmVzLiIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBzZWxmOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKQorICAgICAgICAgICAgaWYgc2l6ZWhpbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2l6ZWhpbnQgLT0gbGVuKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgc2l6ZWhpbnQgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAiIiJJdGVyYXRlIG92ZXIgbGluZXMuIiIiCisgICAgICAgIHJldHVybiBpdGVyKHNlbGYucmVhZGxpbmUsICIiKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgcG9zaXRpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9wb3MKKworICAgIGRlZiBzZWVrKHNlbGYsIG9mZnNldCwgd2hlbmNlPTApOgorICAgICAgICAiIiJDaGFuZ2UgcG9zaXRpb24uIiIiCisgICAgICAgIGlmIHdoZW5jZSA9PSAxOgorICAgICAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX3BvcykKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKG9mZnNldCwgd2hlbmNlKQorICAgICAgICBzZWxmLl9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgZmlsZS4iIiIKKyAgICAgICAgZGVsIHNlbGYuX2ZpbGUKKworICAgIGRlZiBfcmVhZChzZWxmLCBzaXplLCByZWFkX21ldGhvZCk6CisgICAgICAgICIiIlJlYWQgc2l6ZSBieXRlcyB1c2luZyByZWFkX21ldGhvZC4iIiIKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IC0xCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9wb3MpCisgICAgICAgIHJlc3VsdCA9IHJlYWRfbWV0aG9kKHNpemUpCisgICAgICAgIHNlbGYuX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBfUGFydGlhbEZpbGUoX1Byb3h5RmlsZSk6CisgICAgIiIiQSByZWFkLW9ubHkgd3JhcHBlciBvZiBwYXJ0IG9mIGEgZmlsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBzdGFydD1Ob25lLCBzdG9wPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgX1BhcnRpYWxGaWxlLiIiIgorICAgICAgICBfUHJveHlGaWxlLl9faW5pdF9fKHNlbGYsIGYsIHN0YXJ0KQorICAgICAgICBzZWxmLl9zdGFydCA9IHN0YXJ0CisgICAgICAgIHNlbGYuX3N0b3AgPSBzdG9wCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gc3RhcnQuIiIiCisgICAgICAgIHJldHVybiBfUHJveHlGaWxlLnRlbGwoc2VsZikgLSBzZWxmLl9zdGFydAorCisgICAgZGVmIHNlZWsoc2VsZiwgb2Zmc2V0LCB3aGVuY2U9MCk6CisgICAgICAgICIiIkNoYW5nZSBwb3NpdGlvbiwgcG9zc2libHkgd2l0aCByZXNwZWN0IHRvIHN0YXJ0IG9yIHN0b3AuIiIiCisgICAgICAgIGlmIHdoZW5jZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5fcG9zID0gc2VsZi5fc3RhcnQKKyAgICAgICAgICAgIHdoZW5jZSA9IDEKKyAgICAgICAgZWxpZiB3aGVuY2UgPT0gMjoKKyAgICAgICAgICAgIHNlbGYuX3BvcyA9IHNlbGYuX3N0b3AKKyAgICAgICAgICAgIHdoZW5jZSA9IDEKKyAgICAgICAgX1Byb3h5RmlsZS5zZWVrKHNlbGYsIG9mZnNldCwgd2hlbmNlKQorCisgICAgZGVmIF9yZWFkKHNlbGYsIHNpemUsIHJlYWRfbWV0aG9kKToKKyAgICAgICAgIiIiUmVhZCBzaXplIGJ5dGVzIHVzaW5nIHJlYWRfbWV0aG9kLCBob25vcmluZyBzdGFydCBhbmQgc3RvcC4iIiIKKyAgICAgICAgcmVtYWluaW5nID0gc2VsZi5fc3RvcCAtIHNlbGYuX3BvcworICAgICAgICBpZiByZW1haW5pbmcgPD0gMDoKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBpZiBzaXplIGlzIE5vbmUgb3Igc2l6ZSA8IDAgb3Igc2l6ZSA+IHJlbWFpbmluZzoKKyAgICAgICAgICAgIHNpemUgPSByZW1haW5pbmcKKyAgICAgICAgcmV0dXJuIF9Qcm94eUZpbGUuX3JlYWQoc2VsZiwgc2l6ZSwgcmVhZF9tZXRob2QpCisKKworZGVmIF9sb2NrX2ZpbGUoZiwgZG90bG9jaz1UcnVlKToKKyAgICAiIiJMb2NrIGZpbGUgZiB1c2luZyBsb2NrZiwgZmxvY2ssIGFuZCBkb3QgbG9ja2luZy4iIiIKKyAgICBkb3Rsb2NrX2RvbmUgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgaWYgZmNudGw6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmNudGwubG9ja2YoZiwgZmNudGwuTE9DS19FWCB8IGZjbnRsLkxPQ0tfTkIpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVBR0FJTjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdsb2NrZjogbG9jayB1bmF2YWlsYWJsZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfRVggfCBmY250bC5MT0NLX05CKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FV09VTERCTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdmbG9jazogbG9jayB1bmF2YWlsYWJsZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBkb3Rsb2NrOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByZV9sb2NrID0gX2NyZWF0ZV90ZW1wb3JhcnkoZi5uYW1lICsgJy5sb2NrJykKKyAgICAgICAgICAgICAgICBwcmVfbG9jay5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVBQ0NFUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAjIFdpdGhvdXQgd3JpdGUgYWNjZXNzLCBqdXN0IHNraXAgZG90bG9ja2luZy4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICdsaW5rJyk6CisgICAgICAgICAgICAgICAgICAgIG9zLmxpbmsocHJlX2xvY2submFtZSwgZi5uYW1lICsgJy5sb2NrJykKKyAgICAgICAgICAgICAgICAgICAgZG90bG9ja19kb25lID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocHJlX2xvY2submFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUocHJlX2xvY2submFtZSwgZi5uYW1lICsgJy5sb2NrJykKKyAgICAgICAgICAgICAgICAgICAgZG90bG9ja19kb25lID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwcmVfbG9jay5uYW1lKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ2RvdCBsb2NrIHVuYXZhaWxhYmxlOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5uYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgZXhjZXB0OgorICAgICAgICBpZiBmY250bDoKKyAgICAgICAgICAgIGZjbnRsLmxvY2tmKGYsIGZjbnRsLkxPQ0tfVU4pCisgICAgICAgICAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX1VOKQorICAgICAgICBpZiBkb3Rsb2NrX2RvbmU6CisgICAgICAgICAgICBvcy5yZW1vdmUoZi5uYW1lICsgJy5sb2NrJykKKyAgICAgICAgcmFpc2UKKworZGVmIF91bmxvY2tfZmlsZShmKToKKyAgICAiIiJVbmxvY2sgZmlsZSBmIHVzaW5nIGxvY2tmLCBmbG9jaywgYW5kIGRvdCBsb2NraW5nLiIiIgorICAgIGlmIGZjbnRsOgorICAgICAgICBmY250bC5sb2NrZihmLCBmY250bC5MT0NLX1VOKQorICAgICAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX1VOKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKGYubmFtZSArICcubG9jaycpOgorICAgICAgICBvcy5yZW1vdmUoZi5uYW1lICsgJy5sb2NrJykKKworZGVmIF9jcmVhdGVfY2FyZWZ1bGx5KHBhdGgpOgorICAgICIiIkNyZWF0ZSBhIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iIiIKKyAgICBmZCA9IG9zLm9wZW4ocGF0aCwgb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB8IG9zLk9fUkRXUikKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBvcGVuKHBhdGgsICdyYisnKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNsb3NlKGZkKQorCitkZWYgX2NyZWF0ZV90ZW1wb3JhcnkocGF0aCk6CisgICAgIiIiQ3JlYXRlIGEgdGVtcCBmaWxlIGJhc2VkIG9uIHBhdGggYW5kIG9wZW4gZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIiIiCisgICAgcmV0dXJuIF9jcmVhdGVfY2FyZWZ1bGx5KCclcy4lcy4lcy4lcycgJSAocGF0aCwgaW50KHRpbWUudGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0aG9zdG5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5nZXRwaWQoKSkpCisKKworIyMgU3RhcnQ6IGNsYXNzZXMgZnJvbSB0aGUgb3JpZ2luYWwgbW9kdWxlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCisKKyMgTm90ZSB0aGF0IHRoZSBNYWlsZGlyIGNsYXNzLCB3aG9zZSBuYW1lIGlzIHVuY2hhbmdlZCwgaXRzZWxmIG9mZmVycyBhIG5leHQoKQorIyBtZXRob2QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAKIGNsYXNzIF9NYWlsYm94OgogCkBAIC0zMiw2MiArMTkwMSw3IEBACiAgICAgICAgICAgICBzZWxmLnNlZWtwID0gc3RvcCA9IHNlbGYuZnAudGVsbCgpCiAgICAgICAgICAgICBpZiBzdGFydCAhPSBzdG9wOgogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIHJldHVybiBzZWxmLmZhY3RvcnkoX1N1YmZpbGUoc2VsZi5mcCwgc3RhcnQsIHN0b3ApKQotCi0KLWNsYXNzIF9TdWJmaWxlOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBzdGFydCwgc3RvcCk6Ci0gICAgICAgIHNlbGYuZnAgPSBmcAotICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKLSAgICAgICAgc2VsZi5zdG9wID0gc3RvcAotICAgICAgICBzZWxmLnBvcyA9IHNlbGYuc3RhcnQKLQotCi0gICAgZGVmIF9yZWFkKHNlbGYsIGxlbmd0aCwgcmVhZF9mdW5jdGlvbik6Ci0gICAgICAgIGlmIHNlbGYucG9zID49IHNlbGYuc3RvcDoKLSAgICAgICAgICAgIHJldHVybiAnJwotICAgICAgICByZW1haW5pbmcgPSBzZWxmLnN0b3AgLSBzZWxmLnBvcwotICAgICAgICBpZiBsZW5ndGggaXMgTm9uZSBvciBsZW5ndGggPCAwIG9yIGxlbmd0aCA+IHJlbWFpbmluZzoKLSAgICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZwotICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5wb3MpCi0gICAgICAgIGRhdGEgPSByZWFkX2Z1bmN0aW9uKGxlbmd0aCkKLSAgICAgICAgc2VsZi5wb3MgPSBzZWxmLmZwLnRlbGwoKQotICAgICAgICByZXR1cm4gZGF0YQotCi0gICAgZGVmIHJlYWQoc2VsZiwgbGVuZ3RoID0gTm9uZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9yZWFkKGxlbmd0aCwgc2VsZi5mcC5yZWFkKQotCi0gICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aCA9IE5vbmUpOgotICAgICAgICByZXR1cm4gc2VsZi5fcmVhZChsZW5ndGgsIHNlbGYuZnAucmVhZGxpbmUpCi0KLSAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50ID0gLTEpOgotICAgICAgICBsaW5lcyA9IFtdCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCi0gICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCi0gICAgICAgICAgICBpZiBzaXplaGludCA+PSAwOgotICAgICAgICAgICAgICAgIHNpemVoaW50ID0gc2l6ZWhpbnQgLSBsZW4obGluZSkKLSAgICAgICAgICAgICAgICBpZiBzaXplaGludCA8PSAwOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICByZXR1cm4gbGluZXMKLQotICAgIGRlZiB0ZWxsKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5wb3MgLSBzZWxmLnN0YXJ0Ci0KLSAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT0wKToKLSAgICAgICAgaWYgd2hlbmNlID09IDA6Ci0gICAgICAgICAgICBzZWxmLnBvcyA9IHNlbGYuc3RhcnQgKyBwb3MKLSAgICAgICAgZWxpZiB3aGVuY2UgPT0gMToKLSAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyBwb3MKLSAgICAgICAgZWxpZiB3aGVuY2UgPT0gMjoKLSAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5zdG9wICsgcG9zCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIGRlbCBzZWxmLmZwCi0KKyAgICAgICAgcmV0dXJuIHNlbGYuZmFjdG9yeShfUGFydGlhbEZpbGUoc2VsZi5mcCwgc3RhcnQsIHN0b3ApKQogCiAjIFJlY29tbWVuZGVkIHRvIHVzZSBQb3J0YWJsZVVuaXhNYWlsYm94IGluc3RlYWQhCiBjbGFzcyBVbml4TWFpbGJveChfTWFpbGJveCk6CkBAIC0yMTMsMzYgKzIwMjcsNiBAQAogICAgICAgICByZXR1cm4gbXNnCiAKIAotY2xhc3MgTWFpbGRpcjoKLSAgICAjIFFtYWlsIGRpcmVjdG9yeSBtYWlsYm94Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGlybmFtZSwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSk6Ci0gICAgICAgIHNlbGYuZGlybmFtZSA9IGRpcm5hbWUKLSAgICAgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQotCi0gICAgICAgICMgY2hlY2sgZm9yIG5ldyBtYWlsCi0gICAgICAgIG5ld2RpciA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsICduZXcnKQotICAgICAgICBib3hlcyA9IFtvcy5wYXRoLmpvaW4obmV3ZGlyLCBmKQotICAgICAgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKG5ld2RpcikgaWYgZlswXSAhPSAnLiddCi0KLSAgICAgICAgIyBOb3cgY2hlY2sgZm9yIGN1cnJlbnQgbWFpbCBpbiB0aGlzIG1haWxkaXIKLSAgICAgICAgY3VyZGlyID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgJ2N1cicpCi0gICAgICAgIGJveGVzICs9IFtvcy5wYXRoLmpvaW4oY3VyZGlyLCBmKQotICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcihjdXJkaXIpIGlmIGZbMF0gIT0gJy4nXQotICAgICAgICBib3hlcy5yZXZlcnNlKCkKLSAgICAgICAgc2VsZi5ib3hlcyA9IGJveGVzCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBpdGVyKHNlbGYubmV4dCwgTm9uZSkKLQotICAgIGRlZiBuZXh0KHNlbGYpOgotICAgICAgICBpZiBub3Qgc2VsZi5ib3hlczoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGZuID0gc2VsZi5ib3hlcy5wb3AoKQotICAgICAgICBmcCA9IG9wZW4oZm4pCi0gICAgICAgIHJldHVybiBzZWxmLmZhY3RvcnkoZnApCi0KLQogY2xhc3MgQmFieWxNYWlsYm94KF9NYWlsYm94KToKIAogICAgIGRlZiBfc2VhcmNoX3N0YXJ0KHNlbGYpOgpAQCAtMjYzLDU5ICsyMDQ3LDIwIEBACiAgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHBvcykKICAgICAgICAgICAgICAgICByZXR1cm4KIAotCi1kZWYgX3Rlc3QoKToKLSAgICBpbXBvcnQgc3lzCi0KLSAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCi0gICAgaWYgbm90IGFyZ3M6Ci0gICAgICAgIGZvciBrZXkgaW4gJ01BSUxESVInLCAnTUFJTCcsICdMT0dOQU1FJywgJ1VTRVInOgotICAgICAgICAgICAgaWYga2V5IGluIG9zLmVudmlyb246Ci0gICAgICAgICAgICAgICAgbWJveCA9IG9zLmVudmlyb25ba2V5XQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiJE1BSUwsICRMT0dOQU1FIG5vciAkVVNFUiBzZXQgLS0gd2hvIGFyZSB5b3U/IgotICAgICAgICAgICAgcmV0dXJuCi0gICAgZWxzZToKLSAgICAgICAgbWJveCA9IGFyZ3NbMF0KLSAgICBpZiBtYm94WzoxXSA9PSAnKyc6Ci0gICAgICAgIG1ib3ggPSBvcy5lbnZpcm9uWydIT01FJ10gKyAnL01haWwvJyArIG1ib3hbMTpdCi0gICAgZWxpZiBub3QgJy8nIGluIG1ib3g6Ci0gICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKCcvdmFyL21haWwvJyArIG1ib3gpOgotICAgICAgICAgICAgbWJveCA9ICcvdmFyL21haWwvJyArIG1ib3gKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG1ib3ggPSAnL3Vzci9tYWlsLycgKyBtYm94Ci0gICAgaWYgb3MucGF0aC5pc2RpcihtYm94KToKLSAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4obWJveCwgJ2N1cicpKToKLSAgICAgICAgICAgIG1iID0gTWFpbGRpcihtYm94KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbWIgPSBNSE1haWxib3gobWJveCkKLSAgICBlbHNlOgotICAgICAgICBmcCA9IG9wZW4obWJveCwgJ3InKQotICAgICAgICBtYiA9IFBvcnRhYmxlVW5peE1haWxib3goZnApCi0KLSAgICBtc2dzID0gW10KLSAgICB3aGlsZSAxOgotICAgICAgICBtc2cgPSBtYi5uZXh0KCkKLSAgICAgICAgaWYgbXNnIGlzIE5vbmU6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBtc2dzLmFwcGVuZChtc2cpCi0gICAgICAgIGlmIGxlbihhcmdzKSA8PSAxOgotICAgICAgICAgICAgbXNnLmZwID0gTm9uZQotICAgIGlmIGxlbihhcmdzKSA+IDE6Ci0gICAgICAgIG51bSA9IGludChhcmdzWzFdKQotICAgICAgICBwcmludCAnTWVzc2FnZSAlZCBib2R5OiclbnVtCi0gICAgICAgIG1zZyA9IG1zZ3NbbnVtLTFdCi0gICAgICAgIG1zZy5yZXdpbmRib2R5KCkKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZShtc2cuZnAucmVhZCgpKQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICdNYWlsYm94JyxtYm94LCdoYXMnLGxlbihtc2dzKSwnbWVzc2FnZXM6JwotICAgICAgICBmb3IgbXNnIGluIG1zZ3M6Ci0gICAgICAgICAgICBmID0gbXNnLmdldGhlYWRlcignZnJvbScpIG9yICIiCi0gICAgICAgICAgICBzID0gbXNnLmdldGhlYWRlcignc3ViamVjdCcpIG9yICIiCi0gICAgICAgICAgICBkID0gbXNnLmdldGhlYWRlcignZGF0ZScpIG9yICIiCi0gICAgICAgICAgICBwcmludCAnLSUyMC4yMHMgICAlMjAuMjBzICAgJS0zMC4zMHMnJShmLCBkWzU6XSwgcykKKyMjIEVuZDogY2xhc3NlcyBmcm9tIHRoZSBvcmlnaW5hbCBtb2R1bGUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KIAogCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIF90ZXN0KCkKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiUmFpc2VkIGZvciBtb2R1bGUtc3BlY2lmaWMgZXJyb3JzLiIiIgorCitjbGFzcyBOb1N1Y2hNYWlsYm94RXJyb3IoRXJyb3IpOgorICAgICIiIlRoZSBzcGVjaWZpZWQgbWFpbGJveCBkb2VzIG5vdCBleGlzdCBhbmQgd29uJ3QgYmUgY3JlYXRlZC4iIiIKKworY2xhc3MgTm90RW1wdHlFcnJvcihFcnJvcik6CisgICAgIiIiVGhlIHNwZWNpZmllZCBtYWlsYm94IGlzIG5vdCBlbXB0eSBhbmQgZGVsZXRpb24gd2FzIHJlcXVlc3RlZC4iIiIKKworY2xhc3MgRXh0ZXJuYWxDbGFzaEVycm9yKEVycm9yKToKKyAgICAiIiJBbm90aGVyIHByb2Nlc3MgY2F1c2VkIGFuIGFjdGlvbiB0byBmYWlsLiIiIgorCitjbGFzcyBGb3JtYXRFcnJvcihFcnJvcik6CisgICAgIiIiQSBmaWxlIGFwcGVhcnMgdG8gaGF2ZSBhbiBpbnZhbGlkIGZvcm1hdC4iIiIKZGlmZiAtLWdpdCBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CmluZGV4IGQ4NDcyNTkuLjA4ODE0MDkgMTAwNjQ0Ci0tLSBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkKKysrIGIvTGliL21zaWxpYi9fX2luaXRfXy5weQpAQCAtMTk2LDExICsxOTYsOSBAQAogICAgICAgICBzZWxmLmZpbGVuYW1lcy5hZGQobG9naWNhbCkKICAgICAgICAgcmV0dXJuIGxvZ2ljYWwKIAotICAgIGRlZiBhcHBlbmQoc2VsZiwgZnVsbCwgZmlsZSwgbG9naWNhbCA9IE5vbmUpOgorICAgIGRlZiBhcHBlbmQoc2VsZiwgZnVsbCwgbG9naWNhbCk6CiAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbCk6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgbm90IGxvZ2ljYWw6Ci0gICAgICAgICAgICBsb2dpY2FsID0gc2VsZi5nZW5faWQoZGlyLCBmaWxlKQogICAgICAgICBzZWxmLmluZGV4ICs9IDEKICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQoKGZ1bGwsIGxvZ2ljYWwpKQogICAgICAgICByZXR1cm4gc2VsZi5pbmRleCwgbG9naWNhbApAQCAtMzMwLDcgKzMyOCw3IEBACiAgICAgICAgICAgICBsb2dpY2FsID0gc2VsZi5rZXlmaWxlc1tmaWxlXQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbG9naWNhbCA9IE5vbmUKLSAgICAgICAgc2VxdWVuY2UsIGxvZ2ljYWwgPSBzZWxmLmNhYi5hcHBlbmQoYWJzb2x1dGUsIGZpbGUsIGxvZ2ljYWwpCisgICAgICAgIHNlcXVlbmNlLCBsb2dpY2FsID0gc2VsZi5jYWIuYXBwZW5kKGFic29sdXRlLCBsb2dpY2FsKQogICAgICAgICBhc3NlcnQgbG9naWNhbCBub3QgaW4gc2VsZi5pZHMKICAgICAgICAgc2VsZi5pZHMuYWRkKGxvZ2ljYWwpCiAgICAgICAgIHNob3J0ID0gc2VsZi5tYWtlX3Nob3J0KGZpbGUpCkBAIC00MDAsMTMgKzM5OCwxNCBAQAogICAgICAgICBzZWxmLmRsZyA9IGRsZwogICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAKLSAgICBkZWYgZXZlbnQoc2VsZiwgZXYsIGFyZywgY29uZCA9ICIxIiwgb3JkZXIgPSBOb25lKToKKyAgICBkZWYgZXZlbnQoc2VsZiwgZXZlbnQsIGFyZ3VtZW50LCBjb25kaXRpb24gPSAiMSIsIG9yZGVyaW5nID0gTm9uZSk6CiAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGxnLmRiLCAiQ29udHJvbEV2ZW50IiwKLSAgICAgICAgICAgICAgICAgWyhzZWxmLmRsZy5uYW1lLCBzZWxmLm5hbWUsIGV2LCBhcmcsIGNvbmQsIG9yZGVyKV0pCisgICAgICAgICAgICAgICAgIFsoc2VsZi5kbGcubmFtZSwgc2VsZi5uYW1lLCBldmVudCwgYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLCBvcmRlcmluZyldKQogCi0gICAgZGVmIG1hcHBpbmcoc2VsZiwgZXYsIGF0dHIpOgorICAgIGRlZiBtYXBwaW5nKHNlbGYsIG1hcHBpbmcsIGF0dHJpYnV0ZSk6CiAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGxnLmRiLCAiRXZlbnRNYXBwaW5nIiwKLSAgICAgICAgICAgICAgICAgWyhzZWxmLmRsZy5uYW1lLCBzZWxmLm5hbWUsIGV2LCBhdHRyKV0pCisgICAgICAgICAgICAgICAgIFsoc2VsZi5kbGcubmFtZSwgc2VsZi5uYW1lLCBldmVudCwgYXR0cmlidXRlKV0pCiAKICAgICBkZWYgY29uZGl0aW9uKHNlbGYsIGFjdGlvbiwgY29uZGl0aW9uKToKICAgICAgICAgYWRkX2RhdGEoc2VsZi5kbGcuZGIsICJDb250cm9sQ29uZGl0aW9uIiwKZGlmZiAtLWdpdCBhL0xpYi9tc2lsaWIvdGV4dC5weSBiL0xpYi9tc2lsaWIvdGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmZkMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL21zaWxpYi90ZXh0LnB5CkBAIC0wLDAgKzEsMTI5IEBACitpbXBvcnQgbXNpbGliLG9zO2Rpcm5hbWU9b3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCitBY3Rpb25UZXh0ID0gWworKHUnSW5zdGFsbFZhbGlkYXRlJywgdSdWYWxpZGF0aW5nIGluc3RhbGwnLCBOb25lKSwKKyh1J0luc3RhbGxGaWxlcycsIHUnQ29weWluZyBuZXcgZmlsZXMnLCB1J0ZpbGU6IFsxXSwgIERpcmVjdG9yeTogWzldLCAgU2l6ZTogWzZdJyksCisodSdJbnN0YWxsQWRtaW5QYWNrYWdlJywgdSdDb3B5aW5nIG5ldHdvcmsgaW5zdGFsbCBmaWxlcycsIHUnRmlsZTogWzFdLCBEaXJlY3Rvcnk6IFs5XSwgU2l6ZTogWzZdJyksCisodSdGaWxlQ29zdCcsIHUnQ29tcHV0aW5nIHNwYWNlIHJlcXVpcmVtZW50cycsIE5vbmUpLAorKHUnQ29zdEluaXRpYWxpemUnLCB1J0NvbXB1dGluZyBzcGFjZSByZXF1aXJlbWVudHMnLCBOb25lKSwKKyh1J0Nvc3RGaW5hbGl6ZScsIHUnQ29tcHV0aW5nIHNwYWNlIHJlcXVpcmVtZW50cycsIE5vbmUpLAorKHUnQ3JlYXRlU2hvcnRjdXRzJywgdSdDcmVhdGluZyBzaG9ydGN1dHMnLCB1J1Nob3J0Y3V0OiBbMV0nKSwKKyh1J1B1Ymxpc2hDb21wb25lbnRzJywgdSdQdWJsaXNoaW5nIFF1YWxpZmllZCBDb21wb25lbnRzJywgdSdDb21wb25lbnQgSUQ6IFsxXSwgUXVhbGlmaWVyOiBbMl0nKSwKKyh1J1B1Ymxpc2hGZWF0dXJlcycsIHUnUHVibGlzaGluZyBQcm9kdWN0IEZlYXR1cmVzJywgdSdGZWF0dXJlOiBbMV0nKSwKKyh1J1B1Ymxpc2hQcm9kdWN0JywgdSdQdWJsaXNoaW5nIHByb2R1Y3QgaW5mb3JtYXRpb24nLCBOb25lKSwKKyh1J1JlZ2lzdGVyQ2xhc3NJbmZvJywgdSdSZWdpc3RlcmluZyBDbGFzcyBzZXJ2ZXJzJywgdSdDbGFzcyBJZDogWzFdJyksCisodSdSZWdpc3RlckV4dGVuc2lvbkluZm8nLCB1J1JlZ2lzdGVyaW5nIGV4dGVuc2lvbiBzZXJ2ZXJzJywgdSdFeHRlbnNpb246IFsxXScpLAorKHUnUmVnaXN0ZXJNSU1FSW5mbycsIHUnUmVnaXN0ZXJpbmcgTUlNRSBpbmZvJywgdSdNSU1FIENvbnRlbnQgVHlwZTogWzFdLCBFeHRlbnNpb246IFsyXScpLAorKHUnUmVnaXN0ZXJQcm9nSWRJbmZvJywgdSdSZWdpc3RlcmluZyBwcm9ncmFtIGlkZW50aWZpZXJzJywgdSdQcm9nSWQ6IFsxXScpLAorKHUnQWxsb2NhdGVSZWdpc3RyeVNwYWNlJywgdSdBbGxvY2F0aW5nIHJlZ2lzdHJ5IHNwYWNlJywgdSdGcmVlIHNwYWNlOiBbMV0nKSwKKyh1J0FwcFNlYXJjaCcsIHUnU2VhcmNoaW5nIGZvciBpbnN0YWxsZWQgYXBwbGljYXRpb25zJywgdSdQcm9wZXJ0eTogWzFdLCBTaWduYXR1cmU6IFsyXScpLAorKHUnQmluZEltYWdlJywgdSdCaW5kaW5nIGV4ZWN1dGFibGVzJywgdSdGaWxlOiBbMV0nKSwKKyh1J0NDUFNlYXJjaCcsIHUnU2VhcmNoaW5nIGZvciBxdWFsaWZ5aW5nIHByb2R1Y3RzJywgTm9uZSksCisodSdDcmVhdGVGb2xkZXJzJywgdSdDcmVhdGluZyBmb2xkZXJzJywgdSdGb2xkZXI6IFsxXScpLAorKHUnRGVsZXRlU2VydmljZXMnLCB1J0RlbGV0aW5nIHNlcnZpY2VzJywgdSdTZXJ2aWNlOiBbMV0nKSwKKyh1J0R1cGxpY2F0ZUZpbGVzJywgdSdDcmVhdGluZyBkdXBsaWNhdGUgZmlsZXMnLCB1J0ZpbGU6IFsxXSwgIERpcmVjdG9yeTogWzldLCAgU2l6ZTogWzZdJyksCisodSdGaW5kUmVsYXRlZFByb2R1Y3RzJywgdSdTZWFyY2hpbmcgZm9yIHJlbGF0ZWQgYXBwbGljYXRpb25zJywgdSdGb3VuZCBhcHBsaWNhdGlvbjogWzFdJyksCisodSdJbnN0YWxsT0RCQycsIHUnSW5zdGFsbGluZyBPREJDIGNvbXBvbmVudHMnLCBOb25lKSwKKyh1J0luc3RhbGxTZXJ2aWNlcycsIHUnSW5zdGFsbGluZyBuZXcgc2VydmljZXMnLCB1J1NlcnZpY2U6IFsyXScpLAorKHUnTGF1bmNoQ29uZGl0aW9ucycsIHUnRXZhbHVhdGluZyBsYXVuY2ggY29uZGl0aW9ucycsIE5vbmUpLAorKHUnTWlncmF0ZUZlYXR1cmVTdGF0ZXMnLCB1J01pZ3JhdGluZyBmZWF0dXJlIHN0YXRlcyBmcm9tIHJlbGF0ZWQgYXBwbGljYXRpb25zJywgdSdBcHBsaWNhdGlvbjogWzFdJyksCisodSdNb3ZlRmlsZXMnLCB1J01vdmluZyBmaWxlcycsIHUnRmlsZTogWzFdLCAgRGlyZWN0b3J5OiBbOV0sICBTaXplOiBbNl0nKSwKKyh1J1BhdGNoRmlsZXMnLCB1J1BhdGNoaW5nIGZpbGVzJywgdSdGaWxlOiBbMV0sICBEaXJlY3Rvcnk6IFsyXSwgIFNpemU6IFszXScpLAorKHUnUHJvY2Vzc0NvbXBvbmVudHMnLCB1J1VwZGF0aW5nIGNvbXBvbmVudCByZWdpc3RyYXRpb24nLCBOb25lKSwKKyh1J1JlZ2lzdGVyQ29tUGx1cycsIHUnUmVnaXN0ZXJpbmcgQ09NKyBBcHBsaWNhdGlvbnMgYW5kIENvbXBvbmVudHMnLCB1J0FwcElkOiBbMV17eywgQXBwVHlwZTogWzJdLCBVc2VyczogWzNdLCBSU046IFs0XX19JyksCisodSdSZWdpc3RlckZvbnRzJywgdSdSZWdpc3RlcmluZyBmb250cycsIHUnRm9udDogWzFdJyksCisodSdSZWdpc3RlclByb2R1Y3QnLCB1J1JlZ2lzdGVyaW5nIHByb2R1Y3QnLCB1J1sxXScpLAorKHUnUmVnaXN0ZXJUeXBlTGlicmFyaWVzJywgdSdSZWdpc3RlcmluZyB0eXBlIGxpYnJhcmllcycsIHUnTGliSUQ6IFsxXScpLAorKHUnUmVnaXN0ZXJVc2VyJywgdSdSZWdpc3RlcmluZyB1c2VyJywgdSdbMV0nKSwKKyh1J1JlbW92ZUR1cGxpY2F0ZUZpbGVzJywgdSdSZW1vdmluZyBkdXBsaWNhdGVkIGZpbGVzJywgdSdGaWxlOiBbMV0sIERpcmVjdG9yeTogWzldJyksCisodSdSZW1vdmVFbnZpcm9ubWVudFN0cmluZ3MnLCB1J1VwZGF0aW5nIGVudmlyb25tZW50IHN0cmluZ3MnLCB1J05hbWU6IFsxXSwgVmFsdWU6IFsyXSwgQWN0aW9uIFszXScpLAorKHUnUmVtb3ZlRXhpc3RpbmdQcm9kdWN0cycsIHUnUmVtb3ZpbmcgYXBwbGljYXRpb25zJywgdSdBcHBsaWNhdGlvbjogWzFdLCBDb21tYW5kIGxpbmU6IFsyXScpLAorKHUnUmVtb3ZlRmlsZXMnLCB1J1JlbW92aW5nIGZpbGVzJywgdSdGaWxlOiBbMV0sIERpcmVjdG9yeTogWzldJyksCisodSdSZW1vdmVGb2xkZXJzJywgdSdSZW1vdmluZyBmb2xkZXJzJywgdSdGb2xkZXI6IFsxXScpLAorKHUnUmVtb3ZlSW5pVmFsdWVzJywgdSdSZW1vdmluZyBJTkkgZmlsZXMgZW50cmllcycsIHUnRmlsZTogWzFdLCAgU2VjdGlvbjogWzJdLCAgS2V5OiBbM10sIFZhbHVlOiBbNF0nKSwKKyh1J1JlbW92ZU9EQkMnLCB1J1JlbW92aW5nIE9EQkMgY29tcG9uZW50cycsIE5vbmUpLAorKHUnUmVtb3ZlUmVnaXN0cnlWYWx1ZXMnLCB1J1JlbW92aW5nIHN5c3RlbSByZWdpc3RyeSB2YWx1ZXMnLCB1J0tleTogWzFdLCBOYW1lOiBbMl0nKSwKKyh1J1JlbW92ZVNob3J0Y3V0cycsIHUnUmVtb3Zpbmcgc2hvcnRjdXRzJywgdSdTaG9ydGN1dDogWzFdJyksCisodSdSTUNDUFNlYXJjaCcsIHUnU2VhcmNoaW5nIGZvciBxdWFsaWZ5aW5nIHByb2R1Y3RzJywgTm9uZSksCisodSdTZWxmUmVnTW9kdWxlcycsIHUnUmVnaXN0ZXJpbmcgbW9kdWxlcycsIHUnRmlsZTogWzFdLCBGb2xkZXI6IFsyXScpLAorKHUnU2VsZlVucmVnTW9kdWxlcycsIHUnVW5yZWdpc3RlcmluZyBtb2R1bGVzJywgdSdGaWxlOiBbMV0sIEZvbGRlcjogWzJdJyksCisodSdTZXRPREJDRm9sZGVycycsIHUnSW5pdGlhbGl6aW5nIE9EQkMgZGlyZWN0b3JpZXMnLCBOb25lKSwKKyh1J1N0YXJ0U2VydmljZXMnLCB1J1N0YXJ0aW5nIHNlcnZpY2VzJywgdSdTZXJ2aWNlOiBbMV0nKSwKKyh1J1N0b3BTZXJ2aWNlcycsIHUnU3RvcHBpbmcgc2VydmljZXMnLCB1J1NlcnZpY2U6IFsxXScpLAorKHUnVW5wdWJsaXNoQ29tcG9uZW50cycsIHUnVW5wdWJsaXNoaW5nIFF1YWxpZmllZCBDb21wb25lbnRzJywgdSdDb21wb25lbnQgSUQ6IFsxXSwgUXVhbGlmaWVyOiBbMl0nKSwKKyh1J1VucHVibGlzaEZlYXR1cmVzJywgdSdVbnB1Ymxpc2hpbmcgUHJvZHVjdCBGZWF0dXJlcycsIHUnRmVhdHVyZTogWzFdJyksCisodSdVbnJlZ2lzdGVyQ2xhc3NJbmZvJywgdSdVbnJlZ2lzdGVyIENsYXNzIHNlcnZlcnMnLCB1J0NsYXNzIElkOiBbMV0nKSwKKyh1J1VucmVnaXN0ZXJDb21QbHVzJywgdSdVbnJlZ2lzdGVyaW5nIENPTSsgQXBwbGljYXRpb25zIGFuZCBDb21wb25lbnRzJywgdSdBcHBJZDogWzFde3ssIEFwcFR5cGU6IFsyXX19JyksCisodSdVbnJlZ2lzdGVyRXh0ZW5zaW9uSW5mbycsIHUnVW5yZWdpc3RlcmluZyBleHRlbnNpb24gc2VydmVycycsIHUnRXh0ZW5zaW9uOiBbMV0nKSwKKyh1J1VucmVnaXN0ZXJGb250cycsIHUnVW5yZWdpc3RlcmluZyBmb250cycsIHUnRm9udDogWzFdJyksCisodSdVbnJlZ2lzdGVyTUlNRUluZm8nLCB1J1VucmVnaXN0ZXJpbmcgTUlNRSBpbmZvJywgdSdNSU1FIENvbnRlbnQgVHlwZTogWzFdLCBFeHRlbnNpb246IFsyXScpLAorKHUnVW5yZWdpc3RlclByb2dJZEluZm8nLCB1J1VucmVnaXN0ZXJpbmcgcHJvZ3JhbSBpZGVudGlmaWVycycsIHUnUHJvZ0lkOiBbMV0nKSwKKyh1J1VucmVnaXN0ZXJUeXBlTGlicmFyaWVzJywgdSdVbnJlZ2lzdGVyaW5nIHR5cGUgbGlicmFyaWVzJywgdSdMaWJJRDogWzFdJyksCisodSdXcml0ZUVudmlyb25tZW50U3RyaW5ncycsIHUnVXBkYXRpbmcgZW52aXJvbm1lbnQgc3RyaW5ncycsIHUnTmFtZTogWzFdLCBWYWx1ZTogWzJdLCBBY3Rpb24gWzNdJyksCisodSdXcml0ZUluaVZhbHVlcycsIHUnV3JpdGluZyBJTkkgZmlsZXMgdmFsdWVzJywgdSdGaWxlOiBbMV0sICBTZWN0aW9uOiBbMl0sICBLZXk6IFszXSwgVmFsdWU6IFs0XScpLAorKHUnV3JpdGVSZWdpc3RyeVZhbHVlcycsIHUnV3JpdGluZyBzeXN0ZW0gcmVnaXN0cnkgdmFsdWVzJywgdSdLZXk6IFsxXSwgTmFtZTogWzJdLCBWYWx1ZTogWzNdJyksCisodSdBZHZlcnRpc2UnLCB1J0FkdmVydGlzaW5nIGFwcGxpY2F0aW9uJywgTm9uZSksCisodSdHZW5lcmF0ZVNjcmlwdCcsIHUnR2VuZXJhdGluZyBzY3JpcHQgb3BlcmF0aW9ucyBmb3IgYWN0aW9uOicsIHUnWzFdJyksCisodSdJbnN0YWxsU0ZQQ2F0YWxvZ0ZpbGUnLCB1J0luc3RhbGxpbmcgc3lzdGVtIGNhdGFsb2cnLCB1J0ZpbGU6IFsxXSwgIERlcGVuZGVuY2llczogWzJdJyksCisodSdNc2lQdWJsaXNoQXNzZW1ibGllcycsIHUnUHVibGlzaGluZyBhc3NlbWJseSBpbmZvcm1hdGlvbicsIHUnQXBwbGljYXRpb24gQ29udGV4dDpbMV0sIEFzc2VtYmx5IE5hbWU6WzJdJyksCisodSdNc2lVbnB1Ymxpc2hBc3NlbWJsaWVzJywgdSdVbnB1Ymxpc2hpbmcgYXNzZW1ibHkgaW5mb3JtYXRpb24nLCB1J0FwcGxpY2F0aW9uIENvbnRleHQ6WzFdLCBBc3NlbWJseSBOYW1lOlsyXScpLAorKHUnUm9sbGJhY2snLCB1J1JvbGxpbmcgYmFjayBhY3Rpb246JywgdSdbMV0nKSwKKyh1J1JvbGxiYWNrQ2xlYW51cCcsIHUnUmVtb3ZpbmcgYmFja3VwIGZpbGVzJywgdSdGaWxlOiBbMV0nKSwKKyh1J1VubW92ZUZpbGVzJywgdSdSZW1vdmluZyBtb3ZlZCBmaWxlcycsIHUnRmlsZTogWzFdLCBEaXJlY3Rvcnk6IFs5XScpLAorKHUnVW5wdWJsaXNoUHJvZHVjdCcsIHUnVW5wdWJsaXNoaW5nIHByb2R1Y3QgaW5mb3JtYXRpb24nLCBOb25lKSwKK10KKworVUlUZXh0ID0gWworKHUnQWJzZW50UGF0aCcsIE5vbmUpLAorKHUnYnl0ZXMnLCB1J2J5dGVzJyksCisodSdHQicsIHUnR0InKSwKKyh1J0tCJywgdSdLQicpLAorKHUnTUInLCB1J01CJyksCisodSdNZW51QWJzZW50JywgdSdFbnRpcmUgZmVhdHVyZSB3aWxsIGJlIHVuYXZhaWxhYmxlJyksCisodSdNZW51QWR2ZXJ0aXNlJywgdSdGZWF0dXJlIHdpbGwgYmUgaW5zdGFsbGVkIHdoZW4gcmVxdWlyZWQnKSwKKyh1J01lbnVBbGxDRCcsIHUnRW50aXJlIGZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgdG8gcnVuIGZyb20gQ0QnKSwKKyh1J01lbnVBbGxMb2NhbCcsIHUnRW50aXJlIGZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgb24gbG9jYWwgaGFyZCBkcml2ZScpLAorKHUnTWVudUFsbE5ldHdvcmsnLCB1J0VudGlyZSBmZWF0dXJlIHdpbGwgYmUgaW5zdGFsbGVkIHRvIHJ1biBmcm9tIG5ldHdvcmsnKSwKKyh1J01lbnVDRCcsIHUnV2lsbCBiZSBpbnN0YWxsZWQgdG8gcnVuIGZyb20gQ0QnKSwKKyh1J01lbnVMb2NhbCcsIHUnV2lsbCBiZSBpbnN0YWxsZWQgb24gbG9jYWwgaGFyZCBkcml2ZScpLAorKHUnTWVudU5ldHdvcmsnLCB1J1dpbGwgYmUgaW5zdGFsbGVkIHRvIHJ1biBmcm9tIG5ldHdvcmsnKSwKKyh1J1NjcmlwdEluUHJvZ3Jlc3MnLCB1J0dhdGhlcmluZyByZXF1aXJlZCBpbmZvcm1hdGlvbi4uLicpLAorKHUnU2VsQWJzZW50QWJzZW50JywgdSdUaGlzIGZlYXR1cmUgd2lsbCByZW1haW4gdW5pbnN0YWxsZWQnKSwKKyh1J1NlbEFic2VudEFkdmVydGlzZScsIHUnVGhpcyBmZWF0dXJlIHdpbGwgYmUgc2V0IHRvIGJlIGluc3RhbGxlZCB3aGVuIHJlcXVpcmVkJyksCisodSdTZWxBYnNlbnRDRCcsIHUnVGhpcyBmZWF0dXJlIHdpbGwgYmUgaW5zdGFsbGVkIHRvIHJ1biBmcm9tIENEJyksCisodSdTZWxBYnNlbnRMb2NhbCcsIHUnVGhpcyBmZWF0dXJlIHdpbGwgYmUgaW5zdGFsbGVkIG9uIHRoZSBsb2NhbCBoYXJkIGRyaXZlJyksCisodSdTZWxBYnNlbnROZXR3b3JrJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgdG8gcnVuIGZyb20gdGhlIG5ldHdvcmsnKSwKKyh1J1NlbEFkdmVydGlzZUFic2VudCcsIHUnVGhpcyBmZWF0dXJlIHdpbGwgYmVjb21lIHVuYXZhaWxhYmxlJyksCisodSdTZWxBZHZlcnRpc2VBZHZlcnRpc2UnLCB1J1dpbGwgYmUgaW5zdGFsbGVkIHdoZW4gcmVxdWlyZWQnKSwKKyh1J1NlbEFkdmVydGlzZUNEJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUgdG8gcnVuIGZyb20gQ0QnKSwKKyh1J1NlbEFkdmVydGlzZUxvY2FsJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgb24geW91ciBsb2NhbCBoYXJkIGRyaXZlJyksCisodSdTZWxBZHZlcnRpc2VOZXR3b3JrJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUgdG8gcnVuIGZyb20gdGhlIG5ldHdvcmsnKSwKKyh1J1NlbENEQWJzZW50JywgdSJUaGlzIGZlYXR1cmUgd2lsbCBiZSB1bmluc3RhbGxlZCBjb21wbGV0ZWx5LCB5b3Ugd29uJ3QgYmUgYWJsZSB0byBydW4gaXQgZnJvbSBDRCIpLAorKHUnU2VsQ0RBZHZlcnRpc2UnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGNoYW5nZSBmcm9tIHJ1biBmcm9tIENEIHN0YXRlIHRvIHNldCB0byBiZSBpbnN0YWxsZWQgd2hlbiByZXF1aXJlZCcpLAorKHUnU2VsQ0RDRCcsIHUnVGhpcyBmZWF0dXJlIHdpbGwgcmVtYWluIHRvIGJlIHJ1biBmcm9tIENEJyksCisodSdTZWxDRExvY2FsJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBjaGFuZ2UgZnJvbSBydW4gZnJvbSBDRCBzdGF0ZSB0byBiZSBpbnN0YWxsZWQgb24gdGhlIGxvY2FsIGhhcmQgZHJpdmUnKSwKKyh1J1NlbENoaWxkQ29zdE5lZycsIHUnVGhpcyBmZWF0dXJlIGZyZWVzIHVwIFsxXSBvbiB5b3VyIGhhcmQgZHJpdmUuJyksCisodSdTZWxDaGlsZENvc3RQb3MnLCB1J1RoaXMgZmVhdHVyZSByZXF1aXJlcyBbMV0gb24geW91ciBoYXJkIGRyaXZlLicpLAorKHUnU2VsQ29zdFBlbmRpbmcnLCB1J0NvbXBpbGluZyBjb3N0IGZvciB0aGlzIGZlYXR1cmUuLi4nKSwKKyh1J1NlbExvY2FsQWJzZW50JywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBjb21wbGV0ZWx5IHJlbW92ZWQnKSwKKyh1J1NlbExvY2FsQWR2ZXJ0aXNlJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSByZW1vdmVkIGZyb20geW91ciBsb2NhbCBoYXJkIGRyaXZlLCBidXQgd2lsbCBiZSBzZXQgdG8gYmUgaW5zdGFsbGVkIHdoZW4gcmVxdWlyZWQnKSwKKyh1J1NlbExvY2FsQ0QnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB5b3VyIGxvY2FsIGhhcmQgZHJpdmUsIGJ1dCB3aWxsIGJlIHN0aWxsIGF2YWlsYWJsZSB0byBydW4gZnJvbSBDRCcpLAorKHUnU2VsTG9jYWxMb2NhbCcsIHUnVGhpcyBmZWF0dXJlIHdpbGwgcmVtYWluIG9uIHlvdSBsb2NhbCBoYXJkIGRyaXZlJyksCisodSdTZWxMb2NhbE5ldHdvcmsnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB5b3VyIGxvY2FsIGhhcmQgZHJpdmUsIGJ1dCB3aWxsIGJlIHN0aWxsIGF2YWlsYWJsZSB0byBydW4gZnJvbSB0aGUgbmV0d29yaycpLAorKHUnU2VsTmV0d29ya0Fic2VudCcsIHUiVGhpcyBmZWF0dXJlIHdpbGwgYmUgdW5pbnN0YWxsZWQgY29tcGxldGVseSwgeW91IHdvbid0IGJlIGFibGUgdG8gcnVuIGl0IGZyb20gdGhlIG5ldHdvcmsiKSwKKyh1J1NlbE5ldHdvcmtBZHZlcnRpc2UnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGNoYW5nZSBmcm9tIHJ1biBmcm9tIG5ldHdvcmsgc3RhdGUgdG8gc2V0IHRvIGJlIGluc3RhbGxlZCB3aGVuIHJlcXVpcmVkJyksCisodSdTZWxOZXR3b3JrTG9jYWwnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGNoYW5nZSBmcm9tIHJ1biBmcm9tIG5ldHdvcmsgc3RhdGUgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBsb2NhbCBoYXJkIGRyaXZlJyksCisodSdTZWxOZXR3b3JrTmV0d29yaycsIHUnVGhpcyBmZWF0dXJlIHdpbGwgcmVtYWluIHRvIGJlIHJ1biBmcm9tIHRoZSBuZXR3b3JrJyksCisodSdTZWxQYXJlbnRDb3N0TmVnTmVnJywgdSdUaGlzIGZlYXR1cmUgZnJlZXMgdXAgWzFdIG9uIHlvdXIgaGFyZCBkcml2ZS4gSXQgaGFzIFsyXSBvZiBbM10gc3ViZmVhdHVyZXMgc2VsZWN0ZWQuIFRoZSBzdWJmZWF0dXJlcyBmcmVlIHVwIFs0XSBvbiB5b3VyIGhhcmQgZHJpdmUuJyksCisodSdTZWxQYXJlbnRDb3N0TmVnUG9zJywgdSdUaGlzIGZlYXR1cmUgZnJlZXMgdXAgWzFdIG9uIHlvdXIgaGFyZCBkcml2ZS4gSXQgaGFzIFsyXSBvZiBbM10gc3ViZmVhdHVyZXMgc2VsZWN0ZWQuIFRoZSBzdWJmZWF0dXJlcyByZXF1aXJlIFs0XSBvbiB5b3VyIGhhcmQgZHJpdmUuJyksCisodSdTZWxQYXJlbnRDb3N0UG9zTmVnJywgdSdUaGlzIGZlYXR1cmUgcmVxdWlyZXMgWzFdIG9uIHlvdXIgaGFyZCBkcml2ZS4gSXQgaGFzIFsyXSBvZiBbM10gc3ViZmVhdHVyZXMgc2VsZWN0ZWQuIFRoZSBzdWJmZWF0dXJlcyBmcmVlIHVwIFs0XSBvbiB5b3VyIGhhcmQgZHJpdmUuJyksCisodSdTZWxQYXJlbnRDb3N0UG9zUG9zJywgdSdUaGlzIGZlYXR1cmUgcmVxdWlyZXMgWzFdIG9uIHlvdXIgaGFyZCBkcml2ZS4gSXQgaGFzIFsyXSBvZiBbM10gc3ViZmVhdHVyZXMgc2VsZWN0ZWQuIFRoZSBzdWJmZWF0dXJlcyByZXF1aXJlIFs0XSBvbiB5b3VyIGhhcmQgZHJpdmUuJyksCisodSdUaW1lUmVtYWluaW5nJywgdSdUaW1lIHJlbWFpbmluZzoge1sxXSBtaW51dGVzIH17WzJdIHNlY29uZHN9JyksCisodSdWb2x1bWVDb3N0QXZhaWxhYmxlJywgdSdBdmFpbGFibGUnKSwKKyh1J1ZvbHVtZUNvc3REaWZmZXJlbmNlJywgdSdEaWZmZXJlbmNlJyksCisodSdWb2x1bWVDb3N0UmVxdWlyZWQnLCB1J1JlcXVpcmVkJyksCisodSdWb2x1bWVDb3N0U2l6ZScsIHUnRGlzayBTaXplJyksCisodSdWb2x1bWVDb3N0Vm9sdW1lJywgdSdWb2x1bWUnKSwKK10KKwordGFibGVzPVsnQWN0aW9uVGV4dCcsICdVSVRleHQnXQpkaWZmIC0tZ2l0IGEvTGliL21zaWxpYi91aXNhbXBsZS5weSBiL0xpYi9tc2lsaWIvdWlzYW1wbGUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmMzY2QuLjAwMDAwMDAKLS0tIGEvTGliL21zaWxpYi91aXNhbXBsZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTkgKzAsMCBAQAotaW1wb3J0IG1zaWxpYixvcztkaXJuYW1lPW9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKLUFkbWluRXhlY3V0ZVNlcXVlbmNlID0gWwotKHUnSW5zdGFsbFZhbGlkYXRlJywgTm9uZSwgMTQwMCksCi0odSdJbnN0YWxsSW5pdGlhbGl6ZScsIE5vbmUsIDE1MDApLAotKHUnSW5zdGFsbEZpbmFsaXplJywgTm9uZSwgNjYwMCksCi0odSdJbnN0YWxsRmlsZXMnLCBOb25lLCA0MDAwKSwKLSh1J0luc3RhbGxBZG1pblBhY2thZ2UnLCBOb25lLCAzOTAwKSwKLSh1J0ZpbGVDb3N0JywgTm9uZSwgOTAwKSwKLSh1J0Nvc3RJbml0aWFsaXplJywgTm9uZSwgODAwKSwKLSh1J0Nvc3RGaW5hbGl6ZScsIE5vbmUsIDEwMDApLAotXQotCi1BZG1pblVJU2VxdWVuY2UgPSBbCi0odSdBZG1pbldlbGNvbWVEbGcnLCBOb25lLCAxMjMwKSwKLSh1J0ZpbGVDb3N0JywgTm9uZSwgOTAwKSwKLSh1J0Nvc3RJbml0aWFsaXplJywgTm9uZSwgODAwKSwKLSh1J0Nvc3RGaW5hbGl6ZScsIE5vbmUsIDEwMDApLAotKHUnRXhlY3V0ZUFjdGlvbicsIE5vbmUsIDEzMDApLAotKHUnRXhpdERpYWxvZycsIE5vbmUsIC0xKSwKLSh1J0ZhdGFsRXJyb3InLCBOb25lLCAtMyksCi0odSdQcmVwYXJlRGxnJywgTm9uZSwgMTQwKSwKLSh1J1Byb2dyZXNzRGxnJywgTm9uZSwgMTI4MCksCi0odSdVc2VyRXhpdCcsIE5vbmUsIC0yKSwKLV0KLQotQWR2dEV4ZWN1dGVTZXF1ZW5jZSA9IFsKLSh1J0luc3RhbGxWYWxpZGF0ZScsIE5vbmUsIDE0MDApLAotKHUnSW5zdGFsbEluaXRpYWxpemUnLCBOb25lLCAxNTAwKSwKLSh1J0luc3RhbGxGaW5hbGl6ZScsIE5vbmUsIDY2MDApLAotKHUnQ29zdEluaXRpYWxpemUnLCBOb25lLCA4MDApLAotKHUnQ29zdEZpbmFsaXplJywgTm9uZSwgMTAwMCksCi0odSdDcmVhdGVTaG9ydGN1dHMnLCBOb25lLCA0NTAwKSwKLSh1J1B1Ymxpc2hDb21wb25lbnRzJywgTm9uZSwgNjIwMCksCi0odSdQdWJsaXNoRmVhdHVyZXMnLCBOb25lLCA2MzAwKSwKLSh1J1B1Ymxpc2hQcm9kdWN0JywgTm9uZSwgNjQwMCksCi0odSdSZWdpc3RlckNsYXNzSW5mbycsIE5vbmUsIDQ2MDApLAotKHUnUmVnaXN0ZXJFeHRlbnNpb25JbmZvJywgTm9uZSwgNDcwMCksCi0odSdSZWdpc3Rlck1JTUVJbmZvJywgTm9uZSwgNDkwMCksCi0odSdSZWdpc3RlclByb2dJZEluZm8nLCBOb25lLCA0ODAwKSwKLV0KLQotQkJDb250cm9sID0gWwotXQotCi1CaWxsYm9hcmQgPSBbCi1dCi0KLUJpbmFyeSA9IFsKLSh1J2Jhbm5yYm1wJywgbXNpbGliLkJpbmFyeShvcy5wYXRoLmpvaW4oZGlybmFtZSwiYmFubnJibXAuYmluIikpKSwKLSh1J2NvbXBsZXRpJywgbXNpbGliLkJpbmFyeShvcy5wYXRoLmpvaW4oZGlybmFtZSwiY29tcGxldGkuYmluIikpKSwKLSh1J2N1c3RpY29uJywgbXNpbGliLkJpbmFyeShvcy5wYXRoLmpvaW4oZGlybmFtZSwiY3VzdGljb24uYmluIikpKSwKLSh1J2RsZ2JtcCcsIG1zaWxpYi5CaW5hcnkob3MucGF0aC5qb2luKGRpcm5hbWUsImRsZ2JtcC5iaW4iKSkpLAotKHUnZXhjbGFtaWMnLCBtc2lsaWIuQmluYXJ5KG9zLnBhdGguam9pbihkaXJuYW1lLCJleGNsYW1pYy5iaW4iKSkpLAotKHUnaW5mbycsIG1zaWxpYi5CaW5hcnkob3MucGF0aC5qb2luKGRpcm5hbWUsImluZm8uYmluIikpKSwKLSh1J2luc3RpY29uJywgbXNpbGliLkJpbmFyeShvcy5wYXRoLmpvaW4oZGlybmFtZSwiaW5zdGljb24uYmluIikpKSwKLSh1J05ldycsIG1zaWxpYi5CaW5hcnkob3MucGF0aC5qb2luKGRpcm5hbWUsIk5ldy5iaW4iKSkpLAotKHUncmVtb3ZpY28nLCBtc2lsaWIuQmluYXJ5KG9zLnBhdGguam9pbihkaXJuYW1lLCJyZW1vdmljby5iaW4iKSkpLAotKHUncmVwYWlyaWMnLCBtc2lsaWIuQmluYXJ5KG9zLnBhdGguam9pbihkaXJuYW1lLCJyZXBhaXJpYy5iaW4iKSkpLAotKHUnVXAnLCBtc2lsaWIuQmluYXJ5KG9zLnBhdGguam9pbihkaXJuYW1lLCJVcC5iaW4iKSkpLAotXQotCi1DaGVja0JveCA9IFsKLV0KLQotUHJvcGVydHkgPSBbCi0odSdCYW5uZXJCaXRtYXAnLCB1J2Jhbm5yYm1wJyksCi0odSdJQWdyZWUnLCB1J05vJyksCi0odSdQcm9kdWN0SUQnLCB1J25vbmUnKSwKLSh1J0FSUEhFTFBMSU5LJywgdSdodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbWFuYWdlbWVudCcpLAotKHUnQnV0dG9uVGV4dF9CYWNrJywgdSc8ICZCYWNrJyksCi0odSdCdXR0b25UZXh0X0Jyb3dzZScsIHUnQnImb3dzZScpLAotKHUnQnV0dG9uVGV4dF9DYW5jZWwnLCB1J0NhbmNlbCcpLAotKHUnQnV0dG9uVGV4dF9FeGl0JywgdScmRXhpdCcpLAotKHUnQnV0dG9uVGV4dF9GaW5pc2gnLCB1JyZGaW5pc2gnKSwKLSh1J0J1dHRvblRleHRfSWdub3JlJywgdScmSWdub3JlJyksCi0odSdCdXR0b25UZXh0X0luc3RhbGwnLCB1JyZJbnN0YWxsJyksCi0odSdCdXR0b25UZXh0X05leHQnLCB1JyZOZXh0ID4nKSwKLSh1J0J1dHRvblRleHRfTm8nLCB1JyZObycpLAotKHUnQnV0dG9uVGV4dF9PSycsIHUnT0snKSwKLSh1J0J1dHRvblRleHRfUmVtb3ZlJywgdScmUmVtb3ZlJyksCi0odSdCdXR0b25UZXh0X1JlcGFpcicsIHUnJlJlcGFpcicpLAotKHUnQnV0dG9uVGV4dF9SZXNldCcsIHUnJlJlc2V0JyksCi0odSdCdXR0b25UZXh0X1Jlc3VtZScsIHUnJlJlc3VtZScpLAotKHUnQnV0dG9uVGV4dF9SZXRyeScsIHUnJlJldHJ5JyksCi0odSdCdXR0b25UZXh0X1JldHVybicsIHUnJlJldHVybicpLAotKHUnQnV0dG9uVGV4dF9ZZXMnLCB1JyZZZXMnKSwKLSh1J0NvbXBsZXRlU2V0dXBJY29uJywgdSdjb21wbGV0aScpLAotKHUnQ29tcG9uZW50RG93bmxvYWQnLCB1J2Z0cDovL2Fub255bW91c0BtaWNyb3NvZnQuY29tL2NvbXBvbmVudHMvJyksCi0odSdDdXN0b21TZXR1cEljb24nLCB1J2N1c3RpY29uJyksCi0odSdEZWZhdWx0VUlGb250JywgdSdEbGdGb250OCcpLAotKHUnRGlhbG9nQml0bWFwJywgdSdkbGdibXAnKSwKLSh1J0RsZ1RpdGxlRm9udCcsIHUneyZEbGdGb250Qm9sZDh9JyksCi0odSdFcnJvckRpYWxvZycsIHUnRXJyb3JEbGcnKSwKLSh1J0V4Y2xhbWF0aW9uSWNvbicsIHUnZXhjbGFtaWMnKSwKLSh1J0luZm9JY29uJywgdSdpbmZvJyksCi0odSdJbnN0YWxsZXJJY29uJywgdSdpbnN0aWNvbicpLAotKHUnSU5TVEFMTExFVkVMJywgdSczJyksCi0odSdJbnN0YWxsTW9kZScsIHUnVHlwaWNhbCcpLAotKHUnUElEVGVtcGxhdGUnLCB1JzEyMzQ1PCMjIy0lJSUlJSUlPkBAQEBAJyksCi0jKHUnUHJvZHVjdExhbmd1YWdlJywgdScxMDMzJyksCi0odSdQcm9ncmVzczEnLCB1J0luc3RhbGxpbmcnKSwKLSh1J1Byb2dyZXNzMicsIHUnaW5zdGFsbHMnKSwKLSh1J1BST01QVFJPTExCQUNLQ09TVCcsIHUnUCcpLAotKHUnUmVtb3ZlSWNvbicsIHUncmVtb3ZpY28nKSwKLSh1J1JlcGFpckljb24nLCB1J3JlcGFpcmljJyksCi0odSdTZXR1cCcsIHUnU2V0dXAnKSwKLSh1J1Nob3dVc2VyUmVnaXN0cmF0aW9uRGxnJywgdScxJyksCi0odSdXaXphcmQnLCB1J1NldHVwIFdpemFyZCcpLAotXQotCi1Db21ib0JveCA9IFsKLV0KLQotQ29udHJvbCA9IFsKLSh1J0FkbWluV2VsY29tZURsZycsIHUnQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzAsIDIzNCwgMSwgTm9uZSwgdSdbRGlhbG9nQml0bWFwXScsIHUnQmFjaycsIE5vbmUpLAotKHUnQWRtaW5XZWxjb21lRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5XZWxjb21lRGxnJywgdSdDYW5jZWwnLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0NhbmNlbF0nLCB1J0JpdG1hcCcsIE5vbmUpLAotKHUnQWRtaW5XZWxjb21lRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDEzNSwgNzAsIDIyMCwgMzAsIDE5NjYxMSwgTm9uZSwgdSdUaGUgW1dpemFyZF0gd2lsbCBjcmVhdGUgYSBzZXJ2ZXIgaW1hZ2Ugb2YgW1Byb2R1Y3ROYW1lXSwgYXQgYSBzcGVjaWZpZWQgbmV0d29yayBsb2NhdGlvbi4gIENsaWNrIE5leHQgdG8gY29udGludWUgb3IgQ2FuY2VsIHRvIGV4aXQgdGhlIFtXaXphcmRdLicsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5XZWxjb21lRGxnJywgdSdUaXRsZScsIHUnVGV4dCcsIDEzNSwgMjAsIDIyMCwgNjAsIDE5NjYxMSwgTm9uZSwgdSd7XFxWZXJkYW5hQm9sZDEzfVdlbGNvbWUgdG8gdGhlIFtQcm9kdWN0TmFtZV0gW1dpemFyZF0nLCBOb25lLCBOb25lKSwKLSh1J0FkbWluV2VsY29tZURsZycsIHUnQmFjaycsIHUnUHVzaEJ1dHRvbicsIDE4MCwgMjQzLCA1NiwgMTcsIDEsIE5vbmUsIHUnW0J1dHRvblRleHRfQmFja10nLCB1J05leHQnLCBOb25lKSwKLSh1J0FkbWluV2VsY29tZURsZycsIHUnTmV4dCcsIHUnUHVzaEJ1dHRvbicsIDIzNiwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfTmV4dF0nLCB1J0NhbmNlbCcsIE5vbmUpLAotKHUnRXhpdERpYWxvZycsIHUnQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzAsIDIzNCwgMSwgTm9uZSwgdSdbRGlhbG9nQml0bWFwXScsIHUnQmFjaycsIE5vbmUpLAotKHUnRXhpdERpYWxvZycsIHUnQm90dG9tTGluZScsIHUnTGluZScsIDAsIDIzNCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J0V4aXREaWFsb2cnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDEsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQml0bWFwJywgTm9uZSksCi0odSdFeGl0RGlhbG9nJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDEzNSwgNzAsIDIyMCwgMjAsIDE5NjYxMSwgTm9uZSwgdSdDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBbV2l6YXJkXS4nLCBOb25lLCBOb25lKSwKLSh1J0V4aXREaWFsb2cnLCB1J1RpdGxlJywgdSdUZXh0JywgMTM1LCAyMCwgMjIwLCA2MCwgMTk2NjExLCBOb25lLCB1J3tcXFZlcmRhbmFCb2xkMTN9Q29tcGxldGluZyB0aGUgW1Byb2R1Y3ROYW1lXSBbV2l6YXJkXScsIE5vbmUsIE5vbmUpLAotKHUnRXhpdERpYWxvZycsIHUnQmFjaycsIHUnUHVzaEJ1dHRvbicsIDE4MCwgMjQzLCA1NiwgMTcsIDEsIE5vbmUsIHUnW0J1dHRvblRleHRfQmFja10nLCB1J0ZpbmlzaCcsIE5vbmUpLAotKHUnRXhpdERpYWxvZycsIHUnRmluaXNoJywgdSdQdXNoQnV0dG9uJywgMjM2LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9GaW5pc2hdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J0ZhdGFsRXJyb3InLCB1J0JpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzcwLCAyMzQsIDEsIE5vbmUsIHUnW0RpYWxvZ0JpdG1hcF0nLCB1J0JhY2snLCBOb25lKSwKLSh1J0ZhdGFsRXJyb3InLCB1J0JvdHRvbUxpbmUnLCB1J0xpbmUnLCAwLCAyMzQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdGYXRhbEVycm9yJywgdSdDYW5jZWwnLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAxLCBOb25lLCB1J1tCdXR0b25UZXh0X0NhbmNlbF0nLCB1J0JpdG1hcCcsIE5vbmUpLAotKHUnRmF0YWxFcnJvcicsIHUnVGl0bGUnLCB1J1RleHQnLCAxMzUsIDIwLCAyMjAsIDYwLCAxOTY2MTEsIE5vbmUsIHUne1xcVmVyZGFuYUJvbGQxM31bUHJvZHVjdE5hbWVdIFtXaXphcmRdIGVuZGVkIHByZW1hdHVyZWx5JywgTm9uZSwgTm9uZSksCi0odSdGYXRhbEVycm9yJywgdSdCYWNrJywgdSdQdXNoQnV0dG9uJywgMTgwLCAyNDMsIDU2LCAxNywgMSwgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnRmluaXNoJywgTm9uZSksCi0odSdGYXRhbEVycm9yJywgdSdGaW5pc2gnLCB1J1B1c2hCdXR0b24nLCAyMzYsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0ZpbmlzaF0nLCB1J0NhbmNlbCcsIE5vbmUpLAotKHUnRmF0YWxFcnJvcicsIHUnRGVzY3JpcHRpb24xJywgdSdUZXh0JywgMTM1LCA3MCwgMjIwLCA0MCwgMTk2NjExLCBOb25lLCB1J1tQcm9kdWN0TmFtZV0gc2V0dXAgZW5kZWQgcHJlbWF0dXJlbHkgYmVjYXVzZSBvZiBhbiBlcnJvci4gIFlvdXIgc3lzdGVtIGhhcyBub3QgYmVlbiBtb2RpZmllZC4gIFRvIGluc3RhbGwgdGhpcyBwcm9ncmFtIGF0IGEgbGF0ZXIgdGltZSwgcGxlYXNlIHJ1biB0aGUgaW5zdGFsbGF0aW9uIGFnYWluLicsIE5vbmUsIE5vbmUpLAotKHUnRmF0YWxFcnJvcicsIHUnRGVzY3JpcHRpb24yJywgdSdUZXh0JywgMTM1LCAxMTUsIDIyMCwgMjAsIDE5NjYxMSwgTm9uZSwgdSdDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBbV2l6YXJkXS4nLCBOb25lLCBOb25lKSwKLSh1J1ByZXBhcmVEbGcnLCB1J0JpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzcwLCAyMzQsIDEsIE5vbmUsIHUnW0RpYWxvZ0JpdG1hcF0nLCB1J0NhbmNlbCcsIE5vbmUpLAotKHUnUHJlcGFyZURsZycsIHUnQm90dG9tTGluZScsIHUnTGluZScsIDAsIDIzNCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J1ByZXBhcmVEbGcnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQml0bWFwJywgTm9uZSksCi0odSdQcmVwYXJlRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDEzNSwgNzAsIDIyMCwgMjAsIDE5NjYxMSwgTm9uZSwgdSdQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgW1dpemFyZF0gcHJlcGFyZXMgdG8gZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluc3RhbGxhdGlvbi4nLCBOb25lLCBOb25lKSwKLSh1J1ByZXBhcmVEbGcnLCB1J1RpdGxlJywgdSdUZXh0JywgMTM1LCAyMCwgMjIwLCA2MCwgMTk2NjExLCBOb25lLCB1J3tcXFZlcmRhbmFCb2xkMTN9V2VsY29tZSB0byB0aGUgW1Byb2R1Y3ROYW1lXSBbV2l6YXJkXScsIE5vbmUsIE5vbmUpLAotKHUnUHJlcGFyZURsZycsIHUnQmFjaycsIHUnUHVzaEJ1dHRvbicsIDE4MCwgMjQzLCA1NiwgMTcsIDEsIE5vbmUsIHUnW0J1dHRvblRleHRfQmFja10nLCBOb25lLCBOb25lKSwKLSh1J1ByZXBhcmVEbGcnLCB1J05leHQnLCB1J1B1c2hCdXR0b24nLCAyMzYsIDI0MywgNTYsIDE3LCAxLCBOb25lLCB1J1tCdXR0b25UZXh0X05leHRdJywgTm9uZSwgTm9uZSksCi0odSdQcmVwYXJlRGxnJywgdSdBY3Rpb25EYXRhJywgdSdUZXh0JywgMTM1LCAxMjUsIDIyMCwgMzAsIDE5NjYxMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdQcmVwYXJlRGxnJywgdSdBY3Rpb25UZXh0JywgdSdUZXh0JywgMTM1LCAxMDAsIDIyMCwgMjAsIDE5NjYxMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdQcm9ncmVzc0RsZycsIHUnVGV4dCcsIHUnVGV4dCcsIDM1LCA2NSwgMzAwLCAyMCwgMywgTm9uZSwgdSdQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgW1dpemFyZF0gW1Byb2dyZXNzMl0gW1Byb2R1Y3ROYW1lXS4gIFRoaXMgbWF5IHRha2Ugc2V2ZXJhbCBtaW51dGVzLicsIE5vbmUsIE5vbmUpLAotKHUnUHJvZ3Jlc3NEbGcnLCB1J0Jhbm5lckJpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzc0LCA0NCwgMSwgTm9uZSwgdSdbQmFubmVyQml0bWFwXScsIHUnQmFjaycsIE5vbmUpLAotKHUnUHJvZ3Jlc3NEbGcnLCB1J0Jhbm5lckxpbmUnLCB1J0xpbmUnLCAwLCA0NCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J1Byb2dyZXNzRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnUHJvZ3Jlc3NEbGcnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQmFubmVyQml0bWFwJywgTm9uZSksCi0odSdQcm9ncmVzc0RsZycsIHUnVGl0bGUnLCB1J1RleHQnLCAyMCwgMTUsIDIwMCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdbRGxnVGl0bGVGb250XVtQcm9ncmVzczFdIFtQcm9kdWN0TmFtZV0nLCBOb25lLCBOb25lKSwKLSh1J1Byb2dyZXNzRGxnJywgdSdCYWNrJywgdSdQdXNoQnV0dG9uJywgMTgwLCAyNDMsIDU2LCAxNywgMSwgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnTmV4dCcsIE5vbmUpLAotKHUnUHJvZ3Jlc3NEbGcnLCB1J05leHQnLCB1J1B1c2hCdXR0b24nLCAyMzYsIDI0MywgNTYsIDE3LCAxLCBOb25lLCB1J1tCdXR0b25UZXh0X05leHRdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J1Byb2dyZXNzRGxnJywgdSdBY3Rpb25UZXh0JywgdSdUZXh0JywgNzAsIDEwMCwgMjY1LCAxMCwgMywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdQcm9ncmVzc0RsZycsIHUnUHJvZ3Jlc3NCYXInLCB1J1Byb2dyZXNzQmFyJywgMzUsIDExNSwgMzAwLCAxMCwgNjU1MzcsIE5vbmUsIHUnUHJvZ3Jlc3MgZG9uZScsIE5vbmUsIE5vbmUpLAotKHUnUHJvZ3Jlc3NEbGcnLCB1J1N0YXR1c0xhYmVsJywgdSdUZXh0JywgMzUsIDEwMCwgMzUsIDEwLCAzLCBOb25lLCB1J1N0YXR1czonLCBOb25lLCBOb25lKSwKLSh1J1VzZXJFeGl0JywgdSdCaXRtYXAnLCB1J0JpdG1hcCcsIDAsIDAsIDM3MCwgMjM0LCAxLCBOb25lLCB1J1tEaWFsb2dCaXRtYXBdJywgdSdCYWNrJywgTm9uZSksCi0odSdVc2VyRXhpdCcsIHUnQm90dG9tTGluZScsIHUnTGluZScsIDAsIDIzNCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J1VzZXJFeGl0JywgdSdDYW5jZWwnLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAxLCBOb25lLCB1J1tCdXR0b25UZXh0X0NhbmNlbF0nLCB1J0JpdG1hcCcsIE5vbmUpLAotKHUnVXNlckV4aXQnLCB1J1RpdGxlJywgdSdUZXh0JywgMTM1LCAyMCwgMjIwLCA2MCwgMTk2NjExLCBOb25lLCB1J3tcXFZlcmRhbmFCb2xkMTN9W1Byb2R1Y3ROYW1lXSBbV2l6YXJkXSB3YXMgaW50ZXJydXB0ZWQnLCBOb25lLCBOb25lKSwKLSh1J1VzZXJFeGl0JywgdSdCYWNrJywgdSdQdXNoQnV0dG9uJywgMTgwLCAyNDMsIDU2LCAxNywgMSwgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnRmluaXNoJywgTm9uZSksCi0odSdVc2VyRXhpdCcsIHUnRmluaXNoJywgdSdQdXNoQnV0dG9uJywgMjM2LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9GaW5pc2hdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J1VzZXJFeGl0JywgdSdEZXNjcmlwdGlvbjEnLCB1J1RleHQnLCAxMzUsIDcwLCAyMjAsIDQwLCAxOTY2MTEsIE5vbmUsIHUnW1Byb2R1Y3ROYW1lXSBzZXR1cCB3YXMgaW50ZXJydXB0ZWQuICBZb3VyIHN5c3RlbSBoYXMgbm90IGJlZW4gbW9kaWZpZWQuICBUbyBpbnN0YWxsIHRoaXMgcHJvZ3JhbSBhdCBhIGxhdGVyIHRpbWUsIHBsZWFzZSBydW4gdGhlIGluc3RhbGxhdGlvbiBhZ2Fpbi4nLCBOb25lLCBOb25lKSwKLSh1J1VzZXJFeGl0JywgdSdEZXNjcmlwdGlvbjInLCB1J1RleHQnLCAxMzUsIDExNSwgMjIwLCAyMCwgMTk2NjExLCBOb25lLCB1J0NsaWNrIHRoZSBGaW5pc2ggYnV0dG9uIHRvIGV4aXQgdGhlIFtXaXphcmRdLicsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5Ccm93c2VEbGcnLCB1J1VwJywgdSdQdXNoQnV0dG9uJywgMjk4LCA1NSwgMTksIDE5LCAzNjcwMDE5LCBOb25lLCB1J1VwJywgdSdOZXdGb2xkZXInLCB1J1VwIE9uZSBMZXZlbHwnKSwKLSh1J0FkbWluQnJvd3NlRGxnJywgdSdCYW5uZXJCaXRtYXAnLCB1J0JpdG1hcCcsIDAsIDAsIDM3NCwgNDQsIDEsIE5vbmUsIHUnW0Jhbm5lckJpdG1hcF0nLCB1J1BhdGhFZGl0JywgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnUGF0aEVkaXQnLCB1J1BhdGhFZGl0JywgODQsIDIwMiwgMjYxLCAxNywgMywgdSdUQVJHRVRESVInLCBOb25lLCB1J09LJywgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5Ccm93c2VEbGcnLCB1J0JvdHRvbUxpbmUnLCB1J0xpbmUnLCAwLCAyMzQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnQ2FuY2VsJywgdSdQdXNoQnV0dG9uJywgMjQwLCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgdSdDb21ib0xhYmVsJywgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnQ29tYm9MYWJlbCcsIHUnVGV4dCcsIDI1LCA1OCwgNDQsIDEwLCAzLCBOb25lLCB1JyZMb29rIGluOicsIHUnRGlyZWN0b3J5Q29tYm8nLCBOb25lKSwKLSh1J0FkbWluQnJvd3NlRGxnJywgdSdEaXJlY3RvcnlDb21ibycsIHUnRGlyZWN0b3J5Q29tYm8nLCA3MCwgNTUsIDIyMCwgODAsIDQ1ODc1NSwgdSdUQVJHRVRESVInLCBOb25lLCB1J1VwJywgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyNSwgMjMsIDI4MCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdCcm93c2UgdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlcicsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5Ccm93c2VEbGcnLCB1J0RpcmVjdG9yeUxpc3QnLCB1J0RpcmVjdG9yeUxpc3QnLCAyNSwgODMsIDMyMCwgMTEwLCA3LCB1J1RBUkdFVERJUicsIE5vbmUsIHUnUGF0aExhYmVsJywgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnUGF0aExhYmVsJywgdSdUZXh0JywgMjUsIDIwNSwgNTksIDEwLCAzLCBOb25lLCB1JyZGb2xkZXIgbmFtZTonLCB1J0Jhbm5lckJpdG1hcCcsIE5vbmUpLAotKHUnQWRtaW5Ccm93c2VEbGcnLCB1J05ld0ZvbGRlcicsIHUnUHVzaEJ1dHRvbicsIDMyNSwgNTUsIDE5LCAxOSwgMzY3MDAxOSwgTm9uZSwgdSdOZXcnLCB1J0RpcmVjdG9yeUxpc3QnLCB1J0NyZWF0ZSBBIE5ldyBGb2xkZXJ8JyksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnT0snLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X09LXScsIHUnQ2FuY2VsJywgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnVGl0bGUnLCB1J1RleHQnLCAxNSwgNiwgMjAwLCAxNSwgMTk2NjExLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdQ2hhbmdlIGN1cnJlbnQgZGVzdGluYXRpb24gZm9sZGVyJywgTm9uZSwgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnVGV4dCcsIHUnVGV4dCcsIDI1LCA4MCwgMzIwLCAxMCwgMywgTm9uZSwgdScmRW50ZXIgYSBuZXcgbmV0d29yayBsb2NhdGlvbiBvciBjbGljayBCcm93c2UgdG8gYnJvd3NlIHRvIG9uZS4nLCB1J1BhdGhFZGl0JywgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnQmFubmVyQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzQsIDQ0LCAxLCBOb25lLCB1J1tCYW5uZXJCaXRtYXBdJywgdSdUZXh0JywgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnUGF0aEVkaXQnLCB1J1BhdGhFZGl0JywgMjUsIDkzLCAzMjAsIDE4LCAzLCB1J1RBUkdFVERJUicsIE5vbmUsIHUnQnJvd3NlJywgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5JbnN0YWxsUG9pbnREbGcnLCB1J0JvdHRvbUxpbmUnLCB1J0xpbmUnLCAwLCAyMzQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnQ2FuY2VsJywgdSdQdXNoQnV0dG9uJywgMzA0LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgdSdCYW5uZXJCaXRtYXAnLCBOb25lKSwKLSh1J0FkbWluSW5zdGFsbFBvaW50RGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDI1LCAyMCwgMjgwLCAyMCwgMTk2NjExLCBOb25lLCB1J1BsZWFzZSBzcGVjaWZ5IGEgbmV0d29yayBsb2NhdGlvbiBmb3IgdGhlIHNlcnZlciBpbWFnZSBvZiBbUHJvZHVjdE5hbWVdIHByb2R1Y3QnLCBOb25lLCBOb25lKSwKLSh1J0FkbWluSW5zdGFsbFBvaW50RGxnJywgdSdUaXRsZScsIHUnVGV4dCcsIDE1LCA2LCAyMDAsIDE1LCAxOTY2MTEsIE5vbmUsIHUnW0RsZ1RpdGxlRm9udF1OZXR3b3JrIExvY2F0aW9uJywgTm9uZSwgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnQmFjaycsIHUnUHVzaEJ1dHRvbicsIDE4MCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQmFja10nLCB1J05leHQnLCBOb25lKSwKLSh1J0FkbWluSW5zdGFsbFBvaW50RGxnJywgdSdOZXh0JywgdSdQdXNoQnV0dG9uJywgMjM2LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9OZXh0XScsIHUnQ2FuY2VsJywgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnQnJvd3NlJywgdSdQdXNoQnV0dG9uJywgMjg5LCAxMTksIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9Ccm93c2VdJywgdSdCYWNrJywgTm9uZSksCi0odSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIHUnQmFubmVyQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzQsIDQ0LCAxLCBOb25lLCB1J1tCYW5uZXJCaXRtYXBdJywgdSdPcmdhbml6YXRpb25MYWJlbCcsIE5vbmUpLAotKHUnQWRtaW5SZWdpc3RyYXRpb25EbGcnLCB1J0Jhbm5lckxpbmUnLCB1J0xpbmUnLCAwLCA0NCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J0FkbWluUmVnaXN0cmF0aW9uRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5SZWdpc3RyYXRpb25EbGcnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQmFubmVyQml0bWFwJywgTm9uZSksCi0odSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyNSwgMjMsIDI4MCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdQbGVhc2UgZW50ZXIgeW91ciBjb21wYW55IGluZm9ybWF0aW9uJywgTm9uZSwgTm9uZSksCi0odSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIHUnVGl0bGUnLCB1J1RleHQnLCAxNSwgNiwgMjAwLCAxNSwgMTk2NjExLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdQ29tcGFueSBJbmZvcm1hdGlvbicsIE5vbmUsIE5vbmUpLAotKHUnQWRtaW5SZWdpc3RyYXRpb25EbGcnLCB1J0JhY2snLCB1J1B1c2hCdXR0b24nLCAxODAsIDI0MywgNTYsIDE3LCA2NTUzOSwgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnTmV4dCcsIE5vbmUpLAotKHUnQWRtaW5SZWdpc3RyYXRpb25EbGcnLCB1J05leHQnLCB1J1B1c2hCdXR0b24nLCAyMzYsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X05leHRdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J0FkbWluUmVnaXN0cmF0aW9uRGxnJywgdSdPcmdhbml6YXRpb25MYWJlbCcsIHUnVGV4dCcsIDQ1LCA3MSwgMjg1LCAzMCwgMywgTm9uZSwgdScmUGxlYXNlIGVudGVyIHRoZSBuYW1lIG9mIHlvdXIgb3JnYW5pemF0aW9uIGluIHRoZSBib3ggYmVsb3cuICBUaGlzIHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0IGNvbXBhbnkgbmFtZSBmb3Igc3Vic2VxdWVudCBpbnN0YWxsYXRpb25zIG9mIFtQcm9kdWN0TmFtZV06JywgdSdPcmdhbml6YXRpb25FZGl0JywgTm9uZSksCi0odSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIHUnQ0RLZXlFZGl0JywgdSdNYXNrZWRFZGl0JywgNDUsIDE0MywgMjUwLCAxNiwgMywgdSdQSURLRVknLCB1J1tQSURUZW1wbGF0ZV0nLCB1J0JhY2snLCBOb25lKSwKLSh1J0FkbWluUmVnaXN0cmF0aW9uRGxnJywgdSdDREtleUxhYmVsJywgdSdUZXh0JywgNDUsIDEzMCwgNTAsIDEwLCAzLCBOb25lLCB1J0NEICZLZXk6JywgdSdDREtleUVkaXQnLCBOb25lKSwKLSh1J0FkbWluUmVnaXN0cmF0aW9uRGxnJywgdSdPcmdhbml6YXRpb25FZGl0JywgdSdFZGl0JywgNDUsIDEwNSwgMjIwLCAxOCwgMywgdSdDT01QQU5ZTkFNRScsIHUnezgwfScsIHUnQ0RLZXlMYWJlbCcsIE5vbmUpLAotKHUnQnJvd3NlRGxnJywgdSdVcCcsIHUnUHVzaEJ1dHRvbicsIDI5OCwgNTUsIDE5LCAxOSwgMzY3MDAxOSwgTm9uZSwgdSdVcCcsIHUnTmV3Rm9sZGVyJywgdSdVcCBPbmUgTGV2ZWx8JyksCi0odSdCcm93c2VEbGcnLCB1J0Jhbm5lckJpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzc0LCA0NCwgMSwgTm9uZSwgdSdbQmFubmVyQml0bWFwXScsIHUnUGF0aEVkaXQnLCBOb25lKSwKLSh1J0Jyb3dzZURsZycsIHUnUGF0aEVkaXQnLCB1J1BhdGhFZGl0JywgODQsIDIwMiwgMjYxLCAxOCwgMTEsIHUnX0Jyb3dzZVByb3BlcnR5JywgTm9uZSwgdSdPSycsIE5vbmUpLAotKHUnQnJvd3NlRGxnJywgdSdCYW5uZXJMaW5lJywgdSdMaW5lJywgMCwgNDQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdCcm93c2VEbGcnLCB1J0JvdHRvbUxpbmUnLCB1J0xpbmUnLCAwLCAyMzQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdCcm93c2VEbGcnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDI0MCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQ29tYm9MYWJlbCcsIE5vbmUpLAotKHUnQnJvd3NlRGxnJywgdSdDb21ib0xhYmVsJywgdSdUZXh0JywgMjUsIDU4LCA0NCwgMTAsIDMsIE5vbmUsIHUnJkxvb2sgaW46JywgdSdEaXJlY3RvcnlDb21ibycsIE5vbmUpLAotKHUnQnJvd3NlRGxnJywgdSdEaXJlY3RvcnlDb21ibycsIHUnRGlyZWN0b3J5Q29tYm8nLCA3MCwgNTUsIDIyMCwgODAsIDM5MzIyNywgdSdfQnJvd3NlUHJvcGVydHknLCBOb25lLCB1J1VwJywgTm9uZSksCi0odSdCcm93c2VEbGcnLCB1J0Rlc2NyaXB0aW9uJywgdSdUZXh0JywgMjUsIDIzLCAyODAsIDE1LCAxOTY2MTEsIE5vbmUsIHUnQnJvd3NlIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXInLCBOb25lLCBOb25lKSwKLSh1J0Jyb3dzZURsZycsIHUnRGlyZWN0b3J5TGlzdCcsIHUnRGlyZWN0b3J5TGlzdCcsIDI1LCA4MywgMzIwLCAxMTAsIDE1LCB1J19Ccm93c2VQcm9wZXJ0eScsIE5vbmUsIHUnUGF0aExhYmVsJywgTm9uZSksCi0odSdCcm93c2VEbGcnLCB1J1BhdGhMYWJlbCcsIHUnVGV4dCcsIDI1LCAyMDUsIDU5LCAxMCwgMywgTm9uZSwgdScmRm9sZGVyIG5hbWU6JywgdSdCYW5uZXJCaXRtYXAnLCBOb25lKSwKLSh1J0Jyb3dzZURsZycsIHUnTmV3Rm9sZGVyJywgdSdQdXNoQnV0dG9uJywgMzI1LCA1NSwgMTksIDE5LCAzNjcwMDE5LCBOb25lLCB1J05ldycsIHUnRGlyZWN0b3J5TGlzdCcsIHUnQ3JlYXRlIEEgTmV3IEZvbGRlcnwnKSwKLSh1J0Jyb3dzZURsZycsIHUnT0snLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X09LXScsIHUnQ2FuY2VsJywgTm9uZSksCi0odSdCcm93c2VEbGcnLCB1J1RpdGxlJywgdSdUZXh0JywgMTUsIDYsIDIwMCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdbRGxnVGl0bGVGb250XUNoYW5nZSBjdXJyZW50IGRlc3RpbmF0aW9uIGZvbGRlcicsIE5vbmUsIE5vbmUpLAotKHUnQ2FuY2VsRGxnJywgdSdUZXh0JywgdSdUZXh0JywgNDgsIDE1LCAxOTQsIDMwLCAzLCBOb25lLCB1J0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWwgW1Byb2R1Y3ROYW1lXSBpbnN0YWxsYXRpb24/JywgTm9uZSwgTm9uZSksCi0odSdDYW5jZWxEbGcnLCB1J0ljb24nLCB1J0ljb24nLCAxNSwgMTUsIDI0LCAyNCwgNTI0Mjg4MSwgTm9uZSwgdSdbSW5mb0ljb25dJywgTm9uZSwgdSdJbmZvcm1hdGlvbiBpY29ufCcpLAotKHUnQ2FuY2VsRGxnJywgdSdObycsIHUnUHVzaEJ1dHRvbicsIDEzMiwgNTcsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9Ob10nLCB1J1llcycsIE5vbmUpLAotKHUnQ2FuY2VsRGxnJywgdSdZZXMnLCB1J1B1c2hCdXR0b24nLCA3MiwgNTcsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9ZZXNdJywgdSdObycsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdUZXh0JywgdSdUZXh0JywgMjUsIDU1LCAzMjAsIDIwLCAzLCBOb25lLCB1J0NsaWNrIG9uIHRoZSBpY29ucyBpbiB0aGUgdHJlZSBiZWxvdyB0byBjaGFuZ2UgdGhlIHdheSBmZWF0dXJlcyB3aWxsIGJlIGluc3RhbGxlZC4nLCBOb25lLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnQmFubmVyQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzQsIDQ0LCAxLCBOb25lLCB1J1tCYW5uZXJCaXRtYXBdJywgdSdUcmVlJywgTm9uZSksCi0odSdDdXN0b21pemVEbGcnLCB1J0Jhbm5lckxpbmUnLCB1J0xpbmUnLCAwLCA0NCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnQm90dG9tTGluZScsIHUnTGluZScsIDAsIDIzNCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnQ2FuY2VsJywgdSdQdXNoQnV0dG9uJywgMzA0LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgdSdCYW5uZXJCaXRtYXAnLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyNSwgMjMsIDI4MCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdTZWxlY3QgdGhlIHdheSB5b3Ugd2FudCBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQuJywgTm9uZSwgTm9uZSksCi0odSdDdXN0b21pemVEbGcnLCB1J1RpdGxlJywgdSdUZXh0JywgMTUsIDYsIDIwMCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdbRGxnVGl0bGVGb250XUN1c3RvbSBTZXR1cCcsIE5vbmUsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdCYWNrJywgdSdQdXNoQnV0dG9uJywgMTgwLCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnTmV4dCcsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdOZXh0JywgdSdQdXNoQnV0dG9uJywgMjM2LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9OZXh0XScsIHUnQ2FuY2VsJywgTm9uZSksCi0odSdDdXN0b21pemVEbGcnLCB1J0Jyb3dzZScsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjAwLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQnJvd3NlXScsIHUnUmVzZXQnLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnVHJlZScsIHUnU2VsZWN0aW9uVHJlZScsIDI1LCA4NSwgMTc1LCA5NSwgNywgdSdfQnJvd3NlUHJvcGVydHknLCB1J1RyZWUgb2Ygc2VsZWN0aW9ucycsIHUnQnJvd3NlJywgTm9uZSksCi0odSdDdXN0b21pemVEbGcnLCB1J0JveCcsIHUnR3JvdXBCb3gnLCAyMTAsIDgxLCAxNDAsIDk4LCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnUmVzZXQnLCB1J1B1c2hCdXR0b24nLCA0MiwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfUmVzZXRdJywgdSdEaXNrQ29zdCcsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdEaXNrQ29zdCcsIHUnUHVzaEJ1dHRvbicsIDExMSwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnRGlzayAmVXNhZ2UnLCB1J0JhY2snLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnSXRlbURlc2NyaXB0aW9uJywgdSdUZXh0JywgMjE1LCA5MCwgMTMxLCAzMCwgMywgTm9uZSwgdSdNdWx0aWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLicsIE5vbmUsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdJdGVtU2l6ZScsIHUnVGV4dCcsIDIxNSwgMTMwLCAxMzEsIDQ1LCAzLCBOb25lLCB1J1RoZSBzaXplIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS4nLCBOb25lLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnTG9jYXRpb24nLCB1J1RleHQnLCA3NSwgMjAwLCAyMTUsIDIwLCAzLCBOb25lLCB1IjxUaGUgc2VsZWN0aW9uJ3MgcGF0aD4iLCBOb25lLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnTG9jYXRpb25MYWJlbCcsIHUnVGV4dCcsIDI1LCAyMDAsIDUwLCAxMCwgMywgTm9uZSwgdSdMb2NhdGlvbjonLCBOb25lLCBOb25lKSwKLSh1J0Rpc2tDb3N0RGxnJywgdSdUZXh0JywgdSdUZXh0JywgMjAsIDUzLCAzMzAsIDQwLCAzLCBOb25lLCB1J1RoZSBoaWdobGlnaHRlZCB2b2x1bWVzIChpZiBhbnkpIGRvIG5vdCBoYXZlIGVub3VnaCBkaXNrIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlcy4gIFlvdSBjYW4gZWl0aGVyIHJlbW92ZSBzb21lIGZpbGVzIGZyb20gdGhlIGhpZ2hsaWdodGVkIHZvbHVtZXMsIG9yIGNob29zZSB0byBpbnN0YWxsIGxlc3MgZmVhdHVyZXMgb250byBsb2NhbCBkcml2ZShzKSwgb3Igc2VsZWN0IGRpZmZlcmVudCBkZXN0aW5hdGlvbiBkcml2ZShzKS4nLCBOb25lLCBOb25lKSwKLSh1J0Rpc2tDb3N0RGxnJywgdSdCYW5uZXJCaXRtYXAnLCB1J0JpdG1hcCcsIDAsIDAsIDM3NCwgNDQsIDEsIE5vbmUsIHUnW0Jhbm5lckJpdG1hcF0nLCB1J09LJywgTm9uZSksCi0odSdEaXNrQ29zdERsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnRGlza0Nvc3REbGcnLCB1J0JvdHRvbUxpbmUnLCB1J0xpbmUnLCAwLCAyMzQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdEaXNrQ29zdERsZycsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyMCwgMjAsIDI4MCwgMjAsIDE5NjYxMSwgTm9uZSwgdSdUaGUgZGlzayBzcGFjZSByZXF1aXJlZCBmb3IgdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgc2VsZWN0ZWQgZmVhdHVyZXMuJywgTm9uZSwgTm9uZSksCi0odSdEaXNrQ29zdERsZycsIHUnT0snLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X09LXScsIHUnQmFubmVyQml0bWFwJywgTm9uZSksCi0odSdEaXNrQ29zdERsZycsIHUnVGl0bGUnLCB1J1RleHQnLCAxNSwgNiwgMjAwLCAxNSwgMTk2NjExLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdRGlzayBTcGFjZSBSZXF1aXJlbWVudHMnLCBOb25lLCBOb25lKSwKLSh1J0Rpc2tDb3N0RGxnJywgdSdWb2x1bWVMaXN0JywgdSdWb2x1bWVDb3N0TGlzdCcsIDIwLCAxMDAsIDMzMCwgMTIwLCAzOTMyMjMsIE5vbmUsIHUnezEyMH17NzB9ezcwfXs3MH17NzB9JywgTm9uZSwgTm9uZSksCi0odSdFcnJvckRsZycsIHUnWScsIHUnUHVzaEJ1dHRvbicsIDEwMCwgODAsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9ZZXNdJywgTm9uZSwgTm9uZSksCi0odSdFcnJvckRsZycsIHUnQScsIHUnUHVzaEJ1dHRvbicsIDEwMCwgODAsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgTm9uZSwgTm9uZSksCi0odSdFcnJvckRsZycsIHUnQycsIHUnUHVzaEJ1dHRvbicsIDEwMCwgODAsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgTm9uZSwgTm9uZSksCi0odSdFcnJvckRsZycsIHUnRXJyb3JJY29uJywgdSdJY29uJywgMTUsIDE1LCAyNCwgMjQsIDUyNDI4ODEsIE5vbmUsIHUnW0luZm9JY29uXScsIE5vbmUsIHUnSW5mb3JtYXRpb24gaWNvbnwnKSwKLSh1J0Vycm9yRGxnJywgdSdFcnJvclRleHQnLCB1J1RleHQnLCA0OCwgMTUsIDIwNSwgNjAsIDMsIE5vbmUsIHUnSW5mb3JtYXRpb24gdGV4dCcsIE5vbmUsIE5vbmUpLAotKHUnRXJyb3JEbGcnLCB1J0knLCB1J1B1c2hCdXR0b24nLCAxMDAsIDgwLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfSWdub3JlXScsIE5vbmUsIE5vbmUpLAotKHUnRXJyb3JEbGcnLCB1J04nLCB1J1B1c2hCdXR0b24nLCAxMDAsIDgwLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfTm9dJywgTm9uZSwgTm9uZSksCi0odSdFcnJvckRsZycsIHUnTycsIHUnUHVzaEJ1dHRvbicsIDEwMCwgODAsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9PS10nLCBOb25lLCBOb25lKSwKLSh1J0Vycm9yRGxnJywgdSdSJywgdSdQdXNoQnV0dG9uJywgMTAwLCA4MCwgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X1JldHJ5XScsIE5vbmUsIE5vbmUpLAotKHUnRmlsZXNJblVzZScsIHUnVGV4dCcsIHUnVGV4dCcsIDIwLCA1NSwgMzMwLCAzMCwgMywgTm9uZSwgdSdUaGUgZm9sbG93aW5nIGFwcGxpY2F0aW9ucyBhcmUgdXNpbmcgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBzZXR1cC4gQ2xvc2UgdGhlc2UgYXBwbGljYXRpb25zIGFuZCB0aGVuIGNsaWNrIFJldHJ5IHRvIGNvbnRpbnVlIHRoZSBpbnN0YWxsYXRpb24gb3IgQ2FuY2VsIHRvIGV4aXQgaXQuJywgTm9uZSwgTm9uZSksCi0odSdGaWxlc0luVXNlJywgdSdCYW5uZXJCaXRtYXAnLCB1J0JpdG1hcCcsIDAsIDAsIDM3NCwgNDQsIDEsIE5vbmUsIHUnW0Jhbm5lckJpdG1hcF0nLCB1J1JldHJ5JywgTm9uZSksCi0odSdGaWxlc0luVXNlJywgdSdCYW5uZXJMaW5lJywgdSdMaW5lJywgMCwgNDQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdGaWxlc0luVXNlJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnRmlsZXNJblVzZScsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyMCwgMjMsIDI4MCwgMjAsIDE5NjYxMSwgTm9uZSwgdSdTb21lIGZpbGVzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGFyZSBjdXJyZW50bHkgaW4gdXNlLicsIE5vbmUsIE5vbmUpLAotKHUnRmlsZXNJblVzZScsIHUnVGl0bGUnLCB1J1RleHQnLCAxNSwgNiwgMjAwLCAxNSwgMTk2NjExLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdRmlsZXMgaW4gVXNlJywgTm9uZSwgTm9uZSksCi0odSdGaWxlc0luVXNlJywgdSdSZXRyeScsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfUmV0cnldJywgdSdJZ25vcmUnLCBOb25lKSwKLSh1J0ZpbGVzSW5Vc2UnLCB1J0V4aXQnLCB1J1B1c2hCdXR0b24nLCAxNjYsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0V4aXRdJywgdSdCYW5uZXJCaXRtYXAnLCBOb25lKSwKLSh1J0ZpbGVzSW5Vc2UnLCB1J0lnbm9yZScsIHUnUHVzaEJ1dHRvbicsIDIzNSwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfSWdub3JlXScsIHUnRXhpdCcsIE5vbmUpLAotKHUnRmlsZXNJblVzZScsIHUnTGlzdCcsIHUnTGlzdEJveCcsIDIwLCA4NywgMzMwLCAxMzAsIDcsIHUnRmlsZUluVXNlUHJvY2VzcycsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnQmFubmVyQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzQsIDQ0LCAxLCBOb25lLCB1J1tCYW5uZXJCaXRtYXBdJywgdSdBZ3JlZW1lbnRUZXh0JywgTm9uZSksCi0odSdMaWNlbnNlQWdyZWVtZW50RGxnJywgdSdCYW5uZXJMaW5lJywgdSdMaW5lJywgMCwgNDQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdMaWNlbnNlQWdyZWVtZW50RGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnQ2FuY2VsJywgdSdQdXNoQnV0dG9uJywgMzA0LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgdSdCYW5uZXJCaXRtYXAnLCBOb25lKSwKLSh1J0xpY2Vuc2VBZ3JlZW1lbnREbGcnLCB1J0Rlc2NyaXB0aW9uJywgdSdUZXh0JywgMjUsIDIzLCAyODAsIDE1LCAxOTY2MTEsIE5vbmUsIHUnUGxlYXNlIHJlYWQgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFncmVlbWVudCBjYXJlZnVsbHknLCBOb25lLCBOb25lKSwKLSh1J0xpY2Vuc2VBZ3JlZW1lbnREbGcnLCB1J1RpdGxlJywgdSdUZXh0JywgMTUsIDYsIDIwMCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdbRGxnVGl0bGVGb250XUVuZC1Vc2VyIExpY2Vuc2UgQWdyZWVtZW50JywgTm9uZSwgTm9uZSksCi0odSdMaWNlbnNlQWdyZWVtZW50RGxnJywgdSdCYWNrJywgdSdQdXNoQnV0dG9uJywgMTgwLCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnTmV4dCcsIE5vbmUpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnTmV4dCcsIHUnUHVzaEJ1dHRvbicsIDIzNiwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfTmV4dF0nLCB1J0NhbmNlbCcsIE5vbmUpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnQWdyZWVtZW50VGV4dCcsIHUnU2Nyb2xsYWJsZVRleHQnLCAyMCwgNjAsIDMzMCwgMTIwLCA3LCBOb25lLCB1J3tcXHJ0ZjFcXGFuc2lcXGFuc2ljcGcxMjUyXFxkZWZmMFxcZGVmdGFiNzIwe1xcZm9udHRibHtcXGYwXFxmcm9tYW5cXGZwcnEyIFRpbWVzIE5ldyBSb21hbjt9fXtcXGNvbG9ydGJsXFxyZWQwXFxncmVlbjBcXGJsdWUwO30gXFxkZWZsYW5nMTAzM1xcaG9yemRvY3tcXCpcXGZjaGFycyB9e1xcKlxcbGNoYXJzIH1cXHBhcmRcXHBsYWluXFxmMFxcZnMyMCA8WW91ciBsaWNlbnNlIGFncmVlbWVudCBzaG91bGQgZ28gaGVyZS4+XFxwYXIgfScsIHUnQnV0dG9ucycsIE5vbmUpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnQnV0dG9ucycsIHUnUmFkaW9CdXR0b25Hcm91cCcsIDIwLCAxODcsIDMzMCwgNDAsIDMsIHUnSUFncmVlJywgTm9uZSwgdSdCYWNrJywgTm9uZSksCi0odSdNYWludGVuYW5jZVR5cGVEbGcnLCB1J0Jhbm5lckJpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzc0LCA0NCwgMSwgTm9uZSwgdSdbQmFubmVyQml0bWFwXScsIHUnQ2hhbmdlTGFiZWwnLCBOb25lKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdDYW5jZWwnLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0NhbmNlbF0nLCB1J0Jhbm5lckJpdG1hcCcsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDI1LCAyMywgMjgwLCAyMCwgMTk2NjExLCBOb25lLCB1J1NlbGVjdCB0aGUgb3BlcmF0aW9uIHlvdSB3aXNoIHRvIHBlcmZvcm0uJywgTm9uZSwgTm9uZSksCi0odSdNYWludGVuYW5jZVR5cGVEbGcnLCB1J1RpdGxlJywgdSdUZXh0JywgMTUsIDYsIDI0MCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdbRGxnVGl0bGVGb250XU1vZGlmeSwgUmVwYWlyIG9yIFJlbW92ZSBpbnN0YWxsYXRpb24nLCBOb25lLCBOb25lKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnQmFjaycsIHUnUHVzaEJ1dHRvbicsIDE4MCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQmFja10nLCB1J05leHQnLCBOb25lKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnTmV4dCcsIHUnUHVzaEJ1dHRvbicsIDIzNiwgMjQzLCA1NiwgMTcsIDEsIE5vbmUsIHUnW0J1dHRvblRleHRfTmV4dF0nLCB1J0NhbmNlbCcsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdDaGFuZ2VMYWJlbCcsIHUnVGV4dCcsIDEwNSwgNjUsIDEwMCwgMTAsIDMsIE5vbmUsIHUnW0RsZ1RpdGxlRm9udF0mTW9kaWZ5JywgdSdDaGFuZ2VCdXR0b24nLCBOb25lKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnQ2hhbmdlQnV0dG9uJywgdSdQdXNoQnV0dG9uJywgNTAsIDY1LCAzOCwgMzgsIDU3NjcxNzEsIE5vbmUsIHUnW0N1c3RvbVNldHVwSWNvbl0nLCB1J1JlcGFpckxhYmVsJywgdSdNb2RpZnkgSW5zdGFsbGF0aW9ufCcpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdSZXBhaXJMYWJlbCcsIHUnVGV4dCcsIDEwNSwgMTE0LCAxMDAsIDEwLCAzLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdUmUmcGFpcicsIHUnUmVwYWlyQnV0dG9uJywgTm9uZSksCi0odSdNYWludGVuYW5jZVR5cGVEbGcnLCB1J0NoYW5nZVRleHQnLCB1J1RleHQnLCAxMDUsIDc4LCAyMzAsIDIwLCAzLCBOb25lLCB1J0FsbG93cyB1c2VycyB0byBjaGFuZ2UgdGhlIHdheSBmZWF0dXJlcyBhcmUgaW5zdGFsbGVkLicsIE5vbmUsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdSZW1vdmVCdXR0b24nLCB1J1B1c2hCdXR0b24nLCA1MCwgMTYzLCAzOCwgMzgsIDU3NjcxNzEsIE5vbmUsIHUnW1JlbW92ZUljb25dJywgdSdCYWNrJywgdSdSZW1vdmUgSW5zdGFsbGF0aW9ufCcpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdSZW1vdmVMYWJlbCcsIHUnVGV4dCcsIDEwNSwgMTYzLCAxMDAsIDEwLCAzLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdJlJlbW92ZScsIHUnUmVtb3ZlQnV0dG9uJywgTm9uZSksCi0odSdNYWludGVuYW5jZVR5cGVEbGcnLCB1J1JlbW92ZVRleHQnLCB1J1RleHQnLCAxMDUsIDE3NiwgMjMwLCAyMCwgMywgTm9uZSwgdSdSZW1vdmVzIFtQcm9kdWN0TmFtZV0gZnJvbSB5b3VyIGNvbXB1dGVyLicsIE5vbmUsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdSZXBhaXJCdXR0b24nLCB1J1B1c2hCdXR0b24nLCA1MCwgMTE0LCAzOCwgMzgsIDU3NjcxNzEsIE5vbmUsIHUnW1JlcGFpckljb25dJywgdSdSZW1vdmVMYWJlbCcsIHUnUmVwYWlyIEluc3RhbGxhdGlvbnwnKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnUmVwYWlyVGV4dCcsIHUnVGV4dCcsIDEwNSwgMTI3LCAyMzAsIDMwLCAzLCBOb25lLCB1J1JlcGFpcnMgZXJyb3JzIGluIHRoZSBtb3N0IHJlY2VudCBpbnN0YWxsYXRpb24gc3RhdGUgLSBmaXhlcyBtaXNzaW5nIG9yIGNvcnJ1cHQgZmlsZXMsIHNob3J0Y3V0cyBhbmQgcmVnaXN0cnkgZW50cmllcy4nLCBOb25lLCBOb25lKSwKLSh1J01haW50ZW5hbmNlV2VsY29tZURsZycsIHUnQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzAsIDIzNCwgMSwgTm9uZSwgdSdbRGlhbG9nQml0bWFwXScsIHUnQmFjaycsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VXZWxjb21lRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VXZWxjb21lRGxnJywgdSdDYW5jZWwnLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0NhbmNlbF0nLCB1J0JpdG1hcCcsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VXZWxjb21lRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDEzNSwgNzAsIDIyMCwgNjAsIDE5NjYxMSwgTm9uZSwgdSdUaGUgW1dpemFyZF0gd2lsbCBhbGxvdyB5b3UgdG8gY2hhbmdlIHRoZSB3YXkgW1Byb2R1Y3ROYW1lXSBmZWF0dXJlcyBhcmUgaW5zdGFsbGVkIG9uIHlvdXIgY29tcHV0ZXIgb3IgZXZlbiB0byByZW1vdmUgW1Byb2R1Y3ROYW1lXSBmcm9tIHlvdXIgY29tcHV0ZXIuICBDbGljayBOZXh0IHRvIGNvbnRpbnVlIG9yIENhbmNlbCB0byBleGl0IHRoZSBbV2l6YXJkXS4nLCBOb25lLCBOb25lKSwKLSh1J01haW50ZW5hbmNlV2VsY29tZURsZycsIHUnVGl0bGUnLCB1J1RleHQnLCAxMzUsIDIwLCAyMjAsIDYwLCAxOTY2MTEsIE5vbmUsIHUne1xcVmVyZGFuYUJvbGQxM31XZWxjb21lIHRvIHRoZSBbUHJvZHVjdE5hbWVdIFtXaXphcmRdJywgTm9uZSwgTm9uZSksCi0odSdNYWludGVuYW5jZVdlbGNvbWVEbGcnLCB1J0JhY2snLCB1J1B1c2hCdXR0b24nLCAxODAsIDI0MywgNTYsIDE3LCAxLCBOb25lLCB1J1tCdXR0b25UZXh0X0JhY2tdJywgdSdOZXh0JywgTm9uZSksCi0odSdNYWludGVuYW5jZVdlbGNvbWVEbGcnLCB1J05leHQnLCB1J1B1c2hCdXR0b24nLCAyMzYsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X05leHRdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J091dE9mRGlza0RsZycsIHUnVGV4dCcsIHUnVGV4dCcsIDIwLCA1MywgMzMwLCA0MCwgMywgTm9uZSwgdSdUaGUgaGlnaGxpZ2h0ZWQgdm9sdW1lcyBkbyBub3QgaGF2ZSBlbm91Z2ggZGlzayBzcGFjZSBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZmVhdHVyZXMuICBZb3UgY2FuIGVpdGhlciByZW1vdmUgc29tZSBmaWxlcyBmcm9tIHRoZSBoaWdobGlnaHRlZCB2b2x1bWVzLCBvciBjaG9vc2UgdG8gaW5zdGFsbCBsZXNzIGZlYXR1cmVzIG9udG8gbG9jYWwgZHJpdmUocyksIG9yIHNlbGVjdCBkaWZmZXJlbnQgZGVzdGluYXRpb24gZHJpdmUocykuJywgTm9uZSwgTm9uZSksCi0odSdPdXRPZkRpc2tEbGcnLCB1J0Jhbm5lckJpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzc0LCA0NCwgMSwgTm9uZSwgdSdbQmFubmVyQml0bWFwXScsIHUnT0snLCBOb25lKSwKLSh1J091dE9mRGlza0RsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnT3V0T2ZEaXNrRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnT3V0T2ZEaXNrRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDIwLCAyMCwgMjgwLCAyMCwgMTk2NjExLCBOb25lLCB1J0Rpc2sgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBpbnN0YWxsYXRpb24gZXhjZWVkcyBhdmFpbGFibGUgZGlzayBzcGFjZS4nLCBOb25lLCBOb25lKSwKLSh1J091dE9mRGlza0RsZycsIHUnT0snLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X09LXScsIHUnQmFubmVyQml0bWFwJywgTm9uZSksCi0odSdPdXRPZkRpc2tEbGcnLCB1J1RpdGxlJywgdSdUZXh0JywgMTUsIDYsIDIwMCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdbRGxnVGl0bGVGb250XU91dCBvZiBEaXNrIFNwYWNlJywgTm9uZSwgTm9uZSksCi0odSdPdXRPZkRpc2tEbGcnLCB1J1ZvbHVtZUxpc3QnLCB1J1ZvbHVtZUNvc3RMaXN0JywgMjAsIDEwMCwgMzMwLCAxMjAsIDM5MzIyMywgTm9uZSwgdSd7MTIwfXs3MH17NzB9ezcwfXs3MH0nLCBOb25lLCBOb25lKSwKLSh1J091dE9mUmJEaXNrRGxnJywgdSdUZXh0JywgdSdUZXh0JywgMjAsIDUzLCAzMzAsIDQwLCAzLCBOb25lLCB1J1RoZSBoaWdobGlnaHRlZCB2b2x1bWVzIGRvIG5vdCBoYXZlIGVub3VnaCBkaXNrIHNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlcy4gIFlvdSBjYW4gZWl0aGVyIHJlbW92ZSBzb21lIGZpbGVzIGZyb20gdGhlIGhpZ2hsaWdodGVkIHZvbHVtZXMsIG9yIGNob29zZSB0byBpbnN0YWxsIGxlc3MgZmVhdHVyZXMgb250byBsb2NhbCBkcml2ZShzKSwgb3Igc2VsZWN0IGRpZmZlcmVudCBkZXN0aW5hdGlvbiBkcml2ZShzKS4nLCBOb25lLCBOb25lKSwKLSh1J091dE9mUmJEaXNrRGxnJywgdSdCYW5uZXJCaXRtYXAnLCB1J0JpdG1hcCcsIDAsIDAsIDM3NCwgNDQsIDEsIE5vbmUsIHUnW0Jhbm5lckJpdG1hcF0nLCB1J05vJywgTm9uZSksCi0odSdPdXRPZlJiRGlza0RsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnT3V0T2ZSYkRpc2tEbGcnLCB1J0JvdHRvbUxpbmUnLCB1J0xpbmUnLCAwLCAyMzQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdPdXRPZlJiRGlza0RsZycsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyMCwgMjAsIDI4MCwgMjAsIDE5NjYxMSwgTm9uZSwgdSdEaXNrIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgaW5zdGFsbGF0aW9uIGV4Y2VlZHMgYXZhaWxhYmxlIGRpc2sgc3BhY2UuJywgTm9uZSwgTm9uZSksCi0odSdPdXRPZlJiRGlza0RsZycsIHUnVGl0bGUnLCB1J1RleHQnLCAxNSwgNiwgMjAwLCAxNSwgMTk2NjExLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdT3V0IG9mIERpc2sgU3BhY2UnLCBOb25lLCBOb25lKSwKLSh1J091dE9mUmJEaXNrRGxnJywgdSdObycsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfTm9dJywgdSdZZXMnLCBOb25lKSwKLSh1J091dE9mUmJEaXNrRGxnJywgdSdZZXMnLCB1J1B1c2hCdXR0b24nLCAyNDAsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X1llc10nLCB1J0Jhbm5lckJpdG1hcCcsIE5vbmUpLAotKHUnT3V0T2ZSYkRpc2tEbGcnLCB1J1ZvbHVtZUxpc3QnLCB1J1ZvbHVtZUNvc3RMaXN0JywgMjAsIDE0MCwgMzMwLCA4MCwgNDU4NzUyNywgTm9uZSwgdSd7MTIwfXs3MH17NzB9ezcwfXs3MH0nLCBOb25lLCBOb25lKSwKLSh1J091dE9mUmJEaXNrRGxnJywgdSdUZXh0MicsIHUnVGV4dCcsIDIwLCA5NCwgMzMwLCA0MCwgMywgTm9uZSwgdSJBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGNob29zZSB0byBkaXNhYmxlIHRoZSBpbnN0YWxsZXIncyByb2xsYmFjayBmdW5jdGlvbmFsaXR5LiAgVGhpcyBhbGxvd3MgdGhlIGluc3RhbGxlciB0byByZXN0b3JlIHlvdXIgY29tcHV0ZXIncyBvcmlnaW5hbCBzdGF0ZSBzaG91bGQgdGhlIGluc3RhbGxhdGlvbiBiZSBpbnRlcnJ1cHRlZCBpbiBhbnkgd2F5LiAgQ2xpY2sgWWVzIGlmIHlvdSB3aXNoIHRvIHRha2UgdGhlIHJpc2sgdG8gZGlzYWJsZSByb2xsYmFjay4iLCBOb25lLCBOb25lKSwKLSh1J1Jlc3VtZURsZycsIHUnQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzAsIDIzNCwgMSwgTm9uZSwgdSdbRGlhbG9nQml0bWFwXScsIHUnQmFjaycsIE5vbmUpLAotKHUnUmVzdW1lRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnUmVzdW1lRGxnJywgdSdDYW5jZWwnLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0NhbmNlbF0nLCB1J0JpdG1hcCcsIE5vbmUpLAotKHUnUmVzdW1lRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDEzNSwgNzAsIDIyMCwgMzAsIDE5NjYxMSwgTm9uZSwgdSdUaGUgW1dpemFyZF0gd2lsbCBjb21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIFtQcm9kdWN0TmFtZV0gb24geW91ciBjb21wdXRlci4gIENsaWNrIEluc3RhbGwgdG8gY29udGludWUgb3IgQ2FuY2VsIHRvIGV4aXQgdGhlIFtXaXphcmRdLicsIE5vbmUsIE5vbmUpLAotKHUnUmVzdW1lRGxnJywgdSdUaXRsZScsIHUnVGV4dCcsIDEzNSwgMjAsIDIyMCwgNjAsIDE5NjYxMSwgTm9uZSwgdSd7XFxWZXJkYW5hQm9sZDEzfVJlc3VtaW5nIHRoZSBbUHJvZHVjdE5hbWVdIFtXaXphcmRdJywgTm9uZSwgTm9uZSksCi0odSdSZXN1bWVEbGcnLCB1J0JhY2snLCB1J1B1c2hCdXR0b24nLCAxODAsIDI0MywgNTYsIDE3LCAxLCBOb25lLCB1J1tCdXR0b25UZXh0X0JhY2tdJywgdSdJbnN0YWxsJywgTm9uZSksCi0odSdSZXN1bWVEbGcnLCB1J0luc3RhbGwnLCB1J1B1c2hCdXR0b24nLCAyMzYsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0luc3RhbGxdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J1NldHVwVHlwZURsZycsIHUnQmFubmVyQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzQsIDQ0LCAxLCBOb25lLCB1J1tCYW5uZXJCaXRtYXBdJywgdSdUeXBpY2FsTGFiZWwnLCBOb25lKSwKLSh1J1NldHVwVHlwZURsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdDYW5jZWwnLCB1J1B1c2hCdXR0b24nLCAzMDQsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0NhbmNlbF0nLCB1J0Jhbm5lckJpdG1hcCcsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDI1LCAyMywgMjgwLCAxNSwgMTk2NjExLCBOb25lLCB1J0Nob29zZSB0aGUgc2V0dXAgdHlwZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBuZWVkcycsIE5vbmUsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdUaXRsZScsIHUnVGV4dCcsIDE1LCA2LCAyMDAsIDE1LCAxOTY2MTEsIE5vbmUsIHUnW0RsZ1RpdGxlRm9udF1DaG9vc2UgU2V0dXAgVHlwZScsIE5vbmUsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdCYWNrJywgdSdQdXNoQnV0dG9uJywgMTgwLCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnTmV4dCcsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdOZXh0JywgdSdQdXNoQnV0dG9uJywgMjM2LCAyNDMsIDU2LCAxNywgMSwgTm9uZSwgdSdbQnV0dG9uVGV4dF9OZXh0XScsIHUnQ2FuY2VsJywgTm9uZSksCi0odSdTZXR1cFR5cGVEbGcnLCB1J1R5cGljYWxMYWJlbCcsIHUnVGV4dCcsIDEwNSwgNjUsIDEwMCwgMTAsIDMsIE5vbmUsIHUnW0RsZ1RpdGxlRm9udF0mVHlwaWNhbCcsIHUnVHlwaWNhbEJ1dHRvbicsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdDb21wbGV0ZUJ1dHRvbicsIHUnUHVzaEJ1dHRvbicsIDUwLCAxNzEsIDM4LCAzOCwgNTc2NzE3MSwgTm9uZSwgdSdbQ29tcGxldGVTZXR1cEljb25dJywgdSdCYWNrJywgdSdDb21wbGV0ZSBJbnN0YWxsYXRpb258JyksCi0odSdTZXR1cFR5cGVEbGcnLCB1J0NvbXBsZXRlTGFiZWwnLCB1J1RleHQnLCAxMDUsIDE3MSwgMTAwLCAxMCwgMywgTm9uZSwgdSdbRGxnVGl0bGVGb250XUMmb21wbGV0ZScsIHUnQ29tcGxldGVCdXR0b24nLCBOb25lKSwKLSh1J1NldHVwVHlwZURsZycsIHUnQ29tcGxldGVUZXh0JywgdSdUZXh0JywgMTA1LCAxODQsIDIzMCwgMjAsIDMsIE5vbmUsIHUnQWxsIHByb2dyYW0gZmVhdHVyZXMgd2lsbCBiZSBpbnN0YWxsZWQuICAoUmVxdWlyZXMgbW9zdCBkaXNrIHNwYWNlKScsIE5vbmUsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdDdXN0b21CdXR0b24nLCB1J1B1c2hCdXR0b24nLCA1MCwgMTE4LCAzOCwgMzgsIDU3NjcxNzEsIE5vbmUsIHUnW0N1c3RvbVNldHVwSWNvbl0nLCB1J0NvbXBsZXRlTGFiZWwnLCB1J0N1c3RvbSBJbnN0YWxsYXRpb258JyksCi0odSdTZXR1cFR5cGVEbGcnLCB1J0N1c3RvbUxhYmVsJywgdSdUZXh0JywgMTA1LCAxMTgsIDEwMCwgMTAsIDMsIE5vbmUsIHUnW0RsZ1RpdGxlRm9udF1DJnVzdG9tJywgdSdDdXN0b21CdXR0b24nLCBOb25lKSwKLSh1J1NldHVwVHlwZURsZycsIHUnQ3VzdG9tVGV4dCcsIHUnVGV4dCcsIDEwNSwgMTMxLCAyMzAsIDMwLCAzLCBOb25lLCB1J0FsbG93cyB1c2VycyB0byBjaG9vc2Ugd2hpY2ggcHJvZ3JhbSBmZWF0dXJlcyB3aWxsIGJlIGluc3RhbGxlZCBhbmQgd2hlcmUgdGhleSB3aWxsIGJlIGluc3RhbGxlZC4gUmVjb21tZW5kZWQgZm9yIGFkdmFuY2VkIHVzZXJzLicsIE5vbmUsIE5vbmUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdUeXBpY2FsQnV0dG9uJywgdSdQdXNoQnV0dG9uJywgNTAsIDY1LCAzOCwgMzgsIDU3NjcxNzEsIE5vbmUsIHUnW0luc3RhbGxlckljb25dJywgdSdDdXN0b21MYWJlbCcsIHUnVHlwaWNhbCBJbnN0YWxsYXRpb258JyksCi0odSdTZXR1cFR5cGVEbGcnLCB1J1R5cGljYWxUZXh0JywgdSdUZXh0JywgMTA1LCA3OCwgMjMwLCAyMCwgMywgTm9uZSwgdSdJbnN0YWxscyB0aGUgbW9zdCBjb21tb24gcHJvZ3JhbSBmZWF0dXJlcy4gUmVjb21tZW5kZWQgZm9yIG1vc3QgdXNlcnMuJywgTm9uZSwgTm9uZSksCi0odSdVc2VyUmVnaXN0cmF0aW9uRGxnJywgdSdCYW5uZXJCaXRtYXAnLCB1J0JpdG1hcCcsIDAsIDAsIDM3NCwgNDQsIDEsIE5vbmUsIHUnW0Jhbm5lckJpdG1hcF0nLCB1J05hbWVMYWJlbCcsIE5vbmUpLAotKHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnQmFubmVyTGluZScsIHUnTGluZScsIDAsIDQ0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnQm90dG9tTGluZScsIHUnTGluZScsIDAsIDIzNCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQmFubmVyQml0bWFwJywgTm9uZSksCi0odSdVc2VyUmVnaXN0cmF0aW9uRGxnJywgdSdEZXNjcmlwdGlvbicsIHUnVGV4dCcsIDI1LCAyMywgMjgwLCAxNSwgMTk2NjExLCBOb25lLCB1J1BsZWFzZSBlbnRlciB5b3VyIGN1c3RvbWVyIGluZm9ybWF0aW9uJywgTm9uZSwgTm9uZSksCi0odSdVc2VyUmVnaXN0cmF0aW9uRGxnJywgdSdUaXRsZScsIHUnVGV4dCcsIDE1LCA2LCAyMDAsIDE1LCAxOTY2MTEsIE5vbmUsIHUnW0RsZ1RpdGxlRm9udF1DdXN0b21lciBJbmZvcm1hdGlvbicsIE5vbmUsIE5vbmUpLAotKHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnQmFjaycsIHUnUHVzaEJ1dHRvbicsIDE4MCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQmFja10nLCB1J05leHQnLCBOb25lKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J05leHQnLCB1J1B1c2hCdXR0b24nLCAyMzYsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X05leHRdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J09yZ2FuaXphdGlvbkxhYmVsJywgdSdUZXh0JywgNDUsIDExMCwgMTAwLCAxNSwgMywgTm9uZSwgdScmT3JnYW5pemF0aW9uOicsIHUnT3JnYW5pemF0aW9uRWRpdCcsIE5vbmUpLAotKHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnQ0RLZXlFZGl0JywgdSdNYXNrZWRFZGl0JywgNDUsIDE1OSwgMjUwLCAxNiwgMywgdSdQSURLRVknLCB1J1tQSURUZW1wbGF0ZV0nLCB1J0JhY2snLCBOb25lKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J0NES2V5TGFiZWwnLCB1J1RleHQnLCA0NSwgMTQ3LCA1MCwgMTAsIDMsIE5vbmUsIHUnQ0QgJktleTonLCB1J0NES2V5RWRpdCcsIE5vbmUpLAotKHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnT3JnYW5pemF0aW9uRWRpdCcsIHUnRWRpdCcsIDQ1LCAxMjIsIDIyMCwgMTgsIDMsIHUnQ09NUEFOWU5BTUUnLCB1J3s4MH0nLCB1J0NES2V5TGFiZWwnLCBOb25lKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J05hbWVMYWJlbCcsIHUnVGV4dCcsIDQ1LCA3MywgMTAwLCAxNSwgMywgTm9uZSwgdScmVXNlciBOYW1lOicsIHUnTmFtZUVkaXQnLCBOb25lKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J05hbWVFZGl0JywgdSdFZGl0JywgNDUsIDg1LCAyMjAsIDE4LCAzLCB1J1VTRVJOQU1FJywgdSd7ODB9JywgdSdPcmdhbml6YXRpb25MYWJlbCcsIE5vbmUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J1RleHQnLCB1J1RleHQnLCAyNSwgNzAsIDMyMCwgMjAsIDMsIE5vbmUsIHUnQ2xpY2sgSW5zdGFsbCB0byBiZWdpbiB0aGUgaW5zdGFsbGF0aW9uLiAgSWYgeW91IHdhbnQgdG8gcmV2aWV3IG9yIGNoYW5nZSBhbnkgb2YgeW91ciBpbnN0YWxsYXRpb24gc2V0dGluZ3MsIGNsaWNrIEJhY2suICBDbGljayBDYW5jZWwgdG8gZXhpdCB0aGUgd2l6YXJkLicsIE5vbmUsIE5vbmUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0Jhbm5lckJpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzc0LCA0NCwgMSwgTm9uZSwgdSdbQmFubmVyQml0bWFwXScsIHUnQmFjaycsIE5vbmUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0Jhbm5lckxpbmUnLCB1J0xpbmUnLCAwLCA0NCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J1ZlcmlmeVJlYWR5RGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQmFubmVyQml0bWFwJywgTm9uZSksCi0odSdWZXJpZnlSZWFkeURsZycsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyNSwgMjMsIDI4MCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdUaGUgW1dpemFyZF0gaXMgcmVhZHkgdG8gYmVnaW4gdGhlIFtJbnN0YWxsTW9kZV0gaW5zdGFsbGF0aW9uJywgTm9uZSwgTm9uZSksCi0odSdWZXJpZnlSZWFkeURsZycsIHUnVGl0bGUnLCB1J1RleHQnLCAxNSwgNiwgMjAwLCAxNSwgMTk2NjExLCBOb25lLCB1J1tEbGdUaXRsZUZvbnRdUmVhZHkgdG8gSW5zdGFsbCcsIE5vbmUsIE5vbmUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0JhY2snLCB1J1B1c2hCdXR0b24nLCAxODAsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0JhY2tdJywgdSdJbnN0YWxsJywgTm9uZSksCi0odSdWZXJpZnlSZWFkeURsZycsIHUnSW5zdGFsbCcsIHUnUHVzaEJ1dHRvbicsIDIzNiwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfSW5zdGFsbF0nLCB1J0NhbmNlbCcsIE5vbmUpLAotKHUnVmVyaWZ5UmVtb3ZlRGxnJywgdSdUZXh0JywgdSdUZXh0JywgMjUsIDcwLCAzMjAsIDMwLCAzLCBOb25lLCB1J0NsaWNrIFJlbW92ZSB0byByZW1vdmUgW1Byb2R1Y3ROYW1lXSBmcm9tIHlvdXIgY29tcHV0ZXIuICBJZiB5b3Ugd2FudCB0byByZXZpZXcgb3IgY2hhbmdlIGFueSBvZiB5b3VyIGluc3RhbGxhdGlvbiBzZXR0aW5ncywgY2xpY2sgQmFjay4gIENsaWNrIENhbmNlbCB0byBleGl0IHRoZSB3aXphcmQuJywgTm9uZSwgTm9uZSksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J0Jhbm5lckJpdG1hcCcsIHUnQml0bWFwJywgMCwgMCwgMzc0LCA0NCwgMSwgTm9uZSwgdSdbQmFubmVyQml0bWFwXScsIHUnQmFjaycsIE5vbmUpLAotKHUnVmVyaWZ5UmVtb3ZlRGxnJywgdSdCYW5uZXJMaW5lJywgdSdMaW5lJywgMCwgNDQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J0JvdHRvbUxpbmUnLCB1J0xpbmUnLCAwLCAyMzQsIDM3NCwgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J0NhbmNlbCcsIHUnUHVzaEJ1dHRvbicsIDMwNCwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfQ2FuY2VsXScsIHUnQmFubmVyQml0bWFwJywgTm9uZSksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J0Rlc2NyaXB0aW9uJywgdSdUZXh0JywgMjUsIDIzLCAyODAsIDE1LCAxOTY2MTEsIE5vbmUsIHUnWW91IGhhdmUgY2hvc2VuIHRvIHJlbW92ZSB0aGUgcHJvZ3JhbSBmcm9tIHlvdXIgY29tcHV0ZXIuJywgTm9uZSwgTm9uZSksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J1RpdGxlJywgdSdUZXh0JywgMTUsIDYsIDIwMCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdbRGxnVGl0bGVGb250XVJlbW92ZSBbUHJvZHVjdE5hbWVdJywgTm9uZSwgTm9uZSksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J0JhY2snLCB1J1B1c2hCdXR0b24nLCAxODAsIDI0MywgNTYsIDE3LCAzLCBOb25lLCB1J1tCdXR0b25UZXh0X0JhY2tdJywgdSdSZW1vdmUnLCBOb25lKSwKLSh1J1ZlcmlmeVJlbW92ZURsZycsIHUnUmVtb3ZlJywgdSdQdXNoQnV0dG9uJywgMjM2LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9SZW1vdmVdJywgdSdDYW5jZWwnLCBOb25lKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnVGV4dCcsIHUnVGV4dCcsIDI1LCA3MCwgMzIwLCAzMCwgMywgTm9uZSwgdSdDbGljayBSZXBhaXIgdG8gcmVwYWlyIHRoZSBpbnN0YWxsYXRpb24gb2YgW1Byb2R1Y3ROYW1lXS4gIElmIHlvdSB3YW50IHRvIHJldmlldyBvciBjaGFuZ2UgYW55IG9mIHlvdXIgaW5zdGFsbGF0aW9uIHNldHRpbmdzLCBjbGljayBCYWNrLiAgQ2xpY2sgQ2FuY2VsIHRvIGV4aXQgdGhlIHdpemFyZC4nLCBOb25lLCBOb25lKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnQmFubmVyQml0bWFwJywgdSdCaXRtYXAnLCAwLCAwLCAzNzQsIDQ0LCAxLCBOb25lLCB1J1tCYW5uZXJCaXRtYXBdJywgdSdCYWNrJywgTm9uZSksCi0odSdWZXJpZnlSZXBhaXJEbGcnLCB1J0Jhbm5lckxpbmUnLCB1J0xpbmUnLCAwLCA0NCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnQm90dG9tTGluZScsIHUnTGluZScsIDAsIDIzNCwgMzc0LCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnQ2FuY2VsJywgdSdQdXNoQnV0dG9uJywgMzA0LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgdSdCYW5uZXJCaXRtYXAnLCBOb25lKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnRGVzY3JpcHRpb24nLCB1J1RleHQnLCAyNSwgMjMsIDI4MCwgMTUsIDE5NjYxMSwgTm9uZSwgdSdUaGUgW1dpemFyZF0gaXMgcmVhZHkgdG8gYmVnaW4gdGhlIHJlcGFpciBvZiBbUHJvZHVjdE5hbWVdLicsIE5vbmUsIE5vbmUpLAotKHUnVmVyaWZ5UmVwYWlyRGxnJywgdSdUaXRsZScsIHUnVGV4dCcsIDE1LCA2LCAyMDAsIDE1LCAxOTY2MTEsIE5vbmUsIHUnW0RsZ1RpdGxlRm9udF1SZXBhaXIgW1Byb2R1Y3ROYW1lXScsIE5vbmUsIE5vbmUpLAotKHUnVmVyaWZ5UmVwYWlyRGxnJywgdSdCYWNrJywgdSdQdXNoQnV0dG9uJywgMTgwLCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9CYWNrXScsIHUnUmVwYWlyJywgTm9uZSksCi0odSdWZXJpZnlSZXBhaXJEbGcnLCB1J1JlcGFpcicsIHUnUHVzaEJ1dHRvbicsIDIzNiwgMjQzLCA1NiwgMTcsIDMsIE5vbmUsIHUnW0J1dHRvblRleHRfUmVwYWlyXScsIHUnQ2FuY2VsJywgTm9uZSksCi0odSdXYWl0Rm9yQ29zdGluZ0RsZycsIHUnVGV4dCcsIHUnVGV4dCcsIDQ4LCAxNSwgMTk0LCAzMCwgMywgTm9uZSwgdSdQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgaW5zdGFsbGVyIGZpbmlzaGVzIGRldGVybWluaW5nIHlvdXIgZGlzayBzcGFjZSByZXF1aXJlbWVudHMuJywgTm9uZSwgTm9uZSksCi0odSdXYWl0Rm9yQ29zdGluZ0RsZycsIHUnSWNvbicsIHUnSWNvbicsIDE1LCAxNSwgMjQsIDI0LCA1MjQyODgxLCBOb25lLCB1J1tFeGNsYW1hdGlvbkljb25dJywgTm9uZSwgdSdFeGNsYW1hdGlvbiBpY29ufCcpLAotKHUnV2FpdEZvckNvc3RpbmdEbGcnLCB1J1JldHVybicsIHUnUHVzaEJ1dHRvbicsIDEwMiwgNTcsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9SZXR1cm5dJywgTm9uZSwgTm9uZSksCi0odSdXZWxjb21lRGxnJywgdSdCaXRtYXAnLCB1J0JpdG1hcCcsIDAsIDAsIDM3MCwgMjM0LCAxLCBOb25lLCB1J1tEaWFsb2dCaXRtYXBdJywgdSdCYWNrJywgTm9uZSksCi0odSdXZWxjb21lRGxnJywgdSdCb3R0b21MaW5lJywgdSdMaW5lJywgMCwgMjM0LCAzNzQsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpLAotKHUnV2VsY29tZURsZycsIHUnQ2FuY2VsJywgdSdQdXNoQnV0dG9uJywgMzA0LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9DYW5jZWxdJywgdSdCaXRtYXAnLCBOb25lKSwKLSh1J1dlbGNvbWVEbGcnLCB1J0Rlc2NyaXB0aW9uJywgdSdUZXh0JywgMTM1LCA3MCwgMjIwLCAzMCwgMTk2NjExLCBOb25lLCB1J1RoZSBbV2l6YXJkXSB3aWxsIGluc3RhbGwgW1Byb2R1Y3ROYW1lXSBvbiB5b3VyIGNvbXB1dGVyLiAgQ2xpY2sgTmV4dCB0byBjb250aW51ZSBvciBDYW5jZWwgdG8gZXhpdCB0aGUgW1dpemFyZF0uJywgTm9uZSwgTm9uZSksCi0odSdXZWxjb21lRGxnJywgdSdUaXRsZScsIHUnVGV4dCcsIDEzNSwgMjAsIDIyMCwgNjAsIDE5NjYxMSwgTm9uZSwgdSd7XFxWZXJkYW5hQm9sZDEzfVdlbGNvbWUgdG8gdGhlIFtQcm9kdWN0TmFtZV0gW1dpemFyZF0nLCBOb25lLCBOb25lKSwKLSh1J1dlbGNvbWVEbGcnLCB1J0JhY2snLCB1J1B1c2hCdXR0b24nLCAxODAsIDI0MywgNTYsIDE3LCAxLCBOb25lLCB1J1tCdXR0b25UZXh0X0JhY2tdJywgdSdOZXh0JywgTm9uZSksCi0odSdXZWxjb21lRGxnJywgdSdOZXh0JywgdSdQdXNoQnV0dG9uJywgMjM2LCAyNDMsIDU2LCAxNywgMywgTm9uZSwgdSdbQnV0dG9uVGV4dF9OZXh0XScsIHUnQ2FuY2VsJywgTm9uZSksCi1dCi0KLUxpc3RCb3ggPSBbCi1dCi0KLUFjdGlvblRleHQgPSBbCi0odSdJbnN0YWxsVmFsaWRhdGUnLCB1J1ZhbGlkYXRpbmcgaW5zdGFsbCcsIE5vbmUpLAotKHUnSW5zdGFsbEZpbGVzJywgdSdDb3B5aW5nIG5ldyBmaWxlcycsIHUnRmlsZTogWzFdLCAgRGlyZWN0b3J5OiBbOV0sICBTaXplOiBbNl0nKSwKLSh1J0luc3RhbGxBZG1pblBhY2thZ2UnLCB1J0NvcHlpbmcgbmV0d29yayBpbnN0YWxsIGZpbGVzJywgdSdGaWxlOiBbMV0sIERpcmVjdG9yeTogWzldLCBTaXplOiBbNl0nKSwKLSh1J0ZpbGVDb3N0JywgdSdDb21wdXRpbmcgc3BhY2UgcmVxdWlyZW1lbnRzJywgTm9uZSksCi0odSdDb3N0SW5pdGlhbGl6ZScsIHUnQ29tcHV0aW5nIHNwYWNlIHJlcXVpcmVtZW50cycsIE5vbmUpLAotKHUnQ29zdEZpbmFsaXplJywgdSdDb21wdXRpbmcgc3BhY2UgcmVxdWlyZW1lbnRzJywgTm9uZSksCi0odSdDcmVhdGVTaG9ydGN1dHMnLCB1J0NyZWF0aW5nIHNob3J0Y3V0cycsIHUnU2hvcnRjdXQ6IFsxXScpLAotKHUnUHVibGlzaENvbXBvbmVudHMnLCB1J1B1Ymxpc2hpbmcgUXVhbGlmaWVkIENvbXBvbmVudHMnLCB1J0NvbXBvbmVudCBJRDogWzFdLCBRdWFsaWZpZXI6IFsyXScpLAotKHUnUHVibGlzaEZlYXR1cmVzJywgdSdQdWJsaXNoaW5nIFByb2R1Y3QgRmVhdHVyZXMnLCB1J0ZlYXR1cmU6IFsxXScpLAotKHUnUHVibGlzaFByb2R1Y3QnLCB1J1B1Ymxpc2hpbmcgcHJvZHVjdCBpbmZvcm1hdGlvbicsIE5vbmUpLAotKHUnUmVnaXN0ZXJDbGFzc0luZm8nLCB1J1JlZ2lzdGVyaW5nIENsYXNzIHNlcnZlcnMnLCB1J0NsYXNzIElkOiBbMV0nKSwKLSh1J1JlZ2lzdGVyRXh0ZW5zaW9uSW5mbycsIHUnUmVnaXN0ZXJpbmcgZXh0ZW5zaW9uIHNlcnZlcnMnLCB1J0V4dGVuc2lvbjogWzFdJyksCi0odSdSZWdpc3Rlck1JTUVJbmZvJywgdSdSZWdpc3RlcmluZyBNSU1FIGluZm8nLCB1J01JTUUgQ29udGVudCBUeXBlOiBbMV0sIEV4dGVuc2lvbjogWzJdJyksCi0odSdSZWdpc3RlclByb2dJZEluZm8nLCB1J1JlZ2lzdGVyaW5nIHByb2dyYW0gaWRlbnRpZmllcnMnLCB1J1Byb2dJZDogWzFdJyksCi0odSdBbGxvY2F0ZVJlZ2lzdHJ5U3BhY2UnLCB1J0FsbG9jYXRpbmcgcmVnaXN0cnkgc3BhY2UnLCB1J0ZyZWUgc3BhY2U6IFsxXScpLAotKHUnQXBwU2VhcmNoJywgdSdTZWFyY2hpbmcgZm9yIGluc3RhbGxlZCBhcHBsaWNhdGlvbnMnLCB1J1Byb3BlcnR5OiBbMV0sIFNpZ25hdHVyZTogWzJdJyksCi0odSdCaW5kSW1hZ2UnLCB1J0JpbmRpbmcgZXhlY3V0YWJsZXMnLCB1J0ZpbGU6IFsxXScpLAotKHUnQ0NQU2VhcmNoJywgdSdTZWFyY2hpbmcgZm9yIHF1YWxpZnlpbmcgcHJvZHVjdHMnLCBOb25lKSwKLSh1J0NyZWF0ZUZvbGRlcnMnLCB1J0NyZWF0aW5nIGZvbGRlcnMnLCB1J0ZvbGRlcjogWzFdJyksCi0odSdEZWxldGVTZXJ2aWNlcycsIHUnRGVsZXRpbmcgc2VydmljZXMnLCB1J1NlcnZpY2U6IFsxXScpLAotKHUnRHVwbGljYXRlRmlsZXMnLCB1J0NyZWF0aW5nIGR1cGxpY2F0ZSBmaWxlcycsIHUnRmlsZTogWzFdLCAgRGlyZWN0b3J5OiBbOV0sICBTaXplOiBbNl0nKSwKLSh1J0ZpbmRSZWxhdGVkUHJvZHVjdHMnLCB1J1NlYXJjaGluZyBmb3IgcmVsYXRlZCBhcHBsaWNhdGlvbnMnLCB1J0ZvdW5kIGFwcGxpY2F0aW9uOiBbMV0nKSwKLSh1J0luc3RhbGxPREJDJywgdSdJbnN0YWxsaW5nIE9EQkMgY29tcG9uZW50cycsIE5vbmUpLAotKHUnSW5zdGFsbFNlcnZpY2VzJywgdSdJbnN0YWxsaW5nIG5ldyBzZXJ2aWNlcycsIHUnU2VydmljZTogWzJdJyksCi0odSdMYXVuY2hDb25kaXRpb25zJywgdSdFdmFsdWF0aW5nIGxhdW5jaCBjb25kaXRpb25zJywgTm9uZSksCi0odSdNaWdyYXRlRmVhdHVyZVN0YXRlcycsIHUnTWlncmF0aW5nIGZlYXR1cmUgc3RhdGVzIGZyb20gcmVsYXRlZCBhcHBsaWNhdGlvbnMnLCB1J0FwcGxpY2F0aW9uOiBbMV0nKSwKLSh1J01vdmVGaWxlcycsIHUnTW92aW5nIGZpbGVzJywgdSdGaWxlOiBbMV0sICBEaXJlY3Rvcnk6IFs5XSwgIFNpemU6IFs2XScpLAotKHUnUGF0Y2hGaWxlcycsIHUnUGF0Y2hpbmcgZmlsZXMnLCB1J0ZpbGU6IFsxXSwgIERpcmVjdG9yeTogWzJdLCAgU2l6ZTogWzNdJyksCi0odSdQcm9jZXNzQ29tcG9uZW50cycsIHUnVXBkYXRpbmcgY29tcG9uZW50IHJlZ2lzdHJhdGlvbicsIE5vbmUpLAotKHUnUmVnaXN0ZXJDb21QbHVzJywgdSdSZWdpc3RlcmluZyBDT00rIEFwcGxpY2F0aW9ucyBhbmQgQ29tcG9uZW50cycsIHUnQXBwSWQ6IFsxXXt7LCBBcHBUeXBlOiBbMl0sIFVzZXJzOiBbM10sIFJTTjogWzRdfX0nKSwKLSh1J1JlZ2lzdGVyRm9udHMnLCB1J1JlZ2lzdGVyaW5nIGZvbnRzJywgdSdGb250OiBbMV0nKSwKLSh1J1JlZ2lzdGVyUHJvZHVjdCcsIHUnUmVnaXN0ZXJpbmcgcHJvZHVjdCcsIHUnWzFdJyksCi0odSdSZWdpc3RlclR5cGVMaWJyYXJpZXMnLCB1J1JlZ2lzdGVyaW5nIHR5cGUgbGlicmFyaWVzJywgdSdMaWJJRDogWzFdJyksCi0odSdSZWdpc3RlclVzZXInLCB1J1JlZ2lzdGVyaW5nIHVzZXInLCB1J1sxXScpLAotKHUnUmVtb3ZlRHVwbGljYXRlRmlsZXMnLCB1J1JlbW92aW5nIGR1cGxpY2F0ZWQgZmlsZXMnLCB1J0ZpbGU6IFsxXSwgRGlyZWN0b3J5OiBbOV0nKSwKLSh1J1JlbW92ZUVudmlyb25tZW50U3RyaW5ncycsIHUnVXBkYXRpbmcgZW52aXJvbm1lbnQgc3RyaW5ncycsIHUnTmFtZTogWzFdLCBWYWx1ZTogWzJdLCBBY3Rpb24gWzNdJyksCi0odSdSZW1vdmVFeGlzdGluZ1Byb2R1Y3RzJywgdSdSZW1vdmluZyBhcHBsaWNhdGlvbnMnLCB1J0FwcGxpY2F0aW9uOiBbMV0sIENvbW1hbmQgbGluZTogWzJdJyksCi0odSdSZW1vdmVGaWxlcycsIHUnUmVtb3ZpbmcgZmlsZXMnLCB1J0ZpbGU6IFsxXSwgRGlyZWN0b3J5OiBbOV0nKSwKLSh1J1JlbW92ZUZvbGRlcnMnLCB1J1JlbW92aW5nIGZvbGRlcnMnLCB1J0ZvbGRlcjogWzFdJyksCi0odSdSZW1vdmVJbmlWYWx1ZXMnLCB1J1JlbW92aW5nIElOSSBmaWxlcyBlbnRyaWVzJywgdSdGaWxlOiBbMV0sICBTZWN0aW9uOiBbMl0sICBLZXk6IFszXSwgVmFsdWU6IFs0XScpLAotKHUnUmVtb3ZlT0RCQycsIHUnUmVtb3ZpbmcgT0RCQyBjb21wb25lbnRzJywgTm9uZSksCi0odSdSZW1vdmVSZWdpc3RyeVZhbHVlcycsIHUnUmVtb3Zpbmcgc3lzdGVtIHJlZ2lzdHJ5IHZhbHVlcycsIHUnS2V5OiBbMV0sIE5hbWU6IFsyXScpLAotKHUnUmVtb3ZlU2hvcnRjdXRzJywgdSdSZW1vdmluZyBzaG9ydGN1dHMnLCB1J1Nob3J0Y3V0OiBbMV0nKSwKLSh1J1JNQ0NQU2VhcmNoJywgdSdTZWFyY2hpbmcgZm9yIHF1YWxpZnlpbmcgcHJvZHVjdHMnLCBOb25lKSwKLSh1J1NlbGZSZWdNb2R1bGVzJywgdSdSZWdpc3RlcmluZyBtb2R1bGVzJywgdSdGaWxlOiBbMV0sIEZvbGRlcjogWzJdJyksCi0odSdTZWxmVW5yZWdNb2R1bGVzJywgdSdVbnJlZ2lzdGVyaW5nIG1vZHVsZXMnLCB1J0ZpbGU6IFsxXSwgRm9sZGVyOiBbMl0nKSwKLSh1J1NldE9EQkNGb2xkZXJzJywgdSdJbml0aWFsaXppbmcgT0RCQyBkaXJlY3RvcmllcycsIE5vbmUpLAotKHUnU3RhcnRTZXJ2aWNlcycsIHUnU3RhcnRpbmcgc2VydmljZXMnLCB1J1NlcnZpY2U6IFsxXScpLAotKHUnU3RvcFNlcnZpY2VzJywgdSdTdG9wcGluZyBzZXJ2aWNlcycsIHUnU2VydmljZTogWzFdJyksCi0odSdVbnB1Ymxpc2hDb21wb25lbnRzJywgdSdVbnB1Ymxpc2hpbmcgUXVhbGlmaWVkIENvbXBvbmVudHMnLCB1J0NvbXBvbmVudCBJRDogWzFdLCBRdWFsaWZpZXI6IFsyXScpLAotKHUnVW5wdWJsaXNoRmVhdHVyZXMnLCB1J1VucHVibGlzaGluZyBQcm9kdWN0IEZlYXR1cmVzJywgdSdGZWF0dXJlOiBbMV0nKSwKLSh1J1VucmVnaXN0ZXJDbGFzc0luZm8nLCB1J1VucmVnaXN0ZXIgQ2xhc3Mgc2VydmVycycsIHUnQ2xhc3MgSWQ6IFsxXScpLAotKHUnVW5yZWdpc3RlckNvbVBsdXMnLCB1J1VucmVnaXN0ZXJpbmcgQ09NKyBBcHBsaWNhdGlvbnMgYW5kIENvbXBvbmVudHMnLCB1J0FwcElkOiBbMV17eywgQXBwVHlwZTogWzJdfX0nKSwKLSh1J1VucmVnaXN0ZXJFeHRlbnNpb25JbmZvJywgdSdVbnJlZ2lzdGVyaW5nIGV4dGVuc2lvbiBzZXJ2ZXJzJywgdSdFeHRlbnNpb246IFsxXScpLAotKHUnVW5yZWdpc3RlckZvbnRzJywgdSdVbnJlZ2lzdGVyaW5nIGZvbnRzJywgdSdGb250OiBbMV0nKSwKLSh1J1VucmVnaXN0ZXJNSU1FSW5mbycsIHUnVW5yZWdpc3RlcmluZyBNSU1FIGluZm8nLCB1J01JTUUgQ29udGVudCBUeXBlOiBbMV0sIEV4dGVuc2lvbjogWzJdJyksCi0odSdVbnJlZ2lzdGVyUHJvZ0lkSW5mbycsIHUnVW5yZWdpc3RlcmluZyBwcm9ncmFtIGlkZW50aWZpZXJzJywgdSdQcm9nSWQ6IFsxXScpLAotKHUnVW5yZWdpc3RlclR5cGVMaWJyYXJpZXMnLCB1J1VucmVnaXN0ZXJpbmcgdHlwZSBsaWJyYXJpZXMnLCB1J0xpYklEOiBbMV0nKSwKLSh1J1dyaXRlRW52aXJvbm1lbnRTdHJpbmdzJywgdSdVcGRhdGluZyBlbnZpcm9ubWVudCBzdHJpbmdzJywgdSdOYW1lOiBbMV0sIFZhbHVlOiBbMl0sIEFjdGlvbiBbM10nKSwKLSh1J1dyaXRlSW5pVmFsdWVzJywgdSdXcml0aW5nIElOSSBmaWxlcyB2YWx1ZXMnLCB1J0ZpbGU6IFsxXSwgIFNlY3Rpb246IFsyXSwgIEtleTogWzNdLCBWYWx1ZTogWzRdJyksCi0odSdXcml0ZVJlZ2lzdHJ5VmFsdWVzJywgdSdXcml0aW5nIHN5c3RlbSByZWdpc3RyeSB2YWx1ZXMnLCB1J0tleTogWzFdLCBOYW1lOiBbMl0sIFZhbHVlOiBbM10nKSwKLSh1J0FkdmVydGlzZScsIHUnQWR2ZXJ0aXNpbmcgYXBwbGljYXRpb24nLCBOb25lKSwKLSh1J0dlbmVyYXRlU2NyaXB0JywgdSdHZW5lcmF0aW5nIHNjcmlwdCBvcGVyYXRpb25zIGZvciBhY3Rpb246JywgdSdbMV0nKSwKLSh1J0luc3RhbGxTRlBDYXRhbG9nRmlsZScsIHUnSW5zdGFsbGluZyBzeXN0ZW0gY2F0YWxvZycsIHUnRmlsZTogWzFdLCAgRGVwZW5kZW5jaWVzOiBbMl0nKSwKLSh1J01zaVB1Ymxpc2hBc3NlbWJsaWVzJywgdSdQdWJsaXNoaW5nIGFzc2VtYmx5IGluZm9ybWF0aW9uJywgdSdBcHBsaWNhdGlvbiBDb250ZXh0OlsxXSwgQXNzZW1ibHkgTmFtZTpbMl0nKSwKLSh1J01zaVVucHVibGlzaEFzc2VtYmxpZXMnLCB1J1VucHVibGlzaGluZyBhc3NlbWJseSBpbmZvcm1hdGlvbicsIHUnQXBwbGljYXRpb24gQ29udGV4dDpbMV0sIEFzc2VtYmx5IE5hbWU6WzJdJyksCi0odSdSb2xsYmFjaycsIHUnUm9sbGluZyBiYWNrIGFjdGlvbjonLCB1J1sxXScpLAotKHUnUm9sbGJhY2tDbGVhbnVwJywgdSdSZW1vdmluZyBiYWNrdXAgZmlsZXMnLCB1J0ZpbGU6IFsxXScpLAotKHUnVW5tb3ZlRmlsZXMnLCB1J1JlbW92aW5nIG1vdmVkIGZpbGVzJywgdSdGaWxlOiBbMV0sIERpcmVjdG9yeTogWzldJyksCi0odSdVbnB1Ymxpc2hQcm9kdWN0JywgdSdVbnB1Ymxpc2hpbmcgcHJvZHVjdCBpbmZvcm1hdGlvbicsIE5vbmUpLAotXQotCi1Db250cm9sQ29uZGl0aW9uID0gWwotKHUnQ3VzdG9taXplRGxnJywgdSdCcm93c2UnLCB1J0hpZGUnLCB1J0luc3RhbGxlZCcpLAotKHUnQ3VzdG9taXplRGxnJywgdSdMb2NhdGlvbicsIHUnSGlkZScsIHUnSW5zdGFsbGVkJyksCi0odSdDdXN0b21pemVEbGcnLCB1J0xvY2F0aW9uTGFiZWwnLCB1J0hpZGUnLCB1J0luc3RhbGxlZCcpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnTmV4dCcsIHUnRGlzYWJsZScsIHUnSUFncmVlIDw+ICJZZXMiJyksCi0odSdMaWNlbnNlQWdyZWVtZW50RGxnJywgdSdOZXh0JywgdSdFbmFibGUnLCB1J0lBZ3JlZSA9ICJZZXMiJyksCi1dCi0KLUNvbnRyb2xFdmVudCA9IFsKLSh1J0FkbWluV2VsY29tZURsZycsIHUnQ2FuY2VsJywgdSdTcGF3bkRpYWxvZycsIHUnQ2FuY2VsRGxnJywgdScxJywgTm9uZSksCi0odSdBZG1pbldlbGNvbWVEbGcnLCB1J05leHQnLCB1J05ld0RpYWxvZycsIHUnQWRtaW5SZWdpc3RyYXRpb25EbGcnLCB1JzEnLCAyKSwKLSh1J0FkbWluV2VsY29tZURsZycsIHUnTmV4dCcsIHUnW0luc3RhbGxNb2RlXScsIHUnU2VydmVyIEltYWdlJywgdScxJywgMSksCi0odSdFeGl0RGlhbG9nJywgdSdGaW5pc2gnLCB1J0VuZERpYWxvZycsIHUnUmV0dXJuJywgdScxJywgTm9uZSksCi0odSdGYXRhbEVycm9yJywgdSdGaW5pc2gnLCB1J0VuZERpYWxvZycsIHUnRXhpdCcsIHUnMScsIE5vbmUpLAotKHUnUHJlcGFyZURsZycsIHUnQ2FuY2VsJywgdSdTcGF3bkRpYWxvZycsIHUnQ2FuY2VsRGxnJywgdScxJywgTm9uZSksCi0odSdQcm9ncmVzc0RsZycsIHUnQ2FuY2VsJywgdSdTcGF3bkRpYWxvZycsIHUnQ2FuY2VsRGxnJywgdScxJywgTm9uZSksCi0odSdVc2VyRXhpdCcsIHUnRmluaXNoJywgdSdFbmREaWFsb2cnLCB1J0V4aXQnLCB1JzEnLCBOb25lKSwKLSh1J0FkbWluQnJvd3NlRGxnJywgdSdVcCcsIHUnRGlyZWN0b3J5TGlzdFVwJywgdScwJywgdScxJywgTm9uZSksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnQ2FuY2VsJywgdSdSZXNldCcsIHUnMCcsIHUnMScsIDEpLAotKHUnQWRtaW5Ccm93c2VEbGcnLCB1J0NhbmNlbCcsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1JzEnLCAyKSwKLSh1J0FkbWluQnJvd3NlRGxnJywgdSdOZXdGb2xkZXInLCB1J0RpcmVjdG9yeUxpc3ROZXcnLCB1JzAnLCB1JzEnLCBOb25lKSwKLSh1J0FkbWluQnJvd3NlRGxnJywgdSdPSycsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1JzEnLCAyKSwKLSh1J0FkbWluQnJvd3NlRGxnJywgdSdPSycsIHUnU2V0VGFyZ2V0UGF0aCcsIHUnVEFSR0VURElSJywgdScxJywgMSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnQ2FuY2VsJywgdSdTcGF3bkRpYWxvZycsIHUnQ2FuY2VsRGxnJywgdScxJywgTm9uZSksCi0odSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnQmFjaycsIHUnTmV3RGlhbG9nJywgdSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIHUnMScsIE5vbmUpLAotKHUnQWRtaW5JbnN0YWxsUG9pbnREbGcnLCB1J05leHQnLCB1J1NldFRhcmdldFBhdGgnLCB1J1RBUkdFVERJUicsIHUnMScsIDEpLAotKHUnQWRtaW5JbnN0YWxsUG9pbnREbGcnLCB1J05leHQnLCB1J05ld0RpYWxvZycsIHUnVmVyaWZ5UmVhZHlEbGcnLCB1JzEnLCAyKSwKLSh1J0FkbWluSW5zdGFsbFBvaW50RGxnJywgdSdCcm93c2UnLCB1J1NwYXduRGlhbG9nJywgdSdBZG1pbkJyb3dzZURsZycsIHUnMScsIE5vbmUpLAotKHUnQWRtaW5SZWdpc3RyYXRpb25EbGcnLCB1J0NhbmNlbCcsIHUnU3Bhd25EaWFsb2cnLCB1J0NhbmNlbERsZycsIHUnMScsIE5vbmUpLAotKHUnQWRtaW5SZWdpc3RyYXRpb25EbGcnLCB1J0JhY2snLCB1J05ld0RpYWxvZycsIHUnQWRtaW5XZWxjb21lRGxnJywgdScxJywgTm9uZSksCi0odSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIHUnTmV4dCcsIHUnTmV3RGlhbG9nJywgdSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnUHJvZHVjdElEJywgMiksCi0odSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIHUnTmV4dCcsIHUnVmFsaWRhdGVQcm9kdWN0SUQnLCB1JzAnLCB1JzAnLCAxKSwKLSh1J0Jyb3dzZURsZycsIHUnVXAnLCB1J0RpcmVjdG9yeUxpc3RVcCcsIHUnMCcsIHUnMScsIE5vbmUpLAotKHUnQnJvd3NlRGxnJywgdSdDYW5jZWwnLCB1J1Jlc2V0JywgdScwJywgdScxJywgMSksCi0odSdCcm93c2VEbGcnLCB1J0NhbmNlbCcsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1JzEnLCAyKSwKLSh1J0Jyb3dzZURsZycsIHUnTmV3Rm9sZGVyJywgdSdEaXJlY3RvcnlMaXN0TmV3JywgdScwJywgdScxJywgTm9uZSksCi0odSdCcm93c2VEbGcnLCB1J09LJywgdSdFbmREaWFsb2cnLCB1J1JldHVybicsIHUnMScsIDIpLAotKHUnQnJvd3NlRGxnJywgdSdPSycsIHUnU2V0VGFyZ2V0UGF0aCcsIHUnW19Ccm93c2VQcm9wZXJ0eV0nLCB1JzEnLCAxKSwKLSh1J0NhbmNlbERsZycsIHUnTm8nLCB1J0VuZERpYWxvZycsIHUnUmV0dXJuJywgdScxJywgTm9uZSksCi0odSdDYW5jZWxEbGcnLCB1J1llcycsIHUnRW5kRGlhbG9nJywgdSdFeGl0JywgdScxJywgTm9uZSksCi0odSdDdXN0b21pemVEbGcnLCB1J0NhbmNlbCcsIHUnU3Bhd25EaWFsb2cnLCB1J0NhbmNlbERsZycsIHUnMScsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdCYWNrJywgdSdOZXdEaWFsb2cnLCB1J01haW50ZW5hbmNlVHlwZURsZycsIHUnSW5zdGFsbE1vZGUgPSAiQ2hhbmdlIicsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdCYWNrJywgdSdOZXdEaWFsb2cnLCB1J1NldHVwVHlwZURsZycsIHUnSW5zdGFsbE1vZGUgPSAiQ3VzdG9tIicsIE5vbmUpLAotKHUnQ3VzdG9taXplRGxnJywgdSdOZXh0JywgdSdOZXdEaWFsb2cnLCB1J1ZlcmlmeVJlYWR5RGxnJywgdScxJywgTm9uZSksCi0odSdDdXN0b21pemVEbGcnLCB1J0Jyb3dzZScsIHUnU2VsZWN0aW9uQnJvd3NlJywgdSdCcm93c2VEbGcnLCB1JzEnLCBOb25lKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnUmVzZXQnLCB1J1Jlc2V0JywgdScwJywgdScxJywgTm9uZSksCi0odSdDdXN0b21pemVEbGcnLCB1J0Rpc2tDb3N0JywgdSdTcGF3bkRpYWxvZycsIHUnRGlza0Nvc3REbGcnLCB1JzEnLCAyKSwKLSh1J0Rpc2tDb3N0RGxnJywgdSdPSycsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1JzEnLCBOb25lKSwKLSh1J0Vycm9yRGxnJywgdSdZJywgdSdFbmREaWFsb2cnLCB1J0Vycm9yWWVzJywgdScxJywgTm9uZSksCi0odSdFcnJvckRsZycsIHUnQScsIHUnRW5kRGlhbG9nJywgdSdFcnJvckFib3J0JywgdScxJywgTm9uZSksCi0odSdFcnJvckRsZycsIHUnQycsIHUnRW5kRGlhbG9nJywgdSdFcnJvckNhbmNlbCcsIHUnMScsIE5vbmUpLAotKHUnRXJyb3JEbGcnLCB1J0knLCB1J0VuZERpYWxvZycsIHUnRXJyb3JJZ25vcmUnLCB1JzEnLCBOb25lKSwKLSh1J0Vycm9yRGxnJywgdSdOJywgdSdFbmREaWFsb2cnLCB1J0Vycm9yTm8nLCB1JzEnLCBOb25lKSwKLSh1J0Vycm9yRGxnJywgdSdPJywgdSdFbmREaWFsb2cnLCB1J0Vycm9yT2snLCB1JzEnLCBOb25lKSwKLSh1J0Vycm9yRGxnJywgdSdSJywgdSdFbmREaWFsb2cnLCB1J0Vycm9yUmV0cnknLCB1JzEnLCBOb25lKSwKLSh1J0ZpbGVzSW5Vc2UnLCB1J1JldHJ5JywgdSdFbmREaWFsb2cnLCB1J1JldHJ5JywgdScxJywgTm9uZSksCi0odSdGaWxlc0luVXNlJywgdSdFeGl0JywgdSdFbmREaWFsb2cnLCB1J0V4aXQnLCB1JzEnLCBOb25lKSwKLSh1J0ZpbGVzSW5Vc2UnLCB1J0lnbm9yZScsIHUnRW5kRGlhbG9nJywgdSdJZ25vcmUnLCB1JzEnLCBOb25lKSwKLSh1J0xpY2Vuc2VBZ3JlZW1lbnREbGcnLCB1J0NhbmNlbCcsIHUnU3Bhd25EaWFsb2cnLCB1J0NhbmNlbERsZycsIHUnMScsIE5vbmUpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnQmFjaycsIHUnTmV3RGlhbG9nJywgdSdXZWxjb21lRGxnJywgdScxJywgTm9uZSksCi0odSdMaWNlbnNlQWdyZWVtZW50RGxnJywgdSdOZXh0JywgdSdOZXdEaWFsb2cnLCB1J1NldHVwVHlwZURsZycsIHUnSUFncmVlID0gIlllcyIgQU5EIFNob3dVc2VyUmVnaXN0cmF0aW9uRGxnIDw+IDEnLCAzKSwKLSh1J0xpY2Vuc2VBZ3JlZW1lbnREbGcnLCB1J05leHQnLCB1J05ld0RpYWxvZycsIHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnSUFncmVlID0gIlllcyIgQU5EIFNob3dVc2VyUmVnaXN0cmF0aW9uRGxnID0gMScsIDEpLAotKHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnTmV4dCcsIHUnU3Bhd25XYWl0RGlhbG9nJywgdSdXYWl0Rm9yQ29zdGluZ0RsZycsIHUnQ29zdGluZ0NvbXBsZXRlID0gMScsIDIpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdDYW5jZWwnLCB1J1NwYXduRGlhbG9nJywgdSdDYW5jZWxEbGcnLCB1JzEnLCBOb25lKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnQmFjaycsIHUnTmV3RGlhbG9nJywgdSdNYWludGVuYW5jZVdlbGNvbWVEbGcnLCB1JzEnLCBOb25lKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnQ2hhbmdlQnV0dG9uJywgdSdOZXdEaWFsb2cnLCB1J0N1c3RvbWl6ZURsZycsIHUnMScsIDQpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdDaGFuZ2VCdXR0b24nLCB1J1tJbnN0YWxsTW9kZV0nLCB1J0NoYW5nZScsIHUnMScsIDEpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdDaGFuZ2VCdXR0b24nLCB1J1tQcm9ncmVzczFdJywgdSdDaGFuZ2luZycsIHUnMScsIDIpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdDaGFuZ2VCdXR0b24nLCB1J1tQcm9ncmVzczJdJywgdSdjaGFuZ2VzJywgdScxJywgMyksCi0odSdNYWludGVuYW5jZVR5cGVEbGcnLCB1J1JlbW92ZUJ1dHRvbicsIHUnTmV3RGlhbG9nJywgdSdWZXJpZnlSZW1vdmVEbGcnLCB1JzEnLCA0KSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnUmVtb3ZlQnV0dG9uJywgdSdbSW5zdGFsbE1vZGVdJywgdSdSZW1vdmUnLCB1JzEnLCAxKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnUmVtb3ZlQnV0dG9uJywgdSdbUHJvZ3Jlc3MxXScsIHUnUmVtb3ZpbmcnLCB1JzEnLCAyKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIHUnUmVtb3ZlQnV0dG9uJywgdSdbUHJvZ3Jlc3MyXScsIHUncmVtb3ZlcycsIHUnMScsIDMpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdSZXBhaXJCdXR0b24nLCB1J05ld0RpYWxvZycsIHUnVmVyaWZ5UmVwYWlyRGxnJywgdScxJywgNCksCi0odSdNYWludGVuYW5jZVR5cGVEbGcnLCB1J1JlcGFpckJ1dHRvbicsIHUnW0luc3RhbGxNb2RlXScsIHUnUmVwYWlyJywgdScxJywgMSksCi0odSdNYWludGVuYW5jZVR5cGVEbGcnLCB1J1JlcGFpckJ1dHRvbicsIHUnW1Byb2dyZXNzMV0nLCB1J1JlcGFpcmluZycsIHUnMScsIDIpLAotKHUnTWFpbnRlbmFuY2VUeXBlRGxnJywgdSdSZXBhaXJCdXR0b24nLCB1J1tQcm9ncmVzczJdJywgdSdyZXBhaXJzJywgdScxJywgMyksCi0odSdNYWludGVuYW5jZVdlbGNvbWVEbGcnLCB1J0NhbmNlbCcsIHUnU3Bhd25EaWFsb2cnLCB1J0NhbmNlbERsZycsIHUnMScsIE5vbmUpLAotKHUnTWFpbnRlbmFuY2VXZWxjb21lRGxnJywgdSdOZXh0JywgdSdOZXdEaWFsb2cnLCB1J01haW50ZW5hbmNlVHlwZURsZycsIHUnMScsIDIpLAotKHUnTWFpbnRlbmFuY2VXZWxjb21lRGxnJywgdSdOZXh0JywgdSdTcGF3bldhaXREaWFsb2cnLCB1J1dhaXRGb3JDb3N0aW5nRGxnJywgdSdDb3N0aW5nQ29tcGxldGUgPSAxJywgMSksCi0odSdPdXRPZkRpc2tEbGcnLCB1J09LJywgdSdFbmREaWFsb2cnLCB1J1JldHVybicsIHUnMScsIE5vbmUpLAotKHUnT3V0T2ZSYkRpc2tEbGcnLCB1J05vJywgdSdFbmREaWFsb2cnLCB1J1JldHVybicsIHUnMScsIE5vbmUpLAotKHUnT3V0T2ZSYkRpc2tEbGcnLCB1J1llcycsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1JzEnLCAyKSwKLSh1J091dE9mUmJEaXNrRGxnJywgdSdZZXMnLCB1J0VuYWJsZVJvbGxiYWNrJywgdSdGYWxzZScsIHUnMScsIDEpLAotKHUnUmVzdW1lRGxnJywgdSdDYW5jZWwnLCB1J1NwYXduRGlhbG9nJywgdSdDYW5jZWxEbGcnLCB1JzEnLCBOb25lKSwKLSh1J1Jlc3VtZURsZycsIHUnSW5zdGFsbCcsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1J091dE9mRGlza1NwYWNlID0gMSBBTkQgT3V0T2ZOb1JiRGlza1NwYWNlID0gMCBBTkQgUFJPTVBUUk9MTEJBQ0tDT1NUPSJEIicsIDQpLAotKHUnUmVzdW1lRGxnJywgdSdJbnN0YWxsJywgdSdFbmREaWFsb2cnLCB1J1JldHVybicsIHUnT3V0T2ZEaXNrU3BhY2UgPD4gMScsIDIpLAotKHUnUmVzdW1lRGxnJywgdSdJbnN0YWxsJywgdSdTcGF3bkRpYWxvZycsIHUnT3V0T2ZEaXNrRGxnJywgdScoT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAxKSBPUiAoT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBQUk9NUFRST0xMQkFDS0NPU1Q9IkYiKScsIDYpLAotKHUnUmVzdW1lRGxnJywgdSdJbnN0YWxsJywgdSdTcGF3bkRpYWxvZycsIHUnT3V0T2ZSYkRpc2tEbGcnLCB1J091dE9mRGlza1NwYWNlID0gMSBBTkQgT3V0T2ZOb1JiRGlza1NwYWNlID0gMCBBTkQgKFBST01QVFJPTExCQUNLQ09TVD0iUCIgT1IgTk9UIFBST01QVFJPTExCQUNLQ09TVCknLCAzKSwKLSh1J1Jlc3VtZURsZycsIHUnSW5zdGFsbCcsIHUnU3Bhd25XYWl0RGlhbG9nJywgdSdXYWl0Rm9yQ29zdGluZ0RsZycsIHUnQ29zdGluZ0NvbXBsZXRlID0gMScsIDEpLAotKHUnUmVzdW1lRGxnJywgdSdJbnN0YWxsJywgdSdFbmFibGVSb2xsYmFjaycsIHUnRmFsc2UnLCB1J091dE9mRGlza1NwYWNlID0gMSBBTkQgT3V0T2ZOb1JiRGlza1NwYWNlID0gMCBBTkQgUFJPTVBUUk9MTEJBQ0tDT1NUPSJEIicsIDUpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdDYW5jZWwnLCB1J1NwYXduRGlhbG9nJywgdSdDYW5jZWxEbGcnLCB1JzEnLCBOb25lKSwKLSh1J1NldHVwVHlwZURsZycsIHUnQmFjaycsIHUnTmV3RGlhbG9nJywgdSdMaWNlbnNlQWdyZWVtZW50RGxnJywgdSdTaG93VXNlclJlZ2lzdHJhdGlvbkRsZyA8PiAxJywgTm9uZSksCi0odSdTZXR1cFR5cGVEbGcnLCB1J0JhY2snLCB1J05ld0RpYWxvZycsIHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnU2hvd1VzZXJSZWdpc3RyYXRpb25EbGcgPSAxJywgTm9uZSksCi0odSdTZXR1cFR5cGVEbGcnLCB1J0NvbXBsZXRlQnV0dG9uJywgdSdOZXdEaWFsb2cnLCB1J1ZlcmlmeVJlYWR5RGxnJywgdScxJywgMyksCi0odSdTZXR1cFR5cGVEbGcnLCB1J0NvbXBsZXRlQnV0dG9uJywgdSdbSW5zdGFsbE1vZGVdJywgdSdDb21wbGV0ZScsIHUnMScsIDEpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdDb21wbGV0ZUJ1dHRvbicsIHUnU2V0SW5zdGFsbExldmVsJywgdScxMDAwJywgdScxJywgMiksCi0odSdTZXR1cFR5cGVEbGcnLCB1J0N1c3RvbUJ1dHRvbicsIHUnTmV3RGlhbG9nJywgdSdDdXN0b21pemVEbGcnLCB1JzEnLCAyKSwKLSh1J1NldHVwVHlwZURsZycsIHUnQ3VzdG9tQnV0dG9uJywgdSdbSW5zdGFsbE1vZGVdJywgdSdDdXN0b20nLCB1JzEnLCAxKSwKLSh1J1NldHVwVHlwZURsZycsIHUnVHlwaWNhbEJ1dHRvbicsIHUnTmV3RGlhbG9nJywgdSdWZXJpZnlSZWFkeURsZycsIHUnMScsIDMpLAotKHUnU2V0dXBUeXBlRGxnJywgdSdUeXBpY2FsQnV0dG9uJywgdSdbSW5zdGFsbE1vZGVdJywgdSdUeXBpY2FsJywgdScxJywgMSksCi0odSdTZXR1cFR5cGVEbGcnLCB1J1R5cGljYWxCdXR0b24nLCB1J1NldEluc3RhbGxMZXZlbCcsIHUnMycsIHUnMScsIDIpLAotKHUnVXNlclJlZ2lzdHJhdGlvbkRsZycsIHUnQ2FuY2VsJywgdSdTcGF3bkRpYWxvZycsIHUnQ2FuY2VsRGxnJywgdScxJywgTm9uZSksCi0odSdVc2VyUmVnaXN0cmF0aW9uRGxnJywgdSdCYWNrJywgdSdOZXdEaWFsb2cnLCB1J0xpY2Vuc2VBZ3JlZW1lbnREbGcnLCB1JzEnLCBOb25lKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J05leHQnLCB1J05ld0RpYWxvZycsIHUnU2V0dXBUeXBlRGxnJywgdSdQcm9kdWN0SUQnLCAzKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCB1J05leHQnLCB1J1ZhbGlkYXRlUHJvZHVjdElEJywgdScwJywgdScwJywgMSksCi0odSdVc2VyUmVnaXN0cmF0aW9uRGxnJywgdSdOZXh0JywgdSdTcGF3bldhaXREaWFsb2cnLCB1J1dhaXRGb3JDb3N0aW5nRGxnJywgdSdDb3N0aW5nQ29tcGxldGUgPSAxJywgMiksCi0odSdWZXJpZnlSZWFkeURsZycsIHUnQ2FuY2VsJywgdSdTcGF3bkRpYWxvZycsIHUnQ2FuY2VsRGxnJywgdScxJywgTm9uZSksCi0odSdWZXJpZnlSZWFkeURsZycsIHUnQmFjaycsIHUnTmV3RGlhbG9nJywgdSdBZG1pbkluc3RhbGxQb2ludERsZycsIHUnSW5zdGFsbE1vZGUgPSAiU2VydmVyIEltYWdlIicsIE5vbmUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0JhY2snLCB1J05ld0RpYWxvZycsIHUnQ3VzdG9taXplRGxnJywgdSdJbnN0YWxsTW9kZSA9ICJDdXN0b20iIE9SIEluc3RhbGxNb2RlID0gIkNoYW5nZSInLCBOb25lKSwKLSh1J1ZlcmlmeVJlYWR5RGxnJywgdSdCYWNrJywgdSdOZXdEaWFsb2cnLCB1J01haW50ZW5hbmNlVHlwZURsZycsIHUnSW5zdGFsbE1vZGUgPSAiUmVwYWlyIicsIE5vbmUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0JhY2snLCB1J05ld0RpYWxvZycsIHUnU2V0dXBUeXBlRGxnJywgdSdJbnN0YWxsTW9kZSA9ICJUeXBpY2FsIiBPUiBJbnN0YWxsTW9kZSA9ICJDb21wbGV0ZSInLCBOb25lKSwKLSh1J1ZlcmlmeVJlYWR5RGxnJywgdSdJbnN0YWxsJywgdSdFbmREaWFsb2cnLCB1J1JldHVybicsIHUnT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAwIEFORCBQUk9NUFRST0xMQkFDS0NPU1Q9IkQiJywgMyksCi0odSdWZXJpZnlSZWFkeURsZycsIHUnSW5zdGFsbCcsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1J091dE9mRGlza1NwYWNlIDw+IDEnLCAxKSwKLSh1J1ZlcmlmeVJlYWR5RGxnJywgdSdJbnN0YWxsJywgdSdTcGF3bkRpYWxvZycsIHUnT3V0T2ZEaXNrRGxnJywgdScoT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAxKSBPUiAoT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBQUk9NUFRST0xMQkFDS0NPU1Q9IkYiKScsIDUpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0luc3RhbGwnLCB1J1NwYXduRGlhbG9nJywgdSdPdXRPZlJiRGlza0RsZycsIHUnT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAwIEFORCAoUFJPTVBUUk9MTEJBQ0tDT1NUPSJQIiBPUiBOT1QgUFJPTVBUUk9MTEJBQ0tDT1NUKScsIDIpLAotKHUnVmVyaWZ5UmVhZHlEbGcnLCB1J0luc3RhbGwnLCB1J0VuYWJsZVJvbGxiYWNrJywgdSdGYWxzZScsIHUnT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAwIEFORCBQUk9NUFRST0xMQkFDS0NPU1Q9IkQiJywgNCksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J0NhbmNlbCcsIHUnU3Bhd25EaWFsb2cnLCB1J0NhbmNlbERsZycsIHUnMScsIE5vbmUpLAotKHUnVmVyaWZ5UmVtb3ZlRGxnJywgdSdCYWNrJywgdSdOZXdEaWFsb2cnLCB1J01haW50ZW5hbmNlVHlwZURsZycsIHUnMScsIE5vbmUpLAotKHUnVmVyaWZ5UmVtb3ZlRGxnJywgdSdSZW1vdmUnLCB1J1JlbW92ZScsIHUnQWxsJywgdSdPdXRPZkRpc2tTcGFjZSA8PiAxJywgMSksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J1JlbW92ZScsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1J091dE9mRGlza1NwYWNlID0gMSBBTkQgT3V0T2ZOb1JiRGlza1NwYWNlID0gMCBBTkQgUFJPTVBUUk9MTEJBQ0tDT1NUPSJEIicsIDQpLAotKHUnVmVyaWZ5UmVtb3ZlRGxnJywgdSdSZW1vdmUnLCB1J0VuZERpYWxvZycsIHUnUmV0dXJuJywgdSdPdXRPZkRpc2tTcGFjZSA8PiAxJywgMiksCi0odSdWZXJpZnlSZW1vdmVEbGcnLCB1J1JlbW92ZScsIHUnU3Bhd25EaWFsb2cnLCB1J091dE9mRGlza0RsZycsIHUnKE91dE9mRGlza1NwYWNlID0gMSBBTkQgT3V0T2ZOb1JiRGlza1NwYWNlID0gMSkgT1IgKE91dE9mRGlza1NwYWNlID0gMSBBTkQgUFJPTVBUUk9MTEJBQ0tDT1NUPSJGIiknLCA2KSwKLSh1J1ZlcmlmeVJlbW92ZURsZycsIHUnUmVtb3ZlJywgdSdTcGF3bkRpYWxvZycsIHUnT3V0T2ZSYkRpc2tEbGcnLCB1J091dE9mRGlza1NwYWNlID0gMSBBTkQgT3V0T2ZOb1JiRGlza1NwYWNlID0gMCBBTkQgKFBST01QVFJPTExCQUNLQ09TVD0iUCIgT1IgTk9UIFBST01QVFJPTExCQUNLQ09TVCknLCAzKSwKLSh1J1ZlcmlmeVJlbW92ZURsZycsIHUnUmVtb3ZlJywgdSdFbmFibGVSb2xsYmFjaycsIHUnRmFsc2UnLCB1J091dE9mRGlza1NwYWNlID0gMSBBTkQgT3V0T2ZOb1JiRGlza1NwYWNlID0gMCBBTkQgUFJPTVBUUk9MTEJBQ0tDT1NUPSJEIicsIDUpLAotKHUnVmVyaWZ5UmVwYWlyRGxnJywgdSdDYW5jZWwnLCB1J1NwYXduRGlhbG9nJywgdSdDYW5jZWxEbGcnLCB1JzEnLCBOb25lKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnQmFjaycsIHUnTmV3RGlhbG9nJywgdSdNYWludGVuYW5jZVR5cGVEbGcnLCB1JzEnLCBOb25lKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnUmVwYWlyJywgdSdFbmREaWFsb2cnLCB1J1JldHVybicsIHUnT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAwIEFORCBQUk9NUFRST0xMQkFDS0NPU1Q9IkQiJywgNSksCi0odSdWZXJpZnlSZXBhaXJEbGcnLCB1J1JlcGFpcicsIHUnRW5kRGlhbG9nJywgdSdSZXR1cm4nLCB1J091dE9mRGlza1NwYWNlIDw+IDEnLCAzKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnUmVwYWlyJywgdSdTcGF3bkRpYWxvZycsIHUnT3V0T2ZEaXNrRGxnJywgdScoT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAxKSBPUiAoT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBQUk9NUFRST0xMQkFDS0NPU1Q9IkYiKScsIDcpLAotKHUnVmVyaWZ5UmVwYWlyRGxnJywgdSdSZXBhaXInLCB1J1NwYXduRGlhbG9nJywgdSdPdXRPZlJiRGlza0RsZycsIHUnT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAwIEFORCAoUFJPTVBUUk9MTEJBQ0tDT1NUPSJQIiBPUiBOT1QgUFJPTVBUUk9MTEJBQ0tDT1NUKScsIDQpLAotKHUnVmVyaWZ5UmVwYWlyRGxnJywgdSdSZXBhaXInLCB1J0VuYWJsZVJvbGxiYWNrJywgdSdGYWxzZScsIHUnT3V0T2ZEaXNrU3BhY2UgPSAxIEFORCBPdXRPZk5vUmJEaXNrU3BhY2UgPSAwIEFORCBQUk9NUFRST0xMQkFDS0NPU1Q9IkQiJywgNiksCi0odSdWZXJpZnlSZXBhaXJEbGcnLCB1J1JlcGFpcicsIHUnUmVpbnN0YWxsJywgdSdBbGwnLCB1J091dE9mRGlza1NwYWNlIDw+IDEnLCAyKSwKLSh1J1ZlcmlmeVJlcGFpckRsZycsIHUnUmVwYWlyJywgdSdSZWluc3RhbGxNb2RlJywgdSdlY211cycsIHUnT3V0T2ZEaXNrU3BhY2UgPD4gMScsIDEpLAotKHUnV2FpdEZvckNvc3RpbmdEbGcnLCB1J1JldHVybicsIHUnRW5kRGlhbG9nJywgdSdFeGl0JywgdScxJywgTm9uZSksCi0odSdXZWxjb21lRGxnJywgdSdDYW5jZWwnLCB1J1NwYXduRGlhbG9nJywgdSdDYW5jZWxEbGcnLCB1JzEnLCBOb25lKSwKLSh1J1dlbGNvbWVEbGcnLCB1J05leHQnLCB1J05ld0RpYWxvZycsIHUnTGljZW5zZUFncmVlbWVudERsZycsIHUnMScsIE5vbmUpLAotXQotCi1EaWFsb2cgPSBbCi0odSdBZG1pbldlbGNvbWVEbGcnLCA1MCwgNTAsIDM3MCwgMjcwLCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnTmV4dCcsIHUnTmV4dCcsIHUnQ2FuY2VsJyksCi0odSdFeGl0RGlhbG9nJywgNTAsIDUwLCAzNzAsIDI3MCwgMywgdSdbUHJvZHVjdE5hbWVdIFtTZXR1cF0nLCB1J0ZpbmlzaCcsIHUnRmluaXNoJywgdSdGaW5pc2gnKSwKLSh1J0ZhdGFsRXJyb3InLCA1MCwgNTAsIDM3MCwgMjcwLCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnRmluaXNoJywgdSdGaW5pc2gnLCB1J0ZpbmlzaCcpLAotKHUnUHJlcGFyZURsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDEsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdDYW5jZWwnLCB1J0NhbmNlbCcsIHUnQ2FuY2VsJyksCi0odSdQcm9ncmVzc0RsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDEsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdDYW5jZWwnLCB1J0NhbmNlbCcsIHUnQ2FuY2VsJyksCi0odSdVc2VyRXhpdCcsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdGaW5pc2gnLCB1J0ZpbmlzaCcsIHUnRmluaXNoJyksCi0odSdBZG1pbkJyb3dzZURsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdQYXRoRWRpdCcsIHUnT0snLCB1J0NhbmNlbCcpLAotKHUnQWRtaW5JbnN0YWxsUG9pbnREbGcnLCA1MCwgNTAsIDM3MCwgMjcwLCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnVGV4dCcsIHUnTmV4dCcsIHUnQ2FuY2VsJyksCi0odSdBZG1pblJlZ2lzdHJhdGlvbkRsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdPcmdhbml6YXRpb25MYWJlbCcsIHUnTmV4dCcsIHUnQ2FuY2VsJyksCi0odSdCcm93c2VEbGcnLCA1MCwgNTAsIDM3MCwgMjcwLCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnUGF0aEVkaXQnLCB1J09LJywgdSdDYW5jZWwnKSwKLSh1J0NhbmNlbERsZycsIDUwLCAxMCwgMjYwLCA4NSwgMywgdSdbUHJvZHVjdE5hbWVdIFtTZXR1cF0nLCB1J05vJywgdSdObycsIHUnTm8nKSwKLSh1J0N1c3RvbWl6ZURsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDM1LCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnVHJlZScsIHUnTmV4dCcsIHUnQ2FuY2VsJyksCi0odSdEaXNrQ29zdERsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdPSycsIHUnT0snLCB1J09LJyksCi0odSdFcnJvckRsZycsIDUwLCAxMCwgMjcwLCAxMDUsIDY1NTM5LCB1J0luc3RhbGxlciBJbmZvcm1hdGlvbicsIHUnRXJyb3JUZXh0JywgTm9uZSwgTm9uZSksCi0odSdGaWxlc0luVXNlJywgNTAsIDUwLCAzNzAsIDI3MCwgMTksIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdSZXRyeScsIHUnUmV0cnknLCB1J1JldHJ5JyksCi0odSdMaWNlbnNlQWdyZWVtZW50RGxnJywgNTAsIDUwLCAzNzAsIDI3MCwgMywgdSdbUHJvZHVjdE5hbWVdIExpY2Vuc2UgQWdyZWVtZW50JywgdSdCdXR0b25zJywgdSdOZXh0JywgdSdDYW5jZWwnKSwKLSh1J01haW50ZW5hbmNlVHlwZURsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdDaGFuZ2VMYWJlbCcsIHUnQ2hhbmdlQnV0dG9uJywgdSdDYW5jZWwnKSwKLSh1J01haW50ZW5hbmNlV2VsY29tZURsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdOZXh0JywgdSdOZXh0JywgdSdDYW5jZWwnKSwKLSh1J091dE9mRGlza0RsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdPSycsIHUnT0snLCB1J09LJyksCi0odSdPdXRPZlJiRGlza0RsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdObycsIHUnTm8nLCB1J05vJyksCi0odSdSZXN1bWVEbGcnLCA1MCwgNTAsIDM3MCwgMjcwLCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnSW5zdGFsbCcsIHUnSW5zdGFsbCcsIHUnQ2FuY2VsJyksCi0odSdTZXR1cFR5cGVEbGcnLCA1MCwgNTAsIDM3MCwgMjcwLCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnVHlwaWNhbExhYmVsJywgdSdUeXBpY2FsQnV0dG9uJywgdSdDYW5jZWwnKSwKLSh1J1VzZXJSZWdpc3RyYXRpb25EbGcnLCA1MCwgNTAsIDM3MCwgMjcwLCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnTmFtZUxhYmVsJywgdSdOZXh0JywgdSdDYW5jZWwnKSwKLSh1J1ZlcmlmeVJlYWR5RGxnJywgNTAsIDUwLCAzNzAsIDI3MCwgMzUsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdJbnN0YWxsJywgdSdJbnN0YWxsJywgdSdDYW5jZWwnKSwKLSh1J1ZlcmlmeVJlbW92ZURsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDM1LCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnQmFjaycsIHUnQmFjaycsIHUnQ2FuY2VsJyksCi0odSdWZXJpZnlSZXBhaXJEbGcnLCA1MCwgNTAsIDM3MCwgMjcwLCAzNSwgdSdbUHJvZHVjdE5hbWVdIFtTZXR1cF0nLCB1J1JlcGFpcicsIHUnUmVwYWlyJywgdSdDYW5jZWwnKSwKLSh1J1dhaXRGb3JDb3N0aW5nRGxnJywgNTAsIDEwLCAyNjAsIDg1LCAzLCB1J1tQcm9kdWN0TmFtZV0gW1NldHVwXScsIHUnUmV0dXJuJywgdSdSZXR1cm4nLCB1J1JldHVybicpLAotKHUnV2VsY29tZURsZycsIDUwLCA1MCwgMzcwLCAyNzAsIDMsIHUnW1Byb2R1Y3ROYW1lXSBbU2V0dXBdJywgdSdOZXh0JywgdSdOZXh0JywgdSdDYW5jZWwnKSwKLV0KLQotRXZlbnRNYXBwaW5nID0gWwotKHUnUHJlcGFyZURsZycsIHUnQWN0aW9uRGF0YScsIHUnQWN0aW9uRGF0YScsIHUnVGV4dCcpLAotKHUnUHJlcGFyZURsZycsIHUnQWN0aW9uVGV4dCcsIHUnQWN0aW9uVGV4dCcsIHUnVGV4dCcpLAotKHUnUHJvZ3Jlc3NEbGcnLCB1J0FjdGlvblRleHQnLCB1J0FjdGlvblRleHQnLCB1J1RleHQnKSwKLSh1J1Byb2dyZXNzRGxnJywgdSdQcm9ncmVzc0JhcicsIHUnU2V0UHJvZ3Jlc3MnLCB1J1Byb2dyZXNzJyksCi0odSdBZG1pbkJyb3dzZURsZycsIHUnRGlyZWN0b3J5Q29tYm8nLCB1J0lnbm9yZUNoYW5nZScsIHUnSWdub3JlQ2hhbmdlJyksCi0odSdCcm93c2VEbGcnLCB1J0RpcmVjdG9yeUNvbWJvJywgdSdJZ25vcmVDaGFuZ2UnLCB1J0lnbm9yZUNoYW5nZScpLAotKHUnQ3VzdG9taXplRGxnJywgdSdOZXh0JywgdSdTZWxlY3Rpb25Ob0l0ZW1zJywgdSdFbmFibGVkJyksCi0odSdDdXN0b21pemVEbGcnLCB1J1Jlc2V0JywgdSdTZWxlY3Rpb25Ob0l0ZW1zJywgdSdFbmFibGVkJyksCi0odSdDdXN0b21pemVEbGcnLCB1J0Rpc2tDb3N0JywgdSdTZWxlY3Rpb25Ob0l0ZW1zJywgdSdFbmFibGVkJyksCi0odSdDdXN0b21pemVEbGcnLCB1J0l0ZW1EZXNjcmlwdGlvbicsIHUnU2VsZWN0aW9uRGVzY3JpcHRpb24nLCB1J1RleHQnKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnSXRlbVNpemUnLCB1J1NlbGVjdGlvblNpemUnLCB1J1RleHQnKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnTG9jYXRpb24nLCB1J1NlbGVjdGlvblBhdGgnLCB1J1RleHQnKSwKLSh1J0N1c3RvbWl6ZURsZycsIHUnTG9jYXRpb24nLCB1J1NlbGVjdGlvblBhdGhPbicsIHUnVmlzaWJsZScpLAotKHUnQ3VzdG9taXplRGxnJywgdSdMb2NhdGlvbkxhYmVsJywgdSdTZWxlY3Rpb25QYXRoT24nLCB1J1Zpc2libGUnKSwKLV0KLQotSW5zdGFsbEV4ZWN1dGVTZXF1ZW5jZSA9IFsKLSh1J0luc3RhbGxWYWxpZGF0ZScsIE5vbmUsIDE0MDApLAotKHUnSW5zdGFsbEluaXRpYWxpemUnLCBOb25lLCAxNTAwKSwKLSh1J0luc3RhbGxGaW5hbGl6ZScsIE5vbmUsIDY2MDApLAotKHUnSW5zdGFsbEZpbGVzJywgTm9uZSwgNDAwMCksCi0odSdGaWxlQ29zdCcsIE5vbmUsIDkwMCksCi0odSdDb3N0SW5pdGlhbGl6ZScsIE5vbmUsIDgwMCksCi0odSdDb3N0RmluYWxpemUnLCBOb25lLCAxMDAwKSwKLSh1J0NyZWF0ZVNob3J0Y3V0cycsIE5vbmUsIDQ1MDApLAotKHUnUHVibGlzaENvbXBvbmVudHMnLCBOb25lLCA2MjAwKSwKLSh1J1B1Ymxpc2hGZWF0dXJlcycsIE5vbmUsIDYzMDApLAotKHUnUHVibGlzaFByb2R1Y3QnLCBOb25lLCA2NDAwKSwKLSh1J1JlZ2lzdGVyQ2xhc3NJbmZvJywgTm9uZSwgNDYwMCksCi0odSdSZWdpc3RlckV4dGVuc2lvbkluZm8nLCBOb25lLCA0NzAwKSwKLSh1J1JlZ2lzdGVyTUlNRUluZm8nLCBOb25lLCA0OTAwKSwKLSh1J1JlZ2lzdGVyUHJvZ0lkSW5mbycsIE5vbmUsIDQ4MDApLAotKHUnVmFsaWRhdGVQcm9kdWN0SUQnLCBOb25lLCA3MDApLAotKHUnQWxsb2NhdGVSZWdpc3RyeVNwYWNlJywgdSdOT1QgSW5zdGFsbGVkJywgMTU1MCksCi0odSdBcHBTZWFyY2gnLCBOb25lLCA0MDApLAotKHUnQmluZEltYWdlJywgTm9uZSwgNDMwMCksCi0odSdDQ1BTZWFyY2gnLCB1J05PVCBJbnN0YWxsZWQnLCA1MDApLAotKHUnQ3JlYXRlRm9sZGVycycsIE5vbmUsIDM3MDApLAotKHUnRGVsZXRlU2VydmljZXMnLCB1J1ZlcnNpb25OVCcsIDIwMDApLAotKHUnRHVwbGljYXRlRmlsZXMnLCBOb25lLCA0MjEwKSwKLSh1J0ZpbmRSZWxhdGVkUHJvZHVjdHMnLCBOb25lLCAyMDApLAotKHUnSW5zdGFsbE9EQkMnLCBOb25lLCA1NDAwKSwKLSh1J0luc3RhbGxTZXJ2aWNlcycsIHUnVmVyc2lvbk5UJywgNTgwMCksCi0odSdMYXVuY2hDb25kaXRpb25zJywgTm9uZSwgMTAwKSwKLSh1J01pZ3JhdGVGZWF0dXJlU3RhdGVzJywgTm9uZSwgMTIwMCksCi0odSdNb3ZlRmlsZXMnLCBOb25lLCAzODAwKSwKLSh1J1BhdGNoRmlsZXMnLCBOb25lLCA0MDkwKSwKLSh1J1Byb2Nlc3NDb21wb25lbnRzJywgTm9uZSwgMTYwMCksCi0odSdSZWdpc3RlckNvbVBsdXMnLCBOb25lLCA1NzAwKSwKLSh1J1JlZ2lzdGVyRm9udHMnLCBOb25lLCA1MzAwKSwKLSh1J1JlZ2lzdGVyUHJvZHVjdCcsIE5vbmUsIDYxMDApLAotKHUnUmVnaXN0ZXJUeXBlTGlicmFyaWVzJywgTm9uZSwgNTUwMCksCi0odSdSZWdpc3RlclVzZXInLCBOb25lLCA2MDAwKSwKLSh1J1JlbW92ZUR1cGxpY2F0ZUZpbGVzJywgTm9uZSwgMzQwMCksCi0odSdSZW1vdmVFbnZpcm9ubWVudFN0cmluZ3MnLCBOb25lLCAzMzAwKSwKLSh1J1JlbW92ZUV4aXN0aW5nUHJvZHVjdHMnLCBOb25lLCA2NzAwKSwKLSh1J1JlbW92ZUZpbGVzJywgTm9uZSwgMzUwMCksCi0odSdSZW1vdmVGb2xkZXJzJywgTm9uZSwgMzYwMCksCi0odSdSZW1vdmVJbmlWYWx1ZXMnLCBOb25lLCAzMTAwKSwKLSh1J1JlbW92ZU9EQkMnLCBOb25lLCAyNDAwKSwKLSh1J1JlbW92ZVJlZ2lzdHJ5VmFsdWVzJywgTm9uZSwgMjYwMCksCi0odSdSZW1vdmVTaG9ydGN1dHMnLCBOb25lLCAzMjAwKSwKLSh1J1JNQ0NQU2VhcmNoJywgdSdOT1QgSW5zdGFsbGVkJywgNjAwKSwKLSh1J1NlbGZSZWdNb2R1bGVzJywgTm9uZSwgNTYwMCksCi0odSdTZWxmVW5yZWdNb2R1bGVzJywgTm9uZSwgMjIwMCksCi0odSdTZXRPREJDRm9sZGVycycsIE5vbmUsIDExMDApLAotKHUnU3RhcnRTZXJ2aWNlcycsIHUnVmVyc2lvbk5UJywgNTkwMCksCi0odSdTdG9wU2VydmljZXMnLCB1J1ZlcnNpb25OVCcsIDE5MDApLAotKHUnVW5wdWJsaXNoQ29tcG9uZW50cycsIE5vbmUsIDE3MDApLAotKHUnVW5wdWJsaXNoRmVhdHVyZXMnLCBOb25lLCAxODAwKSwKLSh1J1VucmVnaXN0ZXJDbGFzc0luZm8nLCBOb25lLCAyNzAwKSwKLSh1J1VucmVnaXN0ZXJDb21QbHVzJywgTm9uZSwgMjEwMCksCi0odSdVbnJlZ2lzdGVyRXh0ZW5zaW9uSW5mbycsIE5vbmUsIDI4MDApLAotKHUnVW5yZWdpc3RlckZvbnRzJywgTm9uZSwgMjUwMCksCi0odSdVbnJlZ2lzdGVyTUlNRUluZm8nLCBOb25lLCAzMDAwKSwKLSh1J1VucmVnaXN0ZXJQcm9nSWRJbmZvJywgTm9uZSwgMjkwMCksCi0odSdVbnJlZ2lzdGVyVHlwZUxpYnJhcmllcycsIE5vbmUsIDIzMDApLAotKHUnV3JpdGVFbnZpcm9ubWVudFN0cmluZ3MnLCBOb25lLCA1MjAwKSwKLSh1J1dyaXRlSW5pVmFsdWVzJywgTm9uZSwgNTEwMCksCi0odSdXcml0ZVJlZ2lzdHJ5VmFsdWVzJywgTm9uZSwgNTAwMCksCi1dCi0KLUluc3RhbGxVSVNlcXVlbmNlID0gWwotIyh1J0ZpbGVDb3N0JywgTm9uZSwgOTAwKSwKLSModSdDb3N0SW5pdGlhbGl6ZScsIE5vbmUsIDgwMCksCi0jKHUnQ29zdEZpbmFsaXplJywgTm9uZSwgMTAwMCksCi0jKHUnRXhlY3V0ZUFjdGlvbicsIE5vbmUsIDEzMDApLAotIyh1J0V4aXREaWFsb2cnLCBOb25lLCAtMSksCi0jKHUnRmF0YWxFcnJvcicsIE5vbmUsIC0zKSwKLSh1J1ByZXBhcmVEbGcnLCBOb25lLCAxNDApLAotKHUnUHJvZ3Jlc3NEbGcnLCBOb25lLCAxMjgwKSwKLSModSdVc2VyRXhpdCcsIE5vbmUsIC0yKSwKLSh1J01haW50ZW5hbmNlV2VsY29tZURsZycsIHUnSW5zdGFsbGVkIEFORCBOT1QgUkVTVU1FIEFORCBOT1QgUHJlc2VsZWN0ZWQnLCAxMjUwKSwKLSh1J1Jlc3VtZURsZycsIHUnSW5zdGFsbGVkIEFORCAoUkVTVU1FIE9SIFByZXNlbGVjdGVkKScsIDEyNDApLAotKHUnV2VsY29tZURsZycsIHUnTk9UIEluc3RhbGxlZCcsIDEyMzApLAotIyh1J0FwcFNlYXJjaCcsIE5vbmUsIDQwMCksCi0jKHUnQ0NQU2VhcmNoJywgdSdOT1QgSW5zdGFsbGVkJywgNTAwKSwKLSModSdGaW5kUmVsYXRlZFByb2R1Y3RzJywgTm9uZSwgMjAwKSwKLSModSdMYXVuY2hDb25kaXRpb25zJywgTm9uZSwgMTAwKSwKLSModSdNaWdyYXRlRmVhdHVyZVN0YXRlcycsIE5vbmUsIDEyMDApLAotIyh1J1JNQ0NQU2VhcmNoJywgdSdOT1QgSW5zdGFsbGVkJywgNjAwKSwKLV0KLQotTGlzdFZpZXcgPSBbCi1dCi0KLVJhZGlvQnV0dG9uID0gWwotKHUnSUFncmVlJywgMSwgdSdZZXMnLCA1LCAwLCAyNTAsIDE1LCB1J3tcXERsZ0ZvbnQ4fUkgJmFjY2VwdCB0aGUgdGVybXMgaW4gdGhlIExpY2Vuc2UgQWdyZWVtZW50JywgTm9uZSksCi0odSdJQWdyZWUnLCAyLCB1J05vJywgNSwgMjAsIDI1MCwgMTUsIHUne1xcRGxnRm9udDh9SSAmZG8gbm90IGFjY2VwdCB0aGUgdGVybXMgaW4gdGhlIExpY2Vuc2UgQWdyZWVtZW50JywgTm9uZSksCi1dCi0KLVRleHRTdHlsZSA9IFsKLSh1J0RsZ0ZvbnQ4JywgdSdUYWhvbWEnLCA4LCBOb25lLCAwKSwKLSh1J0RsZ0ZvbnRCb2xkOCcsIHUnVGFob21hJywgOCwgTm9uZSwgMSksCi0odSdWZXJkYW5hQm9sZDEzJywgdSdWZXJkYW5hJywgMTMsIE5vbmUsIDEpLAotXQotCi1VSVRleHQgPSBbCi0odSdBYnNlbnRQYXRoJywgTm9uZSksCi0odSdieXRlcycsIHUnYnl0ZXMnKSwKLSh1J0dCJywgdSdHQicpLAotKHUnS0InLCB1J0tCJyksCi0odSdNQicsIHUnTUInKSwKLSh1J01lbnVBYnNlbnQnLCB1J0VudGlyZSBmZWF0dXJlIHdpbGwgYmUgdW5hdmFpbGFibGUnKSwKLSh1J01lbnVBZHZlcnRpc2UnLCB1J0ZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgd2hlbiByZXF1aXJlZCcpLAotKHUnTWVudUFsbENEJywgdSdFbnRpcmUgZmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZCB0byBydW4gZnJvbSBDRCcpLAotKHUnTWVudUFsbExvY2FsJywgdSdFbnRpcmUgZmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZCBvbiBsb2NhbCBoYXJkIGRyaXZlJyksCi0odSdNZW51QWxsTmV0d29yaycsIHUnRW50aXJlIGZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgdG8gcnVuIGZyb20gbmV0d29yaycpLAotKHUnTWVudUNEJywgdSdXaWxsIGJlIGluc3RhbGxlZCB0byBydW4gZnJvbSBDRCcpLAotKHUnTWVudUxvY2FsJywgdSdXaWxsIGJlIGluc3RhbGxlZCBvbiBsb2NhbCBoYXJkIGRyaXZlJyksCi0odSdNZW51TmV0d29yaycsIHUnV2lsbCBiZSBpbnN0YWxsZWQgdG8gcnVuIGZyb20gbmV0d29yaycpLAotKHUnU2NyaXB0SW5Qcm9ncmVzcycsIHUnR2F0aGVyaW5nIHJlcXVpcmVkIGluZm9ybWF0aW9uLi4uJyksCi0odSdTZWxBYnNlbnRBYnNlbnQnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIHJlbWFpbiB1bmluc3RhbGxlZCcpLAotKHUnU2VsQWJzZW50QWR2ZXJ0aXNlJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBzZXQgdG8gYmUgaW5zdGFsbGVkIHdoZW4gcmVxdWlyZWQnKSwKLSh1J1NlbEFic2VudENEJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgdG8gcnVuIGZyb20gQ0QnKSwKLSh1J1NlbEFic2VudExvY2FsJywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQgb24gdGhlIGxvY2FsIGhhcmQgZHJpdmUnKSwKLSh1J1NlbEFic2VudE5ldHdvcmsnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZCB0byBydW4gZnJvbSB0aGUgbmV0d29yaycpLAotKHUnU2VsQWR2ZXJ0aXNlQWJzZW50JywgdSdUaGlzIGZlYXR1cmUgd2lsbCBiZWNvbWUgdW5hdmFpbGFibGUnKSwKLSh1J1NlbEFkdmVydGlzZUFkdmVydGlzZScsIHUnV2lsbCBiZSBpbnN0YWxsZWQgd2hlbiByZXF1aXJlZCcpLAotKHUnU2VsQWR2ZXJ0aXNlQ0QnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIGF2YWlsYWJsZSB0byBydW4gZnJvbSBDRCcpLAotKHUnU2VsQWR2ZXJ0aXNlTG9jYWwnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZCBvbiB5b3VyIGxvY2FsIGhhcmQgZHJpdmUnKSwKLSh1J1NlbEFkdmVydGlzZU5ldHdvcmsnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIGF2YWlsYWJsZSB0byBydW4gZnJvbSB0aGUgbmV0d29yaycpLAotKHUnU2VsQ0RBYnNlbnQnLCB1IlRoaXMgZmVhdHVyZSB3aWxsIGJlIHVuaW5zdGFsbGVkIGNvbXBsZXRlbHksIHlvdSB3b24ndCBiZSBhYmxlIHRvIHJ1biBpdCBmcm9tIENEIiksCi0odSdTZWxDREFkdmVydGlzZScsIHUnVGhpcyBmZWF0dXJlIHdpbGwgY2hhbmdlIGZyb20gcnVuIGZyb20gQ0Qgc3RhdGUgdG8gc2V0IHRvIGJlIGluc3RhbGxlZCB3aGVuIHJlcXVpcmVkJyksCi0odSdTZWxDRENEJywgdSdUaGlzIGZlYXR1cmUgd2lsbCByZW1haW4gdG8gYmUgcnVuIGZyb20gQ0QnKSwKLSh1J1NlbENETG9jYWwnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGNoYW5nZSBmcm9tIHJ1biBmcm9tIENEIHN0YXRlIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgbG9jYWwgaGFyZCBkcml2ZScpLAotKHUnU2VsQ2hpbGRDb3N0TmVnJywgdSdUaGlzIGZlYXR1cmUgZnJlZXMgdXAgWzFdIG9uIHlvdXIgaGFyZCBkcml2ZS4nKSwKLSh1J1NlbENoaWxkQ29zdFBvcycsIHUnVGhpcyBmZWF0dXJlIHJlcXVpcmVzIFsxXSBvbiB5b3VyIGhhcmQgZHJpdmUuJyksCi0odSdTZWxDb3N0UGVuZGluZycsIHUnQ29tcGlsaW5nIGNvc3QgZm9yIHRoaXMgZmVhdHVyZS4uLicpLAotKHUnU2VsTG9jYWxBYnNlbnQnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIGNvbXBsZXRlbHkgcmVtb3ZlZCcpLAotKHUnU2VsTG9jYWxBZHZlcnRpc2UnLCB1J1RoaXMgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB5b3VyIGxvY2FsIGhhcmQgZHJpdmUsIGJ1dCB3aWxsIGJlIHNldCB0byBiZSBpbnN0YWxsZWQgd2hlbiByZXF1aXJlZCcpLAotKHUnU2VsTG9jYWxDRCcsIHUnVGhpcyBmZWF0dXJlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHlvdXIgbG9jYWwgaGFyZCBkcml2ZSwgYnV0IHdpbGwgYmUgc3RpbGwgYXZhaWxhYmxlIHRvIHJ1biBmcm9tIENEJyksCi0odSdTZWxMb2NhbExvY2FsJywgdSdUaGlzIGZlYXR1cmUgd2lsbCByZW1haW4gb24geW91IGxvY2FsIGhhcmQgZHJpdmUnKSwKLSh1J1NlbExvY2FsTmV0d29yaycsIHUnVGhpcyBmZWF0dXJlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHlvdXIgbG9jYWwgaGFyZCBkcml2ZSwgYnV0IHdpbGwgYmUgc3RpbGwgYXZhaWxhYmxlIHRvIHJ1biBmcm9tIHRoZSBuZXR3b3JrJyksCi0odSdTZWxOZXR3b3JrQWJzZW50JywgdSJUaGlzIGZlYXR1cmUgd2lsbCBiZSB1bmluc3RhbGxlZCBjb21wbGV0ZWx5LCB5b3Ugd29uJ3QgYmUgYWJsZSB0byBydW4gaXQgZnJvbSB0aGUgbmV0d29yayIpLAotKHUnU2VsTmV0d29ya0FkdmVydGlzZScsIHUnVGhpcyBmZWF0dXJlIHdpbGwgY2hhbmdlIGZyb20gcnVuIGZyb20gbmV0d29yayBzdGF0ZSB0byBzZXQgdG8gYmUgaW5zdGFsbGVkIHdoZW4gcmVxdWlyZWQnKSwKLSh1J1NlbE5ldHdvcmtMb2NhbCcsIHUnVGhpcyBmZWF0dXJlIHdpbGwgY2hhbmdlIGZyb20gcnVuIGZyb20gbmV0d29yayBzdGF0ZSB0byBiZSBpbnN0YWxsZWQgb24gdGhlIGxvY2FsIGhhcmQgZHJpdmUnKSwKLSh1J1NlbE5ldHdvcmtOZXR3b3JrJywgdSdUaGlzIGZlYXR1cmUgd2lsbCByZW1haW4gdG8gYmUgcnVuIGZyb20gdGhlIG5ldHdvcmsnKSwKLSh1J1NlbFBhcmVudENvc3ROZWdOZWcnLCB1J1RoaXMgZmVhdHVyZSBmcmVlcyB1cCBbMV0gb24geW91ciBoYXJkIGRyaXZlLiBJdCBoYXMgWzJdIG9mIFszXSBzdWJmZWF0dXJlcyBzZWxlY3RlZC4gVGhlIHN1YmZlYXR1cmVzIGZyZWUgdXAgWzRdIG9uIHlvdXIgaGFyZCBkcml2ZS4nKSwKLSh1J1NlbFBhcmVudENvc3ROZWdQb3MnLCB1J1RoaXMgZmVhdHVyZSBmcmVlcyB1cCBbMV0gb24geW91ciBoYXJkIGRyaXZlLiBJdCBoYXMgWzJdIG9mIFszXSBzdWJmZWF0dXJlcyBzZWxlY3RlZC4gVGhlIHN1YmZlYXR1cmVzIHJlcXVpcmUgWzRdIG9uIHlvdXIgaGFyZCBkcml2ZS4nKSwKLSh1J1NlbFBhcmVudENvc3RQb3NOZWcnLCB1J1RoaXMgZmVhdHVyZSByZXF1aXJlcyBbMV0gb24geW91ciBoYXJkIGRyaXZlLiBJdCBoYXMgWzJdIG9mIFszXSBzdWJmZWF0dXJlcyBzZWxlY3RlZC4gVGhlIHN1YmZlYXR1cmVzIGZyZWUgdXAgWzRdIG9uIHlvdXIgaGFyZCBkcml2ZS4nKSwKLSh1J1NlbFBhcmVudENvc3RQb3NQb3MnLCB1J1RoaXMgZmVhdHVyZSByZXF1aXJlcyBbMV0gb24geW91ciBoYXJkIGRyaXZlLiBJdCBoYXMgWzJdIG9mIFszXSBzdWJmZWF0dXJlcyBzZWxlY3RlZC4gVGhlIHN1YmZlYXR1cmVzIHJlcXVpcmUgWzRdIG9uIHlvdXIgaGFyZCBkcml2ZS4nKSwKLSh1J1RpbWVSZW1haW5pbmcnLCB1J1RpbWUgcmVtYWluaW5nOiB7WzFdIG1pbnV0ZXMgfXtbMl0gc2Vjb25kc30nKSwKLSh1J1ZvbHVtZUNvc3RBdmFpbGFibGUnLCB1J0F2YWlsYWJsZScpLAotKHUnVm9sdW1lQ29zdERpZmZlcmVuY2UnLCB1J0RpZmZlcmVuY2UnKSwKLSh1J1ZvbHVtZUNvc3RSZXF1aXJlZCcsIHUnUmVxdWlyZWQnKSwKLSh1J1ZvbHVtZUNvc3RTaXplJywgdSdEaXNrIFNpemUnKSwKLSh1J1ZvbHVtZUNvc3RWb2x1bWUnLCB1J1ZvbHVtZScpLAotXQotCi1fVmFsaWRhdGlvbiA9IFsKLSh1J0FkbWluRXhlY3V0ZVNlcXVlbmNlJywgdSdBY3Rpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgYWN0aW9uIHRvIGludm9rZSwgZWl0aGVyIGluIHRoZSBlbmdpbmUgb3IgdGhlIGhhbmRsZXIgRExMLicpLAotKHUnQWRtaW5FeGVjdXRlU2VxdWVuY2UnLCB1J1NlcXVlbmNlJywgdSdZJywgLTQsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J051bWJlciB0aGF0IGRldGVybWluZXMgdGhlIHNvcnQgb3JkZXIgaW4gd2hpY2ggdGhlIGFjdGlvbnMgYXJlIHRvIGJlIGV4ZWN1dGVkLiAgTGVhdmUgYmxhbmsgdG8gc3VwcHJlc3MgYWN0aW9uLicpLAotKHUnQWRtaW5FeGVjdXRlU2VxdWVuY2UnLCB1J0NvbmRpdGlvbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQ29uZGl0aW9uJywgTm9uZSwgdSdPcHRpb25hbCBleHByZXNzaW9uIHdoaWNoIHNraXBzIHRoZSBhY3Rpb24gaWYgZXZhbHVhdGVzIHRvIGV4cEZhbHNlLklmIHRoZSBleHByZXNzaW9uIHN5bnRheCBpcyBpbnZhbGlkLCB0aGUgZW5naW5lIHdpbGwgdGVybWluYXRlLCByZXR1cm5pbmcgaWVzQmFkQWN0aW9uRGF0YS4nKSwKLSh1J0FkbWluVUlTZXF1ZW5jZScsIHUnQWN0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdOYW1lIG9mIGFjdGlvbiB0byBpbnZva2UsIGVpdGhlciBpbiB0aGUgZW5naW5lIG9yIHRoZSBoYW5kbGVyIERMTC4nKSwKLSh1J0FkbWluVUlTZXF1ZW5jZScsIHUnU2VxdWVuY2UnLCB1J1knLCAtNCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnTnVtYmVyIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc29ydCBvcmRlciBpbiB3aGljaCB0aGUgYWN0aW9ucyBhcmUgdG8gYmUgZXhlY3V0ZWQuICBMZWF2ZSBibGFuayB0byBzdXBwcmVzcyBhY3Rpb24uJyksCi0odSdBZG1pblVJU2VxdWVuY2UnLCB1J0NvbmRpdGlvbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQ29uZGl0aW9uJywgTm9uZSwgdSdPcHRpb25hbCBleHByZXNzaW9uIHdoaWNoIHNraXBzIHRoZSBhY3Rpb24gaWYgZXZhbHVhdGVzIHRvIGV4cEZhbHNlLklmIHRoZSBleHByZXNzaW9uIHN5bnRheCBpcyBpbnZhbGlkLCB0aGUgZW5naW5lIHdpbGwgdGVybWluYXRlLCByZXR1cm5pbmcgaWVzQmFkQWN0aW9uRGF0YS4nKSwKLSh1J0NvbmRpdGlvbicsIHUnQ29uZGl0aW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdDb25kaXRpb24nLCBOb25lLCB1J0V4cHJlc3Npb24gZXZhbHVhdGVkIHRvIGRldGVybWluZSBpZiBMZXZlbCBpbiB0aGUgRmVhdHVyZSB0YWJsZSBpcyB0byBjaGFuZ2UuJyksCi0odSdDb25kaXRpb24nLCB1J0ZlYXR1cmVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGZWF0dXJlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZWZlcmVuY2UgdG8gYSBGZWF0dXJlIGVudHJ5IGluIEZlYXR1cmUgdGFibGUuJyksCi0odSdDb25kaXRpb24nLCB1J0xldmVsJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnTmV3IHNlbGVjdGlvbiBMZXZlbCB0byBzZXQgaW4gRmVhdHVyZSB0YWJsZSBpZiBDb25kaXRpb24gZXZhbHVhdGVzIHRvIFRSVUUuJyksCi0odSdBZHZ0RXhlY3V0ZVNlcXVlbmNlJywgdSdBY3Rpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgYWN0aW9uIHRvIGludm9rZSwgZWl0aGVyIGluIHRoZSBlbmdpbmUgb3IgdGhlIGhhbmRsZXIgRExMLicpLAotKHUnQWR2dEV4ZWN1dGVTZXF1ZW5jZScsIHUnU2VxdWVuY2UnLCB1J1knLCAtNCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnTnVtYmVyIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc29ydCBvcmRlciBpbiB3aGljaCB0aGUgYWN0aW9ucyBhcmUgdG8gYmUgZXhlY3V0ZWQuICBMZWF2ZSBibGFuayB0byBzdXBwcmVzcyBhY3Rpb24uJyksCi0odSdBZHZ0RXhlY3V0ZVNlcXVlbmNlJywgdSdDb25kaXRpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0NvbmRpdGlvbicsIE5vbmUsIHUnT3B0aW9uYWwgZXhwcmVzc2lvbiB3aGljaCBza2lwcyB0aGUgYWN0aW9uIGlmIGV2YWx1YXRlcyB0byBleHBGYWxzZS5JZiB0aGUgZXhwcmVzc2lvbiBzeW50YXggaXMgaW52YWxpZCwgdGhlIGVuZ2luZSB3aWxsIHRlcm1pbmF0ZSwgcmV0dXJuaW5nIGllc0JhZEFjdGlvbkRhdGEuJyksCi0odSdCQkNvbnRyb2wnLCB1J1R5cGUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSB0eXBlIG9mIHRoZSBjb250cm9sLicpLAotKHUnQkJDb250cm9sJywgdSdCQkNvbnRyb2wnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgdGhlIGNvbnRyb2wuIFRoaXMgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBiaWxsYm9hcmQsIGJ1dCBjYW4gcmVwZWF0IG9uIGRpZmZlcmVudCBiaWxsYm9hcmQuJyksCi0odSdCQkNvbnRyb2wnLCB1J0JpbGxib2FyZF8nLCB1J04nLCBOb25lLCBOb25lLCB1J0JpbGxib2FyZCcsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRXh0ZXJuYWwga2V5IHRvIHRoZSBCaWxsYm9hcmQgdGFibGUsIG5hbWUgb2YgdGhlIGJpbGxib2FyZC4nKSwKLSh1J0JCQ29udHJvbCcsIHUnWCcsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0hvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgY29udHJvbC4nKSwKLSh1J0JCQ29udHJvbCcsIHUnWScsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1ZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIGNvbnRyb2wuJyksCi0odSdCQkNvbnRyb2wnLCB1J1dpZHRoJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnV2lkdGggb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgY29udHJvbC4nKSwKLSh1J0JCQ29udHJvbCcsIHUnSGVpZ2h0JywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIGNvbnRyb2wuJyksCi0odSdCQkNvbnRyb2wnLCB1J0F0dHJpYnV0ZXMnLCB1J1knLCAwLCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0EgMzItYml0IHdvcmQgdGhhdCBzcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZSBmbGFncyB0byBiZSBhcHBsaWVkIHRvIHRoaXMgY29udHJvbC4nKSwKLSh1J0JCQ29udHJvbCcsIHUnVGV4dCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnQSBzdHJpbmcgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgdGV4dCBjb250YWluZWQgd2l0aGluIGEgY29udHJvbCAoaWYgYXBwcm9wcmlhdGUpLicpLAotKHUnQmlsbGJvYXJkJywgdSdBY3Rpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSBuYW1lIG9mIGFuIGFjdGlvbi4gVGhlIGJpbGxib2FyZCBpcyBkaXNwbGF5ZWQgZHVyaW5nIHRoZSBwcm9ncmVzcyBtZXNzYWdlcyByZWNlaXZlZCBmcm9tIHRoaXMgYWN0aW9uLicpLAotKHUnQmlsbGJvYXJkJywgdSdCaWxsYm9hcmQnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgdGhlIGJpbGxib2FyZC4nKSwKLSh1J0JpbGxib2FyZCcsIHUnRmVhdHVyZV8nLCB1J04nLCBOb25lLCBOb25lLCB1J0ZlYXR1cmUnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0FuIGV4dGVybmFsIGtleSB0byB0aGUgRmVhdHVyZSBUYWJsZS4gVGhlIGJpbGxib2FyZCBpcyBzaG93biBvbmx5IGlmIHRoaXMgZmVhdHVyZSBpcyBiZWluZyBpbnN0YWxsZWQuJyksCi0odSdCaWxsYm9hcmQnLCB1J09yZGVyaW5nJywgdSdZJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQSBwb3NpdGl2ZSBpbnRlZ2VyLiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGJpbGxib2FyZCBjb3JyZXNwb25kaW5nIHRvIGFuIGFjdGlvbiB0aGV5IHdpbGwgYmUgc2hvd24gaW4gdGhlIG9yZGVyIGRlZmluZWQgYnkgdGhpcyBjb2x1bW4uJyksCi0odSdCaW5hcnknLCB1J05hbWUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1VuaXF1ZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGJpbmFyeSBkYXRhLicpLAotKHUnQmluYXJ5JywgdSdEYXRhJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdCaW5hcnknLCBOb25lLCB1J1RoZSB1bmZvcm1hdHRlZCBiaW5hcnkgZGF0YS4nKSwKLSh1J0NoZWNrQm94JywgdSdQcm9wZXJ0eScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQSBuYW1lZCBwcm9wZXJ0eSB0byBiZSB0aWVkIHRvIHRoZSBpdGVtLicpLAotKHUnQ2hlY2tCb3gnLCB1J1ZhbHVlJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J1RoZSB2YWx1ZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBpdGVtLicpLAotKHUnUHJvcGVydHknLCB1J1Byb3BlcnR5JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdOYW1lIG9mIHByb3BlcnR5LCB1cHBlcmNhc2UgaWYgc2V0dGFibGUgYnkgbGF1bmNoZXIgb3IgbG9hZGVyLicpLAotKHUnUHJvcGVydHknLCB1J1ZhbHVlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdTdHJpbmcgdmFsdWUgZm9yIHByb3BlcnR5LiAgTmV2ZXIgbnVsbCBvciBlbXB0eS4nKSwKLSh1J0NvbWJvQm94JywgdSdUZXh0JywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J1RoZSB2aXNpYmxlIHRleHQgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGl0ZW0uIE9wdGlvbmFsLiBJZiB0aGlzIGVudHJ5IG9yIHRoZSBlbnRpcmUgY29sdW1uIGlzIG1pc3NpbmcsIHRoZSB0ZXh0IGlzIHRoZSBzYW1lIGFzIHRoZSB2YWx1ZS4nKSwKLSh1J0NvbWJvQm94JywgdSdQcm9wZXJ0eScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQSBuYW1lZCBwcm9wZXJ0eSB0byBiZSB0aWVkIHRvIHRoaXMgaXRlbS4gQWxsIHRoZSBpdGVtcyB0aWVkIHRvIHRoZSBzYW1lIHByb3BlcnR5IGJlY29tZSBwYXJ0IG9mIHRoZSBzYW1lIGNvbWJvYm94LicpLAotKHUnQ29tYm9Cb3gnLCB1J1ZhbHVlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J1RoZSB2YWx1ZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaXRlbS4gU2VsZWN0aW5nIHRoZSBsaW5lIHdpbGwgc2V0IHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IHRvIHRoaXMgdmFsdWUuJyksCi0odSdDb21ib0JveCcsIHUnT3JkZXInLCB1J04nLCAxLCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdBIHBvc2l0aXZlIGludGVnZXIgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyaW5nIG9mIHRoZSBpdGVtcyB3aXRoaW4gb25lIGxpc3QuXHRUaGUgaW50ZWdlcnMgZG8gbm90IGhhdmUgdG8gYmUgY29uc2VjdXRpdmUuJyksCi0odSdDb250cm9sJywgdSdUeXBlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgdHlwZSBvZiB0aGUgY29udHJvbC4nKSwKLSh1J0NvbnRyb2wnLCB1J1gnLCB1J04nLCAwLCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdIb3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIGNvbnRyb2wuJyksCi0odSdDb250cm9sJywgdSdZJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgY29udHJvbC4nKSwKLSh1J0NvbnRyb2wnLCB1J1dpZHRoJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnV2lkdGggb2YgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgY29udHJvbC4nKSwKLSh1J0NvbnRyb2wnLCB1J0hlaWdodCcsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0hlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBjb250cm9sLicpLAotKHUnQ29udHJvbCcsIHUnQXR0cmlidXRlcycsIHUnWScsIDAsIDIxNDc0ODM2NDcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQSAzMi1iaXQgd29yZCB0aGF0IHNwZWNpZmllcyB0aGUgYXR0cmlidXRlIGZsYWdzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBjb250cm9sLicpLAotKHUnQ29udHJvbCcsIHUnVGV4dCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdBIHN0cmluZyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB0ZXh0IGNvbnRhaW5lZCB3aXRoaW4gYSBjb250cm9sIChpZiBhcHByb3ByaWF0ZSkuJyksCi0odSdDb250cm9sJywgdSdQcm9wZXJ0eScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnVGhlIG5hbWUgb2YgYSBkZWZpbmVkIHByb3BlcnR5IHRvIGJlIGxpbmtlZCB0byB0aGlzIGNvbnRyb2wuICcpLAotKHUnQ29udHJvbCcsIHUnQ29udHJvbCcsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnTmFtZSBvZiB0aGUgY29udHJvbC4gVGhpcyBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRpYWxvZywgYnV0IGNhbiByZXBlYXQgb24gZGlmZmVyZW50IGRpYWxvZ3MuICcpLAotKHUnQ29udHJvbCcsIHUnRGlhbG9nXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnRGlhbG9nJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdFeHRlcm5hbCBrZXkgdG8gdGhlIERpYWxvZyB0YWJsZSwgbmFtZSBvZiB0aGUgZGlhbG9nLicpLAotKHUnQ29udHJvbCcsIHUnQ29udHJvbF9OZXh0JywgdSdZJywgTm9uZSwgTm9uZSwgdSdDb250cm9sJywgMiwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgbmFtZSBvZiBhbiBvdGhlciBjb250cm9sIG9uIHRoZSBzYW1lIGRpYWxvZy4gVGhpcyBsaW5rIGRlZmluZXMgdGhlIHRhYiBvcmRlciBvZiB0aGUgY29udHJvbHMuIFRoZSBsaW5rcyBoYXZlIHRvIGZvcm0gb25lIG9yIG1vcmUgY3ljbGVzIScpLAotKHUnQ29udHJvbCcsIHUnSGVscCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGhlIGhlbHAgc3RyaW5ncyB1c2VkIHdpdGggdGhlIGJ1dHRvbi4gVGhlIHRleHQgaXMgb3B0aW9uYWwuICcpLAotKHUnSWNvbicsIHUnTmFtZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXkuIE5hbWUgb2YgdGhlIGljb24gZmlsZS4nKSwKLSh1J0ljb24nLCB1J0RhdGEnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0JpbmFyeScsIE5vbmUsIHUnQmluYXJ5IHN0cmVhbS4gVGhlIGJpbmFyeSBpY29uIGRhdGEgaW4gUEUgKC5ETEwgb3IgLkVYRSkgb3IgaWNvbiAoLklDTykgZm9ybWF0LicpLAotKHUnTGlzdEJveCcsIHUnVGV4dCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGhlIHZpc2libGUgdGV4dCB0byBiZSBhc3NpZ25lZCB0byB0aGUgaXRlbS4gT3B0aW9uYWwuIElmIHRoaXMgZW50cnkgb3IgdGhlIGVudGlyZSBjb2x1bW4gaXMgbWlzc2luZywgdGhlIHRleHQgaXMgdGhlIHNhbWUgYXMgdGhlIHZhbHVlLicpLAotKHUnTGlzdEJveCcsIHUnUHJvcGVydHknLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0EgbmFtZWQgcHJvcGVydHkgdG8gYmUgdGllZCB0byB0aGlzIGl0ZW0uIEFsbCB0aGUgaXRlbXMgdGllZCB0byB0aGUgc2FtZSBwcm9wZXJ0eSBiZWNvbWUgcGFydCBvZiB0aGUgc2FtZSBsaXN0Ym94LicpLAotKHUnTGlzdEJveCcsIHUnVmFsdWUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnVGhlIHZhbHVlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtLiBTZWxlY3RpbmcgdGhlIGxpbmUgd2lsbCBzZXQgdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgdG8gdGhpcyB2YWx1ZS4nKSwKLSh1J0xpc3RCb3gnLCB1J09yZGVyJywgdSdOJywgMSwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQSBwb3NpdGl2ZSBpbnRlZ2VyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlcmluZyBvZiB0aGUgaXRlbXMgd2l0aGluIG9uZSBsaXN0Li5UaGUgaW50ZWdlcnMgZG8gbm90IGhhdmUgdG8gYmUgY29uc2VjdXRpdmUuJyksCi0odSdBY3Rpb25UZXh0JywgdSdBY3Rpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgYWN0aW9uIHRvIGJlIGRlc2NyaWJlZC4nKSwKLSh1J0FjdGlvblRleHQnLCB1J0Rlc2NyaXB0aW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdMb2NhbGl6ZWQgZGVzY3JpcHRpb24gZGlzcGxheWVkIGluIHByb2dyZXNzIGRpYWxvZyBhbmQgbG9nIHdoZW4gYWN0aW9uIGlzIGV4ZWN1dGluZy4nKSwKLSh1J0FjdGlvblRleHQnLCB1J1RlbXBsYXRlJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZW1wbGF0ZScsIE5vbmUsIHUnT3B0aW9uYWwgbG9jYWxpemVkIGZvcm1hdCB0ZW1wbGF0ZSB1c2VkIHRvIGZvcm1hdCBhY3Rpb24gZGF0YSByZWNvcmRzIGZvciBkaXNwbGF5IGR1cmluZyBhY3Rpb24gZXhlY3V0aW9uLicpLAotKHUnQ29udHJvbENvbmRpdGlvbicsIHUnQWN0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdEZWZhdWx0O0Rpc2FibGU7RW5hYmxlO0hpZGU7U2hvdycsIHUnVGhlIGRlc2lyZWQgYWN0aW9uIHRvIGJlIHRha2VuIG9uIHRoZSBzcGVjaWZpZWQgY29udHJvbC4nKSwKLSh1J0NvbnRyb2xDb25kaXRpb24nLCB1J0NvbmRpdGlvbicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQ29uZGl0aW9uJywgTm9uZSwgdSdBIHN0YW5kYXJkIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0aGF0IHNwZWNpZmllcyB1bmRlciB3aGljaCBjb25kaXRpb25zIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHRyaWdnZXJlZC4nKSwKLSh1J0NvbnRyb2xDb25kaXRpb24nLCB1J0RpYWxvZ18nLCB1J04nLCBOb25lLCBOb25lLCB1J0RpYWxvZycsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQSBmb3JlaWduIGtleSB0byB0aGUgRGlhbG9nIHRhYmxlLCBuYW1lIG9mIHRoZSBkaWFsb2cuJyksCi0odSdDb250cm9sQ29uZGl0aW9uJywgdSdDb250cm9sXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29udHJvbCcsIDIsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQSBmb3JlaWduIGtleSB0byB0aGUgQ29udHJvbCB0YWJsZSwgbmFtZSBvZiB0aGUgY29udHJvbC4nKSwKLSh1J0NvbnRyb2xFdmVudCcsIHUnQ29uZGl0aW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdDb25kaXRpb24nLCBOb25lLCB1J0Egc3RhbmRhcmQgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRoYXQgc3BlY2lmaWVzIHVuZGVyIHdoaWNoIGNvbmRpdGlvbnMgYW4gZXZlbnQgc2hvdWxkIGJlIHRyaWdnZXJlZC4nKSwKLSh1J0NvbnRyb2xFdmVudCcsIHUnT3JkZXJpbmcnLCB1J1knLCAwLCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0FuIGludGVnZXIgdXNlZCB0byBvcmRlciBzZXZlcmFsIGV2ZW50cyB0aWVkIHRvIHRoZSBzYW1lIGNvbnRyb2wuIENhbiBiZSBsZWZ0IGJsYW5rLicpLAotKHUnQ29udHJvbEV2ZW50JywgdSdEaWFsb2dfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdEaWFsb2cnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0EgZm9yZWlnbiBrZXkgdG8gdGhlIERpYWxvZyB0YWJsZSwgbmFtZSBvZiB0aGUgZGlhbG9nLicpLAotKHUnQ29udHJvbEV2ZW50JywgdSdDb250cm9sXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29udHJvbCcsIDIsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQSBmb3JlaWduIGtleSB0byB0aGUgQ29udHJvbCB0YWJsZSwgbmFtZSBvZiB0aGUgY29udHJvbCcpLAotKHUnQ29udHJvbEV2ZW50JywgdSdFdmVudCcsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdBbiBpZGVudGlmaWVyIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBldmVudCB0aGF0IHNob3VsZCB0YWtlIHBsYWNlIHdoZW4gdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggY29udHJvbCBzcGVjaWZpZWQgYnkgdGhlIGZpcnN0IHR3byBlbnRyaWVzLicpLAotKHUnQ29udHJvbEV2ZW50JywgdSdBcmd1bWVudCcsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdBIHZhbHVlIHRvIGJlIHVzZWQgYXMgYSBtb2RpZmllciB3aGVuIHRyaWdnZXJpbmcgYSBwYXJ0aWN1bGFyIGV2ZW50LicpLAotKHUnRGlhbG9nJywgdSdXaWR0aCcsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1dpZHRoIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIGRpYWxvZy4nKSwKLSh1J0RpYWxvZycsIHUnSGVpZ2h0JywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSGVpZ2h0IG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIGRpYWxvZy4nKSwKLSh1J0RpYWxvZycsIHUnQXR0cmlidXRlcycsIHUnWScsIDAsIDIxNDc0ODM2NDcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQSAzMi1iaXQgd29yZCB0aGF0IHNwZWNpZmllcyB0aGUgYXR0cmlidXRlIGZsYWdzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBkaWFsb2cuJyksCi0odSdEaWFsb2cnLCB1J1RpdGxlJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1IkEgdGV4dCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgdGl0bGUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0aXRsZSBiYXIgb2YgdGhlIGRpYWxvZydzIHdpbmRvdy4iKSwKLSh1J0RpYWxvZycsIHUnRGlhbG9nJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdOYW1lIG9mIHRoZSBkaWFsb2cuJyksCi0odSdEaWFsb2cnLCB1J0hDZW50ZXJpbmcnLCB1J04nLCAwLCAxMDAsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgZGlhbG9nIG9uIGEgMC0xMDAgc2NhbGUuIDAgbWVhbnMgbGVmdCBlbmQsIDEwMCBtZWFucyByaWdodCBlbmQgb2YgdGhlIHNjcmVlbiwgNTAgY2VudGVyLicpLAotKHUnRGlhbG9nJywgdSdWQ2VudGVyaW5nJywgdSdOJywgMCwgMTAwLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1ZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBkaWFsb2cgb24gYSAwLTEwMCBzY2FsZS4gMCBtZWFucyB0b3AgZW5kLCAxMDAgbWVhbnMgYm90dG9tIGVuZCBvZiB0aGUgc2NyZWVuLCA1MCBjZW50ZXIuJyksCi0odSdEaWFsb2cnLCB1J0NvbnRyb2xfRmlyc3QnLCB1J04nLCBOb25lLCBOb25lLCB1J0NvbnRyb2wnLCAyLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0RlZmluZXMgdGhlIGNvbnRyb2wgdGhhdCBoYXMgdGhlIGZvY3VzIHdoZW4gdGhlIGRpYWxvZyBpcyBjcmVhdGVkLicpLAotKHUnRGlhbG9nJywgdSdDb250cm9sX0RlZmF1bHQnLCB1J1knLCBOb25lLCBOb25lLCB1J0NvbnRyb2wnLCAyLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0RlZmluZXMgdGhlIGRlZmF1bHQgY29udHJvbC4gSGl0dGluZyByZXR1cm4gaXMgZXF1aXZhbGVudCB0byBwdXNoaW5nIHRoaXMgYnV0dG9uLicpLAotKHUnRGlhbG9nJywgdSdDb250cm9sX0NhbmNlbCcsIHUnWScsIE5vbmUsIE5vbmUsIHUnQ29udHJvbCcsIDIsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRGVmaW5lcyB0aGUgY2FuY2VsIGNvbnRyb2wuIEhpdHRpbmcgZXNjYXBlIG9yIGNsaWNraW5nIG9uIHRoZSBjbG9zZSBpY29uIG9uIHRoZSBkaWFsb2cgaXMgZXF1aXZhbGVudCB0byBwdXNoaW5nIHRoaXMgYnV0dG9uLicpLAotKHUnRXZlbnRNYXBwaW5nJywgdSdEaWFsb2dfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdEaWFsb2cnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0EgZm9yZWlnbiBrZXkgdG8gdGhlIERpYWxvZyB0YWJsZSwgbmFtZSBvZiB0aGUgRGlhbG9nLicpLAotKHUnRXZlbnRNYXBwaW5nJywgdSdDb250cm9sXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29udHJvbCcsIDIsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQSBmb3JlaWduIGtleSB0byB0aGUgQ29udHJvbCB0YWJsZSwgbmFtZSBvZiB0aGUgY29udHJvbC4nKSwKLSh1J0V2ZW50TWFwcGluZycsIHUnRXZlbnQnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0FuIGlkZW50aWZpZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgdGhlIGNvbnRyb2wgc3Vic2NyaWJlcyB0by4nKSwKLSh1J0V2ZW50TWFwcGluZycsIHUnQXR0cmlidXRlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgbmFtZSBvZiB0aGUgY29udHJvbCBhdHRyaWJ1dGUsIHRoYXQgaXMgc2V0IHdoZW4gdGhpcyBldmVudCBpcyByZWNlaXZlZC4nKSwKLSh1J0luc3RhbGxFeGVjdXRlU2VxdWVuY2UnLCB1J0FjdGlvbicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnTmFtZSBvZiBhY3Rpb24gdG8gaW52b2tlLCBlaXRoZXIgaW4gdGhlIGVuZ2luZSBvciB0aGUgaGFuZGxlciBETEwuJyksCi0odSdJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlJywgdSdTZXF1ZW5jZScsIHUnWScsIC00LCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdOdW1iZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSBzb3J0IG9yZGVyIGluIHdoaWNoIHRoZSBhY3Rpb25zIGFyZSB0byBiZSBleGVjdXRlZC4gIExlYXZlIGJsYW5rIHRvIHN1cHByZXNzIGFjdGlvbi4nKSwKLSh1J0luc3RhbGxFeGVjdXRlU2VxdWVuY2UnLCB1J0NvbmRpdGlvbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQ29uZGl0aW9uJywgTm9uZSwgdSdPcHRpb25hbCBleHByZXNzaW9uIHdoaWNoIHNraXBzIHRoZSBhY3Rpb24gaWYgZXZhbHVhdGVzIHRvIGV4cEZhbHNlLklmIHRoZSBleHByZXNzaW9uIHN5bnRheCBpcyBpbnZhbGlkLCB0aGUgZW5naW5lIHdpbGwgdGVybWluYXRlLCByZXR1cm5pbmcgaWVzQmFkQWN0aW9uRGF0YS4nKSwKLSh1J0FwcFNlYXJjaCcsIHUnUHJvcGVydHknLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggYSBTaWduYXR1cmUnKSwKLSh1J0FwcFNlYXJjaCcsIHUnU2lnbmF0dXJlXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnU2lnbmF0dXJlO1JlZ0xvY2F0b3I7SW5pTG9jYXRvcjtEckxvY2F0b3I7Q29tcExvY2F0b3InLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSBTaWduYXR1cmVfIHJlcHJlc2VudHMgYSB1bmlxdWUgZmlsZSBzaWduYXR1cmUgYW5kIGlzIGFsc28gdGhlIGZvcmVpZ24ga2V5IGluIHRoZSBTaWduYXR1cmUsICBSZWdMb2NhdG9yLCBJbmlMb2NhdG9yLCBDb21wTG9jYXRvciBhbmQgdGhlIERyTG9jYXRvciB0YWJsZXMuJyksCi0odSdCaW5kSW1hZ2UnLCB1J0ZpbGVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGaWxlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgaW5kZXggaW50byB0aGUgRmlsZSB0YWJsZS4gVGhpcyBtdXN0IGJlIGFuIGV4ZWN1dGFibGUgZmlsZS4nKSwKLSh1J0JpbmRJbWFnZScsIHUnUGF0aCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnUGF0aHMnLCBOb25lLCB1J0EgbGlzdCBvZiA7ICBkZWxpbWl0ZWQgcGF0aHMgdGhhdCByZXByZXNlbnQgdGhlIHBhdGhzIHRvIGJlIHNlYXJjaGVkIGZvciB0aGUgaW1wb3J0IERMTFMuIFRoZSBsaXN0IGlzIHVzdWFsbHkgYSBsaXN0IG9mIHByb3BlcnRpZXMgZWFjaCBlbmNsb3NlZCB3aXRoaW4gc3F1YXJlIGJyYWNrZXRzIFtdIC4nKSwKLSh1J0NDUFNlYXJjaCcsIHUnU2lnbmF0dXJlXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnU2lnbmF0dXJlO1JlZ0xvY2F0b3I7SW5pTG9jYXRvcjtEckxvY2F0b3I7Q29tcExvY2F0b3InLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSBTaWduYXR1cmVfIHJlcHJlc2VudHMgYSB1bmlxdWUgZmlsZSBzaWduYXR1cmUgYW5kIGlzIGFsc28gdGhlIGZvcmVpZ24ga2V5IGluIHRoZSBTaWduYXR1cmUsICBSZWdMb2NhdG9yLCBJbmlMb2NhdG9yLCBDb21wTG9jYXRvciBhbmQgdGhlIERyTG9jYXRvciB0YWJsZXMuJyksCi0odSdJbnN0YWxsVUlTZXF1ZW5jZScsIHUnQWN0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdOYW1lIG9mIGFjdGlvbiB0byBpbnZva2UsIGVpdGhlciBpbiB0aGUgZW5naW5lIG9yIHRoZSBoYW5kbGVyIERMTC4nKSwKLSh1J0luc3RhbGxVSVNlcXVlbmNlJywgdSdTZXF1ZW5jZScsIHUnWScsIC00LCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdOdW1iZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSBzb3J0IG9yZGVyIGluIHdoaWNoIHRoZSBhY3Rpb25zIGFyZSB0byBiZSBleGVjdXRlZC4gIExlYXZlIGJsYW5rIHRvIHN1cHByZXNzIGFjdGlvbi4nKSwKLSh1J0luc3RhbGxVSVNlcXVlbmNlJywgdSdDb25kaXRpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0NvbmRpdGlvbicsIE5vbmUsIHUnT3B0aW9uYWwgZXhwcmVzc2lvbiB3aGljaCBza2lwcyB0aGUgYWN0aW9uIGlmIGV2YWx1YXRlcyB0byBleHBGYWxzZS5JZiB0aGUgZXhwcmVzc2lvbiBzeW50YXggaXMgaW52YWxpZCwgdGhlIGVuZ2luZSB3aWxsIHRlcm1pbmF0ZSwgcmV0dXJuaW5nIGllc0JhZEFjdGlvbkRhdGEuJyksCi0odSdMaXN0VmlldycsIHUnVGV4dCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGhlIHZpc2libGUgdGV4dCB0byBiZSBhc3NpZ25lZCB0byB0aGUgaXRlbS4gT3B0aW9uYWwuIElmIHRoaXMgZW50cnkgb3IgdGhlIGVudGlyZSBjb2x1bW4gaXMgbWlzc2luZywgdGhlIHRleHQgaXMgdGhlIHNhbWUgYXMgdGhlIHZhbHVlLicpLAotKHUnTGlzdFZpZXcnLCB1J1Byb3BlcnR5JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdBIG5hbWVkIHByb3BlcnR5IHRvIGJlIHRpZWQgdG8gdGhpcyBpdGVtLiBBbGwgdGhlIGl0ZW1zIHRpZWQgdG8gdGhlIHNhbWUgcHJvcGVydHkgYmVjb21lIHBhcnQgb2YgdGhlIHNhbWUgbGlzdHZpZXcuJyksCi0odSdMaXN0VmlldycsIHUnVmFsdWUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSB2YWx1ZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaXRlbS4gU2VsZWN0aW5nIHRoZSBsaW5lIHdpbGwgc2V0IHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IHRvIHRoaXMgdmFsdWUuJyksCi0odSdMaXN0VmlldycsIHUnT3JkZXInLCB1J04nLCAxLCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdBIHBvc2l0aXZlIGludGVnZXIgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG9yZGVyaW5nIG9mIHRoZSBpdGVtcyB3aXRoaW4gb25lIGxpc3QuLlRoZSBpbnRlZ2VycyBkbyBub3QgaGF2ZSB0byBiZSBjb25zZWN1dGl2ZS4nKSwKLSh1J0xpc3RWaWV3JywgdSdCaW5hcnlfJywgdSdZJywgTm9uZSwgTm9uZSwgdSdCaW5hcnknLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSBuYW1lIG9mIHRoZSBpY29uIHRvIGJlIGRpc3BsYXllZCB3aXRoIHRoZSBpY29uLiBUaGUgYmluYXJ5IGluZm9ybWF0aW9uIGlzIGxvb2tlZCB1cCBmcm9tIHRoZSBCaW5hcnkgVGFibGUuJyksCi0odSdSYWRpb0J1dHRvbicsIHUnWCcsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIHJhZGlvIGJ1dHRvbi4nKSwKLSh1J1JhZGlvQnV0dG9uJywgdSdZJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgdGhlIHJhZGlvIGJ1dHRvbi4nKSwKLSh1J1JhZGlvQnV0dG9uJywgdSdXaWR0aCcsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSB3aWR0aCBvZiB0aGUgYnV0dG9uLicpLAotKHUnUmFkaW9CdXR0b24nLCB1J0hlaWdodCcsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBoZWlnaHQgb2YgdGhlIGJ1dHRvbi4nKSwKLSh1J1JhZGlvQnV0dG9uJywgdSdUZXh0JywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdUaGUgdmlzaWJsZSB0aXRsZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgcmFkaW8gYnV0dG9uLicpLAotKHUnUmFkaW9CdXR0b24nLCB1J1Byb3BlcnR5JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdBIG5hbWVkIHByb3BlcnR5IHRvIGJlIHRpZWQgdG8gdGhpcyByYWRpbyBidXR0b24uIEFsbCB0aGUgYnV0dG9ucyB0aWVkIHRvIHRoZSBzYW1lIHByb3BlcnR5IGJlY29tZSBwYXJ0IG9mIHRoZSBzYW1lIGdyb3VwLicpLAotKHUnUmFkaW9CdXR0b24nLCB1J1ZhbHVlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J1RoZSB2YWx1ZSBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnV0dG9uLiBTZWxlY3RpbmcgdGhlIGJ1dHRvbiB3aWxsIHNldCB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSB0byB0aGlzIHZhbHVlLicpLAotKHUnUmFkaW9CdXR0b24nLCB1J09yZGVyJywgdSdOJywgMSwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQSBwb3NpdGl2ZSBpbnRlZ2VyIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlcmluZyBvZiB0aGUgaXRlbXMgd2l0aGluIG9uZSBsaXN0Li5UaGUgaW50ZWdlcnMgZG8gbm90IGhhdmUgdG8gYmUgY29uc2VjdXRpdmUuJyksCi0odSdSYWRpb0J1dHRvbicsIHUnSGVscCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGhlIGhlbHAgc3RyaW5ncyB1c2VkIHdpdGggdGhlIGJ1dHRvbi4gVGhlIHRleHQgaXMgb3B0aW9uYWwuJyksCi0odSdUZXh0U3R5bGUnLCB1J1RleHRTdHlsZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnTmFtZSBvZiB0aGUgc3R5bGUuIFRoZSBwcmltYXJ5IGtleSBvZiB0aGlzIHRhYmxlLiBUaGlzIG5hbWUgaXMgZW1iZWRkZWQgaW4gdGhlIHRleHRzIHRvIGluZGljYXRlIGEgc3R5bGUgY2hhbmdlLicpLAotKHUnVGV4dFN0eWxlJywgdSdGYWNlTmFtZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgZm9udCB1c2VkLiBSZXF1aXJlZC4gVGhlIHN0cmluZyBtdXN0IGJlIGF0IG1vc3QgMzEgY2hhcmFjdGVycyBsb25nLicpLAotKHUnVGV4dFN0eWxlJywgdSdTaXplJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGhlIHNpemUgb2YgdGhlIGZvbnQgdXNlZC4gVGhpcyBzaXplIGlzIGdpdmVuIGluIG91ciB1bml0cyAoMS8xMiBvZiB0aGUgc3lzdGVtIGZvbnQgaGVpZ2h0KS4gQXNzdW1pbmcgdGhhdCB0aGUgc3lzdGVtIGZvbnQgaXMgc2V0IHRvIDEyIHBvaW50IHNpemUsIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgcG9pbnQgc2l6ZS4nKSwKLSh1J1RleHRTdHlsZScsIHUnQ29sb3InLCB1J1knLCAwLCAxNjc3NzIxNSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdBIGxvbmcgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBjb2xvciBvZiB0aGUgc3RyaW5nIGluIHRoZSBSR0IgZm9ybWF0IChSZWQsIEdyZWVuLCBCbHVlIGVhY2ggMC0yNTUsIFJHQiA9IFIgKyAyNTYqRyArIDI1Nl4yKkIpLicpLAotKHUnVGV4dFN0eWxlJywgdSdTdHlsZUJpdHMnLCB1J1knLCAwLCAxNSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdBIGNvbWJpbmF0aW9uIG9mIHN0eWxlIGJpdHMuJyksCi0odSdVSVRleHQnLCB1J1RleHQnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSBsb2NhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLicpLAotKHUnVUlUZXh0JywgdSdLZXknLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0EgdW5pcXVlIGtleSB0aGF0IGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgc3RyaW5nLicpLAotKHUnX1ZhbGlkYXRpb24nLCB1J1RhYmxlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdOYW1lIG9mIHRhYmxlJyksCi0odSdfVmFsaWRhdGlvbicsIHUnRGVzY3JpcHRpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J0Rlc2NyaXB0aW9uIG9mIGNvbHVtbicpLAotKHUnX1ZhbGlkYXRpb24nLCB1J0NvbHVtbicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnTmFtZSBvZiBjb2x1bW4nKSwKLSh1J19WYWxpZGF0aW9uJywgdSdOdWxsYWJsZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnWTtOO0AnLCB1J1doZXRoZXIgdGhlIGNvbHVtbiBpcyBudWxsYWJsZScpLAotKHUnX1ZhbGlkYXRpb24nLCB1J01pblZhbHVlJywgdSdZJywgLTIxNDc0ODM2NDcsIDIxNDc0ODM2NDcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnTWluaW11bSB2YWx1ZSBhbGxvd2VkJyksCi0odSdfVmFsaWRhdGlvbicsIHUnTWF4VmFsdWUnLCB1J1knLCAtMjE0NzQ4MzY0NywgMjE0NzQ4MzY0NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdNYXhpbXVtIHZhbHVlIGFsbG93ZWQnKSwKLSh1J19WYWxpZGF0aW9uJywgdSdLZXlUYWJsZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yIGZvcmVpZ24ga2V5LCBOYW1lIG9mIHRhYmxlIHRvIHdoaWNoIGRhdGEgbXVzdCBsaW5rJyksCi0odSdfVmFsaWRhdGlvbicsIHUnS2V5Q29sdW1uJywgdSdZJywgMSwgMzIsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQ29sdW1uIHRvIHdoaWNoIGZvcmVpZ24ga2V5IGNvbm5lY3RzJyksCi0odSdfVmFsaWRhdGlvbicsIHUnQ2F0ZWdvcnknLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQ7Rm9ybWF0dGVkO1RlbXBsYXRlO0NvbmRpdGlvbjtHdWlkO1BhdGg7VmVyc2lvbjtMYW5ndWFnZTtJZGVudGlmaWVyO0JpbmFyeTtVcHBlckNhc2U7TG93ZXJDYXNlO0ZpbGVuYW1lO1BhdGhzO0FueVBhdGg7V2lsZENhcmRGaWxlbmFtZTtSZWdQYXRoO0tleUZvcm1hdHRlZDtDdXN0b21Tb3VyY2U7UHJvcGVydHk7Q2FiaW5ldDtTaG9ydGN1dDtVUkwnLCB1J1N0cmluZyBjYXRlZ29yeScpLAotKHUnX1ZhbGlkYXRpb24nLCB1J1NldCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnU2V0IG9mIHZhbHVlcyB0aGF0IGFyZSBwZXJtaXR0ZWQnKSwKLSh1J0FkdnRVSVNlcXVlbmNlJywgdSdBY3Rpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgYWN0aW9uIHRvIGludm9rZSwgZWl0aGVyIGluIHRoZSBlbmdpbmUgb3IgdGhlIGhhbmRsZXIgRExMLicpLAotKHUnQWR2dFVJU2VxdWVuY2UnLCB1J1NlcXVlbmNlJywgdSdZJywgLTQsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J051bWJlciB0aGF0IGRldGVybWluZXMgdGhlIHNvcnQgb3JkZXIgaW4gd2hpY2ggdGhlIGFjdGlvbnMgYXJlIHRvIGJlIGV4ZWN1dGVkLiAgTGVhdmUgYmxhbmsgdG8gc3VwcHJlc3MgYWN0aW9uLicpLAotKHUnQWR2dFVJU2VxdWVuY2UnLCB1J0NvbmRpdGlvbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQ29uZGl0aW9uJywgTm9uZSwgdSdPcHRpb25hbCBleHByZXNzaW9uIHdoaWNoIHNraXBzIHRoZSBhY3Rpb24gaWYgZXZhbHVhdGVzIHRvIGV4cEZhbHNlLklmIHRoZSBleHByZXNzaW9uIHN5bnRheCBpcyBpbnZhbGlkLCB0aGUgZW5naW5lIHdpbGwgdGVybWluYXRlLCByZXR1cm5pbmcgaWVzQmFkQWN0aW9uRGF0YS4nKSwKLSh1J0FwcElkJywgdSdBcHBJZCcsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnR3VpZCcsIE5vbmUsIE5vbmUpLAotKHUnQXBwSWQnLCB1J0FjdGl2YXRlQXRTdG9yYWdlJywgdSdZJywgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSksCi0odSdBcHBJZCcsIHUnRGxsU3Vycm9nYXRlJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgTm9uZSksCi0odSdBcHBJZCcsIHUnTG9jYWxTZXJ2aWNlJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgTm9uZSksCi0odSdBcHBJZCcsIHUnUmVtb3RlU2VydmVyTmFtZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgTm9uZSksCi0odSdBcHBJZCcsIHUnUnVuQXNJbnRlcmFjdGl2ZVVzZXInLCB1J1knLCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lKSwKLSh1J0FwcElkJywgdSdTZXJ2aWNlUGFyYW1ldGVycycsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIE5vbmUpLAotKHUnRmVhdHVyZScsIHUnQXR0cmlidXRlcycsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnMDsxOzI7NDs1OzY7ODs5OzEwOzE2OzE3OzE4OzIwOzIxOzIyOzI0OzI1OzI2OzMyOzMzOzM0OzM2OzM3OzM4OzQ4OzQ5OzUwOzUyOzUzOzU0JywgdSdGZWF0dXJlIGF0dHJpYnV0ZXMnKSwKLSh1J0ZlYXR1cmUnLCB1J0Rlc2NyaXB0aW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdMb25nZXIgZGVzY3JpcHRpdmUgdGV4dCBkZXNjcmliaW5nIGEgdmlzaWJsZSBmZWF0dXJlIGl0ZW0uJyksCi0odSdGZWF0dXJlJywgdSdUaXRsZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnU2hvcnQgdGV4dCBpZGVudGlmeWluZyBhIHZpc2libGUgZmVhdHVyZSBpdGVtLicpLAotKHUnRmVhdHVyZScsIHUnRmVhdHVyZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXkgdXNlZCB0byBpZGVudGlmeSBhIHBhcnRpY3VsYXIgZmVhdHVyZSByZWNvcmQuJyksCi0odSdGZWF0dXJlJywgdSdEaXJlY3RvcnlfJywgdSdZJywgTm9uZSwgTm9uZSwgdSdEaXJlY3RvcnknLCAxLCB1J1VwcGVyQ2FzZScsIE5vbmUsIHUnVGhlIG5hbWUgb2YgdGhlIERpcmVjdG9yeSB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGJ5IHRoZSBVSS4gQSBub24tbnVsbCB2YWx1ZSB3aWxsIGVuYWJsZSB0aGUgYnJvd3NlIGJ1dHRvbi4nKSwKLSh1J0ZlYXR1cmUnLCB1J0xldmVsJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGhlIGluc3RhbGwgbGV2ZWwgYXQgd2hpY2ggcmVjb3JkIHdpbGwgYmUgaW5pdGlhbGx5IHNlbGVjdGVkLiBBbiBpbnN0YWxsIGxldmVsIG9mIDAgd2lsbCBkaXNhYmxlIGFuIGl0ZW0gYW5kIHByZXZlbnQgaXRzIGRpc3BsYXkuJyksCi0odSdGZWF0dXJlJywgdSdEaXNwbGF5JywgdSdZJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnTnVtZXJpYyBzb3J0IG9yZGVyLCB1c2VkIHRvIGZvcmNlIGEgc3BlY2lmaWMgZGlzcGxheSBvcmRlcmluZy4nKSwKLSh1J0ZlYXR1cmUnLCB1J0ZlYXR1cmVfUGFyZW50JywgdSdZJywgTm9uZSwgTm9uZSwgdSdGZWF0dXJlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdPcHRpb25hbCBrZXkgb2YgYSBwYXJlbnQgcmVjb3JkIGluIHRoZSBzYW1lIHRhYmxlLiBJZiB0aGUgcGFyZW50IGlzIG5vdCBzZWxlY3RlZCwgdGhlbiB0aGUgcmVjb3JkIHdpbGwgbm90IGJlIGluc3RhbGxlZC4gTnVsbCBpbmRpY2F0ZXMgYSByb290IGl0ZW0uJyksCi0odSdGaWxlJywgdSdTZXF1ZW5jZScsIHUnTicsIDEsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1NlcXVlbmNlIHdpdGggcmVzcGVjdCB0byB0aGUgbWVkaWEgaW1hZ2VzOyBvcmRlciBtdXN0IHRyYWNrIGNhYmluZXQgb3JkZXIuJyksCi0odSdGaWxlJywgdSdBdHRyaWJ1dGVzJywgdSdZJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSW50ZWdlciBjb250YWluaW5nIGJpdCBmbGFncyByZXByZXNlbnRpbmcgZmlsZSBhdHRyaWJ1dGVzICh3aXRoIHRoZSBkZWNpbWFsIHZhbHVlIG9mIGVhY2ggYml0IHBvc2l0aW9uIGluIHBhcmVudGhlc2VzKScpLAotKHUnRmlsZScsIHUnRmlsZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXksIG5vbi1sb2NhbGl6ZWQgdG9rZW4sIG11c3QgbWF0Y2ggaWRlbnRpZmllciBpbiBjYWJpbmV0LiAgRm9yIHVuY29tcHJlc3NlZCBmaWxlcywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLicpLAotKHUnRmlsZScsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSByZWZlcmVuY2luZyBDb21wb25lbnQgdGhhdCBjb250cm9scyB0aGUgZmlsZS4nKSwKLSh1J0ZpbGUnLCB1J0ZpbGVOYW1lJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGaWxlbmFtZScsIE5vbmUsIHUnRmlsZSBuYW1lIHVzZWQgZm9yIGluc3RhbGxhdGlvbiwgbWF5IGJlIGxvY2FsaXplZC4gIFRoaXMgbWF5IGNvbnRhaW4gYSAic2hvcnQgbmFtZXxsb25nIG5hbWUiIHBhaXIuJyksCi0odSdGaWxlJywgdSdGaWxlU2l6ZScsIHUnTicsIDAsIDIxNDc0ODM2NDcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnU2l6ZSBvZiBmaWxlIGluIGJ5dGVzIChsb25nIGludGVnZXIpLicpLAotKHUnRmlsZScsIHUnTGFuZ3VhZ2UnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0xhbmd1YWdlJywgTm9uZSwgdSdMaXN0IG9mIGRlY2ltYWwgbGFuZ3VhZ2UgSWRzLCBjb21tYS1zZXBhcmF0ZWQgaWYgbW9yZSB0aGFuIG9uZS4nKSwKLSh1J0ZpbGUnLCB1J1ZlcnNpb24nLCB1J1knLCBOb25lLCBOb25lLCB1J0ZpbGUnLCAxLCB1J1ZlcnNpb24nLCBOb25lLCB1J1ZlcnNpb24gc3RyaW5nIGZvciB2ZXJzaW9uZWQgZmlsZXM7ICBCbGFuayBmb3IgdW52ZXJzaW9uZWQgZmlsZXMuJyksCi0odSdDbGFzcycsIHUnQXR0cmlidXRlcycsIHUnWScsIE5vbmUsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0NsYXNzIHJlZ2lzdHJhdGlvbiBhdHRyaWJ1dGVzLicpLAotKHUnQ2xhc3MnLCB1J0ZlYXR1cmVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGZWF0dXJlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZXF1aXJlZCBmb3JlaWduIGtleSBpbnRvIHRoZSBGZWF0dXJlIFRhYmxlLCBzcGVjaWZ5aW5nIHRoZSBmZWF0dXJlIHRvIHZhbGlkYXRlIG9yIGluc3RhbGwgaW4gb3JkZXIgZm9yIHRoZSBDTFNJRCBmYWN0b3J5IHRvIGJlIG9wZXJhdGlvbmFsLicpLAotKHUnQ2xhc3MnLCB1J0Rlc2NyaXB0aW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdMb2NhbGl6ZWQgZGVzY3JpcHRpb24gZm9yIHRoZSBDbGFzcy4nKSwKLSh1J0NsYXNzJywgdSdBcmd1bWVudCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdvcHRpb25hbCBhcmd1bWVudCBmb3IgTG9jYWxTZXJ2ZXJzLicpLAotKHUnQ2xhc3MnLCB1J0FwcElkXycsIHUnWScsIE5vbmUsIE5vbmUsIHUnQXBwSWQnLCAxLCB1J0d1aWQnLCBOb25lLCB1J09wdGlvbmFsIEFwcElEIGNvbnRhaW5pbmcgRENPTSBpbmZvcm1hdGlvbiBmb3IgYXNzb2NpYXRlZCBhcHBsaWNhdGlvbiAoc3RyaW5nIEdVSUQpLicpLAotKHUnQ2xhc3MnLCB1J0NMU0lEJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdHdWlkJywgTm9uZSwgdSdUaGUgQ0xTSUQgb2YgYW4gT0xFIGZhY3RvcnkuJyksCi0odSdDbGFzcycsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZXF1aXJlZCBmb3JlaWduIGtleSBpbnRvIHRoZSBDb21wb25lbnQgVGFibGUsIHNwZWNpZnlpbmcgdGhlIGNvbXBvbmVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgcGF0aCB3aGVuIGNhbGxlZCB0aHJvdWdoIExvY2F0ZUNvbXBvbmVudC4nKSwKLSh1J0NsYXNzJywgdSdDb250ZXh0JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgbnVtZXJpYyBzZXJ2ZXIgY29udGV4dCBmb3IgdGhpcyBzZXJ2ZXIuIENMU0NUWF94eHh4JyksCi0odSdDbGFzcycsIHUnRGVmSW5wcm9jSGFuZGxlcicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRmlsZW5hbWUnLCB1JzE7MjszJywgdSdPcHRpb25hbCBkZWZhdWx0IGlucHJvYyBoYW5kbGVyLiAgT25seSBvcHRpb25hbGx5IHByb3ZpZGVkIGlmIENvbnRleHQ9Q0xTQ1RYX0xPQ0FMX1NFUlZFUi4gIFR5cGljYWxseSAib2xlMzIuZGxsIiBvciAibWFwaTMyLmRsbCInKSwKLSh1J0NsYXNzJywgdSdGaWxlVHlwZU1hc2snLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J09wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgSEtDUnRoaXMgQ0xTSUQpIGtleS4gSWYgbXVsdGlwbGUgcGF0dGVybnMgZXhpc3QsIHRoZXkgbXVzdCBiZSBkZWxpbWl0ZWQgYnkgYSBzZW1pY29sb24sIGFuZCBudW1lcmljIHN1YmtleXMgd2lsbCBiZSBnZW5lcmF0ZWQ6IDAsMSwyLi4uJyksCi0odSdDbGFzcycsIHUnSWNvbl8nLCB1J1knLCBOb25lLCBOb25lLCB1J0ljb24nLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J09wdGlvbmFsIGZvcmVpZ24ga2V5IGludG8gdGhlIEljb24gVGFibGUsIHNwZWNpZnlpbmcgdGhlIGljb24gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBDTFNJRC4gV2lsbCBiZSB3cml0dGVuIHVuZGVyIHRoZSBEZWZhdWx0SWNvbiBrZXkuJyksCi0odSdDbGFzcycsIHUnSWNvbkluZGV4JywgdSdZJywgLTMyNzY3LCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdPcHRpb25hbCBpY29uIGluZGV4LicpLAotKHUnQ2xhc3MnLCB1J1Byb2dJZF9EZWZhdWx0JywgdSdZJywgTm9uZSwgTm9uZSwgdSdQcm9nSWQnLCAxLCB1J1RleHQnLCBOb25lLCB1J09wdGlvbmFsIFByb2dJZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBDTFNJRC4nKSwKLSh1J0NvbXBvbmVudCcsIHUnQ29uZGl0aW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdDb25kaXRpb24nLCBOb25lLCB1IkEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRoYXQgd2lsbCBkaXNhYmxlIHRoaXMgY29tcG9uZW50IGlmIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0aGUgJ1RydWUnIHN0YXRlLiBJZiBhIGNvbXBvbmVudCBpcyBkaXNhYmxlZCwgaXQgd2lsbCBub3QgYmUgaW5zdGFsbGVkLCByZWdhcmRsZXNzIG9mIHRoZSAnQWN0aW9uJyBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbXBvbmVudC4iKSwKLSh1J0NvbXBvbmVudCcsIHUnQXR0cmlidXRlcycsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnUmVtb3RlIGV4ZWN1dGlvbiBvcHRpb24sIG9uZSBvZiBpcnNFbnVtJyksCi0odSdDb21wb25lbnQnLCB1J0NvbXBvbmVudCcsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXkgdXNlZCB0byBpZGVudGlmeSBhIHBhcnRpY3VsYXIgY29tcG9uZW50IHJlY29yZC4nKSwKLSh1J0NvbXBvbmVudCcsIHUnQ29tcG9uZW50SWQnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0d1aWQnLCBOb25lLCB1J0Egc3RyaW5nIEdVSUQgdW5pcXVlIHRvIHRoaXMgY29tcG9uZW50LCB2ZXJzaW9uLCBhbmQgbGFuZ3VhZ2UuJyksCi0odSdDb21wb25lbnQnLCB1J0RpcmVjdG9yeV8nLCB1J04nLCBOb25lLCBOb25lLCB1J0RpcmVjdG9yeScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUmVxdWlyZWQga2V5IG9mIGEgRGlyZWN0b3J5IHRhYmxlIHJlY29yZC4gVGhpcyBpcyBhY3R1YWxseSBhIHByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgY29udGFpbnMgdGhlIGFjdHVhbCBwYXRoLCBzZXQgZWl0aGVyIGJ5IHRoZSBBcHBTZWFyY2ggYWN0aW9uIG9yIHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZyBvYnRhaW5lZCBmcm9tIHRoZSBEaXJlY3RvcnkgdGFibGUuJyksCi0odSdDb21wb25lbnQnLCB1J0tleVBhdGgnLCB1J1knLCBOb25lLCBOb25lLCB1J0ZpbGU7UmVnaXN0cnk7T0RCQ0RhdGFTb3VyY2UnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0VpdGhlciB0aGUgcHJpbWFyeSBrZXkgaW50byB0aGUgRmlsZSB0YWJsZSwgUmVnaXN0cnkgdGFibGUsIG9yIE9EQkNEYXRhU291cmNlIHRhYmxlLiBUaGlzIGV4dHJhY3QgcGF0aCBpcyBzdG9yZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGluc3RhbGxlZCwgYW5kIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiB0aGUgY29tcG9uZW50IGFuZCB0byByZXR1cm4gdGhlIHBhdGggdG8gaXQuJyksCi0odSdQcm9nSWQnLCB1J0Rlc2NyaXB0aW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdMb2NhbGl6ZWQgZGVzY3JpcHRpb24gZm9yIHRoZSBQcm9ncmFtIGlkZW50aWZpZXIuJyksCi0odSdQcm9nSWQnLCB1J0ljb25fJywgdSdZJywgTm9uZSwgTm9uZSwgdSdJY29uJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdPcHRpb25hbCBmb3JlaWduIGtleSBpbnRvIHRoZSBJY29uIFRhYmxlLCBzcGVjaWZ5aW5nIHRoZSBpY29uIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUHJvZ0lkLiBXaWxsIGJlIHdyaXR0ZW4gdW5kZXIgdGhlIERlZmF1bHRJY29uIGtleS4nKSwKLSh1J1Byb2dJZCcsIHUnSWNvbkluZGV4JywgdSdZJywgLTMyNzY3LCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdPcHRpb25hbCBpY29uIGluZGV4LicpLAotKHUnUHJvZ0lkJywgdSdQcm9nSWQnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSBQcm9ncmFtIElkZW50aWZpZXIuIFByaW1hcnkga2V5LicpLAotKHUnUHJvZ0lkJywgdSdDbGFzc18nLCB1J1knLCBOb25lLCBOb25lLCB1J0NsYXNzJywgMSwgdSdHdWlkJywgTm9uZSwgdSdUaGUgQ0xTSUQgb2YgYW4gT0xFIGZhY3RvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgUHJvZ0lkLicpLAotKHUnUHJvZ0lkJywgdSdQcm9nSWRfUGFyZW50JywgdSdZJywgTm9uZSwgTm9uZSwgdSdQcm9nSWQnLCAxLCB1J1RleHQnLCBOb25lLCB1J1RoZSBQYXJlbnQgUHJvZ3JhbSBJZGVudGlmaWVyLiBJZiBzcGVjaWZpZWQsIHRoZSBQcm9nSWQgY29sdW1uIGJlY29tZXMgYSB2ZXJzaW9uIGluZGVwZW5kZW50IHByb2cgaWQuJyksCi0odSdDb21wTG9jYXRvcicsIHUnVHlwZScsIHUnWScsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgcmVnaXN0cnkgdmFsdWUgaXMgYSBmaWxlbmFtZSBvciBhIGRpcmVjdG9yeSBsb2NhdGlvbi4nKSwKLSh1J0NvbXBMb2NhdG9yJywgdSdTaWduYXR1cmVfJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgdGFibGUga2V5LiBUaGUgU2lnbmF0dXJlXyByZXByZXNlbnRzIGEgdW5pcXVlIGZpbGUgc2lnbmF0dXJlIGFuZCBpcyBhbHNvIHRoZSBmb3JlaWduIGtleSBpbiB0aGUgU2lnbmF0dXJlIHRhYmxlLicpLAotKHUnQ29tcExvY2F0b3InLCB1J0NvbXBvbmVudElkJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdHdWlkJywgTm9uZSwgdSdBIHN0cmluZyBHVUlEIHVuaXF1ZSB0byB0aGlzIGNvbXBvbmVudCwgdmVyc2lvbiwgYW5kIGxhbmd1YWdlLicpLAotKHUnQ29tcGx1cycsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSByZWZlcmVuY2luZyBDb21wb25lbnQgdGhhdCBjb250cm9scyB0aGUgQ29tUGx1cyBjb21wb25lbnQuJyksCi0odSdDb21wbHVzJywgdSdFeHBUeXBlJywgdSdZJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQ29tUGx1cyBjb21wb25lbnQgYXR0cmlidXRlcy4nKSwKLSh1J0RpcmVjdG9yeScsIHUnRGlyZWN0b3J5JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdVbmlxdWUgaWRlbnRpZmllciBmb3IgZGlyZWN0b3J5IGVudHJ5LCBwcmltYXJ5IGtleS4gSWYgYSBwcm9wZXJ0eSBieSB0aGlzIG5hbWUgaXMgZGVmaW5lZCwgaXQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5LicpLAotKHUnRGlyZWN0b3J5JywgdSdEZWZhdWx0RGlyJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdEZWZhdWx0RGlyJywgTm9uZSwgdSJUaGUgZGVmYXVsdCBzdWItcGF0aCB1bmRlciBwYXJlbnQncyBwYXRoLiIpLAotKHUnRGlyZWN0b3J5JywgdSdEaXJlY3RvcnlfUGFyZW50JywgdSdZJywgTm9uZSwgTm9uZSwgdSdEaXJlY3RvcnknLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1JlZmVyZW5jZSB0byB0aGUgZW50cnkgaW4gdGhpcyB0YWJsZSBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IHBhcmVudCBkaXJlY3RvcnkuIEEgcmVjb3JkIHBhcmVudGVkIHRvIGl0c2VsZiBvciB3aXRoIGEgTnVsbCBwYXJlbnQgcmVwcmVzZW50cyBhIHJvb3Qgb2YgdGhlIGluc3RhbGwgdHJlZS4nKSwKLSh1J0NyZWF0ZUZvbGRlcicsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSBpbnRvIHRoZSBDb21wb25lbnQgdGFibGUuJyksCi0odSdDcmVhdGVGb2xkZXInLCB1J0RpcmVjdG9yeV8nLCB1J04nLCBOb25lLCBOb25lLCB1J0RpcmVjdG9yeScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXksIGNvdWxkIGJlIGZvcmVpZ24ga2V5IGludG8gdGhlIERpcmVjdG9yeSB0YWJsZS4nKSwKLSh1J0N1c3RvbUFjdGlvbicsIHUnVHlwZScsIHUnTicsIDEsIDE2MzgzLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBudW1lcmljIGN1c3RvbSBhY3Rpb24gdHlwZSwgY29uc2lzdGluZyBvZiBzb3VyY2UgbG9jYXRpb24sIGNvZGUgdHlwZSwgZW50cnksIG9wdGlvbiBmbGFncy4nKSwKLSh1J0N1c3RvbUFjdGlvbicsIHUnQWN0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdQcmltYXJ5IGtleSwgbmFtZSBvZiBhY3Rpb24sIG5vcm1hbGx5IGFwcGVhcnMgaW4gc2VxdWVuY2UgdGFibGUgdW5sZXNzIHByaXZhdGUgdXNlLicpLAotKHUnQ3VzdG9tQWN0aW9uJywgdSdTb3VyY2UnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0N1c3RvbVNvdXJjZScsIE5vbmUsIHUnVGhlIHRhYmxlIHJlZmVyZW5jZSBvZiB0aGUgc291cmNlIG9mIHRoZSBjb2RlLicpLAotKHUnQ3VzdG9tQWN0aW9uJywgdSdUYXJnZXQnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnRXhjZWN1dGlvbiBwYXJhbWV0ZXIsIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgY3VzdG9tIGFjdGlvbicpLAotKHUnRHJMb2NhdG9yJywgdSdTaWduYXR1cmVfJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgU2lnbmF0dXJlXyByZXByZXNlbnRzIGEgdW5pcXVlIGZpbGUgc2lnbmF0dXJlIGFuZCBpcyBhbHNvIHRoZSBmb3JlaWduIGtleSBpbiB0aGUgU2lnbmF0dXJlIHRhYmxlLicpLAotKHUnRHJMb2NhdG9yJywgdSdQYXRoJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdBbnlQYXRoJywgTm9uZSwgdSdUaGUgcGF0aCBvbiB0aGUgdXNlciBzeXN0ZW0uIFRoaXMgaXMgYSBlaXRoZXIgYSBzdWJwYXRoIGJlbG93IHRoZSB2YWx1ZSBvZiB0aGUgUGFyZW50IG9yIGEgZnVsbCBwYXRoLiBUaGUgcGF0aCBtYXkgY29udGFpbiBwcm9wZXJ0aWVzIGVuY2xvc2VkIHdpdGhpbiBbIF0gdGhhdCB3aWxsIGJlIGV4cGFuZGVkLicpLAotKHUnRHJMb2NhdG9yJywgdSdEZXB0aCcsIHUnWScsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBkZXB0aCBiZWxvdyB0aGUgcGF0aCB0byB3aGljaCB0aGUgU2lnbmF0dXJlXyBpcyByZWN1cnNpdmVseSBzZWFyY2hlZC4gSWYgYWJzZW50LCB0aGUgZGVwdGggaXMgYXNzdW1lZCB0byBiZSAwLicpLAotKHUnRHJMb2NhdG9yJywgdSdQYXJlbnQnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1RoZSBwYXJlbnQgZmlsZSBzaWduYXR1cmUuIEl0IGlzIGFsc28gYSBmb3JlaWduIGtleSBpbiB0aGUgU2lnbmF0dXJlIHRhYmxlLiBJZiBudWxsIGFuZCB0aGUgUGF0aCBjb2x1bW4gZG9lcyBub3QgZXhwYW5kIHRvIGEgZnVsbCBwYXRoLCB0aGVuIGFsbCB0aGUgZml4ZWQgZHJpdmVzIG9mIHRoZSB1c2VyIHN5c3RlbSBhcmUgc2VhcmNoZWQgdXNpbmcgdGhlIFBhdGguJyksCi0odSdEdXBsaWNhdGVGaWxlJywgdSdGaWxlXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnRmlsZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yZWlnbiBrZXkgcmVmZXJlbmNpbmcgdGhlIHNvdXJjZSBmaWxlIHRvIGJlIGR1cGxpY2F0ZWQuJyksCi0odSdEdXBsaWNhdGVGaWxlJywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IHJlZmVyZW5jaW5nIENvbXBvbmVudCB0aGF0IGNvbnRyb2xzIHRoZSBkdXBsaWNhdGUgZmlsZS4nKSwKLSh1J0R1cGxpY2F0ZUZpbGUnLCB1J0Rlc3RGb2xkZXInLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgYSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhc3N1bWVkIHRvIHJlc29sdmUgdG8gdGhlIGZ1bGwgcGF0aG5hbWUgdG8gYSBkZXN0aW5hdGlvbiBmb2xkZXIuJyksCi0odSdEdXBsaWNhdGVGaWxlJywgdSdEZXN0TmFtZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRmlsZW5hbWUnLCBOb25lLCB1J0ZpbGVuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSBkdXBsaWNhdGUgZmlsZS4nKSwKLSh1J0R1cGxpY2F0ZUZpbGUnLCB1J0ZpbGVLZXknLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1ByaW1hcnkga2V5IHVzZWQgdG8gaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIGZpbGUgZW50cnknKSwKLSh1J0Vudmlyb25tZW50JywgdSdOYW1lJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdUaGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnRhbCB2YWx1ZS4nKSwKLSh1J0Vudmlyb25tZW50JywgdSdWYWx1ZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgdmFsdWUgdG8gc2V0IGluIHRoZSBlbnZpcm9ubWVudGFsIHNldHRpbmdzLicpLAotKHUnRW52aXJvbm1lbnQnLCB1J0NvbXBvbmVudF8nLCB1J04nLCBOb25lLCBOb25lLCB1J0NvbXBvbmVudCcsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yZWlnbiBrZXkgaW50byB0aGUgQ29tcG9uZW50IHRhYmxlIHJlZmVyZW5jaW5nIGNvbXBvbmVudCB0aGF0IGNvbnRyb2xzIHRoZSBpbnN0YWxsaW5nIG9mIHRoZSBlbnZpcm9ubWVudGFsIHZhbHVlLicpLAotKHUnRW52aXJvbm1lbnQnLCB1J0Vudmlyb25tZW50JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVudmlyb25tZW50YWwgdmFyaWFibGUgc2V0dGluZycpLAotKHUnRXJyb3InLCB1J0Vycm9yJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSW50ZWdlciBlcnJvciBudW1iZXIsIG9idGFpbmVkIGZyb20gaGVhZGVyIGZpbGUgSUVycm9yKC4uLikgbWFjcm9zLicpLAotKHUnRXJyb3InLCB1J01lc3NhZ2UnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RlbXBsYXRlJywgTm9uZSwgdSdFcnJvciBmb3JtYXR0aW5nIHRlbXBsYXRlLCBvYnRhaW5lZCBmcm9tIHVzZXIgZWQuIG9yIGxvY2FsaXplcnMuJyksCi0odSdFeHRlbnNpb24nLCB1J0ZlYXR1cmVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGZWF0dXJlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZXF1aXJlZCBmb3JlaWduIGtleSBpbnRvIHRoZSBGZWF0dXJlIFRhYmxlLCBzcGVjaWZ5aW5nIHRoZSBmZWF0dXJlIHRvIHZhbGlkYXRlIG9yIGluc3RhbGwgaW4gb3JkZXIgZm9yIHRoZSBDTFNJRCBmYWN0b3J5IHRvIGJlIG9wZXJhdGlvbmFsLicpLAotKHUnRXh0ZW5zaW9uJywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1JlcXVpcmVkIGZvcmVpZ24ga2V5IGludG8gdGhlIENvbXBvbmVudCBUYWJsZSwgc3BlY2lmeWluZyB0aGUgY29tcG9uZW50IGZvciB3aGljaCB0byByZXR1cm4gYSBwYXRoIHdoZW4gY2FsbGVkIHRocm91Z2ggTG9jYXRlQ29tcG9uZW50LicpLAotKHUnRXh0ZW5zaW9uJywgdSdFeHRlbnNpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSBleHRlbnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZSByb3cuJyksCi0odSdFeHRlbnNpb24nLCB1J01JTUVfJywgdSdZJywgTm9uZSwgTm9uZSwgdSdNSU1FJywgMSwgdSdUZXh0JywgTm9uZSwgdSdPcHRpb25hbCBDb250ZXh0IGlkZW50aWZpZXIsIHR5cGljYWxseSAidHlwZS9mb3JtYXQiIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZW5zaW9uJyksCi0odSdFeHRlbnNpb24nLCB1J1Byb2dJZF8nLCB1J1knLCBOb25lLCBOb25lLCB1J1Byb2dJZCcsIDEsIHUnVGV4dCcsIE5vbmUsIHUnT3B0aW9uYWwgUHJvZ0lkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4dGVuc2lvbi4nKSwKLSh1J01JTUUnLCB1J0NMU0lEJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdHdWlkJywgTm9uZSwgdSdPcHRpb25hbCBhc3NvY2lhdGVkIENMU0lELicpLAotKHUnTUlNRScsIHUnQ29udGVudFR5cGUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1ByaW1hcnkga2V5LiBDb250ZXh0IGlkZW50aWZpZXIsIHR5cGljYWxseSAidHlwZS9mb3JtYXQiLicpLAotKHUnTUlNRScsIHUnRXh0ZW5zaW9uXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnRXh0ZW5zaW9uJywgMSwgdSdUZXh0JywgTm9uZSwgdSdPcHRpb25hbCBhc3NvY2lhdGVkIGV4dGVuc2lvbiAod2l0aG91dCBkb3QpJyksCi0odSdGZWF0dXJlQ29tcG9uZW50cycsIHUnRmVhdHVyZV8nLCB1J04nLCBOb25lLCBOb25lLCB1J0ZlYXR1cmUnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gRmVhdHVyZSB0YWJsZS4nKSwKLSh1J0ZlYXR1cmVDb21wb25lbnRzJywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gQ29tcG9uZW50IHRhYmxlLicpLAotKHUnRmlsZVNGUENhdGFsb2cnLCB1J0ZpbGVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGaWxlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2F0YWxvZycpLAotKHUnRmlsZVNGUENhdGFsb2cnLCB1J1NGUENhdGFsb2dfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdTRlBDYXRhbG9nJywgMSwgdSdGaWxlbmFtZScsIE5vbmUsIHUnQ2F0YWxvZyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUnKSwKLSh1J1NGUENhdGFsb2cnLCB1J1NGUENhdGFsb2cnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0ZpbGVuYW1lJywgTm9uZSwgdSdGaWxlIG5hbWUgZm9yIHRoZSBjYXRhbG9nLicpLAotKHUnU0ZQQ2F0YWxvZycsIHUnQ2F0YWxvZycsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQmluYXJ5JywgTm9uZSwgdSdTRlAgQ2F0YWxvZycpLAotKHUnU0ZQQ2F0YWxvZycsIHUnRGVwZW5kZW5jeScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdQYXJlbnQgY2F0YWxvZyAtIG9ubHkgdXNlZCBieSBTRlAnKSwKLSh1J0ZvbnQnLCB1J0ZpbGVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGaWxlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdQcmltYXJ5IGtleSwgZm9yZWlnbiBrZXkgaW50byBGaWxlIHRhYmxlIHJlZmVyZW5jaW5nIGZvbnQgZmlsZS4nKSwKLSh1J0ZvbnQnLCB1J0ZvbnRUaXRsZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnRm9udCBuYW1lLicpLAotKHUnSW5pRmlsZScsIHUnQWN0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdScwOzE7MycsIHUnVGhlIHR5cGUgb2YgbW9kaWZpY2F0aW9uIHRvIGJlIG1hZGUsIG9uZSBvZiBpaWZFbnVtJyksCi0odSdJbmlGaWxlJywgdSdWYWx1ZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbi4nKSwKLSh1J0luaUZpbGUnLCB1J0tleScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgLklOSSBmaWxlIGtleSBiZWxvdyBTZWN0aW9uLicpLAotKHUnSW5pRmlsZScsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSBpbnRvIHRoZSBDb21wb25lbnQgdGFibGUgcmVmZXJlbmNpbmcgY29tcG9uZW50IHRoYXQgY29udHJvbHMgdGhlIGluc3RhbGxpbmcgb2YgdGhlIC5JTkkgdmFsdWUuJyksCi0odSdJbmlGaWxlJywgdSdGaWxlTmFtZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRmlsZW5hbWUnLCBOb25lLCB1J1RoZSAuSU5JIGZpbGUgbmFtZSBpbiB3aGljaCB0byB3cml0ZSB0aGUgaW5mb3JtYXRpb24nKSwKLSh1J0luaUZpbGUnLCB1J0luaUZpbGUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1ByaW1hcnkga2V5LCBub24tbG9jYWxpemVkIHRva2VuLicpLAotKHUnSW5pRmlsZScsIHUnRGlyUHJvcGVydHknLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gdGhlIERpcmVjdG9yeSB0YWJsZSBkZW5vdGluZyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSAuSU5JIGZpbGUgaXMuJyksCi0odSdJbmlGaWxlJywgdSdTZWN0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J1RoZSAuSU5JIGZpbGUgU2VjdGlvbi4nKSwKLSh1J0luaUxvY2F0b3InLCB1J1R5cGUnLCB1J1knLCAwLCAyLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0FuIGludGVnZXIgdmFsdWUgdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSAuSU5JIHZhbHVlIHJlYWQgaXMgYSBmaWxlbmFtZSBvciBhIGRpcmVjdG9yeSBsb2NhdGlvbiBvciB0byBiZSB1c2VkIGFzIGlzIHcvbyBpbnRlcnByZXRhdGlvbi4nKSwKLSh1J0luaUxvY2F0b3InLCB1J0tleScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnS2V5IHZhbHVlIChmb2xsb3dlZCBieSBhbiBlcXVhbHMgc2lnbiBpbiBJTkkgZmlsZSkuJyksCi0odSdJbmlMb2NhdG9yJywgdSdTaWduYXR1cmVfJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdUaGUgdGFibGUga2V5LiBUaGUgU2lnbmF0dXJlXyByZXByZXNlbnRzIGEgdW5pcXVlIGZpbGUgc2lnbmF0dXJlIGFuZCBpcyBhbHNvIHRoZSBmb3JlaWduIGtleSBpbiB0aGUgU2lnbmF0dXJlIHRhYmxlLicpLAotKHUnSW5pTG9jYXRvcicsIHUnRmlsZU5hbWUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0ZpbGVuYW1lJywgTm9uZSwgdSdUaGUgLklOSSBmaWxlIG5hbWUuJyksCi0odSdJbmlMb2NhdG9yJywgdSdTZWN0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdTZWN0aW9uIG5hbWUgd2l0aGluIGluIGZpbGUgKHdpdGhpbiBzcXVhcmUgYnJhY2tldHMgaW4gSU5JIGZpbGUpLicpLAotKHUnSW5pTG9jYXRvcicsIHUnRmllbGQnLCB1J1knLCAwLCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUaGUgZmllbGQgaW4gdGhlIC5JTkkgbGluZS4gSWYgRmllbGQgaXMgbnVsbCBvciAwIHRoZSBlbnRpcmUgbGluZSBpcyByZWFkLicpLAotKHUnSXNvbGF0ZWRDb21wb25lbnQnLCB1J0NvbXBvbmVudF9BcHBsaWNhdGlvbicsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdLZXkgdG8gQ29tcG9uZW50IHRhYmxlIGl0ZW0gZm9yIGFwcGxpY2F0aW9uJyksCi0odSdJc29sYXRlZENvbXBvbmVudCcsIHUnQ29tcG9uZW50X1NoYXJlZCcsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdLZXkgdG8gQ29tcG9uZW50IHRhYmxlIGl0ZW0gdG8gYmUgaXNvbGF0ZWQnKSwKLSh1J0xhdW5jaENvbmRpdGlvbicsIHUnQ29uZGl0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdDb25kaXRpb24nLCBOb25lLCB1J0V4cHJlc3Npb24gd2hpY2ggbXVzdCBldmFsdWF0ZSB0byBUUlVFIGluIG9yZGVyIGZvciBpbnN0YWxsIHRvIGNvbW1lbmNlLicpLAotKHUnTGF1bmNoQ29uZGl0aW9uJywgdSdEZXNjcmlwdGlvbicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdMb2NhbGl6YWJsZSB0ZXh0IHRvIGRpc3BsYXkgd2hlbiBjb25kaXRpb24gZmFpbHMgYW5kIGluc3RhbGwgbXVzdCBhYm9ydC4nKSwKLSh1J0xvY2tQZXJtaXNzaW9ucycsIHUnVGFibGUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCB1J0RpcmVjdG9yeTtGaWxlO1JlZ2lzdHJ5JywgdSdSZWZlcmVuY2UgdG8gYW5vdGhlciB0YWJsZSBuYW1lJyksCi0odSdMb2NrUGVybWlzc2lvbnMnLCB1J0RvbWFpbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdEb21haW4gbmFtZSBmb3IgdXNlciB3aG9zZSBwZXJtaXNzaW9ucyBhcmUgYmVpbmcgc2V0LiAodXN1YWxseSBhIHByb3BlcnR5KScpLAotKHUnTG9ja1Blcm1pc3Npb25zJywgdSdMb2NrT2JqZWN0JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSBpbnRvIFJlZ2lzdHJ5IG9yIEZpbGUgdGFibGUnKSwKLSh1J0xvY2tQZXJtaXNzaW9ucycsIHUnUGVybWlzc2lvbicsIHUnWScsIC0yMTQ3NDgzNjQ3LCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1Blcm1pc3Npb24gQWNjZXNzIG1hc2suICBGdWxsIENvbnRyb2wgPSAyNjg0MzU0NTYgKEdFTkVSSUNfQUxMID0gMHgxMDAwMDAwMCknKSwKLSh1J0xvY2tQZXJtaXNzaW9ucycsIHUnVXNlcicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdVc2VyIGZvciBwZXJtaXNzaW9ucyB0byBiZSBzZXQuICAodXN1YWxseSBhIHByb3BlcnR5KScpLAotKHUnTWVkaWEnLCB1J1NvdXJjZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnUHJvcGVydHknLCBOb25lLCB1J1RoZSBwcm9wZXJ0eSBkZWZpbmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGNhYmluZXQgZmlsZS4nKSwKLSh1J01lZGlhJywgdSdDYWJpbmV0JywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdDYWJpbmV0JywgTm9uZSwgdSdJZiBzb21lIG9yIGFsbCBvZiB0aGUgZmlsZXMgc3RvcmVkIG9uIHRoZSBtZWRpYSBhcmUgY29tcHJlc3NlZCBpbiBhIGNhYmluZXQsIHRoZSBuYW1lIG9mIHRoYXQgY2FiaW5ldC4nKSwKLSh1J01lZGlhJywgdSdEaXNrSWQnLCB1J04nLCAxLCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdQcmltYXJ5IGtleSwgaW50ZWdlciB0byBkZXRlcm1pbmUgc29ydCBvcmRlciBmb3IgdGFibGUuJyksCi0odSdNZWRpYScsIHUnRGlza1Byb21wdCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnRGlzayBuYW1lOiB0aGUgdmlzaWJsZSB0ZXh0IGFjdHVhbGx5IHByaW50ZWQgb24gdGhlIGRpc2suICBUaGlzIHdpbGwgYmUgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgd2hlbiB0aGlzIGRpc2sgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQuJyksCi0odSdNZWRpYScsIHUnTGFzdFNlcXVlbmNlJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRmlsZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBsYXN0IGZpbGUgZm9yIHRoaXMgbWVkaWEuJyksCi0odSdNZWRpYScsIHUnVm9sdW1lTGFiZWwnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSBsYWJlbCBhdHRyaWJ1dGVkIHRvIHRoZSB2b2x1bWUuJyksCi0odSdNb2R1bGVDb21wb25lbnRzJywgdSdDb21wb25lbnQnLCB1J04nLCBOb25lLCBOb25lLCB1J0NvbXBvbmVudCcsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQ29tcG9uZW50IGNvbnRhaW5lZCBpbiB0aGUgbW9kdWxlLicpLAotKHUnTW9kdWxlQ29tcG9uZW50cycsIHUnTGFuZ3VhZ2UnLCB1J04nLCBOb25lLCBOb25lLCB1J01vZHVsZVNpZ25hdHVyZScsIDIsIE5vbmUsIE5vbmUsIHUnRGVmYXVsdCBsYW5ndWFnZSBJRCBmb3IgbW9kdWxlIChtYXkgYmUgY2hhbmdlZCBieSB0cmFuc2Zvcm0pLicpLAotKHUnTW9kdWxlQ29tcG9uZW50cycsIHUnTW9kdWxlSUQnLCB1J04nLCBOb25lLCBOb25lLCB1J01vZHVsZVNpZ25hdHVyZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnTW9kdWxlIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudC4nKSwKLSh1J01vZHVsZVNpZ25hdHVyZScsIHUnTGFuZ3VhZ2UnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0RlZmF1bHQgZGVjaW1hbCBsYW5ndWFnZSBvZiBtb2R1bGUuJyksCi0odSdNb2R1bGVTaWduYXR1cmUnLCB1J1ZlcnNpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1ZlcnNpb24nLCBOb25lLCB1J1ZlcnNpb24gb2YgdGhlIG1vZHVsZS4nKSwKLSh1J01vZHVsZVNpZ25hdHVyZScsIHUnTW9kdWxlSUQnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J01vZHVsZSBpZGVudGlmaWVyIChTdHJpbmcuR1VJRCkuJyksCi0odSdNb2R1bGVEZXBlbmRlbmN5JywgdSdNb2R1bGVJRCcsIHUnTicsIE5vbmUsIE5vbmUsIHUnTW9kdWxlU2lnbmF0dXJlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdNb2R1bGUgcmVxdWlyaW5nIHRoZSBkZXBlbmRlbmN5LicpLAotKHUnTW9kdWxlRGVwZW5kZW5jeScsIHUnTW9kdWxlTGFuZ3VhZ2UnLCB1J04nLCBOb25lLCBOb25lLCB1J01vZHVsZVNpZ25hdHVyZScsIDIsIE5vbmUsIE5vbmUsIHUnTGFuZ3VhZ2Ugb2YgbW9kdWxlIHJlcXVpcmluZyB0aGUgZGVwZW5kZW5jeS4nKSwKLSh1J01vZHVsZURlcGVuZGVuY3knLCB1J1JlcXVpcmVkSUQnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1N0cmluZy5HVUlEIG9mIHJlcXVpcmVkIG1vZHVsZS4nKSwKLSh1J01vZHVsZURlcGVuZGVuY3knLCB1J1JlcXVpcmVkTGFuZ3VhZ2UnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0xhbmd1YWdlSUQgb2YgdGhlIHJlcXVpcmVkIG1vZHVsZS4nKSwKLSh1J01vZHVsZURlcGVuZGVuY3knLCB1J1JlcXVpcmVkVmVyc2lvbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVmVyc2lvbicsIE5vbmUsIHUnVmVyc2lvbiBvZiB0aGUgcmVxdWlyZWQgdmVyc2lvbi4nKSwKLSh1J01vZHVsZUV4Y2x1c2lvbicsIHUnTW9kdWxlSUQnLCB1J04nLCBOb25lLCBOb25lLCB1J01vZHVsZVNpZ25hdHVyZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnU3RyaW5nLkdVSUQgb2YgbW9kdWxlIHdpdGggZXhjbHVzaW9uIHJlcXVpcmVtZW50LicpLAotKHUnTW9kdWxlRXhjbHVzaW9uJywgdSdNb2R1bGVMYW5ndWFnZScsIHUnTicsIE5vbmUsIE5vbmUsIHUnTW9kdWxlU2lnbmF0dXJlJywgMiwgTm9uZSwgTm9uZSwgdSdMYW5ndWFnZUlEIG9mIG1vZHVsZSB3aXRoIGV4Y2x1c2lvbiByZXF1aXJlbWVudC4nKSwKLSh1J01vZHVsZUV4Y2x1c2lvbicsIHUnRXhjbHVkZWRJRCcsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnU3RyaW5nLkdVSUQgb2YgZXhjbHVkZWQgbW9kdWxlLicpLAotKHUnTW9kdWxlRXhjbHVzaW9uJywgdSdFeGNsdWRlZExhbmd1YWdlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdMYW5ndWFnZSBvZiBleGNsdWRlZCBtb2R1bGUuJyksCi0odSdNb2R1bGVFeGNsdXNpb24nLCB1J0V4Y2x1ZGVkTWF4VmVyc2lvbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVmVyc2lvbicsIE5vbmUsIHUnTWF4aW11bSB2ZXJzaW9uIG9mIGV4Y2x1ZGVkIG1vZHVsZS4nKSwKLSh1J01vZHVsZUV4Y2x1c2lvbicsIHUnRXhjbHVkZWRNaW5WZXJzaW9uJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdWZXJzaW9uJywgTm9uZSwgdSdNaW5pbXVtIHZlcnNpb24gb2YgZXhjbHVkZWQgbW9kdWxlLicpLAotKHUnTW92ZUZpbGUnLCB1J0NvbXBvbmVudF8nLCB1J04nLCBOb25lLCBOb25lLCB1J0NvbXBvbmVudCcsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnSWYgdGhpcyBjb21wb25lbnQgaXMgbm90ICJzZWxlY3RlZCIgZm9yIGluc3RhbGxhdGlvbiBvciByZW1vdmFsLCBubyBhY3Rpb24gd2lsbCBiZSB0YWtlbiBvbiB0aGUgYXNzb2NpYXRlZCBNb3ZlRmlsZSBlbnRyeScpLAotKHUnTW92ZUZpbGUnLCB1J0Rlc3RGb2xkZXInLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgYSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhc3N1bWVkIHRvIHJlc29sdmUgdG8gdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5JyksCi0odSdNb3ZlRmlsZScsIHUnRGVzdE5hbWUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0ZpbGVuYW1lJywgTm9uZSwgdSdOYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSBvcmlnaW5hbCBmaWxlIGFmdGVyIGl0IGlzIG1vdmVkIG9yIGNvcGllZC4gIElmIGJsYW5rLCB0aGUgZGVzdGluYXRpb24gZmlsZSB3aWxsIGJlIGdpdmVuIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHNvdXJjZSBmaWxlJyksCi0odSdNb3ZlRmlsZScsIHUnRmlsZUtleScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgcGFydGljdWxhciBNb3ZlRmlsZSByZWNvcmQnKSwKLSh1J01vdmVGaWxlJywgdSdPcHRpb25zJywgdSdOJywgMCwgMSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIE1vdmVGaWxlIG9wZXJhdGluZyBtb2RlLCBvbmUgb2YgaW1mb0VudW0nKSwKLSh1J01vdmVGaWxlJywgdSdTb3VyY2VGb2xkZXInLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgYSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhc3N1bWVkIHRvIHJlc29sdmUgdG8gdGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIGRpcmVjdG9yeScpLAotKHUnTW92ZUZpbGUnLCB1J1NvdXJjZU5hbWUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1Ik5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlKHMpIHRvIGJlIG1vdmVkIG9yIGNvcGllZC4gIENhbiBjb250YWluIHRoZSAnKicgb3IgJz8nIHdpbGRjYXJkcy4iKSwKLSh1J01zaUFzc2VtYmx5JywgdSdBdHRyaWJ1dGVzJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdBc3NlbWJseSBhdHRyaWJ1dGVzJyksCi0odSdNc2lBc3NlbWJseScsIHUnRmVhdHVyZV8nLCB1J04nLCBOb25lLCBOb25lLCB1J0ZlYXR1cmUnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gRmVhdHVyZSB0YWJsZS4nKSwKLSh1J01zaUFzc2VtYmx5JywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gQ29tcG9uZW50IHRhYmxlLicpLAotKHUnTXNpQXNzZW1ibHknLCB1J0ZpbGVfQXBwbGljYXRpb24nLCB1J1knLCBOb25lLCBOb25lLCB1J0ZpbGUnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gRmlsZSB0YWJsZSwgZGVub3RpbmcgdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQgZm9yIHByaXZhdGUgYXNzZW1ibGllcy4gTnVsbCBmb3IgZ2xvYmFsIGFzc2VtYmxpZXMuJyksCi0odSdNc2lBc3NlbWJseScsIHUnRmlsZV9NYW5pZmVzdCcsIHUnWScsIE5vbmUsIE5vbmUsIHUnRmlsZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yZWlnbiBrZXkgaW50byB0aGUgRmlsZSB0YWJsZSBkZW5vdGluZyB0aGUgbWFuaWZlc3QgZmlsZSBmb3IgdGhlIGFzc2VtYmx5LicpLAotKHUnTXNpQXNzZW1ibHlOYW1lJywgdSdOYW1lJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdUaGUgbmFtZSBwYXJ0IG9mIHRoZSBuYW1lLXZhbHVlIHBhaXJzIGZvciB0aGUgYXNzZW1ibHkgbmFtZS4nKSwKLSh1J01zaUFzc2VtYmx5TmFtZScsIHUnVmFsdWUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBuYW1lLXZhbHVlIHBhaXJzIGZvciB0aGUgYXNzZW1ibHkgbmFtZS4nKSwKLSh1J01zaUFzc2VtYmx5TmFtZScsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSBpbnRvIENvbXBvbmVudCB0YWJsZS4nKSwKLSh1J01zaURpZ2l0YWxDZXJ0aWZpY2F0ZScsIHUnQ2VydERhdGEnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0JpbmFyeScsIE5vbmUsIHUnQSBjZXJ0aWZpY2F0ZSBjb250ZXh0IGJsb2IgZm9yIGEgc2lnbmVyIGNlcnRpZmljYXRlJyksCi0odSdNc2lEaWdpdGFsQ2VydGlmaWNhdGUnLCB1J0RpZ2l0YWxDZXJ0aWZpY2F0ZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJvdycpLAotKHUnTXNpRGlnaXRhbFNpZ25hdHVyZScsIHUnVGFibGUnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J01lZGlhJywgdSdSZWZlcmVuY2UgdG8gYW5vdGhlciB0YWJsZSBuYW1lIChvbmx5IE1lZGlhIHRhYmxlIGlzIHN1cHBvcnRlZCknKSwKLSh1J01zaURpZ2l0YWxTaWduYXR1cmUnLCB1J0RpZ2l0YWxDZXJ0aWZpY2F0ZV8nLCB1J04nLCBOb25lLCBOb25lLCB1J01zaURpZ2l0YWxDZXJ0aWZpY2F0ZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yZWlnbiBrZXkgdG8gTXNpRGlnaXRhbENlcnRpZmljYXRlIHRhYmxlIGlkZW50aWZ5aW5nIHRoZSBzaWduZXIgY2VydGlmaWNhdGUnKSwKLSh1J01zaURpZ2l0YWxTaWduYXR1cmUnLCB1J0hhc2gnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0JpbmFyeScsIE5vbmUsIHUnVGhlIGVuY29kZWQgaGFzaCBibG9iIGZyb20gdGhlIGRpZ2l0YWwgc2lnbmF0dXJlJyksCi0odSdNc2lEaWdpdGFsU2lnbmF0dXJlJywgdSdTaWduT2JqZWN0JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdGb3JlaWduIGtleSB0byBNZWRpYSB0YWJsZScpLAotKHUnTXNpRmlsZUhhc2gnLCB1J0ZpbGVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGaWxlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdQcmltYXJ5IGtleSwgZm9yZWlnbiBrZXkgaW50byBGaWxlIHRhYmxlIHJlZmVyZW5jaW5nIGZpbGUgd2l0aCB0aGlzIGhhc2gnKSwKLSh1J01zaUZpbGVIYXNoJywgdSdPcHRpb25zJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVmFyaW91cyBvcHRpb25zIGFuZCBhdHRyaWJ1dGVzIGZvciB0aGlzIGhhc2guJyksCi0odSdNc2lGaWxlSGFzaCcsIHUnSGFzaFBhcnQxJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdTaXplIG9mIGZpbGUgaW4gYnl0ZXMgKGxvbmcgaW50ZWdlcikuJyksCi0odSdNc2lGaWxlSGFzaCcsIHUnSGFzaFBhcnQyJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdTaXplIG9mIGZpbGUgaW4gYnl0ZXMgKGxvbmcgaW50ZWdlcikuJyksCi0odSdNc2lGaWxlSGFzaCcsIHUnSGFzaFBhcnQzJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdTaXplIG9mIGZpbGUgaW4gYnl0ZXMgKGxvbmcgaW50ZWdlcikuJyksCi0odSdNc2lGaWxlSGFzaCcsIHUnSGFzaFBhcnQ0JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdTaXplIG9mIGZpbGUgaW4gYnl0ZXMgKGxvbmcgaW50ZWdlcikuJyksCi0odSdNc2lQYXRjaEhlYWRlcnMnLCB1J1N0cmVhbVJlZicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXkuIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByb3cuJyksCi0odSdNc2lQYXRjaEhlYWRlcnMnLCB1J0hlYWRlcicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnQmluYXJ5JywgTm9uZSwgdSdCaW5hcnkgc3RyZWFtLiBUaGUgcGF0Y2ggaGVhZGVyLCB1c2VkIGZvciBwYXRjaCB2YWxpZGF0aW9uLicpLAotKHUnT0RCQ0F0dHJpYnV0ZScsIHUnVmFsdWUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1ZhbHVlIGZvciBPREJDIGRyaXZlciBhdHRyaWJ1dGUnKSwKLSh1J09EQkNBdHRyaWJ1dGUnLCB1J0F0dHJpYnV0ZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnTmFtZSBvZiBPREJDIGRyaXZlciBhdHRyaWJ1dGUnKSwKLSh1J09EQkNBdHRyaWJ1dGUnLCB1J0RyaXZlcl8nLCB1J04nLCBOb25lLCBOb25lLCB1J09EQkNEcml2ZXInLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1JlZmVyZW5jZSB0byBPREJDIGRyaXZlciBpbiBPREJDRHJpdmVyIHRhYmxlJyksCi0odSdPREJDRHJpdmVyJywgdSdEZXNjcmlwdGlvbicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGV4dCB1c2VkIGFzIHJlZ2lzdGVyZWQgbmFtZSBmb3IgZHJpdmVyLCBub24tbG9jYWxpemVkJyksCi0odSdPREJDRHJpdmVyJywgdSdGaWxlXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnRmlsZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUmVmZXJlbmNlIHRvIGtleSBkcml2ZXIgZmlsZScpLAotKHUnT0RCQ0RyaXZlcicsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZWZlcmVuY2UgdG8gYXNzb2NpYXRlZCBjb21wb25lbnQnKSwKLSh1J09EQkNEcml2ZXInLCB1J0RyaXZlcicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXksIG5vbi1sb2NhbGl6ZWQuaW50ZXJuYWwgdG9rZW4gZm9yIGRyaXZlcicpLAotKHUnT0RCQ0RyaXZlcicsIHUnRmlsZV9TZXR1cCcsIHUnWScsIE5vbmUsIE5vbmUsIHUnRmlsZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnT3B0aW9uYWwgcmVmZXJlbmNlIHRvIGtleSBkcml2ZXIgc2V0dXAgRExMJyksCi0odSdPREJDRGF0YVNvdXJjZScsIHUnRGVzY3JpcHRpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RleHQgdXNlZCBhcyByZWdpc3RlcmVkIG5hbWUgZm9yIGRhdGEgc291cmNlJyksCi0odSdPREJDRGF0YVNvdXJjZScsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZWZlcmVuY2UgdG8gYXNzb2NpYXRlZCBjb21wb25lbnQnKSwKLSh1J09EQkNEYXRhU291cmNlJywgdSdEYXRhU291cmNlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdQcmltYXJ5IGtleSwgbm9uLWxvY2FsaXplZC5pbnRlcm5hbCB0b2tlbiBmb3IgZGF0YSBzb3VyY2UnKSwKLSh1J09EQkNEYXRhU291cmNlJywgdSdEcml2ZXJEZXNjcmlwdGlvbicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnUmVmZXJlbmNlIHRvIGRyaXZlciBkZXNjcmlwdGlvbiwgbWF5IGJlIGV4aXN0aW5nIGRyaXZlcicpLAotKHUnT0RCQ0RhdGFTb3VyY2UnLCB1J1JlZ2lzdHJhdGlvbicsIHUnTicsIDAsIDEsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnUmVnaXN0cmF0aW9uIG9wdGlvbjogMD1tYWNoaW5lLCAxPXVzZXIsIG90aGVycyB0LmIuZC4nKSwKLSh1J09EQkNTb3VyY2VBdHRyaWJ1dGUnLCB1J1ZhbHVlJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdWYWx1ZSBmb3IgT0RCQyBkYXRhIHNvdXJjZSBhdHRyaWJ1dGUnKSwKLSh1J09EQkNTb3VyY2VBdHRyaWJ1dGUnLCB1J0F0dHJpYnV0ZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnTmFtZSBvZiBPREJDIGRhdGEgc291cmNlIGF0dHJpYnV0ZScpLAotKHUnT0RCQ1NvdXJjZUF0dHJpYnV0ZScsIHUnRGF0YVNvdXJjZV8nLCB1J04nLCBOb25lLCBOb25lLCB1J09EQkNEYXRhU291cmNlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZWZlcmVuY2UgdG8gT0RCQyBkYXRhIHNvdXJjZSBpbiBPREJDRGF0YVNvdXJjZSB0YWJsZScpLAotKHUnT0RCQ1RyYW5zbGF0b3InLCB1J0Rlc2NyaXB0aW9uJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdUZXh0IHVzZWQgYXMgcmVnaXN0ZXJlZCBuYW1lIGZvciB0cmFuc2xhdG9yJyksCi0odSdPREJDVHJhbnNsYXRvcicsIHUnRmlsZV8nLCB1J04nLCBOb25lLCBOb25lLCB1J0ZpbGUnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1JlZmVyZW5jZSB0byBrZXkgdHJhbnNsYXRvciBmaWxlJyksCi0odSdPREJDVHJhbnNsYXRvcicsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdSZWZlcmVuY2UgdG8gYXNzb2NpYXRlZCBjb21wb25lbnQnKSwKLSh1J09EQkNUcmFuc2xhdG9yJywgdSdGaWxlX1NldHVwJywgdSdZJywgTm9uZSwgTm9uZSwgdSdGaWxlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdPcHRpb25hbCByZWZlcmVuY2UgdG8ga2V5IHRyYW5zbGF0b3Igc2V0dXAgRExMJyksCi0odSdPREJDVHJhbnNsYXRvcicsIHUnVHJhbnNsYXRvcicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXksIG5vbi1sb2NhbGl6ZWQuaW50ZXJuYWwgdG9rZW4gZm9yIHRyYW5zbGF0b3InKSwKLSh1J1BhdGNoJywgdSdTZXF1ZW5jZScsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1ByaW1hcnkga2V5LCBzZXF1ZW5jZSB3aXRoIHJlc3BlY3QgdG8gdGhlIG1lZGlhIGltYWdlczsgb3JkZXIgbXVzdCB0cmFjayBjYWJpbmV0IG9yZGVyLicpLAotKHUnUGF0Y2gnLCB1J0F0dHJpYnV0ZXMnLCB1J04nLCAwLCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJbnRlZ2VyIGNvbnRhaW5pbmcgYml0IGZsYWdzIHJlcHJlc2VudGluZyBwYXRjaCBhdHRyaWJ1dGVzJyksCi0odSdQYXRjaCcsIHUnRmlsZV8nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1ByaW1hcnkga2V5LCBub24tbG9jYWxpemVkIHRva2VuLCBmb3JlaWduIGtleSB0byBGaWxlIHRhYmxlLCBtdXN0IG1hdGNoIGlkZW50aWZpZXIgaW4gY2FiaW5ldC4nKSwKLSh1J1BhdGNoJywgdSdIZWFkZXInLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0JpbmFyeScsIE5vbmUsIHUnQmluYXJ5IHN0cmVhbS4gVGhlIHBhdGNoIGhlYWRlciwgdXNlZCBmb3IgcGF0Y2ggdmFsaWRhdGlvbi4nKSwKLSh1J1BhdGNoJywgdSdQYXRjaFNpemUnLCB1J04nLCAwLCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1NpemUgb2YgcGF0Y2ggaW4gYnl0ZXMgKGxvbmcgaW50ZWdlcikuJyksCi0odSdQYXRjaCcsIHUnU3RyZWFtUmVmXycsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnSWRlbnRpZmllci4gRm9yZWlnbiBrZXkgdG8gdGhlIFN0cmVhbVJlZiBjb2x1bW4gb2YgdGhlIE1zaVBhdGNoSGVhZGVycyB0YWJsZS4nKSwKLSh1J1BhdGNoUGFja2FnZScsIHUnTWVkaWFfJywgdSdOJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9yZWlnbiBrZXkgdG8gRGlza0lkIGNvbHVtbiBvZiBNZWRpYSB0YWJsZS4gSW5kaWNhdGVzIHRoZSBkaXNrIGNvbnRhaW5pbmcgdGhlIHBhdGNoIHBhY2thZ2UuJyksCi0odSdQYXRjaFBhY2thZ2UnLCB1J1BhdGNoSWQnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0d1aWQnLCBOb25lLCB1J0EgdW5pcXVlIHN0cmluZyBHVUlEIHJlcHJlc2VudGluZyB0aGlzIHBhdGNoLicpLAotKHUnUHVibGlzaENvbXBvbmVudCcsIHUnRmVhdHVyZV8nLCB1J04nLCBOb25lLCBOb25lLCB1J0ZlYXR1cmUnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gdGhlIEZlYXR1cmUgdGFibGUuJyksCi0odSdQdWJsaXNoQ29tcG9uZW50JywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gdGhlIENvbXBvbmVudCB0YWJsZS4nKSwKLSh1J1B1Ymxpc2hDb21wb25lbnQnLCB1J0NvbXBvbmVudElkJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdHdWlkJywgTm9uZSwgdSdBIHN0cmluZyBHVUlEIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9uZW50IGlkIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgYnkgdGhlIGFsaWVuIHByb2R1Y3QuJyksCi0odSdQdWJsaXNoQ29tcG9uZW50JywgdSdBcHBEYXRhJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdUaGlzIGlzIGxvY2FsaXNhYmxlIEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgdGhhdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgUXVhbGlmaWVkIENvbXBvbmVudC4nKSwKLSh1J1B1Ymxpc2hDb21wb25lbnQnLCB1J1F1YWxpZmllcicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGhpcyBpcyBkZWZpbmVkIG9ubHkgd2hlbiB0aGUgQ29tcG9uZW50SWQgY29sdW1uIGlzIGFuIFF1YWxpZmllZCBDb21wb25lbnQgSWQuIFRoaXMgaXMgdGhlIFF1YWxpZmllciBmb3IgUHJvdmlkZUNvbXBvbmVudEluZGlyZWN0LicpLAotKHUnUmVnaXN0cnknLCB1J05hbWUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnVGhlIHJlZ2lzdHJ5IHZhbHVlIG5hbWUuJyksCi0odSdSZWdpc3RyeScsIHUnVmFsdWUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnVGhlIHJlZ2lzdHJ5IHZhbHVlLicpLAotKHUnUmVnaXN0cnknLCB1J0tleScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnUmVnUGF0aCcsIE5vbmUsIHUnVGhlIGtleSBmb3IgdGhlIHJlZ2lzdHJ5IHZhbHVlLicpLAotKHUnUmVnaXN0cnknLCB1J0NvbXBvbmVudF8nLCB1J04nLCBOb25lLCBOb25lLCB1J0NvbXBvbmVudCcsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yZWlnbiBrZXkgaW50byB0aGUgQ29tcG9uZW50IHRhYmxlIHJlZmVyZW5jaW5nIGNvbXBvbmVudCB0aGF0IGNvbnRyb2xzIHRoZSBpbnN0YWxsaW5nIG9mIHRoZSByZWdpc3RyeSB2YWx1ZS4nKSwKLSh1J1JlZ2lzdHJ5JywgdSdSZWdpc3RyeScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXksIG5vbi1sb2NhbGl6ZWQgdG9rZW4uJyksCi0odSdSZWdpc3RyeScsIHUnUm9vdCcsIHUnTicsIC0xLCAzLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBwcmVkZWZpbmVkIHJvb3Qga2V5IGZvciB0aGUgcmVnaXN0cnkgdmFsdWUsIG9uZSBvZiBycmtFbnVtLicpLAotKHUnUmVnTG9jYXRvcicsIHUnTmFtZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgcmVnaXN0cnkgdmFsdWUgbmFtZS4nKSwKLSh1J1JlZ0xvY2F0b3InLCB1J1R5cGUnLCB1J1knLCAwLCAxOCwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGUgcmVnaXN0cnkgdmFsdWUgaXMgYSBmaWxlbmFtZSBvciBhIGRpcmVjdG9yeSBsb2NhdGlvbiBvciB0byBiZSB1c2VkIGFzIGlzIHcvbyBpbnRlcnByZXRhdGlvbi4nKSwKLSh1J1JlZ0xvY2F0b3InLCB1J0tleScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnUmVnUGF0aCcsIE5vbmUsIHUnVGhlIGtleSBmb3IgdGhlIHJlZ2lzdHJ5IHZhbHVlLicpLAotKHUnUmVnTG9jYXRvcicsIHUnU2lnbmF0dXJlXycsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnVGhlIHRhYmxlIGtleS4gVGhlIFNpZ25hdHVyZV8gcmVwcmVzZW50cyBhIHVuaXF1ZSBmaWxlIHNpZ25hdHVyZSBhbmQgaXMgYWxzbyB0aGUgZm9yZWlnbiBrZXkgaW4gdGhlIFNpZ25hdHVyZSB0YWJsZS4gSWYgdGhlIHR5cGUgaXMgMCwgdGhlIHJlZ2lzdHJ5IHZhbHVlcyByZWZlcnMgYSBkaXJlY3RvcnksIGFuZCBfU2lnbmF0dXJlIGlzIG5vdCBhIGZvcmVpZ24ga2V5LicpLAotKHUnUmVnTG9jYXRvcicsIHUnUm9vdCcsIHUnTicsIDAsIDMsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGhlIHByZWRlZmluZWQgcm9vdCBrZXkgZm9yIHRoZSByZWdpc3RyeSB2YWx1ZSwgb25lIG9mIHJya0VudW0uJyksCi0odSdSZW1vdmVGaWxlJywgdSdJbnN0YWxsTW9kZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnMTsyOzMnLCB1J0luc3RhbGxhdGlvbiBvcHRpb24sIG9uZSBvZiBpaW1FbnVtLicpLAotKHUnUmVtb3ZlRmlsZScsIHUnQ29tcG9uZW50XycsIHUnTicsIE5vbmUsIE5vbmUsIHUnQ29tcG9uZW50JywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSByZWZlcmVuY2luZyBDb21wb25lbnQgdGhhdCBjb250cm9scyB0aGUgZmlsZSB0byBiZSByZW1vdmVkLicpLAotKHUnUmVtb3ZlRmlsZScsIHUnRmlsZUtleScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXkgdXNlZCB0byBpZGVudGlmeSBhIHBhcnRpY3VsYXIgZmlsZSBlbnRyeScpLAotKHUnUmVtb3ZlRmlsZScsIHUnRmlsZU5hbWUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1dpbGRDYXJkRmlsZW5hbWUnLCBOb25lLCB1J05hbWUgb2YgdGhlIGZpbGUgdG8gYmUgcmVtb3ZlZC4nKSwKLSh1J1JlbW92ZUZpbGUnLCB1J0RpclByb3BlcnR5JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdOYW1lIG9mIGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYXNzdW1lZCB0byByZXNvbHZlIHRvIHRoZSBmdWxsIHBhdGhuYW1lIHRvIHRoZSBmb2xkZXIgb2YgdGhlIGZpbGUgdG8gYmUgcmVtb3ZlZC4nKSwKLSh1J1JlbW92ZUluaUZpbGUnLCB1J0FjdGlvbicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnMjs0JywgdSdUaGUgdHlwZSBvZiBtb2RpZmljYXRpb24gdG8gYmUgbWFkZSwgb25lIG9mIGlpZkVudW0uJyksCi0odSdSZW1vdmVJbmlGaWxlJywgdSdWYWx1ZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgdmFsdWUgdG8gYmUgZGVsZXRlZC4gVGhlIHZhbHVlIGlzIHJlcXVpcmVkIHdoZW4gQWN0aW9uIGlzIGlpZkluaVJlbW92ZVRhZycpLAotKHUnUmVtb3ZlSW5pRmlsZScsIHUnS2V5JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J1RoZSAuSU5JIGZpbGUga2V5IGJlbG93IFNlY3Rpb24uJyksCi0odSdSZW1vdmVJbmlGaWxlJywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gdGhlIENvbXBvbmVudCB0YWJsZSByZWZlcmVuY2luZyBjb21wb25lbnQgdGhhdCBjb250cm9scyB0aGUgZGVsZXRpb24gb2YgdGhlIC5JTkkgdmFsdWUuJyksCi0odSdSZW1vdmVJbmlGaWxlJywgdSdGaWxlTmFtZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRmlsZW5hbWUnLCBOb25lLCB1J1RoZSAuSU5JIGZpbGUgbmFtZSBpbiB3aGljaCB0byBkZWxldGUgdGhlIGluZm9ybWF0aW9uJyksCi0odSdSZW1vdmVJbmlGaWxlJywgdSdEaXJQcm9wZXJ0eScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yZWlnbiBrZXkgaW50byB0aGUgRGlyZWN0b3J5IHRhYmxlIGRlbm90aW5nIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIC5JTkkgZmlsZSBpcy4nKSwKLSh1J1JlbW92ZUluaUZpbGUnLCB1J1NlY3Rpb24nLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnVGhlIC5JTkkgZmlsZSBTZWN0aW9uLicpLAotKHUnUmVtb3ZlSW5pRmlsZScsIHUnUmVtb3ZlSW5pRmlsZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUHJpbWFyeSBrZXksIG5vbi1sb2NhbGl6ZWQgdG9rZW4uJyksCi0odSdSZW1vdmVSZWdpc3RyeScsIHUnTmFtZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgcmVnaXN0cnkgdmFsdWUgbmFtZS4nKSwKLSh1J1JlbW92ZVJlZ2lzdHJ5JywgdSdLZXknLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1JlZ1BhdGgnLCBOb25lLCB1J1RoZSBrZXkgZm9yIHRoZSByZWdpc3RyeSB2YWx1ZS4nKSwKLSh1J1JlbW92ZVJlZ2lzdHJ5JywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gdGhlIENvbXBvbmVudCB0YWJsZSByZWZlcmVuY2luZyBjb21wb25lbnQgdGhhdCBjb250cm9scyB0aGUgZGVsZXRpb24gb2YgdGhlIHJlZ2lzdHJ5IHZhbHVlLicpLAotKHUnUmVtb3ZlUmVnaXN0cnknLCB1J1Jvb3QnLCB1J04nLCAtMSwgMywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUaGUgcHJlZGVmaW5lZCByb290IGtleSBmb3IgdGhlIHJlZ2lzdHJ5IHZhbHVlLCBvbmUgb2YgcnJrRW51bScpLAotKHUnUmVtb3ZlUmVnaXN0cnknLCB1J1JlbW92ZVJlZ2lzdHJ5JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdQcmltYXJ5IGtleSwgbm9uLWxvY2FsaXplZCB0b2tlbi4nKSwKLSh1J1Jlc2VydmVDb3N0JywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1Jlc2VydmUgYSBzcGVjaWZpZWQgYW1vdW50IG9mIHNwYWNlIGlmIHRoaXMgY29tcG9uZW50IGlzIHRvIGJlIGluc3RhbGxlZC4nKSwKLSh1J1Jlc2VydmVDb3N0JywgdSdSZXNlcnZlRm9sZGVyJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdOYW1lIG9mIGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYXNzdW1lZCB0byByZXNvbHZlIHRvIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeScpLAotKHUnUmVzZXJ2ZUNvc3QnLCB1J1Jlc2VydmVLZXknLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1ByaW1hcnkga2V5IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgUmVzZXJ2ZUNvc3QgcmVjb3JkJyksCi0odSdSZXNlcnZlQ29zdCcsIHUnUmVzZXJ2ZUxvY2FsJywgdSdOJywgMCwgMjE0NzQ4MzY0NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdEaXNrIHNwYWNlIHRvIHJlc2VydmUgaWYgbGlua2VkIGNvbXBvbmVudCBpcyBpbnN0YWxsZWQgbG9jYWxseS4nKSwKLSh1J1Jlc2VydmVDb3N0JywgdSdSZXNlcnZlU291cmNlJywgdSdOJywgMCwgMjE0NzQ4MzY0NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdEaXNrIHNwYWNlIHRvIHJlc2VydmUgaWYgbGlua2VkIGNvbXBvbmVudCBpcyBpbnN0YWxsZWQgdG8gcnVuIGZyb20gdGhlIHNvdXJjZSBsb2NhdGlvbi4nKSwKLSh1J1NlbGZSZWcnLCB1J0ZpbGVfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdGaWxlJywgMSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdGb3JlaWduIGtleSBpbnRvIHRoZSBGaWxlIHRhYmxlIGRlbm90aW5nIHRoZSBtb2R1bGUgdGhhdCBuZWVkcyB0byBiZSByZWdpc3RlcmVkLicpLAotKHUnU2VsZlJlZycsIHUnQ29zdCcsIHUnWScsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBjb3N0IG9mIHJlZ2lzdGVyaW5nIHRoZSBtb2R1bGUuJyksCi0odSdTZXJ2aWNlQ29udHJvbCcsIHUnTmFtZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdOYW1lIG9mIGEgc2VydmljZS4gLywgXFwsIGNvbW1hIGFuZCBzcGFjZSBhcmUgaW52YWxpZCcpLAotKHUnU2VydmljZUNvbnRyb2wnLCB1J0V2ZW50JywgdSdOJywgMCwgMTg3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0JpdCBmaWVsZDogIEluc3RhbGw6ICAweDEgPSBTdGFydCwgMHgyID0gU3RvcCwgMHg4ID0gRGVsZXRlLCBVbmluc3RhbGw6IDB4MTAgPSBTdGFydCwgMHgyMCA9IFN0b3AsIDB4ODAgPSBEZWxldGUnKSwKLSh1J1NlcnZpY2VDb250cm9sJywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1JlcXVpcmVkIGZvcmVpZ24ga2V5IGludG8gdGhlIENvbXBvbmVudCBUYWJsZSB0aGF0IGNvbnRyb2xzIHRoZSBzdGFydHVwIG9mIHRoZSBzZXJ2aWNlJyksCi0odSdTZXJ2aWNlQ29udHJvbCcsIHUnU2VydmljZUNvbnRyb2wnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1ByaW1hcnkga2V5LCBub24tbG9jYWxpemVkIHRva2VuLicpLAotKHUnU2VydmljZUNvbnRyb2wnLCB1J0FyZ3VtZW50cycsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdBcmd1bWVudHMgZm9yIHRoZSBzZXJ2aWNlLiAgU2VwYXJhdGUgYnkgW35dLicpLAotKHUnU2VydmljZUNvbnRyb2wnLCB1J1dhaXQnLCB1J1knLCAwLCAxLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Jvb2xlYW4gZm9yIHdoZXRoZXIgdG8gd2FpdCBmb3IgdGhlIHNlcnZpY2UgdG8gZnVsbHkgc3RhcnQnKSwKLSh1J1NlcnZpY2VJbnN0YWxsJywgdSdOYW1lJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J0ludGVybmFsIE5hbWUgb2YgdGhlIFNlcnZpY2UnKSwKLSh1J1NlcnZpY2VJbnN0YWxsJywgdSdEZXNjcmlwdGlvbicsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnRGVzY3JpcHRpb24gb2Ygc2VydmljZS4nKSwKLSh1J1NlcnZpY2VJbnN0YWxsJywgdSdDb21wb25lbnRfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdDb21wb25lbnQnLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J1JlcXVpcmVkIGZvcmVpZ24ga2V5IGludG8gdGhlIENvbXBvbmVudCBUYWJsZSB0aGF0IGNvbnRyb2xzIHRoZSBzdGFydHVwIG9mIHRoZSBzZXJ2aWNlJyksCi0odSdTZXJ2aWNlSW5zdGFsbCcsIHUnQXJndW1lbnRzJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J0FyZ3VtZW50cyB0byBpbmNsdWRlIGluIGV2ZXJ5IHN0YXJ0IG9mIHRoZSBzZXJ2aWNlLCBwYXNzZWQgdG8gV2luTWFpbicpLAotKHUnU2VydmljZUluc3RhbGwnLCB1J1NlcnZpY2VJbnN0YWxsJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdQcmltYXJ5IGtleSwgbm9uLWxvY2FsaXplZCB0b2tlbi4nKSwKLSh1J1NlcnZpY2VJbnN0YWxsJywgdSdEZXBlbmRlbmNpZXMnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnT3RoZXIgc2VydmljZXMgdGhpcyBkZXBlbmRzIG9uIHRvIHN0YXJ0LiAgU2VwYXJhdGUgYnkgW35dLCBhbmQgZW5kIHdpdGggW35dW35dJyksCi0odSdTZXJ2aWNlSW5zdGFsbCcsIHUnRGlzcGxheU5hbWUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnRXh0ZXJuYWwgTmFtZSBvZiB0aGUgU2VydmljZScpLAotKHUnU2VydmljZUluc3RhbGwnLCB1J0Vycm9yQ29udHJvbCcsIHUnTicsIC0yMTQ3NDgzNjQ3LCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1NldmVyaXR5IG9mIGVycm9yIGlmIHNlcnZpY2UgZmFpbHMgdG8gc3RhcnQnKSwKLSh1J1NlcnZpY2VJbnN0YWxsJywgdSdMb2FkT3JkZXJHcm91cCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdMb2FkT3JkZXJHcm91cCcpLAotKHUnU2VydmljZUluc3RhbGwnLCB1J1Bhc3N3b3JkJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J3Bhc3N3b3JkIHRvIHJ1biBzZXJ2aWNlIHdpdGguICAod2l0aCBTdGFydE5hbWUpJyksCi0odSdTZXJ2aWNlSW5zdGFsbCcsIHUnU2VydmljZVR5cGUnLCB1J04nLCAtMjE0NzQ4MzY0NywgMjE0NzQ4MzY0NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUeXBlIG9mIHRoZSBzZXJ2aWNlJyksCi0odSdTZXJ2aWNlSW5zdGFsbCcsIHUnU3RhcnROYW1lJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGb3JtYXR0ZWQnLCBOb25lLCB1J1VzZXIgb3Igb2JqZWN0IG5hbWUgdG8gcnVuIHNlcnZpY2UgYXMnKSwKLSh1J1NlcnZpY2VJbnN0YWxsJywgdSdTdGFydFR5cGUnLCB1J04nLCAwLCA0LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1R5cGUgb2YgdGhlIHNlcnZpY2UnKSwKLSh1J1Nob3J0Y3V0JywgdSdOYW1lJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGaWxlbmFtZScsIE5vbmUsIHUnVGhlIG5hbWUgb2YgdGhlIHNob3J0Y3V0IHRvIGJlIGNyZWF0ZWQuJyksCi0odSdTaG9ydGN1dCcsIHUnRGVzY3JpcHRpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHNob3J0Y3V0LicpLAotKHUnU2hvcnRjdXQnLCB1J0NvbXBvbmVudF8nLCB1J04nLCBOb25lLCBOb25lLCB1J0NvbXBvbmVudCcsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnRm9yZWlnbiBrZXkgaW50byB0aGUgQ29tcG9uZW50IHRhYmxlIGRlbm90aW5nIHRoZSBjb21wb25lbnQgd2hvc2Ugc2VsZWN0aW9uIGdhdGVzIHRoZSB0aGUgc2hvcnRjdXQgY3JlYXRpb24vZGVsZXRpb24uJyksCi0odSdTaG9ydGN1dCcsIHUnSWNvbl8nLCB1J1knLCBOb25lLCBOb25lLCB1J0ljb24nLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gdGhlIEZpbGUgdGFibGUgZGVub3RpbmcgdGhlIGV4dGVybmFsIGljb24gZmlsZSBmb3IgdGhlIHNob3J0Y3V0LicpLAotKHUnU2hvcnRjdXQnLCB1J0ljb25JbmRleCcsIHUnWScsIC0zMjc2NywgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGhlIGljb24gaW5kZXggZm9yIHRoZSBzaG9ydGN1dC4nKSwKLSh1J1Nob3J0Y3V0JywgdSdEaXJlY3RvcnlfJywgdSdOJywgTm9uZSwgTm9uZSwgdSdEaXJlY3RvcnknLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J0ZvcmVpZ24ga2V5IGludG8gdGhlIERpcmVjdG9yeSB0YWJsZSBkZW5vdGluZyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzaG9ydGN1dCBmaWxlIGlzIGNyZWF0ZWQuJyksCi0odSdTaG9ydGN1dCcsIHUnVGFyZ2V0JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdTaG9ydGN1dCcsIE5vbmUsIHUnVGhlIHNob3J0Y3V0IHRhcmdldC4gVGhpcyBpcyB1c3VhbGx5IGEgcHJvcGVydHkgdGhhdCBpcyBleHBhbmRlZCB0byBhIGZpbGUgb3IgYSBmb2xkZXIgdGhhdCB0aGUgc2hvcnRjdXQgcG9pbnRzIHRvLicpLAotKHUnU2hvcnRjdXQnLCB1J0FyZ3VtZW50cycsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgdGhlIHNob3J0Y3V0LicpLAotKHUnU2hvcnRjdXQnLCB1J1Nob3J0Y3V0JywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdJZGVudGlmaWVyJywgTm9uZSwgdSdQcmltYXJ5IGtleSwgbm9uLWxvY2FsaXplZCB0b2tlbi4nKSwKLSh1J1Nob3J0Y3V0JywgdSdIb3RrZXknLCB1J1knLCAwLCAzMjc2NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUaGUgaG90a2V5IGZvciB0aGUgc2hvcnRjdXQuIEl0IGhhcyB0aGUgdmlydHVhbC1rZXkgY29kZSBmb3IgdGhlIGtleSBpbiB0aGUgbG93LW9yZGVyIGJ5dGUsIGFuZCB0aGUgbW9kaWZpZXIgZmxhZ3MgaW4gdGhlIGhpZ2gtb3JkZXIgYnl0ZS4gJyksCi0odSdTaG9ydGN1dCcsIHUnU2hvd0NtZCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnMTszOzcnLCB1J1RoZSBzaG93IGNvbW1hbmQgZm9yIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cuVGhlIGZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHVzZWQuJyksCi0odSdTaG9ydGN1dCcsIHUnV2tEaXInLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J05hbWUgb2YgcHJvcGVydHkgZGVmaW5pbmcgbG9jYXRpb24gb2Ygd29ya2luZyBkaXJlY3RvcnkuJyksCi0odSdTaWduYXR1cmUnLCB1J0ZpbGVOYW1lJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdGaWxlbmFtZScsIE5vbmUsIHUnVGhlIG5hbWUgb2YgdGhlIGZpbGUuIFRoaXMgbWF5IGNvbnRhaW4gYSAic2hvcnQgbmFtZXxsb25nIG5hbWUiIHBhaXIuJyksCi0odSdTaWduYXR1cmUnLCB1J1NpZ25hdHVyZScsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnVGhlIHRhYmxlIGtleS4gVGhlIFNpZ25hdHVyZSByZXByZXNlbnRzIGEgdW5pcXVlIGZpbGUgc2lnbmF0dXJlLicpLAotKHUnU2lnbmF0dXJlJywgdSdMYW5ndWFnZXMnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0xhbmd1YWdlJywgTm9uZSwgdSdUaGUgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSB0aGUgZmlsZS4nKSwKLSh1J1NpZ25hdHVyZScsIHUnTWF4RGF0ZScsIHUnWScsIDAsIDIxNDc0ODM2NDcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGhlIG1heGltdW0gY3JlYXRpb24gZGF0ZSBvZiB0aGUgZmlsZS4nKSwKLSh1J1NpZ25hdHVyZScsIHUnTWF4U2l6ZScsIHUnWScsIDAsIDIxNDc0ODM2NDcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZmlsZS4gJyksCi0odSdTaWduYXR1cmUnLCB1J01heFZlcnNpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSBtYXhpbXVtIHZlcnNpb24gb2YgdGhlIGZpbGUuJyksCi0odSdTaWduYXR1cmUnLCB1J01pbkRhdGUnLCB1J1knLCAwLCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBtaW5pbXVtIGNyZWF0aW9uIGRhdGUgb2YgdGhlIGZpbGUuJyksCi0odSdTaWduYXR1cmUnLCB1J01pblNpemUnLCB1J1knLCAwLCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGZpbGUuJyksCi0odSdTaWduYXR1cmUnLCB1J01pblZlcnNpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCB1J1RoZSBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIGZpbGUuJyksCi0odSdUeXBlTGliJywgdSdGZWF0dXJlXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnRmVhdHVyZScsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUmVxdWlyZWQgZm9yZWlnbiBrZXkgaW50byB0aGUgRmVhdHVyZSBUYWJsZSwgc3BlY2lmeWluZyB0aGUgZmVhdHVyZSB0byB2YWxpZGF0ZSBvciBpbnN0YWxsIGluIG9yZGVyIGZvciB0aGUgdHlwZSBsaWJyYXJ5IHRvIGJlIG9wZXJhdGlvbmFsLicpLAotKHUnVHlwZUxpYicsIHUnRGVzY3JpcHRpb24nLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RleHQnLCBOb25lLCBOb25lKSwKLSh1J1R5cGVMaWInLCB1J0NvbXBvbmVudF8nLCB1J04nLCBOb25lLCBOb25lLCB1J0NvbXBvbmVudCcsIDEsIHUnSWRlbnRpZmllcicsIE5vbmUsIHUnUmVxdWlyZWQgZm9yZWlnbiBrZXkgaW50byB0aGUgQ29tcG9uZW50IFRhYmxlLCBzcGVjaWZ5aW5nIHRoZSBjb21wb25lbnQgZm9yIHdoaWNoIHRvIHJldHVybiBhIHBhdGggd2hlbiBjYWxsZWQgdGhyb3VnaCBMb2NhdGVDb21wb25lbnQuJyksCi0odSdUeXBlTGliJywgdSdEaXJlY3RvcnlfJywgdSdZJywgTm9uZSwgTm9uZSwgdSdEaXJlY3RvcnknLCAxLCB1J0lkZW50aWZpZXInLCBOb25lLCB1J09wdGlvbmFsLiBUaGUgZm9yZWlnbiBrZXkgaW50byB0aGUgRGlyZWN0b3J5IHRhYmxlIGRlbm90aW5nIHRoZSBwYXRoIHRvIHRoZSBoZWxwIGZpbGUgZm9yIHRoZSB0eXBlIGxpYnJhcnkuJyksCi0odSdUeXBlTGliJywgdSdMYW5ndWFnZScsIHUnTicsIDAsIDMyNzY3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBsYW5ndWFnZSBvZiB0aGUgbGlicmFyeS4nKSwKLSh1J1R5cGVMaWInLCB1J1ZlcnNpb24nLCB1J1knLCAwLCAxNjc3NzIxNSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUaGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gVGhlIG1pbm9yIHZlcnNpb24gaXMgaW4gdGhlIGxvd2VyIDggYml0cyBvZiB0aGUgaW50ZWdlci4gVGhlIG1ham9yIHZlcnNpb24gaXMgaW4gdGhlIG5leHQgMTYgYml0cy4gJyksCi0odSdUeXBlTGliJywgdSdDb3N0JywgdSdZJywgMCwgMjE0NzQ4MzY0NywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUaGUgY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJhdGlvbiBvZiB0aGUgdHlwZWxpYi4gVGhpcyBjb2x1bW4gaXMgY3VycmVudGx5IG9wdGlvbmFsLicpLAotKHUnVHlwZUxpYicsIHUnTGliSUQnLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0d1aWQnLCBOb25lLCB1J1RoZSBHVUlEIHRoYXQgcmVwcmVzZW50cyB0aGUgbGlicmFyeS4nKSwKLSh1J1VwZ3JhZGUnLCB1J0F0dHJpYnV0ZXMnLCB1J04nLCAwLCAyMTQ3NDgzNjQ3LCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1RoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgcHJvZHVjdCBzZXQuJyksCi0odSdVcGdyYWRlJywgdSdSZW1vdmUnLCB1J1knLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J0Zvcm1hdHRlZCcsIE5vbmUsIHUnVGhlIGxpc3Qgb2YgZmVhdHVyZXMgdG8gcmVtb3ZlIHdoZW4gdW5pbnN0YWxsaW5nIGEgcHJvZHVjdCBmcm9tIHRoaXMgc2V0LiAgVGhlIGRlZmF1bHQgaXMgIkFMTCIuJyksCi0odSdVcGdyYWRlJywgdSdMYW5ndWFnZScsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnTGFuZ3VhZ2UnLCBOb25lLCB1J0EgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGFuZ3VhZ2VzIGZvciBlaXRoZXIgcHJvZHVjdHMgaW4gdGhpcyBzZXQgb3IgcHJvZHVjdHMgbm90IGluIHRoaXMgc2V0LicpLAotKHUnVXBncmFkZScsIHUnQWN0aW9uUHJvcGVydHknLCB1J04nLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCB1J1VwcGVyQ2FzZScsIE5vbmUsIHUnVGhlIHByb3BlcnR5IHRvIHNldCB3aGVuIGEgcHJvZHVjdCBpbiB0aGlzIHNldCBpcyBmb3VuZC4nKSwKLSh1J1VwZ3JhZGUnLCB1J1VwZ3JhZGVDb2RlJywgdSdOJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdHdWlkJywgTm9uZSwgdSdUaGUgVXBncmFkZUNvZGUgR1VJRCBiZWxvbmdpbmcgdG8gdGhlIHByb2R1Y3RzIGluIHRoaXMgc2V0LicpLAotKHUnVXBncmFkZScsIHUnVmVyc2lvbk1heCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGhlIG1heGltdW0gUHJvZHVjdFZlcnNpb24gb2YgdGhlIHByb2R1Y3RzIGluIHRoaXMgc2V0LiAgVGhlIHNldCBtYXkgb3IgbWF5IG5vdCBpbmNsdWRlIHByb2R1Y3RzIHdpdGggdGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24uJyksCi0odSdVcGdyYWRlJywgdSdWZXJzaW9uTWluJywgdSdZJywgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgdSdUZXh0JywgTm9uZSwgdSdUaGUgbWluaW11bSBQcm9kdWN0VmVyc2lvbiBvZiB0aGUgcHJvZHVjdHMgaW4gdGhpcyBzZXQuICBUaGUgc2V0IG1heSBvciBtYXkgbm90IGluY2x1ZGUgcHJvZHVjdHMgd2l0aCB0aGlzIHBhcnRpY3VsYXIgdmVyc2lvbi4nKSwKLSh1J1ZlcmInLCB1J1NlcXVlbmNlJywgdSdZJywgMCwgMzI3NjcsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnT3JkZXIgd2l0aGluIHRoZSB2ZXJicyBmb3IgYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbi4gQWxzbyB1c2VkIHNpbXBseSB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IHZlcmIuJyksCi0odSdWZXJiJywgdSdBcmd1bWVudCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdPcHRpb25hbCB2YWx1ZSBmb3IgdGhlIGNvbW1hbmQgYXJndW1lbnRzLicpLAotKHUnVmVyYicsIHUnRXh0ZW5zaW9uXycsIHUnTicsIE5vbmUsIE5vbmUsIHUnRXh0ZW5zaW9uJywgMSwgdSdUZXh0JywgTm9uZSwgdSdUaGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGUgcm93LicpLAotKHUnVmVyYicsIHUnVmVyYicsIHUnTicsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnVGV4dCcsIE5vbmUsIHUnVGhlIHZlcmIgZm9yIHRoZSBjb21tYW5kLicpLAotKHUnVmVyYicsIHUnQ29tbWFuZCcsIHUnWScsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIHUnRm9ybWF0dGVkJywgTm9uZSwgdSdUaGUgY29tbWFuZCB0ZXh0LicpLAotXQotCi1FcnJvciA9IFsKLSgwLCB1J3t7RmF0YWwgZXJyb3I6IH19JyksCi0oMSwgdSd7e0Vycm9yIFsxXS4gfX0nKSwKLSgyLCB1J1dhcm5pbmcgWzFdLiAnKSwKLSgzLCBOb25lKSwKLSg0LCB1J0luZm8gWzFdLiAnKSwKLSg1LCB1J1RoZSBpbnN0YWxsZXIgaGFzIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgZXJyb3IgaW5zdGFsbGluZyB0aGlzIHBhY2thZ2UuIFRoaXMgbWF5IGluZGljYXRlIGEgcHJvYmxlbSB3aXRoIHRoaXMgcGFja2FnZS4gVGhlIGVycm9yIGNvZGUgaXMgWzFdLiB7e1RoZSBhcmd1bWVudHMgYXJlOiBbMl0sIFszXSwgWzRdfX0nKSwKLSg2LCBOb25lKSwKLSg3LCB1J3t7RGlzayBmdWxsOiB9fScpLAotKDgsIHUnQWN0aW9uIFtUaW1lXTogWzFdLiBbMl0nKSwKLSg5LCB1J1tQcm9kdWN0TmFtZV0nKSwKLSgxMCwgdSd7WzJdfXssIFszXX17LCBbNF19JyksCi0oMTEsIHUnTWVzc2FnZSB0eXBlOiBbMV0sIEFyZ3VtZW50OiBbMl0nKSwKLSgxMiwgdSc9PT0gTG9nZ2luZyBzdGFydGVkOiBbRGF0ZV0gIFtUaW1lXSA9PT0nKSwKLSgxMywgdSc9PT0gTG9nZ2luZyBzdG9wcGVkOiBbRGF0ZV0gIFtUaW1lXSA9PT0nKSwKLSgxNCwgdSdBY3Rpb24gc3RhcnQgW1RpbWVdOiBbMV0uJyksCi0oMTUsIHUnQWN0aW9uIGVuZGVkIFtUaW1lXTogWzFdLiBSZXR1cm4gdmFsdWUgWzJdLicpLAotKDE2LCB1J1RpbWUgcmVtYWluaW5nOiB7WzFdIG1pbnV0ZXMgfXtbMl0gc2Vjb25kc30nKSwKLSgxNywgdSdPdXQgb2YgbWVtb3J5LiBTaHV0IGRvd24gb3RoZXIgYXBwbGljYXRpb25zIGJlZm9yZSByZXRyeWluZy4nKSwKLSgxOCwgdSdJbnN0YWxsZXIgaXMgbm8gbG9uZ2VyIHJlc3BvbmRpbmcuJyksCi0oMTksIHUnSW5zdGFsbGVyIHN0b3BwZWQgcHJlbWF0dXJlbHkuJyksCi0oMjAsIHUnUGxlYXNlIHdhaXQgd2hpbGUgV2luZG93cyBjb25maWd1cmVzIFtQcm9kdWN0TmFtZV0nKSwKLSgyMSwgdSdHYXRoZXJpbmcgcmVxdWlyZWQgaW5mb3JtYXRpb24uLi4nKSwKLSgyMiwgdSdSZW1vdmluZyBvbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGFwcGxpY2F0aW9uLi4uJyksCi0oMjMsIHUnUHJlcGFyaW5nIHRvIHJlbW92ZSBvbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGFwcGxpY2F0aW9uLi4uJyksCi0oMzIsIHUne1tQcm9kdWN0TmFtZV0gfVNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyksCi0oMzMsIHUne1tQcm9kdWN0TmFtZV0gfVNldHVwIGZhaWxlZC4nKSwKLSgxMTAxLCB1J0Vycm9yIHJlYWRpbmcgZnJvbSBmaWxlOiBbMl0uIHt7IFN5c3RlbSBlcnJvciBbM10ufX0gIFZlcmlmeSB0aGF0IHRoZSBmaWxlIGV4aXN0cyBhbmQgdGhhdCB5b3UgY2FuIGFjY2VzcyBpdC4nKSwKLSgxMzAxLCB1IkNhbm5vdCBjcmVhdGUgdGhlIGZpbGUgJ1syXScuICBBIGRpcmVjdG9yeSB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4gIENhbmNlbCB0aGUgaW5zdGFsbCBhbmQgdHJ5IGluc3RhbGxpbmcgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uIiksCi0oMTMwMiwgdSdQbGVhc2UgaW5zZXJ0IHRoZSBkaXNrOiBbMl0nKSwKLSgxMzAzLCB1J1RoZSBpbnN0YWxsZXIgaGFzIGluc3VmZmljaWVudCBwcml2aWxlZ2VzIHRvIGFjY2VzcyB0aGlzIGRpcmVjdG9yeTogWzJdLiAgVGhlIGluc3RhbGxhdGlvbiBjYW5ub3QgY29udGludWUuICBMb2cgb24gYXMgYWRtaW5pc3RyYXRvciBvciBjb250YWN0IHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IuJyksCi0oMTMwNCwgdSdFcnJvciB3cml0aW5nIHRvIGZpbGU6IFsyXS4gIFZlcmlmeSB0aGF0IHlvdSBoYXZlIGFjY2VzcyB0byB0aGF0IGRpcmVjdG9yeS4nKSwKLSgxMzA1LCB1J0Vycm9yIHJlYWRpbmcgZnJvbSBmaWxlIFsyXS4ge3sgU3lzdGVtIGVycm9yIFszXS59fSBWZXJpZnkgdGhhdCB0aGUgZmlsZSBleGlzdHMgYW5kIHRoYXQgeW91IGNhbiBhY2Nlc3MgaXQuJyksCi0oMTMwNiwgdSJBbm90aGVyIGFwcGxpY2F0aW9uIGhhcyBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBmaWxlICdbMl0nLiAgUGxlYXNlIHNodXQgZG93biBhbGwgb3RoZXIgYXBwbGljYXRpb25zLCB0aGVuIGNsaWNrIFJldHJ5LiIpLAotKDEzMDcsIHUnVGhlcmUgaXMgbm90IGVub3VnaCBkaXNrIHNwYWNlIHRvIGluc3RhbGwgdGhpcyBmaWxlOiBbMl0uICBGcmVlIHNvbWUgZGlzayBzcGFjZSBhbmQgY2xpY2sgUmV0cnksIG9yIGNsaWNrIENhbmNlbCB0byBleGl0LicpLAotKDEzMDgsIHUnU291cmNlIGZpbGUgbm90IGZvdW5kOiBbMl0uICBWZXJpZnkgdGhhdCB0aGUgZmlsZSBleGlzdHMgYW5kIHRoYXQgeW91IGNhbiBhY2Nlc3MgaXQuJyksCi0oMTMwOSwgdSdFcnJvciByZWFkaW5nIGZyb20gZmlsZTogWzNdLiB7eyBTeXN0ZW0gZXJyb3IgWzJdLn19ICBWZXJpZnkgdGhhdCB0aGUgZmlsZSBleGlzdHMgYW5kIHRoYXQgeW91IGNhbiBhY2Nlc3MgaXQuJyksCi0oMTMxMCwgdSdFcnJvciB3cml0aW5nIHRvIGZpbGU6IFszXS4ge3sgU3lzdGVtIGVycm9yIFsyXS59fSAgVmVyaWZ5IHRoYXQgeW91IGhhdmUgYWNjZXNzIHRvIHRoYXQgZGlyZWN0b3J5LicpLAotKDEzMTEsIHUnU291cmNlIGZpbGUgbm90IGZvdW5ke3soY2FiaW5ldCl9fTogWzJdLiAgVmVyaWZ5IHRoYXQgdGhlIGZpbGUgZXhpc3RzIGFuZCB0aGF0IHlvdSBjYW4gYWNjZXNzIGl0LicpLAotKDEzMTIsIHUiQ2Fubm90IGNyZWF0ZSB0aGUgZGlyZWN0b3J5ICdbMl0nLiAgQSBmaWxlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLiAgUGxlYXNlIHJlbmFtZSBvciByZW1vdmUgdGhlIGZpbGUgYW5kIGNsaWNrIHJldHJ5LCBvciBjbGljayBDYW5jZWwgdG8gZXhpdC4iKSwKLSgxMzEzLCB1J1RoZSB2b2x1bWUgWzJdIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gIFBsZWFzZSBzZWxlY3QgYW5vdGhlci4nKSwKLSgxMzE0LCB1IlRoZSBzcGVjaWZpZWQgcGF0aCAnWzJdJyBpcyB1bmF2YWlsYWJsZS4iKSwKLSgxMzE1LCB1J1VuYWJsZSB0byB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGZvbGRlcjogWzJdLicpLAotKDEzMTYsIHUnQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSBmaWxlOiBbMl0nKSwKLSgxMzE3LCB1J0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIHRoZSBkaXJlY3Rvcnk6IFsyXScpLAotKDEzMTgsIHUnQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIHRoZSBkaXJlY3Rvcnk6IFsyXScpLAotKDEzMTksIHUnQSBuZXR3b3JrIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gb3BlbiB0aGUgc291cmNlIGZpbGUgY2FiaW5ldDogWzJdJyksCi0oMTMyMCwgdSdUaGUgc3BlY2lmaWVkIHBhdGggaXMgdG9vIGxvbmc6IFsyXScpLAotKDEzMjEsIHUnVGhlIEluc3RhbGxlciBoYXMgaW5zdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gbW9kaWZ5IHRoaXMgZmlsZTogWzJdLicpLAotKDEzMjIsIHUiQSBwb3J0aW9uIG9mIHRoZSBmb2xkZXIgcGF0aCAnWzJdJyBpcyBpbnZhbGlkLiAgSXQgaXMgZWl0aGVyIGVtcHR5IG9yIGV4Y2VlZHMgdGhlIGxlbmd0aCBhbGxvd2VkIGJ5IHRoZSBzeXN0ZW0uIiksCi0oMTMyMywgdSJUaGUgZm9sZGVyIHBhdGggJ1syXScgY29udGFpbnMgd29yZHMgdGhhdCBhcmUgbm90IHZhbGlkIGluIGZvbGRlciBwYXRocy4iKSwKLSgxMzI0LCB1IlRoZSBmb2xkZXIgcGF0aCAnWzJdJyBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3Rlci4iKSwKLSgxMzI1LCB1IidbMl0nIGlzIG5vdCBhIHZhbGlkIHNob3J0IGZpbGUgbmFtZS4iKSwKLSgxMzI2LCB1J0Vycm9yIGdldHRpbmcgZmlsZSBzZWN1cml0eTogWzNdIEdldExhc3RFcnJvcjogWzJdJyksCi0oMTMyNywgdSdJbnZhbGlkIERyaXZlOiBbMl0nKSwKLSgxMzI4LCB1J0Vycm9yIGFwcGx5aW5nIHBhdGNoIHRvIGZpbGUgWzJdLiAgSXQgaGFzIHByb2JhYmx5IGJlZW4gdXBkYXRlZCBieSBvdGhlciBtZWFucywgYW5kIGNhbiBubyBsb25nZXIgYmUgbW9kaWZpZWQgYnkgdGhpcyBwYXRjaC4gIEZvciBtb3JlIGluZm9ybWF0aW9uIGNvbnRhY3QgeW91ciBwYXRjaCB2ZW5kb3IuICB7e1N5c3RlbSBFcnJvcjogWzNdfX0nKSwKLSgxMzI5LCB1J0EgZmlsZSB0aGF0IGlzIHJlcXVpcmVkIGNhbm5vdCBiZSBpbnN0YWxsZWQgYmVjYXVzZSB0aGUgY2FiaW5ldCBmaWxlIFsyXSBpcyBub3QgZGlnaXRhbGx5IHNpZ25lZC4gIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGNhYmluZXQgZmlsZSBpcyBjb3JydXB0LicpLAotKDEzMzAsIHUnQSBmaWxlIHRoYXQgaXMgcmVxdWlyZWQgY2Fubm90IGJlIGluc3RhbGxlZCBiZWNhdXNlIHRoZSBjYWJpbmV0IGZpbGUgWzJdIGhhcyBhbiBpbnZhbGlkIGRpZ2l0YWwgc2lnbmF0dXJlLiAgVGhpcyBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgY2FiaW5ldCBmaWxlIGlzIGNvcnJ1cHQue3sgIEVycm9yIFszXSB3YXMgcmV0dXJuZWQgYnkgV2luVmVyaWZ5VHJ1c3QufX0nKSwKLSgxMzMxLCB1J0ZhaWxlZCB0byBjb3JyZWN0bHkgY29weSBbMl0gZmlsZTogQ1JDIGVycm9yLicpLAotKDEzMzIsIHUnRmFpbGVkIHRvIGNvcnJlY3RseSBtb3ZlIFsyXSBmaWxlOiBDUkMgZXJyb3IuJyksCi0oMTMzMywgdSdGYWlsZWQgdG8gY29ycmVjdGx5IHBhdGNoIFsyXSBmaWxlOiBDUkMgZXJyb3IuJyksCi0oMTMzNCwgdSJUaGUgZmlsZSAnWzJdJyBjYW5ub3QgYmUgaW5zdGFsbGVkIGJlY2F1c2UgdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kIGluIGNhYmluZXQgZmlsZSAnWzNdJy4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIG5ldHdvcmsgZXJyb3IsIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB0aGUgQ0QtUk9NLCBvciBhIHByb2JsZW0gd2l0aCB0aGlzIHBhY2thZ2UuIiksCi0oMTMzNSwgdSJUaGUgY2FiaW5ldCBmaWxlICdbMl0nIHJlcXVpcmVkIGZvciB0aGlzIGluc3RhbGxhdGlvbiBpcyBjb3JydXB0IGFuZCBjYW5ub3QgYmUgdXNlZC4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIG5ldHdvcmsgZXJyb3IsIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB0aGUgQ0QtUk9NLCBvciBhIHByb2JsZW0gd2l0aCB0aGlzIHBhY2thZ2UuIiksCi0oMTMzNiwgdSdUaGVyZSB3YXMgYW4gZXJyb3IgY3JlYXRpbmcgYSB0ZW1wb3JhcnkgZmlsZSB0aGF0IGlzIG5lZWRlZCB0byBjb21wbGV0ZSB0aGlzIGluc3RhbGxhdGlvbi57eyAgRm9sZGVyOiBbM10uIFN5c3RlbSBlcnJvciBjb2RlOiBbMl19fScpLAotKDE0MDEsIHUnQ291bGQgbm90IGNyZWF0ZSBrZXk6IFsyXS4ge3sgU3lzdGVtIGVycm9yIFszXS59fSAgVmVyaWZ5IHRoYXQgeW91IGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgdG8gdGhhdCBrZXksIG9yIGNvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbC4gJyksCi0oMTQwMiwgdSdDb3VsZCBub3Qgb3BlbiBrZXk6IFsyXS4ge3sgU3lzdGVtIGVycm9yIFszXS59fSAgVmVyaWZ5IHRoYXQgeW91IGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgdG8gdGhhdCBrZXksIG9yIGNvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbC4gJyksCi0oMTQwMywgdSdDb3VsZCBub3QgZGVsZXRlIHZhbHVlIFsyXSBmcm9tIGtleSBbM10uIHt7IFN5c3RlbSBlcnJvciBbNF0ufX0gIFZlcmlmeSB0aGF0IHlvdSBoYXZlIHN1ZmZpY2llbnQgYWNjZXNzIHRvIHRoYXQga2V5LCBvciBjb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwuICcpLAotKDE0MDQsIHUnQ291bGQgbm90IGRlbGV0ZSBrZXkgWzJdLiB7eyBTeXN0ZW0gZXJyb3IgWzNdLn19ICBWZXJpZnkgdGhhdCB5b3UgaGF2ZSBzdWZmaWNpZW50IGFjY2VzcyB0byB0aGF0IGtleSwgb3IgY29udGFjdCB5b3VyIHN1cHBvcnQgcGVyc29ubmVsLiAnKSwKLSgxNDA1LCB1J0NvdWxkIG5vdCByZWFkIHZhbHVlIFsyXSBmcm9tIGtleSBbM10uIHt7IFN5c3RlbSBlcnJvciBbNF0ufX0gIFZlcmlmeSB0aGF0IHlvdSBoYXZlIHN1ZmZpY2llbnQgYWNjZXNzIHRvIHRoYXQga2V5LCBvciBjb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwuICcpLAotKDE0MDYsIHUnQ291bGQgbm90IHdyaXRlIHZhbHVlIFsyXSB0byBrZXkgWzNdLiB7eyBTeXN0ZW0gZXJyb3IgWzRdLn19ICBWZXJpZnkgdGhhdCB5b3UgaGF2ZSBzdWZmaWNpZW50IGFjY2VzcyB0byB0aGF0IGtleSwgb3IgY29udGFjdCB5b3VyIHN1cHBvcnQgcGVyc29ubmVsLicpLAotKDE0MDcsIHUnQ291bGQgbm90IGdldCB2YWx1ZSBuYW1lcyBmb3Iga2V5IFsyXS4ge3sgU3lzdGVtIGVycm9yIFszXS59fSAgVmVyaWZ5IHRoYXQgeW91IGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgdG8gdGhhdCBrZXksIG9yIGNvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbC4nKSwKLSgxNDA4LCB1J0NvdWxkIG5vdCBnZXQgc3ViIGtleSBuYW1lcyBmb3Iga2V5IFsyXS4ge3sgU3lzdGVtIGVycm9yIFszXS59fSAgVmVyaWZ5IHRoYXQgeW91IGhhdmUgc3VmZmljaWVudCBhY2Nlc3MgdG8gdGhhdCBrZXksIG9yIGNvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbC4nKSwKLSgxNDA5LCB1J0NvdWxkIG5vdCByZWFkIHNlY3VyaXR5IGluZm9ybWF0aW9uIGZvciBrZXkgWzJdLiB7eyBTeXN0ZW0gZXJyb3IgWzNdLn19ICBWZXJpZnkgdGhhdCB5b3UgaGF2ZSBzdWZmaWNpZW50IGFjY2VzcyB0byB0aGF0IGtleSwgb3IgY29udGFjdCB5b3VyIHN1cHBvcnQgcGVyc29ubmVsLicpLAotKDE0MTAsIHUnQ291bGQgbm90IGluY3JlYXNlIHRoZSBhdmFpbGFibGUgcmVnaXN0cnkgc3BhY2UuIFsyXSBLQiBvZiBmcmVlIHJlZ2lzdHJ5IHNwYWNlIGlzIHJlcXVpcmVkIGZvciB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoaXMgYXBwbGljYXRpb24uJyksCi0oMTUwMCwgdSdBbm90aGVyIGluc3RhbGxhdGlvbiBpcyBpbiBwcm9ncmVzcy4gWW91IG11c3QgY29tcGxldGUgdGhhdCBpbnN0YWxsYXRpb24gYmVmb3JlIGNvbnRpbnVpbmcgdGhpcyBvbmUuJyksCi0oMTUwMSwgdSdFcnJvciBhY2Nlc3Npbmcgc2VjdXJlZCBkYXRhLiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBXaW5kb3dzIEluc3RhbGxlciBpcyBjb25maWd1cmVkIHByb3Blcmx5IGFuZCB0cnkgdGhlIGluc3RhbGwgYWdhaW4uJyksCi0oMTUwMiwgdSJVc2VyICdbMl0nIGhhcyBwcmV2aW91c2x5IGluaXRpYXRlZCBhbiBpbnN0YWxsIGZvciBwcm9kdWN0ICdbM10nLiAgVGhhdCB1c2VyIHdpbGwgbmVlZCB0byBydW4gdGhhdCBpbnN0YWxsIGFnYWluIGJlZm9yZSB0aGV5IGNhbiB1c2UgdGhhdCBwcm9kdWN0LiAgWW91ciBjdXJyZW50IGluc3RhbGwgd2lsbCBub3cgY29udGludWUuIiksCi0oMTUwMywgdSJVc2VyICdbMl0nIGhhcyBwcmV2aW91c2x5IGluaXRpYXRlZCBhbiBpbnN0YWxsIGZvciBwcm9kdWN0ICdbM10nLiAgVGhhdCB1c2VyIHdpbGwgbmVlZCB0byBydW4gdGhhdCBpbnN0YWxsIGFnYWluIGJlZm9yZSB0aGV5IGNhbiB1c2UgdGhhdCBwcm9kdWN0LiIpLAotKDE2MDEsIHUiT3V0IG9mIGRpc2sgc3BhY2UgLS0gVm9sdW1lOiAnWzJdJzsgcmVxdWlyZWQgc3BhY2U6IFszXSBLQjsgYXZhaWxhYmxlIHNwYWNlOiBbNF0gS0IuICBGcmVlIHNvbWUgZGlzayBzcGFjZSBhbmQgcmV0cnkuIiksCi0oMTYwMiwgdSdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsPycpLAotKDE2MDMsIHUiVGhlIGZpbGUgWzJdWzNdIGlzIGJlaW5nIGhlbGQgaW4gdXNleyBieSB0aGUgZm9sbG93aW5nIHByb2Nlc3M6IE5hbWU6IFs0XSwgSWQ6IFs1XSwgV2luZG93IFRpdGxlOiAnWzZdJ30uICBDbG9zZSB0aGF0IGFwcGxpY2F0aW9uIGFuZCByZXRyeS4iKSwKLSgxNjA0LCB1IlRoZSBwcm9kdWN0ICdbMl0nIGlzIGFscmVhZHkgaW5zdGFsbGVkLCBwcmV2ZW50aW5nIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhpcyBwcm9kdWN0LiAgVGhlIHR3byBwcm9kdWN0cyBhcmUgaW5jb21wYXRpYmxlLiIpLAotKDE2MDUsIHUiVGhlcmUgaXMgbm90IGVub3VnaCBkaXNrIHNwYWNlIG9uIHRoZSB2b2x1bWUgJ1syXScgdG8gY29udGludWUgdGhlIGluc3RhbGwgd2l0aCByZWNvdmVyeSBlbmFibGVkLiBbM10gS0IgYXJlIHJlcXVpcmVkLCBidXQgb25seSBbNF0gS0IgYXJlIGF2YWlsYWJsZS4gQ2xpY2sgSWdub3JlIHRvIGNvbnRpbnVlIHRoZSBpbnN0YWxsIHdpdGhvdXQgc2F2aW5nIHJlY292ZXJ5IGluZm9ybWF0aW9uLCBjbGljayBSZXRyeSB0byBjaGVjayBmb3IgYXZhaWxhYmxlIHNwYWNlIGFnYWluLCBvciBjbGljayBDYW5jZWwgdG8gcXVpdCB0aGUgaW5zdGFsbGF0aW9uLiIpLAotKDE2MDYsIHUnQ291bGQgbm90IGFjY2VzcyBuZXR3b3JrIGxvY2F0aW9uIFsyXS4nKSwKLSgxNjA3LCB1J1RoZSBmb2xsb3dpbmcgYXBwbGljYXRpb25zIHNob3VsZCBiZSBjbG9zZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlIGluc3RhbGw6JyksCi0oMTYwOCwgdSdDb3VsZCBub3QgZmluZCBhbnkgcHJldmlvdXNseSBpbnN0YWxsZWQgY29tcGxpYW50IHByb2R1Y3RzIG9uIHRoZSBtYWNoaW5lIGZvciBpbnN0YWxsaW5nIHRoaXMgcHJvZHVjdC4nKSwKLSgxNjA5LCB1IkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFwcGx5aW5nIHNlY3VyaXR5IHNldHRpbmdzLiBbMl0gaXMgbm90IGEgdmFsaWQgdXNlciBvciBncm91cC4gVGhpcyBjb3VsZCBiZSBhIHByb2JsZW0gd2l0aCB0aGUgcGFja2FnZSwgb3IgYSBwcm9ibGVtIGNvbm5lY3RpbmcgdG8gYSBkb21haW4gY29udHJvbGxlciBvbiB0aGUgbmV0d29yay4gQ2hlY2sgeW91ciBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kIGNsaWNrIFJldHJ5LCBvciBDYW5jZWwgdG8gZW5kIHRoZSBpbnN0YWxsLiB7e1VuYWJsZSB0byBsb2NhdGUgdGhlIHVzZXIncyBTSUQsIHN5c3RlbSBlcnJvciBbM119fSIpLAotKDE3MDEsIHUnVGhlIGtleSBbMl0gaXMgbm90IHZhbGlkLiAgVmVyaWZ5IHRoYXQgeW91IGVudGVyZWQgdGhlIGNvcnJlY3Qga2V5LicpLAotKDE3MDIsIHUnVGhlIGluc3RhbGxlciBtdXN0IHJlc3RhcnQgeW91ciBzeXN0ZW0gYmVmb3JlIGNvbmZpZ3VyYXRpb24gb2YgWzJdIGNhbiBjb250aW51ZS4gIENsaWNrIFllcyB0byByZXN0YXJ0IG5vdyBvciBObyBpZiB5b3UgcGxhbiB0byBtYW51YWxseSByZXN0YXJ0IGxhdGVyLicpLAotKDE3MDMsIHUnWW91IG11c3QgcmVzdGFydCB5b3VyIHN5c3RlbSBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtYWRlIHRvIFsyXSB0byB0YWtlIGVmZmVjdC4gQ2xpY2sgWWVzIHRvIHJlc3RhcnQgbm93IG9yIE5vIGlmIHlvdSBwbGFuIHRvIG1hbnVhbGx5IHJlc3RhcnQgbGF0ZXIuJyksCi0oMTcwNCwgdSdBbiBpbnN0YWxsYXRpb24gZm9yIFsyXSBpcyBjdXJyZW50bHkgc3VzcGVuZGVkLiAgWW91IG11c3QgdW5kbyB0aGUgY2hhbmdlcyBtYWRlIGJ5IHRoYXQgaW5zdGFsbGF0aW9uIHRvIGNvbnRpbnVlLiAgRG8geW91IHdhbnQgdG8gdW5kbyB0aG9zZSBjaGFuZ2VzPycpLAotKDE3MDUsIHUnQSBwcmV2aW91cyBpbnN0YWxsYXRpb24gZm9yIHRoaXMgcHJvZHVjdCBpcyBpbiBwcm9ncmVzcy4gIFlvdSBtdXN0IHVuZG8gdGhlIGNoYW5nZXMgbWFkZSBieSB0aGF0IGluc3RhbGxhdGlvbiB0byBjb250aW51ZS4gIERvIHlvdSB3YW50IHRvIHVuZG8gdGhvc2UgY2hhbmdlcz8nKSwKLSgxNzA2LCB1IkFuIGluc3RhbGxhdGlvbiBwYWNrYWdlIGZvciB0aGUgcHJvZHVjdCBbMl0gY2Fubm90IGJlIGZvdW5kLiBUcnkgdGhlIGluc3RhbGxhdGlvbiBhZ2FpbiB1c2luZyBhIHZhbGlkIGNvcHkgb2YgdGhlIGluc3RhbGxhdGlvbiBwYWNrYWdlICdbM10nLiIpLAotKDE3MDcsIHUnSW5zdGFsbGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyksCi0oMTcwOCwgdSdJbnN0YWxsYXRpb24gZmFpbGVkLicpLAotKDE3MDksIHUnUHJvZHVjdDogWzJdIC0tIFszXScpLAotKDE3MTAsIHUnWW91IG1heSBlaXRoZXIgcmVzdG9yZSB5b3VyIGNvbXB1dGVyIHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBvciBjb250aW51ZSB0aGUgaW5zdGFsbCBsYXRlci4gV291bGQgeW91IGxpa2UgdG8gcmVzdG9yZT8nKSwKLSgxNzExLCB1J0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uIHRvIGRpc2suICBDaGVjayB0byBtYWtlIHN1cmUgZW5vdWdoIGRpc2sgc3BhY2UgaXMgYXZhaWxhYmxlLCBhbmQgY2xpY2sgUmV0cnksIG9yIENhbmNlbCB0byBlbmQgdGhlIGluc3RhbGwuJyksCi0oMTcxMiwgdSdPbmUgb3IgbW9yZSBvZiB0aGUgZmlsZXMgcmVxdWlyZWQgdG8gcmVzdG9yZSB5b3VyIGNvbXB1dGVyIHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBjb3VsZCBub3QgYmUgZm91bmQuICBSZXN0b3JhdGlvbiB3aWxsIG5vdCBiZSBwb3NzaWJsZS4nKSwKLSgxNzEzLCB1J1syXSBjYW5ub3QgaW5zdGFsbCBvbmUgb2YgaXRzIHJlcXVpcmVkIHByb2R1Y3RzLiBDb250YWN0IHlvdXIgdGVjaG5pY2FsIHN1cHBvcnQgZ3JvdXAuICB7e1N5c3RlbSBFcnJvcjogWzNdLn19JyksCi0oMTcxNCwgdSdUaGUgb2xkZXIgdmVyc2lvbiBvZiBbMl0gY2Fubm90IGJlIHJlbW92ZWQuICBDb250YWN0IHlvdXIgdGVjaG5pY2FsIHN1cHBvcnQgZ3JvdXAuICB7e1N5c3RlbSBFcnJvciBbM10ufX0nKSwKLSgxNzE1LCB1J0luc3RhbGxlZCBbMl0nKSwKLSgxNzE2LCB1J0NvbmZpZ3VyZWQgWzJdJyksCi0oMTcxNywgdSdSZW1vdmVkIFsyXScpLAotKDE3MTgsIHUnRmlsZSBbMl0gd2FzIHJlamVjdGVkIGJ5IGRpZ2l0YWwgc2lnbmF0dXJlIHBvbGljeS4nKSwKLSgxNzE5LCB1J1RoZSBXaW5kb3dzIEluc3RhbGxlciBTZXJ2aWNlIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4gVGhpcyBjYW4gb2NjdXIgaWYgeW91IGFyZSBydW5uaW5nIFdpbmRvd3MgaW4gc2FmZSBtb2RlLCBvciBpZiB0aGUgV2luZG93cyBJbnN0YWxsZXIgaXMgbm90IGNvcnJlY3RseSBpbnN0YWxsZWQuIENvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbCBmb3IgYXNzaXN0YW5jZS4nKSwKLSgxNzIwLCB1J1RoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgV2luZG93cyBJbnN0YWxsZXIgcGFja2FnZS4gQSBzY3JpcHQgcmVxdWlyZWQgZm9yIHRoaXMgaW5zdGFsbCB0byBjb21wbGV0ZSBjb3VsZCBub3QgYmUgcnVuLiBDb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwgb3IgcGFja2FnZSB2ZW5kb3IuICB7e0N1c3RvbSBhY3Rpb24gWzJdIHNjcmlwdCBlcnJvciBbM10sIFs0XTogWzVdIExpbmUgWzZdLCBDb2x1bW4gWzddLCBbOF0gfX0nKSwKLSgxNzIxLCB1J1RoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgV2luZG93cyBJbnN0YWxsZXIgcGFja2FnZS4gQSBwcm9ncmFtIHJlcXVpcmVkIGZvciB0aGlzIGluc3RhbGwgdG8gY29tcGxldGUgY291bGQgbm90IGJlIHJ1bi4gQ29udGFjdCB5b3VyIHN1cHBvcnQgcGVyc29ubmVsIG9yIHBhY2thZ2UgdmVuZG9yLiB7e0FjdGlvbjogWzJdLCBsb2NhdGlvbjogWzNdLCBjb21tYW5kOiBbNF0gfX0nKSwKLSgxNzIyLCB1J1RoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgV2luZG93cyBJbnN0YWxsZXIgcGFja2FnZS4gQSBwcm9ncmFtIHJ1biBhcyBwYXJ0IG9mIHRoZSBzZXR1cCBkaWQgbm90IGZpbmlzaCBhcyBleHBlY3RlZC4gQ29udGFjdCB5b3VyIHN1cHBvcnQgcGVyc29ubmVsIG9yIHBhY2thZ2UgdmVuZG9yLiAge3tBY3Rpb24gWzJdLCBsb2NhdGlvbjogWzNdLCBjb21tYW5kOiBbNF0gfX0nKSwKLSgxNzIzLCB1J1RoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoaXMgV2luZG93cyBJbnN0YWxsZXIgcGFja2FnZS4gQSBETEwgcmVxdWlyZWQgZm9yIHRoaXMgaW5zdGFsbCB0byBjb21wbGV0ZSBjb3VsZCBub3QgYmUgcnVuLiBDb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwgb3IgcGFja2FnZSB2ZW5kb3IuICB7e0FjdGlvbiBbMl0sIGVudHJ5OiBbM10sIGxpYnJhcnk6IFs0XSB9fScpLAotKDE3MjQsIHUnUmVtb3ZhbCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LicpLAotKDE3MjUsIHUnUmVtb3ZhbCBmYWlsZWQuJyksCi0oMTcyNiwgdSdBZHZlcnRpc2VtZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyksCi0oMTcyNywgdSdBZHZlcnRpc2VtZW50IGZhaWxlZC4nKSwKLSgxNzI4LCB1J0NvbmZpZ3VyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4nKSwKLSgxNzI5LCB1J0NvbmZpZ3VyYXRpb24gZmFpbGVkLicpLAotKDE3MzAsIHUnWW91IG11c3QgYmUgYW4gQWRtaW5pc3RyYXRvciB0byByZW1vdmUgdGhpcyBhcHBsaWNhdGlvbi4gVG8gcmVtb3ZlIHRoaXMgYXBwbGljYXRpb24sIHlvdSBjYW4gbG9nIG9uIGFzIGFuIEFkbWluaXN0cmF0b3IsIG9yIGNvbnRhY3QgeW91ciB0ZWNobmljYWwgc3VwcG9ydCBncm91cCBmb3IgYXNzaXN0YW5jZS4nKSwKLSgxODAxLCB1J1RoZSBwYXRoIFsyXSBpcyBub3QgdmFsaWQuICBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIHBhdGguJyksCi0oMTgwMiwgdSdPdXQgb2YgbWVtb3J5LiBTaHV0IGRvd24gb3RoZXIgYXBwbGljYXRpb25zIGJlZm9yZSByZXRyeWluZy4nKSwKLSgxODAzLCB1J1RoZXJlIGlzIG5vIGRpc2sgaW4gZHJpdmUgWzJdLiBQbGVhc2UgaW5zZXJ0IG9uZSBhbmQgY2xpY2sgUmV0cnksIG9yIGNsaWNrIENhbmNlbCB0byBnbyBiYWNrIHRvIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIHZvbHVtZS4nKSwKLSgxODA0LCB1J1RoZXJlIGlzIG5vIGRpc2sgaW4gZHJpdmUgWzJdLiBQbGVhc2UgaW5zZXJ0IG9uZSBhbmQgY2xpY2sgUmV0cnksIG9yIGNsaWNrIENhbmNlbCB0byByZXR1cm4gdG8gdGhlIGJyb3dzZSBkaWFsb2cgYW5kIHNlbGVjdCBhIGRpZmZlcmVudCB2b2x1bWUuJyksCi0oMTgwNSwgdSdUaGUgZm9sZGVyIFsyXSBkb2VzIG5vdCBleGlzdC4gIFBsZWFzZSBlbnRlciBhIHBhdGggdG8gYW4gZXhpc3RpbmcgZm9sZGVyLicpLAotKDE4MDYsIHUnWW91IGhhdmUgaW5zdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gcmVhZCB0aGlzIGZvbGRlci4nKSwKLSgxODA3LCB1J0EgdmFsaWQgZGVzdGluYXRpb24gZm9sZGVyIGZvciB0aGUgaW5zdGFsbCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4nKSwKLSgxOTAxLCB1J0Vycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFsbCBkYXRhYmFzZTogWzJdLicpLAotKDE5MDIsIHUnU2NoZWR1bGluZyByZWJvb3Qgb3BlcmF0aW9uOiBSZW5hbWluZyBmaWxlIFsyXSB0byBbM10uIE11c3QgcmVib290IHRvIGNvbXBsZXRlIG9wZXJhdGlvbi4nKSwKLSgxOTAzLCB1J1NjaGVkdWxpbmcgcmVib290IG9wZXJhdGlvbjogRGVsZXRpbmcgZmlsZSBbMl0uIE11c3QgcmVib290IHRvIGNvbXBsZXRlIG9wZXJhdGlvbi4nKSwKLSgxOTA0LCB1J01vZHVsZSBbMl0gZmFpbGVkIHRvIHJlZ2lzdGVyLiAgSFJFU1VMVCBbM10uICBDb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwuJyksCi0oMTkwNSwgdSdNb2R1bGUgWzJdIGZhaWxlZCB0byB1bnJlZ2lzdGVyLiAgSFJFU1VMVCBbM10uICBDb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwuJyksCi0oMTkwNiwgdSdGYWlsZWQgdG8gY2FjaGUgcGFja2FnZSBbMl0uIEVycm9yOiBbM10uIENvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbC4nKSwKLSgxOTA3LCB1J0NvdWxkIG5vdCByZWdpc3RlciBmb250IFsyXS4gIFZlcmlmeSB0aGF0IHlvdSBoYXZlIHN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gaW5zdGFsbCBmb250cywgYW5kIHRoYXQgdGhlIHN5c3RlbSBzdXBwb3J0cyB0aGlzIGZvbnQuJyksCi0oMTkwOCwgdSdDb3VsZCBub3QgdW5yZWdpc3RlciBmb250IFsyXS4gVmVyaWZ5IHRoYXQgeW91IHRoYXQgeW91IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyB0byByZW1vdmUgZm9udHMuJyksCi0oMTkwOSwgdSdDb3VsZCBub3QgY3JlYXRlIFNob3J0Y3V0IFsyXS4gVmVyaWZ5IHRoYXQgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBleGlzdHMgYW5kIHRoYXQgeW91IGNhbiBhY2Nlc3MgaXQuJyksCi0oMTkxMCwgdSdDb3VsZCBub3QgcmVtb3ZlIFNob3J0Y3V0IFsyXS4gVmVyaWZ5IHRoYXQgdGhlIHNob3J0Y3V0IGZpbGUgZXhpc3RzIGFuZCB0aGF0IHlvdSBjYW4gYWNjZXNzIGl0LicpLAotKDE5MTEsIHUnQ291bGQgbm90IHJlZ2lzdGVyIHR5cGUgbGlicmFyeSBmb3IgZmlsZSBbMl0uICBDb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwuJyksCi0oMTkxMiwgdSdDb3VsZCBub3QgdW5yZWdpc3RlciB0eXBlIGxpYnJhcnkgZm9yIGZpbGUgWzJdLiAgQ29udGFjdCB5b3VyIHN1cHBvcnQgcGVyc29ubmVsLicpLAotKDE5MTMsIHUnQ291bGQgbm90IHVwZGF0ZSB0aGUgaW5pIGZpbGUgWzJdWzNdLiAgVmVyaWZ5IHRoYXQgdGhlIGZpbGUgZXhpc3RzIGFuZCB0aGF0IHlvdSBjYW4gYWNjZXNzIGl0LicpLAotKDE5MTQsIHUnQ291bGQgbm90IHNjaGVkdWxlIGZpbGUgWzJdIHRvIHJlcGxhY2UgZmlsZSBbM10gb24gcmVib290LiAgVmVyaWZ5IHRoYXQgeW91IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMgdG8gZmlsZSBbM10uJyksCi0oMTkxNSwgdSdFcnJvciByZW1vdmluZyBPREJDIGRyaXZlciBtYW5hZ2VyLCBPREJDIGVycm9yIFsyXTogWzNdLiBDb250YWN0IHlvdXIgc3VwcG9ydCBwZXJzb25uZWwuJyksCi0oMTkxNiwgdSdFcnJvciBpbnN0YWxsaW5nIE9EQkMgZHJpdmVyIG1hbmFnZXIsIE9EQkMgZXJyb3IgWzJdOiBbM10uIENvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbC4nKSwKLSgxOTE3LCB1J0Vycm9yIHJlbW92aW5nIE9EQkMgZHJpdmVyOiBbNF0sIE9EQkMgZXJyb3IgWzJdOiBbM10uIFZlcmlmeSB0aGF0IHlvdSBoYXZlIHN1ZmZpY2llbnQgcHJpdmlsZWdlcyB0byByZW1vdmUgT0RCQyBkcml2ZXJzLicpLAotKDE5MTgsIHUnRXJyb3IgaW5zdGFsbGluZyBPREJDIGRyaXZlcjogWzRdLCBPREJDIGVycm9yIFsyXTogWzNdLiBWZXJpZnkgdGhhdCB0aGUgZmlsZSBbNF0gZXhpc3RzIGFuZCB0aGF0IHlvdSBjYW4gYWNjZXNzIGl0LicpLAotKDE5MTksIHUnRXJyb3IgY29uZmlndXJpbmcgT0RCQyBkYXRhIHNvdXJjZTogWzRdLCBPREJDIGVycm9yIFsyXTogWzNdLiBWZXJpZnkgdGhhdCB0aGUgZmlsZSBbNF0gZXhpc3RzIGFuZCB0aGF0IHlvdSBjYW4gYWNjZXNzIGl0LicpLAotKDE5MjAsIHUiU2VydmljZSAnWzJdJyAoWzNdKSBmYWlsZWQgdG8gc3RhcnQuICBWZXJpZnkgdGhhdCB5b3UgaGF2ZSBzdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gc3RhcnQgc3lzdGVtIHNlcnZpY2VzLiIpLAotKDE5MjEsIHUiU2VydmljZSAnWzJdJyAoWzNdKSBjb3VsZCBub3QgYmUgc3RvcHBlZC4gIFZlcmlmeSB0aGF0IHlvdSBoYXZlIHN1ZmZpY2llbnQgcHJpdmlsZWdlcyB0byBzdG9wIHN5c3RlbSBzZXJ2aWNlcy4iKSwKLSgxOTIyLCB1IlNlcnZpY2UgJ1syXScgKFszXSkgY291bGQgbm90IGJlIGRlbGV0ZWQuICBWZXJpZnkgdGhhdCB5b3UgaGF2ZSBzdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gcmVtb3ZlIHN5c3RlbSBzZXJ2aWNlcy4iKSwKLSgxOTIzLCB1IlNlcnZpY2UgJ1syXScgKFszXSkgY291bGQgbm90IGJlIGluc3RhbGxlZC4gIFZlcmlmeSB0aGF0IHlvdSBoYXZlIHN1ZmZpY2llbnQgcHJpdmlsZWdlcyB0byBpbnN0YWxsIHN5c3RlbSBzZXJ2aWNlcy4iKSwKLSgxOTI0LCB1IkNvdWxkIG5vdCB1cGRhdGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ1syXScuICBWZXJpZnkgdGhhdCB5b3UgaGF2ZSBzdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gbW9kaWZ5IGVudmlyb25tZW50IHZhcmlhYmxlcy4iKSwKLSgxOTI1LCB1J1lvdSBkbyBub3QgaGF2ZSBzdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gY29tcGxldGUgdGhpcyBpbnN0YWxsYXRpb24gZm9yIGFsbCB1c2VycyBvZiB0aGUgbWFjaGluZS4gIExvZyBvbiBhcyBhZG1pbmlzdHJhdG9yIGFuZCB0aGVuIHJldHJ5IHRoaXMgaW5zdGFsbGF0aW9uLicpLAotKDE5MjYsIHUiQ291bGQgbm90IHNldCBmaWxlIHNlY3VyaXR5IGZvciBmaWxlICdbM10nLiBFcnJvcjogWzJdLiAgVmVyaWZ5IHRoYXQgeW91IGhhdmUgc3VmZmljaWVudCBwcml2aWxlZ2VzIHRvIG1vZGlmeSB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbnMgZm9yIHRoaXMgZmlsZS4iKSwKLSgxOTI3LCB1J0NvbXBvbmVudCBTZXJ2aWNlcyAoQ09NKyAxLjApIGFyZSBub3QgaW5zdGFsbGVkIG9uIHRoaXMgY29tcHV0ZXIuICBUaGlzIGluc3RhbGxhdGlvbiByZXF1aXJlcyBDb21wb25lbnQgU2VydmljZXMgaW4gb3JkZXIgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LiAgQ29tcG9uZW50IFNlcnZpY2VzIGFyZSBhdmFpbGFibGUgb24gV2luZG93cyAyMDAwLicpLAotKDE5MjgsIHUnRXJyb3IgcmVnaXN0ZXJpbmcgQ09NKyBBcHBsaWNhdGlvbi4gIENvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSwKLSgxOTI5LCB1J0Vycm9yIHVucmVnaXN0ZXJpbmcgQ09NKyBBcHBsaWNhdGlvbi4gIENvbnRhY3QgeW91ciBzdXBwb3J0IHBlcnNvbm5lbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSwKLSgxOTMwLCB1IlRoZSBkZXNjcmlwdGlvbiBmb3Igc2VydmljZSAnWzJdJyAoWzNdKSBjb3VsZCBub3QgYmUgY2hhbmdlZC4iKSwKLSgxOTMxLCB1J1RoZSBXaW5kb3dzIEluc3RhbGxlciBzZXJ2aWNlIGNhbm5vdCB1cGRhdGUgdGhlIHN5c3RlbSBmaWxlIFsyXSBiZWNhdXNlIHRoZSBmaWxlIGlzIHByb3RlY3RlZCBieSBXaW5kb3dzLiAgWW91IG1heSBuZWVkIHRvIHVwZGF0ZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gZm9yIHRoaXMgcHJvZ3JhbSB0byB3b3JrIGNvcnJlY3RseS4ge3tQYWNrYWdlIHZlcnNpb246IFszXSwgT1MgUHJvdGVjdGVkIHZlcnNpb246IFs0XX19JyksCi0oMTkzMiwgdSdUaGUgV2luZG93cyBJbnN0YWxsZXIgc2VydmljZSBjYW5ub3QgdXBkYXRlIHRoZSBwcm90ZWN0ZWQgV2luZG93cyBmaWxlIFsyXS4ge3tQYWNrYWdlIHZlcnNpb246IFszXSwgT1MgUHJvdGVjdGVkIHZlcnNpb246IFs0XSwgU0ZQIEVycm9yOiBbNV19fScpLAotKDE5MzMsIHUnVGhlIFdpbmRvd3MgSW5zdGFsbGVyIHNlcnZpY2UgY2Fubm90IHVwZGF0ZSBvbmUgb3IgbW9yZSBwcm90ZWN0ZWQgV2luZG93cyBmaWxlcy4ge3tTRlAgRXJyb3I6IFsyXS4gIExpc3Qgb2YgcHJvdGVjdGVkIGZpbGVzOlxcclxcblszXX19JyksCi0oMTkzNCwgdSdVc2VyIGluc3RhbGxhdGlvbnMgYXJlIGRpc2FibGVkIHZpYSBwb2xpY3kgb24gdGhlIG1hY2hpbmUuJyksCi0oMTkzNSwgdSdBbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIG9mIGFzc2VtYmx5IGNvbXBvbmVudCBbMl0uIEhSRVNVTFQ6IFszXS4ge3thc3NlbWJseSBpbnRlcmZhY2U6IFs0XSwgZnVuY3Rpb246IFs1XSwgYXNzZW1ibHkgbmFtZTogWzZdfX0nKSwKLV0KLQotdGFibGVzPVsnQWRtaW5FeGVjdXRlU2VxdWVuY2UnLCAnQWRtaW5VSVNlcXVlbmNlJywgJ0FkdnRFeGVjdXRlU2VxdWVuY2UnLCAnQkJDb250cm9sJywgJ0JpbGxib2FyZCcsICdCaW5hcnknLCAnQ2hlY2tCb3gnLCAnUHJvcGVydHknLCAnQ29tYm9Cb3gnLCAnQ29udHJvbCcsICdMaXN0Qm94JywgJ0FjdGlvblRleHQnLCAnQ29udHJvbENvbmRpdGlvbicsICdDb250cm9sRXZlbnQnLCAnRGlhbG9nJywgJ0V2ZW50TWFwcGluZycsICdJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlJywgJ0luc3RhbGxVSVNlcXVlbmNlJywgJ0xpc3RWaWV3JywgJ1JhZGlvQnV0dG9uJywgJ1RleHRTdHlsZScsICdVSVRleHQnLCAnX1ZhbGlkYXRpb24nLCAnRXJyb3InXQpkaWZmIC0tZ2l0IGEvTGliL250cGF0aC5weSBiL0xpYi9udHBhdGgucHkKaW5kZXggNWRkNWYxYS4uN2E3OWI1MyAxMDA2NDQKLS0tIGEvTGliL250cGF0aC5weQorKysgYi9MaWIvbnRwYXRoLnB5CkBAIC00ODEsMjcgKzQ4MSwyOCBAQAogCiAKICMgUmV0dXJuIGFuIGFic29sdXRlIHBhdGguCi1kZWYgYWJzcGF0aChwYXRoKToKLSAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIHZlcnNpb24gb2YgYSBwYXRoIiIiCi0gICAgdHJ5OgotICAgICAgICBmcm9tIG50IGltcG9ydCBfZ2V0ZnVsbHBhdGhuYW1lCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOiAjIE5vdCBydW5uaW5nIG9uIFdpbmRvd3MgLSBtb2NrIHVwIHNvbWV0aGluZyBzZW5zaWJsZS4KLSAgICAgICAgZ2xvYmFsIGFic3BhdGgKLSAgICAgICAgZGVmIF9hYnNwYXRoKHBhdGgpOgotICAgICAgICAgICAgaWYgbm90IGlzYWJzKHBhdGgpOgotICAgICAgICAgICAgICAgIHBhdGggPSBqb2luKG9zLmdldGN3ZCgpLCBwYXRoKQotICAgICAgICAgICAgcmV0dXJuIG5vcm1wYXRoKHBhdGgpCi0gICAgICAgIGFic3BhdGggPSBfYWJzcGF0aAotICAgICAgICByZXR1cm4gX2Fic3BhdGgocGF0aCkKK3RyeToKKyAgICBmcm9tIG50IGltcG9ydCBfZ2V0ZnVsbHBhdGhuYW1lCiAKLSAgICBpZiBwYXRoOiAjIEVtcHR5IHBhdGggbXVzdCByZXR1cm4gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcGF0aCA9IF9nZXRmdWxscGF0aG5hbWUocGF0aCkKLSAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKLSAgICAgICAgICAgIHBhc3MgIyBCYWQgcGF0aCAtIHJldHVybiB1bmNoYW5nZWQuCi0gICAgZWxzZToKLSAgICAgICAgcGF0aCA9IG9zLmdldGN3ZCgpCi0gICAgcmV0dXJuIG5vcm1wYXRoKHBhdGgpCitleGNlcHQgSW1wb3J0RXJyb3I6ICMgbm90IHJ1bm5pbmcgb24gV2luZG93cyAtIG1vY2sgdXAgc29tZXRoaW5nIHNlbnNpYmxlCisgICAgZGVmIGFic3BhdGgocGF0aCk6CisgICAgICAgICIiIlJldHVybiB0aGUgYWJzb2x1dGUgdmVyc2lvbiBvZiBhIHBhdGguIiIiCisgICAgICAgIGlmIG5vdCBpc2FicyhwYXRoKToKKyAgICAgICAgICAgIHBhdGggPSBqb2luKG9zLmdldGN3ZCgpLCBwYXRoKQorICAgICAgICByZXR1cm4gbm9ybXBhdGgocGF0aCkKKworZWxzZTogICMgdXNlIG5hdGl2ZSBXaW5kb3dzIG1ldGhvZCBvbiBXaW5kb3dzCisgICAgZGVmIGFic3BhdGgocGF0aCk6CisgICAgICAgICIiIlJldHVybiB0aGUgYWJzb2x1dGUgdmVyc2lvbiBvZiBhIHBhdGguIiIiCisKKyAgICAgICAgaWYgcGF0aDogIyBFbXB0eSBwYXRoIG11c3QgcmV0dXJuIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGF0aCA9IF9nZXRmdWxscGF0aG5hbWUocGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcyAjIEJhZCBwYXRoIC0gcmV0dXJuIHVuY2hhbmdlZC4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5nZXRjd2QoKQorICAgICAgICByZXR1cm4gbm9ybXBhdGgocGF0aCkKIAogIyByZWFscGF0aCBpcyBhIG5vLW9wIG9uIHN5c3RlbXMgd2l0aG91dCBpc2xpbmsgc3VwcG9ydAogcmVhbHBhdGggPSBhYnNwYXRoCmRpZmYgLS1naXQgYS9MaWIvb3B0cGFyc2UucHkgYi9MaWIvb3B0cGFyc2UucHkKaW5kZXggYWUzZDAwZC4uOWFjOTg3ZSAxMDA2NDQKLS0tIGEvTGliL29wdHBhcnNlLnB5CisrKyBiL0xpYi9vcHRwYXJzZS5weQpAQCAtMTYsNyArMTYsNyBAQAogIyBQeXRob24gZGV2ZWxvcGVyczogcGxlYXNlIGRvIG5vdCBtYWtlIGNoYW5nZXMgdG8gdGhpcyBmaWxlLCBzaW5jZQogIyBpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBPcHRpayBzb3VyY2UgY29kZS4KIAotX192ZXJzaW9uX18gPSAiMS41YTIiCitfX3ZlcnNpb25fXyA9ICIxLjUuMSIKIAogX19hbGxfXyA9IFsnT3B0aW9uJywKICAgICAgICAgICAgJ1NVUFBSRVNTX0hFTFAnLApAQCAtMzUsOCArMzUsOCBAQAogICAgICAgICAgICAnQmFkT3B0aW9uRXJyb3InXQogCiBfX2NvcHlyaWdodF9fID0gIiIiCi1Db3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBHcmVnb3J5IFAuIFdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYgR3JlZ29yeSBQLiBXYXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0NvcHlyaWdodCAoYykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC02NywyMSArNjcsMjYgQEAKICIiIgogCiBpbXBvcnQgc3lzLCBvcworaW1wb3J0IHR5cGVzCiBpbXBvcnQgdGV4dHdyYXAKLXRyeToKLSAgICBmcm9tIGdldHRleHQgaW1wb3J0IGdldHRleHQgYXMgXwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIF8gPSBsYW1iZGEgYXJnOiBhcmcKIAogZGVmIF9yZXByKHNlbGYpOgogICAgIHJldHVybiAiPCVzIGF0IDB4JXg6ICVzPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGlkKHNlbGYpLCBzZWxmKQogCiAKICMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZnJvbToKLSMgICBJZDogb3B0aW9uX3BhcnNlci5weSA0MjEgMjAwNC0xMC0yNiAwMDo0NToxNlogZ3JlZwotIyAgIElkOiBvcHRpb24ucHkgNDIyIDIwMDQtMTAtMjYgMDA6NTM6NDdaIGdyZWcKLSMgICBJZDogaGVscC5weSAzNjcgMjAwNC0wNy0yNCAyMzoyMToyMVogZ3dhcmQKLSMgICBJZDogZXJyb3JzLnB5IDM2NyAyMDA0LTA3LTI0IDIzOjIxOjIxWiBnd2FyZAorIyAgIElkOiBvcHRpb25fcGFyc2VyLnB5IDUwOSAyMDA2LTA0LTIwIDAwOjU4OjI0WiBnd2FyZAorIyAgIElkOiBvcHRpb24ucHkgNTA5IDIwMDYtMDQtMjAgMDA6NTg6MjRaIGd3YXJkCisjICAgSWQ6IGhlbHAucHkgNTA5IDIwMDYtMDQtMjAgMDA6NTg6MjRaIGd3YXJkCisjICAgSWQ6IGVycm9ycy5weSA1MDkgMjAwNi0wNC0yMCAwMDo1ODoyNFogZ3dhcmQKKwordHJ5OgorICAgIGZyb20gZ2V0dGV4dCBpbXBvcnQgZ2V0dGV4dAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRlZiBnZXR0ZXh0KG1lc3NhZ2UpOgorICAgICAgICByZXR1cm4gbWVzc2FnZQorXyA9IGdldHRleHQKKwogCiBjbGFzcyBPcHRQYXJzZUVycm9yIChFeGNlcHRpb24pOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cpOgpAQCAtMTIwLDggKzEyNSwyNSBAQAogCiBjbGFzcyBCYWRPcHRpb25FcnJvciAoT3B0UGFyc2VFcnJvcik6CiAgICAgIiIiCi0gICAgUmFpc2VkIGlmIGFuIGludmFsaWQgb3IgYW1iaWd1b3VzIG9wdGlvbiBpcyBzZWVuIG9uIHRoZSBjb21tYW5kLWxpbmUuCisgICAgUmFpc2VkIGlmIGFuIGludmFsaWQgb3B0aW9uIGlzIHNlZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0X3N0cik6CisgICAgICAgIHNlbGYub3B0X3N0ciA9IG9wdF9zdHIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gXygibm8gc3VjaCBvcHRpb246ICVzIikgJSBzZWxmLm9wdF9zdHIKKworY2xhc3MgQW1iaWd1b3VzT3B0aW9uRXJyb3IgKEJhZE9wdGlvbkVycm9yKToKKyAgICAiIiIKKyAgICBSYWlzZWQgaWYgYW4gYW1iaWd1b3VzIG9wdGlvbiBpcyBzZWVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdF9zdHIsIHBvc3NpYmlsaXRpZXMpOgorICAgICAgICBCYWRPcHRpb25FcnJvci5fX2luaXRfXyhzZWxmLCBvcHRfc3RyKQorICAgICAgICBzZWxmLnBvc3NpYmlsaXRpZXMgPSBwb3NzaWJpbGl0aWVzCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChfKCJhbWJpZ3VvdXMgb3B0aW9uOiAlcyAoJXM/KSIpCisgICAgICAgICAgICAgICAgJSAoc2VsZi5vcHRfc3RyLCAiLCAiLmpvaW4oc2VsZi5wb3NzaWJpbGl0aWVzKSkpCiAKIAogY2xhc3MgSGVscEZvcm1hdHRlcjoKQEAgLTIyMywxNSArMjQ1LDMwIEBACiAgICAgZGVmIGZvcm1hdF9oZWFkaW5nKHNlbGYsIGhlYWRpbmcpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKIAotICAgIGRlZiBmb3JtYXRfZGVzY3JpcHRpb24oc2VsZiwgZGVzY3JpcHRpb24pOgotICAgICAgICBpZiBub3QgZGVzY3JpcHRpb246Ci0gICAgICAgICAgICByZXR1cm4gIiIKLSAgICAgICAgZGVzY193aWR0aCA9IHNlbGYud2lkdGggLSBzZWxmLmN1cnJlbnRfaW5kZW50CisgICAgZGVmIF9mb3JtYXRfdGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiCisgICAgICAgIEZvcm1hdCBhIHBhcmFncmFwaCBvZiBmcmVlLWZvcm0gdGV4dCBmb3IgaW5jbHVzaW9uIGluIHRoZQorICAgICAgICBoZWxwIG91dHB1dCBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4KKyAgICAgICAgIiIiCisgICAgICAgIHRleHRfd2lkdGggPSBzZWxmLndpZHRoIC0gc2VsZi5jdXJyZW50X2luZGVudAogICAgICAgICBpbmRlbnQgPSAiICIqc2VsZi5jdXJyZW50X2luZGVudAotICAgICAgICByZXR1cm4gdGV4dHdyYXAuZmlsbChkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY193aWR0aCwKKyAgICAgICAgcmV0dXJuIHRleHR3cmFwLmZpbGwodGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9aW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1pbmRlbnQpICsgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1pbmRlbnQpCisKKyAgICBkZWYgZm9ybWF0X2Rlc2NyaXB0aW9uKHNlbGYsIGRlc2NyaXB0aW9uKToKKyAgICAgICAgaWYgZGVzY3JpcHRpb246CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZm9ybWF0X3RleHQoZGVzY3JpcHRpb24pICsgIlxuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgZm9ybWF0X2VwaWxvZyhzZWxmLCBlcGlsb2cpOgorICAgICAgICBpZiBlcGlsb2c6CisgICAgICAgICAgICByZXR1cm4gIlxuIiArIHNlbGYuX2Zvcm1hdF90ZXh0KGVwaWxvZykgKyAiXG4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiIKKwogCiAgICAgZGVmIGV4cGFuZF9kZWZhdWx0KHNlbGYsIG9wdGlvbik6CiAgICAgICAgIGlmIHNlbGYucGFyc2VyIGlzIE5vbmUgb3Igbm90IHNlbGYuZGVmYXVsdF90YWc6CkBAIC0zMjgsNyArMzY1LDcgQEAKICAgICAgICAgICAgIHNlbGYsIGluZGVudF9pbmNyZW1lbnQsIG1heF9oZWxwX3Bvc2l0aW9uLCB3aWR0aCwgc2hvcnRfZmlyc3QpCiAKICAgICBkZWYgZm9ybWF0X3VzYWdlKHNlbGYsIHVzYWdlKToKLSAgICAgICAgcmV0dXJuIF8oInVzYWdlOiAlc1xuIikgJSB1c2FnZQorICAgICAgICByZXR1cm4gXygiVXNhZ2U6ICVzXG4iKSAlIHVzYWdlCiAKICAgICBkZWYgZm9ybWF0X2hlYWRpbmcoc2VsZiwgaGVhZGluZyk6CiAgICAgICAgIHJldHVybiAiJSpzJXM6XG4iICUgKHNlbGYuY3VycmVudF9pbmRlbnQsICIiLCBoZWFkaW5nKQpAQCAtMzUzLDggKzM5MCwyNyBAQAogICAgICAgICByZXR1cm4gIiVzXG4lc1xuIiAlIChoZWFkaW5nLCAiPS0iW3NlbGYubGV2ZWxdICogbGVuKGhlYWRpbmcpKQogCiAKLV9idWlsdGluX2N2dCA9IHsgImludCIgOiAoaW50LCBfKCJpbnRlZ2VyIikpLAotICAgICAgICAgICAgICAgICAibG9uZyIgOiAobG9uZywgXygibG9uZyBpbnRlZ2VyIikpLAorZGVmIF9wYXJzZV9udW0odmFsLCB0eXBlKToKKyAgICBpZiB2YWxbOjJdLmxvd2VyKCkgPT0gIjB4IjogICAgICAgICAjIGhleGFkZWNpbWFsCisgICAgICAgIHJhZGl4ID0gMTYKKyAgICBlbGlmIHZhbFs6Ml0ubG93ZXIoKSA9PSAiMGIiOiAgICAgICAjIGJpbmFyeQorICAgICAgICByYWRpeCA9IDIKKyAgICAgICAgdmFsID0gdmFsWzI6XSBvciAiMCIgICAgICAgICAgICAjIGhhdmUgdG8gcmVtb3ZlICIwYiIgcHJlZml4CisgICAgZWxpZiB2YWxbOjFdID09ICIwIjogICAgICAgICAgICAgICAgIyBvY3RhbAorICAgICAgICByYWRpeCA9IDgKKyAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlY2ltYWwKKyAgICAgICAgcmFkaXggPSAxMAorCisgICAgcmV0dXJuIHR5cGUodmFsLCByYWRpeCkKKworZGVmIF9wYXJzZV9pbnQodmFsKToKKyAgICByZXR1cm4gX3BhcnNlX251bSh2YWwsIGludCkKKworZGVmIF9wYXJzZV9sb25nKHZhbCk6CisgICAgcmV0dXJuIF9wYXJzZV9udW0odmFsLCBsb25nKQorCitfYnVpbHRpbl9jdnQgPSB7ICJpbnQiIDogKF9wYXJzZV9pbnQsIF8oImludGVnZXIiKSksCisgICAgICAgICAgICAgICAgICJsb25nIiA6IChfcGFyc2VfbG9uZywgXygibG9uZyBpbnRlZ2VyIikpLAogICAgICAgICAgICAgICAgICAiZmxvYXQiIDogKGZsb2F0LCBfKCJmbG9hdGluZy1wb2ludCIpKSwKICAgICAgICAgICAgICAgICAgImNvbXBsZXgiIDogKGNvbXBsZXgsIF8oImNvbXBsZXgiKSkgfQogCkBAIC00MjIsNiArNDc4LDcgQEAKICAgICAgICAgICAgICAgICJzdG9yZV90cnVlIiwKICAgICAgICAgICAgICAgICJzdG9yZV9mYWxzZSIsCiAgICAgICAgICAgICAgICAiYXBwZW5kIiwKKyAgICAgICAgICAgICAgICJhcHBlbmRfY29uc3QiLAogICAgICAgICAgICAgICAgImNvdW50IiwKICAgICAgICAgICAgICAgICJjYWxsYmFjayIsCiAgICAgICAgICAgICAgICAiaGVscCIsCkBAIC00MzUsNiArNDkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICJzdG9yZV90cnVlIiwKICAgICAgICAgICAgICAgICAgICAgICJzdG9yZV9mYWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAiYXBwZW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICJhcHBlbmRfY29uc3QiLAogICAgICAgICAgICAgICAgICAgICAgImNvdW50IikKIAogICAgICMgVGhlIHNldCBvZiBhY3Rpb25zIGZvciB3aGljaCBpdCBtYWtlcyBzZW5zZSB0byBzdXBwbHkgYSB2YWx1ZQpAQCAtNDQ4LDYgKzUwNiwxMCBAQAogICAgIEFMV0FZU19UWVBFRF9BQ1RJT05TID0gKCJzdG9yZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGVuZCIpCiAKKyAgICAjIFRoZSBzZXQgb2YgYWN0aW9ucyB3aGljaCB0YWtlIGEgJ2NvbnN0JyBhdHRyaWJ1dGUuCisgICAgQ09OU1RfQUNUSU9OUyA9ICgic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgImFwcGVuZF9jb25zdCIpCisKICAgICAjIFRoZSBzZXQgb2Yga25vd24gdHlwZXMgZm9yIG9wdGlvbiBwYXJzZXJzLiAgQWdhaW4sIGxpc3RlZCBoZXJlIGZvcgogICAgICMgY29uc3RydWN0b3IgYXJndW1lbnQgdmFsaWRhdGlvbi4KICAgICBUWVBFUyA9ICgic3RyaW5nIiwgImludCIsICJsb25nIiwgImZsb2F0IiwgImNvbXBsZXgiLCAiY2hvaWNlIikKQEAgLTU3Miw5ICs2MzQsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgIyBObyB0eXBlIGdpdmVuPyAgInN0cmluZyIgaXMgdGhlIG1vc3Qgc2Vuc2libGUgZGVmYXVsdC4KICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlID0gInN0cmluZyIKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgQWxsb3cgdHlwZSBvYmplY3RzIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZWlyIG5hbWVzLgotICAgICAgICAgICAgaWYgdHlwZShzZWxmLnR5cGUpIGlzIHR5cGU6CisgICAgICAgICAgICAjIEFsbG93IHR5cGUgb2JqZWN0cyBvciBidWlsdGluIHR5cGUgY29udmVyc2lvbiBmdW5jdGlvbnMKKyAgICAgICAgICAgICMgKGludCwgc3RyLCBldGMuKSBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGVpciBuYW1lcy4gIChUaGUKKyAgICAgICAgICAgICMgY29tcGxpY2F0ZWQgY2hlY2sgb2YgX19idWlsdGluX18gaXMgb25seSBuZWNlc3NhcnkgZm9yCisgICAgICAgICAgICAjIFB5dGhvbiAyLjEgYW5kIGVhcmxpZXIsIGFuZCBpcyBzaG9ydC1jaXJjdWl0ZWQgYnkgdGhlCisgICAgICAgICAgICAjIGZpcnN0IGNoZWNrIG9uIG1vZGVybiBQeXRob25zLikKKyAgICAgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICAgICAgaWYgKCB0eXBlKHNlbGYudHlwZSkgaXMgdHlwZXMuVHlwZVR5cGUgb3IKKyAgICAgICAgICAgICAgICAgKGhhc2F0dHIoc2VsZi50eXBlLCAiX19uYW1lX18iKSBhbmQKKyAgICAgICAgICAgICAgICAgIGdldGF0dHIoX19idWlsdGluX18sIHNlbGYudHlwZS5fX25hbWVfXywgTm9uZSkgaXMgc2VsZi50eXBlKSApOgogICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9IHNlbGYudHlwZS5fX25hbWVfXworCiAgICAgICAgICAgICBpZiBzZWxmLnR5cGUgPT0gInN0ciI6CiAgICAgICAgICAgICAgICAgc2VsZi50eXBlID0gInN0cmluZyIKIApAQCAtNTg5LDcgKzY1OSw3IEBACiAgICAgICAgICAgICBpZiBzZWxmLmNob2ljZXMgaXMgTm9uZToKICAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgIm11c3Qgc3VwcGx5IGEgbGlzdCBvZiBjaG9pY2VzIGZvciB0eXBlICdjaG9pY2UnIiwgc2VsZikKLSAgICAgICAgICAgIGVsaWYgdHlwZShzZWxmLmNob2ljZXMpIG5vdCBpbiAodHVwbGUsIGxpc3QpOgorICAgICAgICAgICAgZWxpZiB0eXBlKHNlbGYuY2hvaWNlcykgbm90IGluICh0eXBlcy5UdXBsZVR5cGUsIHR5cGVzLkxpc3RUeXBlKToKICAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgImNob2ljZXMgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoJyVzJyBzdXBwbGllZCkiCiAgICAgICAgICAgICAgICAgICAgICUgc3RyKHR5cGUoc2VsZi5jaG9pY2VzKSkuc3BsaXQoIiciKVsxXSwgc2VsZikKQEAgLTYxMyw3ICs2ODMsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuZGVzdCA9IHNlbGYuX3Nob3J0X29wdHNbMF1bMV0KIAogICAgIGRlZiBfY2hlY2tfY29uc3Qoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuYWN0aW9uICE9ICJzdG9yZV9jb25zdCIgYW5kIHNlbGYuY29uc3QgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHNlbGYuYWN0aW9uIG5vdCBpbiBzZWxmLkNPTlNUX0FDVElPTlMgYW5kIHNlbGYuY29uc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICAiJ2NvbnN0JyBtdXN0IG5vdCBiZSBzdXBwbGllZCBmb3IgYWN0aW9uICVyIiAlIHNlbGYuYWN0aW9uLAogICAgICAgICAgICAgICAgIHNlbGYpCkBAIC02MzMsMTIgKzcwMywxMiBAQAogICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2sgbm90IGNhbGxhYmxlOiAlciIgJSBzZWxmLmNhbGxiYWNrLCBzZWxmKQogICAgICAgICAgICAgaWYgKHNlbGYuY2FsbGJhY2tfYXJncyBpcyBub3QgTm9uZSBhbmQKLSAgICAgICAgICAgICAgICB0eXBlKHNlbGYuY2FsbGJhY2tfYXJncykgaXMgbm90IHR1cGxlKToKKyAgICAgICAgICAgICAgICB0eXBlKHNlbGYuY2FsbGJhY2tfYXJncykgaXMgbm90IHR5cGVzLlR1cGxlVHlwZSk6CiAgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFja19hcmdzLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIHR1cGxlOiBub3QgJXIiCiAgICAgICAgICAgICAgICAgICAgICUgc2VsZi5jYWxsYmFja19hcmdzLCBzZWxmKQogICAgICAgICAgICAgaWYgKHNlbGYuY2FsbGJhY2tfa3dhcmdzIGlzIG5vdCBOb25lIGFuZAotICAgICAgICAgICAgICAgIHR5cGUoc2VsZi5jYWxsYmFja19rd2FyZ3MpIGlzIG5vdCBkaWN0KToKKyAgICAgICAgICAgICAgICB0eXBlKHNlbGYuY2FsbGJhY2tfa3dhcmdzKSBpcyBub3QgdHlwZXMuRGljdFR5cGUpOgogICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2tfa3dhcmdzLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIGRpY3Q6IG5vdCAlciIKICAgICAgICAgICAgICAgICAgICAgJSBzZWxmLmNhbGxiYWNrX2t3YXJncywgc2VsZikKQEAgLTcyMCw2ICs3OTAsOCBAQAogICAgICAgICAgICAgc2V0YXR0cih2YWx1ZXMsIGRlc3QsIEZhbHNlKQogICAgICAgICBlbGlmIGFjdGlvbiA9PSAiYXBwZW5kIjoKICAgICAgICAgICAgIHZhbHVlcy5lbnN1cmVfdmFsdWUoZGVzdCwgW10pLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gImFwcGVuZF9jb25zdCI6CisgICAgICAgICAgICB2YWx1ZXMuZW5zdXJlX3ZhbHVlKGRlc3QsIFtdKS5hcHBlbmQoc2VsZi5jb25zdCkKICAgICAgICAgZWxpZiBhY3Rpb24gPT0gImNvdW50IjoKICAgICAgICAgICAgIHNldGF0dHIodmFsdWVzLCBkZXN0LCB2YWx1ZXMuZW5zdXJlX3ZhbHVlKGRlc3QsIDApICsgMSkKICAgICAgICAgZWxpZiBhY3Rpb24gPT0gImNhbGxiYWNrIjoKQEAgLTc0OCwxMSArODIwLDkgQEAKICAgICBUcnVlLCBGYWxzZQogZXhjZXB0IE5hbWVFcnJvcjoKICAgICAoVHJ1ZSwgRmFsc2UpID0gKDEsIDApCi10cnk6Ci0gICAgYmFzZXN0cmluZwotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBiYXNlc3RyaW5nID0gKHN0ciwgdW5pY29kZSkKIAorZGVmIGlzYmFzZXN0cmluZyh4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCB0eXBlcy5TdHJpbmdUeXBlKSBvciBpc2luc3RhbmNlKHgsIHR5cGVzLlVuaWNvZGVUeXBlKQogCiBjbGFzcyBWYWx1ZXM6CiAKQEAgLTc2NiwxNiArODM2LDEzIEBACiAKICAgICBfX3JlcHJfXyA9IF9yZXByCiAKLSAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFZhbHVlcyk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXwotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRpY3QpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X18gPT0gb3RoZXIKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgdHlwZXMuRGljdFR5cGUpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLl9fZGljdF9fLCBvdGhlcikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisgICAgICAgICAgICByZXR1cm4gLTEKIAogICAgIGRlZiBfdXBkYXRlX2NhcmVmdWwoc2VsZiwgZGljdCk6CiAgICAgICAgICIiIgpAQCAtODkzLDYgKzk2MCwxMyBAQAogICAgICAgICByZXR1cm4gc2VsZi5kZXNjcmlwdGlvbgogCiAKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgIiIic2VlIE9wdGlvblBhcnNlci5kZXN0cm95KCkuIiIiCisgICAgICAgIGRlbCBzZWxmLl9zaG9ydF9vcHQKKyAgICAgICAgZGVsIHNlbGYuX2xvbmdfb3B0CisgICAgICAgIGRlbCBzZWxmLmRlZmF1bHRzCisKKwogICAgICMgLS0gT3B0aW9uLWFkZGluZyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBkZWYgX2NoZWNrX2NvbmZsaWN0KHNlbGYsIG9wdGlvbik6CkBAIC05MjYsNyArMTAwMCw3IEBACiAgICAgICAgICIiImFkZF9vcHRpb24oT3B0aW9uKQogICAgICAgICAgICBhZGRfb3B0aW9uKG9wdF9zdHIsIC4uLiwga3dhcmc9dmFsLCAuLi4pCiAgICAgICAgICIiIgotICAgICAgICBpZiB0eXBlKGFyZ3NbMF0pIGlzIHN0cjoKKyAgICAgICAgaWYgdHlwZShhcmdzWzBdKSBpcyB0eXBlcy5TdHJpbmdUeXBlOgogICAgICAgICAgICAgb3B0aW9uID0gc2VsZi5vcHRpb25fY2xhc3MoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAxIGFuZCBub3Qga3dhcmdzOgogICAgICAgICAgICAgb3B0aW9uID0gYXJnc1swXQpAQCAtMTAxOCw2ICsxMDkyLDExIEBACiAgICAgZGVmIHNldF90aXRsZShzZWxmLCB0aXRsZSk6CiAgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQogCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICIiInNlZSBPcHRpb25QYXJzZXIuZGVzdHJveSgpLiIiIgorICAgICAgICBPcHRpb25Db250YWluZXIuZGVzdHJveShzZWxmKQorICAgICAgICBkZWwgc2VsZi5vcHRpb25fbGlzdAorCiAgICAgIyAtLSBIZWxwLWZvcm1hdHRpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIGRlZiBmb3JtYXRfaGVscChzZWxmLCBmb3JtYXR0ZXIpOgpAQCAtMTA0NCw2ICsxMTIzLDggQEAKICAgICAgIHByb2cgOiBzdHJpbmcKICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcHJvZ3JhbSAodG8gb3ZlcnJpZGUKICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkpLgorICAgICAgZXBpbG9nIDogc3RyaW5nCisgICAgICAgIHBhcmFncmFwaCBvZiBoZWxwIHRleHQgdG8gcHJpbnQgYWZ0ZXIgb3B0aW9uIGhlbHAKIAogICAgICAgb3B0aW9uX2dyb3VwcyA6IFtPcHRpb25Hcm91cF0KICAgICAgICAgbGlzdCBvZiBvcHRpb24gZ3JvdXBzIGluIHRoaXMgcGFyc2VyIChvcHRpb24gZ3JvdXBzIGFyZQpAQCAtMTEwMiw3ICsxMTgzLDggQEAKICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Tm9uZSwKICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyPU5vbmUsCiAgICAgICAgICAgICAgICAgIGFkZF9oZWxwX29wdGlvbj1UcnVlLAotICAgICAgICAgICAgICAgICBwcm9nPU5vbmUpOgorICAgICAgICAgICAgICAgICBwcm9nPU5vbmUsCisgICAgICAgICAgICAgICAgIGVwaWxvZz1Ob25lKToKICAgICAgICAgT3B0aW9uQ29udGFpbmVyLl9faW5pdF9fKAogICAgICAgICAgICAgc2VsZiwgb3B0aW9uX2NsYXNzLCBjb25mbGljdF9oYW5kbGVyLCBkZXNjcmlwdGlvbikKICAgICAgICAgc2VsZi5zZXRfdXNhZ2UodXNhZ2UpCkBAIC0xMTE0LDYgKzExOTYsNyBAQAogICAgICAgICAgICAgZm9ybWF0dGVyID0gSW5kZW50ZWRIZWxwRm9ybWF0dGVyKCkKICAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBmb3JtYXR0ZXIKICAgICAgICAgc2VsZi5mb3JtYXR0ZXIuc2V0X3BhcnNlcihzZWxmKQorICAgICAgICBzZWxmLmVwaWxvZyA9IGVwaWxvZwogCiAgICAgICAgICMgUG9wdWxhdGUgdGhlIG9wdGlvbiBsaXN0OyBpbml0aWFsIHNvdXJjZXMgYXJlIHRoZQogICAgICAgICAjIHN0YW5kYXJkX29wdGlvbl9saXN0IGNsYXNzIGF0dHJpYnV0ZSwgdGhlICdvcHRpb25fbGlzdCcKQEAgLTExMjQsNiArMTIwNywyMiBAQAogCiAgICAgICAgIHNlbGYuX2luaXRfcGFyc2luZ19zdGF0ZSgpCiAKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVjbGFyZSB0aGF0IHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgT3B0aW9uUGFyc2VyLiAgVGhpcyBjbGVhbnMgdXAKKyAgICAgICAgcmVmZXJlbmNlIGN5Y2xlcyBzbyB0aGUgT3B0aW9uUGFyc2VyIChhbmQgYWxsIG9iamVjdHMgcmVmZXJlbmNlZCBieQorICAgICAgICBpdCkgY2FuIGJlIGdhcmJhZ2UtY29sbGVjdGVkIHByb21wdGx5LiAgQWZ0ZXIgY2FsbGluZyBkZXN0cm95KCksIHRoZQorICAgICAgICBPcHRpb25QYXJzZXIgaXMgdW51c2FibGUuCisgICAgICAgICIiIgorICAgICAgICBPcHRpb25Db250YWluZXIuZGVzdHJveShzZWxmKQorICAgICAgICBmb3IgZ3JvdXAgaW4gc2VsZi5vcHRpb25fZ3JvdXBzOgorICAgICAgICAgICAgZ3JvdXAuZGVzdHJveSgpCisgICAgICAgIGRlbCBzZWxmLm9wdGlvbl9saXN0CisgICAgICAgIGRlbCBzZWxmLm9wdGlvbl9ncm91cHMKKyAgICAgICAgZGVsIHNlbGYuZm9ybWF0dGVyCisKKwogICAgICMgLS0gUHJpdmF0ZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIyAodXNlZCBieSBvdXIgb3IgT3B0aW9uQ29udGFpbmVyJ3MgY29uc3RydWN0b3IpCiAKQEAgLTExNjcsNyArMTI2Niw3IEBACiAgICAgICAgIGVsaWYgdXNhZ2UgaXMgU1VQUFJFU1NfVVNBR0U6CiAgICAgICAgICAgICBzZWxmLnVzYWdlID0gTm9uZQogICAgICAgICAjIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE9wdGlrIDEuMyBhbmQgZWFybGllci4KLSAgICAgICAgZWxpZiB1c2FnZS5zdGFydHN3aXRoKCJ1c2FnZToiICsgIiAiKToKKyAgICAgICAgZWxpZiB1c2FnZS5sb3dlcigpLnN0YXJ0c3dpdGgoInVzYWdlOiAiKToKICAgICAgICAgICAgIHNlbGYudXNhZ2UgPSB1c2FnZVs3Ol0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYudXNhZ2UgPSB1c2FnZQpAQCAtMTIwMSw3ICsxMzAwLDcgQEAKICAgICAgICAgZGVmYXVsdHMgPSBzZWxmLmRlZmF1bHRzLmNvcHkoKQogICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYuX2dldF9hbGxfb3B0aW9ucygpOgogICAgICAgICAgICAgZGVmYXVsdCA9IGRlZmF1bHRzLmdldChvcHRpb24uZGVzdCkKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGVmYXVsdCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBpZiBpc2Jhc2VzdHJpbmcoZGVmYXVsdCk6CiAgICAgICAgICAgICAgICAgb3B0X3N0ciA9IG9wdGlvbi5nZXRfb3B0X3N0cmluZygpCiAgICAgICAgICAgICAgICAgZGVmYXVsdHNbb3B0aW9uLmRlc3RdID0gb3B0aW9uLmNoZWNrX3ZhbHVlKG9wdF9zdHIsIGRlZmF1bHQpCiAKQEAgLTEyMTIsNyArMTMxMSw3IEBACiAKICAgICBkZWYgYWRkX29wdGlvbl9ncm91cChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAjIFhYWCBsb3RzIG9mIG92ZXJsYXAgd2l0aCBPcHRpb25Db250YWluZXIuYWRkX29wdGlvbigpCi0gICAgICAgIGlmIHR5cGUoYXJnc1swXSkgaXMgc3RyOgorICAgICAgICBpZiB0eXBlKGFyZ3NbMF0pIGlzIHR5cGVzLlN0cmluZ1R5cGU6CiAgICAgICAgICAgICBncm91cCA9IE9wdGlvbkdyb3VwKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMSBhbmQgbm90IGt3YXJnczoKICAgICAgICAgICAgIGdyb3VwID0gYXJnc1swXQpAQCAtMTI3Niw3ICsxMzc1LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3RvcCA9IHNlbGYuX3Byb2Nlc3NfYXJncyhsYXJncywgcmFyZ3MsIHZhbHVlcykKICAgICAgICAgZXhjZXB0IChCYWRPcHRpb25FcnJvciwgT3B0aW9uVmFsdWVFcnJvciksIGVycjoKLSAgICAgICAgICAgIHNlbGYuZXJyb3IoZXJyLm1zZykKKyAgICAgICAgICAgIHNlbGYuZXJyb3Ioc3RyKGVycikpCiAKICAgICAgICAgYXJncyA9IGxhcmdzICsgcmFyZ3MKICAgICAgICAgcmV0dXJuIHNlbGYuY2hlY2tfdmFsdWVzKHZhbHVlcywgYXJncykKQEAgLTE0MDEsNyArMTUwMCw3IEBACiAgICAgICAgICAgICBpICs9IDEgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIGNvbnN1bWVkIGEgY2hhcmFjdGVyCiAKICAgICAgICAgICAgIGlmIG5vdCBvcHRpb246Ci0gICAgICAgICAgICAgICAgc2VsZi5lcnJvcihfKCJubyBzdWNoIG9wdGlvbjogJXMiKSAlIG9wdCkKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRPcHRpb25FcnJvcihvcHQpCiAgICAgICAgICAgICBpZiBvcHRpb24udGFrZXNfdmFsdWUoKToKICAgICAgICAgICAgICAgICAjIEFueSBjaGFyYWN0ZXJzIGxlZnQgaW4gYXJnPyAgUHJldGVuZCB0aGV5J3JlIHRoZQogICAgICAgICAgICAgICAgICMgbmV4dCBhcmcsIGFuZCBzdG9wIGNvbnN1bWluZyBjaGFyYWN0ZXJzIG9mIGFyZy4KQEAgLTE1MDEsNyArMTYwMCw3IEBACiAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLmZvcm1hdHRlcgogICAgICAgICBmb3JtYXR0ZXIuc3RvcmVfb3B0aW9uX3N0cmluZ3Moc2VsZikKICAgICAgICAgcmVzdWx0ID0gW10KLSAgICAgICAgcmVzdWx0LmFwcGVuZChmb3JtYXR0ZXIuZm9ybWF0X2hlYWRpbmcoXygib3B0aW9ucyIpKSkKKyAgICAgICAgcmVzdWx0LmFwcGVuZChmb3JtYXR0ZXIuZm9ybWF0X2hlYWRpbmcoXygiT3B0aW9ucyIpKSkKICAgICAgICAgZm9ybWF0dGVyLmluZGVudCgpCiAgICAgICAgIGlmIHNlbGYub3B0aW9uX2xpc3Q6CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKE9wdGlvbkNvbnRhaW5lci5mb3JtYXRfb3B0aW9uX2hlbHAoc2VsZiwgZm9ybWF0dGVyKSkKQEAgLTE1MTMsNiArMTYxMiw5IEBACiAgICAgICAgICMgRHJvcCB0aGUgbGFzdCAiXG4iLCBvciB0aGUgaGVhZGVyIGlmIG5vIG9wdGlvbnMgb3Igb3B0aW9uIGdyb3VwczoKICAgICAgICAgcmV0dXJuICIiLmpvaW4ocmVzdWx0WzotMV0pCiAKKyAgICBkZWYgZm9ybWF0X2VwaWxvZyhzZWxmLCBmb3JtYXR0ZXIpOgorICAgICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdF9lcGlsb2coc2VsZi5lcGlsb2cpCisKICAgICBkZWYgZm9ybWF0X2hlbHAoc2VsZiwgZm9ybWF0dGVyPU5vbmUpOgogICAgICAgICBpZiBmb3JtYXR0ZXIgaXMgTm9uZToKICAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuZm9ybWF0dGVyCkBAIC0xNTIyLDYgKzE2MjQsNyBAQAogICAgICAgICBpZiBzZWxmLmRlc2NyaXB0aW9uOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLmZvcm1hdF9kZXNjcmlwdGlvbihmb3JtYXR0ZXIpICsgIlxuIikKICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLmZvcm1hdF9vcHRpb25faGVscChmb3JtYXR0ZXIpKQorICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZm9ybWF0X2VwaWxvZyhmb3JtYXR0ZXIpKQogICAgICAgICByZXR1cm4gIiIuam9pbihyZXN1bHQpCiAKICAgICBkZWYgcHJpbnRfaGVscChzZWxmLCBmaWxlPU5vbmUpOgpAQCAtMTU1NSwxMSArMTY1OCwxMCBAQAogICAgICAgICBpZiBsZW4ocG9zc2liaWxpdGllcykgPT0gMToKICAgICAgICAgICAgIHJldHVybiBwb3NzaWJpbGl0aWVzWzBdCiAgICAgICAgIGVsaWYgbm90IHBvc3NpYmlsaXRpZXM6Ci0gICAgICAgICAgICByYWlzZSBCYWRPcHRpb25FcnJvcihfKCJubyBzdWNoIG9wdGlvbjogJXMiKSAlIHMpCisgICAgICAgICAgICByYWlzZSBCYWRPcHRpb25FcnJvcihzKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBNb3JlIHRoYW4gb25lIHBvc3NpYmxlIGNvbXBsZXRpb246IGFtYmlndW91cyBwcmVmaXguCi0gICAgICAgICAgICByYWlzZSBCYWRPcHRpb25FcnJvcihfKCJhbWJpZ3VvdXMgb3B0aW9uOiAlcyAoJXM/KSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzLCAiLCAiLmpvaW4ocG9zc2liaWxpdGllcykpKQorICAgICAgICAgICAgcmFpc2UgQW1iaWd1b3VzT3B0aW9uRXJyb3IocywgcG9zc2liaWxpdGllcykKIAogCiAjIFNvbWUgZGF5LCB0aGVyZSBtaWdodCBiZSBtYW55IE9wdGlvbiBjbGFzc2VzLiAgQXMgb2YgT3B0aWsgMS4zLCB0aGUKZGlmZiAtLWdpdCBhL0xpYi9wZGIucHkgYi9MaWIvcGRiLnB5CmluZGV4IDViN2VhOTkuLjk0ZjYxZjcgMTAwNzU1Ci0tLSBhL0xpYi9wZGIucHkKKysrIGIvTGliL3BkYi5weQpAQCAtNTcsOSArNTcsMTEgQEAKIAogY2xhc3MgUGRiKGJkYi5CZGIsIGNtZC5DbWQpOgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21wbGV0ZWtleT0ndGFiJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUpOgogICAgICAgICBiZGIuQmRiLl9faW5pdF9fKHNlbGYpCi0gICAgICAgIGNtZC5DbWQuX19pbml0X18oc2VsZikKKyAgICAgICAgY21kLkNtZC5fX2luaXRfXyhzZWxmLCBjb21wbGV0ZWtleSwgc3RkaW4sIHN0ZG91dCkKKyAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgc2VsZi51c2VfcmF3aW5wdXQgPSAwCiAgICAgICAgIHNlbGYucHJvbXB0ID0gJyhQZGIpICcKICAgICAgICAgc2VsZi5hbGlhc2VzID0ge30KICAgICAgICAgc2VsZi5tYWlucHlmaWxlID0gJycKQEAgLTEzMyw3ICsxMzUsNyBAQAogICAgICAgICBpZiBzZWxmLl93YWl0X2Zvcl9tYWlucHlmaWxlOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIHNlbGYuc3RvcF9oZXJlKGZyYW1lKToKLSAgICAgICAgICAgIHByaW50ICctLUNhbGwtLScKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICctLUNhbGwtLScKICAgICAgICAgICAgIHNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIE5vbmUpCiAKICAgICBkZWYgdXNlcl9saW5lKHNlbGYsIGZyYW1lKToKQEAgLTE2OSw3ICsxNzEsNyBAQAogICAgIGRlZiB1c2VyX3JldHVybihzZWxmLCBmcmFtZSwgcmV0dXJuX3ZhbHVlKToKICAgICAgICAgIiIiVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHJldHVybiB0cmFwIGlzIHNldCBoZXJlLiIiIgogICAgICAgICBmcmFtZS5mX2xvY2Fsc1snX19yZXR1cm5fXyddID0gcmV0dXJuX3ZhbHVlCi0gICAgICAgIHByaW50ICctLVJldHVybi0tJworICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnLS1SZXR1cm4tLScKICAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKIAogICAgIGRlZiB1c2VyX2V4Y2VwdGlvbihzZWxmLCBmcmFtZSwgKGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190cmFjZWJhY2spKToKQEAgLTE3OSw3ICsxODEsNyBAQAogICAgICAgICBpZiB0eXBlKGV4Y190eXBlKSA9PSB0eXBlKCcnKToKICAgICAgICAgICAgIGV4Y190eXBlX25hbWUgPSBleGNfdHlwZQogICAgICAgICBlbHNlOiBleGNfdHlwZV9uYW1lID0gZXhjX3R5cGUuX19uYW1lX18KLSAgICAgICAgcHJpbnQgZXhjX3R5cGVfbmFtZSArICc6JywgX3NhZmVyZXByKGV4Y192YWx1ZSkKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgZXhjX3R5cGVfbmFtZSArICc6JywgX3NhZmVyZXByKGV4Y192YWx1ZSkKICAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgZXhjX3RyYWNlYmFjaykKIAogICAgICMgR2VuZXJhbCBpbnRlcmFjdGlvbiBmdW5jdGlvbgpAQCAtMjAyLDcgKzIwNCw3IEBACiAgICAgICAgICAgICBpZiB0eXBlKHQpID09IHR5cGUoJycpOgogICAgICAgICAgICAgICAgIGV4Y190eXBlX25hbWUgPSB0CiAgICAgICAgICAgICBlbHNlOiBleGNfdHlwZV9uYW1lID0gdC5fX25hbWVfXwotICAgICAgICAgICAgcHJpbnQgJyoqKicsIGV4Y190eXBlX25hbWUgKyAnOicsIHYKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKionLCBleGNfdHlwZV9uYW1lICsgJzonLCB2CiAKICAgICBkZWYgcHJlY21kKHNlbGYsIGxpbmUpOgogICAgICAgICAiIiJIYW5kbGUgYWxpYXMgZXhwYW5zaW9uIGFuZCAnOzsnIHNlcGFyYXRvci4iIiIKQEAgLTI4MCw3ICsyODIsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGJudW0gPSBpbnQoYXJnKQogICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHByaW50ICJVc2FnZSA6IGNvbW1hbmRzIFtibnVtXVxuICAgICAgICAuLi5cbiAgICAgICAgZW5kIgorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICJVc2FnZSA6IGNvbW1hbmRzIFtibnVtXVxuICAgICAgICAuLi5cbiAgICAgICAgZW5kIgogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLmNvbW1hbmRzX2JudW0gPSBibnVtCiAgICAgICAgIHNlbGYuY29tbWFuZHNbYm51bV0gPSBbXQpAQCAtMjk3LDEwICsyOTksMTAgQEAKICAgICAgICAgIyBicmVhayBbIChbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCAiY29uZGl0aW9uIl0gXQogICAgICAgICBpZiBub3QgYXJnOgogICAgICAgICAgICAgaWYgc2VsZi5icmVha3M6ICAjIFRoZXJlJ3MgYXQgbGVhc3Qgb25lCi0gICAgICAgICAgICAgICAgcHJpbnQgIk51bSBUeXBlICAgICAgICAgRGlzcCBFbmIgICBXaGVyZSIKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiTnVtIFR5cGUgICAgICAgICBEaXNwIEVuYiAgIFdoZXJlIgogICAgICAgICAgICAgICAgIGZvciBicCBpbiBiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyOgogICAgICAgICAgICAgICAgICAgICBpZiBicDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJwLmJwcHJpbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgYnAuYnBwcmludChzZWxmLnN0ZG91dCkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICAjIHBhcnNlIGFyZ3VtZW50czsgY29tbWEgaGFzIGxvd2VzdCBwcmVjZWRlbmNlCiAgICAgICAgICMgYW5kIGNhbm5vdCBvY2N1ciBpbiBmaWxlbmFtZQpAQCAtMzE5LDggKzMyMSw4IEBACiAgICAgICAgICAgICBmaWxlbmFtZSA9IGFyZ1s6Y29sb25dLnJzdHJpcCgpCiAgICAgICAgICAgICBmID0gc2VsZi5sb29rdXBtb2R1bGUoZmlsZW5hbWUpCiAgICAgICAgICAgICBpZiBub3QgZjoKLSAgICAgICAgICAgICAgICBwcmludCAnKioqICcsIHJlcHIoZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIHByaW50ICdub3QgZm91bmQgZnJvbSBzeXMucGF0aCcKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqICcsIHJlcHIoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdub3QgZm91bmQgZnJvbSBzeXMucGF0aCcKICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmCkBAIC0zMjgsNyArMzMwLDcgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBsaW5lbm8gPSBpbnQoYXJnKQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIG1zZzoKLSAgICAgICAgICAgICAgICBwcmludCAnKioqIEJhZCBsaW5lbm86JywgYXJnCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBCYWQgbGluZW5vOicsIGFyZwogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBubyBjb2xvbjsgY2FuIGJlIGxpbmVubyBvciBmdW5jdGlvbgpAQCAtMzU0LDExICszNTYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgIyBsYXN0IHRoaW5nIHRvIHRyeQogICAgICAgICAgICAgICAgICAgICAob2ssIGZpbGVuYW1lLCBsbikgPSBzZWxmLmxpbmVpbmZvKGFyZykKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9rOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyoqKiBUaGUgc3BlY2lmaWVkIG9iamVjdCcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCByZXByKGFyZyksCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnaXMgbm90IGEgZnVuY3Rpb24nCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCAoJ29yIHdhcyBub3QgZm91bmQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbG9uZyBzeXMucGF0aC4nKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBUaGUgc3BlY2lmaWVkIG9iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCByZXByKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnaXMgbm90IGEgZnVuY3Rpb24nCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnb3Igd2FzIG5vdCBmb3VuZCBhbG9uZyBzeXMucGF0aC4nCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUgPSBvayAjIG9rIGNvbnRhaW5zIGEgZnVuY3Rpb24gbmFtZQogICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBpbnQobG4pCkBAIC0zNjksMTIgKzM3MCwxMiBAQAogICAgICAgICBpZiBsaW5lOgogICAgICAgICAgICAgIyBub3cgc2V0IHRoZSBicmVhayBwb2ludAogICAgICAgICAgICAgZXJyID0gc2VsZi5zZXRfYnJlYWsoZmlsZW5hbWUsIGxpbmUsIHRlbXBvcmFyeSwgY29uZCwgZnVuY25hbWUpCi0gICAgICAgICAgICBpZiBlcnI6IHByaW50ICcqKionLCBlcnIKKyAgICAgICAgICAgIGlmIGVycjogcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKicsIGVycgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBicCA9IHNlbGYuZ2V0X2JyZWFrcyhmaWxlbmFtZSwgbGluZSlbLTFdCi0gICAgICAgICAgICAgICAgcHJpbnQgIkJyZWFrcG9pbnQgJWQgYXQgJXM6JWQiICUgKGJwLm51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAuZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAubGluZSkKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiQnJlYWtwb2ludCAlZCBhdCAlczolZCIgJSAoYnAubnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5saW5lKQogCiAgICAgIyBUbyBiZSBvdmVycmlkZGVuIGluIGRlcml2ZWQgZGVidWdnZXJzCiAgICAgZGVmIGRlZmF1bHRGaWxlKHNlbGYpOgpAQCAtNDMwLDEzICs0MzEsMTMgQEAKICAgICAgICAgIiIiCiAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQogICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgIHByaW50ICdFbmQgb2YgZmlsZScKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdFbmQgb2YgZmlsZScKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgIyBEb24ndCBhbGxvdyBzZXR0aW5nIGJyZWFrcG9pbnQgYXQgYSBibGFuayBsaW5lCiAgICAgICAgIGlmIChub3QgbGluZSBvciAobGluZVswXSA9PSAnIycpIG9yCiAgICAgICAgICAgICAgKGxpbmVbOjNdID09ICciIiInKSBvciBsaW5lWzozXSA9PSAiJycnIik6Ci0gICAgICAgICAgICBwcmludCAnKioqIEJsYW5rIG9yIGNvbW1lbnQnCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIEJsYW5rIG9yIGNvbW1lbnQnCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICByZXR1cm4gbGluZW5vCiAKQEAgLTQ0NiwxMSArNDQ3LDExIEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgaSA9IGludChpKQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ0JyZWFrcG9pbnQgaW5kZXggJXIgaXMgbm90IGEgbnVtYmVyJyAlIGkKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgYSBudW1iZXInICUgaQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgICAgICAgIGlmIG5vdCAoMCA8PSBpIDwgbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpKToKLSAgICAgICAgICAgICAgICBwcmludCAnTm8gYnJlYWtwb2ludCBudW1iZXJlZCcsIGkKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnTm8gYnJlYWtwb2ludCBudW1iZXJlZCcsIGkKICAgICAgICAgICAgICAgICBjb250aW51ZQogCiAgICAgICAgICAgICBicCA9IGJkYi5CcmVha3BvaW50LmJwYnludW1iZXJbaV0KQEAgLTQ2MywxMSArNDY0LDExIEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgaSA9IGludChpKQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJ0JyZWFrcG9pbnQgaW5kZXggJXIgaXMgbm90IGEgbnVtYmVyJyAlIGkKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgYSBudW1iZXInICUgaQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgICAgICAgIGlmIG5vdCAoMCA8PSBpIDwgbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpKToKLSAgICAgICAgICAgICAgICBwcmludCAnTm8gYnJlYWtwb2ludCBudW1iZXJlZCcsIGkKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnTm8gYnJlYWtwb2ludCBudW1iZXJlZCcsIGkKICAgICAgICAgICAgICAgICBjb250aW51ZQogCiAgICAgICAgICAgICBicCA9IGJkYi5CcmVha3BvaW50LmJwYnludW1iZXJbaV0KQEAgLTQ4Niw4ICs0ODcsOCBAQAogICAgICAgICBpZiBicDoKICAgICAgICAgICAgIGJwLmNvbmQgPSBjb25kCiAgICAgICAgICAgICBpZiBub3QgY29uZDoKLSAgICAgICAgICAgICAgICBwcmludCAnQnJlYWtwb2ludCcsIGJwbnVtLAotICAgICAgICAgICAgICAgIHByaW50ICdpcyBub3cgdW5jb25kaXRpb25hbC4nCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0JyZWFrcG9pbnQnLCBicG51bSwKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnaXMgbm93IHVuY29uZGl0aW9uYWwuJwogCiAgICAgZGVmIGRvX2lnbm9yZShzZWxmLGFyZyk6CiAgICAgICAgICIiImFyZyBpcyBicCBudW1iZXIgZm9sbG93ZWQgYnkgaWdub3JlIGNvdW50LiIiIgpAQCAtNTA2LDEwICs1MDcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSByZXBseSArICclZCBjcm9zc2luZ3MnICUgY291bnQKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByZXBseSA9IHJlcGx5ICsgJzEgY3Jvc3NpbmcnCi0gICAgICAgICAgICAgICAgcHJpbnQgcmVwbHkgKyAnIG9mIGJyZWFrcG9pbnQgJWQuJyAlIGJwbnVtCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgcmVwbHkgKyAnIG9mIGJyZWFrcG9pbnQgJWQuJyAlIGJwbnVtCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICdXaWxsIHN0b3AgbmV4dCB0aW1lIGJyZWFrcG9pbnQnLAotICAgICAgICAgICAgICAgIHByaW50IGJwbnVtLCAnaXMgcmVhY2hlZC4nCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ1dpbGwgc3RvcCBuZXh0IHRpbWUgYnJlYWtwb2ludCcsCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgYnBudW0sICdpcyByZWFjaGVkLicKIAogICAgIGRlZiBkb19jbGVhcihzZWxmLCBhcmcpOgogICAgICAgICAiIiJUaHJlZSBwb3NzaWJpbGl0aWVzLCB0cmllZCBpbiB0aGlzIG9yZGVyOgpAQCAtNTMyLDIyICs1MzMsMjggQEAKICAgICAgICAgICAgIGFyZyA9IGFyZ1tpKzE6XQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGxpbmVubyA9IGludChhcmcpCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICBlcnIgPSAiSW52YWxpZCBsaW5lIG51bWJlciAoJXMpIiAlIGFyZwogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBlcnIgPSBzZWxmLmNsZWFyX2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pCi0gICAgICAgICAgICBpZiBlcnI6IHByaW50ICcqKionLCBlcnIKKyAgICAgICAgICAgIGlmIGVycjogcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKicsIGVycgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIG51bWJlcmxpc3QgPSBhcmcuc3BsaXQoKQogICAgICAgICBmb3IgaSBpbiBudW1iZXJsaXN0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGkgPSBpbnQoaSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdCcmVha3BvaW50IGluZGV4ICVyIGlzIG5vdCBhIG51bWJlcicgJSBpCisgICAgICAgICAgICAgICAgY29udGludWUKKwogICAgICAgICAgICAgaWYgbm90ICgwIDw9IGkgPCBsZW4oYmRiLkJyZWFrcG9pbnQuYnBieW51bWJlcikpOgotICAgICAgICAgICAgICAgIHByaW50ICdObyBicmVha3BvaW50IG51bWJlcmVkJywgaQorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdObyBicmVha3BvaW50IG51bWJlcmVkJywgaQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICBlcnIgPSBzZWxmLmNsZWFyX2JwYnludW1iZXIoaSkKICAgICAgICAgICAgIGlmIGVycjoKLSAgICAgICAgICAgICAgICBwcmludCAnKioqJywgZXJyCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKicsIGVycgogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAnRGVsZXRlZCBicmVha3BvaW50JywgaQorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdEZWxldGVkIGJyZWFrcG9pbnQnLCBpCiAgICAgZG9fY2wgPSBkb19jbGVhciAjICdjJyBpcyBhbHJlYWR5IGFuIGFiYnJldmlhdGlvbiBmb3IgJ2NvbnRpbnVlJwogCiAgICAgZGVmIGRvX3doZXJlKHNlbGYsIGFyZyk6CkBAIC01NTcsNyArNTY0LDcgQEAKIAogICAgIGRlZiBkb191cChzZWxmLCBhcmcpOgogICAgICAgICBpZiBzZWxmLmN1cmluZGV4ID09IDA6Ci0gICAgICAgICAgICBwcmludCAnKioqIE9sZGVzdCBmcmFtZScKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogT2xkZXN0IGZyYW1lJwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5jdXJpbmRleCA9IHNlbGYuY3VyaW5kZXggLSAxCiAgICAgICAgICAgICBzZWxmLmN1cmZyYW1lID0gc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XVswXQpAQCAtNTY3LDcgKzU3NCw3IEBACiAKICAgICBkZWYgZG9fZG93bihzZWxmLCBhcmcpOgogICAgICAgICBpZiBzZWxmLmN1cmluZGV4ICsgMSA9PSBsZW4oc2VsZi5zdGFjayk6Ci0gICAgICAgICAgICBwcmludCAnKioqIE5ld2VzdCBmcmFtZScKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogTmV3ZXN0IGZyYW1lJwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5jdXJpbmRleCA9IHNlbGYuY3VyaW5kZXggKyAxCiAgICAgICAgICAgICBzZWxmLmN1cmZyYW1lID0gc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XVswXQpAQCAtNTk3LDEyICs2MDQsMTIgQEAKIAogICAgIGRlZiBkb19qdW1wKHNlbGYsIGFyZyk6CiAgICAgICAgIGlmIHNlbGYuY3VyaW5kZXggKyAxICE9IGxlbihzZWxmLnN0YWNrKToKLSAgICAgICAgICAgIHByaW50ICIqKiogWW91IGNhbiBvbmx5IGp1bXAgd2l0aGluIHRoZSBib3R0b20gZnJhbWUiCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiKioqIFlvdSBjYW4gb25seSBqdW1wIHdpdGhpbiB0aGUgYm90dG9tIGZyYW1lIgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGFyZyA9IGludChhcmcpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcHJpbnQgIioqKiBUaGUgJ2p1bXAnIGNvbW1hbmQgcmVxdWlyZXMgYSBsaW5lIG51bWJlci4iCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiKioqIFRoZSAnanVtcCcgY29tbWFuZCByZXF1aXJlcyBhIGxpbmUgbnVtYmVyLiIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAjIERvIHRoZSBqdW1wLCBmaXggdXAgb3VyIGNvcHkgb2YgdGhlIHN0YWNrLCBhbmQgZGlzcGxheSB0aGUKQEAgLTYxMSw3ICs2MTgsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0gPSBzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXhdWzBdLCBhcmcKICAgICAgICAgICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKLSAgICAgICAgICAgICAgICBwcmludCAnKioqIEp1bXAgZmFpbGVkOicsIGUKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIEp1bXAgZmFpbGVkOicsIGUKICAgICBkb19qID0gZG9fanVtcAogCiAgICAgZGVmIGRvX2RlYnVnKHNlbGYsIGFyZyk6CkBAIC02MjAsOSArNjI3LDkgQEAKICAgICAgICAgbG9jYWxzID0gc2VsZi5jdXJmcmFtZS5mX2xvY2FscwogICAgICAgICBwID0gUGRiKCkKICAgICAgICAgcC5wcm9tcHQgPSAiKCVzKSAiICUgc2VsZi5wcm9tcHQuc3RyaXAoKQotICAgICAgICBwcmludCAiRU5URVJJTkcgUkVDVVJTSVZFIERFQlVHR0VSIgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiRU5URVJJTkcgUkVDVVJTSVZFIERFQlVHR0VSIgogICAgICAgICBzeXMuY2FsbF90cmFjaW5nKHAucnVuLCAoYXJnLCBnbG9iYWxzLCBsb2NhbHMpKQotICAgICAgICBwcmludCAiTEVBVklORyBSRUNVUlNJVkUgREVCVUdHRVIiCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICJMRUFWSU5HIFJFQ1VSU0lWRSBERUJVR0dFUiIKICAgICAgICAgc3lzLnNldHRyYWNlKHNlbGYudHJhY2VfZGlzcGF0Y2gpCiAgICAgICAgIHNlbGYubGFzdGNtZCA9IHAubGFzdGNtZAogCkBAIC02MzUsNyArNjQyLDcgQEAKICAgICBkb19leGl0ID0gZG9fcXVpdAogCiAgICAgZGVmIGRvX0VPRihzZWxmLCBhcmcpOgotICAgICAgICBwcmludAorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0CiAgICAgICAgIHNlbGYuX3VzZXJfcmVxdWVzdGVkX3F1aXQgPSAxCiAgICAgICAgIHNlbGYuc2V0X3F1aXQoKQogICAgICAgICByZXR1cm4gMQpAQCAtNjQ5LDE2ICs2NTYsMTYgQEAKICAgICAgICAgaWYgY28uY29fZmxhZ3MgJiA4OiBuID0gbisxCiAgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICAgbmFtZSA9IGNvLmNvX3Zhcm5hbWVzW2ldCi0gICAgICAgICAgICBwcmludCBuYW1lLCAnPScsCi0gICAgICAgICAgICBpZiBuYW1lIGluIGRpY3Q6IHByaW50IGRpY3RbbmFtZV0KLSAgICAgICAgICAgIGVsc2U6IHByaW50ICIqKiogdW5kZWZpbmVkICoqKiIKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIG5hbWUsICc9JywKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZGljdDogcHJpbnQgPj5zZWxmLnN0ZG91dCwgZGljdFtuYW1lXQorICAgICAgICAgICAgZWxzZTogcHJpbnQgPj5zZWxmLnN0ZG91dCwgIioqKiB1bmRlZmluZWQgKioqIgogICAgIGRvX2EgPSBkb19hcmdzCiAKICAgICBkZWYgZG9fcmV0dmFsKHNlbGYsIGFyZyk6CiAgICAgICAgIGlmICdfX3JldHVybl9fJyBpbiBzZWxmLmN1cmZyYW1lLmZfbG9jYWxzOgotICAgICAgICAgICAgcHJpbnQgc2VsZi5jdXJmcmFtZS5mX2xvY2Fsc1snX19yZXR1cm5fXyddCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCBzZWxmLmN1cmZyYW1lLmZfbG9jYWxzWydfX3JldHVybl9fJ10KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICcqKiogTm90IHlldCByZXR1cm5lZCEnCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIE5vdCB5ZXQgcmV0dXJuZWQhJwogICAgIGRvX3J2ID0gZG9fcmV0dmFsCiAKICAgICBkZWYgX2dldHZhbChzZWxmLCBhcmcpOgpAQCAtNjcwLDE4ICs2NzcsMTggQEAKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCwgc3RyKToKICAgICAgICAgICAgICAgICBleGNfdHlwZV9uYW1lID0gdAogICAgICAgICAgICAgZWxzZTogZXhjX3R5cGVfbmFtZSA9IHQuX19uYW1lX18KLSAgICAgICAgICAgIHByaW50ICcqKionLCBleGNfdHlwZV9uYW1lICsgJzonLCByZXByKHYpCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqJywgZXhjX3R5cGVfbmFtZSArICc6JywgcmVwcih2KQogICAgICAgICAgICAgcmFpc2UKIAogICAgIGRlZiBkb19wKHNlbGYsIGFyZyk6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHByaW50IHJlcHIoc2VsZi5fZ2V0dmFsKGFyZykpCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCByZXByKHNlbGYuX2dldHZhbChhcmcpKQogICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgZG9fcHAoc2VsZiwgYXJnKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgcHByaW50LnBwcmludChzZWxmLl9nZXR2YWwoYXJnKSkKKyAgICAgICAgICAgIHBwcmludC5wcHJpbnQoc2VsZi5fZ2V0dmFsKGFyZyksIHNlbGYuc3Rkb3V0KQogICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICBwYXNzCiAKQEAgLTcwMSw3ICs3MDgsNyBAQAogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gbWF4KDEsIGludCh4KSAtIDUpCiAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyoqKiBFcnJvciBpbiBhcmd1bWVudDonLCByZXByKGFyZykKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIEVycm9yIGluIGFyZ3VtZW50OicsIHJlcHIoYXJnKQogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBlbGlmIHNlbGYubGluZW5vIGlzIE5vbmU6CiAgICAgICAgICAgICBmaXJzdCA9IG1heCgxLCBzZWxmLmN1cmZyYW1lLmZfbGluZW5vIC0gNSkKQEAgLTcxNSw3ICs3MjIsNyBAQAogICAgICAgICAgICAgZm9yIGxpbmVubyBpbiByYW5nZShmaXJzdCwgbGFzdCsxKToKICAgICAgICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKICAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1tFT0ZdJworICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnW0VPRl0nCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgcyA9IHJlcHIobGluZW5vKS5yanVzdCgzKQpAQCAtNzI0LDcgKzczMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVsc2U6IHMgPSBzICsgJyAnCiAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVubyA9PSBzZWxmLmN1cmZyYW1lLmZfbGluZW5vOgogICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMgKyAnLT4nCi0gICAgICAgICAgICAgICAgICAgIHByaW50IHMgKyAnXHQnICsgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgcyArICdcdCcgKyBsaW5lLAogICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubwogICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgICAgICBwYXNzCkBAIC03MzksMjMgKzc0NiwyMyBAQAogICAgICAgICAgICAgaWYgdHlwZSh0KSA9PSB0eXBlKCcnKToKICAgICAgICAgICAgICAgICBleGNfdHlwZV9uYW1lID0gdAogICAgICAgICAgICAgZWxzZTogZXhjX3R5cGVfbmFtZSA9IHQuX19uYW1lX18KLSAgICAgICAgICAgIHByaW50ICcqKionLCBleGNfdHlwZV9uYW1lICsgJzonLCByZXByKHYpCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqJywgZXhjX3R5cGVfbmFtZSArICc6JywgcmVwcih2KQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGNvZGUgPSBOb25lCiAgICAgICAgICMgSXMgaXQgYSBmdW5jdGlvbj8KICAgICAgICAgdHJ5OiBjb2RlID0gdmFsdWUuZnVuY19jb2RlCiAgICAgICAgIGV4Y2VwdDogcGFzcwogICAgICAgICBpZiBjb2RlOgotICAgICAgICAgICAgcHJpbnQgJ0Z1bmN0aW9uJywgY29kZS5jb19uYW1lCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnRnVuY3Rpb24nLCBjb2RlLmNvX25hbWUKICAgICAgICAgICAgIHJldHVybgogICAgICAgICAjIElzIGl0IGFuIGluc3RhbmNlIG1ldGhvZD8KICAgICAgICAgdHJ5OiBjb2RlID0gdmFsdWUuaW1fZnVuYy5mdW5jX2NvZGUKICAgICAgICAgZXhjZXB0OiBwYXNzCiAgICAgICAgIGlmIGNvZGU6Ci0gICAgICAgICAgICBwcmludCAnTWV0aG9kJywgY29kZS5jb19uYW1lCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnTWV0aG9kJywgY29kZS5jb19uYW1lCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgIyBOb25lIG9mIHRoZSBhYm92ZS4uLgotICAgICAgICBwcmludCB0eXBlKHZhbHVlKQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCB0eXBlKHZhbHVlKQogCiAgICAgZGVmIGRvX2FsaWFzKHNlbGYsIGFyZyk6CiAgICAgICAgIGFyZ3MgPSBhcmcuc3BsaXQoKQpAQCAtNzYzLDEwICs3NzAsMTAgQEAKICAgICAgICAgICAgIGtleXMgPSBzZWxmLmFsaWFzZXMua2V5cygpCiAgICAgICAgICAgICBrZXlzLnNvcnQoKQogICAgICAgICAgICAgZm9yIGFsaWFzIGluIGtleXM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIiVzID0gJXMiICUgKGFsaWFzLCBzZWxmLmFsaWFzZXNbYWxpYXNdKQorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIlcyA9ICVzIiAlIChhbGlhcywgc2VsZi5hbGlhc2VzW2FsaWFzXSkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBhcmdzWzBdIGluIHNlbGYuYWxpYXNlcyBhbmQgbGVuKGFyZ3MpID09IDE6Ci0gICAgICAgICAgICBwcmludCAiJXMgPSAlcyIgJSAoYXJnc1swXSwgc2VsZi5hbGlhc2VzW2FyZ3NbMF1dKQorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiVzID0gJXMiICUgKGFyZ3NbMF0sIHNlbGYuYWxpYXNlc1thcmdzWzBdXSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYWxpYXNlc1thcmdzWzBdXSA9ICcgJy5qb2luKGFyZ3NbMTpdKQogCkBAIC03NzcsNyArNzg0LDggQEAKICAgICAgICAgICAgIGRlbCBzZWxmLmFsaWFzZXNbYXJnc1swXV0KIAogICAgICNsaXN0IG9mIGFsbCB0aGUgY29tbWFuZHMgbWFraW5nIHRoZSBwcm9ncmFtIHJlc3VtZSBleGVjdXRpb24uCi0gICAgY29tbWFuZHNfcmVzdW1pbmcgPSBbJ2RvX2NvbnRpbnVlJywgJ2RvX3N0ZXAnLCAnZG9fbmV4dCcsICdkb19yZXR1cm4nLCAnZG9fcXVpdCcsICdkb19qdW1wJ10KKyAgICBjb21tYW5kc19yZXN1bWluZyA9IFsnZG9fY29udGludWUnLCAnZG9fc3RlcCcsICdkb19uZXh0JywgJ2RvX3JldHVybicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvX3F1aXQnLCAnZG9fanVtcCddCiAKICAgICAjIFByaW50IGEgdHJhY2ViYWNrIHN0YXJ0aW5nIGF0IHRoZSB0b3Agc3RhY2sgZnJhbWUuCiAgICAgIyBUaGUgbW9zdCByZWNlbnRseSBlbnRlcmVkIGZyYW1lIGlzIHByaW50ZWQgbGFzdDsKQEAgLTc5NywxMCArODA1LDExIEBACiAgICAgZGVmIHByaW50X3N0YWNrX2VudHJ5KHNlbGYsIGZyYW1lX2xpbmVubywgcHJvbXB0X3ByZWZpeD1saW5lX3ByZWZpeCk6CiAgICAgICAgIGZyYW1lLCBsaW5lbm8gPSBmcmFtZV9saW5lbm8KICAgICAgICAgaWYgZnJhbWUgaXMgc2VsZi5jdXJmcmFtZToKLSAgICAgICAgICAgIHByaW50ICc+JywKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICc+JywKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICcgJywKLSAgICAgICAgcHJpbnQgc2VsZi5mb3JtYXRfc3RhY2tfZW50cnkoZnJhbWVfbGluZW5vLCBwcm9tcHRfcHJlZml4KQorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyAnLAorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCBzZWxmLmZvcm1hdF9zdGFja19lbnRyeShmcmFtZV9saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdF9wcmVmaXgpCiAKIAogICAgICMgSGVscCBtZXRob2RzIChkZXJpdmVkIGZyb20gcGRiLmRvYykKQEAgLTgwOSw3ICs4MTgsNyBAQAogICAgICAgICBzZWxmLmhlbHBfaCgpCiAKICAgICBkZWYgaGVscF9oKHNlbGYpOgotICAgICAgICBwcmludCAiIiJoKGVscCkKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiaChlbHApCiBXaXRob3V0IGFyZ3VtZW50LCBwcmludCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuCiBXaXRoIGEgY29tbWFuZCBuYW1lIGFzIGFyZ3VtZW50LCBwcmludCBoZWxwIGFib3V0IHRoYXQgY29tbWFuZAogImhlbHAgcGRiIiBwaXBlcyB0aGUgZnVsbCBkb2N1bWVudGF0aW9uIGZpbGUgdG8gdGhlICRQQUdFUgpAQCAtODE5LDcgKzgyOCw3IEBACiAgICAgICAgIHNlbGYuaGVscF93KCkKIAogICAgIGRlZiBoZWxwX3coc2VsZik6Ci0gICAgICAgIHByaW50ICIiIncoaGVyZSkKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIidyhoZXJlKQogUHJpbnQgYSBzdGFjayB0cmFjZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgZnJhbWUgYXQgdGhlIGJvdHRvbS4KIEFuIGFycm93IGluZGljYXRlcyB0aGUgImN1cnJlbnQgZnJhbWUiLCB3aGljaCBkZXRlcm1pbmVzIHRoZQogY29udGV4dCBvZiBtb3N0IGNvbW1hbmRzLiAgJ2J0JyBpcyBhbiBhbGlhcyBmb3IgdGhpcyBjb21tYW5kLiIiIgpAQCAtODMwLDcgKzgzOSw3IEBACiAgICAgICAgIHNlbGYuaGVscF9kKCkKIAogICAgIGRlZiBoZWxwX2Qoc2VsZik6Ci0gICAgICAgIHByaW50ICIiImQob3duKQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJkKG93bikKIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgb25lIGxldmVsIGRvd24gaW4gdGhlIHN0YWNrIHRyYWNlCiAodG8gYSBuZXdlciBmcmFtZSkuIiIiCiAKQEAgLTgzOCw3ICs4NDcsNyBAQAogICAgICAgICBzZWxmLmhlbHBfdSgpCiAKICAgICBkZWYgaGVscF91KHNlbGYpOgotICAgICAgICBwcmludCAiIiJ1KHApCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInUocCkKIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgb25lIGxldmVsIHVwIGluIHRoZSBzdGFjayB0cmFjZQogKHRvIGFuIG9sZGVyIGZyYW1lKS4iIiIKIApAQCAtODQ2LDcgKzg1NSw3IEBACiAgICAgICAgIHNlbGYuaGVscF9iKCkKIAogICAgIGRlZiBoZWxwX2Ioc2VsZik6Ci0gICAgICAgIHByaW50ICIiImIocmVhaykgKFtmaWxlOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJiKHJlYWspIChbZmlsZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl0KIFdpdGggYSBsaW5lIG51bWJlciBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUgaW4gdGhlIGN1cnJlbnQKIGZpbGUuICBXaXRoIGEgZnVuY3Rpb24gbmFtZSwgc2V0IGEgYnJlYWsgYXQgZmlyc3QgZXhlY3V0YWJsZSBsaW5lCiBvZiB0aGF0IGZ1bmN0aW9uLiAgV2l0aG91dCBhcmd1bWVudCwgbGlzdCBhbGwgYnJlYWtzLiAgSWYgYSBzZWNvbmQKQEAgLTg2Miw4ICs4NzEsOCBAQAogICAgICAgICBzZWxmLmhlbHBfY2woKQogCiAgICAgZGVmIGhlbHBfY2woc2VsZik6Ci0gICAgICAgIHByaW50ICJjbChlYXIpIGZpbGVuYW1lOmxpbmVubyIKLSAgICAgICAgcHJpbnQgIiIiY2woZWFyKSBbYnBudW1iZXIgW2JwbnVtYmVyLi4uXV0KKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgImNsKGVhcikgZmlsZW5hbWU6bGluZW5vIgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJjbChlYXIpIFticG51bWJlciBbYnBudW1iZXIuLi5dXQogV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgY2xlYXIKIHRob3NlIGJyZWFrcG9pbnRzLiAgV2l0aG91dCBhcmd1bWVudCwgY2xlYXIgYWxsIGJyZWFrcyAoYnV0CiBmaXJzdCBhc2sgY29uZmlybWF0aW9uKS4gIFdpdGggYSBmaWxlbmFtZTpsaW5lbm8gYXJndW1lbnQsCkBAIC04NzUsMjEgKzg4NCwyMSBAQAogYnJlYWtwb2ludCBudW1iZXJzLiIiIgogCiAgICAgZGVmIGhlbHBfdGJyZWFrKHNlbGYpOgotICAgICAgICBwcmludCAiIiJ0YnJlYWsgIHNhbWUgYXJndW1lbnRzIGFzIGJyZWFrLCBidXQgYnJlYWtwb2ludCBpcworICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJ0YnJlYWsgIHNhbWUgYXJndW1lbnRzIGFzIGJyZWFrLCBidXQgYnJlYWtwb2ludCBpcwogcmVtb3ZlZCB3aGVuIGZpcnN0IGhpdC4iIiIKIAogICAgIGRlZiBoZWxwX2VuYWJsZShzZWxmKToKLSAgICAgICAgcHJpbnQgIiIiZW5hYmxlIGJwbnVtYmVyIFticG51bWJlciAuLi5dCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImVuYWJsZSBicG51bWJlciBbYnBudW1iZXIgLi4uXQogRW5hYmxlcyB0aGUgYnJlYWtwb2ludHMgZ2l2ZW4gYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZgogYnAgbnVtYmVycy4iIiIKIAogICAgIGRlZiBoZWxwX2Rpc2FibGUoc2VsZik6Ci0gICAgICAgIHByaW50ICIiImRpc2FibGUgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl0KKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiZGlzYWJsZSBicG51bWJlciBbYnBudW1iZXIgLi4uXQogRGlzYWJsZXMgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YKIGJwIG51bWJlcnMuIiIiCiAKICAgICBkZWYgaGVscF9pZ25vcmUoc2VsZik6Ci0gICAgICAgIHByaW50ICIiImlnbm9yZSBicG51bWJlciBjb3VudAorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJpZ25vcmUgYnBudW1iZXIgY291bnQKIFNldHMgdGhlIGlnbm9yZSBjb3VudCBmb3IgdGhlIGdpdmVuIGJyZWFrcG9pbnQgbnVtYmVyLiAgQSBicmVha3BvaW50CiBiZWNvbWVzIGFjdGl2ZSB3aGVuIHRoZSBpZ25vcmUgY291bnQgaXMgemVyby4gIFdoZW4gbm9uLXplcm8sIHRoZQogY291bnQgaXMgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQgYW5kIHRoZQpAQCAtODk3LDcgKzkwNiw3IEBACiB0byB0cnVlLiIiIgogCiAgICAgZGVmIGhlbHBfY29uZGl0aW9uKHNlbGYpOgotICAgICAgICBwcmludCAiIiJjb25kaXRpb24gYnBudW1iZXIgc3RyX2NvbmRpdGlvbgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJjb25kaXRpb24gYnBudW1iZXIgc3RyX2NvbmRpdGlvbgogc3RyX2NvbmRpdGlvbiBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIGFuIGV4cHJlc3Npb24gd2hpY2gKIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4KIElmIHN0cl9jb25kaXRpb24gaXMgYWJzZW50LCBhbnkgZXhpc3RpbmcgY29uZGl0aW9uIGlzIHJlbW92ZWQ7CkBAIC05MDcsNyArOTE2LDcgQEAKICAgICAgICAgc2VsZi5oZWxwX3MoKQogCiAgICAgZGVmIGhlbHBfcyhzZWxmKToKLSAgICAgICAgcHJpbnQgIiIicyh0ZXApCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInModGVwKQogRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvbgogKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uKS4iIiIKIApAQCAtOTE1LDcgKzkyNCw3IEBACiAgICAgICAgIHNlbGYuaGVscF9uKCkKIAogICAgIGRlZiBoZWxwX24oc2VsZik6Ci0gICAgICAgIHByaW50ICIiIm4oZXh0KQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJuKGV4dCkKIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uCiBpcyByZWFjaGVkIG9yIGl0IHJldHVybnMuIiIiCiAKQEAgLTkyMyw3ICs5MzIsNyBAQAogICAgICAgICBzZWxmLmhlbHBfcigpCiAKICAgICBkZWYgaGVscF9yKHNlbGYpOgotICAgICAgICBwcmludCAiIiJyKGV0dXJuKQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJyKGV0dXJuKQogQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHJldHVybnMuIiIiCiAKICAgICBkZWYgaGVscF9jb250aW51ZShzZWxmKToKQEAgLTkzMywxOCArOTQyLDE4IEBACiAgICAgICAgIHNlbGYuaGVscF9jKCkKIAogICAgIGRlZiBoZWxwX2Moc2VsZik6Ci0gICAgICAgIHByaW50ICIiImMob250KGludWUpKQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJjKG9udChpbnVlKSkKIENvbnRpbnVlIGV4ZWN1dGlvbiwgb25seSBzdG9wIHdoZW4gYSBicmVha3BvaW50IGlzIGVuY291bnRlcmVkLiIiIgogCiAgICAgZGVmIGhlbHBfanVtcChzZWxmKToKICAgICAgICAgc2VsZi5oZWxwX2ooKQogCiAgICAgZGVmIGhlbHBfaihzZWxmKToKLSAgICAgICAgcHJpbnQgIiIiaih1bXApIGxpbmVubworICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJqKHVtcCkgbGluZW5vCiBTZXQgdGhlIG5leHQgbGluZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuIiIiCiAKICAgICBkZWYgaGVscF9kZWJ1ZyhzZWxmKToKLSAgICAgICAgcHJpbnQgIiIiZGVidWcgY29kZQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJkZWJ1ZyBjb2RlCiBFbnRlciBhIHJlY3Vyc2l2ZSBkZWJ1Z2dlciB0aGF0IHN0ZXBzIHRocm91Z2ggdGhlIGNvZGUgYXJndW1lbnQKICh3aGljaCBpcyBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQKIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50KS4iIiIKQEAgLTk1Myw3ICs5NjIsNyBAQAogICAgICAgICBzZWxmLmhlbHBfbCgpCiAKICAgICBkZWYgaGVscF9sKHNlbGYpOgotICAgICAgICBwcmludCAiIiJsKGlzdCkgW2ZpcnN0IFssbGFzdF1dCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImwoaXN0KSBbZmlyc3QgWyxsYXN0XV0KIExpc3Qgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZpbGUuCiBXaXRob3V0IGFyZ3VtZW50cywgbGlzdCAxMSBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZQogb3IgY29udGludWUgdGhlIHByZXZpb3VzIGxpc3RpbmcuCkBAIC05NjUsMTkgKzk3NCwxOSBAQAogICAgICAgICBzZWxmLmhlbHBfYSgpCiAKICAgICBkZWYgaGVscF9hKHNlbGYpOgotICAgICAgICBwcmludCAiIiJhKHJncykKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiYShyZ3MpCiBQcmludCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiIiIgogCiAgICAgZGVmIGhlbHBfcChzZWxmKToKLSAgICAgICAgcHJpbnQgIiIicCBleHByZXNzaW9uCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInAgZXhwcmVzc2lvbgogUHJpbnQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiIiIgogCiAgICAgZGVmIGhlbHBfcHAoc2VsZik6Ci0gICAgICAgIHByaW50ICIiInBwIGV4cHJlc3Npb24KKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIicHAgZXhwcmVzc2lvbgogUHJldHR5LXByaW50IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4iIiIKIAogICAgIGRlZiBoZWxwX2V4ZWMoc2VsZik6Ci0gICAgICAgIHByaW50ICIiIighKSBzdGF0ZW1lbnQKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiKCEpIHN0YXRlbWVudAogRXhlY3V0ZSB0aGUgKG9uZS1saW5lKSBzdGF0ZW1lbnQgaW4gdGhlIGNvbnRleHQgb2YKIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLgogVGhlIGV4Y2xhbWF0aW9uIHBvaW50IGNhbiBiZSBvbWl0dGVkIHVubGVzcyB0aGUgZmlyc3Qgd29yZApAQCAtOTkxLDIxICsxMDAwLDIxIEBACiAgICAgICAgIHNlbGYuaGVscF9xKCkKIAogICAgIGRlZiBoZWxwX3Eoc2VsZik6Ci0gICAgICAgIHByaW50ICIiInEodWl0KSBvciBleGl0IC0gUXVpdCBmcm9tIHRoZSBkZWJ1Z2dlci4KKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIicSh1aXQpIG9yIGV4aXQgLSBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLgogVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgYWJvcnRlZC4iIiIKIAogICAgIGhlbHBfZXhpdCA9IGhlbHBfcQogCiAgICAgZGVmIGhlbHBfd2hhdGlzKHNlbGYpOgotICAgICAgICBwcmludCAiIiJ3aGF0aXMgYXJnCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiIndoYXRpcyBhcmcKIFByaW50cyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQuIiIiCiAKICAgICBkZWYgaGVscF9FT0Yoc2VsZik6Ci0gICAgICAgIHByaW50ICIiIkVPRgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJFT0YKIEhhbmRsZXMgdGhlIHJlY2VpcHQgb2YgRU9GIGFzIGEgY29tbWFuZC4iIiIKIAogICAgIGRlZiBoZWxwX2FsaWFzKHNlbGYpOgotICAgICAgICBwcmludCAiIiJhbGlhcyBbbmFtZSBbY29tbWFuZCBbcGFyYW1ldGVyIHBhcmFtZXRlciAuLi5dIF1dCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImFsaWFzIFtuYW1lIFtjb21tYW5kIFtwYXJhbWV0ZXIgcGFyYW1ldGVyIC4uLl0gXV0KIENyZWF0ZXMgYW4gYWxpYXMgY2FsbGVkICduYW1lJyB0aGUgZXhlY3V0ZXMgJ2NvbW1hbmQnLiAgVGhlIGNvbW1hbmQKIG11c3QgKm5vdCogYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgUmVwbGFjZWFibGUgcGFyYW1ldGVycyBhcmUKIGluZGljYXRlZCBieSAlMSwgJTIsIGFuZCBzbyBvbiwgd2hpbGUgJSogaXMgcmVwbGFjZWQgYnkgYWxsIHRoZQpAQCAtMTAyOSwxMSArMTAzOCwxMSBAQAogIiIiCiAKICAgICBkZWYgaGVscF91bmFsaWFzKHNlbGYpOgotICAgICAgICBwcmludCAiIiJ1bmFsaWFzIG5hbWUKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIidW5hbGlhcyBuYW1lCiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgYWxpYXMuIiIiCiAKICAgICBkZWYgaGVscF9jb21tYW5kcyhzZWxmKToKLSAgICAgICAgcHJpbnQgIiIiY29tbWFuZHMgW2JwbnVtYmVyXQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJjb21tYW5kcyBbYnBudW1iZXJdCiAoY29tKSAuLi4KIChjb20pIGVuZAogKFBkYikKZGlmZiAtLWdpdCBhL0xpYi9wa2dfcmVzb3VyY2VzLnB5IGIvTGliL3BrZ19yZXNvdXJjZXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNmNjOTAuLjAwMDAwMDAKLS0tIGEvTGliL3BrZ19yZXNvdXJjZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMzc3ICswLDAgQEAKLSIiIlBhY2thZ2UgcmVzb3VyY2UgQVBJCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BIHJlc291cmNlIGlzIGEgbG9naWNhbCBmaWxlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlLCBvciBhIGxvZ2ljYWwKLXN1YmRpcmVjdG9yeSB0aGVyZW9mLiAgVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGV4cGVjdHMgcmVzb3VyY2UgbmFtZXMKLXRvIGhhdmUgdGhlaXIgcGF0aCBwYXJ0cyBzZXBhcmF0ZWQgd2l0aCBgYC9gYCwgKm5vdCogd2hhdGV2ZXIgdGhlIGxvY2FsCi1wYXRoIHNlcGFyYXRvciBpcy4gIERvIG5vdCB1c2Ugb3MucGF0aCBvcGVyYXRpb25zIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2UKLW5hbWVzIGJlaW5nIHBhc3NlZCBpbnRvIHRoZSBBUEkuCi0KLVRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9ybWFsIGZpbGVzeXN0ZW0gcGFja2FnZXMsCi0uZWdnIGZpbGVzLCBhbmQgdW5wYWNrZWQgLmVnZyBmaWxlcy4gIEl0IGNhbiBhbHNvIHdvcmsgaW4gYSBsaW1pdGVkIHdheSB3aXRoCi0uemlwIGZpbGVzIGFuZCB3aXRoIGN1c3RvbSBQRVAgMzAyIGxvYWRlcnMgdGhhdCBzdXBwb3J0IHRoZSBgYGdldF9kYXRhKClgYAotbWV0aG9kLgotIiIiCi0KLWltcG9ydCBzeXMsIG9zLCB6aXBpbXBvcnQsIHRpbWUsIHJlLCBpbXAsIG5ldywgcGtndXRpbCAgIyBYWFgKLWZyb20gc2V0cyBpbXBvcnQgSW1tdXRhYmxlU2V0Ci1mcm9tIG9zIGltcG9ydCB1dGltZSwgcmVuYW1lLCB1bmxpbmsgICAgIyBjYXB0dXJlIHRoZXNlIHRvIGJ5cGFzcyBzYW5kYm94aW5nCi1mcm9tIG9zIGltcG9ydCBvcGVuIGFzIG9zX29wZW4KLQotZGVmIGdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKToKLSAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIG1heGltdW0gY29tcGF0aWJsZSB2ZXJzaW9uLgotCi0gICAgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgbm9ybWFsbHkgcmVwb3J0cyB0aGUgbWluaW11bSB2ZXJzaW9uCi0gICAgb2YgTWFjIE9TIFggdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byAqdXNlKiBleHRlbnNpb25zIHByb2R1Y2VkIGJ5Ci0gICAgZGlzdHV0aWxzLiAgQnV0IHdoYXQgd2Ugd2FudCB3aGVuIGNoZWNraW5nIGNvbXBhdGliaWxpdHkgaXMgdG8ga25vdyB0aGUKLSAgICB2ZXJzaW9uIG9mIE1hYyBPUyBYIHRoYXQgd2UgYXJlICpydW5uaW5nKi4gIFRvIGFsbG93IHVzYWdlIG9mIHBhY2thZ2VzIHRoYXQKLSAgICBleHBsaWNpdGx5IHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIE1hYyBPUyBYLCB3ZSBtdXN0IGFsc28ga25vdyB0aGUKLSAgICBjdXJyZW50IHZlcnNpb24gb2YgdGhlIE9TLgotCi0gICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24gaW4gaXRzCi0gICAgcGxhdGZvcm0gc3RyaW5ncywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXh0ZW5kZWQgYWNjb3JkaW5nbHkuCi0gICAgIiIiCi0gICAgcGxhdCA9IGdldF9idWlsZF9wbGF0Zm9ybSgpOyBtID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHBsYXQpCi0gICAgaWYgbSBpcyBub3QgTm9uZSBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwbGF0ID0gJ21hY29zeC0lcy0lcycgJSAoJy4nLmpvaW4oX21hY29zeF92ZXJzKClbOjJdKSwgbS5ncm91cCgzKSkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzICAgICMgbm90IE1hYyBPUyBYCi0gICAgcmV0dXJuIHBsYXQKLQotX19hbGxfXyA9IFsKLSAgICAjIEJhc2ljIHJlc291cmNlIGFjY2VzcyBhbmQgZGlzdHJpYnV0aW9uL2VudHJ5IHBvaW50IGRpc2NvdmVyeQotICAgICdyZXF1aXJlJywgJ3J1bl9zY3JpcHQnLCAnZ2V0X3Byb3ZpZGVyJywgICdnZXRfZGlzdHJpYnV0aW9uJywKLSAgICAnbG9hZF9lbnRyeV9wb2ludCcsICdnZXRfZW50cnlfbWFwJywgJ2dldF9lbnRyeV9pbmZvJywgJ2l0ZXJfZW50cnlfcG9pbnRzJywKLSAgICAncmVzb3VyY2Vfc3RyaW5nJywgJ3Jlc291cmNlX3N0cmVhbScsICdyZXNvdXJjZV9maWxlbmFtZScsCi0gICAgJ3Jlc291cmNlX2xpc3RkaXInLCAncmVzb3VyY2VfZXhpc3RzJywgJ3Jlc291cmNlX2lzZGlyJywKLQotICAgICMgRW52aXJvbm1lbnRhbCBjb250cm9sCi0gICAgJ2RlY2xhcmVfbmFtZXNwYWNlJywgJ3dvcmtpbmdfc2V0JywgJ2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyJywKLSAgICAnZmluZF9kaXN0cmlidXRpb25zJywgJ3NldF9leHRyYWN0aW9uX3BhdGgnLCAnY2xlYW51cF9yZXNvdXJjZXMnLAotICAgICdnZXRfZGVmYXVsdF9jYWNoZScsCi0KLSAgICAjIFByaW1hcnkgaW1wbGVtZW50YXRpb24gY2xhc3NlcwotICAgICdFbnZpcm9ubWVudCcsICdXb3JraW5nU2V0JywgJ1Jlc291cmNlTWFuYWdlcicsCi0gICAgJ0Rpc3RyaWJ1dGlvbicsICdSZXF1aXJlbWVudCcsICdFbnRyeVBvaW50JywKLQotICAgICMgRXhjZXB0aW9ucwotICAgICdSZXNvbHV0aW9uRXJyb3InLCdWZXJzaW9uQ29uZmxpY3QnLCdEaXN0cmlidXRpb25Ob3RGb3VuZCcsJ1Vua25vd25FeHRyYScsCi0gICAgJ0V4dHJhY3Rpb25FcnJvcicsCi0KLSAgICAjIFBhcnNpbmcgZnVuY3Rpb25zIGFuZCBzdHJpbmcgdXRpbGl0aWVzCi0gICAgJ3BhcnNlX3JlcXVpcmVtZW50cycsICdwYXJzZV92ZXJzaW9uJywgJ3NhZmVfbmFtZScsICdzYWZlX3ZlcnNpb24nLAotICAgICdnZXRfcGxhdGZvcm0nLCAnY29tcGF0aWJsZV9wbGF0Zm9ybXMnLCAneWllbGRfbGluZXMnLCAnc3BsaXRfc2VjdGlvbnMnLAotICAgICdzYWZlX2V4dHJhJywgJ3RvX2ZpbGVuYW1lJywKLQotICAgICMgZmlsZXN5c3RlbSB1dGlsaXRpZXMKLSAgICAnZW5zdXJlX2RpcmVjdG9yeScsICdub3JtYWxpemVfcGF0aCcsCi0KLSAgICAjIERpc3RyaWJ1dGlvbiAicHJlY2VkZW5jZSIgY29uc3RhbnRzCi0gICAgJ0VHR19ESVNUJywgJ0JJTkFSWV9ESVNUJywgJ1NPVVJDRV9ESVNUJywgJ0NIRUNLT1VUX0RJU1QnLCAnREVWRUxPUF9ESVNUJywKLQotICAgICMgIlByb3ZpZGVyIiBpbnRlcmZhY2VzLCBpbXBsZW1lbnRhdGlvbnMsIGFuZCByZWdpc3RyYXRpb24vbG9va3VwIEFQSXMKLSAgICAnSU1ldGFkYXRhUHJvdmlkZXInLCAnSVJlc291cmNlUHJvdmlkZXInLCAnRmlsZU1ldGFkYXRhJywKLSAgICAnUGF0aE1ldGFkYXRhJywgJ0VnZ01ldGFkYXRhJywgJ0VtcHR5UHJvdmlkZXInLCAnZW1wdHlfcHJvdmlkZXInLAotICAgICdOdWxsUHJvdmlkZXInLCAnRWdnUHJvdmlkZXInLCAnRGVmYXVsdFByb3ZpZGVyJywgJ1ppcFByb3ZpZGVyJywKLSAgICAncmVnaXN0ZXJfZmluZGVyJywgJ3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyJywgJ3JlZ2lzdGVyX2xvYWRlcl90eXBlJywKLSAgICAnZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzJywgJ2dldF9pbXBvcnRlcicsCi0KLSAgICAjIERlcHJlY2F0ZWQvYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5Ci0gICAgJ3J1bl9tYWluJywgJ0F2YWlsYWJsZURpc3RyaWJ1dGlvbnMnLAotXQotY2xhc3MgUmVzb2x1dGlvbkVycm9yKEV4Y2VwdGlvbik6Ci0gICAgIiIiQWJzdHJhY3QgYmFzZSBmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9ycyIiIgotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fK3JlcHIoc2VsZi5hcmdzKQotCi1jbGFzcyBWZXJzaW9uQ29uZmxpY3QoUmVzb2x1dGlvbkVycm9yKToKLSAgICAiIiJBbiBhbHJlYWR5LWluc3RhbGxlZCB2ZXJzaW9uIGNvbmZsaWN0cyB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiIiIgotCi1jbGFzcyBEaXN0cmlidXRpb25Ob3RGb3VuZChSZXNvbHV0aW9uRXJyb3IpOgotICAgICIiIkEgcmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kIiIiCi0KLWNsYXNzIFVua25vd25FeHRyYShSZXNvbHV0aW9uRXJyb3IpOgotICAgICIiIkRpc3RyaWJ1dGlvbiBkb2Vzbid0IGhhdmUgYW4gImV4dHJhIGZlYXR1cmUiIG9mIHRoZSBnaXZlbiBuYW1lIiIiCi0KLV9wcm92aWRlcl9mYWN0b3JpZXMgPSB7fQotUFlfTUFKT1IgPSBzeXMudmVyc2lvbls6M10KLUVHR19ESVNUICAgID0gMwotQklOQVJZX0RJU1QgPSAyCi1TT1VSQ0VfRElTVCA9IDEKLUNIRUNLT1VUX0RJU1QgPSAwCi1ERVZFTE9QX0RJU1QgPSAtMQotCi1kZWYgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX3R5cGUsIHByb3ZpZGVyX2ZhY3RvcnkpOgotICAgICIiIlJlZ2lzdGVyIGBwcm92aWRlcl9mYWN0b3J5YCB0byBtYWtlIHByb3ZpZGVycyBmb3IgYGxvYWRlcl90eXBlYAotCi0gICAgYGxvYWRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgYGBtb2R1bGUuX19sb2FkZXJfX2BgLAotICAgIGFuZCBgcHJvdmlkZXJfZmFjdG9yeWAgaXMgYSBmdW5jdGlvbiB0aGF0LCBwYXNzZWQgYSAqbW9kdWxlKiBvYmplY3QsCi0gICAgcmV0dXJucyBhbiBgYElSZXNvdXJjZVByb3ZpZGVyYGAgZm9yIHRoYXQgbW9kdWxlLgotICAgICIiIgotICAgIF9wcm92aWRlcl9mYWN0b3JpZXNbbG9hZGVyX3R5cGVdID0gcHJvdmlkZXJfZmFjdG9yeQotCi1kZWYgZ2V0X3Byb3ZpZGVyKG1vZHVsZU9yUmVxKToKLSAgICAiIiJSZXR1cm4gYW4gSVJlc291cmNlUHJvdmlkZXIgZm9yIHRoZSBuYW1lZCBtb2R1bGUgb3IgcmVxdWlyZW1lbnQiIiIKLSAgICBpZiBpc2luc3RhbmNlKG1vZHVsZU9yUmVxLFJlcXVpcmVtZW50KToKLSAgICAgICAgcmV0dXJuIHdvcmtpbmdfc2V0LmZpbmQobW9kdWxlT3JSZXEpIG9yIHJlcXVpcmUoc3RyKG1vZHVsZU9yUmVxKSlbMF0KLSAgICB0cnk6Ci0gICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVPclJlcSkKLSAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCi0gICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKLSAgICByZXR1cm4gX2ZpbmRfYWRhcHRlcihfcHJvdmlkZXJfZmFjdG9yaWVzLCBsb2FkZXIpKG1vZHVsZSkKLQotZGVmIF9tYWNvc3hfdmVycyhfY2FjaGU9W10pOgotICAgIGlmIG5vdCBfY2FjaGU6Ci0gICAgICAgIGluZm8gPSBvcy5wb3BlbignL3Vzci9iaW4vc3dfdmVycycpLnJlYWQoKS5zcGxpdGxpbmVzKCkKLSAgICAgICAgZm9yIGxpbmUgaW4gaW5mbzoKLSAgICAgICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KE5vbmUsIDEpCi0gICAgICAgICAgICBpZiBrZXkgPT0gJ1Byb2R1Y3RWZXJzaW9uOic6Ci0gICAgICAgICAgICAgICAgX2NhY2hlLmFwcGVuZCh2YWx1ZS5zdHJpcCgpLnNwbGl0KCIuIikpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJXaGF0PyEiCi0gICAgcmV0dXJuIF9jYWNoZVswXQotCi1kZWYgX21hY29zeF9hcmNoKG1hY2hpbmUpOgotICAgIHJldHVybiB7J1Bvd2VyUEMnOidwcGMnLCAnUG93ZXJfTWFjaW50b3NoJzoncHBjJ30uZ2V0KG1hY2hpbmUsbWFjaGluZSkKLQotZGVmIGdldF9idWlsZF9wbGF0Zm9ybSgpOgotICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3Mgc3RyaW5nIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zCi0KLSAgICBYWFggQ3VycmVudGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgYGBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKWBgLCBidXQgaXQKLSAgICBuZWVkcyBzb21lIGhhY2tzIGZvciBMaW51eCBhbmQgTWFjIE9TIFguCi0gICAgIiIiCi0gICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCi0gICAgcGxhdCA9IGdldF9wbGF0Zm9ybSgpCi0gICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZCBub3QgcGxhdC5zdGFydHN3aXRoKCdtYWNvc3gtJyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHZlcnNpb24gPSBfbWFjb3N4X3ZlcnMoKQotICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0ucmVwbGFjZSgiICIsICJfIikKLSAgICAgICAgICAgIHJldHVybiAibWFjb3N4LSVkLiVkLSVzIiAlIChpbnQodmVyc2lvblswXSksIGludCh2ZXJzaW9uWzFdKSwKLSAgICAgICAgICAgICAgICBfbWFjb3N4X2FyY2gobWFjaGluZSkpCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgIyBpZiBzb21lb25lIGlzIHJ1bm5pbmcgYSBub24tTWFjIGRhcndpbiBzeXN0ZW0sIHRoaXMgd2lsbCBmYWxsCi0gICAgICAgICAgICAjIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIHBhc3MKLSAgICByZXR1cm4gcGxhdAotCi1tYWNvc1ZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIibWFjb3N4LShcZCspXC4oXGQrKS0oLiopIikKLWRhcndpblZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIiZGFyd2luLShcZCspXC4oXGQrKVwuKFxkKyktKC4qKSIpCi1nZXRfcGxhdGZvcm0gPSBnZXRfYnVpbGRfcGxhdGZvcm0gICAjIFhYWCBiYWNrd2FyZCBjb21wYXQKLQotZGVmIGNvbXBhdGlibGVfcGxhdGZvcm1zKHByb3ZpZGVkLHJlcXVpcmVkKToKLSAgICAiIiJDYW4gY29kZSBmb3IgdGhlIGBwcm92aWRlZGAgcGxhdGZvcm0gcnVuIG9uIHRoZSBgcmVxdWlyZWRgIHBsYXRmb3JtPwotCi0gICAgUmV0dXJucyB0cnVlIGlmIGVpdGhlciBwbGF0Zm9ybSBpcyBgYE5vbmVgYCwgb3IgdGhlIHBsYXRmb3JtcyBhcmUgZXF1YWwuCi0KLSAgICBYWFggTmVlZHMgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIExpbnV4IGFuZCBvdGhlciB1bml4eSBPU2VzLgotICAgICIiIgotICAgIGlmIHByb3ZpZGVkIGlzIE5vbmUgb3IgcmVxdWlyZWQgaXMgTm9uZSBvciBwcm92aWRlZD09cmVxdWlyZWQ6Ci0gICAgICAgIHJldHVybiBUcnVlICAgICAjIGVhc3kgY2FzZQotCi0gICAgIyBNYWMgT1MgWCBzcGVjaWFsIGNhc2VzCi0gICAgcmVxTWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHJlcXVpcmVkKQotICAgIGlmIHJlcU1hYzoKLSAgICAgICAgcHJvdk1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKLQotICAgICAgICAjIGlzIHRoaXMgYSBNYWMgcGFja2FnZT8KLSAgICAgICAgaWYgbm90IHByb3ZNYWM6Ci0gICAgICAgICAgICAjIHRoaXMgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHBhY2thZ2VzIGJ1aWx0IGJlZm9yZQotICAgICAgICAgICAgIyBzZXR1cHRvb2xzIDAuNi4gQWxsIHBhY2thZ2VzIGJ1aWx0IGFmdGVyIHRoaXMgcG9pbnQgd2lsbAotICAgICAgICAgICAgIyB1c2UgdGhlIG5ldyBtYWNvc3ggZGVzaWduYXRpb24uCi0gICAgICAgICAgICBwcm92RGFyd2luID0gZGFyd2luVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKLSAgICAgICAgICAgIGlmIHByb3ZEYXJ3aW46Ci0gICAgICAgICAgICAgICAgZHZlcnNpb24gPSBpbnQocHJvdkRhcndpbi5ncm91cCgxKSkKLSAgICAgICAgICAgICAgICBtYWNvc3ZlcnNpb24gPSAiJXMuJXMiICUgKHJlcU1hYy5ncm91cCgxKSwgcmVxTWFjLmdyb3VwKDIpKQotICAgICAgICAgICAgICAgIGlmIGR2ZXJzaW9uID09IDcgYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuMyIgb3IgXAotICAgICAgICAgICAgICAgICAgICBkdmVyc2lvbiA9PSA4IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjQiOgotCi0gICAgICAgICAgICAgICAgICAgICNpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgICAgICAgICAgI3dhcm5pbmdzLndhcm4oIk1hYyBlZ2dzIHNob3VsZCBiZSByZWJ1aWx0IHRvICIKLSAgICAgICAgICAgICAgICAgICAgIyAgICAidXNlIHRoZSBtYWNvc3ggZGVzaWduYXRpb24gaW5zdGVhZCBvZiBkYXJ3aW4uIiwKLSAgICAgICAgICAgICAgICAgICAgIyAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UgICAgIyBlZ2cgaXNuJ3QgbWFjb3N4IG9yIGxlZ2FjeSBkYXJ3aW4KLQotICAgICAgICAjIGFyZSB0aGV5IHRoZSBzYW1lIG1ham9yIHZlcnNpb24gYW5kIG1hY2hpbmUgdHlwZT8KLSAgICAgICAgaWYgcHJvdk1hYy5ncm91cCgxKSAhPSByZXFNYWMuZ3JvdXAoMSkgb3IgXAotICAgICAgICAgICAgcHJvdk1hYy5ncm91cCgzKSAhPSByZXFNYWMuZ3JvdXAoMyk6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotCi0KLSAgICAgICAgIyBpcyB0aGUgcmVxdWlyZWQgT1MgbWFqb3IgdXBkYXRlID49IHRoZSBwcm92aWRlZCBvbmU/Ci0gICAgICAgIGlmIGludChwcm92TWFjLmdyb3VwKDIpKSA+IGludChyZXFNYWMuZ3JvdXAoMikpOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgICMgWFhYIExpbnV4IGFuZCBvdGhlciBwbGF0Zm9ybXMnIHNwZWNpYWwgY2FzZXMgc2hvdWxkIGdvIGhlcmUKLSAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgcnVuX3NjcmlwdChkaXN0X3NwZWMsIHNjcmlwdF9uYW1lKToKLSAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGBkaXN0X3NwZWNgIGFuZCBydW4gaXRzIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCi0gICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscwotICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQotICAgIG5zLmNsZWFyKCkKLSAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKLSAgICByZXF1aXJlKGRpc3Rfc3BlYylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCi0KLXJ1bl9tYWluID0gcnVuX3NjcmlwdCAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCi1kZWYgZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KToKLSAgICAiIiJSZXR1cm4gYSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBvYmplY3QgZm9yIGEgUmVxdWlyZW1lbnQgb3Igc3RyaW5nIiIiCi0gICAgaWYgaXNpbnN0YW5jZShkaXN0LGJhc2VzdHJpbmcpOiBkaXN0ID0gUmVxdWlyZW1lbnQucGFyc2UoZGlzdCkKLSAgICBpZiBpc2luc3RhbmNlKGRpc3QsUmVxdWlyZW1lbnQpOiBkaXN0ID0gZ2V0X3Byb3ZpZGVyKGRpc3QpCi0gICAgaWYgbm90IGlzaW5zdGFuY2UoZGlzdCxEaXN0cmlidXRpb24pOgotICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkV4cGVjdGVkIHN0cmluZywgUmVxdWlyZW1lbnQsIG9yIERpc3RyaWJ1dGlvbiIsIGRpc3QpCi0gICAgcmV0dXJuIGRpc3QKLQotZGVmIGxvYWRfZW50cnlfcG9pbnQoZGlzdCwgZ3JvdXAsIG5hbWUpOgotICAgICIiIlJldHVybiBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBmb3IgYGRpc3RgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCi0gICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkubG9hZF9lbnRyeV9wb2ludChncm91cCwgbmFtZSkKLQotZGVmIGdldF9lbnRyeV9tYXAoZGlzdCwgZ3JvdXA9Tm9uZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgotICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9tYXAoZ3JvdXApCi0KLWRlZiBnZXRfZW50cnlfaW5mbyhkaXN0LCBncm91cCwgbmFtZSk6Ci0gICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCi0gICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCi0KLQotdHJ5OgotICAgIGZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2ltcG9ydGVyCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgaW1wb3J0IF9wa2d1dGlsIGFzIHBrZ3V0aWwKLSAgICBnZXRfaW1wb3J0ZXIgPSBwa2d1dGlsLmdldF9pbXBvcnRlcgotZWxzZToKLSAgICBpbXBvcnQgcGtndXRpbAotCi0KLWNsYXNzIElNZXRhZGF0YVByb3ZpZGVyOgotCi0gICAgZGVmIGhhc19tZXRhZGF0YShuYW1lKToKLSAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSdzIGRpc3RyaWJ1dGlvbiBjb250YWluIHRoZSBuYW1lZCBtZXRhZGF0YT8iIiIKLQotICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6Ci0gICAgICAgICIiIlRoZSBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgotCi0gICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKLSAgICAgICAgIiIiWWllbGQgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgbGlzdCBvZiBub24tYmxhbmsgbm9uLWNvbW1lbnQgbGluZXMKLQotICAgICAgIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUsIGFuZCBsaW5lcwotICAgICAgIHdpdGggYGAjYGAgYXMgdGhlIGZpcnN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgYXJlIG9taXR0ZWQuIiIiCi0KLSAgICBkZWYgbWV0YWRhdGFfaXNkaXIobmFtZSk6Ci0gICAgICAgICIiIklzIHRoZSBuYW1lZCBtZXRhZGF0YSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCi0KLSAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihuYW1lKToKLSAgICAgICAgIiIiTGlzdCBvZiBtZXRhZGF0YSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCi0KLSAgICBkZWYgcnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKLSAgICAgICAgIiIiRXhlY3V0ZSB0aGUgbmFtZWQgc2NyaXB0IGluIHRoZSBzdXBwbGllZCBuYW1lc3BhY2UgZGljdGlvbmFyeSIiIgotCi0KLQotCi0KLQotCi0KLQotCi1jbGFzcyBJUmVzb3VyY2VQcm92aWRlcihJTWV0YWRhdGFQcm92aWRlcik6Ci0gICAgIiIiQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIiIiCi0KLSAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgotICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYHJlc291cmNlX25hbWVgCi0KLSAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKLQotICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgotICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBgcmVzb3VyY2VfbmFtZWAKLQotICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgotCi0gICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgICIiIlJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBgcmVzb3VyY2VfbmFtZWAKLQotICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgotCi0gICAgZGVmIGhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKToKLSAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSBjb250YWluIHRoZSBuYW1lZCByZXNvdXJjZT8iIiIKLQotICAgIGRlZiByZXNvdXJjZV9pc2RpcihyZXNvdXJjZV9uYW1lKToKLSAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKLQotICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHJlc291cmNlX25hbWUpOgotICAgICAgICAiIiJMaXN0IG9mIHJlc291cmNlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWNsYXNzIFdvcmtpbmdTZXQob2JqZWN0KToKLSAgICAiIiJBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgb24gc3lzLnBhdGggKG9yIGEgc2ltaWxhciBsaXN0KSIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudHJpZXM9Tm9uZSk6Ci0gICAgICAgICIiIkNyZWF0ZSB3b3JraW5nIHNldCBmcm9tIGxpc3Qgb2YgcGF0aCBlbnRyaWVzIChkZWZhdWx0PXN5cy5wYXRoKSIiIgotICAgICAgICBzZWxmLmVudHJpZXMgPSBbXQotICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSB7fQotICAgICAgICBzZWxmLmJ5X2tleSA9IHt9Ci0gICAgICAgIHNlbGYuY2FsbGJhY2tzID0gW10KLQotICAgICAgICBpZiBlbnRyaWVzIGlzIE5vbmU6Ci0gICAgICAgICAgICBlbnRyaWVzID0gc3lzLnBhdGgKLQotICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKLSAgICAgICAgICAgIHNlbGYuYWRkX2VudHJ5KGVudHJ5KQotCi0KLSAgICBkZWYgYWRkX2VudHJ5KHNlbGYsIGVudHJ5KToKLSAgICAgICAgIiIiQWRkIGEgcGF0aCBpdGVtIHRvIGBgLmVudHJpZXNgYCwgZmluZGluZyBhbnkgZGlzdHJpYnV0aW9ucyBvbiBpdAotCi0gICAgICAgIGBgZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LEZhbHNlKWBgIGlzIHVzZWQgdG8gZmluZCBkaXN0cmlidXRpb25zCi0gICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZW50cnksIGFuZCB0aGV5IGFyZSBhZGRlZC4gIGBlbnRyeWAgaXMKLSAgICAgICAgYWx3YXlzIGFwcGVuZGVkIHRvIGBgLmVudHJpZXNgYCwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCi0gICAgICAgIChUaGlzIGlzIGJlY2F1c2UgYGBzeXMucGF0aGBgIGNhbiBjb250YWluIHRoZSBzYW1lIHZhbHVlIG1vcmUgdGhhbgotICAgICAgICBvbmNlLCBhbmQgdGhlIGBgLmVudHJpZXNgYCBvZiB0aGUgYGBzeXMucGF0aGBgIFdvcmtpbmdTZXQgc2hvdWxkIGFsd2F5cwotICAgICAgICBlcXVhbCBgYHN5cy5wYXRoYGAuKQotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQotICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQotICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpOgotICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCwgZW50cnksIEZhbHNlKQotCi0KLSAgICBkZWYgX19jb250YWluc19fKHNlbGYsZGlzdCk6Ci0gICAgICAgICIiIlRydWUgaWYgYGRpc3RgIGlzIHRoZSBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciBpdHMgcHJvamVjdCIiIgotICAgICAgICByZXR1cm4gc2VsZi5ieV9rZXkuZ2V0KGRpc3Qua2V5KSA9PSBkaXN0Ci0KLQotCi0KLQotICAgIGRlZiBmaW5kKHNlbGYsIHJlcSk6Ci0gICAgICAgICIiIkZpbmQgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgcmVxdWlyZW1lbnQgYHJlcWAKLQotICAgICAgICBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIHRoaXMKLSAgICAgICAgcmV0dXJucyBpdCBhcyBsb25nIGFzIGl0IG1lZXRzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllZCBieQotICAgICAgICBgcmVxYC4gIEJ1dCwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIGl0Ci0gICAgICAgIGRvZXMgKm5vdCogbWVldCB0aGUgYHJlcWAgcmVxdWlyZW1lbnQsIGBgVmVyc2lvbkNvbmZsaWN0YGAgaXMgcmFpc2VkLgotICAgICAgICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIGBgTm9uZWBgCi0gICAgICAgIGlzIHJldHVybmVkLgotICAgICAgICAiIiIKLSAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQotICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBkaXN0IG5vdCBpbiByZXE6Ci0gICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCxyZXEpICAgICAjIFhYWCBhZGQgbW9yZSBpbmZvCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gZGlzdAotCi0gICAgZGVmIGl0ZXJfZW50cnlfcG9pbnRzKHNlbGYsIGdyb3VwLCBuYW1lPU5vbmUpOgotICAgICAgICAiIiJZaWVsZCBlbnRyeSBwb2ludCBvYmplY3RzIGZyb20gYGdyb3VwYCBtYXRjaGluZyBgbmFtZWAKLQotICAgICAgICBJZiBgbmFtZWAgaXMgTm9uZSwgeWllbGRzIGFsbCBlbnRyeSBwb2ludHMgaW4gYGdyb3VwYCBmcm9tIGFsbAotICAgICAgICBkaXN0cmlidXRpb25zIGluIHRoZSB3b3JraW5nIHNldCwgb3RoZXJ3aXNlIG9ubHkgb25lcyBtYXRjaGluZwotICAgICAgICBib3RoIGBncm91cGAgYW5kIGBuYW1lYCBhcmUgeWllbGRlZCAoaW4gZGlzdHJpYnV0aW9uIG9yZGVyKS4KLSAgICAgICAgIiIiCi0gICAgICAgIGZvciBkaXN0IGluIHNlbGY6Ci0gICAgICAgICAgICBlbnRyaWVzID0gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKQotICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgotICAgICAgICAgICAgICAgIGZvciBlcCBpbiBlbnRyaWVzLnZhbHVlcygpOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCBlcAotICAgICAgICAgICAgZWxpZiBuYW1lIGluIGVudHJpZXM6Ci0gICAgICAgICAgICAgICAgeWllbGQgZW50cmllc1tuYW1lXQotCi0gICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgcmVxdWlyZXMsIHNjcmlwdF9uYW1lKToKLSAgICAgICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBmb3IgYHJlcXVpcmVzYCBhbmQgcnVuIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCi0gICAgICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKLSAgICAgICAgbmFtZSA9IG5zWydfX25hbWVfXyddCi0gICAgICAgIG5zLmNsZWFyKCkKLSAgICAgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCi0gICAgICAgIHNlbGYucmVxdWlyZShyZXF1aXJlcylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCi0KLQotCi0gICAgZGVmIF9faXRlcl9fKHNlbGYpOgotICAgICAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGZvciBub24tZHVwbGljYXRlIHByb2plY3RzIGluIHRoZSB3b3JraW5nIHNldAotCi0gICAgICAgIFRoZSB5aWVsZCBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zJyBwYXRoIGVudHJpZXMgd2VyZQotICAgICAgICBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQuCi0gICAgICAgICIiIgotICAgICAgICBzZWVuID0ge30KLSAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5lbnRyaWVzOgotICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmVudHJ5X2tleXNbaXRlbV06Ci0gICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWVuOgotICAgICAgICAgICAgICAgICAgICBzZWVuW2tleV09MQotICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmJ5X2tleVtrZXldCi0KLSAgICBkZWYgYWRkKHNlbGYsIGRpc3QsIGVudHJ5PU5vbmUsIGluc2VydD1UcnVlKToKLSAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB3b3JraW5nIHNldCwgYXNzb2NpYXRlZCB3aXRoIGBlbnRyeWAKLQotICAgICAgICBJZiBgZW50cnlgIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgYGAubG9jYXRpb25gYCBvZiBgZGlzdGAuCi0gICAgICAgIE9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUsIGBlbnRyeWAgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya2luZwotICAgICAgICBzZXQncyBgYC5lbnRyaWVzYGAgKGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQpLgotCi0gICAgICAgIGBkaXN0YCBpcyBvbmx5IGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpZiBpdCdzIGZvciBhIHByb2plY3QgdGhhdAotICAgICAgICBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0LiAgSWYgaXQncyBhZGRlZCwgYW55Ci0gICAgICAgIGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggdGhlIGBgc3Vic2NyaWJlKClgYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCi0gICAgICAgICIiIgotICAgICAgICBpZiBpbnNlcnQ6Ci0gICAgICAgICAgICBkaXN0Lmluc2VydF9vbihzZWxmLmVudHJpZXMsIGVudHJ5KQotCi0gICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6Ci0gICAgICAgICAgICBlbnRyeSA9IGRpc3QubG9jYXRpb24KLSAgICAgICAga2V5cyA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LFtdKQotCi0gICAgICAgIGlmIGRpc3Qua2V5IGluIHNlbGYuYnlfa2V5OgotICAgICAgICAgICAgcmV0dXJuICAgICAgIyBpZ25vcmUgaGlkZGVuIGRpc3Ryb3MKLQotICAgICAgICBzZWxmLmJ5X2tleVtkaXN0LmtleV0gPSBkaXN0Ci0gICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzOgotICAgICAgICAgICAga2V5cy5hcHBlbmQoZGlzdC5rZXkpCi0KLSAgICAgICAgc2VsZi5fYWRkZWRfbmV3KGRpc3QpCi0KLQotICAgIGRlZiByZXNvbHZlKHNlbGYsIHJlcXVpcmVtZW50cywgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKLSAgICAgICAgIiIiTGlzdCBhbGwgZGlzdHJpYnV0aW9ucyBuZWVkZWQgdG8gKHJlY3Vyc2l2ZWx5KSBtZWV0IGByZXF1aXJlbWVudHNgCi0KLSAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzLiAgYGVudmAsCi0gICAgICAgIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlLiAgSWYKLSAgICAgICAgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0byBhbGwgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgd2l0aGluIGFueQotICAgICAgICBlbnRyeSBvciBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LiAgYGluc3RhbGxlcmAsIGlmIHN1cHBsaWVkLAotICAgICAgICB3aWxsIGJlIGludm9rZWQgd2l0aCBlYWNoIHJlcXVpcmVtZW50IHRoYXQgY2Fubm90IGJlIG1ldCBieSBhbgotICAgICAgICBhbHJlYWR5LWluc3RhbGxlZCBkaXN0cmlidXRpb247IGl0IHNob3VsZCByZXR1cm4gYSBgYERpc3RyaWJ1dGlvbmBgIG9yCi0gICAgICAgIGBgTm9uZWBgLgotICAgICAgICAiIiIKLQotICAgICAgICByZXF1aXJlbWVudHMgPSBsaXN0KHJlcXVpcmVtZW50cylbOjotMV0gICMgc2V0IHVwIHRoZSBzdGFjawotICAgICAgICBwcm9jZXNzZWQgPSB7fSAgIyBzZXQgb2YgcHJvY2Vzc2VkIHJlcXVpcmVtZW50cwotICAgICAgICBiZXN0ID0ge30gICMga2V5IC0+IGRpc3QKLSAgICAgICAgdG9fYWN0aXZhdGUgPSBbXQotCi0gICAgICAgIHdoaWxlIHJlcXVpcmVtZW50czoKLSAgICAgICAgICAgIHJlcSA9IHJlcXVpcmVtZW50cy5wb3AoMCkgICAjIHByb2Nlc3MgZGVwZW5kZW5jaWVzIGJyZWFkdGgtZmlyc3QKLSAgICAgICAgICAgIGlmIHJlcSBpbiBwcm9jZXNzZWQ6Ci0gICAgICAgICAgICAgICAgIyBJZ25vcmUgY3ljbGljIG9yIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZGlzdCA9IGJlc3QuZ2V0KHJlcS5rZXkpCi0gICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBiZXN0IGRpc3RyaWJ1dGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKLSAgICAgICAgICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCi0gICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKLSAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGJlc3RbcmVxLmtleV0gPSBlbnYuYmVzdF9tYXRjaChyZXEsIHNlbGYsIGluc3RhbGxlcikKLSAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQocmVxKSAgIyBYWFggcHV0IG1vcmUgaW5mbyBoZXJlCi0gICAgICAgICAgICAgICAgdG9fYWN0aXZhdGUuYXBwZW5kKGRpc3QpCi0gICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiByZXE6Ci0gICAgICAgICAgICAgICAgIyBPb3BzLCB0aGUgImJlc3QiIHNvIGZhciBjb25mbGljdHMgd2l0aCBhIGRlcGVuZGVuY3kKLSAgICAgICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCxyZXEpICMgWFhYIHB1dCBtb3JlIGluZm8gaGVyZQotICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChkaXN0LnJlcXVpcmVzKHJlcS5leHRyYXMpWzo6LTFdKQotICAgICAgICAgICAgcHJvY2Vzc2VkW3JlcV0gPSBUcnVlCi0KLSAgICAgICAgcmV0dXJuIHRvX2FjdGl2YXRlICAgICMgcmV0dXJuIGxpc3Qgb2YgZGlzdHJvcyB0byBhY3RpdmF0ZQotCi0gICAgZGVmIGZpbmRfcGx1Z2lucyhzZWxmLAotICAgICAgICBwbHVnaW5fZW52LCBmdWxsX2Vudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwgZmFsbGJhY2s9VHJ1ZQotICAgICk6Ci0gICAgICAgICIiIkZpbmQgYWxsIGFjdGl2YXRhYmxlIGRpc3RyaWJ1dGlvbnMgaW4gYHBsdWdpbl9lbnZgCi0KLSAgICAgICAgRXhhbXBsZSB1c2FnZTo6Ci0KLSAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMsIGVycm9ycyA9IHdvcmtpbmdfc2V0LmZpbmRfcGx1Z2lucygKLSAgICAgICAgICAgICAgICBFbnZpcm9ubWVudChwbHVnaW5fZGlybGlzdCkKLSAgICAgICAgICAgICkKLSAgICAgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsIGRpc3RyaWJ1dGlvbnMpICAjIGFkZCBwbHVnaW5zK2xpYnMgdG8gc3lzLnBhdGgKLSAgICAgICAgICAgIHByaW50ICJDb3VsZG4ndCBsb2FkIiwgZXJyb3JzICAgICAgICAjIGRpc3BsYXkgZXJyb3JzCi0KLSAgICAgICAgVGhlIGBwbHVnaW5fZW52YCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlIHRoYXQgY29udGFpbnMKLSAgICAgICAgb25seSBkaXN0cmlidXRpb25zIHRoYXQgYXJlIGluIHRoZSBwcm9qZWN0J3MgInBsdWdpbiBkaXJlY3RvcnkiIG9yCi0gICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgYGZ1bGxfZW52YCwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAKLSAgICAgICAgY29udGFpbnMgYWxsIGN1cnJlbnRseS1hdmFpbGFibGUgZGlzdHJpYnV0aW9ucy4gIElmIGBmdWxsX2VudmAgaXMgbm90Ci0gICAgICAgIHN1cHBsaWVkLCBvbmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGBgV29ya2luZ1NldGBgIHRoaXMKLSAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBvbiwgd2hpY2ggd2lsbCB0eXBpY2FsbHkgbWVhbiB0aGF0IGV2ZXJ5IGRpcmVjdG9yeSBvbgotICAgICAgICBgYHN5cy5wYXRoYGAgd2lsbCBiZSBzY2FubmVkIGZvciBkaXN0cmlidXRpb25zLgotCi0gICAgICAgIGBpbnN0YWxsZXJgIGlzIGEgc3RhbmRhcmQgaW5zdGFsbGVyIGNhbGxiYWNrIGFzIHVzZWQgYnkgdGhlCi0gICAgICAgIGBgcmVzb2x2ZSgpYGAgbWV0aG9kLiBUaGUgYGZhbGxiYWNrYCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZAotICAgICAgICBhdHRlbXB0IHRvIHJlc29sdmUgb2xkZXIgdmVyc2lvbnMgb2YgYSBwbHVnaW4gaWYgdGhlIG5ld2VzdCB2ZXJzaW9uCi0gICAgICAgIGNhbm5vdCBiZSByZXNvbHZlZC4KLQotICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgMi10dXBsZTogKGBkaXN0cmlidXRpb25zYCwgYGVycm9yX2luZm9gKSwgd2hlcmUKLSAgICAgICAgYGRpc3RyaWJ1dGlvbnNgIGlzIGEgbGlzdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBmb3VuZCBpbiBgcGx1Z2luX2VudmAKLSAgICAgICAgdGhhdCB3ZXJlIGxvYWRhYmxlLCBhbG9uZyB3aXRoIGFueSBvdGhlciBkaXN0cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZAotICAgICAgICB0byByZXNvbHZlIHRoZWlyIGRlcGVuZGVuY2llcy4gIGBlcnJvcl9pbmZvYCBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZwotICAgICAgICB1bmxvYWRhYmxlIHBsdWdpbiBkaXN0cmlidXRpb25zIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZQotICAgICAgICBlcnJvciB0aGF0IG9jY3VycmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIGBgRGlzdHJpYnV0aW9uTm90Rm91bmRgYCBvcgotICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGluc3RhbmNlLgotICAgICAgICAiIiIKLQotICAgICAgICBwbHVnaW5fcHJvamVjdHMgPSBsaXN0KHBsdWdpbl9lbnYpCi0gICAgICAgIHBsdWdpbl9wcm9qZWN0cy5zb3J0KCkgICMgc2NhbiBwcm9qZWN0IG5hbWVzIGluIGFscGhhYmV0aWMgb3JkZXIKLQotICAgICAgICBlcnJvcl9pbmZvID0ge30KLSAgICAgICAgZGlzdHJpYnV0aW9ucyA9IHt9Ci0KLSAgICAgICAgaWYgZnVsbF9lbnYgaXMgTm9uZToKLSAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKLSAgICAgICAgICAgIGVudiArPSBwbHVnaW5fZW52Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBlbnYgPSBmdWxsX2VudiArIHBsdWdpbl9lbnYKLQotICAgICAgICBzaGFkb3dfc2V0ID0gc2VsZi5fX2NsYXNzX18oW10pCi0gICAgICAgIG1hcChzaGFkb3dfc2V0LmFkZCwgc2VsZikgICAjIHB1dCBhbGwgb3VyIGVudHJpZXMgaW4gc2hhZG93X3NldAotCi0gICAgICAgIGZvciBwcm9qZWN0X25hbWUgaW4gcGx1Z2luX3Byb2plY3RzOgotCi0gICAgICAgICAgICBmb3IgZGlzdCBpbiBwbHVnaW5fZW52W3Byb2plY3RfbmFtZV06Ci0KLSAgICAgICAgICAgICAgICByZXEgPSBbZGlzdC5hc19yZXF1aXJlbWVudCgpXQotCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICByZXNvbHZlZXMgPSBzaGFkb3dfc2V0LnJlc29sdmUocmVxLCBlbnYsIGluc3RhbGxlcikKLQotICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNvbHV0aW9uRXJyb3IsdjoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5mb1tkaXN0XSA9IHYgICAgIyBzYXZlIGVycm9yIGluZm8KLSAgICAgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2s6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIHRyeSB0aGUgbmV4dCBvbGRlciB2ZXJzaW9uIG9mIHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgICAgICMgZ2l2ZSB1cCBvbiB0aGlzIHByb2plY3QsIGtlZXAgZ29pbmcKLQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG1hcChzaGFkb3dfc2V0LmFkZCwgcmVzb2x2ZWVzKQotICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zLnVwZGF0ZShkaWN0LmZyb21rZXlzKHJlc29sdmVlcykpCi0KLSAgICAgICAgICAgICAgICAgICAgIyBzdWNjZXNzLCBubyBuZWVkIHRvIHRyeSBhbnkgbW9yZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICBkaXN0cmlidXRpb25zID0gbGlzdChkaXN0cmlidXRpb25zKQotICAgICAgICBkaXN0cmlidXRpb25zLnNvcnQoKQotCi0gICAgICAgIHJldHVybiBkaXN0cmlidXRpb25zLCBlcnJvcl9pbmZvCi0KLQotCi0KLQotICAgIGRlZiByZXF1aXJlKHNlbGYsICpyZXF1aXJlbWVudHMpOgotICAgICAgICAiIiJFbnN1cmUgdGhhdCBkaXN0cmlidXRpb25zIG1hdGNoaW5nIGByZXF1aXJlbWVudHNgIGFyZSBhY3RpdmF0ZWQKLQotICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgc2VxdWVuY2UKLSAgICAgICAgdGhlcmVvZiwgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgdmVyc2lvbnMgcmVxdWlyZWQuICBUaGUKLSAgICAgICAgcmV0dXJuIHZhbHVlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBuZWVkZWQgdG8gYmUKLSAgICAgICAgYWN0aXZhdGVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVpcmVtZW50czsgYWxsIHJlbGV2YW50IGRpc3RyaWJ1dGlvbnMgYXJlCi0gICAgICAgIGluY2x1ZGVkLCBldmVuIGlmIHRoZXkgd2VyZSBhbHJlYWR5IGFjdGl2YXRlZCBpbiB0aGlzIHdvcmtpbmcgc2V0LgotICAgICAgICAiIiIKLQotICAgICAgICBuZWVkZWQgPSBzZWxmLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCi0KLSAgICAgICAgZm9yIGRpc3QgaW4gbmVlZGVkOgotICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKLQotICAgICAgICByZXR1cm4gbmVlZGVkCi0KLQotICAgIGRlZiBzdWJzY3JpYmUoc2VsZiwgY2FsbGJhY2spOgotICAgICAgICAiIiJJbnZva2UgYGNhbGxiYWNrYCBmb3IgYWxsIGRpc3RyaWJ1dGlvbnMgKGluY2x1ZGluZyBleGlzdGluZyBvbmVzKSIiIgotICAgICAgICBpZiBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmNhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spCi0gICAgICAgIGZvciBkaXN0IGluIHNlbGY6Ci0gICAgICAgICAgICBjYWxsYmFjayhkaXN0KQotCi0KLSAgICBkZWYgX2FkZGVkX25ldyhzZWxmLCBkaXN0KToKLSAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgotICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKLQotCi0KLQotCi0KLQotCi0KLQotCi1jbGFzcyBFbnZpcm9ubWVudChvYmplY3QpOgotICAgICIiIlNlYXJjaGFibGUgc25hcHNob3Qgb2YgZGlzdHJpYnV0aW9ucyBvbiBhIHNlYXJjaCBwYXRoIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSwgcGxhdGZvcm09Z2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpLCBweXRob249UFlfTUFKT1IpOgotICAgICAgICAiIiJTbmFwc2hvdCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSBvbiBhIHNlYXJjaCBwYXRoCi0KLSAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgb24gYHNlYXJjaF9wYXRoYCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgotICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAotICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuCi0KLSAgICAgICAgYHBsYXRmb3JtYCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KLSAgICAgICAgdGhhdCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYKLSAgICAgICAgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgYHB5dGhvbmAgaXMgYW4KLSAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWluZyB0aGUgZGVzaXJlZCB2ZXJzaW9uIG9mIFB5dGhvbiAoZS5nLiBgYCcyLjQnYGApOwotICAgICAgICBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLgotCi0gICAgICAgIFlvdSBtYXkgZXhwbGljaXRseSBzZXQgYHBsYXRmb3JtYCAoYW5kL29yIGBweXRob25gKSB0byBgYE5vbmVgYCBpZiB5b3UKLSAgICAgICAgd2lzaCB0byBtYXAgKmFsbCogZGlzdHJpYnV0aW9ucywgbm90IGp1c3QgdGhvc2UgY29tcGF0aWJsZSB3aXRoIHRoZQotICAgICAgICBydW5uaW5nIHBsYXRmb3JtIG9yIFB5dGhvbiB2ZXJzaW9uLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fZGlzdG1hcCA9IHt9Ci0gICAgICAgIHNlbGYuX2NhY2hlID0ge30KLSAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCi0gICAgICAgIHNlbGYucHl0aG9uID0gcHl0aG9uCi0gICAgICAgIHNlbGYuc2NhbihzZWFyY2hfcGF0aCkKLQotICAgIGRlZiBjYW5fYWRkKHNlbGYsIGRpc3QpOgotICAgICAgICAiIiJJcyBkaXN0cmlidXRpb24gYGRpc3RgIGFjY2VwdGFibGUgZm9yIHRoaXMgZW52aXJvbm1lbnQ/Ci0KLSAgICAgICAgVGhlIGRpc3RyaWJ1dGlvbiBtdXN0IG1hdGNoIHRoZSBwbGF0Zm9ybSBhbmQgcHl0aG9uIHZlcnNpb24KLSAgICAgICAgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCB3aGVuIHRoaXMgZW52aXJvbm1lbnQgd2FzIGNyZWF0ZWQsIG9yIEZhbHNlCi0gICAgICAgIGlzIHJldHVybmVkLgotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIChzZWxmLnB5dGhvbiBpcyBOb25lIG9yIGRpc3QucHlfdmVyc2lvbiBpcyBOb25lCi0gICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb249PXNlbGYucHl0aG9uKSBcCi0gICAgICAgICAgIGFuZCBjb21wYXRpYmxlX3BsYXRmb3JtcyhkaXN0LnBsYXRmb3JtLHNlbGYucGxhdGZvcm0pCi0KLSAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgotICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGVudmlyb25tZW50IiIiCi0gICAgICAgIHNlbGYuX2Rpc3RtYXBbZGlzdC5rZXldLnJlbW92ZShkaXN0KQotCi0gICAgZGVmIHNjYW4oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSk6Ci0gICAgICAgICIiIlNjYW4gYHNlYXJjaF9wYXRoYCBmb3IgZGlzdHJpYnV0aW9ucyB1c2FibGUgaW4gdGhpcyBlbnZpcm9ubWVudAotCi0gICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCi0gICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90Ci0gICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4gIE9ubHkgZGlzdHJpYnV0aW9ucyBjb25mb3JtaW5nIHRvCi0gICAgICAgIHRoZSBwbGF0Zm9ybS9weXRob24gdmVyc2lvbiBkZWZpbmVkIGF0IGluaXRpYWxpemF0aW9uIGFyZSBhZGRlZC4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIHNlYXJjaF9wYXRoIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHN5cy5wYXRoCi0KLSAgICAgICAgZm9yIGl0ZW0gaW4gc2VhcmNoX3BhdGg6Ci0gICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoaXRlbSk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKLQotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLHByb2plY3RfbmFtZSk6Ci0gICAgICAgICIiIlJldHVybiBhIG5ld2VzdC10by1vbGRlc3QgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZvciBgcHJvamVjdF9uYW1lYAotICAgICAgICAiIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlW3Byb2plY3RfbmFtZV0KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gcHJvamVjdF9uYW1lLmxvd2VyKCkKLSAgICAgICAgICAgIGlmIHByb2plY3RfbmFtZSBub3QgaW4gc2VsZi5fZGlzdG1hcDoKLSAgICAgICAgICAgICAgICByZXR1cm4gW10KLQotICAgICAgICBpZiBwcm9qZWN0X25hbWUgbm90IGluIHNlbGYuX2NhY2hlOgotICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9jYWNoZVtwcm9qZWN0X25hbWVdID0gc2VsZi5fZGlzdG1hcFtwcm9qZWN0X25hbWVdCi0gICAgICAgICAgICBfc29ydF9kaXN0cyhkaXN0cykKLQotICAgICAgICByZXR1cm4gc2VsZi5fY2FjaGVbcHJvamVjdF9uYW1lXQotCi0gICAgZGVmIGFkZChzZWxmLGRpc3QpOgotICAgICAgICAiIiJBZGQgYGRpc3RgIGlmIHdlIGBgY2FuX2FkZCgpYGAgaXQgYW5kIGl0IGlzbid0IGFscmVhZHkgYWRkZWQiIiIKLSAgICAgICAgaWYgc2VsZi5jYW5fYWRkKGRpc3QpIGFuZCBkaXN0Lmhhc192ZXJzaW9uKCk6Ci0gICAgICAgICAgICBkaXN0cyA9IHNlbGYuX2Rpc3RtYXAuc2V0ZGVmYXVsdChkaXN0LmtleSxbXSkKLSAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgotICAgICAgICAgICAgICAgIGRpc3RzLmFwcGVuZChkaXN0KQotICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5IGluIHNlbGYuX2NhY2hlOgotICAgICAgICAgICAgICAgICAgICBfc29ydF9kaXN0cyhzZWxmLl9jYWNoZVtkaXN0LmtleV0pCi0KLQotICAgIGRlZiBiZXN0X21hdGNoKHNlbGYsIHJlcSwgd29ya2luZ19zZXQsIGluc3RhbGxlcj1Ob25lKToKLSAgICAgICAgIiIiRmluZCBkaXN0cmlidXRpb24gYmVzdCBtYXRjaGluZyBgcmVxYCBhbmQgdXNhYmxlIG9uIGB3b3JraW5nX3NldGAKLQotICAgICAgICBUaGlzIGNhbGxzIHRoZSBgYGZpbmQocmVxKWBgIG1ldGhvZCBvZiB0aGUgYHdvcmtpbmdfc2V0YCB0byBzZWUgaWYgYQotICAgICAgICBzdWl0YWJsZSBkaXN0cmlidXRpb24gaXMgYWxyZWFkeSBhY3RpdmUuICAoVGhpcyBtYXkgcmFpc2UKLSAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpZiBhbiB1bnN1aXRhYmxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaXMgYWxyZWFkeQotICAgICAgICBhY3RpdmUgaW4gdGhlIHNwZWNpZmllZCBgd29ya2luZ19zZXRgLikgIElmIGEgc3VpdGFibGUgZGlzdHJpYnV0aW9uCi0gICAgICAgIGlzbid0IGFjdGl2ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3ZXN0IGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAgICAgICAgZW52aXJvbm1lbnQgdGhhdCBtZWV0cyB0aGUgYGBSZXF1aXJlbWVudGBgIGluIGByZXFgLiAgSWYgbm8gc3VpdGFibGUKLSAgICAgICAgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLCBhbmQgYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHJlc3VsdCBvZgotICAgICAgICBjYWxsaW5nIHRoZSBlbnZpcm9ubWVudCdzIGBgb2J0YWluKHJlcSwgaW5zdGFsbGVyKWBgIG1ldGhvZCB3aWxsIGJlCi0gICAgICAgIHJldHVybmVkLgotICAgICAgICAiIiIKLSAgICAgICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQotICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcmV0dXJuIGRpc3QKLSAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKLSAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxOgotICAgICAgICAgICAgICAgIHJldHVybiBkaXN0Ci0gICAgICAgIHJldHVybiBzZWxmLm9idGFpbihyZXEsIGluc3RhbGxlcikgIyB0cnkgYW5kIGRvd25sb2FkL2luc3RhbGwKLQotICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKLSAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgKGUuZy4gdmlhIGRvd25sb2FkKQotCi0gICAgICAgIE9idGFpbiBhIGRpc3RybyB0aGF0IG1hdGNoZXMgcmVxdWlyZW1lbnQgKGUuZy4gdmlhIGRvd25sb2FkKS4gIEluIHRoZQotICAgICAgICBiYXNlIGBgRW52aXJvbm1lbnRgYCBjbGFzcywgdGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucwotICAgICAgICBgYGluc3RhbGxlcihyZXF1aXJlbWVudClgYCwgdW5sZXNzIGBpbnN0YWxsZXJgIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UKLSAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBtZXRob2QgaXMgYSBob29rIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMKLSAgICAgICAgdG8gYXR0ZW1wdCBvdGhlciB3YXlzIG9mIG9idGFpbmluZyBhIGRpc3RyaWJ1dGlvbiBiZWZvcmUgZmFsbGluZyBiYWNrCi0gICAgICAgIHRvIHRoZSBgaW5zdGFsbGVyYCBhcmd1bWVudC4iIiIKLSAgICAgICAgaWYgaW5zdGFsbGVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlcihyZXF1aXJlbWVudCkKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgIiIiWWllbGQgdGhlIHVuaXF1ZSBwcm9qZWN0IG5hbWVzIG9mIHRoZSBhdmFpbGFibGUgZGlzdHJpYnV0aW9ucyIiIgotICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2Rpc3RtYXAua2V5cygpOgotICAgICAgICAgICAgaWYgc2VsZltrZXldOiB5aWVsZCBrZXkKLQotCi0KLQotICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIkluLXBsYWNlIGFkZGl0aW9uIG9mIGEgZGlzdHJpYnV0aW9uIG9yIGVudmlyb25tZW50IiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsRGlzdHJpYnV0aW9uKToKLSAgICAgICAgICAgIHNlbGYuYWRkKG90aGVyKQotICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsRW52aXJvbm1lbnQpOgotICAgICAgICAgICAgZm9yIHByb2plY3QgaW4gb3RoZXI6Ci0gICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gb3RoZXJbcHJvamVjdF06Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGFkZCAlciB0byBlbnZpcm9ubWVudCIgJSAob3RoZXIsKSkKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgIiIiQWRkIGFuIGVudmlyb25tZW50IG9yIGRpc3RyaWJ1dGlvbiB0byBhbiBlbnZpcm9ubWVudCIiIgotICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXyhbXSwgcGxhdGZvcm09Tm9uZSwgcHl0aG9uPU5vbmUpCi0gICAgICAgIGZvciBlbnYgaW4gc2VsZiwgb3RoZXI6Ci0gICAgICAgICAgICBuZXcgKz0gZW52Ci0gICAgICAgIHJldHVybiBuZXcKLQotCi1BdmFpbGFibGVEaXN0cmlidXRpb25zID0gRW52aXJvbm1lbnQgICAgIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCi0KLWNsYXNzIEV4dHJhY3Rpb25FcnJvcihSdW50aW1lRXJyb3IpOgotICAgICIiIkFuIGVycm9yIG9jY3VycmVkIGV4dHJhY3RpbmcgYSByZXNvdXJjZQotCi0gICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZnJvbSBpbnN0YW5jZXMgb2YgdGhpcyBleGNlcHRpb246Ci0KLSAgICBtYW5hZ2VyCi0gICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgcmFpc2VkIHRoaXMgZXhjZXB0aW9uCi0KLSAgICBjYWNoZV9wYXRoCi0gICAgICAgIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgcmVzb3VyY2UgZXh0cmFjdGlvbgotCi0gICAgb3JpZ2luYWxfZXJyb3IKLSAgICAgICAgVGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB0aGF0IGNhdXNlZCBleHRyYWN0aW9uIHRvIGZhaWwKLSAgICAiIiIKLQotCi0KLQotY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgotICAgICIiIk1hbmFnZSByZXNvdXJjZSBleHRyYWN0aW9uIGFuZCBwYWNrYWdlcyIiIgotICAgIGV4dHJhY3Rpb25fcGF0aCA9IE5vbmUKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXMgPSB7fQotCi0gICAgZGVmIHJlc291cmNlX2V4aXN0cyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKLSAgICAgICAgIiIiRG9lcyB0aGUgbmFtZWQgcmVzb3VyY2UgZXhpc3Q/IiIiCi0gICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpCi0KLSAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhbiBleGlzdGluZyBkaXJlY3Rvcnk/IiIiCi0gICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfaXNkaXIoCi0gICAgICAgICAgICByZXNvdXJjZV9uYW1lCi0gICAgICAgICkKLQotICAgIGRlZiByZXNvdXJjZV9maWxlbmFtZShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKLSAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgotICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9maWxlbmFtZSgKLSAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKLSAgICAgICAgKQotCi0gICAgZGVmIHJlc291cmNlX3N0cmVhbShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKLSAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCi0gICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmVhbSgKLSAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKLSAgICAgICAgKQotCi0gICAgZGVmIHJlc291cmNlX3N0cmluZyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKLSAgICAgICAgIiIiUmV0dXJuIHNwZWNpZmllZCByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgotICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJpbmcoCi0gICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCi0gICAgICAgICkKLQotICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgotICAgICAgICAiIiJMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgZGlyZWN0b3J5IiIiCi0gICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfbGlzdGRpcigKLSAgICAgICAgICAgIHJlc291cmNlX25hbWUKLSAgICAgICAgKQotCi0gICAgZGVmIGV4dHJhY3Rpb25fZXJyb3Ioc2VsZik6Ci0gICAgICAgICIiIkdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbXMgZXh0cmFjdGluZyBmaWxlKHMpIiIiCi0KLSAgICAgICAgb2xkX2V4YyA9IHN5cy5leGNfaW5mbygpWzFdCi0gICAgICAgIGNhY2hlX3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCi0KLSAgICAgICAgZXJyID0gRXh0cmFjdGlvbkVycm9yKCIiIkNhbid0IGV4dHJhY3QgZmlsZShzKSB0byBlZ2cgY2FjaGUKLQotVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXh0cmFjdCBmaWxlKHMpIHRvIHRoZSBQeXRob24gZWdnCi1jYWNoZToKLQotICAlcwotCi1UaGUgUHl0aG9uIGVnZyBjYWNoZSBkaXJlY3RvcnkgaXMgY3VycmVudGx5IHNldCB0bzoKLQotICAlcwotCi1QZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8gIFlvdSBjYW4KLWNoYW5nZSB0aGUgY2FjaGUgZGlyZWN0b3J5IGJ5IHNldHRpbmcgdGhlIFBZVEhPTl9FR0dfQ0FDSEUgZW52aXJvbm1lbnQKLXZhcmlhYmxlIHRvIHBvaW50IHRvIGFuIGFjY2Vzc2libGUgZGlyZWN0b3J5LgotIiIiICAgICAgICAgJSAob2xkX2V4YywgY2FjaGVfcGF0aCkKLSAgICAgICAgKQotICAgICAgICBlcnIubWFuYWdlciAgICAgICAgPSBzZWxmCi0gICAgICAgIGVyci5jYWNoZV9wYXRoICAgICA9IGNhY2hlX3BhdGgKLSAgICAgICAgZXJyLm9yaWdpbmFsX2Vycm9yID0gb2xkX2V4YwotICAgICAgICByYWlzZSBlcnIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSAgICBkZWYgZ2V0X2NhY2hlX3BhdGgoc2VsZiwgYXJjaGl2ZV9uYW1lLCBuYW1lcz0oKSk6Ci0gICAgICAgICIiIlJldHVybiBhYnNvbHV0ZSBsb2NhdGlvbiBpbiBjYWNoZSBmb3IgYGFyY2hpdmVfbmFtZWAgYW5kIGBuYW1lc2AKLQotICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIHBhdGggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKLSAgICAgICAgbm90IGFscmVhZHkgZXhpc3QuICBgYXJjaGl2ZV9uYW1lYCBzaG91bGQgYmUgdGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlCi0gICAgICAgIGVuY2xvc2luZyBlZ2cgKHdoaWNoIG1heSBub3QgYmUgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB6aXBmaWxlISksCi0gICAgICAgIGluY2x1ZGluZyBpdHMgIi5lZ2ciIGV4dGVuc2lvbi4gIGBuYW1lc2AsIGlmIHByb3ZpZGVkLCBzaG91bGQgYmUgYQotICAgICAgICBzZXF1ZW5jZSBvZiBwYXRoIG5hbWUgcGFydHMgInVuZGVyIiB0aGUgZWdnJ3MgZXh0cmFjdGlvbiBsb2NhdGlvbi4KLQotICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgcmVzb3VyY2UgcHJvdmlkZXJzIHRoYXQgbmVlZCB0bwotICAgICAgICBvYnRhaW4gYW4gZXh0cmFjdGlvbiBsb2NhdGlvbiwgYW5kIG9ubHkgZm9yIG5hbWVzIHRoZXkgaW50ZW5kIHRvCi0gICAgICAgIGV4dHJhY3QsIGFzIGl0IHRyYWNrcyB0aGUgZ2VuZXJhdGVkIG5hbWVzIGZvciBwb3NzaWJsZSBjbGVhbnVwIGxhdGVyLgotICAgICAgICAiIiIKLSAgICAgICAgZXh0cmFjdF9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQotICAgICAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbihleHRyYWN0X3BhdGgsIGFyY2hpdmVfbmFtZSsnLXRtcCcsICpuYW1lcykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXRfcGF0aCkKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgc2VsZi5leHRyYWN0aW9uX2Vycm9yKCkKLQotICAgICAgICBzZWxmLmNhY2hlZF9maWxlc1t0YXJnZXRfcGF0aF0gPSAxCi0gICAgICAgIHJldHVybiB0YXJnZXRfcGF0aAotCi0KLSAgICBkZWYgcG9zdHByb2Nlc3Moc2VsZiwgdGVtcG5hbWUsIGZpbGVuYW1lKToKLSAgICAgICAgIiIiUGVyZm9ybSBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgcG9zdHByb2Nlc3Npbmcgb2YgYHRlbXBuYW1lYAotCi0gICAgICAgIFRoaXMgaXMgd2hlcmUgTWFjIGhlYWRlciByZXdyaXRlcyBzaG91bGQgYmUgZG9uZTsgb3RoZXIgcGxhdGZvcm1zIGRvbid0Ci0gICAgICAgIGhhdmUgYW55dGhpbmcgc3BlY2lhbCB0aGV5IHNob3VsZCBkby4KLQotICAgICAgICBSZXNvdXJjZSBwcm92aWRlcnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgT05MWSBhZnRlciBzdWNjZXNzZnVsbHkKLSAgICAgICAgZXh0cmFjdGluZyBhIGNvbXByZXNzZWQgcmVzb3VyY2UuICBUaGV5IG11c3QgTk9UIGNhbGwgaXQgb24gcmVzb3VyY2VzCi0gICAgICAgIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGZpbGVzeXN0ZW0uCi0KLSAgICAgICAgYHRlbXBuYW1lYCBpcyB0aGUgY3VycmVudCAodGVtcG9yYXJ5KSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgYGZpbGVuYW1lYAotICAgICAgICBpcyB0aGUgbmFtZSBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gYnkgdGhlIGNhbGxlciBhZnRlciB0aGlzIHJvdXRpbmUKLSAgICAgICAgcmV0dXJucy4KLSAgICAgICAgIiIiCi0gICAgICAgICMgWFhYCi0KLQotICAgIGRlZiBzZXRfZXh0cmFjdGlvbl9wYXRoKHNlbGYsIHBhdGgpOgotICAgICAgICAiIiJTZXQgdGhlIGJhc2UgcGF0aCB3aGVyZSByZXNvdXJjZXMgd2lsbCBiZSBleHRyYWN0ZWQgdG8sIGlmIG5lZWRlZC4KLQotICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGJlZm9yZSBhbnkgZXh0cmFjdGlvbnMgdGFrZSBwbGFjZSwgdGhlCi0gICAgICAgIHBhdGggZGVmYXVsdHMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgYGdldF9kZWZhdWx0X2NhY2hlKClgYC4gIChXaGljaAotICAgICAgICBpcyBiYXNlZCBvbiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdpdGggdmFyaW91cwotICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmYWxsYmFja3MuICBTZWUgdGhhdCByb3V0aW5lJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQotICAgICAgICBkZXRhaWxzLikKLQotICAgICAgICBSZXNvdXJjZXMgYXJlIGV4dHJhY3RlZCB0byBzdWJkaXJlY3RvcmllcyBvZiB0aGlzIHBhdGggYmFzZWQgdXBvbgotICAgICAgICBpbmZvcm1hdGlvbiBnaXZlbiBieSB0aGUgYGBJUmVzb3VyY2VQcm92aWRlcmBgLiAgWW91IG1heSBzZXQgdGhpcyB0byBhCi0gICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGJ1dCB0aGVuIHlvdSBtdXN0IGNhbGwgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgdG8KLSAgICAgICAgZGVsZXRlIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2hlbiBkb25lLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKLSAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSBhbGwgZXh0cmFjdGVkIGZpbGVzLgotCi0gICAgICAgIChOb3RlOiB5b3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGV4dHJhY3Rpb24gcGF0aCBmb3IgYSBnaXZlbiByZXNvdXJjZQotICAgICAgICBtYW5hZ2VyIG9uY2UgcmVzb3VyY2VzIGhhdmUgYmVlbiBleHRyYWN0ZWQsIHVubGVzcyB5b3UgZmlyc3QgY2FsbAotICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYC4pCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLmNhY2hlZF9maWxlczoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCi0gICAgICAgICAgICAgICAgIkNhbid0IGNoYW5nZSBleHRyYWN0aW9uIHBhdGgsIGZpbGVzIGFscmVhZHkgZXh0cmFjdGVkIgotICAgICAgICAgICAgKQotCi0gICAgICAgIHNlbGYuZXh0cmFjdGlvbl9wYXRoID0gcGF0aAotCi0gICAgZGVmIGNsZWFudXBfcmVzb3VyY2VzKHNlbGYsIGZvcmNlPUZhbHNlKToKLSAgICAgICAgIiIiCi0gICAgICAgIERlbGV0ZSBhbGwgZXh0cmFjdGVkIHJlc291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgcmV0dXJuaW5nIGEgbGlzdAotICAgICAgICBvZiB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIHRoYXQgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgotICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbmN1cnJlbmN5IHByb3RlY3Rpb24sIHNvIGl0IHNob3VsZAotICAgICAgICBnZW5lcmFsbHkgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIGEgdGVtcG9yYXJ5Ci0gICAgICAgIGRpcmVjdG9yeSBleGNsdXNpdmUgdG8gYSBzaW5nbGUgcHJvY2Vzcy4gIFRoaXMgbWV0aG9kIGlzIG5vdAotICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGxlZDsgeW91IG11c3QgY2FsbCBpdCBleHBsaWNpdGx5IG9yIHJlZ2lzdGVyIGl0IGFzIGFuCi0gICAgICAgIGBgYXRleGl0YGAgZnVuY3Rpb24gaWYgeW91IHdpc2ggdG8gZW5zdXJlIGNsZWFudXAgb2YgYSB0ZW1wb3JhcnkKLSAgICAgICAgZGlyZWN0b3J5IHVzZWQgZm9yIGV4dHJhY3Rpb25zLgotICAgICAgICAiIiIKLSAgICAgICAgIyBYWFgKLQotCi0KLWRlZiBnZXRfZGVmYXVsdF9jYWNoZSgpOgotICAgICIiIkRldGVybWluZSB0aGUgZGVmYXVsdCBjYWNoZSBsb2NhdGlvbgotCi0gICAgVGhpcyByZXR1cm5zIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0LgotICAgIE90aGVyd2lzZSwgb24gV2luZG93cywgaXQgcmV0dXJucyBhICJQeXRob24tRWdncyIgc3ViZGlyZWN0b3J5IG9mIHRoZQotICAgICJBcHBsaWNhdGlvbiBEYXRhIiBkaXJlY3RvcnkuICBPbiBhbGwgb3RoZXIgc3lzdGVtcywgaXQncyAifi8ucHl0aG9uLWVnZ3MiLgotICAgICIiIgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bJ1BZVEhPTl9FR0dfQ0FDSEUnXQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgcGFzcwotCi0gICAgaWYgb3MubmFtZSE9J250JzoKLSAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcignfi8ucHl0aG9uLWVnZ3MnKQotCi0gICAgYXBwX2RhdGEgPSAnQXBwbGljYXRpb24gRGF0YScgICAjIFhYWCB0aGlzIG1heSBiZSBsb2NhbGUtc3BlY2lmaWMhCi0gICAgYXBwX2hvbWVzID0gWwotICAgICAgICAoKCdBUFBEQVRBJywpLCBOb25lKSwgICAgICAgIyBiZXN0IG9wdGlvbiwgc2hvdWxkIGJlIGxvY2FsZS1zYWZlCi0gICAgICAgICgoJ1VTRVJQUk9GSUxFJywpLCBhcHBfZGF0YSksCi0gICAgICAgICgoJ0hPTUVEUklWRScsJ0hPTUVQQVRIJyksIGFwcF9kYXRhKSwKLSAgICAgICAgKCgnSE9NRVBBVEgnLCksIGFwcF9kYXRhKSwKLSAgICAgICAgKCgnSE9NRScsKSwgTm9uZSksCi0gICAgICAgICgoJ1dJTkRJUicsKSwgYXBwX2RhdGEpLCAgICAjIDk1Lzk4L01FCi0gICAgXQotCi0gICAgZm9yIGtleXMsIHN1YmRpciBpbiBhcHBfaG9tZXM6Ci0gICAgICAgIGRpcm5hbWUgPSAnJwotICAgICAgICBmb3Iga2V5IGluIGtleXM6Ci0gICAgICAgICAgICBpZiBrZXkgaW4gb3MuZW52aXJvbjoKLSAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25ba2V5XSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIHN1YmRpcjoKLSAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsc3ViZGlyKQotICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihkaXJuYW1lLCAnUHl0aG9uLUVnZ3MnKQotICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKLSAgICAgICAgICAgICJQbGVhc2Ugc2V0IHRoZSBQWVRIT05fRUdHX0NBQ0hFIGVudmlyb21lbnQgdmFyaWFibGUiCi0gICAgICAgICkKLQotZGVmIHNhZmVfbmFtZShuYW1lKToKLSAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQotCi0gICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYy8uIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLgotICAgICIiIgotICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCBuYW1lKQotCi0KLWRlZiBzYWZlX3ZlcnNpb24odmVyc2lvbik6Ci0gICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKLQotICAgIFNwYWNlcyBiZWNvbWUgZG90cywgYW5kIGFsbCBvdGhlciBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmVjb21lCi0gICAgZGFzaGVzLCB3aXRoIHJ1bnMgb2YgbXVsdGlwbGUgZGFzaGVzIGNvbmRlbnNlZCB0byBhIHNpbmdsZSBkYXNoLgotICAgICIiIgotICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCcuJykKLSAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgdmVyc2lvbikKLQotCi1kZWYgc2FmZV9leHRyYShleHRyYSk6Ci0gICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgJ2V4dHJhJyBuYW1lCi0KLSAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJ18nLAotICAgIGFuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBsb3dlcmNhc2VkLgotICAgICIiIgotICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJ18nLCBleHRyYSkubG93ZXIoKQotCi0KLWRlZiB0b19maWxlbmFtZShuYW1lKToKLSAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQotCi0gICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCi0gICAgIiIiCi0gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsJ18nKQotCi0KLQotCi0KLQotCi0KLWNsYXNzIE51bGxQcm92aWRlcjoKLSAgICAiIiJUcnkgdG8gaW1wbGVtZW50IHJlc291cmNlcyBhbmQgbWV0YWRhdGEgZm9yIGFyYml0cmFyeSBQRVAgMzAyIGxvYWRlcnMiIiIKLQotICAgIGVnZ19uYW1lID0gTm9uZQotICAgIGVnZ19pbmZvID0gTm9uZQotICAgIGxvYWRlciA9IE5vbmUKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgotICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCi0gICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKLQotICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKQotCi0gICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgIHJldHVybiBTdHJpbmdJTyhzZWxmLmdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSkpCi0KLSAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKLQotICAgIGRlZiBoYXNfcmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCi0KLSAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgotICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sbmFtZSkpCi0KLSAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgotICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfaW5mbzoKLSAgICAgICAgICAgIHJldHVybiAiIgotICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sbmFtZSkpCi0KLSAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgotICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCi0KLSAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZixyZXNvdXJjZV9uYW1lKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQotCi0gICAgZGVmIG1ldGFkYXRhX2lzZGlyKHNlbGYsbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQotCi0KLSAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLHJlc291cmNlX25hbWUpOgotICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLHJlc291cmNlX25hbWUpKQotCi0gICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIoc2VsZixuYW1lKToKLSAgICAgICAgaWYgc2VsZi5lZ2dfaW5mbzoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sbmFtZSkpCi0gICAgICAgIHJldHVybiBbXQotCi0gICAgZGVmIHJ1bl9zY3JpcHQoc2VsZixzY3JpcHRfbmFtZSxuYW1lc3BhY2UpOgotICAgICAgICBzY3JpcHQgPSAnc2NyaXB0cy8nK3NjcmlwdF9uYW1lCi0gICAgICAgIGlmIG5vdCBzZWxmLmhhc19tZXRhZGF0YShzY3JpcHQpOgotICAgICAgICAgICAgcmFpc2UgUmVzb2x1dGlvbkVycm9yKCJObyBzY3JpcHQgbmFtZWQgJXIiICUgc2NyaXB0X25hbWUpCi0gICAgICAgIHNjcmlwdF90ZXh0ID0gc2VsZi5nZXRfbWV0YWRhdGEoc2NyaXB0KS5yZXBsYWNlKCdcclxuJywnXG4nKQotICAgICAgICBzY3JpcHRfdGV4dCA9IHNjcmlwdF90ZXh0LnJlcGxhY2UoJ1xyJywnXG4nKQotICAgICAgICBzY3JpcHRfZmlsZW5hbWUgPSBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLHNjcmlwdCkKLSAgICAgICAgbmFtZXNwYWNlWydfX2ZpbGVfXyddID0gc2NyaXB0X2ZpbGVuYW1lCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNjcmlwdF9maWxlbmFtZSk6Ci0gICAgICAgICAgICBleGVjZmlsZShzY3JpcHRfZmlsZW5hbWUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZnJvbSBsaW5lY2FjaGUgaW1wb3J0IGNhY2hlCi0gICAgICAgICAgICBjYWNoZVtzY3JpcHRfZmlsZW5hbWVdID0gKAotICAgICAgICAgICAgICAgIGxlbihzY3JpcHRfdGV4dCksIDAsIHNjcmlwdF90ZXh0LnNwbGl0KCdcbicpLCBzY3JpcHRfZmlsZW5hbWUKLSAgICAgICAgICAgICkKLSAgICAgICAgICAgIHNjcmlwdF9jb2RlID0gY29tcGlsZShzY3JpcHRfdGV4dCxzY3JpcHRfZmlsZW5hbWUsJ2V4ZWMnKQotICAgICAgICAgICAgZXhlYyBzY3JpcHRfY29kZSBpbiBuYW1lc3BhY2UsIG5hbWVzcGFjZQotCi0gICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCi0gICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgotICAgICAgICApCi0KLSAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAotICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKLSAgICAgICAgKQotCi0gICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAotICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKLSAgICAgICAgKQotCi0gICAgZGVmIF9mbihzZWxmLCBiYXNlLCByZXNvdXJjZV9uYW1lKToKLSAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2VfbmFtZS5zcGxpdCgnLycpKQotCi0gICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6Ci0gICAgICAgIGlmIGhhc2F0dHIoc2VsZi5sb2FkZXIsICdnZXRfZGF0YScpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHBhdGgpCi0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCi0gICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgbG9hZGVycyB3aXRob3V0ICdnZXRfZGF0YSgpJyIKLSAgICAgICAgKQotCi1yZWdpc3Rlcl9sb2FkZXJfdHlwZShvYmplY3QsIE51bGxQcm92aWRlcikKLQotCi1jbGFzcyBFZ2dQcm92aWRlcihOdWxsUHJvdmlkZXIpOgotICAgICIiIlByb3ZpZGVyIGJhc2VkIG9uIGEgdmlydHVhbCBmaWxlc3lzdGVtIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZixtb2R1bGUpOgotICAgICAgICBOdWxsUHJvdmlkZXIuX19pbml0X18oc2VsZixtb2R1bGUpCi0gICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCi0KLSAgICBkZWYgX3NldHVwX3ByZWZpeChzZWxmKToKLSAgICAgICAgIyB3ZSBhc3N1bWUgaGVyZSB0aGF0IG91ciBtZXRhZGF0YSBtYXkgYmUgbmVzdGVkIGluc2lkZSBhICJiYXNrZXQiCi0gICAgICAgICMgb2YgbXVsdGlwbGUgZWdnczsgdGhhdCdzIHdoeSB3ZSB1c2UgbW9kdWxlX3BhdGggaW5zdGVhZCBvZiAuYXJjaGl2ZQotICAgICAgICBwYXRoID0gc2VsZi5tb2R1bGVfcGF0aAotICAgICAgICBvbGQgPSBOb25lCi0gICAgICAgIHdoaWxlIHBhdGghPW9sZDoKLSAgICAgICAgICAgIGlmIHBhdGgubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgotICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCi0gICAgICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nKQotICAgICAgICAgICAgICAgIHNlbGYuZWdnX3Jvb3QgPSBwYXRoCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIG9sZCA9IHBhdGgKLSAgICAgICAgICAgIHBhdGgsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCi0KLQotCi0KLQotCi0KLQotY2xhc3MgRGVmYXVsdFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKLSAgICAiIiJQcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMgaW4gdGhlIGZpbGVzeXN0ZW0iIiIKLQotICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgotICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKLQotICAgIGRlZiBfaXNkaXIoc2VsZixwYXRoKToKLSAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNkaXIocGF0aCkKLQotICAgIGRlZiBfbGlzdGRpcihzZWxmLHBhdGgpOgotICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQotCi0gICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgIHJldHVybiBvcGVuKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpLCAncmInKQotCi0gICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6Ci0gICAgICAgIHN0cmVhbSA9IG9wZW4ocGF0aCwgJ3JiJykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCi0KLXJlZ2lzdGVyX2xvYWRlcl90eXBlKHR5cGUoTm9uZSksIERlZmF1bHRQcm92aWRlcikKLQotCi1jbGFzcyBFbXB0eVByb3ZpZGVyKE51bGxQcm92aWRlcik6Ci0gICAgIiIiUHJvdmlkZXIgdGhhdCByZXR1cm5zIG5vdGhpbmcgZm9yIGFsbCByZXF1ZXN0cyIiIgotCi0gICAgX2lzZGlyID0gX2hhcyA9IGxhbWJkYSBzZWxmLHBhdGg6IEZhbHNlCi0gICAgX2dldCAgICAgICAgICA9IGxhbWJkYSBzZWxmLHBhdGg6ICcnCi0gICAgX2xpc3RkaXIgICAgICA9IGxhbWJkYSBzZWxmLHBhdGg6IFtdCi0gICAgbW9kdWxlX3BhdGggICA9IE5vbmUKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi1lbXB0eV9wcm92aWRlciA9IEVtcHR5UHJvdmlkZXIoKQotCi0KLQotCi1jbGFzcyBaaXBQcm92aWRlcihFZ2dQcm92aWRlcik6Ci0gICAgIiIiUmVzb3VyY2Ugc3VwcG9ydCBmb3IgemlwcyBhbmQgZWdncyIiIgotCi0gICAgZWFnZXJzID0gTm9uZQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6Ci0gICAgICAgIEVnZ1Byb3ZpZGVyLl9faW5pdF9fKHNlbGYsbW9kdWxlKQotICAgICAgICBzZWxmLnppcGluZm8gPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbc2VsZi5sb2FkZXIuYXJjaGl2ZV0KLSAgICAgICAgc2VsZi56aXBfcHJlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZStvcy5zZXAKLQotICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6Ci0gICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEgemlwZmlsZSBzdWJwYXRoCi0gICAgICAgICMgdXNhYmxlIHdpdGggdGhlIHppcGltcG9ydCBkaXJlY3RvcnkgY2FjaGUgZm9yIG91ciB0YXJnZXQgYXJjaGl2ZQotICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgotICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCi0gICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAotICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCxzZWxmLnppcF9wcmUpCi0gICAgICAgICkKLQotICAgIGRlZiBfcGFydHMoc2VsZix6aXBfcGF0aCk6Ci0gICAgICAgICMgQ29udmVydCBhIHppcGZpbGUgc3VicGF0aCBpbnRvIGFuIGVnZy1yZWxhdGl2ZSBwYXRoIHBhcnQgbGlzdAotICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUremlwX3BhdGggICMgcHNldWRvLWZzIHBhdGgKLSAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCtvcy5zZXApOgotICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkrMTpdLnNwbGl0KG9zLnNlcCkKLSAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCi0gICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLHNlbGYuZWdnX3Jvb3QpCi0gICAgICAgICkKLQotICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgIGlmIG5vdCBzZWxmLmVnZ19uYW1lOgotICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKLSAgICAgICAgICAgICAgICAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90IC56aXAiCi0gICAgICAgICAgICApCi0gICAgICAgICMgbm8gbmVlZCB0byBsb2NrIGZvciBleHRyYWN0aW9uLCBzaW5jZSB3ZSB1c2UgdGVtcCBuYW1lcwotICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3Jlc291cmNlX3RvX3ppcChyZXNvdXJjZV9uYW1lKQotICAgICAgICBlYWdlcnMgPSBzZWxmLl9nZXRfZWFnZXJfcmVzb3VyY2VzKCkKLSAgICAgICAgaWYgJy8nLmpvaW4oc2VsZi5fcGFydHMoemlwX3BhdGgpKSBpbiBlYWdlcnM6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBlYWdlcnM6Ci0gICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCBzZWxmLl9lYWdlcl90b196aXAobmFtZSkpCi0gICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHppcF9wYXRoKQotCi0gICAgZGVmIF9leHRyYWN0X3Jlc291cmNlKHNlbGYsIG1hbmFnZXIsIHppcF9wYXRoKToKLQotICAgICAgICBpZiB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpOgotICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5faW5kZXgoKVt6aXBfcGF0aF06Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIG9zLnBhdGguam9pbih6aXBfcGF0aCwgbmFtZSkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGxhc3QpICAjIHJldHVybiB0aGUgZXh0cmFjdGVkIGRpcmVjdG9yeSBuYW1lCi0KLSAgICAgICAgemlwX3N0YXQgPSBzZWxmLnppcGluZm9bemlwX3BhdGhdCi0gICAgICAgIHQsZCxzaXplID0gemlwX3N0YXRbNV0sIHppcF9zdGF0WzZdLCB6aXBfc3RhdFszXQotICAgICAgICBkYXRlX3RpbWUgPSAoCi0gICAgICAgICAgICAoZD4+OSkrMTk4MCwgKGQ+PjUpJjB4RiwgZCYweDFGLCAgICAgICAgICAgICAgICAgICAgICAjIHltZAotICAgICAgICAgICAgKHQmMHhGRkZGKT4+MTEsICh0Pj41KSYweDNGLCAodCYweDFGKSAqIDIsIDAsIDAsIC0xICAgIyBobXMsIGV0Yy4KLSAgICAgICAgKQotICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLm1rdGltZShkYXRlX3RpbWUpCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVhbF9wYXRoID0gbWFuYWdlci5nZXRfY2FjaGVfcGF0aCgKLSAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lLCBzZWxmLl9wYXJ0cyh6aXBfcGF0aCkKLSAgICAgICAgICAgICkKLQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKLSAgICAgICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChyZWFsX3BhdGgpCi0gICAgICAgICAgICAgICAgaWYgc3RhdC5zdF9zaXplPT1zaXplIGFuZCBzdGF0LnN0X210aW1lPT10aW1lc3RhbXA6Ci0gICAgICAgICAgICAgICAgICAgICMgc2l6ZSBhbmQgc3RhbXAgbWF0Y2gsIGRvbid0IGJvdGhlciBleHRyYWN0aW5nCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKLQotICAgICAgICAgICAgb3V0ZiwgdG1wbmFtID0gX21rc3RlbXAoIi4kZXh0cmFjdCIsIGRpcj1vcy5wYXRoLmRpcm5hbWUocmVhbF9wYXRoKSkKLSAgICAgICAgICAgIG9zLndyaXRlKG91dGYsIHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKSkKLSAgICAgICAgICAgIG9zLmNsb3NlKG91dGYpCi0gICAgICAgICAgICB1dGltZSh0bXBuYW0sICh0aW1lc3RhbXAsdGltZXN0YW1wKSkKLSAgICAgICAgICAgIG1hbmFnZXIucG9zdHByb2Nlc3ModG1wbmFtLCByZWFsX3BhdGgpCi0KLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCi0KLSAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShyZWFsX3BhdGgpOgotICAgICAgICAgICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChyZWFsX3BhdGgpCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgc3RhdC5zdF9zaXplPT1zaXplIGFuZCBzdGF0LnN0X210aW1lPT10aW1lc3RhbXA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIHNpemUgYW5kIHN0YW1wIG1hdGNoLCBzb21lYm9keSBkaWQgaXQganVzdCBhaGVhZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgIyB1cywgc28gd2UncmUgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAotICAgICAgICAgICAgICAgICAgICBlbGlmIG9zLm5hbWU9PSdudCc6ICAgICAjIFdpbmRvd3MsIGRlbCBvbGQgZmlsZSBhbmQgcmV0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHVubGluayhyZWFsX3BhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCi0gICAgICAgICAgICAgICAgcmFpc2UKLQotICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICBtYW5hZ2VyLmV4dHJhY3Rpb25fZXJyb3IoKSAgIyByZXBvcnQgYSB1c2VyLWZyaWVuZGx5IGVycm9yCi0KLSAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAotCi0gICAgZGVmIF9nZXRfZWFnZXJfcmVzb3VyY2VzKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmVhZ2VycyBpcyBOb25lOgotICAgICAgICAgICAgZWFnZXJzID0gW10KLSAgICAgICAgICAgIGZvciBuYW1lIGluICgnbmF0aXZlX2xpYnMudHh0JywgJ2VhZ2VyX3Jlc291cmNlcy50eHQnKToKLSAgICAgICAgICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKLSAgICAgICAgICAgICAgICAgICAgZWFnZXJzLmV4dGVuZChzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKSkKLSAgICAgICAgICAgIHNlbGYuZWFnZXJzID0gZWFnZXJzCi0gICAgICAgIHJldHVybiBzZWxmLmVhZ2VycwotCi0gICAgZGVmIF9pbmRleChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmluZGV4Ci0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIGluZCA9IHt9Ci0gICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnppcGluZm86Ci0gICAgICAgICAgICAgICAgcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKLSAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gb3Muc2VwLmpvaW4ocGFydHNbOi0xXSkKLSAgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50IGluIGluZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdLmFwcGVuZChwYXJ0c1stMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0gPSBbcGFydHMucG9wKCldCi0gICAgICAgICAgICBzZWxmLl9kaXJpbmRleCA9IGluZAotICAgICAgICAgICAgcmV0dXJuIGluZAotCi0gICAgZGVmIF9oYXMoc2VsZiwgZnNwYXRoKToKLSAgICAgICAgemlwX3BhdGggPSBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKQotICAgICAgICByZXR1cm4gemlwX3BhdGggaW4gc2VsZi56aXBpbmZvIG9yIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCkKLQotICAgIGRlZiBfaXNkaXIoc2VsZixmc3BhdGgpOgotICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkgaW4gc2VsZi5faW5kZXgoKQotCi0gICAgZGVmIF9saXN0ZGlyKHNlbGYsZnNwYXRoKToKLSAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5faW5kZXgoKS5nZXQoc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCksICgpKSkKLQotICAgIGRlZiBfZWFnZXJfdG9femlwKHNlbGYscmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5lZ2dfcm9vdCxyZXNvdXJjZV9uYW1lKSkKLQotICAgIGRlZiBfcmVzb3VyY2VfdG9femlwKHNlbGYscmVzb3VyY2VfbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCxyZXNvdXJjZV9uYW1lKSkKLQotcmVnaXN0ZXJfbG9hZGVyX3R5cGUoemlwaW1wb3J0LnppcGltcG9ydGVyLCBaaXBQcm92aWRlcikKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWNsYXNzIEZpbGVNZXRhZGF0YShFbXB0eVByb3ZpZGVyKToKLSAgICAiIiJNZXRhZGF0YSBoYW5kbGVyIGZvciBzdGFuZGFsb25lIFBLRy1JTkZPIGZpbGVzCi0KLSAgICBVc2FnZTo6Ci0KLSAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoIi9wYXRoL3RvL1BLRy1JTkZPIikKLQotICAgIFRoaXMgcHJvdmlkZXIgcmVqZWN0cyBhbGwgZGF0YSBhbmQgbWV0YWRhdGEgcmVxdWVzdHMgZXhjZXB0IGZvciBQS0ctSU5GTywKLSAgICB3aGljaCBpcyB0cmVhdGVkIGFzIGV4aXN0aW5nLCBhbmQgd2lsbCBiZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXQKLSAgICB0aGUgcHJvdmlkZWQgbG9jYXRpb24uCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZixwYXRoKToKLSAgICAgICAgc2VsZi5wYXRoID0gcGF0aAotCi0gICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLG5hbWUpOgotICAgICAgICByZXR1cm4gbmFtZT09J1BLRy1JTkZPJwotCi0gICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLG5hbWUpOgotICAgICAgICBpZiBuYW1lPT0nUEtHLUlORk8nOgotICAgICAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5wYXRoLCdyVScpLnJlYWQoKQotICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gbWV0YWRhdGEgZXhjZXB0IFBLRy1JTkZPIGlzIGF2YWlsYWJsZSIpCi0KLSAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsbmFtZSk6Ci0gICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotY2xhc3MgUGF0aE1ldGFkYXRhKERlZmF1bHRQcm92aWRlcik6Ci0gICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIGVnZyBkaXJlY3RvcmllcwotCi0gICAgVXNhZ2U6OgotCi0gICAgICAgICMgRGV2ZWxvcG1lbnQgZWdnczoKLQotICAgICAgICBlZ2dfaW5mbyA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS5lZ2ctaW5mbyIKLSAgICAgICAgYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pCi0gICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKLSAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KLSAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihiYXNlZGlyLHByb2plY3RfbmFtZT1kaXN0X25hbWUsbWV0YWRhdGE9bWV0YWRhdGEpCi0KLSAgICAgICAgIyBVbnBhY2tlZCBlZ2cgZGlyZWN0b3JpZXM6Ci0KLSAgICAgICAgZWdnX3BhdGggPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUtdmVyLXB5dmVyLWV0Yy5lZ2ciCi0gICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCi0gICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCi0gICAgIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVnZ19pbmZvKToKLSAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IHBhdGgKLSAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVnZ19pbmZvCi0KLQotY2xhc3MgRWdnTWV0YWRhdGEoWmlwUHJvdmlkZXIpOgotICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciAuZWdnIGZpbGVzIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wb3J0ZXIpOgotICAgICAgICAiIiJDcmVhdGUgYSBtZXRhZGF0YSBwcm92aWRlciBmcm9tIGEgemlwaW1wb3J0ZXIiIiIKLQotICAgICAgICBzZWxmLnppcGluZm8gPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbaW1wb3J0ZXIuYXJjaGl2ZV0KLSAgICAgICAgc2VsZi56aXBfcHJlID0gaW1wb3J0ZXIuYXJjaGl2ZStvcy5zZXAKLSAgICAgICAgc2VsZi5sb2FkZXIgPSBpbXBvcnRlcgotICAgICAgICBpZiBpbXBvcnRlci5wcmVmaXg6Ci0gICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5qb2luKGltcG9ydGVyLmFyY2hpdmUsIGltcG9ydGVyLnByZWZpeCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBpbXBvcnRlci5hcmNoaXZlCi0gICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCi0KLQotCi1fZGlzdHJpYnV0aW9uX2ZpbmRlcnMgPSB7fQotCi1kZWYgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGVyX3R5cGUsIGRpc3RyaWJ1dGlvbl9maW5kZXIpOgotICAgICIiIlJlZ2lzdGVyIGBkaXN0cmlidXRpb25fZmluZGVyYCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMgaW4gc3lzLnBhdGggaXRlbXMKLQotICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQotICAgIGhhbmRsZXIpLCBhbmQgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIGlzIGEgY2FsbGFibGUgdGhhdCwgcGFzc2VkIGEgcGF0aAotICAgIGl0ZW0gYW5kIHRoZSBpbXBvcnRlciBpbnN0YW5jZSwgeWllbGRzIGBgRGlzdHJpYnV0aW9uYGAgaW5zdGFuY2VzIGZvdW5kIG9uCi0gICAgdGhhdCBwYXRoIGl0ZW0uICBTZWUgYGBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aGBgIGZvciBhbiBleGFtcGxlLiIiIgotICAgIF9kaXN0cmlidXRpb25fZmluZGVyc1tpbXBvcnRlcl90eXBlXSA9IGRpc3RyaWJ1dGlvbl9maW5kZXIKLQotCi1kZWYgZmluZF9kaXN0cmlidXRpb25zKHBhdGhfaXRlbSwgb25seT1GYWxzZSk6Ci0gICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIHZpYSBgcGF0aF9pdGVtYCIiIgotICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKLSAgICBmaW5kZXIgPSBfZmluZF9hZGFwdGVyKF9kaXN0cmlidXRpb25fZmluZGVycywgaW1wb3J0ZXIpCi0gICAgcmV0dXJuIGZpbmRlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KQotCi1kZWYgZmluZF9pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6Ci0gICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YShpbXBvcnRlcikKLSAgICBpZiBtZXRhZGF0YS5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6Ci0gICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKHBhdGhfaXRlbSwgbWV0YWRhdGE9bWV0YWRhdGEpCi0gICAgaWYgb25seToKLSAgICAgICAgcmV0dXJuICAjIGRvbid0IHlpZWxkIG5lc3RlZCBkaXN0cm9zCi0gICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgotICAgICAgICBpZiBzdWJpdGVtLmVuZHN3aXRoKCcuZWdnJyk6Ci0gICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKLSAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfaW5femlwKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSwgc3VicGF0aCk6Ci0gICAgICAgICAgICAgICAgeWllbGQgZGlzdAotCi1yZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaW5kX2luX3ppcCkKLQotZGVmIFN0cmluZ0lPKCphcmdzLCAqKmt3KToKLSAgICAiIiJUaHVuayB0byBsb2FkIHRoZSByZWFsIFN0cmluZ0lPIG9uIGRlbWFuZCIiIgotICAgIGdsb2JhbCBTdHJpbmdJTwotICAgIHRyeToKLSAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotICAgIHJldHVybiBTdHJpbmdJTygqYXJncywqKmt3KQotCi1kZWYgZmluZF9ub3RoaW5nKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgotICAgIHJldHVybiAoKQotcmVnaXN0ZXJfZmluZGVyKG9iamVjdCxmaW5kX25vdGhpbmcpCi0KLWRlZiBmaW5kX29uX3BhdGgoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6Ci0gICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIG9uIGEgc3lzLnBhdGggZGlyZWN0b3J5IiIiCi0gICAgcGF0aF9pdGVtID0gX25vcm1hbGl6ZV9jYWNoZWQocGF0aF9pdGVtKQotCi0gICAgaWYgb3MucGF0aC5pc2RpcihwYXRoX2l0ZW0pOgotICAgICAgICBpZiBwYXRoX2l0ZW0ubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgotICAgICAgICAgICAgIyB1bnBhY2tlZCBlZ2cKLSAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAotICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgbWV0YWRhdGE9UGF0aE1ldGFkYXRhKAotICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG9zLnBhdGguam9pbihwYXRoX2l0ZW0sJ0VHRy1JTkZPJykKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIHNjYW4gZm9yIC5lZ2cgYW5kIC5lZ2ctaW5mbyBpbiBkaXJlY3RvcnkKLSAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHBhdGhfaXRlbSk6Ci0gICAgICAgICAgICAgICAgbG93ZXIgPSBlbnRyeS5sb3dlcigpCi0gICAgICAgICAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgotICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KQotICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxwYXRoKToKLSAgICAgICAgICAgICAgICAgICAgICAgICMgZWdnLWluZm8gZGlyZWN0b3J5LCBhbGxvdyBnZXR0aW5nIG1ldGFkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShwYXRoX2l0ZW0sIGZ1bGxwYXRoKQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoZnVsbHBhdGgpCi0gICAgICAgICAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLGVudHJ5LG1ldGFkYXRhLHByZWNlZGVuY2U9REVWRUxPUF9ESVNUCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZycpOgotICAgICAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKLSAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZy1saW5rJyk6Ci0gICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0cmlwKCk6IGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMobGluZS5yc3RyaXAoKSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQotCi1yZWdpc3Rlcl9maW5kZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmluZF9vbl9wYXRoKQotCi1fbmFtZXNwYWNlX2hhbmRsZXJzID0ge30KLV9uYW1lc3BhY2VfcGFja2FnZXMgPSB7fQotCi1kZWYgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXJfdHlwZSwgbmFtZXNwYWNlX2hhbmRsZXIpOgotICAgICIiIlJlZ2lzdGVyIGBuYW1lc3BhY2VfaGFuZGxlcmAgdG8gZGVjbGFyZSBuYW1lc3BhY2UgcGFja2FnZXMKLQotICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQotICAgIGhhbmRsZXIpLCBhbmQgYG5hbWVzcGFjZV9oYW5kbGVyYCBpcyBhIGNhbGxhYmxlIGxpa2UgdGhpczo6Ci0KLSAgICAgICAgZGVmIG5hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyLHBhdGhfZW50cnksbW9kdWxlTmFtZSxtb2R1bGUpOgotICAgICAgICAgICAgIyByZXR1cm4gYSBwYXRoX2VudHJ5IHRvIHVzZSBmb3IgY2hpbGQgcGFja2FnZXMKLQotICAgIE5hbWVzcGFjZSBoYW5kbGVycyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGltcG9ydGVyIG9iamVjdCBoYXMgYWxyZWFkeQotICAgIGFncmVlZCB0aGF0IGl0IGNhbiBoYW5kbGUgdGhlIHJlbGV2YW50IHBhdGggaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG9ubHkKLSAgICByZXR1cm4gYSBzdWJwYXRoIGlmIHRoZSBtb2R1bGUgX19wYXRoX18gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuCi0gICAgZXF1aXZhbGVudCBzdWJwYXRoLiAgRm9yIGFuIGV4YW1wbGUgbmFtZXNwYWNlIGhhbmRsZXIsIHNlZQotICAgIGBgcGtnX3Jlc291cmNlcy5maWxlX25zX2hhbmRsZXJgYC4KLSAgICAiIiIKLSAgICBfbmFtZXNwYWNlX2hhbmRsZXJzW2ltcG9ydGVyX3R5cGVdID0gbmFtZXNwYWNlX2hhbmRsZXIKLQotZGVmIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSk6Ci0gICAgIiIiRW5zdXJlIHRoYXQgbmFtZWQgcGFja2FnZSBpbmNsdWRlcyBhIHN1YnBhdGggb2YgcGF0aF9pdGVtIChpZiBuZWVkZWQpIiIiCi0gICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQotICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6Ci0gICAgICAgIHJldHVybiBOb25lCi0gICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUocGFja2FnZU5hbWUpCi0gICAgaWYgbG9hZGVyIGlzIE5vbmU6Ci0gICAgICAgIHJldHVybiBOb25lCi0gICAgbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KHBhY2thZ2VOYW1lKQotICAgIGlmIG1vZHVsZSBpcyBOb25lOgotICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0gPSBuZXcubW9kdWxlKHBhY2thZ2VOYW1lKQotICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbXTsgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpCi0gICAgZWxpZiBub3QgaGFzYXR0cihtb2R1bGUsJ19fcGF0aF9fJyk6Ci0gICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYWNrYWdlTmFtZSkKLSAgICBoYW5kbGVyID0gX2ZpbmRfYWRhcHRlcihfbmFtZXNwYWNlX2hhbmRsZXJzLCBpbXBvcnRlcikKLSAgICBzdWJwYXRoID0gaGFuZGxlcihpbXBvcnRlcixwYXRoX2l0ZW0scGFja2FnZU5hbWUsbW9kdWxlKQotICAgIGlmIHN1YnBhdGggaXMgbm90IE5vbmU6Ci0gICAgICAgIHBhdGggPSBtb2R1bGUuX19wYXRoX187IHBhdGguYXBwZW5kKHN1YnBhdGgpCi0gICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShwYWNrYWdlTmFtZSk7IG1vZHVsZS5fX3BhdGhfXyA9IHBhdGgKLSAgICByZXR1cm4gc3VicGF0aAotCi1kZWYgZGVjbGFyZV9uYW1lc3BhY2UocGFja2FnZU5hbWUpOgotICAgICIiIkRlY2xhcmUgdGhhdCBwYWNrYWdlICdwYWNrYWdlTmFtZScgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSIiIgotCi0gICAgaW1wLmFjcXVpcmVfbG9jaygpCi0gICAgdHJ5OgotICAgICAgICBpZiBwYWNrYWdlTmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgcGF0aCwgcGFyZW50ID0gc3lzLnBhdGgsIE5vbmUKLSAgICAgICAgaWYgJy4nIGluIHBhY2thZ2VOYW1lOgotICAgICAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFja2FnZU5hbWUuc3BsaXQoJy4nKVs6LTFdKQotICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGFyZW50KQotICAgICAgICAgICAgX19pbXBvcnRfXyhwYXJlbnQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW3BhcmVudF0uX19wYXRoX18KLSAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFyZW50KQotCi0gICAgICAgICMgVHJhY2sgd2hhdCBwYWNrYWdlcyBhcmUgbmFtZXNwYWNlcywgc28gd2hlbiBuZXcgcGF0aCBpdGVtcyBhcmUgYWRkZWQsCi0gICAgICAgICMgdGhleSBjYW4gYmUgdXBkYXRlZAotICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFyZW50LFtdKS5hcHBlbmQocGFja2FnZU5hbWUpCi0gICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYWNrYWdlTmFtZSxbXSkKLQotICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHBhdGg6Ci0gICAgICAgICAgICAjIEVuc3VyZSBhbGwgdGhlIHBhcmVudCdzIHBhdGggaXRlbXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgY2hpbGQsCi0gICAgICAgICAgICAjIGlmIHRoZXkgYXBwbHkKLSAgICAgICAgICAgIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSkKLQotICAgIGZpbmFsbHk6Ci0gICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQotCi1kZWYgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHBhdGhfaXRlbSwgcGFyZW50PU5vbmUpOgotICAgICIiIkVuc3VyZSB0aGF0IHByZXZpb3VzbHktZGVjbGFyZWQgbmFtZXNwYWNlIHBhY2thZ2VzIGluY2x1ZGUgcGF0aF9pdGVtIiIiCi0gICAgaW1wLmFjcXVpcmVfbG9jaygpCi0gICAgdHJ5OgotICAgICAgICBmb3IgcGFja2FnZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzLmdldChwYXJlbnQsKCkpOgotICAgICAgICAgICAgc3VicGF0aCA9IF9oYW5kbGVfbnMocGFja2FnZSwgcGF0aF9pdGVtKQotICAgICAgICAgICAgaWYgc3VicGF0aDogZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHN1YnBhdGgscGFja2FnZSkKLSAgICBmaW5hbGx5OgotICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKLQotZGVmIGZpbGVfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKLSAgICAiIiJDb21wdXRlIGFuIG5zLXBhY2thZ2Ugc3VicGF0aCBmb3IgYSBmaWxlc3lzdGVtIG9yIHppcGZpbGUgaW1wb3J0ZXIiIiIKLQotICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBwYWNrYWdlTmFtZS5zcGxpdCgnLicpWy0xXSkKLSAgICBub3JtYWxpemVkID0gX25vcm1hbGl6ZV9jYWNoZWQoc3VicGF0aCkKLSAgICBmb3IgaXRlbSBpbiBtb2R1bGUuX19wYXRoX186Ci0gICAgICAgIGlmIF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pPT1ub3JtYWxpemVkOgotICAgICAgICAgICAgYnJlYWsKLSAgICBlbHNlOgotICAgICAgICAjIE9ubHkgcmV0dXJuIHRoZSBwYXRoIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKLSAgICAgICAgcmV0dXJuIHN1YnBhdGgKLQotcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQotcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCi0KLQotZGVmIG51bGxfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKLSAgICByZXR1cm4gTm9uZQotCi1yZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihvYmplY3QsbnVsbF9uc19oYW5kbGVyKQotCi0KLWRlZiBub3JtYWxpemVfcGF0aChmaWxlbmFtZSk6Ci0gICAgIiIiTm9ybWFsaXplIGEgZmlsZS9kaXIgbmFtZSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcyIiIgotICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoZmlsZW5hbWUpKQotCi1kZWYgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUsX2NhY2hlPXt9KToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBfY2FjaGVbZmlsZW5hbWVdCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBfY2FjaGVbZmlsZW5hbWVdID0gcmVzdWx0ID0gbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotZGVmIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKToKLSAgICBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCcuJykKLSAgICBuYW1lID0gcGFydHMucG9wKCkKLSAgICBpZiBwYXJ0czoKLSAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFydHMpCi0gICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbcGFyZW50XSwgbmFtZSwgc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdKQotCi0KLWRlZiB5aWVsZF9saW5lcyhzdHJzKToKLSAgICAiIiJZaWVsZCBub24tZW1wdHkvbm9uLWNvbW1lbnQgbGluZXMgb2YgYSBgYGJhc2VzdHJpbmdgYCBvciBzZXF1ZW5jZSIiIgotICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToKLSAgICAgICAgZm9yIHMgaW4gc3Rycy5zcGxpdGxpbmVzKCk6Ci0gICAgICAgICAgICBzID0gcy5zdHJpcCgpCi0gICAgICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcjJyk6ICAgICAjIHNraXAgYmxhbmsgbGluZXMvY29tbWVudHMKLSAgICAgICAgICAgICAgICB5aWVsZCBzCi0gICAgZWxzZToKLSAgICAgICAgZm9yIHNzIGluIHN0cnM6Ci0gICAgICAgICAgICBmb3IgcyBpbiB5aWVsZF9saW5lcyhzcyk6Ci0gICAgICAgICAgICAgICAgeWllbGQgcwotCi1MSU5FX0VORCA9IHJlLmNvbXBpbGUociJccyooIy4qKT8kIikubWF0Y2ggICAgICAgICAjIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQKLUNPTlRJTlVFID0gcmUuY29tcGlsZShyIlxzKlxcXHMqKCMuKik/JCIpLm1hdGNoICAgICMgbGluZSBjb250aW51YXRpb24KLURJU1RSTyAgID0gcmUuY29tcGlsZShyIlxzKigoXHd8Wy0uXSkrKSIpLm1hdGNoICAgICMgRGlzdHJpYnV0aW9uIG9yIGV4dHJhCi1WRVJTSU9OICA9IHJlLmNvbXBpbGUociJccyooPD0/fD49P3w9PXwhPSlccyooKFx3fFstLl0pKykiKS5tYXRjaCAgIyB2ZXIuIGluZm8KLUNPTU1BICAgID0gcmUuY29tcGlsZShyIlxzKiwiKS5tYXRjaCAgICAgICAgICAgICAgICMgY29tbWEgYmV0d2VlbiBpdGVtcwotT0JSQUNLRVQgPSByZS5jb21waWxlKHIiXHMqXFsiKS5tYXRjaAotQ0JSQUNLRVQgPSByZS5jb21waWxlKHIiXHMqXF0iKS5tYXRjaAotTU9EVUxFICAgPSByZS5jb21waWxlKHIiXHcrKFwuXHcrKSokIikubWF0Y2gKLUVHR19OQU1FID0gcmUuY29tcGlsZSgKLSAgICByIig/UDxuYW1lPlteLV0rKSIKLSAgICByIiggLSg/UDx2ZXI+W14tXSspICgtcHkoP1A8cHl2ZXI+W14tXSspICgtKD9QPHBsYXQ+LispKT8gKT8gKT8iLAotICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFCi0pLm1hdGNoCi0KLWNvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUocicoXGQrIHwgW2Etel0rIHwgXC58IC0pJywgcmUuVkVSQk9TRSkKLXJlcGxhY2UgPSB7J3ByZSc6J2MnLCAncHJldmlldyc6J2MnLCctJzonZmluYWwtJywncmMnOidjJ30uZ2V0Ci0KLWRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKLSAgICBmb3IgcGFydCBpbiBjb21wb25lbnRfcmUuc3BsaXQocyk6Ci0gICAgICAgIHBhcnQgPSByZXBsYWNlKHBhcnQscGFydCkKLSAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydD09Jy4nOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgcGFydFs6MV0gaW4gJzAxMjM0NTY3ODknOgotICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KSAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB5aWVsZCAnKicrcGFydAotCi0gICAgeWllbGQgJypmaW5hbCcgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAotCi1kZWYgcGFyc2VfdmVyc2lvbihzKToKLSAgICAiIiJDb252ZXJ0IGEgdmVyc2lvbiBzdHJpbmcgdG8gYSBjaHJvbm9sb2dpY2FsbHktc29ydGFibGUga2V5Ci0KLSAgICBUaGlzIGlzIGEgcm91Z2ggY3Jvc3MgYmV0d2VlbiBkaXN0dXRpbHMnIFN0cmljdFZlcnNpb24gYW5kIExvb3NlVmVyc2lvbjsKLSAgICBpZiB5b3UgZ2l2ZSBpdCB2ZXJzaW9ucyB0aGF0IHdvdWxkIHdvcmsgd2l0aCBTdHJpY3RWZXJzaW9uLCB0aGVuIGl0IGJlaGF2ZXMKLSAgICB0aGUgc2FtZTsgb3RoZXJ3aXNlIGl0IGFjdHMgbGlrZSBhIHNsaWdodGx5LXNtYXJ0ZXIgTG9vc2VWZXJzaW9uLiBJdCBpcwotICAgICpwb3NzaWJsZSogdG8gY3JlYXRlIHBhdGhvbG9naWNhbCB2ZXJzaW9uIGNvZGluZyBzY2hlbWVzIHRoYXQgd2lsbCBmb29sCi0gICAgdGhpcyBwYXJzZXIsIGJ1dCB0aGV5IHNob3VsZCBiZSB2ZXJ5IHJhcmUgaW4gcHJhY3RpY2UuCi0KLSAgICBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBhIHR1cGxlIG9mIHN0cmluZ3MuICBOdW1lcmljIHBvcnRpb25zIG9mIHRoZQotICAgIHZlcnNpb24gYXJlIHBhZGRlZCB0byA4IGRpZ2l0cyBzbyB0aGV5IHdpbGwgY29tcGFyZSBudW1lcmljYWxseSwgYnV0Ci0gICAgd2l0aG91dCByZWx5aW5nIG9uIGhvdyBudW1iZXJzIGNvbXBhcmUgcmVsYXRpdmUgdG8gc3RyaW5ncy4gIERvdHMgYXJlCi0gICAgZHJvcHBlZCwgYnV0IGRhc2hlcyBhcmUgcmV0YWluZWQuICBUcmFpbGluZyB6ZXJvcyBiZXR3ZWVuIGFscGhhIHNlZ21lbnRzCi0gICAgb3IgZGFzaGVzIGFyZSBzdXBwcmVzc2VkLCBzbyB0aGF0IGUuZy4gIjIuNC4wIiBpcyBjb25zaWRlcmVkIHRoZSBzYW1lIGFzCi0gICAgIjIuNCIuIEFscGhhbnVtZXJpYyBwYXJ0cyBhcmUgbG93ZXItY2FzZWQuCi0KLSAgICBUaGUgYWxnb3JpdGhtIGFzc3VtZXMgdGhhdCBzdHJpbmdzIGxpa2UgIi0iIGFuZCBhbnkgYWxwaGEgc3RyaW5nIHRoYXQKLSAgICBhbHBoYWJldGljYWxseSBmb2xsb3dzICJmaW5hbCIgIHJlcHJlc2VudHMgYSAicGF0Y2ggbGV2ZWwiLiAgU28sICIyLjQtMSIKLSAgICBpcyBhc3N1bWVkIHRvIGJlIGEgYnJhbmNoIG9yIHBhdGNoIG9mICIyLjQiLCBhbmQgdGhlcmVmb3JlICIyLjQuMSIgaXMKLSAgICBjb25zaWRlcmVkIG5ld2VyIHRoYW4gIjIuNC0xIiwgd2hpYyBpbiB0dXJuIGlzIG5ld2VyIHRoYW4gIjIuNCIuCi0KLSAgICBTdHJpbmdzIGxpa2UgImEiLCAiYiIsICJjIiwgImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiBhbmQgc28gb24gKHRoYXQKLSAgICBjb21lIGJlZm9yZSAiZmluYWwiIGFscGhhYmV0aWNhbGx5KSBhcmUgYXNzdW1lZCB0byBiZSBwcmUtcmVsZWFzZSB2ZXJzaW9ucywKLSAgICBzbyB0aGF0IHRoZSB2ZXJzaW9uICIyLjQiIGlzIGNvbnNpZGVyZWQgbmV3ZXIgdGhhbiAiMi40YTEiLgotCi0gICAgRmluYWxseSwgdG8gaGFuZGxlIG1pc2NlbGxhbmVvdXMgY2FzZXMsIHRoZSBzdHJpbmdzICJwcmUiLCAicHJldmlldyIsIGFuZAotICAgICJyYyIgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlICJjIiwgaS5lLiBhcyB0aG91Z2ggdGhleSB3ZXJlIHJlbGVhc2UKLSAgICBjYW5kaWRhdGVzLCBhbmQgdGhlcmVmb3JlIGFyZSBub3QgYXMgbmV3IGFzIGEgdmVyc2lvbiBzdHJpbmcgdGhhdCBkb2VzIG5vdAotICAgIGNvbnRhaW4gdGhlbS4KLSAgICAiIiIKLSAgICBwYXJ0cyA9IFtdCi0gICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHMocy5sb3dlcigpKToKLSAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCcqJyk6Ci0gICAgICAgICAgICBpZiBwYXJ0PCcqZmluYWwnOiAgICMgcmVtb3ZlICctJyBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZwotICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV09PScqZmluYWwtJzogcGFydHMucG9wKCkKLSAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwotICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXT09JzAwMDAwMDAwJzoKLSAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQotICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKLSAgICByZXR1cm4gdHVwbGUocGFydHMpCi0KLWNsYXNzIEVudHJ5UG9pbnQob2JqZWN0KToKLSAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIGFkdmVydGlzZWQgaW1wb3J0YWJsZSBvYmplY3QiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGVfbmFtZSwgYXR0cnM9KCksIGV4dHJhcz0oKSwgZGlzdD1Ob25lKToKLSAgICAgICAgaWYgbm90IE1PRFVMRShtb2R1bGVfbmFtZSk6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIG1vZHVsZSBuYW1lIiwgbW9kdWxlX25hbWUpCi0gICAgICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lCi0gICAgICAgIHNlbGYuYXR0cnMgPSB0dXBsZShhdHRycykKLSAgICAgICAgc2VsZi5leHRyYXMgPSBSZXF1aXJlbWVudC5wYXJzZSgoInhbJXNdIiAlICcsJy5qb2luKGV4dHJhcykpKS5leHRyYXMKLSAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHMgPSAiJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKQotICAgICAgICBpZiBzZWxmLmF0dHJzOgotICAgICAgICAgICAgcyArPSAnOicgKyAnLicuam9pbihzZWxmLmF0dHJzKQotICAgICAgICBpZiBzZWxmLmV4dHJhczoKLSAgICAgICAgICAgIHMgKz0gJyBbJXNdJyAlICcsJy5qb2luKHNlbGYuZXh0cmFzKQotICAgICAgICByZXR1cm4gcwotCi0gICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gIkVudHJ5UG9pbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQotCi0gICAgZGVmIGxvYWQoc2VsZiwgcmVxdWlyZT1UcnVlLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgotICAgICAgICBpZiByZXF1aXJlOiBzZWxmLnJlcXVpcmUoZW52LCBpbnN0YWxsZXIpCi0gICAgICAgIGVudHJ5ID0gX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lLCBnbG9iYWxzKCksZ2xvYmFscygpLCBbJ19fbmFtZV9fJ10pCi0gICAgICAgIGZvciBhdHRyIGluIHNlbGYuYXR0cnM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBnZXRhdHRyKGVudHJ5LGF0dHIpCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIiVyIGhhcyBubyAlciBhdHRyaWJ1dGUiICUgKGVudHJ5LGF0dHIpKQotICAgICAgICByZXR1cm4gZW50cnkKLQotICAgIGRlZiByZXF1aXJlKHNlbGYsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6Ci0gICAgICAgIGlmIHNlbGYuZXh0cmFzIGFuZCBub3Qgc2VsZi5kaXN0OgotICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKCJDYW4ndCByZXF1aXJlKCkgd2l0aG91dCBhIGRpc3RyaWJ1dGlvbiIsIHNlbGYpCi0gICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsCi0gICAgICAgICAgICB3b3JraW5nX3NldC5yZXNvbHZlKHNlbGYuZGlzdC5yZXF1aXJlcyhzZWxmLmV4dHJhcyksZW52LGluc3RhbGxlcikpCi0KLQotCi0gICAgI0BjbGFzc21ldGhvZAotICAgIGRlZiBwYXJzZShjbHMsIHNyYywgZGlzdD1Ob25lKToKLSAgICAgICAgIiIiUGFyc2UgYSBzaW5nbGUgZW50cnkgcG9pbnQgZnJvbSBzdHJpbmcgYHNyY2AKLQotICAgICAgICBFbnRyeSBwb2ludCBzeW50YXggZm9sbG93cyB0aGUgZm9ybTo6Ci0KLSAgICAgICAgICAgIG5hbWUgPSBzb21lLm1vZHVsZTpzb21lLmF0dHIgW2V4dHJhMSxleHRyYTJdCi0KLSAgICAgICAgVGhlIGVudHJ5IG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSByZXF1aXJlZCwgYnV0IHRoZSBgYDphdHRyc2BgIGFuZAotICAgICAgICBgYFtleHRyYXNdYGAgcGFydHMgYXJlIG9wdGlvbmFsCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBhdHRycyA9IGV4dHJhcyA9ICgpCi0gICAgICAgICAgICBuYW1lLHZhbHVlID0gc3JjLnNwbGl0KCc9JywxKQotICAgICAgICAgICAgaWYgJ1snIGluIHZhbHVlOgotICAgICAgICAgICAgICAgIHZhbHVlLGV4dHJhcyA9IHZhbHVlLnNwbGl0KCdbJywxKQotICAgICAgICAgICAgICAgIHJlcSA9IFJlcXVpcmVtZW50LnBhcnNlKCJ4WyIrZXh0cmFzKQotICAgICAgICAgICAgICAgIGlmIHJlcS5zcGVjczogcmFpc2UgVmFsdWVFcnJvcgotICAgICAgICAgICAgICAgIGV4dHJhcyA9IHJlcS5leHRyYXMKLSAgICAgICAgICAgIGlmICc6JyBpbiB2YWx1ZToKLSAgICAgICAgICAgICAgICB2YWx1ZSxhdHRycyA9IHZhbHVlLnNwbGl0KCc6JywxKQotICAgICAgICAgICAgICAgIGlmIG5vdCBNT0RVTEUoYXR0cnMucnN0cmlwKCkpOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCi0gICAgICAgICAgICAgICAgYXR0cnMgPSBhdHRycy5yc3RyaXAoKS5zcGxpdCgnLicpCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKLSAgICAgICAgICAgICAgICAiRW50cnlQb2ludCBtdXN0IGJlIGluICduYW1lPW1vZHVsZTphdHRycyBbZXh0cmFzXScgZm9ybWF0IiwKLSAgICAgICAgICAgICAgICBzcmMKLSAgICAgICAgICAgICkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBjbHMobmFtZS5zdHJpcCgpLCB2YWx1ZS5sc3RyaXAoKSwgYXR0cnMsIGV4dHJhcywgZGlzdCkKLQotICAgIHBhcnNlID0gY2xhc3NtZXRob2QocGFyc2UpCi0KLQotCi0KLQotCi0KLQotICAgICNAY2xhc3NtZXRob2QKLSAgICBkZWYgcGFyc2VfZ3JvdXAoY2xzLCBncm91cCwgbGluZXMsIGRpc3Q9Tm9uZSk6Ci0gICAgICAgICIiIlBhcnNlIGFuIGVudHJ5IHBvaW50IGdyb3VwIiIiCi0gICAgICAgIGlmIG5vdCBNT0RVTEUoZ3JvdXApOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBncm91cCBuYW1lIiwgZ3JvdXApCi0gICAgICAgIHRoaXMgPSB7fQotICAgICAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhsaW5lcyk6Ci0gICAgICAgICAgICBlcCA9IGNscy5wYXJzZShsaW5lLCBkaXN0KQotICAgICAgICAgICAgaWYgZXAubmFtZSBpbiB0aGlzOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBlbnRyeSBwb2ludCIsIGdyb3VwLCBlcC5uYW1lKQotICAgICAgICAgICAgdGhpc1tlcC5uYW1lXT1lcAotICAgICAgICByZXR1cm4gdGhpcwotCi0gICAgcGFyc2VfZ3JvdXAgPSBjbGFzc21ldGhvZChwYXJzZV9ncm91cCkKLQotICAgICNAY2xhc3NtZXRob2QKLSAgICBkZWYgcGFyc2VfbWFwKGNscywgZGF0YSwgZGlzdD1Ob25lKToKLSAgICAgICAgIiIiUGFyc2UgYSBtYXAgb2YgZW50cnkgcG9pbnQgZ3JvdXBzIiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSxkaWN0KToKLSAgICAgICAgICAgIGRhdGEgPSBkYXRhLml0ZW1zKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGRhdGEgPSBzcGxpdF9zZWN0aW9ucyhkYXRhKQotICAgICAgICBtYXBzID0ge30KLSAgICAgICAgZm9yIGdyb3VwLCBsaW5lcyBpbiBkYXRhOgotICAgICAgICAgICAgaWYgZ3JvdXAgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBpZiBub3QgbGluZXM6Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRW50cnkgcG9pbnRzIG11c3QgYmUgbGlzdGVkIGluIGdyb3VwcyIpCi0gICAgICAgICAgICBncm91cCA9IGdyb3VwLnN0cmlwKCkKLSAgICAgICAgICAgIGlmIGdyb3VwIGluIG1hcHM6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGdyb3VwIG5hbWUiLCBncm91cCkKLSAgICAgICAgICAgIG1hcHNbZ3JvdXBdID0gY2xzLnBhcnNlX2dyb3VwKGdyb3VwLCBsaW5lcywgZGlzdCkKLSAgICAgICAgcmV0dXJuIG1hcHMKLQotICAgIHBhcnNlX21hcCA9IGNsYXNzbWV0aG9kKHBhcnNlX21hcCkKLQotCi0KLQotCi0KLWNsYXNzIERpc3RyaWJ1dGlvbihvYmplY3QpOgotICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsCi0gICAgICAgIGxvY2F0aW9uPU5vbmUsIG1ldGFkYXRhPU5vbmUsIHByb2plY3RfbmFtZT1Ob25lLCB2ZXJzaW9uPU5vbmUsCi0gICAgICAgIHB5X3ZlcnNpb249UFlfTUFKT1IsIHBsYXRmb3JtPU5vbmUsIHByZWNlZGVuY2UgPSBFR0dfRElTVAotICAgICk6Ci0gICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHByb2plY3RfbmFtZSBvciAnVW5rbm93bicpCi0gICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKHZlcnNpb24pCi0gICAgICAgIHNlbGYucHlfdmVyc2lvbiA9IHB5X3ZlcnNpb24KLSAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCi0gICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgotICAgICAgICBzZWxmLnByZWNlZGVuY2UgPSBwcmVjZWRlbmNlCi0gICAgICAgIHNlbGYuX3Byb3ZpZGVyID0gbWV0YWRhdGEgb3IgZW1wdHlfcHJvdmlkZXIKLQotICAgICNAY2xhc3NtZXRob2QKLSAgICBkZWYgZnJvbV9sb2NhdGlvbihjbHMsbG9jYXRpb24sYmFzZW5hbWUsbWV0YWRhdGE9Tm9uZSwqKmt3KToKLSAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IFtOb25lXSo0Ci0gICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKQotICAgICAgICBpZiBleHQubG93ZXIoKSBpbiAoIi5lZ2ciLCIuZWdnLWluZm8iKToKLSAgICAgICAgICAgIG1hdGNoID0gRUdHX05BTUUoYmFzZW5hbWUpCi0gICAgICAgICAgICBpZiBtYXRjaDoKLSAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoCi0gICAgICAgICAgICAgICAgICAgICduYW1lJywndmVyJywncHl2ZXInLCdwbGF0JwotICAgICAgICAgICAgICAgICkKLSAgICAgICAgcmV0dXJuIGNscygKLSAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgcHJvamVjdF9uYW1lPXByb2plY3RfbmFtZSwgdmVyc2lvbj12ZXJzaW9uLAotICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwbGF0Zm9ybT1wbGF0Zm9ybSwgKiprdwotICAgICAgICApCi0gICAgZnJvbV9sb2NhdGlvbiA9IGNsYXNzbWV0aG9kKGZyb21fbG9jYXRpb24pCi0KLSAgICBoYXNoY21wID0gcHJvcGVydHkoCi0gICAgICAgIGxhbWJkYSBzZWxmOiAoCi0gICAgICAgICAgICBnZXRhdHRyKHNlbGYsJ3BhcnNlZF92ZXJzaW9uJywoKSksIHNlbGYucHJlY2VkZW5jZSwgc2VsZi5rZXksCi0gICAgICAgICAgICAtbGVuKHNlbGYubG9jYXRpb24gb3IgJycpLCBzZWxmLmxvY2F0aW9uLCBzZWxmLnB5X3ZlcnNpb24sCi0gICAgICAgICAgICBzZWxmLnBsYXRmb3JtCi0gICAgICAgICkKLSAgICApCi0gICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOiByZXR1cm4gY21wKHNlbGYuaGFzaGNtcCwgb3RoZXIpCi0gICAgZGVmIF9faGFzaF9fKHNlbGYpOiByZXR1cm4gaGFzaChzZWxmLmhhc2hjbXApCi0KLSAgICAjIFRoZXNlIHByb3BlcnRpZXMgaGF2ZSB0byBiZSBsYXp5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBsb2FkIGFueQotICAgICMgbWV0YWRhdGEgdW50aWwvdW5sZXNzIGl0J3MgYWN0dWFsbHkgbmVlZGVkLiAgKGkuZS4sIHNvbWUgZGlzdHJpYnV0aW9ucwotICAgICMgbWF5IG5vdCBrbm93IHRoZWlyIG5hbWUgb3IgdmVyc2lvbiB3aXRob3V0IGxvYWRpbmcgUEtHLUlORk8pCi0KLSAgICAjQHByb3BlcnR5Ci0gICAgZGVmIGtleShzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2tleQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBzZWxmLl9rZXkgPSBrZXkgPSBzZWxmLnByb2plY3RfbmFtZS5sb3dlcigpCi0gICAgICAgICAgICByZXR1cm4ga2V5Ci0gICAga2V5ID0gcHJvcGVydHkoa2V5KQotCi0gICAgI0Bwcm9wZXJ0eQotICAgIGRlZiBwYXJzZWRfdmVyc2lvbihzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlZF92ZXJzaW9uCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuX3BhcnNlZF92ZXJzaW9uID0gcHYgPSBwYXJzZV92ZXJzaW9uKHNlbGYudmVyc2lvbikKLSAgICAgICAgICAgIHJldHVybiBwdgotCi0gICAgcGFyc2VkX3ZlcnNpb24gPSBwcm9wZXJ0eShwYXJzZWRfdmVyc2lvbikKLQotICAgICNAcHJvcGVydHkKLSAgICBkZWYgdmVyc2lvbihzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCdQS0ctSU5GTycpOgotICAgICAgICAgICAgICAgIGlmIGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCd2ZXJzaW9uOicpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKGxpbmUuc3BsaXQoJzonLDEpWzFdLnN0cmlwKCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJNaXNzaW5nICdWZXJzaW9uOicgaGVhZGVyIGFuZC9vciBQS0ctSU5GTyBmaWxlIiwgc2VsZgotICAgICAgICAgICAgICAgICkKLSAgICB2ZXJzaW9uID0gcHJvcGVydHkodmVyc2lvbikKLQotCi0KLQotICAgICNAcHJvcGVydHkKLSAgICBkZWYgX2RlcF9tYXAoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQotICAgICAgICAgICAgZm9yIG5hbWUgaW4gJ3JlcXVpcmVzLnR4dCcsICdkZXBlbmRzLnR4dCc6Ci0gICAgICAgICAgICAgICAgZm9yIGV4dHJhLHJlcXMgaW4gc3BsaXRfc2VjdGlvbnMoc2VsZi5fZ2V0X21ldGFkYXRhKG5hbWUpKToKLSAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6IGV4dHJhID0gc2FmZV9leHRyYShleHRyYSkKLSAgICAgICAgICAgICAgICAgICAgZG0uc2V0ZGVmYXVsdChleHRyYSxbXSkuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKLSAgICAgICAgICAgIHJldHVybiBkbQotICAgIF9kZXBfbWFwID0gcHJvcGVydHkoX2RlcF9tYXApCi0KLSAgICBkZWYgcmVxdWlyZXMoc2VsZixleHRyYXM9KCkpOgotICAgICAgICAiIiJMaXN0IG9mIFJlcXVpcmVtZW50cyBuZWVkZWQgZm9yIHRoaXMgZGlzdHJvIGlmIGBleHRyYXNgIGFyZSB1c2VkIiIiCi0gICAgICAgIGRtID0gc2VsZi5fZGVwX21hcAotICAgICAgICBkZXBzID0gW10KLSAgICAgICAgZGVwcy5leHRlbmQoZG0uZ2V0KE5vbmUsKCkpKQotICAgICAgICBmb3IgZXh0IGluIGV4dHJhczoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBkZXBzLmV4dGVuZChkbVtzYWZlX2V4dHJhKGV4dCldKQotICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgKLSAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyBubyBzdWNoIGV4dHJhIGZlYXR1cmUgJXIiICUgKHNlbGYsIGV4dCkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgIHJldHVybiBkZXBzCi0KLSAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLG5hbWUpOgotICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKLSAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgotICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKLQotICAgIGRlZiBhY3RpdmF0ZShzZWxmLHBhdGg9Tm9uZSk6Ci0gICAgICAgICIiIkVuc3VyZSBkaXN0cmlidXRpb24gaXMgaW1wb3J0YWJsZSBvbiBgcGF0aGAgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCi0gICAgICAgIGlmIHBhdGggaXMgTm9uZTogcGF0aCA9IHN5cy5wYXRoCi0gICAgICAgIHNlbGYuaW5zZXJ0X29uKHBhdGgpCi0gICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6Ci0gICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc2VsZi5sb2NhdGlvbikKLSAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6Ci0gICAgICAgICAgICAgICAgaWYgcGtnIGluIHN5cy5tb2R1bGVzOiBkZWNsYXJlX25hbWVzcGFjZShwa2cpCi0KLSAgICBkZWYgZWdnX25hbWUoc2VsZik6Ci0gICAgICAgICIiIlJldHVybiB3aGF0IHRoaXMgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgLmVnZyBmaWxlbmFtZSBzaG91bGQgYmUiIiIKLSAgICAgICAgZmlsZW5hbWUgPSAiJXMtJXMtcHklcyIgJSAoCi0gICAgICAgICAgICB0b19maWxlbmFtZShzZWxmLnByb2plY3RfbmFtZSksIHRvX2ZpbGVuYW1lKHNlbGYudmVyc2lvbiksCi0gICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgUFlfTUFKT1IKLSAgICAgICAgKQotCi0gICAgICAgIGlmIHNlbGYucGxhdGZvcm06Ci0gICAgICAgICAgICBmaWxlbmFtZSArPSAnLScrc2VsZi5wbGF0Zm9ybQotICAgICAgICByZXR1cm4gZmlsZW5hbWUKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi5sb2NhdGlvbjoKLSAgICAgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZixzZWxmLmxvY2F0aW9uKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHRyeTogdmVyc2lvbiA9IGdldGF0dHIoc2VsZiwndmVyc2lvbicsTm9uZSkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHZlcnNpb24gPSBOb25lCi0gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uIG9yICJbdW5rbm93biB2ZXJzaW9uXSIKLSAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsdmVyc2lvbikKLQotICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLGF0dHIpOgotICAgICAgICAiIiJEZWxlZ2F0ZSBhbGwgdW5yZWNvZ25pemVkIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIC5tZXRhZGF0YSBwcm92aWRlciIiIgotICAgICAgICBpZiBhdHRyLnN0YXJ0c3dpdGgoJ18nKToKLSAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLGF0dHIKLSAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fcHJvdmlkZXIsIGF0dHIpCi0KLSAgICAjQGNsYXNzbWV0aG9kCi0gICAgZGVmIGZyb21fZmlsZW5hbWUoY2xzLGZpbGVuYW1lLG1ldGFkYXRhPU5vbmUsICoqa3cpOgotICAgICAgICByZXR1cm4gY2xzLmZyb21fbG9jYXRpb24oCi0gICAgICAgICAgICBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YSwKLSAgICAgICAgICAgICoqa3cKLSAgICAgICAgKQotICAgIGZyb21fZmlsZW5hbWUgPSBjbGFzc21ldGhvZChmcm9tX2ZpbGVuYW1lKQotCi0gICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gYSBgYFJlcXVpcmVtZW50YGAgdGhhdCBtYXRjaGVzIHRoaXMgZGlzdHJpYnV0aW9uIGV4YWN0bHkiIiIKLSAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKCclcz09JXMnICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnZlcnNpb24pKQotCi0gICAgZGVmIGxvYWRfZW50cnlfcG9pbnQoc2VsZiwgZ3JvdXAsIG5hbWUpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCi0gICAgICAgIGVwID0gc2VsZi5nZXRfZW50cnlfaW5mbyhncm91cCxuYW1lKQotICAgICAgICBpZiBlcCBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkVudHJ5IHBvaW50ICVyIG5vdCBmb3VuZCIgJSAoKGdyb3VwLG5hbWUpLCkpCi0gICAgICAgIHJldHVybiBlcC5sb2FkKCkKLQotICAgIGRlZiBnZXRfZW50cnlfbWFwKHNlbGYsIGdyb3VwPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcAotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAgPSBFbnRyeVBvaW50LnBhcnNlX21hcCgKLSAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKSwgc2VsZgotICAgICAgICAgICAgKQotICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBlcF9tYXAuZ2V0KGdyb3VwLHt9KQotICAgICAgICByZXR1cm4gZXBfbWFwCi0KLSAgICBkZWYgZ2V0X2VudHJ5X2luZm8oc2VsZiwgZ3JvdXAsIG5hbWUpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2VudHJ5X21hcChncm91cCkuZ2V0KG5hbWUpCi0KLSAgICBkZWYgaW5zZXJ0X29uKHNlbGYsIHBhdGgsIGxvYyA9IE5vbmUpOgotICAgICAgICAiIiJJbnNlcnQgc2VsZi5sb2NhdGlvbiBpbiBwYXRoIGJlZm9yZSBpdHMgbmVhcmVzdCBwYXJlbnQgZGlyZWN0b3J5IiIiCi0gICAgICAgIGxvYyA9IGxvYyBvciBzZWxmLmxvY2F0aW9uCi0gICAgICAgIGlmIG5vdCBsb2M6IHJldHVybgotICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgotICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKLSAgICAgICAgYmVzdCwgcG9zID0gMCwgLTEKLSAgICAgICAgZm9yIHAsaXRlbSBpbiBlbnVtZXJhdGUocGF0aCk6Ci0gICAgICAgICAgICBpdGVtID0gX25vcm1hbGl6ZV9jYWNoZWQoaXRlbSkKLSAgICAgICAgICAgIGlmIGxvYy5zdGFydHN3aXRoKGl0ZW0pIGFuZCBsZW4oaXRlbSk+YmVzdCBhbmQgbG9jPD5pdGVtOgotICAgICAgICAgICAgICAgIGJlc3QsIHBvcyA9IGxlbihpdGVtKSwgcAotICAgICAgICBpZiBwb3M9PS0xOgotICAgICAgICAgICAgaWYgbG9jIG5vdCBpbiBwYXRoOiBwYXRoLmFwcGVuZChsb2MpCi0gICAgICAgIGVsaWYgbG9jIG5vdCBpbiBwYXRoWzpwb3MrMV06Ci0gICAgICAgICAgICB3aGlsZSBsb2MgaW4gcGF0aDogcGF0aC5yZW1vdmUobG9jKQotICAgICAgICAgICAgcGF0aC5pbnNlcnQocG9zLGxvYykKLQotCi0gICAgZGVmIGNoZWNrX3ZlcnNpb25fY29uZmxpY3Qoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYua2V5PT0nc2V0dXB0b29scyc6Ci0gICAgICAgICAgICByZXR1cm4gICAgICAjIGlnbm9yZSB0aGUgaW5ldml0YWJsZSBzZXR1cHRvb2xzIHNlbGYtY29uZmxpY3RzICA6KAotCi0gICAgICAgIG5zcCA9IGRpY3QuZnJvbWtleXMoc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0JykpCi0gICAgICAgIGxvYyA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYubG9jYXRpb24pCi0gICAgICAgIGZvciBtb2RuYW1lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgotICAgICAgICAgICAgaWYgKG1vZG5hbWUgbm90IGluIHN5cy5tb2R1bGVzIG9yIG1vZG5hbWUgaW4gbnNwCi0gICAgICAgICAgICAgICAgb3IgbW9kbmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgJ19fZmlsZV9fJywgTm9uZSkKLSAgICAgICAgICAgIGlmIGZuIGFuZCBub3JtYWxpemVfcGF0aChmbikuc3RhcnRzd2l0aChsb2MpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpc3N1ZV93YXJuaW5nKAotICAgICAgICAgICAgICAgICJNb2R1bGUgJXMgd2FzIGFscmVhZHkgaW1wb3J0ZWQgZnJvbSAlcywgYnV0ICVzIGlzIGJlaW5nIGFkZGVkIgotICAgICAgICAgICAgICAgICIgdG8gc3lzLnBhdGgiICUgKG1vZG5hbWUsIGZuLCBzZWxmLmxvY2F0aW9uKSwKLSAgICAgICAgICAgICkKLQotICAgIGRlZiBoYXNfdmVyc2lvbihzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi52ZXJzaW9uCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgaXNzdWVfd2FybmluZygiVW5idWlsdCBlZ2cgZm9yICIrcmVwcihzZWxmKSkKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIGNsb25lKHNlbGYsKiprdyk6Ci0gICAgICAgICIiIkNvcHkgdGhpcyBkaXN0cmlidXRpb24sIHN1YnN0aXR1dGluZyBpbiBhbnkgY2hhbmdlZCBrZXl3b3JkIGFyZ3MiIiIKLSAgICAgICAgZm9yIGF0dHIgaW4gKAotICAgICAgICAgICAgJ3Byb2plY3RfbmFtZScsICd2ZXJzaW9uJywgJ3B5X3ZlcnNpb24nLCAncGxhdGZvcm0nLCAnbG9jYXRpb24nLAotICAgICAgICAgICAgJ3ByZWNlZGVuY2UnCi0gICAgICAgICk6Ci0gICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGF0dHIsIGdldGF0dHIoc2VsZixhdHRyLE5vbmUpKQotICAgICAgICBrdy5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHNlbGYuX3Byb3ZpZGVyKQotICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKiprdykKLQotCi0KLQotICAgICNAcHJvcGVydHkKLSAgICBkZWYgZXh0cmFzKHNlbGYpOgotICAgICAgICByZXR1cm4gW2RlcCBmb3IgZGVwIGluIHNlbGYuX2RlcF9tYXAgaWYgZGVwXQotICAgIGV4dHJhcyA9IHByb3BlcnR5KGV4dHJhcykKLQotCi1kZWYgaXNzdWVfd2FybmluZygqYXJncywqKmt3KToKLSAgICBsZXZlbCA9IDEKLSAgICBnID0gZ2xvYmFscygpCi0gICAgdHJ5OgotICAgICAgICAjIGZpbmQgdGhlIGZpcnN0IHN0YWNrIGZyYW1lIHRoYXQgaXMgKm5vdCogY29kZSBpbgotICAgICAgICAjIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSwgdG8gdXNlIGZvciB0aGUgd2FybmluZwotICAgICAgICB3aGlsZSBzeXMuX2dldGZyYW1lKGxldmVsKS5mX2dsb2JhbHMgaXMgZzoKLSAgICAgICAgICAgIGxldmVsICs9IDEKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KLSAgICB3YXJuKHN0YWNrbGV2ZWwgPSBsZXZlbCsxLCAqYXJncywgKiprdykKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1kZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHN0cnMpOgotICAgICIiIllpZWxkIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzIGZvciBlYWNoIHNwZWNpZmljYXRpb24gaW4gYHN0cnNgCi0KLSAgICBgc3Ryc2AgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBgYGJhc2VzdHJpbmdgYCwgb3IgYSAocG9zc2libHktbmVzdGVkKQotICAgIGl0ZXJhYmxlIHRoZXJlb2YuCi0gICAgIiIiCi0gICAgIyBjcmVhdGUgYSBzdGVwcGFibGUgaXRlcmF0b3IsIHNvIHdlIGNhbiBoYW5kbGUgXC1jb250aW51YXRpb25zCi0gICAgbGluZXMgPSBpdGVyKHlpZWxkX2xpbmVzKHN0cnMpKQotCi0gICAgZGVmIHNjYW5fbGlzdChJVEVNLFRFUk1JTkFUT1IsbGluZSxwLGdyb3VwcyxpdGVtX25hbWUpOgotCi0gICAgICAgIGl0ZW1zID0gW10KLQotICAgICAgICB3aGlsZSBub3QgVEVSTUlOQVRPUihsaW5lLHApOgotICAgICAgICAgICAgaWYgQ09OVElOVUUobGluZSxwKToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lcy5uZXh0KCk7IHAgPSAwCi0gICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAiXFwgbXVzdCBub3QgYXBwZWFyIG9uIHRoZSBsYXN0IG5vbmJsYW5rIGxpbmUiCi0gICAgICAgICAgICAgICAgICAgICkKLQotICAgICAgICAgICAgbWF0Y2ggPSBJVEVNKGxpbmUscCkKLSAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFeHBlY3RlZCAiK2l0ZW1fbmFtZSsiIGluIixsaW5lLCJhdCIsbGluZVtwOl0pCi0KLSAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChtYXRjaC5ncm91cCgqZ3JvdXBzKSkKLSAgICAgICAgICAgIHAgPSBtYXRjaC5lbmQoKQotCi0gICAgICAgICAgICBtYXRjaCA9IENPTU1BKGxpbmUscCkKLSAgICAgICAgICAgIGlmIG1hdGNoOgotICAgICAgICAgICAgICAgIHAgPSBtYXRjaC5lbmQoKSAjIHNraXAgdGhlIGNvbW1hCi0gICAgICAgICAgICBlbGlmIG5vdCBURVJNSU5BVE9SKGxpbmUscCk6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkICcsJyBvciBlbmQtb2YtbGlzdCBpbiIsbGluZSwiYXQiLGxpbmVbcDpdCi0gICAgICAgICAgICAgICAgKQotCi0gICAgICAgIG1hdGNoID0gVEVSTUlOQVRPUihsaW5lLHApCi0gICAgICAgIGlmIG1hdGNoOiBwID0gbWF0Y2guZW5kKCkgICAjIHNraXAgdGhlIHRlcm1pbmF0b3IsIGlmIGFueQotICAgICAgICByZXR1cm4gbGluZSwgcCwgaXRlbXMKLQotICAgIGZvciBsaW5lIGluIGxpbmVzOgotICAgICAgICBtYXRjaCA9IERJU1RSTyhsaW5lKQotICAgICAgICBpZiBub3QgbWF0Y2g6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJNaXNzaW5nIGRpc3RyaWJ1dGlvbiBzcGVjIiwgbGluZSkKLSAgICAgICAgcHJvamVjdF9uYW1lID0gbWF0Y2guZ3JvdXAoMSkKLSAgICAgICAgcCA9IG1hdGNoLmVuZCgpCi0gICAgICAgIGV4dHJhcyA9IFtdCi0KLSAgICAgICAgbWF0Y2ggPSBPQlJBQ0tFVChsaW5lLHApCi0gICAgICAgIGlmIG1hdGNoOgotICAgICAgICAgICAgcCA9IG1hdGNoLmVuZCgpCi0gICAgICAgICAgICBsaW5lLCBwLCBleHRyYXMgPSBzY2FuX2xpc3QoCi0gICAgICAgICAgICAgICAgRElTVFJPLCBDQlJBQ0tFVCwgbGluZSwgcCwgKDEsKSwgIidleHRyYScgbmFtZSIKLSAgICAgICAgICAgICkKLQotICAgICAgICBsaW5lLCBwLCBzcGVjcyA9IHNjYW5fbGlzdChWRVJTSU9OLExJTkVfRU5ELGxpbmUscCwoMSwyKSwidmVyc2lvbiBzcGVjIikKLSAgICAgICAgc3BlY3MgPSBbKG9wLHNhZmVfdmVyc2lvbih2YWwpKSBmb3Igb3AsdmFsIGluIHNwZWNzXQotICAgICAgICB5aWVsZCBSZXF1aXJlbWVudChwcm9qZWN0X25hbWUsIHNwZWNzLCBleHRyYXMpCi0KLQotZGVmIF9zb3J0X2Rpc3RzKGRpc3RzKToKLSAgICB0bXAgPSBbKGRpc3QuaGFzaGNtcCxkaXN0KSBmb3IgZGlzdCBpbiBkaXN0c10KLSAgICB0bXAuc29ydCgpCi0gICAgZGlzdHNbOjotMV0gPSBbZCBmb3IgaGMsZCBpbiB0bXBdCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotY2xhc3MgUmVxdWlyZW1lbnQ6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2plY3RfbmFtZSwgc3BlY3MsIGV4dHJhcyk6Ci0gICAgICAgICIiIkRPIE5PVCBDQUxMIFRISVMgVU5ET0NVTUVOVEVEIE1FVEhPRDsgdXNlIFJlcXVpcmVtZW50LnBhcnNlKCkhIiIiCi0gICAgICAgIHNlbGYudW5zYWZlX25hbWUsIHByb2plY3RfbmFtZSA9IHByb2plY3RfbmFtZSwgc2FmZV9uYW1lKHByb2plY3RfbmFtZSkKLSAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYua2V5ID0gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKQotICAgICAgICBpbmRleCA9IFsocGFyc2VfdmVyc2lvbih2KSxzdGF0ZV9tYWNoaW5lW29wXSxvcCx2KSBmb3Igb3AsdiBpbiBzcGVjc10KLSAgICAgICAgaW5kZXguc29ydCgpCi0gICAgICAgIHNlbGYuc3BlY3MgPSBbKG9wLHZlcikgZm9yIHBhcnNlZCx0cmFucyxvcCx2ZXIgaW4gaW5kZXhdCi0gICAgICAgIHNlbGYuaW5kZXgsIHNlbGYuZXh0cmFzID0gaW5kZXgsIHR1cGxlKG1hcChzYWZlX2V4dHJhLGV4dHJhcykpCi0gICAgICAgIHNlbGYuaGFzaENtcCA9ICgKLSAgICAgICAgICAgIHNlbGYua2V5LCB0dXBsZShbKG9wLHBhcnNlZCkgZm9yIHBhcnNlZCx0cmFucyxvcCx2ZXIgaW4gaW5kZXhdKSwKLSAgICAgICAgICAgIEltbXV0YWJsZVNldChzZWxmLmV4dHJhcykKLSAgICAgICAgKQotICAgICAgICBzZWxmLl9faGFzaCA9IGhhc2goc2VsZi5oYXNoQ21wKQotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHNwZWNzID0gJywnLmpvaW4oWycnLmpvaW4ocykgZm9yIHMgaW4gc2VsZi5zcGVjc10pCi0gICAgICAgIGV4dHJhcyA9ICcsJy5qb2luKHNlbGYuZXh0cmFzKQotICAgICAgICBpZiBleHRyYXM6IGV4dHJhcyA9ICdbJXNdJyAlIGV4dHJhcwotICAgICAgICByZXR1cm4gJyVzJXMlcycgJSAoc2VsZi5wcm9qZWN0X25hbWUsIGV4dHJhcywgc3BlY3MpCi0KLSAgICBkZWYgX19lcV9fKHNlbGYsb3RoZXIpOgotICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlcixSZXF1aXJlbWVudCkgYW5kIHNlbGYuaGFzaENtcD09b3RoZXIuaGFzaENtcAotCi0gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGl0ZW0pOgotICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sRGlzdHJpYnV0aW9uKToKLSAgICAgICAgICAgIGlmIGl0ZW0ua2V5IDw+IHNlbGYua2V5OiByZXR1cm4gRmFsc2UKLSAgICAgICAgICAgIGlmIHNlbGYuaW5kZXg6IGl0ZW0gPSBpdGVtLnBhcnNlZF92ZXJzaW9uICAjIG9ubHkgZ2V0IGlmIHdlIG5lZWQgaXQKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGl0ZW0sYmFzZXN0cmluZyk6Ci0gICAgICAgICAgICBpdGVtID0gcGFyc2VfdmVyc2lvbihpdGVtKQotICAgICAgICBsYXN0ID0gTm9uZQotICAgICAgICBmb3IgcGFyc2VkLHRyYW5zLG9wLHZlciBpbiBzZWxmLmluZGV4OgotICAgICAgICAgICAgYWN0aW9uID0gdHJhbnNbY21wKGl0ZW0scGFyc2VkKV0KLSAgICAgICAgICAgIGlmIGFjdGlvbj09J0YnOiAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgICAgICBlbGlmIGFjdGlvbj09J1QnOiAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICBlbGlmIGFjdGlvbj09JysnOiAgIGxhc3QgPSBUcnVlCi0gICAgICAgICAgICBlbGlmIGFjdGlvbj09Jy0nIG9yIGxhc3QgaXMgTm9uZTogICBsYXN0ID0gRmFsc2UKLSAgICAgICAgaWYgbGFzdCBpcyBOb25lOiBsYXN0ID0gVHJ1ZSAgICAjIG5vIHJ1bGVzIGVuY291bnRlcmVkCi0gICAgICAgIHJldHVybiBsYXN0Ci0KLQotICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNoCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6IHJldHVybiAiUmVxdWlyZW1lbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQotCi0gICAgI0BzdGF0aWNtZXRob2QKLSAgICBkZWYgcGFyc2Uocyk6Ci0gICAgICAgIHJlcXMgPSBsaXN0KHBhcnNlX3JlcXVpcmVtZW50cyhzKSkKLSAgICAgICAgaWYgcmVxczoKLSAgICAgICAgICAgIGlmIGxlbihyZXFzKT09MToKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxc1swXQotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXhwZWN0ZWQgb25seSBvbmUgcmVxdWlyZW1lbnQiLCBzKQotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyByZXF1aXJlbWVudHMgZm91bmQiLCBzKQotCi0gICAgcGFyc2UgPSBzdGF0aWNtZXRob2QocGFyc2UpCi0KLXN0YXRlX21hY2hpbmUgPSB7Ci0gICAgIyAgICAgICA9PjwKLSAgICAnPCcgOiAgJy0tVCcsCi0gICAgJzw9JzogICdULVQnLAotICAgICc+JyA6ICAnRitGJywKLSAgICAnPj0nOiAgJ1QrRicsCi0gICAgJz09JzogICdULi4nLAotICAgICchPSc6ICAnRisrJywKLX0KLQotCi1kZWYgX2dldF9tcm8oY2xzKToKLSAgICAiIiJHZXQgYW4gbXJvIGZvciBhIHR5cGUgb3IgY2xhc3NpYyBjbGFzcyIiIgotICAgIGlmIG5vdCBpc2luc3RhbmNlKGNscyx0eXBlKToKLSAgICAgICAgY2xhc3MgY2xzKGNscyxvYmplY3QpOiBwYXNzCi0gICAgICAgIHJldHVybiBjbHMuX19tcm9fX1sxOl0KLSAgICByZXR1cm4gY2xzLl9fbXJvX18KLQotZGVmIF9maW5kX2FkYXB0ZXIocmVnaXN0cnksIG9iKToKLSAgICAiIiJSZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciBgb2JgIGZyb20gYHJlZ2lzdHJ5YCIiIgotICAgIGZvciB0IGluIF9nZXRfbXJvKGdldGF0dHIob2IsICdfX2NsYXNzX18nLCB0eXBlKG9iKSkpOgotICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgotICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdCi0KLQotZGVmIGVuc3VyZV9kaXJlY3RvcnkocGF0aCk6Ci0gICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgotICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKLSAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKLSAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKLQotZGVmIHNwbGl0X3NlY3Rpb25zKHMpOgotICAgICIiIlNwbGl0IGEgc3RyaW5nIG9yIGl0ZXJhYmxlIHRoZXJlb2YgaW50byAoc2VjdGlvbixjb250ZW50KSBwYWlycwotCi0gICAgRWFjaCBgYHNlY3Rpb25gYCBpcyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlIHNlY3Rpb24gaGVhZGVyICgiW3NlY3Rpb25dIikKLSAgICBhbmQgZWFjaCBgYGNvbnRlbnRgYCBpcyBhIGxpc3Qgb2Ygc3RyaXBwZWQgbGluZXMgZXhjbHVkaW5nIGJsYW5rIGxpbmVzIGFuZAotICAgIGNvbW1lbnQtb25seSBsaW5lcy4gIElmIHRoZXJlIGFyZSBhbnkgc3VjaCBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IHNlY3Rpb24KLSAgICBoZWFkZXIsIHRoZXkncmUgcmV0dXJuZWQgaW4gYSBmaXJzdCBgYHNlY3Rpb25gYCBvZiBgYE5vbmVgYC4KLSAgICAiIiIKLSAgICBzZWN0aW9uID0gTm9uZQotICAgIGNvbnRlbnQgPSBbXQotICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKHMpOgotICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIlsiKToKLSAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIl0iKToKLSAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIG9yIGNvbnRlbnQ6Ci0gICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKLSAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXS5zdHJpcCgpCi0gICAgICAgICAgICAgICAgY29udGVudCA9IFtdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VjdGlvbiBoZWFkaW5nIiwgbGluZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKGxpbmUpCi0KLSAgICAjIHdyYXAgdXAgbGFzdCBzZWdtZW50Ci0gICAgeWllbGQgc2VjdGlvbiwgY29udGVudAotCi1kZWYgX21rc3RlbXAoKmFyZ3MsKiprdyk6Ci0gICAgZnJvbSB0ZW1wZmlsZSBpbXBvcnQgbWtzdGVtcAotICAgIG9sZF9vcGVuID0gb3Mub3BlbgotICAgIHRyeToKLSAgICAgICAgb3Mub3BlbiA9IG9zX29wZW4gICAjIHRlbXBvcmFyaWx5IGJ5cGFzcyBzYW5kYm94aW5nCi0gICAgICAgIHJldHVybiBta3N0ZW1wKCphcmdzLCoqa3cpCi0gICAgZmluYWxseToKLSAgICAgICAgb3Mub3BlbiA9IG9sZF9vcGVuICAjIGFuZCB0aGVuIHB1dCBpdCBiYWNrCi0KLQotIyBTZXQgdXAgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIKLV9tYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyKCkKLWRlZiBfaW5pdGlhbGl6ZShnKToKLSAgICBmb3IgbmFtZSBpbiBkaXIoX21hbmFnZXIpOgotICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6Ci0gICAgICAgICAgICBnW25hbWVdID0gZ2V0YXR0cihfbWFuYWdlciwgbmFtZSkKLV9pbml0aWFsaXplKGdsb2JhbHMoKSkKLQotIyBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQgYW5kIG1ha2UgdGhlIGBgcmVxdWlyZSgpYGAgQVBJIGF2YWlsYWJsZQotd29ya2luZ19zZXQgPSBXb3JraW5nU2V0KCkKLXRyeToKLSAgICAjIERvZXMgdGhlIG1haW4gcHJvZ3JhbSBsaXN0IGFueSByZXF1aXJlbWVudHM/Ci0gICAgZnJvbSBfX21haW5fXyBpbXBvcnQgX19yZXF1aXJlc19fCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcGFzcyAjIE5vOiBqdXN0IHVzZSB0aGUgZGVmYXVsdCB3b3JraW5nIHNldCBiYXNlZCBvbiBzeXMucGF0aAotZWxzZToKLSAgICAjIFllczogZW5zdXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldCwgYnkgcHJlZml4aW5nIHN5cy5wYXRoIGlmIG5lY2Vzc2FyeQotICAgIHRyeToKLSAgICAgICAgd29ya2luZ19zZXQucmVxdWlyZShfX3JlcXVpcmVzX18pCi0gICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDogICAgICMgdHJ5IGl0IHdpdGhvdXQgZGVmYXVsdHMgYWxyZWFkeSBvbiBzeXMucGF0aAotICAgICAgICB3b3JraW5nX3NldCA9IFdvcmtpbmdTZXQoW10pICAgICMgYnkgc3RhcnRpbmcgd2l0aCBhbiBlbXB0eSBwYXRoCi0gICAgICAgIGZvciBkaXN0IGluIHdvcmtpbmdfc2V0LnJlc29sdmUoCi0gICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoX19yZXF1aXJlc19fKSwgRW52aXJvbm1lbnQoKQotICAgICAgICApOgotICAgICAgICAgICAgd29ya2luZ19zZXQuYWRkKGRpc3QpCi0gICAgICAgIGZvciBlbnRyeSBpbiBzeXMucGF0aDogICMgYWRkIGFueSBtaXNzaW5nIGVudHJpZXMgZnJvbSBzeXMucGF0aAotICAgICAgICAgICAgaWYgZW50cnkgbm90IGluIHdvcmtpbmdfc2V0LmVudHJpZXM6Ci0gICAgICAgICAgICAgICAgd29ya2luZ19zZXQuYWRkX2VudHJ5KGVudHJ5KQotICAgICAgICBzeXMucGF0aFs6XSA9IHdvcmtpbmdfc2V0LmVudHJpZXMgICAjIHRoZW4gY29weSBiYWNrIHRvIHN5cy5wYXRoCi0KLXJlcXVpcmUgPSB3b3JraW5nX3NldC5yZXF1aXJlCi1pdGVyX2VudHJ5X3BvaW50cyA9IHdvcmtpbmdfc2V0Lml0ZXJfZW50cnlfcG9pbnRzCi1hZGRfYWN0aXZhdGlvbl9saXN0ZW5lciA9IHdvcmtpbmdfc2V0LnN1YnNjcmliZQotcnVuX3NjcmlwdCA9IHdvcmtpbmdfc2V0LnJ1bl9zY3JpcHQKLXJ1bl9tYWluID0gcnVuX3NjcmlwdCAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotIyBBY3RpdmF0ZSBhbGwgZGlzdHJpYnV0aW9ucyBhbHJlYWR5IG9uIHN5cy5wYXRoLCBhbmQgZW5zdXJlIHRoYXQKLSMgYWxsIGRpc3RyaWJ1dGlvbnMgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGluIHRoZSBmdXR1cmUgKGUuZy4gYnkKLSMgY2FsbGluZyBgYHJlcXVpcmUoKWBgKSB3aWxsIGdldCBhY3RpdmF0ZWQgYXMgd2VsbC4KLWFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKCkpCi13b3JraW5nX3NldC5lbnRyaWVzPVtdOyBtYXAod29ya2luZ19zZXQuYWRkX2VudHJ5LHN5cy5wYXRoKSAjIG1hdGNoIG9yZGVyCmRpZmYgLS1naXQgYS9MaWIvcGtndXRpbC5weSBiL0xpYi9wa2d1dGlsLnB5CmluZGV4IDczMTY4OTIuLjI2Yzc5N2YgMTAwNjQ0Ci0tLSBhL0xpYi9wa2d1dGlsLnB5CisrKyBiL0xpYi9wa2d1dGlsLnB5CkBAIC0zMSw3ICszMSw3IEBACiBkZWYgc2ltcGxlZ2VuZXJpYyhmdW5jKToKICAgICAiIiJNYWtlIGEgdHJpdmlhbCBzaW5nbGUtZGlzcGF0Y2ggZ2VuZXJpYyBmdW5jdGlvbiIiIgogICAgIHJlZ2lzdHJ5ID0ge30KLSAgICBkZWYgd3JhcHBlcigqYXJncywqKmt3KToKKyAgICBkZWYgd3JhcHBlcigqYXJncywgKiprdyk6CiAgICAgICAgIG9iID0gYXJnc1swXQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBjbHMgPSBvYi5fX2NsYXNzX18KQEAgLTQxLDE4ICs0MSwxOSBAQAogICAgICAgICAgICAgbXJvID0gY2xzLl9fbXJvX18KICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNsYXNzIGNscyhjbHMsb2JqZWN0KTogcGFzcworICAgICAgICAgICAgICAgIGNsYXNzIGNscyhjbHMsIG9iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICBtcm8gPSBjbHMuX19tcm9fX1sxOl0KICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgbXJvID0gb2JqZWN0LCAgICMgbXVzdCBiZSBhbiBFeHRlbnNpb25DbGFzcyBvciBzb21lIHN1Y2ggIDooCiAgICAgICAgIGZvciB0IGluIG1ybzoKICAgICAgICAgICAgIGlmIHQgaW4gcmVnaXN0cnk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdKCphcmdzLCoqa3cpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdKCphcmdzLCAqKmt3KQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsKiprdykKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3KQogICAgIHRyeToKICAgICAgICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18KLSAgICBleGNlcHQgKFR5cGVFcnJvcixBdHRyaWJ1dGVFcnJvcik6CisgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAgcGFzcyAgICAjIFB5dGhvbiAyLjMgZG9lc24ndCBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgcmVuYW1lZAogCiAgICAgZGVmIHJlZ2lzdGVyKHR5cCwgZnVuYz1Ob25lKToKQEAgLTcwLDggKzcxLDkgQEAKIGRlZiB3YWxrX3BhY2thZ2VzKHBhdGg9Tm9uZSwgcHJlZml4PScnLCBvbmVycm9yPU5vbmUpOgogICAgICIiIllpZWxkIHN1Ym1vZHVsZSBuYW1lcytsb2FkZXJzIHJlY3Vyc2l2ZWx5LCBmb3IgcGF0aCBvciBzeXMucGF0aCIiIgogCi0gICAgZGVmIHNlZW4ocCxtPXt9KToKLSAgICAgICAgaWYgcCBpbiBtOiByZXR1cm4gVHJ1ZQorICAgIGRlZiBzZWVuKHAsIG09e30pOgorICAgICAgICBpZiBwIGluIG06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICBtW3BdID0gVHJ1ZQogCiAgICAgZm9yIGltcG9ydGVyLCBuYW1lLCBpc3BrZyBpbiBpdGVyX21vZHVsZXMocGF0aCwgcHJlZml4KToKQEAgLTExMCw3ICsxMTIsNyBAQAogCiAjQHNpbXBsZWdlbmVyaWMKIGRlZiBpdGVyX2ltcG9ydGVyX21vZHVsZXMoaW1wb3J0ZXIsIHByZWZpeD0nJyk6Ci0gICAgaWYgbm90IGhhc2F0dHIoaW1wb3J0ZXIsJ2l0ZXJfbW9kdWxlcycpOgorICAgIGlmIG5vdCBoYXNhdHRyKGltcG9ydGVyLCAnaXRlcl9tb2R1bGVzJyk6CiAgICAgICAgIHJldHVybiBbXQogICAgIHJldHVybiBpbXBvcnRlci5pdGVyX21vZHVsZXMocHJlZml4KQogCkBAIC0zMzYsMTMgKzMzOCwxNSBAQAogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQotICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5zZXRkZWZhdWx0KHBhdGhfaXRlbSxpbXBvcnRlcikKKyAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuc2V0ZGVmYXVsdChwYXRoX2l0ZW0sIGltcG9ydGVyKQogCi0gICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKKyAgICAjIFRoZSBib29sZWFuIHZhbHVlcyBhcmUgdXNlZCBmb3IgY2FjaGluZyB2YWxpZCBhbmQgaW52YWxpZAorICAgICMgZmlsZSBwYXRocyBmb3IgdGhlIGJ1aWx0LWluIGltcG9ydCBtYWNoaW5lcnkKKyAgICBpZiBpbXBvcnRlciBpbiAoTm9uZSwgVHJ1ZSwgRmFsc2UpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbXBvcnRlciA9IEltcEltcG9ydGVyKHBhdGhfaXRlbSkKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaW1wb3J0ZXIgPSBOb25lCiAgICAgcmV0dXJuIGltcG9ydGVyCiAKIApAQCAtMzc3LDcgKzM4MSw3IEBACiAgICAgICAgIHBrZyA9ICcuJy5qb2luKGZ1bGxuYW1lLnNwbGl0KCcuJylbOi0xXSkKICAgICAgICAgaWYgcGtnIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgIF9faW1wb3J0X18ocGtnKQotICAgICAgICBwYXRoID0gZ2V0YXR0cihzeXMubW9kdWxlc1twa2ddLCdfX3BhdGhfXycsTm9uZSkgb3IgW10KKyAgICAgICAgcGF0aCA9IGdldGF0dHIoc3lzLm1vZHVsZXNbcGtnXSwgJ19fcGF0aF9fJywgTm9uZSkgb3IgW10KICAgICBlbHNlOgogICAgICAgICBmb3IgaW1wb3J0ZXIgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgIHlpZWxkIGltcG9ydGVyCkBAIC00MDQsNyArNDA4LDcgQEAKICAgICAgICAgbW9kdWxlX29yX25hbWUgPSBzeXMubW9kdWxlc1ttb2R1bGVfb3JfbmFtZV0KICAgICBpZiBpc2luc3RhbmNlKG1vZHVsZV9vcl9uYW1lLCBNb2R1bGVUeXBlKToKICAgICAgICAgbW9kdWxlID0gbW9kdWxlX29yX25hbWUKLSAgICAgICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsJ19fbG9hZGVyX18nLE5vbmUpCisgICAgICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHJldHVybiBsb2FkZXIKICAgICAgICAgZnVsbG5hbWUgPSBtb2R1bGUuX19uYW1lX18KZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5IGIvTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxkZXIucHkKaW5kZXggMDNkOGM4MS4uMjY2Yjg0NSAxMDA3NTUKLS0tIGEvTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxkZXIucHkKKysrIGIvTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxkZXIucHkKQEAgLTE0NSwxMSArMTQ1LDI0IEBACiAgICAgICAgIHNlbGYubWVzc2FnZSgiQnVpbGRpbmcgJXMiICUgcmVwcihzZWxmLmJ1bmRsZXBhdGgpLCAxKQogICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmJ1bmRsZXBhdGgpOgogICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmJ1bmRsZXBhdGgpCi0gICAgICAgIG9zLm1rZGlyKHNlbGYuYnVuZGxlcGF0aCkKLSAgICAgICAgc2VsZi5wcmVQcm9jZXNzKCkKLSAgICAgICAgc2VsZi5fY29weUZpbGVzKCkKLSAgICAgICAgc2VsZi5fYWRkTWV0YUZpbGVzKCkKLSAgICAgICAgc2VsZi5wb3N0UHJvY2VzcygpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuYnVuZGxlcGF0aCArICd+Jyk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuYnVuZGxlcGF0aCArICd+JykKKyAgICAgICAgYnAgPSBzZWxmLmJ1bmRsZXBhdGgKKworICAgICAgICAjIENyZWF0ZSB0aGUgYXBwIGJ1bmRsZSBpbiBhIHRlbXBvcmFyeSBsb2NhdGlvbiBhbmQgdGhlbgorICAgICAgICAjIHJlbmFtZSB0aGUgY29tcGxldGVkIGJ1bmRsZS4gVGhpcyB3YXkgdGhlIEZpbmRlciB3aWxsCisgICAgICAgICMgbmV2ZXIgc2VlIGFuIGluY29tcGxldGUgYnVuZGxlICh3aGVyZSBpdCBtaWdodCBwaWNrIHVwCisgICAgICAgICMgYW5kIGNhY2hlIHRoZSB3cm9uZyBtZXRhIGRhdGEpCisgICAgICAgIHNlbGYuYnVuZGxlcGF0aCA9IGJwICsgJ34nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLm1rZGlyKHNlbGYuYnVuZGxlcGF0aCkKKyAgICAgICAgICAgIHNlbGYucHJlUHJvY2VzcygpCisgICAgICAgICAgICBzZWxmLl9jb3B5RmlsZXMoKQorICAgICAgICAgICAgc2VsZi5fYWRkTWV0YUZpbGVzKCkKKyAgICAgICAgICAgIHNlbGYucG9zdFByb2Nlc3MoKQorICAgICAgICAgICAgb3MucmVuYW1lKHNlbGYuYnVuZGxlcGF0aCwgYnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmJ1bmRsZXBhdGggPSBicAogICAgICAgICBzZWxmLm1lc3NhZ2UoIkRvbmUuIiwgMSkKIAogICAgIGRlZiBwcmVQcm9jZXNzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL3BpbXAucHkgYi9MaWIvcGxhdC1tYWMvcGltcC5weQppbmRleCAyMTkyM2VjLi40NTY0MjdjIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvcGltcC5weQorKysgYi9MaWIvcGxhdC1tYWMvcGltcC5weQpAQCAtMjEsNyArMjEsNyBAQAogaW1wb3J0IHBsaXN0bGliCiBpbXBvcnQgZGlzdHV0aWxzLnV0aWwKIGltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnCi1pbXBvcnQgbWQ1CitpbXBvcnQgaGFzaGxpYgogaW1wb3J0IHRhcmZpbGUKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHNodXRpbApAQCAtNjkzLDcgKzY5Myw3IEBACiAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBubyBNRDVTdW0gZm9yICVzXG4iICUgc2VsZi5mdWxsbmFtZSgpKQogICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi5hcmNoaXZlRmlsZW5hbWUsICdyYicpLnJlYWQoKQotICAgICAgICBjaGVja3N1bSA9IG1kNS5uZXcoZGF0YSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgY2hlY2tzdW0gPSBoYXNobGliLm1kNShkYXRhKS5oZXhkaWdlc3QoKQogICAgICAgICByZXR1cm4gY2hlY2tzdW0gPT0gc2VsZi5fZGljdFsnTUQ1U3VtJ10KIAogICAgIGRlZiB1bnBhY2tQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CmRpZmYgLS1naXQgYS9MaWIvcG9wZW4yLnB5IGIvTGliL3BvcGVuMi5weQppbmRleCA2N2ViZDI2Li5iOTY2ZDRjIDEwMDY0NAotLS0gYS9MaWIvcG9wZW4yLnB5CisrKyBiL0xpYi9wb3BlbjIucHkKQEAgLTcyLDggKzcyLDkgQEAKICAgICAgICAgIyBJbiBjYXNlIHRoZSBjaGlsZCBoYXNuJ3QgYmVlbiB3YWl0ZWQgb24sIGNoZWNrIGlmIGl0J3MgZG9uZS4KICAgICAgICAgc2VsZi5wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkKICAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgotICAgICAgICAgICAgIyBDaGlsZCBpcyBzdGlsbCBydW5uaW5nLCBrZWVwIHVzIGFsaXZlIHVudGlsIHdlIGNhbiB3YWl0IG9uIGl0LgotICAgICAgICAgICAgX2FjdGl2ZS5hcHBlbmQoc2VsZikKKyAgICAgICAgICAgIGlmIF9hY3RpdmU6CisgICAgICAgICAgICAgICAgIyBDaGlsZCBpcyBzdGlsbCBydW5uaW5nLCBrZWVwIHVzIGFsaXZlIHVudGlsIHdlIGNhbiB3YWl0IG9uIGl0LgorICAgICAgICAgICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCiAKICAgICBkZWYgX3J1bl9jaGlsZChzZWxmLCBjbWQpOgogICAgICAgICBpZiBpc2luc3RhbmNlKGNtZCwgYmFzZXN0cmluZyk6CmRpZmYgLS1naXQgYS9MaWIvcG9wbGliLnB5IGIvTGliL3BvcGxpYi5weQppbmRleCAyMDJjNmUwLi4xY2YxMTRhIDEwMDY0NAotLS0gYS9MaWIvcG9wbGliLnB5CisrKyBiL0xpYi9wb3BsaWIucHkKQEAgLTI5NSw4ICsyOTUsOCBAQAogICAgICAgICBtID0gc2VsZi50aW1lc3RhbXAubWF0Y2goc2VsZi53ZWxjb21lKQogICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgIHJhaXNlIGVycm9yX3Byb3RvKCctRVJSIEFQT1Agbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXInKQotICAgICAgICBpbXBvcnQgbWQ1Ci0gICAgICAgIGRpZ2VzdCA9IG1kNS5uZXcobS5ncm91cCgxKStzZWNyZXQpLmRpZ2VzdCgpCisgICAgICAgIGltcG9ydCBoYXNobGliCisgICAgICAgIGRpZ2VzdCA9IGhhc2hsaWIubWQ1KG0uZ3JvdXAoMSkrc2VjcmV0KS5kaWdlc3QoKQogICAgICAgICBkaWdlc3QgPSAnJy5qb2luKG1hcChsYW1iZGEgeDonJTAyeCclb3JkKHgpLCBkaWdlc3QpKQogICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ0FQT1AgJXMgJXMnICUgKHVzZXIsIGRpZ2VzdCkpCiAKZGlmZiAtLWdpdCBhL0xpYi9yZmM4MjIucHkgYi9MaWIvcmZjODIyLnB5CmluZGV4IDg3MWEwNDkuLmQ2ZDVlNDcgMTAwNjQ0Ci0tLSBhL0xpYi9yZmM4MjIucHkKKysrIGIvTGliL3JmYzgyMi5weQpAQCAtNzAwLDYgKzcwMCw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsaWYgYWxsb3djb21tZW50cyBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgogICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgIyBoYXZlIGFscmVhZHkgYWR2YW5jZWQgcG9zIGZyb20gZ2V0Y29tbWVudAogICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnXFwnOgogICAgICAgICAgICAgICAgIHF1b3RlID0gMQogICAgICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi9ybGNvbXBsZXRlci5weSBiL0xpYi9ybGNvbXBsZXRlci5weQppbmRleCA2ZWI3N2Y5Li40ZDExYWVjIDEwMDY0NAotLS0gYS9MaWIvcmxjb21wbGV0ZXIucHkKKysrIGIvTGliL3JsY29tcGxldGVyLnB5CkBAIC0zMyw3ICszMyw2IEBACiAKICIiIgogCi1pbXBvcnQgcmVhZGxpbmUKIGltcG9ydCBfX2J1aWx0aW5fXwogaW1wb3J0IF9fbWFpbl9fCiAKQEAgLTE0MSw0ICsxNDAsOSBAQAogICAgICAgICAgICAgcmV0ID0gcmV0ICsgZ2V0X2NsYXNzX21lbWJlcnMoYmFzZSkKICAgICByZXR1cm4gcmV0CiAKLXJlYWRsaW5lLnNldF9jb21wbGV0ZXIoQ29tcGxldGVyKCkuY29tcGxldGUpCit0cnk6CisgICAgaW1wb3J0IHJlYWRsaW5lCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKENvbXBsZXRlcigpLmNvbXBsZXRlKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vUEtHLUlORk8gYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9QS0ctSU5GTwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1YzFhMS4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9QS0ctSU5GTworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLU1ldGFkYXRhLVZlcnNpb246IDEuMAotTmFtZTogc2V0dXB0b29scwotVmVyc2lvbjogMC43YTFkZXYtcjQ1NTM2Ci1TdW1tYXJ5OiBEb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzIC0tIGVhc2lseSEKLUhvbWUtcGFnZTogaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL3NldHVwdG9vbHMKLUF1dGhvcjogUGhpbGxpcCBKLiBFYnkKLUF1dGhvci1lbWFpbDogcGVha0BlYnktc2FybmEuY29tCi1MaWNlbnNlOiBQU0Ygb3IgWlBMCi1EZXNjcmlwdGlvbjogYGBzZXR1cHRvb2xzYGAgaXMgYSBjb2xsZWN0aW9uIG9mIGVuaGFuY2VtZW50cyB0byB0aGUgUHl0aG9uIGBgZGlzdHV0aWxzYGAKLSAgICAgICAgKGZvciBQeXRob24gMi4zLjUgYW5kIHVwIG9uIG1vc3QgcGxhdGZvcm1zOyA2NC1iaXQgcGxhdGZvcm1zIHJlcXVpcmUgYSBtaW5pbXVtCi0gICAgICAgIG9mIFB5dGhvbiAyLjQpIHRoYXQgYWxsb3cgeW91IHRvIG1vcmUgZWFzaWx5IGJ1aWxkIGFuZCBkaXN0cmlidXRlIFB5dGhvbgotICAgICAgICBwYWNrYWdlcywgZXNwZWNpYWxseSBvbmVzIHRoYXQgaGF2ZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgcGFja2FnZXMuCi0gICAgICAgIAotICAgICAgICBQYWNrYWdlcyBidWlsdCBhbmQgZGlzdHJpYnV0ZWQgdXNpbmcgYGBzZXR1cHRvb2xzYGAgbG9vayB0byB0aGUgdXNlciBsaWtlCi0gICAgICAgIG9yZGluYXJ5IFB5dGhvbiBwYWNrYWdlcyBiYXNlZCBvbiB0aGUgYGBkaXN0dXRpbHNgYC4gIFlvdXIgdXNlcnMgZG9uJ3QgbmVlZCB0bwotICAgICAgICBpbnN0YWxsIG9yIGV2ZW4ga25vdyBhYm91dCBzZXR1cHRvb2xzIGluIG9yZGVyIHRvIHVzZSB0aGVtLCBhbmQgeW91IGRvbid0Ci0gICAgICAgIGhhdmUgdG8gaW5jbHVkZSB0aGUgZW50aXJlIHNldHVwdG9vbHMgcGFja2FnZSBpbiB5b3VyIGRpc3RyaWJ1dGlvbnMuICBCeQotICAgICAgICBpbmNsdWRpbmcganVzdCBhIHNpbmdsZSBgYm9vdHN0cmFwIG1vZHVsZWBfIChhbiA4SyAucHkgZmlsZSksIHlvdXIgcGFja2FnZSB3aWxsCi0gICAgICAgIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGluc3RhbGwgYGBzZXR1cHRvb2xzYGAgaWYgdGhlIHVzZXIgaXMgYnVpbGRpbmcgeW91cgotICAgICAgICBwYWNrYWdlIGZyb20gc291cmNlIGFuZCBkb2Vzbid0IGhhdmUgYSBzdWl0YWJsZSB2ZXJzaW9uIGFscmVhZHkgaW5zdGFsbGVkLgotICAgICAgICAKLSAgICAgICAgLi4gX2Jvb3RzdHJhcCBtb2R1bGU6IGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL2Rpc3QvZXpfc2V0dXAucHkKLSAgICAgICAgCi0gICAgICAgIEZlYXR1cmUgSGlnaGxpZ2h0czoKLSAgICAgICAgCi0gICAgICAgICogQXV0b21hdGljYWxseSBmaW5kL2Rvd25sb2FkL2luc3RhbGwvdXBncmFkZSBkZXBlbmRlbmNpZXMgYXQgYnVpbGQgdGltZSB1c2luZwotICAgICAgICB0aGUgYEVhc3lJbnN0YWxsIHRvb2wgPGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0RldkNlbnRlci9FYXN5SW5zdGFsbD5gXywKLSAgICAgICAgd2hpY2ggc3VwcG9ydHMgZG93bmxvYWRpbmcgdmlhIEhUVFAsIEZUUCwgU3VidmVyc2lvbiwgYW5kIFNvdXJjZUZvcmdlLCBhbmQKLSAgICAgICAgYXV0b21hdGljYWxseSBzY2FucyB3ZWIgcGFnZXMgbGlua2VkIGZyb20gUHlQSSB0byBmaW5kIGRvd25sb2FkIGxpbmtzLiAgKEl0J3MKLSAgICAgICAgdGhlIGNsb3Nlc3QgdGhpbmcgdG8gQ1BBTiBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciBQeXRob24uKQotICAgICAgICAKLSAgICAgICAgKiBDcmVhdGUgYFB5dGhvbiBFZ2dzIDxodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9EZXZDZW50ZXIvUHl0aG9uRWdncz5gXyAtCi0gICAgICAgIGEgc2luZ2xlLWZpbGUgaW1wb3J0YWJsZSBkaXN0cmlidXRpb24gZm9ybWF0Ci0gICAgICAgIAotICAgICAgICAqIEluY2x1ZGUgZGF0YSBmaWxlcyBpbnNpZGUgeW91ciBwYWNrYWdlIGRpcmVjdG9yaWVzLCB3aGVyZSB5b3VyIGNvZGUgY2FuCi0gICAgICAgIGFjdHVhbGx5IHVzZSB0aGVtLiAgKFB5dGhvbiAyLjQgZGlzdHV0aWxzIGFsc28gc3VwcG9ydHMgdGhpcyBmZWF0dXJlLCBidXQKLSAgICAgICAgc2V0dXB0b29scyBwcm92aWRlcyB0aGUgZmVhdHVyZSBmb3IgUHl0aG9uIDIuMyBwYWNrYWdlcyBhbHNvLCBhbmQgc3VwcG9ydHMKLSAgICAgICAgYWNjZXNzaW5nIGRhdGEgZmlsZXMgaW4gemlwcGVkIHBhY2thZ2VzIHRvby4pCi0gICAgICAgIAotICAgICAgICAqIEF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhbGwgcGFja2FnZXMgaW4geW91ciBzb3VyY2UgdHJlZSwgd2l0aG91dCBsaXN0aW5nIHRoZW0KLSAgICAgICAgaW5kaXZpZHVhbGx5IGluIHNldHVwLnB5Ci0gICAgICAgIAotICAgICAgICAqIEF1dG9tYXRpY2FsbHkgaW5jbHVkZSBhbGwgcmVsZXZhbnQgZmlsZXMgaW4geW91ciBzb3VyY2UgZGlzdHJpYnV0aW9ucywKLSAgICAgICAgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhIGBgTUFOSUZFU1QuaW5gYCBmaWxlLCBhbmQgd2l0aG91dCBoYXZpbmcgdG8gZm9yY2UKLSAgICAgICAgcmVnZW5lcmF0aW9uIG9mIHRoZSBgYE1BTklGRVNUYGAgZmlsZSB3aGVuIHlvdXIgc291cmNlIHRyZWUgY2hhbmdlcy4KLSAgICAgICAgCi0gICAgICAgICogQXV0b21hdGljYWxseSBnZW5lcmF0ZSB3cmFwcGVyIHNjcmlwdHMgb3IgV2luZG93cyAoY29uc29sZSBhbmQgR1VJKSAuZXhlCi0gICAgICAgIGZpbGVzIGZvciBhbnkgbnVtYmVyIG9mICJtYWluIiBmdW5jdGlvbnMgaW4geW91ciBwcm9qZWN0LiAgKE5vdGU6IHRoaXMgaXMgbm90Ci0gICAgICAgIGEgcHkyZXhlIHJlcGxhY2VtZW50OyB0aGUgLmV4ZSBmaWxlcyByZWx5IG9uIHRoZSBsb2NhbCBQeXRob24gaW5zdGFsbGF0aW9uLikKLSAgICAgICAgCi0gICAgICAgICogVHJhbnNwYXJlbnQgUHlyZXggc3VwcG9ydCwgc28gdGhhdCB5b3VyIHNldHVwLnB5IGNhbiBsaXN0IGBgLnB5eGBgIGZpbGVzIGFuZAotICAgICAgICBzdGlsbCB3b3JrIGV2ZW4gd2hlbiB0aGUgZW5kLXVzZXIgZG9lc24ndCBoYXZlIFB5cmV4IGluc3RhbGxlZCAoYXMgbG9uZyBhcwotICAgICAgICB5b3UgaW5jbHVkZSB0aGUgUHlyZXgtZ2VuZXJhdGVkIEMgaW4geW91ciBzb3VyY2UgZGlzdHJpYnV0aW9uKQotICAgICAgICAKLSAgICAgICAgKiBDb21tYW5kIGFsaWFzZXMgLSBjcmVhdGUgcHJvamVjdC1zcGVjaWZpYywgcGVyLXVzZXIsIG9yIHNpdGUtd2lkZSBzaG9ydGN1dAotICAgICAgICBuYW1lcyBmb3IgY29tbW9ubHkgdXNlZCBjb21tYW5kcyBhbmQgb3B0aW9ucwotICAgICAgICAKLSAgICAgICAgKiBQeVBJIHVwbG9hZCBzdXBwb3J0IC0gdXBsb2FkIHlvdXIgc291cmNlIGRpc3RyaWJ1dGlvbnMgYW5kIGVnZ3MgdG8gUHlQSQotICAgICAgICAKLSAgICAgICAgKiBEZXBsb3kgeW91ciBwcm9qZWN0IGluICJkZXZlbG9wbWVudCBtb2RlIiwgc3VjaCB0aGF0IGl0J3MgYXZhaWxhYmxlIG9uCi0gICAgICAgIGBgc3lzLnBhdGhgYCwgeWV0IGNhbiBzdGlsbCBiZSBlZGl0ZWQgZGlyZWN0bHkgZnJvbSBpdHMgc291cmNlIGNoZWNrb3V0LgotICAgICAgICAKLSAgICAgICAgKiBFYXNpbHkgZXh0ZW5kIHRoZSBkaXN0dXRpbHMgd2l0aCBuZXcgY29tbWFuZHMgb3IgYGBzZXR1cCgpYGAgYXJndW1lbnRzLCBhbmQKLSAgICAgICAgZGlzdHJpYnV0ZS9yZXVzZSB5b3VyIGV4dGVuc2lvbnMgZm9yIG11bHRpcGxlIHByb2plY3RzLCB3aXRob3V0IGNvcHlpbmcgY29kZS4KLSAgICAgICAgCi0gICAgICAgICogQ3JlYXRlIGV4dGVuc2libGUgYXBwbGljYXRpb25zIGFuZCBmcmFtZXdvcmtzIHRoYXQgYXV0b21hdGljYWxseSBkaXNjb3ZlcgotICAgICAgICBleHRlbnNpb25zLCB1c2luZyBzaW1wbGUgImVudHJ5IHBvaW50cyIgZGVjbGFyZWQgaW4gYSBwcm9qZWN0J3Mgc2V0dXAgc2NyaXB0LgotICAgICAgICAKLSAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIFB5UEkgZG93bmxvYWRzLCB0aGUgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBgYHNldHVwdG9vbHNgYAotICAgICAgICBpcyBhdmFpbGFibGUgZnJvbSB0aGUgYFB5dGhvbiBTVk4gc2FuZGJveGBfLCBhbmQgaW4tZGV2ZWxvcG1lbnQgdmVyc2lvbnMgb2YgdGhlCi0gICAgICAgIGAwLjYgYnJhbmNoYF8gYXJlIGF2YWlsYWJsZSBhcyB3ZWxsLgotICAgICAgICAKLSAgICAgICAgLi4gXzAuNiBicmFuY2g6IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9zYW5kYm94L2JyYW5jaGVzL3NldHVwdG9vbHMtMC42LyNlZ2c9c2V0dXB0b29scy1kZXYwNgotICAgICAgICAKLSAgICAgICAgLi4gX1B5dGhvbiBTVk4gc2FuZGJveDogaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL3NhbmRib3gvdHJ1bmsvc2V0dXB0b29scy8jZWdnPXNldHVwdG9vbHMtZGV2Ci0gICAgICAgIAotICAgICAgICAKLUtleXdvcmRzOiBDUEFOIFB5UEkgZGlzdHV0aWxzIGVnZ3MgcGFja2FnZSBtYW5hZ2VtZW50Ci1QbGF0Zm9ybTogVU5LTk9XTgotQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDMgLSBBbHBoYQotQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwotQ2xhc3NpZmllcjogTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZQotQ2xhc3NpZmllcjogTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogWm9wZSBQdWJsaWMgTGljZW5zZQotQ2xhc3NpZmllcjogT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudAotQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uCi1DbGFzc2lmaWVyOiBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMgOjogUHl0aG9uIE1vZHVsZXMKLUNsYXNzaWZpZXI6IFRvcGljIDo6IFN5c3RlbSA6OiBBcmNoaXZpbmcgOjogUGFja2FnaW5nCi1DbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogU3lzdGVtcyBBZG1pbmlzdHJhdGlvbgotQ2xhc3NpZmllcjogVG9waWMgOjogVXRpbGl0aWVzCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9lbnRyeV9wb2ludHMudHh0IGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vZW50cnlfcG9pbnRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFmZTJjYi4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9lbnRyeV9wb2ludHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotW2Rpc3R1dGlscy5zZXR1cF9rZXl3b3Jkc10KLWRlcGVuZGVuY3lfbGlua3MgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0Ci1lbnRyeV9wb2ludHMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZW50cnlfcG9pbnRzCi1leHRyYXNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMKLXBhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEKLWluc3RhbGxfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCi1pbmNsdWRlX3BhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAotZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCi1uYW1lc3BhY2VfcGFja2FnZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfbnNwCi10ZXN0X3N1aXRlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3Rlc3Rfc3VpdGUKLWVhZ2VyX3Jlc291cmNlcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKLXppcF9zYWZlID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCi10ZXN0X2xvYWRlciA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlCi10ZXN0c19yZXF1aXJlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cwotCi1bc2V0dXB0b29scy5maWxlX2ZpbmRlcnNdCi1zdm5fY3ZzID0gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0Ol9kZWZhdWx0X3JldmN0cmwKLQotW2VnZ19pbmZvLndyaXRlcnNdCi1kZXBlbmRlbmN5X2xpbmtzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCi1yZXF1aXJlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzCi1QS0ctSU5GTyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbwotZWFnZXJfcmVzb3VyY2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCi10b3BfbGV2ZWwudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3RvcGxldmVsX25hbWVzCi1uYW1lc3BhY2VfcGFja2FnZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKLWVudHJ5X3BvaW50cy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfZW50cmllcwotZGVwZW5kcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d2Fybl9kZXBlbmRzX29ic29sZXRlCi0KLVtjb25zb2xlX3NjcmlwdHNdCi1lYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KLWVhc3lfaW5zdGFsbC0yLjUgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KLQotW2Rpc3R1dGlscy5jb21tYW5kc10KLWJkaXN0X3JwbSA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9ycG06YmRpc3RfcnBtCi1yb3RhdGUgPSBzZXR1cHRvb2xzLmNvbW1hbmQucm90YXRlOnJvdGF0ZQotZGV2ZWxvcCA9IHNldHVwdG9vbHMuY29tbWFuZC5kZXZlbG9wOmRldmVsb3AKLXNldG9wdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQ6c2V0b3B0Ci1idWlsZF9weSA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9weTpidWlsZF9weQotc2F2ZW9wdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMKLWVnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOmVnZ19pbmZvCi1pbnN0YWxsX2VnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm86aW5zdGFsbF9lZ2dfaW5mbwotYWxpYXMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMKLWVhc3lfaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6ZWFzeV9pbnN0YWxsCi1pbnN0YWxsX3NjcmlwdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzOmluc3RhbGxfc2NyaXB0cwotYmRpc3RfZWdnID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZzpiZGlzdF9lZ2cKLWluc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbDppbnN0YWxsCi10ZXN0ID0gc2V0dXB0b29scy5jb21tYW5kLnRlc3Q6dGVzdAotaW5zdGFsbF9saWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWI6aW5zdGFsbF9saWIKLWJ1aWxkX2V4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9leHQ6YnVpbGRfZXh0Ci1zZGlzdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdDpzZGlzdAotCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby90b3BfbGV2ZWwudHh0IGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vdG9wX2xldmVsLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3N2M2YS4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby90b3BfbGV2ZWwudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1lYXN5X2luc3RhbGwKLXBrZ19yZXNvdXJjZXMKLXNldHVwdG9vbHMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL3ppcC1zYWZlIGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vemlwLXNhZmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vemlwLXNhZmUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvX19pbml0X18ucHkgYi9MaWIvc2V0dXB0b29scy9fX2luaXRfXy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyMWNlMi4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9fX2luaXRfXy5weQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSIiIkV4dGVuc2lvbnMgdG8gdGhlICdkaXN0dXRpbHMnIGZvciBsYXJnZSBvciBjb21wbGV4IGRpc3RyaWJ1dGlvbnMiIiIKLWZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbiwgTGlicmFyeQotZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgRmVhdHVyZSwgX2dldF91bnBhdGNoZWQKLWltcG9ydCBkaXN0dXRpbHMuY29yZSwgc2V0dXB0b29scy5jb21tYW5kCi1mcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZCBhcyBfQ29tbWFuZAotZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCi1pbXBvcnQgb3MucGF0aAotCi1fX3ZlcnNpb25fXyA9ICcwLjdhMScKLV9fYWxsX18gPSBbCi0gICAgJ3NldHVwJywgJ0Rpc3RyaWJ1dGlvbicsICdGZWF0dXJlJywgJ0NvbW1hbmQnLCAnRXh0ZW5zaW9uJywgJ1JlcXVpcmUnLAotICAgICdmaW5kX3BhY2thZ2VzJwotXQotCi1ib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQotCi1kZWYgZmluZF9wYWNrYWdlcyh3aGVyZT0nLicsIGV4Y2x1ZGU9KCkpOgotICAgICIiIlJldHVybiBhIGxpc3QgYWxsIFB5dGhvbiBwYWNrYWdlcyBmb3VuZCB3aXRoaW4gZGlyZWN0b3J5ICd3aGVyZScKLQotICAgICd3aGVyZScgc2hvdWxkIGJlIHN1cHBsaWVkIGFzIGEgImNyb3NzLXBsYXRmb3JtIiAoaS5lLiBVUkwtc3R5bGUpIHBhdGg7IGl0Ci0gICAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2FsIHBhdGggc3ludGF4LiAgJ2V4Y2x1ZGUnIGlzIGEKLSAgICBzZXF1ZW5jZSBvZiBwYWNrYWdlIG5hbWVzIHRvIGV4Y2x1ZGU7ICcqJyBjYW4gYmUgdXNlZCBhcyBhIHdpbGRjYXJkIGluIHRoZQotICAgIG5hbWVzLCBzdWNoIHRoYXQgJ2Zvby4qJyB3aWxsIGV4Y2x1ZGUgYWxsIHN1YnBhY2thZ2VzIG9mICdmb28nIChidXQgbm90Ci0gICAgJ2ZvbycgaXRzZWxmKS4KLSAgICAiIiIKLSAgICBvdXQgPSBbXQotICAgIHN0YWNrPVsoY29udmVydF9wYXRoKHdoZXJlKSwgJycpXQotICAgIHdoaWxlIHN0YWNrOgotICAgICAgICB3aGVyZSxwcmVmaXggPSBzdGFjay5wb3AoMCkKLSAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcih3aGVyZSk6Ci0gICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbih3aGVyZSxuYW1lKQotICAgICAgICAgICAgaWYgKG9zLnBhdGguaXNkaXIoZm4pIGFuZAotICAgICAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihmbiwnX19pbml0X18ucHknKSkKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZChwcmVmaXgrbmFtZSk7IHN0YWNrLmFwcGVuZCgoZm4scHJlZml4K25hbWUrJy4nKSkKLSAgICBmb3IgcGF0IGluIGV4Y2x1ZGU6Ci0gICAgICAgIGZyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaGNhc2UKLSAgICAgICAgb3V0ID0gW2l0ZW0gZm9yIGl0ZW0gaW4gb3V0IGlmIG5vdCBmbm1hdGNoY2FzZShpdGVtLHBhdCldCi0gICAgcmV0dXJuIG91dAotCi1zZXR1cCA9IGRpc3R1dGlscy5jb3JlLnNldHVwCi0KLV9Db21tYW5kID0gX2dldF91bnBhdGNoZWQoX0NvbW1hbmQpCi0KLWNsYXNzIENvbW1hbmQoX0NvbW1hbmQpOgotICAgIF9fZG9jX18gPSBfQ29tbWFuZC5fX2RvY19fCi0KLSAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCwgKiprdyk6Ci0gICAgICAgICMgQWRkIHN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzCi0gICAgICAgIF9Db21tYW5kLl9faW5pdF9fKHNlbGYsZGlzdCkKLSAgICAgICAgZm9yIGssdiBpbiBrdy5pdGVtcygpOgotICAgICAgICAgICAgc2V0YXR0cihzZWxmLGssdikKLQotICAgIGRlZiByZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHM9MCwgKiprdyk6Ci0gICAgICAgIGNtZCA9IF9Db21tYW5kLnJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcykKLSAgICAgICAgZm9yIGssdiBpbiBrdy5pdGVtcygpOgotICAgICAgICAgICAgc2V0YXR0cihjbWQsayx2KSAgICAjIHVwZGF0ZSBjb21tYW5kIHdpdGgga2V5d29yZHMKLSAgICAgICAgcmV0dXJuIGNtZAotCi1pbXBvcnQgZGlzdHV0aWxzLmNvcmUKLWRpc3R1dGlscy5jb3JlLkNvbW1hbmQgPSBDb21tYW5kICAgICMgd2UgY2FuJ3QgcGF0Y2ggZGlzdHV0aWxzLmNtZCwgYWxhcwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5IGIvTGliL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZDljNjg0Li4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL2FyY2hpdmVfdXRpbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0iIiJVdGlsaXRpZXMgZm9yIGV4dHJhY3RpbmcgY29tbW9uIGFyY2hpdmUgZm9ybWF0cyIiIgotCi0KLV9fYWxsX18gPSBbCi0gICAgInVucGFja19hcmNoaXZlIiwgInVucGFja196aXBmaWxlIiwgInVucGFja190YXJmaWxlIiwgImRlZmF1bHRfZmlsdGVyIiwKLSAgICAiVW5yZWNvZ25pemVkRm9ybWF0IiwgImV4dHJhY3Rpb25fZHJpdmVycyIsICJ1bnBhY2tfZGlyZWN0b3J5IiwKLV0KLQotaW1wb3J0IHppcGZpbGUsIHRhcmZpbGUsIG9zLCBzaHV0aWwKLWZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgZW5zdXJlX2RpcmVjdG9yeQotZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgotCi1jbGFzcyBVbnJlY29nbml6ZWRGb3JtYXQoRGlzdHV0aWxzRXJyb3IpOgotICAgICIiIkNvdWxkbid0IHJlY29nbml6ZSB0aGUgYXJjaGl2ZSB0eXBlIiIiCi0KLWRlZiBkZWZhdWx0X2ZpbHRlcihzcmMsZHN0KToKLSAgICAiIiJUaGUgZGVmYXVsdCBwcm9ncmVzcy9maWx0ZXIgY2FsbGJhY2s7IHJldHVybnMgVHJ1ZSBmb3IgYWxsIGZpbGVzIiIiCi0gICAgcmV0dXJuIGRzdAotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWRlZiB1bnBhY2tfYXJjaGl2ZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlciwKLSAgICBkcml2ZXJzPU5vbmUKLSk6Ci0gICAgIiIiVW5wYWNrIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYCwgb3IgcmFpc2UgYGBVbnJlY29nbml6ZWRGb3JtYXRgYAotCi0gICAgYHByb2dyZXNzX2ZpbHRlcmAgaXMgYSBmdW5jdGlvbiB0YWtpbmcgdHdvIGFyZ3VtZW50czogYSBzb3VyY2UgcGF0aAotICAgIGludGVybmFsIHRvIHRoZSBhcmNoaXZlICgnLyctc2VwYXJhdGVkKSwgYW5kIGEgZmlsZXN5c3RlbSBwYXRoIHdoZXJlIGl0Ci0gICAgd2lsbCBiZSBleHRyYWN0ZWQuICBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIGRlc2lyZWQgZXh0cmFjdCBwYXRoCi0gICAgKHdoaWNoIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBpbiksIG9yIGVsc2UgYGBOb25lYGAgdG8gc2tpcAotICAgIHRoYXQgZmlsZSBvciBkaXJlY3RvcnkuICBUaGUgY2FsbGJhY2sgY2FuIHRodXMgYmUgdXNlZCB0byByZXBvcnQgb24gdGhlCi0gICAgcHJvZ3Jlc3Mgb2YgdGhlIGV4dHJhY3Rpb24sIGFzIHdlbGwgYXMgdG8gZmlsdGVyIHRoZSBpdGVtcyBleHRyYWN0ZWQgb3IKLSAgICBhbHRlciB0aGVpciBleHRyYWN0aW9uIHBhdGhzLgotCi0gICAgYGRyaXZlcnNgLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBmdW5jdGlvbnMgd2l0aCB0aGUKLSAgICBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIGZ1bmN0aW9uIChtaW51cyB0aGUgYGRyaXZlcnNgIGFyZ3VtZW50KSwgdGhhdCByYWlzZQotICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBleHRyYWN0aW5nIHRoZSBkZXNpZ25hdGVkCi0gICAgYXJjaGl2ZSB0eXBlLiAgVGhlIGBkcml2ZXJzYCBhcmUgdHJpZWQgaW4gc2VxdWVuY2UgdW50aWwgb25lIGlzIGZvdW5kIHRoYXQKLSAgICBkb2VzIG5vdCByYWlzZSBhbiBlcnJvciwgb3IgdW50aWwgYWxsIGFyZSBleGhhdXN0ZWQgKGluIHdoaWNoIGNhc2UKLSAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlzIHJhaXNlZCkuICBJZiB5b3UgZG8gbm90IHN1cHBseSBhIHNlcXVlbmNlIG9mCi0gICAgZHJpdmVycywgdGhlIG1vZHVsZSdzIGBgZXh0cmFjdGlvbl9kcml2ZXJzYGAgY29uc3RhbnQgd2lsbCBiZSB1c2VkLCB3aGljaAotICAgIG1lYW5zIHRoYXQgYGB1bnBhY2tfemlwZmlsZWBgIGFuZCBgYHVucGFja190YXJmaWxlYGAgd2lsbCBiZSB0cmllZCwgaW4gdGhhdAotICAgIG9yZGVyLgotICAgICIiIgotICAgIGZvciBkcml2ZXIgaW4gZHJpdmVycyBvciBleHRyYWN0aW9uX2RyaXZlcnM6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGRyaXZlcihmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcikKLSAgICAgICAgZXhjZXB0IFVucmVjb2duaXplZEZvcm1hdDoKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICBlbHNlOgotICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCi0gICAgICAgICAgICAiTm90IGEgcmVjb2duaXplZCBhcmNoaXZlIHR5cGU6ICVzIiAlIGZpbGVuYW1lCi0gICAgICAgICkKLQotCi0KLQotCi0KLQotZGVmIHVucGFja19kaXJlY3RvcnkoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgotICAgICIiIiJVbnBhY2siIGEgZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgZm9yIGFyY2hpdmVzCi0KLSAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIGRpcmVjdG9yeQotICAgICIiIgotICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKLSAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KCIlcyBpcyBub3QgYSBkaXJlY3RvcnkiICUgKGZpbGVuYW1lLCkpCi0KLSAgICBwYXRocyA9IHtmaWxlbmFtZTooJycsZXh0cmFjdF9kaXIpfQotICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGZpbGVuYW1lKToKLSAgICAgICAgc3JjLGRzdCA9IHBhdGhzW2Jhc2VdCi0gICAgICAgIGZvciBkIGluIGRpcnM6Ci0gICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSxkKV0gPSBzcmMrZCsnLycsIG9zLnBhdGguam9pbihkc3QsZCkKLSAgICAgICAgZm9yIGYgaW4gZmlsZXM6Ci0gICAgICAgICAgICBuYW1lID0gc3JjK2YKLSAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihkc3QsZikKLSAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihzcmMrZiwgdGFyZ2V0KQotICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKLSAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIHNraXAgbm9uLWZpbGVzCi0gICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKLSAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oYmFzZSxmKQotICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKGYsIHRhcmdldCkKLSAgICAgICAgICAgIHNodXRpbC5jb3B5c3RhdChmLCB0YXJnZXQpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1kZWYgdW5wYWNrX3ppcGZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgotICAgICIiIlVucGFjayB6aXAgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgCi0KLSAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIHppcGZpbGUgKGFzIGRldGVybWluZWQKLSAgICBieSBgYHppcGZpbGUuaXNfemlwZmlsZSgpYGApLiAgU2VlIGBgdW5wYWNrX2FyY2hpdmUoKWBgIGZvciBhbiBleHBsYW5hdGlvbgotICAgIG9mIHRoZSBgcHJvZ3Jlc3NfZmlsdGVyYCBhcmd1bWVudC4KLSAgICAiIiIKLQotICAgIGlmIG5vdCB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpOgotICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIHppcCBmaWxlIiAlIChmaWxlbmFtZSwpKQotCi0gICAgeiA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkKLSAgICB0cnk6Ci0gICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKLSAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCi0KLSAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQotICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcvJykgb3IgJy4uJyBpbiBuYW1lOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKLSAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCB0YXJnZXQpCi0gICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcvJyk6Ci0gICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBmaWxlCi0gICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCi0gICAgICAgICAgICAgICAgZGF0YSA9IHoucmVhZChpbmZvLmZpbGVuYW1lKQotICAgICAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwnd2InKQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQotICAgICAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICBkZWwgZGF0YQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHouY2xvc2UoKQotCi0KLWRlZiB1bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6Ci0gICAgIiIiVW5wYWNrIHRhci90YXIuZ3ovdGFyLmJ6MiBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKLQotICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgdGFyZmlsZSAoYXMgZGV0ZXJtaW5lZAotICAgIGJ5IGBgdGFyZmlsZS5vcGVuKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCi0gICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgotICAgICIiIgotCi0gICAgdHJ5OgotICAgICAgICB0YXJvYmogPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUpCi0gICAgZXhjZXB0IHRhcmZpbGUuVGFyRXJyb3I6Ci0gICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKLSAgICAgICAgICAgICIlcyBpcyBub3QgYSBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZSIgJSAoZmlsZW5hbWUsKQotICAgICAgICApCi0KLSAgICB0cnk6Ci0gICAgICAgIHRhcm9iai5jaG93biA9IGxhbWJkYSAqYXJnczogTm9uZSAgICMgZG9uJ3QgZG8gYW55IGNob3duaW5nIQotICAgICAgICBmb3IgbWVtYmVyIGluIHRhcm9iajoKLSAgICAgICAgICAgIGlmIG1lbWJlci5pc2ZpbGUoKSBvciBtZW1iZXIuaXNkaXIoKToKLSAgICAgICAgICAgICAgICBuYW1lID0gbWVtYmVyLm5hbWUKLSAgICAgICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KLSAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCcvJykgYW5kICcuLicgbm90IGluIG5hbWU6Ci0gICAgICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihleHRyYWN0X2RpciwgKm5hbWUuc3BsaXQoJy8nKSkKLSAgICAgICAgICAgICAgICAgICAgZHN0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIGRzdCkKLSAgICAgICAgICAgICAgICAgICAgaWYgZHN0OgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKG9zLnNlcCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ID0gZHN0WzotMV0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcm9iai5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLGRzdCkgICMgWFhYIFVnaAotICAgICAgICByZXR1cm4gVHJ1ZQotICAgIGZpbmFsbHk6Ci0gICAgICAgIHRhcm9iai5jbG9zZSgpCi0KLQotCi0KLWV4dHJhY3Rpb25fZHJpdmVycyA9IHVucGFja19kaXJlY3RvcnksIHVucGFja196aXBmaWxlLCB1bnBhY2tfdGFyZmlsZQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY2xpLmV4ZSBiL0xpYi9zZXR1cHRvb2xzL2NsaS5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjODMzMzkuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvY2xpLmV4ZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmY1M2U3Li4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1fX2FsbF9fID0gWwotICAgICdhbGlhcycsICdiZGlzdF9lZ2cnLCAnYmRpc3RfcnBtJywgJ2J1aWxkX2V4dCcsICdidWlsZF9weScsICdkZXZlbG9wJywKLSAgICAnZWFzeV9pbnN0YWxsJywgJ2VnZ19pbmZvJywgJ2luc3RhbGwnLCAnaW5zdGFsbF9saWInLCAncm90YXRlJywgJ3NhdmVvcHRzJywKLSAgICAnc2Rpc3QnLCAnc2V0b3B0JywgJ3Rlc3QnLCAndXBsb2FkJywgJ2luc3RhbGxfZWdnX2luZm8nLCAnaW5zdGFsbF9zY3JpcHRzJywKLV0KLQotaW1wb3J0IHN5cwotaWYgc3lzLnZlcnNpb24+PScyLjUnOgotICAgICMgSW4gUHl0aG9uIDIuNSBhbmQgYWJvdmUsIGRpc3R1dGlscyBpbmNsdWRlcyBpdHMgb3duIHVwbG9hZCBjb21tYW5kCi0gICAgX19hbGxfXy5yZW1vdmUoJ3VwbG9hZCcpCi0KLQotZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdCBpbXBvcnQgYmRpc3QKLQotaWYgJ2VnZycgbm90IGluIGJkaXN0LmZvcm1hdF9jb21tYW5kczoKLSAgICBiZGlzdC5mb3JtYXRfY29tbWFuZFsnZWdnJ10gPSAoJ2JkaXN0X2VnZycsICJQeXRob24gLmVnZyBmaWxlIikKLSAgICBiZGlzdC5mb3JtYXRfY29tbWFuZHMuYXBwZW5kKCdlZ2cnKQotCi1kZWwgYmRpc3QsIHN5cwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFkZjQ3NGEuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLWltcG9ydCBkaXN0dXRpbHMsIG9zCi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKLWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwotZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCi1mcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZSwgY29uZmlnX2ZpbGUKLQotZGVmIHNocXVvdGUoYXJnKToKLSAgICAiIiJRdW90ZSBhbiBhcmd1bWVudCBmb3IgbGF0ZXIgcGFyc2luZyBieSBzaGxleC5zcGxpdCgpIiIiCi0gICAgZm9yIGMgaW4gJyInLCAiJyIsICJcXCIsICIjIjoKLSAgICAgICAgaWYgYyBpbiBhcmc6IHJldHVybiByZXByKGFyZykKLSAgICBpZiBhcmcuc3BsaXQoKTw+W2FyZ106Ci0gICAgICAgIHJldHVybiByZXByKGFyZykKLSAgICByZXR1cm4gYXJnCi0KLQotY2xhc3MgYWxpYXMob3B0aW9uX2Jhc2UpOgotICAgICIiIkRlZmluZSBhIHNob3J0Y3V0IHRoYXQgaW52b2tlcyBvbmUgb3IgbW9yZSBjb21tYW5kcyIiIgotCi0gICAgZGVzY3JpcHRpb24gPSAiZGVmaW5lIGEgc2hvcnRjdXQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGNvbW1hbmRzIgotICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQotCi0gICAgdXNlcl9vcHRpb25zID0gWwotICAgICAgICAoJ3JlbW92ZScsICAgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIGFsaWFzJyksCi0gICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucwotCi0gICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQotCi0gICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCi0gICAgICAgIHNlbGYuYXJncyA9IE5vbmUKLSAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCi0KLSAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQotICAgICAgICBpZiBzZWxmLnJlbW92ZSBhbmQgbGVuKHNlbGYuYXJncyk8PjE6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKLSAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgYWxpYXMgbmFtZSkgd2hlbiAiCi0gICAgICAgICAgICAgICAgInVzaW5nIC0tcmVtb3ZlIgotICAgICAgICAgICAgKQotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgYWxpYXNlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnYWxpYXNlcycpCi0KLSAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKLSAgICAgICAgICAgIHByaW50ICJDb21tYW5kIEFsaWFzZXMiCi0gICAgICAgICAgICBwcmludCAiLS0tLS0tLS0tLS0tLS0tIgotICAgICAgICAgICAgZm9yIGFsaWFzIGluIGFsaWFzZXM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgInNldHVwLnB5IGFsaWFzIiwgZm9ybWF0X2FsaWFzKGFsaWFzLCBhbGlhc2VzKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgZWxpZiBsZW4oc2VsZi5hcmdzKT09MToKLSAgICAgICAgICAgIGFsaWFzLCA9IHNlbGYuYXJncwotICAgICAgICAgICAgaWYgc2VsZi5yZW1vdmU6Ci0gICAgICAgICAgICAgICAgY29tbWFuZCA9IE5vbmUKLSAgICAgICAgICAgIGVsaWYgYWxpYXMgaW4gYWxpYXNlczoKLSAgICAgICAgICAgICAgICBwcmludCAic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICJObyBhbGlhcyBkZWZpbml0aW9uIGZvdW5kIGZvciAlciIgJSBhbGlhcwotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYWxpYXMgPSBzZWxmLmFyZ3NbMF0KLSAgICAgICAgICAgIGNvbW1hbmQgPSAnICcuam9pbihtYXAoc2hxdW90ZSxzZWxmLmFyZ3NbMTpdKSkKLQotICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCB7J2FsaWFzZXMnOiB7YWxpYXM6Y29tbWFuZH19LCBzZWxmLmRyeV9ydW4pCi0KLQotZGVmIGZvcm1hdF9hbGlhcyhuYW1lLCBhbGlhc2VzKToKLSAgICBzb3VyY2UsIGNvbW1hbmQgPSBhbGlhc2VzW25hbWVdCi0gICAgaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdnbG9iYWwnKToKLSAgICAgICAgc291cmNlID0gJy0tZ2xvYmFsLWNvbmZpZyAnCi0gICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ3VzZXInKToKLSAgICAgICAgc291cmNlID0gJy0tdXNlci1jb25maWcgJwotICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdsb2NhbCcpOgotICAgICAgICBzb3VyY2UgPSAnJwotICAgIGVsc2U6Ci0gICAgICAgIHNvdXJjZSA9ICctLWZpbGVuYW1lPSVyJyAlIHNvdXJjZQotICAgIHJldHVybiBzb3VyY2UrbmFtZSsnICcrY29tbWFuZApkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3ZDg4ZC4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0iIiJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfZWdnCi0KLUJ1aWxkIC5lZ2cgZGlzdHJpYnV0aW9ucyIiIgotCi0jIFRoaXMgbW9kdWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zCi1pbXBvcnQgc3lzLCBvcywgbWFyc2hhbAotZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCi1mcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgcmVtb3ZlX3RyZWUsIG1rcGF0aAotZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX3ZlcnNpb24sIGdldF9weXRob25fbGliCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCi1mcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGdldF9idWlsZF9wbGF0Zm9ybSwgRGlzdHJpYnV0aW9uCi1mcm9tIHR5cGVzIGltcG9ydCBDb2RlVHlwZQotZnJvbSBzZXR1cHRvb2xzLmV4dGVuc2lvbiBpbXBvcnQgTGlicmFyeQotCi1kZWYgd3JpdGVfc3R1YihyZXNvdXJjZSwgcHlmaWxlKToKLSAgICBmID0gb3BlbihweWZpbGUsJ3cnKQotICAgIGYud3JpdGUoJ1xuJy5qb2luKFsKLSAgICAgICAgImRlZiBfX2Jvb3RzdHJhcF9fKCk6IiwKLSAgICAgICAgIiAgIGdsb2JhbCBfX2Jvb3RzdHJhcF9fLCBfX2xvYWRlcl9fLCBfX2ZpbGVfXyIsCi0gICAgICAgICIgICBpbXBvcnQgc3lzLCBwa2dfcmVzb3VyY2VzLCBpbXAiLAotICAgICAgICAiICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCVyKSIKLSAgICAgICAgICAgICUgcmVzb3VyY2UsCi0gICAgICAgICIgICBkZWwgX19ib290c3RyYXBfXywgX19sb2FkZXJfXyIsCi0gICAgICAgICIgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKSIsCi0gICAgICAgICJfX2Jvb3RzdHJhcF9fKCkiLAotICAgICAgICAiIiAjIHRlcm1pbmFsIFxuCi0gICAgXSkpCi0gICAgZi5jbG9zZSgpCi0KLSMgc3R1YiBfX2luaXRfXy5weSBmb3IgcGFja2FnZXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBvbmUKLU5TX1BLR19TVFVCID0gJ19faW1wb3J0X18oInBrZ19yZXNvdXJjZXMiKS5kZWNsYXJlX25hbWVzcGFjZShfX25hbWVfXyknCi0KLQotCi0KLQotCi0KLQotCi0KLWNsYXNzIGJkaXN0X2VnZyhDb21tYW5kKToKLQotICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhbiBcImVnZ1wiIGRpc3RyaWJ1dGlvbiIKLQotICAgIHVzZXJfb3B0aW9ucyA9IFsKLSAgICAgICAgKCdiZGlzdC1kaXI9JywgJ2InLAotICAgICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24iKSwKLSAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAotICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCi0gICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfYnVpbGRfcGxhdGZvcm0oKSksCi0gICAgICAgICgnZXhjbHVkZS1zb3VyY2UtZmlsZXMnLCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgInJlbW92ZSBhbGwgLnB5IGZpbGVzIGZyb20gdGhlIGdlbmVyYXRlZCBlZ2ciKSwKLSAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCi0gICAgICAgICAgICAgICAgICAgICAia2VlcCB0aGUgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlIGFyb3VuZCBhZnRlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUiKSwKLSAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCi0gICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCBmaW5hbCBidWlsdCBkaXN0cmlidXRpb25zIGluIiksCi0gICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKLSAgICBdCi0KLSAgICBib29sZWFuX29wdGlvbnMgPSBbCi0gICAgICAgICdrZWVwLXRlbXAnLCAnc2tpcC1idWlsZCcsICdleGNsdWRlLXNvdXJjZS1maWxlcycKLSAgICBdCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgotICAgICAgICBzZWxmLmJkaXN0X2RpciA9IE5vbmUKLSAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCi0gICAgICAgIHNlbGYua2VlcF90ZW1wID0gMAotICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQotICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSAwCi0gICAgICAgIHNlbGYuZWdnX291dHB1dCA9IE5vbmUKLSAgICAgICAgc2VsZi5leGNsdWRlX3NvdXJjZV9maWxlcyA9IE5vbmUKLQotCi0gICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCi0gICAgICAgIHNlbGYuZWdnX2luZm8gPSBlaV9jbWQuZWdnX2luZm8KLQotICAgICAgICBpZiBzZWxmLmJkaXN0X2RpciBpcyBOb25lOgotICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKLSAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gb3MucGF0aC5qb2luKGJkaXN0X2Jhc2UsICdlZ2cnKQotCi0gICAgICAgIGlmIHNlbGYucGxhdF9uYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCi0KLSAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCi0KLSAgICAgICAgaWYgc2VsZi5lZ2dfb3V0cHV0IGlzIE5vbmU6Ci0KLSAgICAgICAgICAgICMgQ29tcHV0ZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IGVnZwotICAgICAgICAgICAgYmFzZW5hbWUgPSBEaXN0cmlidXRpb24oCi0gICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgZ2V0X3B5dGhvbl92ZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkgYW5kIHNlbGYucGxhdF9uYW1lCi0gICAgICAgICAgICApLmVnZ19uYW1lKCkKLQotICAgICAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGJhc2VuYW1lKycuZWdnJykKLQotCi0KLQotCi0KLQotCi0gICAgZGVmIGRvX2luc3RhbGxfZGF0YShzZWxmKToKLSAgICAgICAgIyBIYWNrIGZvciBwYWNrYWdlcyB0aGF0IGluc3RhbGwgZGF0YSB0byBpbnN0YWxsJ3MgLS1pbnN0YWxsLWxpYgotICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmluc3RhbGxfbGliID0gc2VsZi5iZGlzdF9kaXIKLQotICAgICAgICBzaXRlX3BhY2thZ2VzID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKGdldF9weXRob25fbGliKCkpKQotICAgICAgICBvbGQsIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzLFtdCi0KLSAgICAgICAgZm9yIGl0ZW0gaW4gb2xkOgotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLHR1cGxlKSBhbmQgbGVuKGl0ZW0pPT0yOgotICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoaXRlbVswXSk6Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5yZWFscGF0aChpdGVtWzBdKQotICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkID0gb3MucGF0aC5ub3JtY2FzZShyZWFscGF0aCkKLSAgICAgICAgICAgICAgICAgICAgaWYgbm9ybWFsaXplZD09c2l0ZV9wYWNrYWdlcyBvciBub3JtYWxpemVkLnN0YXJ0c3dpdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXRlX3BhY2thZ2VzK29zLnNlcAotICAgICAgICAgICAgICAgICAgICApOgotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlYWxwYXRoW2xlbihzaXRlX3BhY2thZ2VzKSsxOl0sIGl0ZW1bMV0KLSAgICAgICAgICAgICAgICAgICAgIyBYWFggZWxzZTogcmFpc2UgPz8/Ci0gICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzLmFwcGVuZChpdGVtKQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHBhY2thZ2UgZGF0YSB0byAlcyIgJSBzZWxmLmJkaXN0X2RpcikKLSAgICAgICAgICAgIHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2RhdGEnLCBmb3JjZT0wLCByb290PU5vbmUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gb2xkCi0KLQotICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIFtzZWxmLmVnZ19vdXRwdXRdCi0KLQotICAgIGRlZiBjYWxsX2NvbW1hbmQoc2VsZixjbWRuYW1lLCoqa3cpOgotICAgICAgICAiIiJJbnZva2UgcmVpbml0aWFsaXplZCBjb21tYW5kIGBjbWRuYW1lYCB3aXRoIGtleXdvcmQgYXJncyIiIgotICAgICAgICBmb3IgZGlybmFtZSBpbiBJTlNUQUxMX0RJUkVDVE9SWV9BVFRSUzoKLSAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoZGlybmFtZSxzZWxmLmJkaXN0X2RpcikKLSAgICAgICAga3cuc2V0ZGVmYXVsdCgnc2tpcF9idWlsZCcsc2VsZi5za2lwX2J1aWxkKQotICAgICAgICBrdy5zZXRkZWZhdWx0KCdkcnlfcnVuJywgc2VsZi5kcnlfcnVuKQotICAgICAgICBjbWQgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKGNtZG5hbWUsICoqa3cpCi0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kbmFtZSkKLSAgICAgICAgcmV0dXJuIGNtZAotCi0KLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICAjIEdlbmVyYXRlIG1ldGFkYXRhIGZpcnN0Ci0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKLQotICAgICAgICAjIFdlIHJ1biBpbnN0YWxsX2xpYiBiZWZvcmUgaW5zdGFsbF9kYXRhLCBiZWNhdXNlIHNvbWUgZGF0YSBoYWNrcwotICAgICAgICAjIHB1bGwgdGhlaXIgZGF0YSBwYXRoIGZyb20gdGhlIGluc3RhbGxfbGliIGNvbW1hbmQuCi0gICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIGxpYnJhcnkgY29kZSB0byAlcyIgJSBzZWxmLmJkaXN0X2RpcikKLSAgICAgICAgaW5zdGNtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKLSAgICAgICAgb2xkX3Jvb3QgPSBpbnN0Y21kLnJvb3Q7IGluc3RjbWQucm9vdCA9IE5vbmUKLSAgICAgICAgY21kID0gc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfbGliJywgd2Fybl9kaXI9MCkKLSAgICAgICAgaW5zdGNtZC5yb290ID0gb2xkX3Jvb3QKLQotICAgICAgICBhbGxfb3V0cHV0cywgZXh0X291dHB1dHMgPSBzZWxmLmdldF9leHRfb3V0cHV0cygpCi0gICAgICAgIHNlbGYuc3R1YnMgPSBbXQotICAgICAgICB0b19jb21waWxlID0gW10KLSAgICAgICAgZm9yIChwLGV4dF9uYW1lKSBpbiBlbnVtZXJhdGUoZXh0X291dHB1dHMpOgotICAgICAgICAgICAgZmlsZW5hbWUsZXh0ID0gb3MucGF0aC5zcGxpdGV4dChleHRfbmFtZSkKLSAgICAgICAgICAgIHB5ZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpciwgZmlsZW5hbWUgKyAnLnB5JykKLSAgICAgICAgICAgIHNlbGYuc3R1YnMuYXBwZW5kKHB5ZmlsZSkKLSAgICAgICAgICAgIGxvZy5pbmZvKCJjcmVhdGluZyBzdHViIGxvYWRlciBmb3IgJXMiICUgZXh0X25hbWUpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgotICAgICAgICAgICAgICAgIHdyaXRlX3N0dWIob3MucGF0aC5iYXNlbmFtZShleHRfbmFtZSksIHB5ZmlsZSkKLSAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSkKLSAgICAgICAgICAgIGV4dF9vdXRwdXRzW3BdID0gZXh0X25hbWUucmVwbGFjZShvcy5zZXAsJy8nKQotCi0gICAgICAgIHRvX2NvbXBpbGUuZXh0ZW5kKHNlbGYubWFrZV9pbml0X2ZpbGVzKCkpCi0gICAgICAgIGlmIHRvX2NvbXBpbGU6Ci0gICAgICAgICAgICBjbWQuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpCi0KLSAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlczoKLSAgICAgICAgICAgIHNlbGYuZG9faW5zdGFsbF9kYXRhKCkKLQotICAgICAgICAjIE1ha2UgdGhlIEVHRy1JTkZPIGRpcmVjdG9yeQotICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgotICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihhcmNoaXZlX3Jvb3QsJ0VHRy1JTkZPJykKLSAgICAgICAgc2VsZi5ta3BhdGgoZWdnX2luZm8pCi0gICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6Ci0gICAgICAgICAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnc2NyaXB0cycpCi0gICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBzY3JpcHRzIHRvICVzIiAlIHNjcmlwdF9kaXIpCi0gICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9zY3JpcHRzJyxpbnN0YWxsX2Rpcj1zY3JpcHRfZGlyLG5vX2VwPTEpCi0KLSAgICAgICAgbmF0aXZlX2xpYnMgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywibmF0aXZlX2xpYnMudHh0IikKLSAgICAgICAgaWYgYWxsX291dHB1dHM6Ci0gICAgICAgICAgICBsb2cuaW5mbygid3JpdGluZyAlcyIgJSBuYXRpdmVfbGlicykKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICAgICAgbGlic19maWxlID0gb3BlbihuYXRpdmVfbGlicywgJ3d0JykKLSAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJy5qb2luKGFsbF9vdXRwdXRzKSkKLSAgICAgICAgICAgICAgICBsaWJzX2ZpbGUud3JpdGUoJ1xuJykKLSAgICAgICAgICAgICAgICBsaWJzX2ZpbGUuY2xvc2UoKQotICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hdGl2ZV9saWJzKToKLSAgICAgICAgICAgIGxvZy5pbmZvKCJyZW1vdmluZyAlcyIgJSBuYXRpdmVfbGlicykKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICAgICAgb3MudW5saW5rKG5hdGl2ZV9saWJzKQotCi0gICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKHNlbGYuZWdnX2luZm8pOgotICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLGZpbGVuYW1lKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUocGF0aCxvcy5wYXRoLmpvaW4oZWdnX2luZm8sZmlsZW5hbWUpKQotCi0gICAgICAgIHdyaXRlX3NhZmV0eV9mbGFnKAotICAgICAgICAgICAgb3MucGF0aC5qb2luKGFyY2hpdmVfcm9vdCwnRUdHLUlORk8nKSwgc2VsZi56aXBfc2FmZSgpCi0gICAgICAgICkKLQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbywnZGVwZW5kcy50eHQnKSk6Ci0gICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyB3aWxsIG5vdCBiZSB1c2VkIGJ5IHNldHVwdG9vbHMgMC42IVxuIgotICAgICAgICAgICAgICAgICJVc2UgdGhlIGluc3RhbGxfcmVxdWlyZXMvZXh0cmFzX3JlcXVpcmUgc2V0dXAoKSBhcmdzIGluc3RlYWQuIgotICAgICAgICAgICAgKQotCi0gICAgICAgIGlmIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXM6Ci0gICAgICAgICAgICBzZWxmLnphcF9weWZpbGVzKCkKLQotICAgICAgICAjIE1ha2UgdGhlIGFyY2hpdmUKLSAgICAgICAgbWFrZV96aXBmaWxlKHNlbGYuZWdnX291dHB1dCwgYXJjaGl2ZV9yb290LCB2ZXJib3NlPXNlbGYudmVyYm9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCi0gICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKLSAgICAgICAgICAgIHJlbW92ZV90cmVlKHNlbGYuYmRpc3RfZGlyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKLQotICAgICAgICAjIEFkZCB0byAnRGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMnIHNvIHRoYXQgdGhlICJ1cGxvYWQiIGNvbW1hbmQgd29ya3MKLSAgICAgICAgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwnZGlzdF9maWxlcycsW10pLmFwcGVuZCgKLSAgICAgICAgICAgICgnYmRpc3RfZWdnJyxnZXRfcHl0aG9uX3ZlcnNpb24oKSxzZWxmLmVnZ19vdXRwdXQpKQotCi0gICAgZGVmIHphcF9weWZpbGVzKHNlbGYpOgotICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgLnB5IGZpbGVzIGZyb20gdGVtcG9yYXJ5IGRpcmVjdG9yeSIpCi0gICAgICAgIGZvciBiYXNlLGRpcnMsZmlsZXMgaW4gd2Fsa19lZ2coc2VsZi5iZGlzdF9kaXIpOgotICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6Ci0gICAgICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jyk6Ci0gICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSxuYW1lKQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nICVzIiwgcGF0aCkKLSAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCi0KLSAgICBkZWYgemlwX3NhZmUoc2VsZik6Ci0gICAgICAgIHNhZmUgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCd6aXBfc2FmZScsTm9uZSkKLSAgICAgICAgaWYgc2FmZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBzYWZlCi0gICAgICAgIGxvZy53YXJuKCJ6aXBfc2FmZSBmbGFnIG5vdCBzZXQ7IGFuYWx5emluZyBhcmNoaXZlIGNvbnRlbnRzLi4uIikKLSAgICAgICAgcmV0dXJuIGFuYWx5emVfZWdnKHNlbGYuYmRpc3RfZGlyLCBzZWxmLnN0dWJzKQotCi0gICAgZGVmIG1ha2VfaW5pdF9maWxlcyhzZWxmKToKLSAgICAgICAgIiIiQ3JlYXRlIG1pc3NpbmcgcGFja2FnZSBfX2luaXRfXyBmaWxlcyIiIgotICAgICAgICBpbml0X2ZpbGVzID0gW10KLSAgICAgICAgZm9yIGJhc2UsZGlycyxmaWxlcyBpbiB3YWxrX2VnZyhzZWxmLmJkaXN0X2Rpcik6Ci0gICAgICAgICAgICBpZiBiYXNlPT1zZWxmLmJkaXN0X2RpcjoKLSAgICAgICAgICAgICAgICAjIGRvbid0IHB1dCBhbiBfX2luaXRfXyBpbiB0aGUgcm9vdAotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKToKLSAgICAgICAgICAgICAgICAgICAgaWYgJ19faW5pdF9fLnB5JyBub3QgaW4gZmlsZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwa2cgPSBiYXNlW2xlbihzZWxmLmJkaXN0X2RpcikrMTpdLnJlcGxhY2Uob3Muc2VwLCcuJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jb250ZW50c19mb3IocGtnKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQ3JlYXRpbmcgbWlzc2luZyBfX2luaXRfXy5weSBmb3IgJXMiLHBrZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlLCdfX2luaXRfXy5weScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3cnKTsgZi53cml0ZShOU19QS0dfU1RVQikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9maWxlcy5hcHBlbmQoZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICMgbm90IGEgcGFja2FnZSwgZG9uJ3QgdHJhdmVyc2UgdG8gc3ViZGlyZWN0b3JpZXMKLSAgICAgICAgICAgICAgICBkaXJzWzpdID0gW10KLQotICAgICAgICByZXR1cm4gaW5pdF9maWxlcwotCi0gICAgZGVmIGdldF9leHRfb3V0cHV0cyhzZWxmKToKLSAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiByZWxhdGl2ZSBwYXRocyB0byBDIGV4dGVuc2lvbnMgaW4gdGhlIG91dHB1dCBkaXN0cm8iIiIKLQotICAgICAgICBhbGxfb3V0cHV0cyA9IFtdCi0gICAgICAgIGV4dF9vdXRwdXRzID0gW10KLQotICAgICAgICBwYXRocyA9IHtzZWxmLmJkaXN0X2RpcjonJ30KLSAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi5iZGlzdF9kaXIpOgotICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpWzFdLmxvd2VyKCkgaW4gTkFUSVZFX0VYVEVOU0lPTlM6Ci0gICAgICAgICAgICAgICAgICAgIGFsbF9vdXRwdXRzLmFwcGVuZChwYXRoc1tiYXNlXStmaWxlbmFtZSkKLSAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBkaXJzOgotICAgICAgICAgICAgICAgIHBhdGhzW29zLnBhdGguam9pbihiYXNlLGZpbGVuYW1lKV0gPSBwYXRoc1tiYXNlXStmaWxlbmFtZSsnLycKLQotICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKLSAgICAgICAgICAgIGJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQotICAgICAgICAgICAgZm9yIGV4dCBpbiBidWlsZF9jbWQuZXh0ZW5zaW9uczoKLSAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYnVpbGRfY21kLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCi0gICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLnN0YXJ0c3dpdGgoJ2RsLScpOgotICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsZmlsZW5hbWUpKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dF9vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKLQotICAgICAgICByZXR1cm4gYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzCi0KLQotTkFUSVZFX0VYVEVOU0lPTlMgPSBkaWN0LmZyb21rZXlzKCcuZGxsIC5zbyAuZHlsaWIgLnB5ZCcuc3BsaXQoKSkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWRlZiB3YWxrX2VnZyhlZ2dfZGlyKToKLSAgICAiIiJXYWxrIGFuIHVucGFja2VkIGVnZydzIGNvbnRlbnRzLCBza2lwcGluZyB0aGUgbWV0YWRhdGEgZGlyZWN0b3J5IiIiCi0gICAgd2Fsa2VyID0gb3Mud2FsayhlZ2dfZGlyKQotICAgIGJhc2UsZGlycyxmaWxlcyA9IHdhbGtlci5uZXh0KCkKLSAgICBpZiAnRUdHLUlORk8nIGluIGRpcnM6Ci0gICAgICAgIGRpcnMucmVtb3ZlKCdFR0ctSU5GTycpCi0gICAgeWllbGQgYmFzZSxkaXJzLGZpbGVzCi0gICAgZm9yIGJkZiBpbiB3YWxrZXI6Ci0gICAgICAgIHlpZWxkIGJkZgotCi1kZWYgYW5hbHl6ZV9lZ2coZWdnX2Rpciwgc3R1YnMpOgotICAgICMgY2hlY2sgZm9yIGV4aXN0aW5nIGZsYWcgaW4gRUdHLUlORk8KLSAgICBmb3IgZmxhZyxmbiBpbiBzYWZldHlfZmxhZ3MuaXRlbXMoKToKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGVnZ19kaXIsJ0VHRy1JTkZPJyxmbikpOgotICAgICAgICAgICAgcmV0dXJuIGZsYWcKLQotICAgIHNhZmUgPSBUcnVlCi0gICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHdhbGtfZWdnKGVnZ19kaXIpOgotICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpIG9yIG5hbWUuZW5kc3dpdGgoJy5weXcnKToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZWxpZiBuYW1lLmVuZHN3aXRoKCcucHljJykgb3IgbmFtZS5lbmRzd2l0aCgnLnB5bycpOgotICAgICAgICAgICAgICAgICMgYWx3YXlzIHNjYW4sIGV2ZW4gaWYgd2UgYWxyZWFkeSBrbm93IHdlJ3JlIG5vdCBzYWZlCi0gICAgICAgICAgICAgICAgc2FmZSA9IHNjYW5fbW9kdWxlKGVnZ19kaXIsIGJhc2UsIG5hbWUsIHN0dWJzKSBhbmQgc2FmZQotICAgIHJldHVybiBzYWZlCi0KLWRlZiB3cml0ZV9zYWZldHlfZmxhZyhlZ2dfZGlyLCBzYWZlKToKLSAgICAjIFdyaXRlIG9yIHJlbW92ZSB6aXAgc2FmZXR5IGZsYWcgZmlsZShzKQotICAgIGZvciBmbGFnLGZuIGluIHNhZmV0eV9mbGFncy5pdGVtcygpOgotICAgICAgICBmbiA9IG9zLnBhdGguam9pbihlZ2dfZGlyLCBmbikKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZm4pOgotICAgICAgICAgICAgaWYgc2FmZSBpcyBOb25lIG9yIGJvb2woc2FmZSk8PmZsYWc6Ci0gICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQotICAgICAgICBlbGlmIHNhZmUgaXMgbm90IE5vbmUgYW5kIGJvb2woc2FmZSk9PWZsYWc6Ci0gICAgICAgICAgICBvcGVuKGZuLCd3JykuY2xvc2UoKQotCi1zYWZldHlfZmxhZ3MgPSB7Ci0gICAgVHJ1ZTogJ3ppcC1zYWZlJywKLSAgICBGYWxzZTogJ25vdC16aXAtc2FmZScsCi19Ci0KLWRlZiBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicyk6Ci0gICAgIiIiQ2hlY2sgd2hldGhlciBtb2R1bGUgcG9zc2libHkgdXNlcyB1bnNhZmUtZm9yLXppcGZpbGUgc3R1ZmYiIiIKLQotICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGJhc2UsbmFtZSkKLSAgICBpZiBmaWxlbmFtZVs6LTFdIGluIHN0dWJzOgotICAgICAgICByZXR1cm4gVHJ1ZSAgICAgIyBFeHRlbnNpb24gbW9kdWxlCi0gICAgcGtnID0gYmFzZVtsZW4oZWdnX2RpcikrMTpdLnJlcGxhY2Uob3Muc2VwLCcuJykKLSAgICBtb2R1bGUgPSBwa2crKHBrZyBhbmQgJy4nIG9yICcnKStvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpWzBdCi0gICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3JiJyk7IGYucmVhZCg4KSAgICMgc2tpcCBtYWdpYyAmIGRhdGUKLSAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpOyAgZi5jbG9zZSgpCi0gICAgc2FmZSA9IFRydWUKLSAgICBzeW1ib2xzID0gZGljdC5mcm9ta2V5cyhpdGVyX3N5bWJvbHMoY29kZSkpCi0gICAgZm9yIGJhZCBpbiBbJ19fZmlsZV9fJywgJ19fcGF0aF9fJ106Ci0gICAgICAgIGlmIGJhZCBpbiBzeW1ib2xzOgotICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgcmVmZXJlbmNlcyAlcyIsIG1vZHVsZSwgYmFkKQotICAgICAgICAgICAgc2FmZSA9IEZhbHNlCi0gICAgaWYgJ2luc3BlY3QnIGluIHN5bWJvbHM6Ci0gICAgICAgIGZvciBiYWQgaW4gWwotICAgICAgICAgICAgJ2dldHNvdXJjZScsICdnZXRhYnNmaWxlJywgJ2dldHNvdXJjZWZpbGUnLCAnZ2V0ZmlsZScKLSAgICAgICAgICAgICdnZXRzb3VyY2VsaW5lcycsICdmaW5kc291cmNlJywgJ2dldGNvbW1lbnRzJywgJ2dldGZyYW1laW5mbycsCi0gICAgICAgICAgICAnZ2V0aW5uZXJmcmFtZXMnLCAnZ2V0b3V0ZXJmcmFtZXMnLCAnc3RhY2snLCAndHJhY2UnCi0gICAgICAgIF06Ci0gICAgICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKLSAgICAgICAgICAgICAgICBsb2cud2FybigiJXM6IG1vZHVsZSBNQVkgYmUgdXNpbmcgaW5zcGVjdC4lcyIsIG1vZHVsZSwgYmFkKQotICAgICAgICAgICAgICAgIHNhZmUgPSBGYWxzZQotICAgIGlmICdfX25hbWVfXycgaW4gc3ltYm9scyBhbmQgJ19fbWFpbl9fJyBpbiBzeW1ib2xzIGFuZCAnLicgbm90IGluIG1vZHVsZToKLSAgICAgICAgaWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCk+PSIyLjQiOgotICAgICAgICAgICAgbG9nLndhcm4oIiVzOiB0b3AtbGV2ZWwgbW9kdWxlIG1heSBiZSAncHl0aG9uIC1tJyBzY3JpcHQiLCBtb2R1bGUpCi0gICAgICAgICAgICBzYWZlID0gRmFsc2UKLSAgICByZXR1cm4gc2FmZQotCi1kZWYgaXRlcl9zeW1ib2xzKGNvZGUpOgotICAgICIiIllpZWxkIG5hbWVzIGFuZCBzdHJpbmdzIHVzZWQgYnkgYGNvZGVgIGFuZCBpdHMgbmVzdGVkIGNvZGUgb2JqZWN0cyIiIgotICAgIGZvciBuYW1lIGluIGNvZGUuY29fbmFtZXM6IHlpZWxkIG5hbWUKLSAgICBmb3IgY29uc3QgaW4gY29kZS5jb19jb25zdHM6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UoY29uc3QsYmFzZXN0cmluZyk6Ci0gICAgICAgICAgICB5aWVsZCBjb25zdAotICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY29uc3QsQ29kZVR5cGUpOgotICAgICAgICAgICAgZm9yIG5hbWUgaW4gaXRlcl9zeW1ib2xzKGNvbnN0KToKLSAgICAgICAgICAgICAgICB5aWVsZCBuYW1lCi0KLSMgQXR0cmlidXRlIG5hbWVzIG9mIG9wdGlvbnMgZm9yIGNvbW1hbmRzIHRoYXQgbWlnaHQgbmVlZCB0byBiZSBjb252aW5jZWQgdG8KLSMgaW5zdGFsbCB0byB0aGUgZWdnIGJ1aWxkIGRpcmVjdG9yeQotCi1JTlNUQUxMX0RJUkVDVE9SWV9BVFRSUyA9IFsKLSAgICAnaW5zdGFsbF9saWInLCAnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kYXRhJywgJ2luc3RhbGxfYmFzZScKLV0KLQotZGVmIG1ha2VfemlwZmlsZSAoemlwX2ZpbGVuYW1lLCBiYXNlX2RpciwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGNvbXByZXNzPU5vbmUpOgotICAgICIiIkNyZWF0ZSBhIHppcCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLiAgVGhlIG91dHB1dAotICAgIHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfZGlyJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZSAiemlwZmlsZSIKLSAgICBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQICJ6aXAiIHV0aWxpdHkgKGlmIGluc3RhbGxlZAotICAgIGFuZCBmb3VuZCBvbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCkuICBJZiBuZWl0aGVyIHRvb2wgaXMgYXZhaWxhYmxlLAotICAgIHJhaXNlcyBEaXN0dXRpbHNFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwIGZpbGUuCi0gICAgIiIiCi0gICAgaW1wb3J0IHppcGZpbGUKLSAgICBta3BhdGgob3MucGF0aC5kaXJuYW1lKHppcF9maWxlbmFtZSksIGRyeV9ydW49ZHJ5X3J1bikKLSAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQotCi0gICAgZGVmIHZpc2l0ICh6LCBkaXJuYW1lLCBuYW1lcyk6Ci0gICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6Ci0gICAgICAgICAgICAgICAgcCA9IHBhdGhbbGVuKGJhc2VfZGlyKSsxOl0KLSAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKLSAgICAgICAgICAgICAgICAgICAgei53cml0ZShwYXRoLCBwKQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiYWRkaW5nICclcyciICUgcCkKLQotICAgIGlmIGNvbXByZXNzIGlzIE5vbmU6Ci0gICAgICAgIGNvbXByZXNzID0gKHN5cy52ZXJzaW9uPj0iMi40IikgIyBhdm9pZCAyLjMgemlwaW1wb3J0IGJ1ZyB3aGVuIDY0IGJpdHMKLQotICAgIGNvbXByZXNzaW9uID0gW3ppcGZpbGUuWklQX1NUT1JFRCwgemlwZmlsZS5aSVBfREVGTEFURURdW2Jvb2woY29tcHJlc3MpXQotICAgIGlmIG5vdCBkcnlfcnVuOgotICAgICAgICB6ID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLCBjb21wcmVzc2lvbj1jb21wcmVzc2lvbikKLSAgICAgICAgb3MucGF0aC53YWxrKGJhc2VfZGlyLCB2aXNpdCwgeikKLSAgICAgICAgei5jbG9zZSgpCi0gICAgZWxzZToKLSAgICAgICAgb3MucGF0aC53YWxrKGJhc2VfZGlyLCB2aXNpdCwgTm9uZSkKLQotICAgIHJldHVybiB6aXBfZmlsZW5hbWUKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZTA3YWMuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIFRoaXMgaXMganVzdCBhIGtsdWRnZSBzbyB0aGF0IGJkaXN0X3JwbSBkb2Vzbid0IGd1ZXNzIHdyb25nIGFib3V0IHRoZQotIyBkaXN0cmlidXRpb24gbmFtZSBhbmQgdmVyc2lvbiwgaWYgdGhlIGVnZ19pbmZvIGNvbW1hbmQgaXMgZ29pbmcgdG8gYWx0ZXIKLSMgdGhlbSwgYW5kIGFub3RoZXIga2x1ZGdlIHRvIGFsbG93IHlvdSB0byBidWlsZCBvbGQtc3R5bGUgbm9uLWVnZyBSUE1zCi0KLWZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtIGltcG9ydCBiZGlzdF9ycG0gYXMgX2JkaXN0X3JwbQotCi1jbGFzcyBiZGlzdF9ycG0oX2JkaXN0X3JwbSk6Ci0KLSAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgotICAgICAgICBfYmRpc3RfcnBtLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQotICAgICAgICBzZWxmLm5vX2VnZyA9IE5vbmUKLQotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykgICAgIyBlbnN1cmUgZGlzdHJvIG5hbWUgaXMgdXAtdG8tZGF0ZQotICAgICAgICBfYmRpc3RfcnBtLnJ1bihzZWxmKQotCi0gICAgZGVmIF9tYWtlX3NwZWNfZmlsZShzZWxmKToKLSAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKLSAgICAgICAgcnBtdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnLScsJ18nKQotICAgICAgICBzcGVjID0gX2JkaXN0X3JwbS5fbWFrZV9zcGVjX2ZpbGUoc2VsZikKLSAgICAgICAgbGluZTIzID0gJyVkZWZpbmUgdmVyc2lvbiAnK3ZlcnNpb24KLSAgICAgICAgbGluZTI0ID0gJyVkZWZpbmUgdmVyc2lvbiAnK3JwbXZlcnNpb24KLSAgICAgICAgc3BlYyAgPSBbCi0gICAgICAgICAgICBsaW5lLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgIlNvdXJjZTA6ICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIiLAotICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259LnRhciIKLSAgICAgICAgICAgICkucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAiLAotICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkICIKLSAgICAgICAgICAgICkucmVwbGFjZSgKLSAgICAgICAgICAgICAgICAiJXNldHVwIiwKLSAgICAgICAgICAgICAgICAiJXNldHVwIC1uICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0iCi0gICAgICAgICAgICApLnJlcGxhY2UobGluZTIzLGxpbmUyNCkKLSAgICAgICAgICAgIGZvciBsaW5lIGluIHNwZWMKLSAgICAgICAgXQotICAgICAgICBzcGVjLmluc2VydChzcGVjLmluZGV4KGxpbmUyNCkrMSwgIiVkZWZpbmUgdW5tYW5nbGVkX3ZlcnNpb24gIit2ZXJzaW9uKQotICAgICAgICByZXR1cm4gc3BlYwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1NTFmYi4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi1mcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9kdV9idWlsZF9leHQKLXRyeToKLSAgICAjIEF0dGVtcHQgdG8gdXNlIFB5cmV4IGZvciBidWlsZGluZyBleHRlbnNpb25zLCBpZiBhdmFpbGFibGUKLSAgICBmcm9tIFB5cmV4LkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0Ci1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgX2J1aWxkX2V4dCA9IF9kdV9idWlsZF9leHQKLQotaW1wb3J0IG9zLCBzeXMKLWZyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCi1mcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5Ci1mcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IG5ld19jb21waWxlcgotZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIsIGdldF9jb25maWdfdmFyCi1nZXRfY29uZmlnX3ZhcigiTERTSEFSRUQiKSAgIyBtYWtlIHN1cmUgX2NvbmZpZ192YXJzIGlzIGluaXRpYWxpemVkCi1mcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IF9jb25maWdfdmFycwotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwotZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCi0KLWhhdmVfcnRsZCA9IEZhbHNlCi11c2Vfc3R1YnMgPSBGYWxzZQotbGlidHlwZSA9ICdzaGFyZWQnCi0KLWlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKLSAgICB1c2Vfc3R1YnMgPSBUcnVlCi1lbGlmIG9zLm5hbWUgIT0gJ250JzoKLSAgICB0cnk6Ci0gICAgICAgIGZyb20gZGwgaW1wb3J0IFJUTERfTk9XCi0gICAgICAgIGhhdmVfcnRsZCA9IFRydWUKLSAgICAgICAgdXNlX3N0dWJzID0gVHJ1ZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcwotCi1kZWYgaWZfZGwocyk6Ci0gICAgaWYgaGF2ZV9ydGxkOgotICAgICAgICByZXR1cm4gcwotICAgIHJldHVybiAnJwotCi0KLQotCi0KLQotY2xhc3MgYnVpbGRfZXh0KF9idWlsZF9leHQpOgotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgICIiIkJ1aWxkIGV4dGVuc2lvbnMgaW4gYnVpbGQgZGlyZWN0b3J5LCB0aGVuIGNvcHkgaWYgLS1pbnBsYWNlIiIiCi0gICAgICAgIG9sZF9pbnBsYWNlLCBzZWxmLmlucGxhY2UgPSBzZWxmLmlucGxhY2UsIDAKLSAgICAgICAgX2J1aWxkX2V4dC5ydW4oc2VsZikKLSAgICAgICAgc2VsZi5pbnBsYWNlID0gb2xkX2lucGxhY2UKLSAgICAgICAgaWYgb2xkX2lucGxhY2U6Ci0gICAgICAgICAgICBzZWxmLmNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2UoKQotCi0gICAgZGVmIGNvcHlfZXh0ZW5zaW9uc190b19zb3VyY2Uoc2VsZik6Ci0gICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKLSAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6Ci0gICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKLSAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQotICAgICAgICAgICAgbW9kcGF0aCA9IGZ1bGxuYW1lLnNwbGl0KCcuJykKLSAgICAgICAgICAgIHBhY2thZ2UgPSAnLicuam9pbihtb2RwYXRoWzotMV0pCi0gICAgICAgICAgICBwYWNrYWdlX2RpciA9IGJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQotICAgICAgICAgICAgZGVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihwYWNrYWdlX2Rpcixvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKLSAgICAgICAgICAgIHNyY19maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYixmaWxlbmFtZSkKLQotICAgICAgICAgICAgIyBBbHdheXMgY29weSwgZXZlbiBpZiBzb3VyY2UgaXMgb2xkZXIgdGhhbiBkZXN0aW5hdGlvbiwgdG8gZW5zdXJlCi0gICAgICAgICAgICAjIHRoYXQgdGhlIHJpZ2h0IGV4dGVuc2lvbnMgZm9yIHRoZSBjdXJyZW50IFB5dGhvbi9wbGF0Zm9ybSBhcmUKLSAgICAgICAgICAgICMgdXNlZC4KLSAgICAgICAgICAgIGNvcHlfZmlsZSgKLSAgICAgICAgICAgICAgICBzcmNfZmlsZW5hbWUsIGRlc3RfZmlsZW5hbWUsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAotICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6Ci0gICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKHBhY2thZ2VfZGlyIG9yIG9zLmN1cmRpciwgZXh0LCBUcnVlKQotCi0KLSAgICBpZiBfYnVpbGRfZXh0IGlzIG5vdCBfZHVfYnVpbGRfZXh0OgotICAgICAgICAjIFdvcmthcm91bmQgZm9yIHByb2JsZW1zIHVzaW5nIHNvbWUgUHlyZXggdmVyc2lvbnMgdy9TV0lHIGFuZC9vciAyLjQKLSAgICAgICAgZGVmIHN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKToKLSAgICAgICAgICAgICMgZmlyc3QgZG8gYW55IFB5cmV4IHByb2Nlc3NpbmcKLSAgICAgICAgICAgIHNvdXJjZXMgPSBfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzKSBvciBzb3VyY2VzCi0gICAgICAgICAgICAjIFRoZW4gZG8gYW55IGFjdHVhbCBTV0lHIHN0dWZmIG9uIHRoZSByZW1haW5kZXIKLSAgICAgICAgICAgIHJldHVybiBfZHVfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKQotCi0KLQotICAgIGRlZiBnZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKToKLSAgICAgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZixmdWxsbmFtZSkKLSAgICAgICAgZXh0ID0gc2VsZi5leHRfbWFwW2Z1bGxuYW1lXQotICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKLSAgICAgICAgICAgIGZuLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hsaWJfY29tcGlsZXIubGlicmFyeV9maWxlbmFtZShmbixsaWJ0eXBlKQotICAgICAgICBlbGlmIHVzZV9zdHVicyBhbmQgZXh0Ll9saW5rc190b19keW5hbWljOgotICAgICAgICAgICAgZCxmbiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCi0gICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGQsJ2RsLScrZm4pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIF9idWlsZF9leHQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCi0gICAgICAgIHNlbGYuc2hsaWJfY29tcGlsZXIgPSBOb25lCi0gICAgICAgIHNlbGYuc2hsaWJzID0gW10KLSAgICAgICAgc2VsZi5leHRfbWFwID0ge30KLQotICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgotICAgICAgICBfYnVpbGRfZXh0LmZpbmFsaXplX29wdGlvbnMoc2VsZikKLSAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5leHRlbnNpb25zIG9yIFtdCi0gICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKLSAgICAgICAgc2VsZi5zaGxpYnMgPSBbZXh0IGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KV0KLSAgICAgICAgaWYgc2VsZi5zaGxpYnM6Ci0gICAgICAgICAgICBzZWxmLnNldHVwX3NobGliX2NvbXBpbGVyKCkKLSAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6Ci0gICAgICAgICAgICBmdWxsbmFtZSA9IGV4dC5fZnVsbF9uYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQotICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lXSA9IGV4dAotICAgICAgICAgICAgbHRkID0gZXh0Ll9saW5rc190b19keW5hbWljID0gXAotICAgICAgICAgICAgICAgIHNlbGYuc2hsaWJzIGFuZCBzZWxmLmxpbmtzX3RvX2R5bmFtaWMoZXh0KSBvciBGYWxzZQotICAgICAgICAgICAgZXh0Ll9uZWVkc19zdHViID0gbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG5vdCBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KQotICAgICAgICAgICAgZmlsZW5hbWUgPSBleHQuX2ZpbGVfbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKLSAgICAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsZmlsZW5hbWUpKQotICAgICAgICAgICAgaWYgbHRkIGFuZCBsaWJkaXIgbm90IGluIGV4dC5saWJyYXJ5X2RpcnM6Ci0gICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQobGliZGlyKQotICAgICAgICAgICAgaWYgbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG9zLmN1cmRpciBub3QgaW4gZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzOgotICAgICAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycy5hcHBlbmQob3MuY3VyZGlyKQotCi0KLQotICAgIGRlZiBzZXR1cF9zaGxpYl9jb21waWxlcihzZWxmKToKLSAgICAgICAgY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyID0gbmV3X2NvbXBpbGVyKAotICAgICAgICAgICAgY29tcGlsZXI9c2VsZi5jb21waWxlciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIGZvcmNlPXNlbGYuZm9yY2UKLSAgICAgICAgKQotICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6Ci0gICAgICAgICAgICB0bXAgPSBfY29uZmlnX3ZhcnMuY29weSgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgIyBYWFggSGVscCEgIEkgZG9uJ3QgaGF2ZSBhbnkgaWRlYSB3aGV0aGVyIHRoZXNlIGFyZSByaWdodC4uLgotICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snTERTSEFSRUQnXSA9ICJnY2MgLVdsLC14IC1keW5hbWljbGliIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAiCi0gICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydDQ1NIQVJFRCddID0gIiAtZHluYW1pY2xpYiIKLSAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ1NPJ10gPSAiLmR5bGliIgotICAgICAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzLmNsZWFyKCkKLSAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnMudXBkYXRlKHRtcCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKLQotICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGNvbXBpbGVyLnNldF9pbmNsdWRlX2RpcnMoc2VsZi5pbmNsdWRlX2RpcnMpCi0gICAgICAgIGlmIHNlbGYuZGVmaW5lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgIyAnZGVmaW5lJyBvcHRpb24gaXMgYSBsaXN0IG9mIChuYW1lLHZhbHVlKSB0dXBsZXMKLSAgICAgICAgICAgIGZvciAobmFtZSx2YWx1ZSkgaW4gc2VsZi5kZWZpbmU6Ci0gICAgICAgICAgICAgICAgY29tcGlsZXIuZGVmaW5lX21hY3JvKG5hbWUsIHZhbHVlKQotICAgICAgICBpZiBzZWxmLnVuZGVmIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZm9yIG1hY3JvIGluIHNlbGYudW5kZWY6Ci0gICAgICAgICAgICAgICAgY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCi0gICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKLSAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyeV9kaXJzKHNlbGYubGlicmFyeV9kaXJzKQotICAgICAgICBpZiBzZWxmLnJwYXRoIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgY29tcGlsZXIuc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYucnBhdGgpCi0gICAgICAgIGlmIHNlbGYubGlua19vYmplY3RzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpbmtfb2JqZWN0cyhzZWxmLmxpbmtfb2JqZWN0cykKLQotICAgICAgICAjIGhhY2sgc28gZGlzdHV0aWxzJyBidWlsZF9leHRlbnNpb24oKSBidWlsZHMgYSBsaWJyYXJ5IGluc3RlYWQKLSAgICAgICAgY29tcGlsZXIubGlua19zaGFyZWRfb2JqZWN0ID0gbGlua19zaGFyZWRfb2JqZWN0Ll9fZ2V0X18oY29tcGlsZXIpCi0KLQotCi0gICAgZGVmIGdldF9leHBvcnRfc3ltYm9scyhzZWxmLCBleHQpOgotICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKLSAgICAgICAgICAgIHJldHVybiBleHQuZXhwb3J0X3N5bWJvbHMKLSAgICAgICAgcmV0dXJuIF9idWlsZF9leHQuZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsZXh0KQotCi0gICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgotICAgICAgICBfY29tcGlsZXIgPSBzZWxmLmNvbXBpbGVyCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgotICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyCi0gICAgICAgICAgICBfYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLGV4dCkKLSAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKLSAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLmJ1aWxkX2xpYiwgZXh0Ci0gICAgICAgICAgICAgICAgKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IF9jb21waWxlcgotCi0gICAgZGVmIGxpbmtzX3RvX2R5bmFtaWMoc2VsZiwgZXh0KToKLSAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgJ2V4dCcgbGlua3MgdG8gYSBkeW5hbWljIGxpYiBpbiB0aGUgc2FtZSBwYWNrYWdlIiIiCi0gICAgICAgICMgWFhYIHRoaXMgc2hvdWxkIGNoZWNrIHRvIGVuc3VyZSB0aGUgbGliIGlzIGFjdHVhbGx5IGJlaW5nIGJ1aWx0Ci0gICAgICAgICMgWFhYIGFzIGR5bmFtaWMsIGFuZCBub3QganVzdCB1c2luZyBhIGxvY2FsbHktZm91bmQgdmVyc2lvbiBvciBhCi0gICAgICAgICMgWFhYIHN0YXRpYy1jb21waWxlZCB2ZXJzaW9uCi0gICAgICAgIGxpYm5hbWVzID0gZGljdC5mcm9ta2V5cyhbbGliLl9mdWxsX25hbWUgZm9yIGxpYiBpbiBzZWxmLnNobGlic10pCi0gICAgICAgIHBrZyA9ICcuJy5qb2luKGV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJylbOi0xXStbJyddKQotICAgICAgICBmb3IgbGlibmFtZSBpbiBleHQubGlicmFyaWVzOgotICAgICAgICAgICAgaWYgcGtnK2xpYm5hbWUgaW4gbGlibmFtZXM6IHJldHVybiBUcnVlCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgotICAgICAgICBvdXRwdXRzID0gX2J1aWxkX2V4dC5nZXRfb3V0cHV0cyhzZWxmKQotICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpLm9wdGltaXplCi0gICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgotICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgotICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKQotICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGJhc2UrJy5weScpCi0gICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoYmFzZSsnLnB5YycpCi0gICAgICAgICAgICAgICAgaWYgb3B0aW1pemU6Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGJhc2UrJy5weW8nKQotICAgICAgICByZXR1cm4gb3V0cHV0cwotCi0gICAgZGVmIHdyaXRlX3N0dWIoc2VsZiwgb3V0cHV0X2RpciwgZXh0LCBjb21waWxlPUZhbHNlKToKLSAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIHRvICVzIixleHQuX2Z1bGxfbmFtZSwgb3V0cHV0X2RpcikKLSAgICAgICAgc3R1Yl9maWxlID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKSsnLnB5JwotICAgICAgICBpZiBjb21waWxlIGFuZCBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3R1Yl9maWxlKyIgYWxyZWFkeSBleGlzdHMhIFBsZWFzZSBkZWxldGUuIikKLSAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKLSAgICAgICAgICAgIGYgPSBvcGVuKHN0dWJfZmlsZSwndycpCi0gICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihbCi0gICAgICAgICAgICAgICAgImRlZiBfX2Jvb3RzdHJhcF9fKCk6IiwKLSAgICAgICAgICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fZmlsZV9fLCBfX2xvYWRlcl9fIiwKLSAgICAgICAgICAgICAgICAiICAgaW1wb3J0IHN5cywgb3MsIHBrZ19yZXNvdXJjZXMsIGltcCIraWZfZGwoIiwgZGwiKSwKLSAgICAgICAgICAgICAgICAiICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCVyKSIKLSAgICAgICAgICAgICAgICAgICAlIG9zLnBhdGguYmFzZW5hbWUoZXh0Ll9maWxlX25hbWUpLAotICAgICAgICAgICAgICAgICIgICBkZWwgX19ib290c3RyYXBfXyIsCi0gICAgICAgICAgICAgICAgIiAgIGlmICdfX2xvYWRlcl9fJyBpbiBnbG9iYWxzKCk6IiwKLSAgICAgICAgICAgICAgICAiICAgICAgIGRlbCBfX2xvYWRlcl9fIiwKLSAgICAgICAgICAgICAgICBpZl9kbCgiICAgb2xkX2ZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkiKSwKLSAgICAgICAgICAgICAgICAiICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpIiwKLSAgICAgICAgICAgICAgICAiICAgdHJ5OiIsCi0gICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkiLAotICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhkbC5SVExEX05PVykiKSwKLSAgICAgICAgICAgICAgICAiICAgICBpbXAubG9hZF9keW5hbWljKF9fbmFtZV9fLF9fZmlsZV9fKSIsCi0gICAgICAgICAgICAgICAgIiAgIGZpbmFsbHk6IiwKLSAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkX2ZsYWdzKSIpLAotICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9sZF9kaXIpIiwKLSAgICAgICAgICAgICAgICAiX19ib290c3RyYXBfXygpIiwKLSAgICAgICAgICAgICAgICAiIiAjIHRlcm1pbmFsIFxuCi0gICAgICAgICAgICBdKSkKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICBpZiBjb21waWxlOgotICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCi0gICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCi0gICAgICAgICAgICBvcHRpbWl6ZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsX2xpYicpLm9wdGltaXplCi0gICAgICAgICAgICBpZiBvcHRpbWl6ZSA+IDA6Ci0gICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT1vcHRpbWl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCi0gICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgotICAgICAgICAgICAgICAgIG9zLnVubGluayhzdHViX2ZpbGUpCi0KLQotaWYgdXNlX3N0dWJzIG9yIG9zLm5hbWU9PSdudCc6Ci0gICAgIyBCdWlsZCBzaGFyZWQgbGlicmFyaWVzCi0gICAgIwotICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3Qoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKLSAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAotICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCi0gICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZQotICAgICk6ICBzZWxmLmxpbmsoCi0gICAgICAgICAgICBzZWxmLlNIQVJFRF9MSUJSQVJZLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwKLSAgICAgICAgICAgIG91dHB1dF9kaXIsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKLSAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzLCBkZWJ1ZywgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsCi0gICAgICAgICAgICBidWlsZF90ZW1wLCB0YXJnZXRfbGFuZwotICAgICAgICApCi1lbHNlOgotICAgICMgQnVpbGQgc3RhdGljIGxpYnJhcmllcyBldmVyeXdoZXJlIGVsc2UKLSAgICBsaWJ0eXBlID0gJ3N0YXRpYycKLQotICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3Qoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKLSAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAotICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCi0gICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZQotICAgICk6Ci0gICAgICAgICMgWFhYIHdlIG5lZWQgdG8gZWl0aGVyIGRpc2FsbG93IHRoZXNlIGF0dHJzIG9uIExpYnJhcnkgaW5zdGFuY2VzLAotICAgICAgICAjICAgICBvciB3YXJuL2Fib3J0IGhlcmUgaWYgc2V0LCBvciBzb21ldGhpbmcuLi4KLSAgICAgICAgI2xpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKLSAgICAgICAgI2V4cG9ydF9zeW1ib2xzPU5vbmUsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKLSAgICAgICAgI2J1aWxkX3RlbXA9Tm9uZQotCi0gICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIE5vbmUgICAjIGRpc3R1dGlscyBidWlsZF9leHQgZG9lc24ndCBwYXNzIHRoaXMKLSAgICAgICAgb3V0cHV0X2RpcixmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQob3V0cHV0X2xpYm5hbWUpCi0gICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQotICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoIngiKS5zdGFydHN3aXRoKCdsaWInKToKLSAgICAgICAgICAgICMgc3RyaXAgJ2xpYicgcHJlZml4OyB0aGlzIGlzIGtsdWRneSBpZiBzb21lIHBsYXRmb3JtIHVzZXMKLSAgICAgICAgICAgICMgYSBkaWZmZXJlbnQgcHJlZml4Ci0gICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzM6XQotCi0gICAgICAgIHNlbGYuY3JlYXRlX3N0YXRpY19saWIoCi0gICAgICAgICAgICBvYmplY3RzLCBiYXNlbmFtZSwgb3V0cHV0X2RpciwgZGVidWcsIHRhcmdldF9sYW5nCi0gICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX3B5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2E5YjIzLi4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotaW1wb3J0IG9zLnBhdGgsIHN5cywgZm5tYXRjaAotZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9weSBpbXBvcnQgYnVpbGRfcHkgYXMgX2J1aWxkX3B5Ci1mcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKLWZyb20gZ2xvYiBpbXBvcnQgZ2xvYgotCi1jbGFzcyBidWlsZF9weShfYnVpbGRfcHkpOgotICAgICIiIkVuaGFuY2VkICdidWlsZF9weScgY29tbWFuZCB0aGF0IGluY2x1ZGVzIGRhdGEgZmlsZXMgd2l0aCBwYWNrYWdlcwotCi0gICAgVGhlIGRhdGEgZmlsZXMgYXJlIHNwZWNpZmllZCB2aWEgYSAncGFja2FnZV9kYXRhJyBhcmd1bWVudCB0byAnc2V0dXAoKScuCi0gICAgU2VlICdzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uJyBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgQWxzbywgdGhpcyB2ZXJzaW9uIG9mIHRoZSAnYnVpbGRfcHknIGNvbW1hbmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGJvdGgKLSAgICAncHlfbW9kdWxlcycgYW5kICdwYWNrYWdlcycgaW4gdGhlIHNhbWUgc2V0dXAgb3BlcmF0aW9uLgotICAgICIiIgotICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgotICAgICAgICBfYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucyhzZWxmKQotICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGF0YQotICAgICAgICBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhID0gc2VsZi5kaXN0cmlidXRpb24uZXhjbHVkZV9wYWNrYWdlX2RhdGEgb3Ige30KLSAgICAgICAgaWYgJ2RhdGFfZmlsZXMnIGluIHNlbGYuX19kaWN0X186IGRlbCBzZWxmLl9fZGljdF9fWydkYXRhX2ZpbGVzJ10KLQotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgICIiIkJ1aWxkIG1vZHVsZXMsIHBhY2thZ2VzLCBhbmQgY29weSBkYXRhIGZpbGVzIHRvIGJ1aWxkIGRpcmVjdG9yeSIiIgotICAgICAgICBpZiBub3Qgc2VsZi5weV9tb2R1bGVzIGFuZCBub3Qgc2VsZi5wYWNrYWdlczoKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKLSAgICAgICAgICAgIHNlbGYuYnVpbGRfbW9kdWxlcygpCi0KLSAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKLSAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXMoKQotICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlX2RhdGEoKQotCi0gICAgICAgICMgT25seSBjb21waWxlIGFjdHVhbCAucHkgZmlsZXMsIHVzaW5nIG91ciBiYXNlIGNsYXNzJyBpZGVhIG9mIHdoYXQgb3VyCi0gICAgICAgICMgb3V0cHV0IGZpbGVzIGFyZS4KLSAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUoX2J1aWxkX3B5LmdldF9vdXRwdXRzKHNlbGYsIGluY2x1ZGVfYnl0ZWNvZGU9MCkpCi0KLSAgICBkZWYgX19nZXRhdHRyX18oc2VsZixhdHRyKToKLSAgICAgICAgaWYgYXR0cj09J2RhdGFfZmlsZXMnOiAgIyBsYXppbHkgY29tcHV0ZSBkYXRhIGZpbGVzCi0gICAgICAgICAgICBzZWxmLmRhdGFfZmlsZXMgPSBmaWxlcyA9IHNlbGYuX2dldF9kYXRhX2ZpbGVzKCk7IHJldHVybiBmaWxlcwotICAgICAgICByZXR1cm4gX2J1aWxkX3B5Ll9fZ2V0YXR0cl9fKHNlbGYsYXR0cikKLQotICAgIGRlZiBfZ2V0X2RhdGFfZmlsZXMoc2VsZik6Ci0gICAgICAgICIiIkdlbmVyYXRlIGxpc3Qgb2YgJyhwYWNrYWdlLHNyY19kaXIsYnVpbGRfZGlyLGZpbGVuYW1lcyknIHR1cGxlcyIiIgotICAgICAgICBzZWxmLmFuYWx5emVfbWFuaWZlc3QoKQotICAgICAgICBkYXRhID0gW10KLSAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKLSAgICAgICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQotICAgICAgICAgICAgc3JjX2RpciA9IHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCi0KLSAgICAgICAgICAgICMgQ29tcHV0ZSBwYWNrYWdlIGJ1aWxkIGRpcmVjdG9yeQotICAgICAgICAgICAgYnVpbGRfZGlyID0gb3MucGF0aC5qb2luKCooW3NlbGYuYnVpbGRfbGliXSArIHBhY2thZ2Uuc3BsaXQoJy4nKSkpCi0KLSAgICAgICAgICAgICMgTGVuZ3RoIG9mIHBhdGggdG8gc3RyaXAgZnJvbSBmb3VuZCBmaWxlcwotICAgICAgICAgICAgcGxlbiA9IGxlbihzcmNfZGlyKSsxCi0KLSAgICAgICAgICAgICMgU3RyaXAgZGlyZWN0b3J5IGZyb20gZ2xvYmJlZCBmaWxlbmFtZXMKLSAgICAgICAgICAgIGZpbGVuYW1lcyA9IFsKLSAgICAgICAgICAgICAgICBmaWxlW3BsZW46XSBmb3IgZmlsZSBpbiBzZWxmLmZpbmRfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyKQotICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgIGRhdGEuYXBwZW5kKCAocGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMpICkKLSAgICAgICAgcmV0dXJuIGRhdGEKLQotICAgIGRlZiBmaW5kX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2Rpcik6Ci0gICAgICAgICIiIlJldHVybiBmaWxlbmFtZXMgZm9yIHBhY2thZ2UncyBkYXRhIGZpbGVzIGluICdzcmNfZGlyJyIiIgotICAgICAgICBnbG9icyA9IChzZWxmLnBhY2thZ2VfZGF0YS5nZXQoJycsIFtdKQotICAgICAgICAgICAgICAgICArIHNlbGYucGFja2FnZV9kYXRhLmdldChwYWNrYWdlLCBbXSkpCi0gICAgICAgIGZpbGVzID0gc2VsZi5tYW5pZmVzdF9maWxlcy5nZXQocGFja2FnZSwgW10pWzpdCi0gICAgICAgIGZvciBwYXR0ZXJuIGluIGdsb2JzOgotICAgICAgICAgICAgIyBFYWNoIHBhdHRlcm4gaGFzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGgKLSAgICAgICAgICAgIGZpbGVzLmV4dGVuZChnbG9iKG9zLnBhdGguam9pbihzcmNfZGlyLCBjb252ZXJ0X3BhdGgocGF0dGVybikpKSkKLSAgICAgICAgcmV0dXJuIHNlbGYuZXhjbHVkZV9kYXRhX2ZpbGVzKHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKQotCi0gICAgZGVmIGJ1aWxkX3BhY2thZ2VfZGF0YShzZWxmKToKLSAgICAgICAgIiIiQ29weSBkYXRhIGZpbGVzIGludG8gYnVpbGQgZGlyZWN0b3J5IiIiCi0gICAgICAgIGxhc3RkaXIgPSBOb25lCi0gICAgICAgIGZvciBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBzZWxmLmRhdGFfZmlsZXM6Ci0gICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgotICAgICAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsIGZpbGVuYW1lKQotICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZSh0YXJnZXQpKQotICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSksIHRhcmdldCkKLQotCi0gICAgZGVmIGFuYWx5emVfbWFuaWZlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYubWFuaWZlc3RfZmlsZXMgPSBtZiA9IHt9Ci0gICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX3BhY2thZ2VfZGF0YToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzcmNfZGlycyA9IHt9Ci0gICAgICAgIGZvciBwYWNrYWdlIGluIHNlbGYucGFja2FnZXMgb3IgKCk6Ci0gICAgICAgICAgICAjIExvY2F0ZSBwYWNrYWdlIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgICAgICAgIHNyY19kaXJzW2Fzc2VydF9yZWxhdGl2ZShzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKSldID0gcGFja2FnZQotCi0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKLSAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKLSAgICAgICAgZm9yIHBhdGggaW4gZWlfY21kLmZpbGVsaXN0LmZpbGVzOgotICAgICAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLnB5Jyk6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGQsZiA9IG9zLnBhdGguc3BsaXQoYXNzZXJ0X3JlbGF0aXZlKHBhdGgpKQotICAgICAgICAgICAgcHJldiA9IE5vbmUKLSAgICAgICAgICAgIHdoaWxlIGQgYW5kIGQhPXByZXYgYW5kIGQgbm90IGluIHNyY19kaXJzOgotICAgICAgICAgICAgICAgIHByZXYgPSBkCi0gICAgICAgICAgICAgICAgZCwgZGYgPSBvcy5wYXRoLnNwbGl0KGQpCi0gICAgICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihkZiwgZikKLSAgICAgICAgICAgIGlmIGQgaW4gc3JjX2RpcnM6Ci0gICAgICAgICAgICAgICAgbWYuc2V0ZGVmYXVsdChzcmNfZGlyc1tkXSxbXSkuYXBwZW5kKHBhdGgpCi0KLQotICAgIGRlZiBnZXRfZGF0YV9maWxlcyhzZWxmKTogcGFzcyAgIyBrbHVkZ2UgMi40IGZvciBsYXp5IGNvbXB1dGF0aW9uCi0KLSAgICBpZiBzeXMudmVyc2lvbjwiMi40IjogICAgIyBQeXRob24gMi40IGFscmVhZHkgaGFzIHRoaXMgY29kZQotICAgICAgICBkZWYgZ2V0X291dHB1dHMoc2VsZiwgaW5jbHVkZV9ieXRlY29kZT0xKToKLSAgICAgICAgICAgICIiIlJldHVybiBjb21wbGV0ZSBsaXN0IG9mIGZpbGVzIGNvcGllZCB0byB0aGUgYnVpbGQgZGlyZWN0b3J5Ci0KLSAgICAgICAgICAgIFRoaXMgaW5jbHVkZXMgYm90aCAnLnB5JyBmaWxlcyBhbmQgZGF0YSBmaWxlcywgYXMgd2VsbCBhcyAnLnB5YycKLSAgICAgICAgICAgIGFuZCAnLnB5bycgZmlsZXMgaWYgJ2luY2x1ZGVfYnl0ZWNvZGUnIGlzIHRydWUuICAoVGhpcyBtZXRob2QgaXMKLSAgICAgICAgICAgIG5lZWRlZCBmb3IgdGhlICdpbnN0YWxsX2xpYicgY29tbWFuZCB0byBkbyBpdHMgam9iIHByb3Blcmx5LCBhbmQgdG8KLSAgICAgICAgICAgIGdlbmVyYXRlIGEgY29ycmVjdCBpbnN0YWxsYXRpb24gbWFuaWZlc3QuKQotICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICByZXR1cm4gX2J1aWxkX3B5LmdldF9vdXRwdXRzKHNlbGYsIGluY2x1ZGVfYnl0ZWNvZGUpICsgWwotICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihidWlsZF9kaXIsIGZpbGVuYW1lKQotICAgICAgICAgICAgICAgIGZvciBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlcwotICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXMKLSAgICAgICAgICAgICAgICBdCi0KLSAgICBkZWYgY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2Rpcik6Ci0gICAgICAgICIiIkNoZWNrIG5hbWVzcGFjZSBwYWNrYWdlcycgX19pbml0X18gZm9yIGRlY2xhcmVfbmFtZXNwYWNlIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2thZ2VzX2NoZWNrZWRbcGFja2FnZV0KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcGFzcwotCi0gICAgICAgIGluaXRfcHkgPSBfYnVpbGRfcHkuY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2RpcikKLSAgICAgICAgc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdID0gaW5pdF9weQotCi0gICAgICAgIGlmIG5vdCBpbml0X3B5IG9yIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6Ci0gICAgICAgICAgICByZXR1cm4gaW5pdF9weQotCi0gICAgICAgIGZvciBwa2cgaW4gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgotICAgICAgICAgICAgaWYgcGtnPT1wYWNrYWdlIG9yIHBrZy5zdGFydHN3aXRoKHBhY2thZ2UrJy4nKToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKLQotICAgICAgICBmID0gb3Blbihpbml0X3B5LCdyVScpCi0gICAgICAgIGlmICdkZWNsYXJlX25hbWVzcGFjZScgbm90IGluIGYucmVhZCgpOgotICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCi0gICAgICAgICAgICAgICJOYW1lc3BhY2UgcGFja2FnZSBwcm9ibGVtOiAlcyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlLCBidXQgaXRzXG4iCi0gICAgICAgICAgICAgICJfX2luaXRfXy5weSBkb2VzIG5vdCBjYWxsIGRlY2xhcmVfbmFtZXNwYWNlKCkhIFBsZWFzZSBmaXggaXQuXG4iCi0gICAgICAgICAgICAgICcoU2VlIHRoZSBzZXR1cHRvb2xzIG1hbnVhbCB1bmRlciAiTmFtZXNwYWNlIFBhY2thZ2VzIiBmb3IgJwotICAgICAgICAgICAgICAiZGV0YWlscy4pXG4iICUgKHBhY2thZ2UsKQotICAgICAgICAgICAgKQotICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgcmV0dXJuIGluaXRfcHkKLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYucGFja2FnZXNfY2hlY2tlZD17fQotICAgICAgICBfYnVpbGRfcHkuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCi0KLQotCi0KLQotCi0KLSAgICBkZWYgZXhjbHVkZV9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIsIGZpbGVzKToKLSAgICAgICAgIiIiRmlsdGVyIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCi0gICAgICAgIGdsb2JzID0gKHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEuZ2V0KCcnLCBbXSkKLSAgICAgICAgICAgICAgICAgKyBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhLmdldChwYWNrYWdlLCBbXSkpCi0gICAgICAgIGJhZCA9IFtdCi0gICAgICAgIGZvciBwYXR0ZXJuIGluIGdsb2JzOgotICAgICAgICAgICAgYmFkLmV4dGVuZCgKLSAgICAgICAgICAgICAgICBmbm1hdGNoLmZpbHRlcigKLSAgICAgICAgICAgICAgICAgICAgZmlsZXMsIG9zLnBhdGguam9pbihzcmNfZGlyLCBjb252ZXJ0X3BhdGgocGF0dGVybikpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKQotICAgICAgICBiYWQgPSBkaWN0LmZyb21rZXlzKGJhZCkKLSAgICAgICAgcmV0dXJuIFtmIGZvciBmIGluIGZpbGVzIGlmIGYgbm90IGluIGJhZF0KLQotCi1kZWYgYXNzZXJ0X3JlbGF0aXZlKHBhdGgpOgotICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgotICAgICAgICByZXR1cm4gcGF0aAotICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgotICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCi0iIiJFcnJvcjogc2V0dXAgc2NyaXB0IHNwZWNpZmllcyBhbiBhYnNvbHV0ZSBwYXRoOgotCi0gICAgJXMKLQotc2V0dXAoKSBhcmd1bWVudHMgbXVzdCAqYWx3YXlzKiBiZSAvLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byB0aGUKLXNldHVwLnB5IGRpcmVjdG9yeSwgKm5ldmVyKiBhYnNvbHV0ZSBwYXRocy4KLSIiIiAlIHBhdGgKLSAgICApCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdhYjViMjMuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLWZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCi1mcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKLWZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIG5vcm1hbGl6ZV9wYXRoCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKLWltcG9ydCBzeXMsIG9zCi0KLWNsYXNzIGRldmVsb3AoZWFzeV9pbnN0YWxsKToKLSAgICAiIiJTZXQgdXAgcGFja2FnZSBmb3IgZGV2ZWxvcG1lbnQiIiIKLQotICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgcGFja2FnZSBpbiAnZGV2ZWxvcG1lbnQgbW9kZSciCi0KLSAgICB1c2VyX29wdGlvbnMgPSBlYXN5X2luc3RhbGwudXNlcl9vcHRpb25zICsgWwotICAgICAgICAoInVuaW5zdGFsbCIsICJ1IiwgIlVuaW5zdGFsbCB0aGlzIHNvdXJjZSBwYWNrYWdlIiksCi0gICAgXQotCi0gICAgYm9vbGVhbl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLmJvb2xlYW5fb3B0aW9ucyArIFsndW5pbnN0YWxsJ10KLQotICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gRmFsc2UgICMgb3ZlcnJpZGUgYmFzZQotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi51bmluc3RhbGw6Ci0gICAgICAgICAgICBzZWxmLm11bHRpX3ZlcnNpb24gPSBUcnVlCi0gICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9saW5rKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoKQotICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYudW5pbnN0YWxsID0gTm9uZQotICAgICAgICBlYXN5X2luc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCi0KLQotCi0KLQotCi0KLQotCi0KLSAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgZWkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQotICAgICAgICBpZiBlaS5icm9rZW5fZWdnX2luZm86Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKLSAgICAgICAgICAgICJQbGVhc2UgcmVuYW1lICVyIHRvICVyIGJlZm9yZSB1c2luZyAnZGV2ZWxvcCciCi0gICAgICAgICAgICAlIChlaS5lZ2dfaW5mbywgZWkuYnJva2VuX2VnZ19pbmZvKQotICAgICAgICAgICAgKQotICAgICAgICBzZWxmLmFyZ3MgPSBbZWkuZWdnX25hbWVdCi0gICAgICAgIGVhc3lfaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCi0gICAgICAgIHNlbGYuZWdnX2xpbmsgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgZWkuZWdnX25hbWUrJy5lZ2ctbGluaycpCi0gICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBlaS5lZ2dfYmFzZQotICAgICAgICBzZWxmLmVnZ19wYXRoID0gb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19iYXNlKQotCi0gICAgICAgICMgTWFrZSBhIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UKLSAgICAgICAgc2VsZi5kaXN0ID0gRGlzdHJpYnV0aW9uKAotICAgICAgICAgICAgbm9ybWFsaXplX3BhdGgoc2VsZi5lZ2dfcGF0aCksCi0gICAgICAgICAgICBQYXRoTWV0YWRhdGEoc2VsZi5lZ2dfcGF0aCwgb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19pbmZvKSksCi0gICAgICAgICAgICBwcm9qZWN0X25hbWUgPSBlaS5lZ2dfbmFtZQotICAgICAgICApCi0KLSAgICBkZWYgaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoc2VsZik6Ci0gICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKLSAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQotCi0gICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQotICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCi0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCi0KLSAgICAgICAgc2VsZi5pbnN0YWxsX3NpdGVfcHkoKSAgIyBlbnN1cmUgdGhhdCB0YXJnZXQgZGlyIGlzIHNpdGUtc2FmZQotCi0gICAgICAgICMgY3JlYXRlIGFuIC5lZ2ctbGluayBpbiB0aGUgaW5zdGFsbGF0aW9uIGRpciwgcG9pbnRpbmcgdG8gb3VyIGVnZwotICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKLSAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKLSAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZWdnX2xpbmssInciKQotICAgICAgICAgICAgZi53cml0ZShzZWxmLmVnZ19wYXRoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0KLSAgICAgICAgIyBwb3N0cHJvY2VzcyB0aGUgaW5zdGFsbGVkIGRpc3RybywgZml4aW5nIHVwIC5wdGgsIGluc3RhbGxpbmcgc2NyaXB0cywKLSAgICAgICAgIyBhbmQgaGFuZGxpbmcgcmVxdWlyZW1lbnRzCi0gICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oTm9uZSwgc2VsZi5kaXN0KQotCi0gICAgZGVmIHVuaW5zdGFsbF9saW5rKHNlbGYpOgotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmVnZ19saW5rKToKLSAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyAobGluayB0byAlcykiLCBzZWxmLmVnZ19saW5rLCBzZWxmLmVnZ19iYXNlKQotICAgICAgICAgICAgY29udGVudHMgPSBbbGluZS5yc3RyaXAoKSBmb3IgbGluZSBpbiBmaWxlKHNlbGYuZWdnX2xpbmspXQotICAgICAgICAgICAgaWYgY29udGVudHMgIT0gW3NlbGYuZWdnX3BhdGhdOgotICAgICAgICAgICAgICAgIGxvZy53YXJuKCJMaW5rIHBvaW50cyB0byAlczogdW5pbnN0YWxsIGFib3J0ZWQiLCBjb250ZW50cykKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZWdnX2xpbmspCi0gICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoc2VsZi5kaXN0KSAgIyByZW1vdmUgYW55IC5wdGggbGluayB0byB1cwotICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgotICAgICAgICAgICAgIyBYWFggc2hvdWxkIGFsc28gY2hlY2sgZm9yIGVudHJ5IHBvaW50IHNjcmlwdHMhCi0gICAgICAgICAgICBsb2cud2FybigiTm90ZTogeW91IG11c3QgdW5pbnN0YWxsIG9yIHJlcGxhY2Ugc2NyaXB0cyBtYW51YWxseSEiKQotCi0KLSAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKLSAgICAgICAgaWYgZGlzdCBpcyBub3Qgc2VsZi5kaXN0OgotICAgICAgICAgICAgIyBJbnN0YWxsaW5nIGEgZGVwZW5kZW5jeSwgc28gZmFsbCBiYWNrIHRvIG5vcm1hbCBiZWhhdmlvcgotICAgICAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsZGlzdCkKLQotICAgICAgICAjIGNyZWF0ZSB3cmFwcGVyIHNjcmlwdHMgaW4gdGhlIHNjcmlwdCBkaXIsIHBvaW50aW5nIHRvIGRpc3Quc2NyaXB0cwotCi0gICAgICAgICMgbmV3LXN0eWxlLi4uCi0gICAgICAgIHNlbGYuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoZGlzdCkKLQotICAgICAgICAjIC4uLmFuZCBvbGQtc3R5bGUKLSAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHMgb3IgW106Ci0gICAgICAgICAgICBzY3JpcHRfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChjb252ZXJ0X3BhdGgoc2NyaXB0X25hbWUpKQotICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9wYXRoKQotICAgICAgICAgICAgZiA9IG9wZW4oc2NyaXB0X3BhdGgsJ3JVJykKLSAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gZi5yZWFkKCkKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdChkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIHNjcmlwdF9wYXRoKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2RkY2VjNC4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTUgKzAsMCBAQAotIyFweXRob24KLSIiIlwKLUVhc3kgSW5zdGFsbAotLS0tLS0tLS0tLS0tCi0KLUEgdG9vbCBmb3IgZG9pbmcgYXV0b21hdGljIGRvd25sb2FkL2V4dHJhY3QvYnVpbGQgb2YgZGlzdHV0aWxzLWJhc2VkIFB5dGhvbgotcGFja2FnZXMuICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgRWFzeUluc3RhbGwudHh0Ci1maWxlLCBvciB2aXNpdCB0aGUgYEVhc3lJbnN0YWxsIGhvbWUgcGFnZWBfXy4KLQotX18gaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsCi0iIiIKLWltcG9ydCBzeXMsIG9zLnBhdGgsIHppcGltcG9ydCwgc2h1dGlsLCB0ZW1wZmlsZSwgemlwZmlsZSwgcmUsIHN0YXQsIHJhbmRvbQotZnJvbSBnbG9iIGltcG9ydCBnbG9iCi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKLWZyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBydW5fc2V0dXAKLWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCi1mcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0FyZ0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAotICAgIERpc3R1dGlsc0Vycm9yCi1mcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfYXJjaGl2ZQotZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0IFBhY2thZ2VJbmRleCwgcGFyc2VfYmRpc3Rfd2luaW5zdAotZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0IFVSTF9TQ0hFTUUKLWZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2csIGVnZ19pbmZvCi1mcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKLXN5c19leGVjdXRhYmxlID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKLQotX19hbGxfXyA9IFsKLSAgICAnc2FtZWZpbGUnLCAnZWFzeV9pbnN0YWxsJywgJ1B0aERpc3RyaWJ1dGlvbnMnLCAnZXh0cmFjdF93aW5pbnN0X2NmZycsCi0gICAgJ21haW4nLCAnZ2V0X2V4ZV9wcmVmaXhlcycsCi1dCi0KLWRlZiBzYW1lZmlsZShwMSxwMik6Ci0gICAgaWYgaGFzYXR0cihvcy5wYXRoLCdzYW1lZmlsZScpIGFuZCAoCi0gICAgICAgIG9zLnBhdGguZXhpc3RzKHAxKSBhbmQgb3MucGF0aC5leGlzdHMocDIpCi0gICAgKToKLSAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUocDEscDIpCi0gICAgcmV0dXJuICgKLSAgICAgICAgb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAxKSkgPT0KLSAgICAgICAgb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLm5vcm1jYXNlKHAyKSkKLSAgICApCi0KLWNsYXNzIGVhc3lfaW5zdGFsbChDb21tYW5kKToKLSAgICAiIiJNYW5hZ2UgYSBkb3dubG9hZC9idWlsZC9pbnN0YWxsIHByb2Nlc3MiIiIKLSAgICBkZXNjcmlwdGlvbiA9ICJGaW5kL2dldC9pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyIKLSAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IFRydWUKLQotICAgIHVzZXJfb3B0aW9ucyA9IFsKLSAgICAgICAgKCdwcmVmaXg9JywgTm9uZSwgImluc3RhbGxhdGlvbiBwcmVmaXgiKSwKLSAgICAgICAgKCJ6aXAtb2siLCAieiIsICJpbnN0YWxsIHBhY2thZ2UgYXMgYSB6aXBmaWxlIiksCi0gICAgICAgICgibXVsdGktdmVyc2lvbiIsICJtIiwgIm1ha2UgYXBwcyBoYXZlIHRvIHJlcXVpcmUoKSBhIHZlcnNpb24iKSwKLSAgICAgICAgKCJ1cGdyYWRlIiwgIlUiLCAiZm9yY2UgdXBncmFkZSAoc2VhcmNoZXMgUHlQSSBmb3IgbGF0ZXN0IHZlcnNpb25zKSIpLAotICAgICAgICAoImluc3RhbGwtZGlyPSIsICJkIiwgImluc3RhbGwgcGFja2FnZSB0byBESVIiKSwKLSAgICAgICAgKCJzY3JpcHQtZGlyPSIsICJzIiwgImluc3RhbGwgc2NyaXB0cyB0byBESVIiKSwKLSAgICAgICAgKCJleGNsdWRlLXNjcmlwdHMiLCAieCIsICJEb24ndCBpbnN0YWxsIHNjcmlwdHMiKSwKLSAgICAgICAgKCJhbHdheXMtY29weSIsICJhIiwgIkNvcHkgYWxsIG5lZWRlZCBwYWNrYWdlcyB0byBpbnN0YWxsIGRpciIpLAotICAgICAgICAoImluZGV4LXVybD0iLCAiaSIsICJiYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCIpLAotICAgICAgICAoImZpbmQtbGlua3M9IiwgImYiLCAiYWRkaXRpb25hbCBVUkwocykgdG8gc2VhcmNoIGZvciBwYWNrYWdlcyIpLAotICAgICAgICAoImRlbGV0ZS1jb25mbGljdGluZyIsICJEIiwgIm5vIGxvbmdlciBuZWVkZWQ7IGRvbid0IHVzZSB0aGlzIiksCi0gICAgICAgICgiaWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIiwgTm9uZSwKLSAgICAgICAgICAgICJubyBsb25nZXIgbmVlZGVkOyBkb24ndCB1c2UgdGhpcyIpLAotICAgICAgICAoImJ1aWxkLWRpcmVjdG9yeT0iLCAiYiIsCi0gICAgICAgICAgICAiZG93bmxvYWQvZXh0cmFjdC9idWlsZCBpbiBESVI7IGtlZXAgdGhlIHJlc3VsdHMiKSwKLSAgICAgICAgKCdvcHRpbWl6ZT0nLCAnTycsCi0gICAgICAgICAiYWxzbyBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uOiAtTzEgZm9yIFwicHl0aG9uIC1PXCIsICIKLSAgICAgICAgICItTzIgZm9yIFwicHl0aG9uIC1PT1wiLCBhbmQgLU8wIHRvIGRpc2FibGUgW2RlZmF1bHQ6IC1PMF0iKSwKLSAgICAgICAgKCdyZWNvcmQ9JywgTm9uZSwKLSAgICAgICAgICJmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMiKSwKLSAgICAgICAgKCdhbHdheXMtdW56aXAnLCAnWicsICJkb24ndCBpbnN0YWxsIGFzIGEgemlwZmlsZSwgbm8gbWF0dGVyIHdoYXQiKSwKLSAgICAgICAgKCdzaXRlLWRpcnM9JywnUycsImxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hlcmUgLnB0aCBmaWxlcyB3b3JrIiksCi0gICAgICAgICgnZWRpdGFibGUnLCAnZScsICJJbnN0YWxsIHNwZWNpZmllZCBwYWNrYWdlcyBpbiBlZGl0YWJsZSBmb3JtIiksCi0gICAgICAgICgnbm8tZGVwcycsICdOJywgImRvbid0IGluc3RhbGwgZGVwZW5kZW5jaWVzIiksCi0gICAgICAgICgnYWxsb3ctaG9zdHM9JywgJ0gnLCAicGF0dGVybihzKSB0aGF0IGhvc3RuYW1lcyBtdXN0IG1hdGNoIiksCi0gICAgXQotICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKLSAgICAgICAgJ3ppcC1vaycsICdtdWx0aS12ZXJzaW9uJywgJ2V4Y2x1ZGUtc2NyaXB0cycsICd1cGdyYWRlJywgJ2Fsd2F5cy1jb3B5JywKLSAgICAgICAgJ2RlbGV0ZS1jb25mbGljdGluZycsICdpZ25vcmUtY29uZmxpY3RzLWF0LW15LXJpc2snLCAnZWRpdGFibGUnLAotICAgICAgICAnbm8tZGVwcycsCi0gICAgXQotICAgIG5lZ2F0aXZlX29wdCA9IHsnYWx3YXlzLXVuemlwJzogJ3ppcC1vayd9Ci0gICAgY3JlYXRlX2luZGV4ID0gUGFja2FnZUluZGV4Ci0KLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYuemlwX29rID0gTm9uZQotICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5leGNsdWRlX3NjcmlwdHMgPSBOb25lCi0gICAgICAgIHNlbGYuaW5kZXhfdXJsID0gTm9uZQotICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBOb25lCi0gICAgICAgIHNlbGYuYnVpbGRfZGlyZWN0b3J5ID0gTm9uZQotICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCi0gICAgICAgIHNlbGYub3B0aW1pemUgPSBzZWxmLnJlY29yZCA9IE5vbmUKLSAgICAgICAgc2VsZi51cGdyYWRlID0gc2VsZi5hbHdheXNfY29weSA9IHNlbGYubXVsdGlfdmVyc2lvbiA9IE5vbmUKLSAgICAgICAgc2VsZi5lZGl0YWJsZSA9IHNlbGYubm9fZGVwcyA9IHNlbGYuYWxsb3dfaG9zdHMgPSBOb25lCi0gICAgICAgIHNlbGYucm9vdCA9IHNlbGYucHJlZml4ID0gc2VsZi5ub19yZXBvcnQgPSBOb25lCi0KLSAgICAgICAgIyBPcHRpb25zIG5vdCBzcGVjaWZpYWJsZSB2aWEgY29tbWFuZCBsaW5lCi0gICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IE5vbmUKLSAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUKLSAgICAgICAgc2VsZi5kZWxldGVfY29uZmxpY3RpbmcgPSBOb25lCi0gICAgICAgIHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrID0gTm9uZQotICAgICAgICBzZWxmLnNpdGVfZGlycyA9IE5vbmUKLSAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHMgPSB7fQotICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBGYWxzZQotICAgICAgICAjIEFsd2F5cyByZWFkIGVhc3lfaW5zdGFsbCBvcHRpb25zLCBldmVuIGlmIHdlIGFyZSBzdWJjbGFzc2VkLCBvciBoYXZlCi0gICAgICAgICMgYW4gaW5kZXBlbmRlbnQgaW5zdGFuY2UgY3JlYXRlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGRlZmF1bHRzIHdpbGwKLSAgICAgICAgIyBhbHdheXMgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGUocyknICJlYXN5X2luc3RhbGwiCi0gICAgICAgICMgc2VjdGlvbiwgZXZlbiBpZiB0aGlzIGlzIGEgImRldmVsb3AiIG9yICJpbnN0YWxsIiBjb21tYW5kLCBvciBzb21lCi0gICAgICAgICMgb3RoZXIgZW1iZWRkaW5nLgotICAgICAgICBzZWxmLl9kcnlfcnVuID0gTm9uZQotICAgICAgICBzZWxmLnZlcmJvc2UgPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlCi0gICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9zZXRfY29tbWFuZF9vcHRpb25zKAotICAgICAgICAgICAgc2VsZiwgc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQotICAgICAgICApCi0KLSAgICBkZWYgZGVsZXRlX2Jsb2NrZXJzKHNlbGYsIGJsb2NrZXJzKToKLSAgICAgICAgZm9yIGZpbGVuYW1lIGluIGJsb2NrZXJzOgotICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpIG9yIG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgotICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGZpbGVuYW1lKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJtdHJlZShmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLQotICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgotICAgICAgICBzZWxmLl9leHBhbmQoJ2luc3RhbGxfZGlyJywnc2NyaXB0X2RpcicsJ2J1aWxkX2RpcmVjdG9yeScsJ3NpdGVfZGlycycpCi0gICAgICAgICMgSWYgYSBub24tZGVmYXVsdCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdhcyBzcGVjaWZpZWQsIGRlZmF1bHQgdGhlCi0gICAgICAgICMgc2NyaXB0IGRpcmVjdG9yeSB0byBtYXRjaCBpdC4KLSAgICAgICAgaWYgc2VsZi5zY3JpcHRfZGlyIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfZGlyCi0KLSAgICAgICAgIyBMZXQgaW5zdGFsbF9kaXIgZ2V0IHNldCBieSBpbnN0YWxsX2xpYiBjb21tYW5kLCB3aGljaCBpbiB0dXJuCi0gICAgICAgICMgZ2V0cyBpdHMgaW5mbyBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQsIGFuZCB0YWtlcyBpbnRvIGFjY291bnQKLSAgICAgICAgIyAtLXByZWZpeCBhbmQgLS1ob21lIGFuZCBhbGwgdGhhdCBvdGhlciBjcnVkLgotICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLAotICAgICAgICAgICAgKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykKLSAgICAgICAgKQotICAgICAgICAjIExpa2V3aXNlLCBzZXQgZGVmYXVsdCBzY3JpcHRfZGlyIGZyb20gJ2luc3RhbGxfc2NyaXB0cy5pbnN0YWxsX2RpcicKLSAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfc2NyaXB0cycsCi0gICAgICAgICAgICAoJ2luc3RhbGxfZGlyJywgJ3NjcmlwdF9kaXInKQotICAgICAgICApCi0gICAgICAgICMgZGVmYXVsdCAtLXJlY29yZCBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQKLSAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLCAoJ3JlY29yZCcsICdyZWNvcmQnKSkKLSAgICAgICAgbm9ybXBhdGggPSBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKQotICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMgPSBnZXRfc2l0ZV9kaXJzKCkKLSAgICAgICAgaWYgc2VsZi5zaXRlX2RpcnMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzaXRlX2RpcnMgPSBbCi0gICAgICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyKHMuc3RyaXAoKSkgZm9yIHMgaW4gc2VsZi5zaXRlX2RpcnMuc3BsaXQoJywnKQotICAgICAgICAgICAgXQotICAgICAgICAgICAgZm9yIGQgaW4gc2l0ZV9kaXJzOgotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGQpOgotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXMgKGluIC0tc2l0ZS1kaXJzKSBkb2VzIG5vdCBleGlzdCIsIGQpCi0gICAgICAgICAgICAgICAgZWxpZiBub3JtYWxpemVfcGF0aChkKSBub3QgaW4gbm9ybXBhdGg6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgZCsiIChpbiAtLXNpdGUtZGlycykgaXMgbm90IG9uIHN5cy5wYXRoIgotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxfc2l0ZV9kaXJzLmFwcGVuZChub3JtYWxpemVfcGF0aChkKSkKLSAgICAgICAgc2VsZi5jaGVja19zaXRlX2RpcigpCi0gICAgICAgIHNlbGYuaW5kZXhfdXJsID0gc2VsZi5pbmRleF91cmwgb3IgImh0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpIgotICAgICAgICBzZWxmLnNoYWRvd19wYXRoID0gc2VsZi5hbGxfc2l0ZV9kaXJzWzpdCi0gICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gc2VsZi5pbnN0YWxsX2Rpciwgbm9ybWFsaXplX3BhdGgoc2VsZi5zY3JpcHRfZGlyKToKLSAgICAgICAgICAgIGlmIHBhdGhfaXRlbSBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKLSAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmluc2VydCgwLCBwYXRoX2l0ZW0pCi0KLSAgICAgICAgaWYgc2VsZi5hbGxvd19ob3N0cyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGhvc3RzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzZWxmLmFsbG93X2hvc3RzLnNwbGl0KCcsJyldCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBob3N0cyA9IFsnKiddCi0KLSAgICAgICAgaWYgc2VsZi5wYWNrYWdlX2luZGV4IGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBzZWxmLmNyZWF0ZV9pbmRleCgKLSAgICAgICAgICAgICAgICBzZWxmLmluZGV4X3VybCwgc2VhcmNoX3BhdGggPSBzZWxmLnNoYWRvd19wYXRoLCBob3N0cz1ob3N0cwotICAgICAgICAgICAgKQotICAgICAgICBzZWxmLmxvY2FsX2luZGV4ID0gRW52aXJvbm1lbnQoc2VsZi5zaGFkb3dfcGF0aCkKLQotICAgICAgICBpZiBzZWxmLmZpbmRfbGlua3MgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmluZF9saW5rcywgYmFzZXN0cmluZyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gc2VsZi5maW5kX2xpbmtzLnNwbGl0KCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IFtdCi0KLSAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZF9maW5kX2xpbmtzKHNlbGYuZmluZF9saW5rcykKLSAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywgKCdvcHRpbWl6ZScsJ29wdGltaXplJykpCi0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYub3B0aW1pemUsaW50KToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gaW50KHNlbGYub3B0aW1pemUpCi0gICAgICAgICAgICAgICAgaWYgbm90ICgwIDw9IHNlbGYub3B0aW1pemUgPD0gMik6IHJhaXNlIFZhbHVlRXJyb3IKLSAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLW9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMiIpCi0KLSAgICAgICAgaWYgc2VsZi5kZWxldGVfY29uZmxpY3RpbmcgYW5kIHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCi0gICAgICAgICAgICAgICAgIkNhbid0IHVzZSBib3RoIC0tZGVsZXRlLWNvbmZsaWN0aW5nIGFuZCAiCi0gICAgICAgICAgICAgICAgIi0taWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIGF0IHRoZSBzYW1lIHRpbWUiCi0gICAgICAgICAgICApCi0gICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIG5vdCBzZWxmLmJ1aWxkX2RpcmVjdG9yeToKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAotICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgYSBidWlsZCBkaXJlY3RvcnkgKC1iKSB3aGVuIHVzaW5nIC0tZWRpdGFibGUiCi0gICAgICAgICAgICApCi0gICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKLSAgICAgICAgICAgICAgICAiTm8gdXJscywgZmlsZW5hbWVzLCBvciByZXF1aXJlbWVudHMgc3BlY2lmaWVkIChzZWUgLS1oZWxwKSIpCi0KLSAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KLQotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYudmVyYm9zZTw+c2VsZi5kaXN0cmlidXRpb24udmVyYm9zZToKLSAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5hcmdzOgotICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKHNwZWMsIG5vdCBzZWxmLm5vX2RlcHMpCi0gICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKLSAgICAgICAgICAgICAgICBvdXRwdXRzID0gc2VsZi5vdXRwdXRzCi0gICAgICAgICAgICAgICAgaWYgc2VsZi5yb290OiAgICAgICAgICAgICAgICMgc3RyaXAgYW55IHBhY2thZ2UgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgIHJvb3RfbGVuID0gbGVuKHNlbGYucm9vdCkKLSAgICAgICAgICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4geHJhbmdlKGxlbihvdXRwdXRzKSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzW2NvdW50ZXJdID0gb3V0cHV0c1tjb3VudGVyXVtyb290X2xlbjpdCi0gICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGZpbGVfdXRpbAotICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgZmlsZV91dGlsLndyaXRlX2ZpbGUsIChzZWxmLnJlY29yZCwgb3V0cHV0cyksCi0gICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIHRvICclcyciICUKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmQKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UpCi0KLSAgICBkZWYgcHNldWRvX3RlbXBuYW1lKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gYSBwc2V1ZG8tdGVtcG5hbWUgYmFzZSBpbiB0aGUgaW5zdGFsbCBkaXJlY3RvcnkuCi0gICAgICAgIFRoaXMgY29kZSBpcyBpbnRlbnRpb25hbGx5IG5haXZlOyBpZiBhIG1hbGljaW91cyBwYXJ0eSBjYW4gd3JpdGUgdG8KLSAgICAgICAgdGhlIHRhcmdldCBkaXJlY3RvcnkgeW91J3JlIGFscmVhZHkgaW4gZGVlcCBkb29kb28uCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwaWQgPSByYW5kb20ucmFuZGludCgwLHN5cy5tYXhpbnQpCi0gICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInRlc3QtZWFzeS1pbnN0YWxsLSVzIiAlIHBpZCkKLQotICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWRfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi5kZWxldGVfY29uZmxpY3Rpbmcgb3Igc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6Ci0gICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAiTm90ZTogVGhlIC1ELCAtLWRlbGV0ZS1jb25mbGljdGluZyBhbmQiCi0gICAgICAgICAgICAgICAgIiAtLWlnbm9yZS1jb25mbGljdHMtYXQtbXktcmlzayBubyBsb25nZXIgaGF2ZSBhbnkgcHVycG9zZSIKLSAgICAgICAgICAgICAgICAiIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIgotICAgICAgICAgICAgKQotCi0gICAgZGVmIGNoZWNrX3NpdGVfZGlyKHNlbGYpOgotICAgICAgICAiIiJWZXJpZnkgdGhhdCBzZWxmLmluc3RhbGxfZGlyIGlzIC5wdGgtY2FwYWJsZSBkaXIsIGlmIG5lZWRlZCIiIgotCi0gICAgICAgIGluc3RkaXIgPSBub3JtYWxpemVfcGF0aChzZWxmLmluc3RhbGxfZGlyKQotICAgICAgICBwdGhfZmlsZSA9IG9zLnBhdGguam9pbihpbnN0ZGlyLCdlYXN5LWluc3RhbGwucHRoJykKLQotICAgICAgICAjIElzIGl0IGEgY29uZmlndXJlZCwgUFlUSE9OUEFUSCwgaW1wbGljaXQsIG9yIGV4cGxpY2l0IHNpdGUgZGlyPwotICAgICAgICBpc19zaXRlX2RpciA9IGluc3RkaXIgaW4gc2VsZi5hbGxfc2l0ZV9kaXJzCi0KLSAgICAgICAgaWYgbm90IGlzX3NpdGVfZGlyOgotICAgICAgICAgICAgIyBObz8gIFRoZW4gZGlyZWN0bHkgdGVzdCB3aGV0aGVyIGl0IGRvZXMgLnB0aCBmaWxlIHByb2Nlc3NpbmcKLSAgICAgICAgICAgIGlzX3NpdGVfZGlyID0gc2VsZi5jaGVja19wdGhfcHJvY2Vzc2luZygpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gd3JpdGUgdG8gdGFyZ2V0IGRpcgotICAgICAgICAgICAgdGVzdGZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpKycud3JpdGUtdGVzdCcKLSAgICAgICAgICAgIHRlc3RfZXhpc3RzID0gb3MucGF0aC5leGlzdHModGVzdGZpbGUpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgaWYgdGVzdF9leGlzdHM6IG9zLnVubGluayh0ZXN0ZmlsZSkKLSAgICAgICAgICAgICAgICBvcGVuKHRlc3RmaWxlLCd3JykuY2xvc2UoKQotICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0ZmlsZSkKLSAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvcixJT0Vycm9yKToKLSAgICAgICAgICAgICAgICBzZWxmLmNhbnRfd3JpdGVfdG9fdGFyZ2V0KCkKLQotICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXIgYW5kIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246Ci0gICAgICAgICAgICAjIENhbid0IGluc3RhbGwgbm9uLW11bHRpIHRvIG5vbi1zaXRlIGRpcgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc2VsZi5ub19kZWZhdWx0X3ZlcnNpb25fbXNnKCkpCi0KLSAgICAgICAgaWYgaXNfc2l0ZV9kaXI6Ci0gICAgICAgICAgICBpZiBzZWxmLnB0aF9maWxlIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IFB0aERpc3RyaWJ1dGlvbnMocHRoX2ZpbGUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZQotCi0gICAgICAgIFBZVEhPTlBBVEggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsJycpLnNwbGl0KG9zLnBhdGhzZXApCi0gICAgICAgIGlmIGluc3RkaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCwgZmlsdGVyKE5vbmUsUFlUSE9OUEFUSCkpOgotICAgICAgICAgICAgIyBvbmx5IFBZVEhPTlBBVEggZGlycyBuZWVkIGEgc2l0ZS5weSwgc28gcHJldGVuZCBpdCdzIHRoZXJlCi0gICAgICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCi0KLSAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IGluc3RkaXIKLQotCi0gICAgZGVmIGNhbnRfd3JpdGVfdG9fdGFyZ2V0KHNlbGYpOgotICAgICAgICBtc2cgPSAiIiJjYW4ndCBjcmVhdGUgb3IgcmVtb3ZlIGZpbGVzIGluIGluc3RhbGwgZGlyZWN0b3J5Ci0KLVRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGFkZCBvciByZW1vdmUgZmlsZXMgaW4gdGhlCi1pbnN0YWxsYXRpb24gZGlyZWN0b3J5OgotCi0gICAgJXMKLQotVGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgeW91IHNwZWNpZmllZCAodmlhIC0taW5zdGFsbC1kaXIsIC0tcHJlZml4LCBvcgotdGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKLQotICAgICVzCi0iIiIgICAgICUgKHN5cy5leGNfaW5mbygpWzFdLCBzZWxmLmluc3RhbGxfZGlyLCkKLQotICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5pbnN0YWxsX2Rpcik6Ci0gICAgICAgICAgICBtc2cgKz0gIiIiCi1UaGlzIGRpcmVjdG9yeSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuICBQbGVhc2UgY3JlYXRlIGl0IGFuZCB0cnkgYWdhaW4sIG9yCi1jaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAodXNpbmcgdGhlIC1kIG9yIC0taW5zdGFsbC1kaXIKLW9wdGlvbikuCi0iIiIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG1zZyArPSAiIiIKLVBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PyAgSWYgdGhlCi1pbnN0YWxsYXRpb24gZGlyZWN0b3J5IGlzIGEgc3lzdGVtLW93bmVkIGRpcmVjdG9yeSwgeW91IG1heSBuZWVkIHRvIHNpZ24gaW4KLWFzIHRoZSBhZG1pbmlzdHJhdG9yIG9yICJyb290IiBhY2NvdW50LiAgSWYgeW91IGRvIG5vdCBoYXZlIGFkbWluaXN0cmF0aXZlCi1hY2Nlc3MgdG8gdGhpcyBtYWNoaW5lLCB5b3UgbWF5IHdpc2ggdG8gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbgotZGlyZWN0b3J5LCBwcmVmZXJhYmx5IG9uZSB0aGF0IGlzIGxpc3RlZCBpbiB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKLXZhcmlhYmxlLgotCi1Gb3IgaW5mb3JtYXRpb24gb24gb3RoZXIgb3B0aW9ucywgeW91IG1heSB3aXNoIHRvIGNvbnN1bHQgdGhlCi1kb2N1bWVudGF0aW9uIGF0OgotCi0gIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0Vhc3lJbnN0YWxsLmh0bWwKLQotUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uCi0iIiIKLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQotCi0KLQotCi0gICAgZGVmIGNoZWNrX3B0aF9wcm9jZXNzaW5nKHNlbGYpOgotICAgICAgICAiIiJFbXBpcmljYWxseSB2ZXJpZnkgd2hldGhlciAucHRoIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gaW5zdC4gZGlyIiIiCi0gICAgICAgIGluc3RkaXIgPSBzZWxmLmluc3RhbGxfZGlyCi0gICAgICAgIGxvZy5pbmZvKCJDaGVja2luZyAucHRoIGZpbGUgc3VwcG9ydCBpbiAlcyIsIGluc3RkaXIpCi0gICAgICAgIHB0aF9maWxlID0gc2VsZi5wc2V1ZG9fdGVtcG5hbWUoKSsiLnB0aCIKLSAgICAgICAgb2tfZmlsZSA9IHB0aF9maWxlKycub2snCi0gICAgICAgIG9rX2V4aXN0cyA9IG9zLnBhdGguZXhpc3RzKG9rX2ZpbGUpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIG9rX2V4aXN0czogb3MudW5saW5rKG9rX2ZpbGUpCi0gICAgICAgICAgICBmID0gb3BlbihwdGhfZmlsZSwndycpCi0gICAgICAgIGV4Y2VwdCAoT1NFcnJvcixJT0Vycm9yKToKLSAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGYud3JpdGUoImltcG9ydCBvcztvcGVuKCVyLCd3Jykud3JpdGUoJ09LJylcbiIgJSAob2tfZmlsZSwpKQotICAgICAgICAgICAgICAgIGYuY2xvc2UoKTsgZj1Ob25lCi0gICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlCi0gICAgICAgICAgICAgICAgaWYgb3MubmFtZT09J250JzoKLSAgICAgICAgICAgICAgICAgICAgZGlybmFtZSxiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZXhlY3V0YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgYWx0ID0gb3MucGF0aC5qb2luKGRpcm5hbWUsJ3B5dGhvbncuZXhlJykKLSAgICAgICAgICAgICAgICAgICAgaWYgYmFzZW5hbWUubG93ZXIoKT09J3B5dGhvbi5leGUnIGFuZCBvcy5wYXRoLmV4aXN0cyhhbHQpOgotICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgcHl0aG9udy5leGUgdG8gYXZvaWQgb3BlbmluZyBhIGNvbnNvbGUgd2luZG93Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYWx0Ci0gICAgICAgICAgICAgICAgICAgIGlmICcgJyBpbiBleGVjdXRhYmxlOiBleGVjdXRhYmxlPSciJXMiJyAlIGV4ZWN1dGFibGUKLSAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KLSAgICAgICAgICAgICAgICBzcGF3bihbZXhlY3V0YWJsZSwnLUUnLCctYycsJ3Bhc3MnXSwwKQotCi0gICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgUEFTU0VEOiAlcyBhcHBlYXJzIHRvIHN1cHBvcnQgLnB0aCBmaWxlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZGlyCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob2tfZmlsZSk6IG9zLnVubGluayhva19maWxlKQotICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHB0aF9maWxlKTogb3MudW5saW5rKHB0aF9maWxlKQotICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgotICAgICAgICAgICAgbG9nLndhcm4oIlRFU1QgRkFJTEVEOiAlcyBkb2VzIE5PVCBzdXBwb3J0IC5wdGggZmlsZXMiLCBpbnN0ZGlyKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIGRlZiBpbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpOgotICAgICAgICAiIiJXcml0ZSBhbGwgdGhlIHNjcmlwdHMgZm9yIGBkaXN0YCwgdW5sZXNzIHNjcmlwdHMgYXJlIGV4Y2x1ZGVkIiIiCi0KLSAgICAgICAgc2VsZi5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhkaXN0KQotICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyBvciBub3QgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cycpOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIGRpc3QubWV0YWRhdGFfbGlzdGRpcignc2NyaXB0cycpOgotICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCgKLSAgICAgICAgICAgICAgICBkaXN0LCBzY3JpcHRfbmFtZSwKLSAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YSgnc2NyaXB0cy8nK3NjcmlwdF9uYW1lKS5yZXBsYWNlKCdccicsJ1xuJykKLSAgICAgICAgICAgICkKLQotICAgIGRlZiBhZGRfb3V0cHV0KHNlbGYsIHBhdGgpOgotICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgotICAgICAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6Ci0gICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihiYXNlLGZpbGVuYW1lKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQocGF0aCkKLQotICAgIGRlZiBub3RfZWRpdGFibGUoc2VsZiwgc3BlYyk6Ci0gICAgICAgIGlmIHNlbGYuZWRpdGFibGU6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAlcjogeW91IGNhbid0IHVzZSBmaWxlbmFtZXMgb3IgVVJMcyAiCi0gICAgICAgICAgICAgICAgIndpdGggLS1lZGl0YWJsZSAoZXhjZXB0IHZpYSB0aGUgLS1maW5kLWxpbmtzIG9wdGlvbikuIgotICAgICAgICAgICAgICAgICUgKHNwZWMsKQotICAgICAgICAgICAgKQotCi0gICAgZGVmIGNoZWNrX2VkaXRhYmxlKHNlbGYsc3BlYyk6Ci0gICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkpOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCi0gICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBjYW4ndCBkbyBhIGNoZWNrb3V0IHRoZXJlIiAlCi0gICAgICAgICAgICAgICAgKHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSkKLSAgICAgICAgICAgICkKLQotCi0KLSAgICBkZWYgZWFzeV9pbnN0YWxsKHNlbGYsIHNwZWMsIGRlcHM9RmFsc2UpOgotICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iZWFzeV9pbnN0YWxsLSIpCi0gICAgICAgIGRvd25sb2FkID0gTm9uZQotICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYyxSZXF1aXJlbWVudCk6Ci0gICAgICAgICAgICAgICAgaWYgVVJMX1NDSEVNRShzcGVjKToKLSAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIgYW5kIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKLSAgICAgICAgICAgICAgICAgICAgZG93bmxvYWQgPSBzZWxmLnBhY2thZ2VfaW5kZXguZG93bmxvYWQoc3BlYywgdG1wZGlyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgVHJ1ZSkKLQotICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3BlYyk6Ci0gICAgICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcHJvY2VzcyBpdCBkaXJlY3RseQotICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2l0ZW0oTm9uZSwgc3BlYywgdG1wZGlyLCBkZXBzLCBUcnVlKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKLQotICAgICAgICAgICAgc2VsZi5jaGVja19lZGl0YWJsZShzcGVjKQotICAgICAgICAgICAgZGlzdCA9IHNlbGYucGFja2FnZV9pbmRleC5mZXRjaF9kaXN0cmlidXRpb24oCi0gICAgICAgICAgICAgICAgc3BlYywgdG1wZGlyLCBzZWxmLnVwZ3JhZGUsIHNlbGYuZWRpdGFibGUsIG5vdCBzZWxmLmFsd2F5c19jb3B5Ci0gICAgICAgICAgICApCi0KLSAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBtc2cgPSAiQ291bGQgbm90IGZpbmQgc3VpdGFibGUgZGlzdHJpYnV0aW9uIGZvciAlciIgJSBzcGVjCi0gICAgICAgICAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKLSAgICAgICAgICAgICAgICAgICAgbXNnKz0iICgtLWFsd2F5cy1jb3B5IHNraXBzIHN5c3RlbSBhbmQgZGV2ZWxvcG1lbnQgZWdncykiCi0gICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQotICAgICAgICAgICAgZWxpZiBkaXN0LnByZWNlZGVuY2U9PURFVkVMT1BfRElTVDoKLSAgICAgICAgICAgICAgICAjIC5lZ2ctaW5mbyBkaXN0cyBkb24ndCBuZWVkIGluc3RhbGxpbmcsIGp1c3QgcHJvY2VzcyBkZXBzCi0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzLCAiVXNpbmciKQotICAgICAgICAgICAgICAgIHJldHVybiBkaXN0Ci0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShzcGVjLCBkaXN0LmxvY2F0aW9uLCB0bXBkaXIsIGRlcHMpCi0KLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRtcGRpcik6Ci0gICAgICAgICAgICAgICAgcm10cmVlKHRtcGRpcikKLQotICAgIGRlZiBpbnN0YWxsX2l0ZW0oc2VsZiwgc3BlYywgZG93bmxvYWQsIHRtcGRpciwgZGVwcywgaW5zdGFsbF9uZWVkZWQ9RmFsc2UpOgotCi0gICAgICAgICMgSW5zdGFsbGF0aW9uIGlzIGFsc28gbmVlZGVkIGlmIGZpbGUgaW4gdG1wZGlyIG9yIGlzIG5vdCBhbiBlZ2cKLSAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciBvcy5wYXRoLmRpcm5hbWUoZG93bmxvYWQpID09IHRtcGRpcgotICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG5vdCBkb3dubG9hZC5lbmRzd2l0aCgnLmVnZycpCi0KLSAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgJXMiLCBvcy5wYXRoLmJhc2VuYW1lKGRvd25sb2FkKSkKLQotICAgICAgICBpZiBpbnN0YWxsX25lZWRlZCBvciBzZWxmLmFsd2F5c19jb3B5OgotICAgICAgICAgICAgZGlzdHMgPSBzZWxmLmluc3RhbGxfZWdncyhzcGVjLCBkb3dubG9hZCwgdG1wZGlyKQotICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHM6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2Rpc3RyaWJ1dGlvbihzcGVjLCBkaXN0LCBkZXBzKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGlzdHMgPSBbc2VsZi5jaGVja19jb25mbGljdHMoc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRvd25sb2FkKSldCi0gICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3RzWzBdLCBkZXBzLCAiVXNpbmciKQotCi0gICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKLSAgICAgICAgICAgICAgICBpZiBkaXN0IGluIHNwZWM6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXN0Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgZGVmIHByb2Nlc3NfZGlzdHJpYnV0aW9uKHNlbGYsIHJlcXVpcmVtZW50LCBkaXN0LCBkZXBzPVRydWUsICppbmZvKToKLSAgICAgICAgc2VsZi51cGRhdGVfcHRoKGRpc3QpCi0gICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGQoZGlzdCkKLSAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5hZGQoZGlzdCkKLSAgICAgICAgc2VsZi5pbnN0YWxsX2VnZ19zY3JpcHRzKGRpc3QpCi0gICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzW2Rpc3Qua2V5XSA9IGRpc3QKLSAgICAgICAgbG9nLndhcm4oc2VsZi5pbnN0YWxsYXRpb25fcmVwb3J0KHJlcXVpcmVtZW50LCBkaXN0LCAqaW5mbykpCi0gICAgICAgIGlmIG5vdCBkZXBzIGFuZCBub3Qgc2VsZi5hbHdheXNfY29weToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIG5vdCBOb25lIGFuZCBkaXN0LmtleSAhPSByZXF1aXJlbWVudC5rZXk6Ci0gICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIGRpc3QpCi0gICAgICAgICAgICByZXR1cm4gICMgWFhYIHRoaXMgaXMgbm90IHRoZSBkaXN0cmlidXRpb24gd2Ugd2VyZSBsb29raW5nIGZvcgotICAgICAgICBlbGlmIHJlcXVpcmVtZW50IGlzIE5vbmUgb3IgZGlzdCBub3QgaW4gcmVxdWlyZW1lbnQ6Ci0gICAgICAgICAgICAjIGlmIHdlIHdvdW5kIHVwIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiwgcmVzb2x2ZSB3aGF0IHdlJ3ZlIGdvdAotICAgICAgICAgICAgZGlzdHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQotICAgICAgICAgICAgcmVxdWlyZW1lbnQgPSByZXF1aXJlbWVudCBvciBkaXN0cmVxCi0gICAgICAgICAgICByZXF1aXJlbWVudCA9IFJlcXVpcmVtZW50KAotICAgICAgICAgICAgICAgIGRpc3RyZXEucHJvamVjdF9uYW1lLCBkaXN0cmVxLnNwZWNzLCByZXF1aXJlbWVudC5leHRyYXMKLSAgICAgICAgICAgICkKLSAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2RlcGVuZGVuY3lfbGlua3MudHh0Jyk6Ci0gICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3MoCi0gICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKLSAgICAgICAgICAgICkKLSAgICAgICAgbG9nLmluZm8oIlByb2Nlc3NpbmcgZGVwZW5kZW5jaWVzIGZvciAlcyIsIHJlcXVpcmVtZW50KQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkaXN0cm9zID0gV29ya2luZ1NldChbXSkucmVzb2x2ZSgKLSAgICAgICAgICAgICAgICBbcmVxdWlyZW1lbnRdLCBzZWxmLmxvY2FsX2luZGV4LCBzZWxmLmVhc3lfaW5zdGFsbAotICAgICAgICAgICAgKQotICAgICAgICBleGNlcHQgRGlzdHJpYnV0aW9uTm90Rm91bmQsIGU6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgcmVxdWlyZWQgZGlzdHJpYnV0aW9uICVzIiAlIGUuYXJncwotICAgICAgICAgICAgKQotICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0LCBlOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCi0gICAgICAgICAgICAgICAgIkluc3RhbGxlZCBkaXN0cmlidXRpb24gJXMgY29uZmxpY3RzIHdpdGggcmVxdWlyZW1lbnQgJXMiCi0gICAgICAgICAgICAgICAgJSBlLmFyZ3MKLSAgICAgICAgICAgICkKLSAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKLSAgICAgICAgICAgICMgRm9yY2UgYWxsIHRoZSByZWxldmFudCBkaXN0cm9zIHRvIGJlIGNvcGllZCBvciBhY3RpdmF0ZWQKLSAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3Ryb3M6Ci0gICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChkaXN0LmFzX3JlcXVpcmVtZW50KCkpCi0KLSAgICBkZWYgc2hvdWxkX3VuemlwKHNlbGYsIGRpc3QpOgotICAgICAgICBpZiBzZWxmLnppcF9vayBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi56aXBfb2sKLSAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25vdC16aXAtc2FmZScpOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgaWYgbm90IGRpc3QuaGFzX21ldGFkYXRhKCd6aXAtc2FmZScpOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBkZWYgbWF5YmVfbW92ZShzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKToKLSAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0KToKLSAgICAgICAgICAgIGxvZy53YXJuKAotICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBidWlsZCBkaXJlY3RvcnkgJXMgd2lsbCBub3QgYmUga2VwdCIsCi0gICAgICAgICAgICAgICBzcGVjLmtleSwgc2VsZi5idWlsZF9kaXJlY3RvcnksIHNldHVwX2Jhc2UKLSAgICAgICAgICAgICkKLSAgICAgICAgICAgIHJldHVybiBzZXR1cF9iYXNlCi0gICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6Ci0gICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGRpc3RfZmlsZW5hbWUpPT1zZXR1cF9iYXNlOgotICAgICAgICAgICAgICAgIG9zLnVubGluayhkaXN0X2ZpbGVuYW1lKSAgICMgZ2V0IGl0IG91dCBvZiB0aGUgdG1wIGRpcgotICAgICAgICAgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNldHVwX2Jhc2UpCi0gICAgICAgICAgICBpZiBsZW4oY29udGVudHMpPT0xOgotICAgICAgICAgICAgICAgIGRpc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSxjb250ZW50c1swXSkKLSAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgotICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBvbmx5IHRoaW5nIHRoZXJlIGlzIGEgZGlyZWN0b3J5LCBtb3ZlIGl0IGluc3RlYWQKLSAgICAgICAgICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKLSAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShkc3QpOyBzaHV0aWwubW92ZShzZXR1cF9iYXNlLCBkc3QpCi0gICAgICAgIHJldHVybiBkc3QKLQotICAgIGRlZiBpbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KToKLSAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9zY3JpcHRzOgotICAgICAgICAgICAgZm9yIGFyZ3MgaW4gZ2V0X3NjcmlwdF9hcmdzKGRpc3QpOgotICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KCphcmdzKQotCi0KLQotCi0KLQotICAgIGRlZiBpbnN0YWxsX3NjcmlwdChzZWxmLCBkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIGRldl9wYXRoPU5vbmUpOgotICAgICAgICAiIiJHZW5lcmF0ZSBhIGxlZ2FjeSBzY3JpcHQgd3JhcHBlciBhbmQgaW5zdGFsbCBpdCIiIgotICAgICAgICBzcGVjID0gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKLQotICAgICAgICBpZiBkZXZfcGF0aDoKLSAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gZ2V0X3NjcmlwdF9oZWFkZXIoc2NyaXB0X3RleHQpICsgKAotICAgICAgICAgICAgICAgICIjIEVBU1ktSU5TVEFMTC1ERVYtU0NSSVBUOiAlKHNwZWMpciwlKHNjcmlwdF9uYW1lKXJcbiIKLSAgICAgICAgICAgICAgICAiX19yZXF1aXJlc19fID0gJShzcGVjKXJcbiIKLSAgICAgICAgICAgICAgICAiZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCByZXF1aXJlOyByZXF1aXJlKCUoc3BlYylyKVxuIgotICAgICAgICAgICAgICAgICJkZWwgcmVxdWlyZVxuIgotICAgICAgICAgICAgICAgICJfX2ZpbGVfXyA9ICUoZGV2X3BhdGgpclxuIgotICAgICAgICAgICAgICAgICJleGVjZmlsZShfX2ZpbGVfXylcbiIKLSAgICAgICAgICAgICkgJSBsb2NhbHMoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBnZXRfc2NyaXB0X2hlYWRlcihzY3JpcHRfdGV4dCkgKyAoCi0gICAgICAgICAgICAgICAgIiMgRUFTWS1JTlNUQUxMLVNDUklQVDogJShzcGVjKXIsJShzY3JpcHRfbmFtZSlyXG4iCi0gICAgICAgICAgICAgICAgIl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyXG4iCi0gICAgICAgICAgICAgICAgImltcG9ydCBwa2dfcmVzb3VyY2VzXG4iCi0gICAgICAgICAgICAgICAgInBrZ19yZXNvdXJjZXMucnVuX3NjcmlwdCglKHNwZWMpciwgJShzY3JpcHRfbmFtZSlyKVxuIgotICAgICAgICAgICAgKSAlIGxvY2FscygpCi0KLSAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoc2NyaXB0X25hbWUsIHNjcmlwdF90ZXh0KQotCi0gICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgY29udGVudHMsIG1vZGU9InQiLCBibG9ja2Vycz0oKSk6Ci0gICAgICAgICIiIldyaXRlIGFuIGV4ZWN1dGFibGUgZmlsZSB0byB0aGUgc2NyaXB0cyBkaXJlY3RvcnkiIiIKLSAgICAgICAgc2VsZi5kZWxldGVfYmxvY2tlcnMoICAgIyBjbGVhbiB1cCBvbGQgLnB5Ly5weXcgdy9vIGEgc2NyaXB0Ci0gICAgICAgICAgICBbb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2Rpcix4KSBmb3IgeCBpbiBibG9ja2Vyc10pCi0gICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLnNjcmlwdF9kaXIpCi0gICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLnNjcmlwdF9kaXIsIHNjcmlwdF9uYW1lKQotICAgICAgICBzZWxmLmFkZF9vdXRwdXQodGFyZ2V0KQotCi0gICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKLSAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwidyIrbW9kZSkKLSAgICAgICAgICAgIGYud3JpdGUoY29udGVudHMpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXQsMDc1NSkKLSAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIG9zLmVycm9yKToKLSAgICAgICAgICAgICAgICBwYXNzCi0KLSAgICBkZWYgaW5zdGFsbF9lZ2dzKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6Ci0gICAgICAgICMgLmVnZyBkaXJzIG9yIGZpbGVzIGFyZSBhbHJlYWR5IGJ1aWx0LCBzbyBqdXN0IHJldHVybiB0aGVtCi0gICAgICAgIGlmIGRpc3RfZmlsZW5hbWUubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgotICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmluc3RhbGxfZWdnKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCi0gICAgICAgIGVsaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZXhlJyk6Ci0gICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9leGUoZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KLQotICAgICAgICAjIEFueXRoaW5nIGVsc2UsIHRyeSB0byBleHRyYWN0IGFuZCBidWlsZAotICAgICAgICBzZXR1cF9iYXNlID0gdG1wZGlyCi0gICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGRpc3RfZmlsZW5hbWUpIGFuZCBub3QgZGlzdF9maWxlbmFtZS5lbmRzd2l0aCgnLnB5Jyk6Ci0gICAgICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIsIHNlbGYudW5wYWNrX3Byb2dyZXNzKQotICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6Ci0gICAgICAgICAgICBzZXR1cF9iYXNlID0gb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCi0KLSAgICAgICAgaWYgKHNldHVwX2Jhc2Uuc3RhcnRzd2l0aCh0bXBkaXIpICAgIyBzb21ldGhpbmcgd2UgZG93bmxvYWRlZAotICAgICAgICAgICAgYW5kIHNlbGYuYnVpbGRfZGlyZWN0b3J5IGFuZCBzcGVjIGlzIG5vdCBOb25lCi0gICAgICAgICk6Ci0gICAgICAgICAgICBzZXR1cF9iYXNlID0gc2VsZi5tYXliZV9tb3ZlKHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpCi0KLSAgICAgICAgIyBGaW5kIHRoZSBzZXR1cC5weSBmaWxlCi0gICAgICAgIHNldHVwX3NjcmlwdCA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnc2V0dXAucHknKQotCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXR1cF9zY3JpcHQpOgotICAgICAgICAgICAgc2V0dXBzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJyonLCAnc2V0dXAucHknKSkKLSAgICAgICAgICAgIGlmIG5vdCBzZXR1cHM6Ci0gICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGEgc2V0dXAgc2NyaXB0IGluICVzIiAlIGRpc3RfZmlsZW5hbWUKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBpZiBsZW4oc2V0dXBzKT4xOgotICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAotICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgc2V0dXAgc2NyaXB0cyBpbiAlcyIgJSBkaXN0X2ZpbGVuYW1lCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgc2V0dXBfc2NyaXB0ID0gc2V0dXBzWzBdCi0KLSAgICAgICAgIyBOb3cgcnVuIGl0LCBhbmQgcmV0dXJuIHRoZSByZXN1bHQKLSAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKLSAgICAgICAgICAgIGxvZy53YXJuKHNlbGYucmVwb3J0X2VkaXRhYmxlKHNwZWMsIHNldHVwX3NjcmlwdCkpCi0gICAgICAgICAgICByZXR1cm4gW10KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX2FuZF9pbnN0YWxsKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSkKLQotICAgIGRlZiBlZ2dfZGlzdHJpYnV0aW9uKHNlbGYsIGVnZ19wYXRoKToKLSAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6Ci0gICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCxvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBtZXRhZGF0YSA9IEVnZ01ldGFkYXRhKHppcGltcG9ydC56aXBpbXBvcnRlcihlZ2dfcGF0aCkpCi0gICAgICAgIHJldHVybiBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCxtZXRhZGF0YT1tZXRhZGF0YSkKLQotICAgIGRlZiBpbnN0YWxsX2VnZyhzZWxmLCBlZ2dfcGF0aCwgdG1wZGlyKToKLSAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpcixvcy5wYXRoLmJhc2VuYW1lKGVnZ19wYXRoKSkKLSAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmFic3BhdGgoZGVzdGluYXRpb24pCi0gICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRlc3RpbmF0aW9uKQotCi0gICAgICAgIGRpc3QgPSBzZWxmLmVnZ19kaXN0cmlidXRpb24oZWdnX3BhdGgpCi0gICAgICAgIHNlbGYuY2hlY2tfY29uZmxpY3RzKGRpc3QpCi0gICAgICAgIGlmIG5vdCBzYW1lZmlsZShlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6Ci0gICAgICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQotICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhkZXN0aW5hdGlvbik6Ci0gICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywoZGVzdGluYXRpb24sKSwiUmVtb3ZpbmcgIitkZXN0aW5hdGlvbikKLSAgICAgICAgICAgIHVuY2FjaGVfemlwZGlyKGRlc3RpbmF0aW9uKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihlZ2dfcGF0aCk6Ci0gICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgotICAgICAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwuY29weXRyZWUsICJDb3B5aW5nIgotICAgICAgICAgICAgZWxpZiBzZWxmLnNob3VsZF91bnppcChkaXN0KToKLSAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChkZXN0aW5hdGlvbikKLSAgICAgICAgICAgICAgICBmLG0gPSBzZWxmLnVucGFja19hbmRfY29tcGlsZSwgIkV4dHJhY3RpbmciCi0gICAgICAgICAgICBlbGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKLSAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwubW92ZSwgIk1vdmluZyIKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZixtID0gc2h1dGlsLmNvcHkyLCAiQ29weWluZyIKLQotICAgICAgICAgICAgc2VsZi5leGVjdXRlKGYsIChlZ2dfcGF0aCwgZGVzdGluYXRpb24pLAotICAgICAgICAgICAgICAgIChtKyIgJXMgdG8gJXMiKSAlCi0gICAgICAgICAgICAgICAgKG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpLG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikpKQotCi0gICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKLSAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihkZXN0aW5hdGlvbikKLQotICAgIGRlZiBpbnN0YWxsX2V4ZShzZWxmLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgotICAgICAgICAjIFNlZSBpZiBpdCdzIHZhbGlkLCBnZXQgZGF0YQotICAgICAgICBjZmcgPSBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpCi0gICAgICAgIGlmIGNmZyBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCi0gICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHZhbGlkIGRpc3R1dGlscyBXaW5kb3dzIC5leGUiICUgZGlzdF9maWxlbmFtZQotICAgICAgICAgICAgKQotICAgICAgICAjIENyZWF0ZSBhIGR1bW15IGRpc3RyaWJ1dGlvbiBvYmplY3QgdW50aWwgd2UgYnVpbGQgdGhlIHJlYWwgZGlzdHJvCi0gICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oTm9uZSwKLSAgICAgICAgICAgIHByb2plY3RfbmFtZT1jZmcuZ2V0KCdtZXRhZGF0YScsJ25hbWUnKSwKLSAgICAgICAgICAgIHZlcnNpb249Y2ZnLmdldCgnbWV0YWRhdGEnLCd2ZXJzaW9uJyksIHBsYXRmb3JtPSJ3aW4zMiIKLSAgICAgICAgKQotCi0gICAgICAgICMgQ29udmVydCB0aGUgLmV4ZSB0byBhbiB1bnBhY2tlZCBlZ2cKLSAgICAgICAgZWdnX3BhdGggPSBkaXN0LmxvY2F0aW9uID0gb3MucGF0aC5qb2luKHRtcGRpciwgZGlzdC5lZ2dfbmFtZSgpKycuZWdnJykKLSAgICAgICAgZWdnX3RtcCAgPSBlZ2dfcGF0aCsnLnRtcCcKLSAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJykKLSAgICAgICAgcGtnX2luZiA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ1BLRy1JTkZPJykKLSAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShwa2dfaW5mKSAgICMgbWFrZSBzdXJlIEVHRy1JTkZPIGRpciBleGlzdHMKLSAgICAgICAgZGlzdC5fcHJvdmlkZXIgPSBQYXRoTWV0YWRhdGEoZWdnX3RtcCwgZWdnX2luZm8pICAgICMgWFhYCi0gICAgICAgIHNlbGYuZXhlX3RvX2VnZyhkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKQotCi0gICAgICAgICMgV3JpdGUgRUdHLUlORk8vUEtHLUlORk8KLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ19pbmYpOgotICAgICAgICAgICAgZiA9IG9wZW4ocGtnX2luZiwndycpCi0gICAgICAgICAgICBmLndyaXRlKCdNZXRhZGF0YS1WZXJzaW9uOiAxLjBcbicpCi0gICAgICAgICAgICBmb3Igayx2IGluIGNmZy5pdGVtcygnbWV0YWRhdGEnKToKLSAgICAgICAgICAgICAgICBpZiBrPD4ndGFyZ2V0X3ZlcnNpb24nOgotICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclczogJXNcbicgJSAoay5yZXBsYWNlKCdfJywnLScpLnRpdGxlKCksIHYpKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHNjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oZWdnX2luZm8sJ3NjcmlwdHMnKQotICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyggICAjIGRlbGV0ZSBlbnRyeS1wb2ludCBzY3JpcHRzIHRvIGF2b2lkIGR1cGluZwotICAgICAgICAgICAgW29zLnBhdGguam9pbihzY3JpcHRfZGlyLGFyZ3NbMF0pIGZvciBhcmdzIGluIGdldF9zY3JpcHRfYXJncyhkaXN0KV0KLSAgICAgICAgKQotICAgICAgICAjIEJ1aWxkIC5lZ2cgZmlsZSBmcm9tIHRtcGRpcgotICAgICAgICBiZGlzdF9lZ2cubWFrZV96aXBmaWxlKAotICAgICAgICAgICAgZWdnX3BhdGgsIGVnZ190bXAsIHZlcmJvc2U9c2VsZi52ZXJib3NlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bgotICAgICAgICApCi0gICAgICAgICMgaW5zdGFsbCB0aGUgLmVnZwotICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2VnZyhlZ2dfcGF0aCwgdG1wZGlyKQotCi0gICAgZGVmIGV4ZV90b19lZ2coc2VsZiwgZGlzdF9maWxlbmFtZSwgZWdnX3RtcCk6Ci0gICAgICAgICIiIkV4dHJhY3QgYSBiZGlzdF93aW5pbnN0IHRvIHRoZSBkaXJlY3RvcmllcyBhbiBlZ2cgd291bGQgdXNlIiIiCi0gICAgICAgICMgQ2hlY2sgZm9yIC5wdGggZmlsZSBhbmQgc2V0IHVwIHByZWZpeCB0cmFuc2xhdGlvbnMKLSAgICAgICAgcHJlZml4ZXMgPSBnZXRfZXhlX3ByZWZpeGVzKGRpc3RfZmlsZW5hbWUpCi0gICAgICAgIHRvX2NvbXBpbGUgPSBbXQotICAgICAgICBuYXRpdmVfbGlicyA9IFtdCi0gICAgICAgIHRvcF9sZXZlbCA9IHt9Ci0KLSAgICAgICAgZGVmIHByb2Nlc3Moc3JjLGRzdCk6Ci0gICAgICAgICAgICBmb3Igb2xkLG5ldyBpbiBwcmVmaXhlczoKLSAgICAgICAgICAgICAgICBpZiBzcmMuc3RhcnRzd2l0aChvbGQpOgotICAgICAgICAgICAgICAgICAgICBzcmMgPSBuZXcrc3JjW2xlbihvbGQpOl0KLSAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzcmMuc3BsaXQoJy8nKQotICAgICAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQotICAgICAgICAgICAgICAgICAgICBkbCA9IGRzdC5sb3dlcigpCi0gICAgICAgICAgICAgICAgICAgIGlmIGRsLmVuZHN3aXRoKCcucHlkJykgb3IgZGwuZW5kc3dpdGgoJy5kbGwnKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcF9sZXZlbFtvcy5wYXRoLnNwbGl0ZXh0KHBhcnRzWzBdKVswXV0gPSAxCi0gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfbGlicy5hcHBlbmQoc3JjKQotICAgICAgICAgICAgICAgICAgICBlbGlmIGRsLmVuZHN3aXRoKCcucHknKSBhbmQgb2xkIT0nU0NSSVBUUy8nOgotICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRzdAotICAgICAgICAgICAgaWYgbm90IHNyYy5lbmRzd2l0aCgnLnB0aCcpOgotICAgICAgICAgICAgICAgIGxvZy53YXJuKCJXQVJOSU5HOiBjYW4ndCBwcm9jZXNzICVzIiwgc3JjKQotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICAjIGV4dHJhY3QsIHRyYWNraW5nIC5weWQvLmRsbC0+bmF0aXZlX2xpYnMgYW5kIC5weSAtPiB0b19jb21waWxlCi0gICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIGVnZ190bXAsIHByb2Nlc3MpCi0gICAgICAgIHN0dWJzID0gW10KLSAgICAgICAgZm9yIHJlcyBpbiBuYXRpdmVfbGliczoKLSAgICAgICAgICAgIGlmIHJlcy5sb3dlcigpLmVuZHN3aXRoKCcucHlkJyk6ICAgICMgY3JlYXRlIHN0dWJzIGZvciAucHlkJ3MKLSAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlcy5zcGxpdCgnLycpCi0gICAgICAgICAgICAgICAgcmVzb3VyY2UsIHBhcnRzWy0xXSA9IHBhcnRzWy0xXSwgcGFydHNbLTFdWzotMV0KLSAgICAgICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQotICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKHB5ZmlsZSk7IHN0dWJzLmFwcGVuZChweWZpbGUpCi0gICAgICAgICAgICAgICAgYmRpc3RfZWdnLndyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSkKLQotICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKSAgICMgY29tcGlsZSAucHkncwotICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcob3MucGF0aC5qb2luKGVnZ190bXAsJ0VHRy1JTkZPJyksCi0gICAgICAgICAgICBiZGlzdF9lZ2cuYW5hbHl6ZV9lZ2coZWdnX3RtcCwgc3R1YnMpKSAgIyB3cml0ZSB6aXAtc2FmZXR5IGZsYWcKLQotICAgICAgICBmb3IgbmFtZSBpbiAndG9wX2xldmVsJywnbmF0aXZlX2xpYnMnOgotICAgICAgICAgICAgaWYgbG9jYWxzKClbbmFtZV06Ci0gICAgICAgICAgICAgICAgdHh0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycsIG5hbWUrJy50eHQnKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0eHQpOgotICAgICAgICAgICAgICAgICAgICBvcGVuKHR4dCwndycpLndyaXRlKCdcbicuam9pbihsb2NhbHMoKVtuYW1lXSkrJ1xuJykKLQotICAgIGRlZiBjaGVja19jb25mbGljdHMoc2VsZiwgZGlzdCk6Ci0gICAgICAgICIiIlZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyBjb25mbGljdGluZyAib2xkLXN0eWxlIiBwYWNrYWdlcyIiIgotCi0gICAgICAgIHJldHVybiBkaXN0ICAgICAjIFhYWCB0ZW1wb3JhcmlseSBkaXNhYmxlIHVudGlsIG5ldyBzdHJhdGVneSBpcyBzdGFibGUKLSAgICAgICAgZnJvbSBpbXAgaW1wb3J0IGZpbmRfbW9kdWxlLCBnZXRfc3VmZml4ZXMKLSAgICAgICAgZnJvbSBnbG9iIGltcG9ydCBnbG9iCi0KLSAgICAgICAgYmxvY2tlcnMgPSBbXQotICAgICAgICBuYW1lcyA9IGRpY3QuZnJvbWtleXMoZGlzdC5fZ2V0X21ldGFkYXRhKCd0b3BfbGV2ZWwudHh0JykpICMgWFhYIHByaXZhdGUgYXR0cgotCi0gICAgICAgIGV4dHMgPSB7Jy5weWMnOjEsICcucHlvJzoxfSAgICAgIyBnZXRfc3VmZml4ZXMoKSBtaWdodCBsZWF2ZSBvbmUgb3V0Ci0gICAgICAgIGZvciBleHQsbW9kZSx0eXAgaW4gZ2V0X3N1ZmZpeGVzKCk6Ci0gICAgICAgICAgICBleHRzW2V4dF0gPSAxCi0KLSAgICAgICAgZm9yIHBhdGgsZmlsZXMgaW4gZXhwYW5kX3BhdGhzKFtzZWxmLmluc3RhbGxfZGlyXStzZWxmLmFsbF9zaXRlX2RpcnMpOgotICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgotICAgICAgICAgICAgICAgIGJhc2UsZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICBpZiBiYXNlIGluIG5hbWVzOgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXh0OgotICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBleHRlbnNpb24sIGNoZWNrIGZvciBwYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgZmlsZW5hbWUsIGRlc2NyID0gZmluZF9tb2R1bGUoYmFzZSwgW3BhdGhdKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGY6IGYuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiBibG9ja2VyczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tlcnMuYXBwZW5kKGZpbGVuYW1lKQotICAgICAgICAgICAgICAgICAgICBlbGlmIGV4dCBpbiBleHRzIGFuZCBiYXNlIT0nc2l0ZSc6ICAjIFhYWCB1Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrZXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocGF0aCxmaWxlbmFtZSkpCi0gICAgICAgIGlmIGJsb2NrZXJzOgotICAgICAgICAgICAgc2VsZi5mb3VuZF9jb25mbGljdHMoZGlzdCwgYmxvY2tlcnMpCi0KLSAgICAgICAgcmV0dXJuIGRpc3QKLQotICAgIGRlZiBmb3VuZF9jb25mbGljdHMoc2VsZiwgZGlzdCwgYmxvY2tlcnMpOgotICAgICAgICBpZiBzZWxmLmRlbGV0ZV9jb25mbGljdGluZzoKLSAgICAgICAgICAgIGxvZy53YXJuKCJBdHRlbXB0aW5nIHRvIGRlbGV0ZSBjb25mbGljdGluZyBwYWNrYWdlczoiKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKGJsb2NrZXJzKQotCi0gICAgICAgIG1zZyA9ICIiIlwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNPTkZMSUNUIFdBUk5JTkc6Ci0KLVRoZSBmb2xsb3dpbmcgbW9kdWxlcyBvciBwYWNrYWdlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIG1vZHVsZXMgb3IKLXBhY2thZ2VzIGJlaW5nIGluc3RhbGxlZCwgYW5kIHdpbGwgYmUgKmJlZm9yZSogdGhlIGluc3RhbGxlZCBwYWNrYWdlcyBpbgotUHl0aG9uJ3Mgc2VhcmNoIHBhdGguICBZb3UgTVVTVCByZW1vdmUgYWxsIG9mIHRoZSByZWxldmFudCBmaWxlcyBhbmQKLWRpcmVjdG9yaWVzIGJlZm9yZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlCi1pbnN0YWxsaW5nOgotCi0gICAlcwotCi0iIiIgJSAnXG4gICAnLmpvaW4oYmxvY2tlcnMpCi0KLSAgICAgICAgaWYgc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6Ci0gICAgICAgICAgICBtc2cgKz0gIiIiXAotKE5vdGU6IHlvdSBjYW4gcnVuIEVhc3lJbnN0YWxsIG9uICclcycgd2l0aCB0aGUKLS0tZGVsZXRlLWNvbmZsaWN0aW5nIG9wdGlvbiB0byBhdHRlbXB0IGRlbGV0aW9uIG9mIHRoZSBhYm92ZSBmaWxlcwotYW5kL29yIGRpcmVjdG9yaWVzLikKLSIiIiAlIGRpc3QucHJvamVjdF9uYW1lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBtc2cgKz0gIiIiXAotTm90ZTogeW91IGNhbiBhdHRlbXB0IHRoaXMgaW5zdGFsbGF0aW9uIGFnYWluIHdpdGggRWFzeUluc3RhbGwsIGFuZCB1c2UKLWVpdGhlciB0aGUgLS1kZWxldGUtY29uZmxpY3RpbmcgKC1EKSBvcHRpb24gb3IgdGhlCi0tLWlnbm9yZS1jb25mbGljdHMtYXQtbXktcmlzayBvcHRpb24sIHRvIGVpdGhlciBkZWxldGUgdGhlIGFib3ZlIGZpbGVzCi1hbmQgZGlyZWN0b3JpZXMsIG9yIHRvIGlnbm9yZSB0aGUgY29uZmxpY3RzLCByZXNwZWN0aXZlbHkuICBOb3RlIHRoYXQgaWYKLXlvdSBpZ25vcmUgdGhlIGNvbmZsaWN0cywgdGhlIGluc3RhbGxlZCBwYWNrYWdlKHMpIG1heSBub3Qgd29yay4KLSIiIgotICAgICAgICBtc2cgKz0gIiIiXAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIiIiCi0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQotICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX2NvbmZsaWN0c19hdF9teV9yaXNrOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkluc3RhbGxhdGlvbiBhYm9ydGVkIGR1ZSB0byBjb25mbGljdHMiKQotCi0gICAgZGVmIGluc3RhbGxhdGlvbl9yZXBvcnQoc2VsZiwgcmVxLCBkaXN0LCB3aGF0PSJJbnN0YWxsZWQiKToKLSAgICAgICAgIiIiSGVscGZ1bCBpbnN0YWxsYXRpb24gbWVzc2FnZSBmb3IgZGlzcGxheSB0byBwYWNrYWdlIHVzZXJzIiIiCi0gICAgICAgIG1zZyA9ICJcbiUod2hhdClzICUoZWdnbG9jKXMlKGV4dHJhcylzIgotICAgICAgICBpZiBzZWxmLm11bHRpX3ZlcnNpb24gYW5kIG5vdCBzZWxmLm5vX3JlcG9ydDoKLSAgICAgICAgICAgIG1zZyArPSAiIiIKLQotQmVjYXVzZSB0aGlzIGRpc3RyaWJ1dGlvbiB3YXMgaW5zdGFsbGVkIC0tbXVsdGktdmVyc2lvbiBvciAtLWluc3RhbGwtZGlyLAotYmVmb3JlIHlvdSBjYW4gaW1wb3J0IG1vZHVsZXMgZnJvbSB0aGlzIHBhY2thZ2UgaW4gYW4gYXBwbGljYXRpb24sIHlvdQotd2lsbCBuZWVkIHRvICdpbXBvcnQgcGtnX3Jlc291cmNlcycgYW5kIHRoZW4gdXNlIGEgJ3JlcXVpcmUoKScgY2FsbAotc2ltaWxhciB0byBvbmUgb2YgdGhlc2UgZXhhbXBsZXMsIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCB2ZXJzaW9uOgotCi0gICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcyIpICAjIGxhdGVzdCBpbnN0YWxsZWQgdmVyc2lvbgotICAgIHBrZ19yZXNvdXJjZXMucmVxdWlyZSgiJShuYW1lKXM9PSUodmVyc2lvbilzIikgICMgdGhpcyBleGFjdCB2ZXJzaW9uCi0gICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz49JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIHZlcnNpb24gb3IgaGlnaGVyCi0iIiIKLSAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kaXIgbm90IGluIG1hcChub3JtYWxpemVfcGF0aCxzeXMucGF0aCk6Ci0gICAgICAgICAgICAgICAgbXNnICs9ICIiIgotCi1Ob3RlIGFsc28gdGhhdCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIG9uIHN5cy5wYXRoIGF0IHJ1bnRpbWUgZm9yCi10aGlzIHRvIHdvcmsuICAoZS5nLiBieSBiZWluZyB0aGUgYXBwbGljYXRpb24ncyBzY3JpcHQgZGlyZWN0b3J5LCBieSBiZWluZyBvbgotUFlUSE9OUEFUSCwgb3IgYnkgYmVpbmcgYWRkZWQgdG8gc3lzLnBhdGggYnkgeW91ciBjb2RlLikKLSIiIgotICAgICAgICBlZ2dsb2MgPSBkaXN0LmxvY2F0aW9uCi0gICAgICAgIG5hbWUgPSBkaXN0LnByb2plY3RfbmFtZQotICAgICAgICB2ZXJzaW9uID0gZGlzdC52ZXJzaW9uCi0gICAgICAgIGV4dHJhcyA9ICcnICMgVE9ETzogc2VsZi5yZXBvcnRfZXh0cmFzKHJlcSwgZGlzdCkKLSAgICAgICAgcmV0dXJuIG1zZyAlIGxvY2FscygpCi0KLSAgICBkZWYgcmVwb3J0X2VkaXRhYmxlKHNlbGYsIHNwZWMsIHNldHVwX3NjcmlwdCk6Ci0gICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQotICAgICAgICBweXRob24gPSBzeXMuZXhlY3V0YWJsZQotICAgICAgICByZXR1cm4gIiIiXG5FeHRyYWN0ZWQgZWRpdGFibGUgdmVyc2lvbiBvZiAlKHNwZWMpcyB0byAlKGRpcm5hbWUpcwotCi1JZiBpdCB1c2VzIHNldHVwdG9vbHMgaW4gaXRzIHNldHVwIHNjcmlwdCwgeW91IGNhbiBhY3RpdmF0ZSBpdCBpbgotImRldmVsb3BtZW50IiBtb2RlIGJ5IGdvaW5nIHRvIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nOjoKLQotICAgICUocHl0aG9uKXMgc2V0dXAucHkgZGV2ZWxvcAotCi1TZWUgdGhlIHNldHVwdG9vbHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJkZXZlbG9wIiBjb21tYW5kIGZvciBtb3JlIGluZm8uCi0iIiIgJSBsb2NhbHMoKQotCi0gICAgZGVmIHJ1bl9zZXR1cChzZWxmLCBzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpOgotICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9lZ2cnLCBiZGlzdF9lZ2cpCi0gICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmVnZ19pbmZvJywgZWdnX2luZm8pCi0KLSAgICAgICAgYXJncyA9IGxpc3QoYXJncykKLSAgICAgICAgaWYgc2VsZi52ZXJib3NlPjI6Ci0gICAgICAgICAgICB2ID0gJ3YnICogKHNlbGYudmVyYm9zZSAtIDEpCi0gICAgICAgICAgICBhcmdzLmluc2VydCgwLCctJyt2KQotICAgICAgICBlbGlmIHNlbGYudmVyYm9zZTwyOgotICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwnLXEnKQotICAgICAgICBpZiBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICBhcmdzLmluc2VydCgwLCctbicpCi0gICAgICAgIGxvZy5pbmZvKAotICAgICAgICAgICAgIlJ1bm5pbmcgJXMgJXMiLCBzZXR1cF9zY3JpcHRbbGVuKHNldHVwX2Jhc2UpKzE6XSwgJyAnLmpvaW4oYXJncykKLSAgICAgICAgKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKQotICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgdjoKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJTZXR1cCBzY3JpcHQgZXhpdGVkIHdpdGggJXMiICUgKHYuYXJnc1swXSwpKQotCi0gICAgZGVmIGJ1aWxkX2FuZF9pbnN0YWxsKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSk6Ci0gICAgICAgIGFyZ3MgPSBbJ2JkaXN0X2VnZycsICctLWRpc3QtZGlyJ10KLSAgICAgICAgZGlzdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKAotICAgICAgICAgICAgcHJlZml4PSdlZ2ctZGlzdC10bXAtJywgZGlyPW9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCi0gICAgICAgICkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgYXJncy5hcHBlbmQoZGlzdF9kaXIpCi0gICAgICAgICAgICBzZWxmLnJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UsIGFyZ3MpCi0gICAgICAgICAgICBhbGxfZWdncyA9IEVudmlyb25tZW50KFtkaXN0X2Rpcl0pCi0gICAgICAgICAgICBlZ2dzID0gW10KLSAgICAgICAgICAgIGZvciBrZXkgaW4gYWxsX2VnZ3M6Ci0gICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gYWxsX2VnZ3Nba2V5XToKLSAgICAgICAgICAgICAgICAgICAgZWdncy5hcHBlbmQoc2VsZi5pbnN0YWxsX2VnZyhkaXN0LmxvY2F0aW9uLCBzZXR1cF9iYXNlKSkKLSAgICAgICAgICAgIGlmIG5vdCBlZ2dzIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgotICAgICAgICAgICAgICAgIGxvZy53YXJuKCJObyBlZ2dzIGZvdW5kIGluICVzIChzZXR1cCBzY3JpcHQgcHJvYmxlbT8pIiwKLSAgICAgICAgICAgICAgICAgICAgZGlzdF9kaXIpCi0gICAgICAgICAgICByZXR1cm4gZWdncwotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgcm10cmVlKGRpc3RfZGlyKQotICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKSAjIHJlc3RvcmUgb3VyIGxvZyB2ZXJib3NpdHkKLQotICAgIGRlZiB1cGRhdGVfcHRoKHNlbGYsZGlzdCk6Ci0gICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGZvciBkIGluIHNlbGYucHRoX2ZpbGVbZGlzdC5rZXldOiAgICAjIGRyb3Agb2xkIGVudHJpZXMKLSAgICAgICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBvciBkLmxvY2F0aW9uICE9IGRpc3QubG9jYXRpb246Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nICVzIGZyb20gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZCkKLSAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLnJlbW92ZShkKQotICAgICAgICAgICAgICAgIGlmIGQubG9jYXRpb24gaW4gc2VsZi5zaGFkb3dfcGF0aDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFkb3dfcGF0aC5yZW1vdmUoZC5sb2NhdGlvbikKLQotICAgICAgICBpZiBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgotICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnB0aF9maWxlLnBhdGhzOgotICAgICAgICAgICAgICAgIGxvZy5pbmZvKAotICAgICAgICAgICAgICAgICAgICAiJXMgaXMgYWxyZWFkeSB0aGUgYWN0aXZlIHZlcnNpb24gaW4gZWFzeS1pbnN0YWxsLnB0aCIsCi0gICAgICAgICAgICAgICAgICAgIGRpc3QKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBZGRpbmcgJXMgdG8gZWFzeS1pbnN0YWxsLnB0aCBmaWxlIiwgZGlzdCkKLSAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLmFkZChkaXN0KSAjIGFkZCBuZXcgZW50cnkKLSAgICAgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmFwcGVuZChkaXN0LmxvY2F0aW9uKQotCi0gICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0KLSAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuc2F2ZSgpCi0KLSAgICAgICAgICAgIGlmIGRpc3Qua2V5PT0nc2V0dXB0b29scyc6Ci0gICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCBzZXR1cHRvb2xzIGl0c2VsZiBuZXZlciBiZWNvbWVzIHVuYXZhaWxhYmxlIQotICAgICAgICAgICAgICAgICMgWFhYIHNob3VsZCB0aGlzIGNoZWNrIGZvciBsYXRlc3QgdmVyc2lvbj8KLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCdzZXR1cHRvb2xzLnB0aCcpCi0gICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOiBvcy51bmxpbmsoZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3dCcpCi0gICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLnB0aF9maWxlLm1ha2VfcmVsYXRpdmUoZGlzdC5sb2NhdGlvbikrJ1xuJykKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLQotICAgIGRlZiB1bnBhY2tfcHJvZ3Jlc3Moc2VsZiwgc3JjLCBkc3QpOgotICAgICAgICAjIFByb2dyZXNzIGZpbHRlciBmb3IgdW5wYWNraW5nCi0gICAgICAgIGxvZy5kZWJ1ZygiVW5wYWNraW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCi0gICAgICAgIHJldHVybiBkc3QgICAgICMgb25seSB1bnBhY2stYW5kLWNvbXBpbGUgc2tpcHMgZmlsZXMgZm9yIGRyeSBydW4KLQotICAgIGRlZiB1bnBhY2tfYW5kX2NvbXBpbGUoc2VsZiwgZWdnX3BhdGgsIGRlc3RpbmF0aW9uKToKLSAgICAgICAgdG9fY29tcGlsZSA9IFtdCi0KLSAgICAgICAgZGVmIHBmKHNyYyxkc3QpOgotICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKCcucHknKSBhbmQgbm90IHNyYy5zdGFydHN3aXRoKCdFR0ctSU5GTy8nKToKLSAgICAgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChkc3QpCi0gICAgICAgICAgICBzZWxmLnVucGFja19wcm9ncmVzcyhzcmMsZHN0KQotICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmRyeV9ydW4gYW5kIGRzdCBvciBOb25lCi0KLSAgICAgICAgdW5wYWNrX2FyY2hpdmUoZWdnX3BhdGgsIGRlc3RpbmF0aW9uLCBwZikKLSAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKLQotCi0gICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCB0b19jb21waWxlKToKLSAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgdGhlIGJ5dGUgY29tcGlsZSBtZXNzYWdlcyBxdWlldGVyCi0gICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UgLSAxKQotCi0gICAgICAgICAgICBieXRlX2NvbXBpbGUodG9fY29tcGlsZSwgb3B0aW1pemU9MCwgZm9yY2U9MSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCi0gICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplOgotICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZSgKLSAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZSwgb3B0aW1pemU9c2VsZi5vcHRpbWl6ZSwgZm9yY2U9MSwKLSAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KLSAgICAgICAgICAgICAgICApCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICAgICAjIHJlc3RvcmUgb3JpZ2luYWwgdmVyYm9zaXR5Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotICAgIGRlZiBub19kZWZhdWx0X3ZlcnNpb25fbXNnKHNlbGYpOgotICAgICAgICByZXR1cm4gIiIiYmFkIGluc3RhbGwgZGlyZWN0b3J5IG9yIFBZVEhPTlBBVEgKLQotWW91IGFyZSBhdHRlbXB0aW5nIHRvIGluc3RhbGwgYSBwYWNrYWdlIHRvIGEgZGlyZWN0b3J5IHRoYXQgaXMgbm90Ci1vbiBQWVRIT05QQVRIIGFuZCB3aGljaCBQeXRob24gZG9lcyBub3QgcmVhZCAiLnB0aCIgZmlsZXMgZnJvbS4gIFRoZQotaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCi10aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgotCi0gICAgJXMKLQotYW5kIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjdXJyZW50bHkgY29udGFpbnM6Ci0KLSAgICAlcgotCi1IZXJlIGFyZSBzb21lIG9mIHlvdXIgb3B0aW9ucyBmb3IgY29ycmVjdGluZyB0aGUgcHJvYmxlbToKLQotKiBZb3UgY2FuIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBpLmUuLCBvbmUgdGhhdCBpcwotICBvbiBQWVRIT05QQVRIIG9yIHN1cHBvcnRzIC5wdGggZmlsZXMKLQotKiBZb3UgY2FuIGFkZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB0byB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAotICB2YXJpYWJsZS4gIChJdCBtdXN0IHRoZW4gYWxzbyBiZSBvbiBQWVRIT05QQVRIIHdoZW5ldmVyIHlvdSBydW4KLSAgUHl0aG9uIGFuZCB3YW50IHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlIGluc3RhbGxpbmcuKQotCi0qIFlvdSBjYW4gc2V0IHVwIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHN1cHBvcnQgIi5wdGgiIGZpbGVzIGJ5Ci0gIHVzaW5nIG9uZSBvZiB0aGUgYXBwcm9hY2hlcyBkZXNjcmliZWQgaGVyZToKLQotICBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9FYXN5SW5zdGFsbC5odG1sI2N1c3RvbS1pbnN0YWxsYXRpb24tbG9jYXRpb25zCi0KLVBsZWFzZSBtYWtlIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGZvciB5b3VyIHN5c3RlbSBhbmQgdHJ5IGFnYWluLiIiIiAlICgKLSAgICAgICAgc2VsZi5pbnN0YWxsX2Rpciwgb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCcnKQotICAgICkKLQotCi0KLQotCi0KLQotCi0KLQotICAgIGRlZiBpbnN0YWxsX3NpdGVfcHkoc2VsZik6Ci0gICAgICAgICIiIk1ha2Ugc3VyZSB0aGVyZSdzIGEgc2l0ZS5weSBpbiB0aGUgdGFyZ2V0IGRpciwgaWYgbmVlZGVkIiIiCi0KLSAgICAgICAgaWYgc2VsZi5zaXRlcHlfaW5zdGFsbGVkOgotICAgICAgICAgICAgcmV0dXJuICAjIGFscmVhZHkgZGlkIGl0LCBvciBkb24ndCBuZWVkIHRvCi0KLSAgICAgICAgc2l0ZXB5ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICJzaXRlLnB5IikKLSAgICAgICAgc291cmNlID0gcmVzb3VyY2Vfc3RyaW5nKCJzZXR1cHRvb2xzIiwgInNpdGUtcGF0Y2gucHkiKQotICAgICAgICBjdXJyZW50ID0gIiIKLQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaXRlcHkpOgotICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGVja2luZyBleGlzdGluZyBzaXRlLnB5IGluICVzIiwgc2VsZi5pbnN0YWxsX2RpcikKLSAgICAgICAgICAgIGN1cnJlbnQgPSBvcGVuKHNpdGVweSwncmInKS5yZWFkKCkKLSAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50LnN0YXJ0c3dpdGgoJ2RlZiBfX2Jvb3QoKTonKToKLSAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHNldHVwdG9vbHMtZ2VuZXJhdGVkIHNpdGUucHk7IHBsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgIiByZW1vdmUgaXQuIiAlIHNpdGVweQotICAgICAgICAgICAgICAgICkKLQotICAgICAgICBpZiBjdXJyZW50ICE9IHNvdXJjZToKLSAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyAlcyIsIHNpdGVweSkKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeShzaXRlcHkpCi0gICAgICAgICAgICAgICAgZiA9IG9wZW4oc2l0ZXB5LCd3YicpCi0gICAgICAgICAgICAgICAgZi53cml0ZShzb3VyY2UpCi0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShbc2l0ZXB5XSkKLQotICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBUcnVlCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgSU5TVEFMTF9TQ0hFTUVTID0gZGljdCgKLSAgICAgICAgcG9zaXggPSBkaWN0KAotICAgICAgICAgICAgaW5zdGFsbF9kaXIgPSAnJGJhc2UvbGliL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0L3NpdGUtcGFja2FnZXMnLAotICAgICAgICAgICAgc2NyaXB0X2RpciAgPSAnJGJhc2UvYmluJywKLSAgICAgICAgKSwKLSAgICApCi0KLSAgICBERUZBVUxUX1NDSEVNRSA9IGRpY3QoCi0gICAgICAgIGluc3RhbGxfZGlyID0gJyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKLSAgICAgICAgc2NyaXB0X2RpciAgPSAnJGJhc2UvU2NyaXB0cycsCi0gICAgKQotCi0gICAgZGVmIF9leHBhbmQoc2VsZiwgKmF0dHJzKToKLSAgICAgICAgY29uZmlnX3ZhcnMgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLmNvbmZpZ192YXJzCi0KLSAgICAgICAgaWYgc2VsZi5wcmVmaXg6Ci0gICAgICAgICAgICAjIFNldCBkZWZhdWx0IGluc3RhbGxfZGlyL3NjcmlwdHMgZnJvbSAtLXByZWZpeAotICAgICAgICAgICAgY29uZmlnX3ZhcnMgPSBjb25maWdfdmFycy5jb3B5KCkKLSAgICAgICAgICAgIGNvbmZpZ192YXJzWydiYXNlJ10gPSBzZWxmLnByZWZpeAotICAgICAgICAgICAgc2NoZW1lID0gc2VsZi5JTlNUQUxMX1NDSEVNRVMuZ2V0KG9zLm5hbWUsc2VsZi5ERUZBVUxUX1NDSEVNRSkKLSAgICAgICAgICAgIGZvciBhdHRyLHZhbCBpbiBzY2hlbWUuaXRlbXMoKToKLSAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYsYXR0cixOb25lKSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsYXR0cix2YWwpCi0KLSAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3Vic3RfdmFycwotICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKLSAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKLSAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgY29uZmlnX3ZhcnMpCi0gICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgotICAgICAgICAgICAgICAgICAgICB2YWwgPSBvcy5wYXRoLmV4cGFuZHVzZXIodmFsKQotICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQotCi0KLQotCi0KLQotCi0KLQotZGVmIGdldF9zaXRlX2RpcnMoKToKLSAgICAjIHJldHVybiBhIGxpc3Qgb2YgJ3NpdGUnIGRpcnMKLSAgICBzaXRlZGlycyA9IGZpbHRlcihOb25lLG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywnJykuc3BsaXQob3MucGF0aHNlcCkpCi0gICAgcHJlZml4ZXMgPSBbc3lzLnByZWZpeF0KLSAgICBpZiBzeXMuZXhlY19wcmVmaXggIT0gc3lzLnByZWZpeDoKLSAgICAgICAgcHJlZml4ZXMuYXBwZW5kKHN5cy5leGVjX3ByZWZpeCkKLSAgICBmb3IgcHJlZml4IGluIHByZWZpeGVzOgotICAgICAgICBpZiBwcmVmaXg6Ci0gICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdvczJlbXgnLCAncmlzY29zJyk6Ci0gICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiLCAic2l0ZS1wYWNrYWdlcyIpKQotICAgICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgotICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZChbb3MucGF0aC5qb2luKHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l0ZS1wYWNrYWdlcyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1weXRob24iKV0pCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNpdGVkaXJzLmV4dGVuZCgKLSAgICAgICAgICAgICAgICAgICAgW3ByZWZpeCwgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXBhY2thZ2VzIildCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgotICAgICAgICAgICAgICAgICMgZm9yIGZyYW1ld29yayBidWlsZHMgKm9ubHkqIHdlIGFkZCB0aGUgc3RhbmRhcmQgQXBwbGUKLSAgICAgICAgICAgICAgICAjIGxvY2F0aW9ucy4gQ3VycmVudGx5IG9ubHkgcGVyLXVzZXIsIGJ1dCAvTGlicmFyeSBhbmQKLSAgICAgICAgICAgICAgICAjIC9OZXR3b3JrL0xpYnJhcnkgY291bGQgYmUgYWRkZWQgdG9vCi0gICAgICAgICAgICAgICAgaWYgJ1B5dGhvbi5mcmFtZXdvcmsnIGluIHByZWZpeDoKLSAgICAgICAgICAgICAgICAgICAgaG9tZSA9IG9zLmVudmlyb24uZ2V0KCdIT01FJykKLSAgICAgICAgICAgICAgICAgICAgaWYgaG9tZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oaG9tZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpYnJhcnknLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpKQotICAgIGZvciBwbGF0X3NwZWNpZmljIGluICgwLDEpOgotICAgICAgICBzaXRlX2xpYiA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWMpCi0gICAgICAgIGlmIHNpdGVfbGliIG5vdCBpbiBzaXRlZGlyczogc2l0ZWRpcnMuYXBwZW5kKHNpdGVfbGliKQotCi0gICAgc2l0ZWRpcnMgPSBtYXAobm9ybWFsaXplX3BhdGgsIHNpdGVkaXJzKQotICAgIHJldHVybiBzaXRlZGlycwotCi0KLWRlZiBleHBhbmRfcGF0aHMoaW5wdXRzKToKLSAgICAiIiJZaWVsZCBzeXMucGF0aCBkaXJlY3RvcmllcyB0aGF0IG1pZ2h0IGNvbnRhaW4gIm9sZC1zdHlsZSIgcGFja2FnZXMiIiIKLQotICAgIHNlZW4gPSB7fQotCi0gICAgZm9yIGRpcm5hbWUgaW4gaW5wdXRzOgotICAgICAgICBkaXJuYW1lID0gbm9ybWFsaXplX3BhdGgoZGlybmFtZSkKLSAgICAgICAgaWYgZGlybmFtZSBpbiBzZWVuOgotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBzZWVuW2Rpcm5hbWVdID0gMQotICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCi0gICAgICAgIHlpZWxkIGRpcm5hbWUsIGZpbGVzCi0KLSAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6Ci0gICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgotICAgICAgICAgICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IHRoZSAucHRoIGZpbGVzCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIG5hbWUgaW4gKCdlYXN5LWluc3RhbGwucHRoJywnc2V0dXB0b29scy5wdGgnKToKLSAgICAgICAgICAgICAgICAjIElnbm9yZSAucHRoIGZpbGVzIHRoYXQgd2UgY29udHJvbAotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgICAgICMgUmVhZCB0aGUgLnB0aCBmaWxlCi0gICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSxuYW1lKSkKLSAgICAgICAgICAgIGxpbmVzID0gbGlzdCh5aWVsZF9saW5lcyhmKSkKLSAgICAgICAgICAgIGYuY2xvc2UoKQotCi0gICAgICAgICAgICAjIFlpZWxkIGV4aXN0aW5nIG5vbi1kdXBlLCBub24taW1wb3J0IGRpcmVjdG9yeSBsaW5lcyBmcm9tIGl0Ci0gICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKLSAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCJpbXBvcnQiKToKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5vcm1hbGl6ZV9wYXRoKGxpbmUucnN0cmlwKCkpCi0gICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgbm90IGluIHNlZW46Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2xpbmVdID0gMQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIobGluZSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUsIG9zLmxpc3RkaXIobGluZSkKLQotCi1kZWYgZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKToKLSAgICAiIiJFeHRyYWN0IGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgYmRpc3Rfd2luaW5zdCAuZXhlCi0KLSAgICBSZXR1cm5zIGEgQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlciwgb3IgTm9uZQotICAgICIiIgotICAgIGYgPSBvcGVuKGRpc3RfZmlsZW5hbWUsJ3JiJykKLSAgICB0cnk6Ci0gICAgICAgIGVuZHJlYyA9IHppcGZpbGUuX0VuZFJlY0RhdGEoZikKLSAgICAgICAgaWYgZW5kcmVjIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIHByZXBlbmRlZCA9IChlbmRyZWNbOV0gLSBlbmRyZWNbNV0pIC0gZW5kcmVjWzZdCi0gICAgICAgIGlmIHByZXBlbmRlZCA8IDEyOiAgIyBubyB3aW5pbnN0IGRhdGEgaGVyZQotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgZi5zZWVrKHByZXBlbmRlZC0xMikKLQotICAgICAgICBpbXBvcnQgc3RydWN0LCBTdHJpbmdJTywgQ29uZmlnUGFyc2VyCi0gICAgICAgIHRhZywgY2ZnbGVuLCBibWxlbiA9IHN0cnVjdC51bnBhY2soIjxpaWkiLGYucmVhZCgxMikpCi0gICAgICAgIGlmIHRhZyBub3QgaW4gKDB4MTIzNDU2N0EsIDB4MTIzNDU2N0IpOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUgICAgICMgbm90IGEgdmFsaWQgdGFnCi0KLSAgICAgICAgZi5zZWVrKHByZXBlbmRlZC0oMTIrY2ZnbGVuK2JtbGVuKSkKLSAgICAgICAgY2ZnID0gQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlcih7J3ZlcnNpb24nOicnLCd0YXJnZXRfdmVyc2lvbic6Jyd9KQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjZmcucmVhZGZwKFN0cmluZ0lPLlN0cmluZ0lPKGYucmVhZChjZmdsZW4pLnNwbGl0KGNocigwKSwxKVswXSkpCi0gICAgICAgIGV4Y2VwdCBDb25maWdQYXJzZXIuRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBpZiBub3QgY2ZnLmhhc19zZWN0aW9uKCdtZXRhZGF0YScpIG9yIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ1NldHVwJyk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICByZXR1cm4gY2ZnCi0KLSAgICBmaW5hbGx5OgotICAgICAgICBmLmNsb3NlKCkKLQotCi0KLQotCi0KLQotCi1kZWYgZ2V0X2V4ZV9wcmVmaXhlcyhleGVfZmlsZW5hbWUpOgotICAgICIiIkdldCBleGUtPmVnZyBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgYSBnaXZlbiAuZXhlIGZpbGUiIiIKLQotICAgIHByZWZpeGVzID0gWwotICAgICAgICAoJ1BVUkVMSUIvJywgJycpLAotICAgICAgICAoJ1BMQVRMSUIvJywgJycpLAotICAgICAgICAoJ1NDUklQVFMvJywgJ0VHRy1JTkZPL3NjcmlwdHMvJykKLSAgICBdCi0gICAgeiA9IHppcGZpbGUuWmlwRmlsZShleGVfZmlsZW5hbWUpCi0gICAgdHJ5OgotICAgICAgICBmb3IgaW5mbyBpbiB6LmluZm9saXN0KCk6Ci0gICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQotICAgICAgICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KCcvJykKLSAgICAgICAgICAgIGlmIGxlbihwYXJ0cyk9PTMgYW5kIHBhcnRzWzJdPT0nUEtHLUlORk8nOgotICAgICAgICAgICAgICAgIGlmIHBhcnRzWzFdLmVuZHN3aXRoKCcuZWdnLWluZm8nKToKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuaW5zZXJ0KDAsKCcvJy5qb2luKHBhcnRzWzoyXSksICdFR0ctSU5GTy8nKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGlmIGxlbihwYXJ0cyk8PjIgb3Igbm90IG5hbWUuZW5kc3dpdGgoJy5wdGgnKToKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLW5zcGtnLnB0aCcpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBpZiBwYXJ0c1swXSBpbiAoJ1BVUkVMSUInLCdQTEFUTElCJyk6Ci0gICAgICAgICAgICAgICAgZm9yIHB0aCBpbiB5aWVsZF9saW5lcyh6LnJlYWQobmFtZSkpOgotICAgICAgICAgICAgICAgICAgICBwdGggPSBwdGguc3RyaXAoKS5yZXBsYWNlKCdcXCcsJy8nKQotICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHRoLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuYXBwZW5kKCgoJyVzLyVzLycgJSAocGFydHNbMF0scHRoKSksICcnKSkKLSAgICBmaW5hbGx5OgotICAgICAgICB6LmNsb3NlKCkKLQotICAgIHByZWZpeGVzLnNvcnQoKTsgcHJlZml4ZXMucmV2ZXJzZSgpCi0gICAgcmV0dXJuIHByZWZpeGVzCi0KLQotZGVmIHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKLSAgICAgICAgICAgICJOb3QgYSBVUkwsIGV4aXN0aW5nIGZpbGUsIG9yIHJlcXVpcmVtZW50IHNwZWM6ICVyIiAlIChzcGVjLCkKLSAgICAgICAgKQotCi1jbGFzcyBQdGhEaXN0cmlidXRpb25zKEVudmlyb25tZW50KToKLSAgICAiIiJBIC5wdGggZmlsZSB3aXRoIERpc3RyaWJ1dGlvbiBwYXRocyBpbiBpdCIiIgotCi0gICAgZGlydHkgPSBGYWxzZQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKLSAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCi0gICAgICAgIHNlbGYuYmFzZWRpciA9IG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmZpbGVuYW1lKSkKLSAgICAgICAgc2VsZi5fbG9hZCgpOyBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCBbXSwgTm9uZSwgTm9uZSkKLSAgICAgICAgZm9yIHBhdGggaW4geWllbGRfbGluZXMoc2VsZi5wYXRocyk6Ci0gICAgICAgICAgICBtYXAoc2VsZi5hZGQsIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoLCBUcnVlKSkKLQotICAgIGRlZiBfbG9hZChzZWxmKToKLSAgICAgICAgc2VsZi5wYXRocyA9IFtdCi0gICAgICAgIHNhd19pbXBvcnQgPSBGYWxzZQotICAgICAgICBzZWVuID0ge30KLSAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6Ci0gICAgICAgICAgICBmb3IgbGluZSBpbiBvcGVuKHNlbGYuZmlsZW5hbWUsJ3J0Jyk6Ci0gICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdpbXBvcnQnKToKLSAgICAgICAgICAgICAgICAgICAgc2F3X2ltcG9ydCA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBwYXRoID0gbGluZS5yc3RyaXAoKQotICAgICAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKHBhdGgpCi0gICAgICAgICAgICAgICAgaWYgbm90IHBhdGguc3RyaXAoKSBvciBwYXRoLnN0cmlwKCkuc3RhcnRzd2l0aCgnIycpOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgICMgc2tpcCBub24tZXhpc3RlbnQgcGF0aHMsIGluIGNhc2Ugc29tZWJvZHkgZGVsZXRlZCBhIHBhY2thZ2UKLSAgICAgICAgICAgICAgICAjIG1hbnVhbGx5LCBhbmQgZHVwbGljYXRlIHBhdGhzIGFzIHdlbGwKLSAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5wYXRoc1stMV0gPSBub3JtYWxpemVfcGF0aCgKLSAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuYmFzZWRpcixwYXRoKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgb3IgcGF0aCBpbiBzZWVuOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLnBvcCgpICAgICMgc2tpcCBpdAotICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZSAgICMgd2UgY2xlYW5lZCB1cCwgc28gd2UncmUgZGlydHkgbm93IDopCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgc2VlbltwYXRoXSA9IDEKLQotICAgICAgICBpZiBzZWxmLnBhdGhzIGFuZCBub3Qgc2F3X2ltcG9ydDoKLSAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAgIyBlbnN1cmUgYW55dGhpbmcgd2UgdG91Y2ggaGFzIGltcG9ydCB3cmFwcGVycwotICAgICAgICB3aGlsZSBzZWxmLnBhdGhzIGFuZCBub3Qgc2VsZi5wYXRoc1stMV0uc3RyaXAoKToKLSAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkKLQotICAgIGRlZiBzYXZlKHNlbGYpOgotICAgICAgICAiIiJXcml0ZSBjaGFuZ2VkIC5wdGggZmlsZSBiYWNrIHRvIGRpc2siIiIKLSAgICAgICAgaWYgbm90IHNlbGYuZGlydHk6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICBkYXRhID0gJ1xuJy5qb2luKG1hcChzZWxmLm1ha2VfcmVsYXRpdmUsc2VsZi5wYXRocykpCi0gICAgICAgIGlmIGRhdGE6Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNhdmluZyAlcyIsIHNlbGYuZmlsZW5hbWUpCi0gICAgICAgICAgICBkYXRhID0gKAotICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuX19wbGVuID0gbGVuKHN5cy5wYXRoKVxuIgotICAgICAgICAgICAgICAgICIlc1xuIgotICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBuZXc9c3lzLnBhdGhbc3lzLl9fcGxlbjpdOyIKLSAgICAgICAgICAgICAgICAiIGRlbCBzeXMucGF0aFtzeXMuX19wbGVuOl07IgotICAgICAgICAgICAgICAgICIgcD1nZXRhdHRyKHN5cywnX19lZ2dpbnNlcnQnLDApOyBzeXMucGF0aFtwOnBdPW5ldzsiCi0gICAgICAgICAgICAgICAgIiBzeXMuX19lZ2dpbnNlcnQgPSBwK2xlbihuZXcpXG4iCi0gICAgICAgICAgICApICUgZGF0YQotCi0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhzZWxmLmZpbGVuYW1lKToKLSAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKLSAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZmlsZW5hbWUsJ3diJykKLSAgICAgICAgICAgIGYud3JpdGUoZGF0YSk7IGYuY2xvc2UoKQotCi0gICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlbmFtZSk6Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nIGVtcHR5ICVzIiwgc2VsZi5maWxlbmFtZSkKLSAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQotCi0gICAgICAgIHNlbGYuZGlydHkgPSBGYWxzZQotCi0gICAgZGVmIGFkZChzZWxmLGRpc3QpOgotICAgICAgICAiIiJBZGQgYGRpc3RgIHRvIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCi0gICAgICAgIGlmIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYucGF0aHM6Ci0gICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChkaXN0LmxvY2F0aW9uKTsgc2VsZi5kaXJ0eSA9IFRydWUKLSAgICAgICAgRW52aXJvbm1lbnQuYWRkKHNlbGYsZGlzdCkKLQotICAgIGRlZiByZW1vdmUoc2VsZixkaXN0KToKLSAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCi0gICAgICAgIHdoaWxlIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wYXRoczoKLSAgICAgICAgICAgIHNlbGYucGF0aHMucmVtb3ZlKGRpc3QubG9jYXRpb24pOyBzZWxmLmRpcnR5ID0gVHJ1ZQotICAgICAgICBFbnZpcm9ubWVudC5yZW1vdmUoc2VsZixkaXN0KQotCi0KLSAgICBkZWYgbWFrZV9yZWxhdGl2ZShzZWxmLHBhdGgpOgotICAgICAgICBpZiBub3JtYWxpemVfcGF0aChvcy5wYXRoLmRpcm5hbWUocGF0aCkpPT1zZWxmLmJhc2VkaXI6Ci0gICAgICAgICAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShwYXRoKQotICAgICAgICByZXR1cm4gcGF0aAotCi0KLWRlZiBnZXRfc2NyaXB0X2hlYWRlcihzY3JpcHRfdGV4dCwgZXhlY3V0YWJsZT1zeXNfZXhlY3V0YWJsZSk6Ci0gICAgIiIiQ3JlYXRlIGEgIyEgbGluZSwgZ2V0dGluZyBvcHRpb25zIChpZiBhbnkpIGZyb20gc2NyaXB0X3RleHQiIiIKLSAgICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMgaW1wb3J0IGZpcnN0X2xpbmVfcmUKLSAgICBmaXJzdCwgcmVzdCA9IChzY3JpcHRfdGV4dCsnXG4nKS5zcGxpdCgnXG4nLDEpCi0gICAgbWF0Y2ggPSBmaXJzdF9saW5lX3JlLm1hdGNoKGZpcnN0KQotICAgIG9wdGlvbnMgPSAnJwotICAgIGlmIG1hdGNoOgotICAgICAgICBzY3JpcHRfdGV4dCA9IHJlc3QKLSAgICAgICAgb3B0aW9ucyA9IG1hdGNoLmdyb3VwKDEpIG9yICcnCi0gICAgICAgIGlmIG9wdGlvbnM6Ci0gICAgICAgICAgICBvcHRpb25zID0gJyAnK29wdGlvbnMKLSAgICByZXR1cm4gIiMhJShleGVjdXRhYmxlKXMlKG9wdGlvbnMpc1xuIiAlIGxvY2FscygpCi0KLQotZGVmIGF1dG9fY2htb2QoZnVuYywgYXJnLCBleGMpOgotICAgIGlmIGZ1bmMgaXMgb3MucmVtb3ZlIGFuZCBvcy5uYW1lPT0nbnQnOgotICAgICAgICBvcy5jaG1vZChhcmcsIHN0YXQuU19JV1JJVEUpCi0gICAgICAgIHJldHVybiBmdW5jKGFyZykKLSAgICBleGMgPSBzeXMuZXhjX2luZm8oKQotICAgIHJhaXNlIGV4Y1swXSwgKGV4Y1sxXVswXSwgZXhjWzFdWzFdICsgKCIgJXMgJXMiICUgKGZ1bmMsYXJnKSkpCi0KLQotZGVmIHVuY2FjaGVfemlwZGlyKHBhdGgpOgotICAgICIiIkVuc3VyZSB0aGF0IHRoZSB6aXAgZGlyZWN0b3J5IGNhY2hlIGRvZXNuJ3QgaGF2ZSBzdGFsZSBpbmZvIGZvciBwYXRoIiIiCi0gICAgZnJvbSB6aXBpbXBvcnQgaW1wb3J0IF96aXBfZGlyZWN0b3J5X2NhY2hlIGFzIHpkYwotICAgIGlmIHBhdGggaW4gemRjOgotICAgICAgICBkZWwgemRjW3BhdGhdCi0gICAgZWxzZToKLSAgICAgICAgcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKHBhdGgpCi0gICAgICAgIGZvciBwIGluIHpkYzoKLSAgICAgICAgICAgIGlmIG5vcm1hbGl6ZV9wYXRoKHApPT1wYXRoOgotICAgICAgICAgICAgICAgIGRlbCB6ZGNbcF0KLSAgICAgICAgICAgICAgICByZXR1cm4KLQotCi1kZWYgZ2V0X3NjcmlwdF9hcmdzKGRpc3QsIGV4ZWN1dGFibGU9c3lzX2V4ZWN1dGFibGUpOgotICAgICIiIllpZWxkIHdyaXRlX3NjcmlwdCgpIGFyZ3VtZW50IHR1cGxlcyBmb3IgYSBkaXN0cmlidXRpb24ncyBlbnRyeXBvaW50cyIiIgotICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQotICAgIGhlYWRlciA9IGdldF9zY3JpcHRfaGVhZGVyKCIiLCBleGVjdXRhYmxlKQotICAgIGZvciBncm91cCBpbiAnY29uc29sZV9zY3JpcHRzJywgJ2d1aV9zY3JpcHRzJzoKLSAgICAgICAgZm9yIG5hbWUsZXAgaW4gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKS5pdGVtcygpOgotICAgICAgICAgICAgc2NyaXB0X3RleHQgPSAoCi0gICAgICAgICAgICAgICAgIiMgRUFTWS1JTlNUQUxMLUVOVFJZLVNDUklQVDogJShzcGVjKXIsJShncm91cClyLCUobmFtZSlyXG4iCi0gICAgICAgICAgICAgICAgIl9fcmVxdWlyZXNfXyA9ICUoc3BlYylyXG4iCi0gICAgICAgICAgICAgICAgImltcG9ydCBzeXNcbiIKLSAgICAgICAgICAgICAgICAiZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBsb2FkX2VudHJ5X3BvaW50XG4iCi0gICAgICAgICAgICAgICAgIlxuIgotICAgICAgICAgICAgICAgICJzeXMuZXhpdChcbiIKLSAgICAgICAgICAgICAgICAiICAgbG9hZF9lbnRyeV9wb2ludCglKHNwZWMpciwgJShncm91cClyLCAlKG5hbWUpcikoKVxuIgotICAgICAgICAgICAgICAgICIpXG4iCi0gICAgICAgICAgICApICUgbG9jYWxzKCkKLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybT09J3dpbjMyJzoKLSAgICAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24gYW5kIGFuIC5leGUgbGF1bmNoZXIKLSAgICAgICAgICAgICAgICBpZiBncm91cD09J2d1aV9zY3JpcHRzJzoKLSAgICAgICAgICAgICAgICAgICAgZXh0LCBsYXVuY2hlciA9ICctc2NyaXB0LnB5dycsICdndWkuZXhlJwotICAgICAgICAgICAgICAgICAgICBvbGQgPSBbJy5weXcnXQotICAgICAgICAgICAgICAgICAgICBuZXdfaGVhZGVyID0gcmUuc3ViKCcoP2kpcHl0aG9uLmV4ZScsJ3B5dGhvbncuZXhlJyxoZWFkZXIpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgZXh0LCBsYXVuY2hlciA9ICctc2NyaXB0LnB5JywgJ2NsaS5leGUnCi0gICAgICAgICAgICAgICAgICAgIG9sZCA9IFsnLnB5JywnLnB5YycsJy5weW8nXQotICAgICAgICAgICAgICAgICAgICBuZXdfaGVhZGVyID0gcmUuc3ViKCcoP2kpcHl0aG9udy5leGUnLCdweXRob253LmV4ZScsaGVhZGVyKQotCi0gICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmV3X2hlYWRlclsyOi0xXSk6Ci0gICAgICAgICAgICAgICAgICAgIGhkciA9IG5ld19oZWFkZXIKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBoZHIgPSBoZWFkZXIKLSAgICAgICAgICAgICAgICB5aWVsZCAobmFtZStleHQsIGhkcitzY3JpcHRfdGV4dCwgJ3QnLCBbbmFtZSt4IGZvciB4IGluIG9sZF0pCi0gICAgICAgICAgICAgICAgeWllbGQgKAotICAgICAgICAgICAgICAgICAgICBuYW1lKycuZXhlJywgcmVzb3VyY2Vfc3RyaW5nKCdzZXR1cHRvb2xzJywgbGF1bmNoZXIpLAotICAgICAgICAgICAgICAgICAgICAnYicgIyB3cml0ZSBpbiBiaW5hcnkgbW9kZQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBPbiBvdGhlciBwbGF0Zm9ybXMsIHdlIGFzc3VtZSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gaXMgdG8KLSAgICAgICAgICAgICAgICAjIGp1c3Qgd3JpdGUgdGhlIHN0dWIgd2l0aCBubyBleHRlbnNpb24uCi0gICAgICAgICAgICAgICAgeWllbGQgKG5hbWUsIGhlYWRlcitzY3JpcHRfdGV4dCkKLQotZGVmIHJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzPUZhbHNlLCBvbmVycm9yPWF1dG9fY2htb2QpOgotICAgICIiIlJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeSB0cmVlLgotCi0gICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFB5dGhvbiAyLjQgdmVyc2lvbiBvZiAnc2h1dGlsJywgYmVjYXVzZQotICAgIHRoZSAyLjMgdmVyc2lvbiBkb2Vzbid0IHJlYWxseSB3b3JrIHJpZ2h0LgotICAgICIiIgotICAgIGlmIGlnbm9yZV9lcnJvcnM6Ci0gICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKLSAgICAgICAgICAgIHBhc3MKLSAgICBlbGlmIG9uZXJyb3IgaXMgTm9uZToKLSAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgotICAgICAgICAgICAgcmFpc2UKLSAgICBuYW1lcyA9IFtdCi0gICAgdHJ5OgotICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocGF0aCkKLSAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKLSAgICAgICAgb25lcnJvcihvcy5saXN0ZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKLSAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbW9kZSA9IG9zLmxzdGF0KGZ1bGxuYW1lKS5zdF9tb2RlCi0gICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgIG1vZGUgPSAwCi0gICAgICAgIGlmIHN0YXQuU19JU0RJUihtb2RlKToKLSAgICAgICAgICAgIHJtdHJlZShmdWxsbmFtZSwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZnVsbG5hbWUpCi0gICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKLSAgICAgICAgICAgICAgICBvbmVycm9yKG9zLnJlbW92ZSwgZnVsbG5hbWUsIHN5cy5leGNfaW5mbygpKQotICAgIHRyeToKLSAgICAgICAgb3Mucm1kaXIocGF0aCkKLSAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgIG9uZXJyb3Iob3Mucm1kaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQotCi0KLQotCi0KLQotCi1kZWYgbWFpbihhcmd2PU5vbmUsICoqa3cpOgotICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKLSAgICBmcm9tIHNldHVwdG9vbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCi0gICAgaW1wb3J0IGRpc3R1dGlscy5jb3JlCi0KLSAgICBVU0FHRSA9ICIiIlwKLXVzYWdlOiAlKHNjcmlwdClzIFtvcHRpb25zXSByZXF1aXJlbWVudF9vcl91cmwgLi4uCi0gICBvcjogJShzY3JpcHQpcyAtLWhlbHAKLSIiIgotCi0gICAgZGVmIGdlbl91c2FnZSAoc2NyaXB0X25hbWUpOgotICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKQotICAgICAgICByZXR1cm4gVVNBR0UgJSB2YXJzKCkKLQotICAgIGRlZiB3aXRoX2VpX3VzYWdlKGYpOgotICAgICAgICBvbGRfZ2VuX3VzYWdlID0gZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZSA9IGdlbl91c2FnZQotICAgICAgICAgICAgcmV0dXJuIGYoKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gb2xkX2dlbl91c2FnZQotCi0gICAgY2xhc3MgRGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcyhEaXN0cmlidXRpb24pOgotICAgICAgICBkZWYgX3Nob3dfaGVscChzZWxmLCphcmdzLCoqa3cpOgotICAgICAgICAgICAgd2l0aF9laV91c2FnZShsYW1iZGE6IERpc3RyaWJ1dGlvbi5fc2hvd19oZWxwKHNlbGYsKmFyZ3MsKiprdykpCi0KLSAgICBpZiBhcmd2IGlzIE5vbmU6Ci0gICAgICAgIGFyZ3YgPSBzeXMuYXJndlsxOl0KLQotICAgIHdpdGhfZWlfdXNhZ2UobGFtYmRhOgotICAgICAgICBzZXR1cCgKLSAgICAgICAgICAgIHNjcmlwdF9hcmdzID0gWyctcScsJ2Vhc3lfaW5zdGFsbCcsICctdiddK2FyZ3YsCi0gICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHN5cy5hcmd2WzBdIG9yICdlYXN5X2luc3RhbGwnLAotICAgICAgICAgICAgZGlzdGNsYXNzPURpc3RyaWJ1dGlvbldpdGhvdXRIZWxwQ29tbWFuZHMsICoqa3cKLSAgICAgICAgKQotICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNjhmYjM5Li4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotIiIic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvCi0KLUNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkgYW5kIGNvbnRlbnRzIiIiCi0KLSMgVGhpcyBtb2R1bGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMKLWltcG9ydCBvcywgcmUKLWZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAotZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCi1mcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdCBpbXBvcnQgc2Rpc3QKLWZyb20gZGlzdHV0aWxzIGltcG9ydCBmaWxlX3V0aWwKLWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAotZnJvbSBkaXN0dXRpbHMuZmlsZWxpc3QgaW1wb3J0IEZpbGVMaXN0Ci1mcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHBhcnNlX3JlcXVpcmVtZW50cywgc2FmZV9uYW1lLCBwYXJzZV92ZXJzaW9uLCBcCi0gICAgc2FmZV92ZXJzaW9uLCB5aWVsZF9saW5lcywgRW50cnlQb2ludCwgaXRlcl9lbnRyeV9wb2ludHMsIHRvX2ZpbGVuYW1lCi1mcm9tIHNkaXN0IGltcG9ydCB3YWxrX3JldmN0cmwKLQotY2xhc3MgZWdnX2luZm8oQ29tbWFuZCk6Ci0gICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGEgZGlzdHJpYnV0aW9uJ3MgLmVnZy1pbmZvIGRpcmVjdG9yeSIKLQotICAgIHVzZXJfb3B0aW9ucyA9IFsKLSAgICAgICAgKCdlZ2ctYmFzZT0nLCAnZScsICJkaXJlY3RvcnkgY29udGFpbmluZyAuZWdnLWluZm8gZGlyZWN0b3JpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlKSIpLAotICAgICAgICAoJ3RhZy1zdm4tcmV2aXNpb24nLCAncicsCi0gICAgICAgICAgICAiQWRkIHN1YnZlcnNpb24gcmV2aXNpb24gSUQgdG8gdmVyc2lvbiBudW1iZXIiKSwKLSAgICAgICAgKCd0YWctZGF0ZScsICdkJywgIkFkZCBkYXRlIHN0YW1wIChlLmcuIDIwMDUwNTI4KSB0byB2ZXJzaW9uIG51bWJlciIpLAotICAgICAgICAoJ3RhZy1idWlsZD0nLCAnYicsICJTcGVjaWZ5IGV4cGxpY2l0IHRhZyB0byBhZGQgdG8gdmVyc2lvbiBudW1iZXIiKSwKLSAgICBdCi0KLSAgICBib29sZWFuX29wdGlvbnMgPSBbJ3RhZy1kYXRlJywndGFnLXN2bi1yZXZpc2lvbiddCi0KLSAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKLSAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IE5vbmUKLSAgICAgICAgc2VsZi5lZ2dfdmVyc2lvbiA9IE5vbmUKLSAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IE5vbmUKLSAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IE5vbmUKLSAgICAgICAgc2VsZi50YWdfYnVpbGQgPSBOb25lCi0gICAgICAgIHNlbGYudGFnX3N2bl9yZXZpc2lvbiA9IDAKLSAgICAgICAgc2VsZi50YWdfZGF0ZSA9IDAKLSAgICAgICAgc2VsZi5icm9rZW5fZWdnX2luZm8gPSBGYWxzZQotCi0gICAgZGVmIGZpbmFsaXplX29wdGlvbnMgKHNlbGYpOgotICAgICAgICBzZWxmLmVnZ19uYW1lID0gc2FmZV9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpCi0gICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBzZWxmLnRhZ2dlZF92ZXJzaW9uKCkKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBsaXN0KAotICAgICAgICAgICAgICAgIHBhcnNlX3JlcXVpcmVtZW50cygnJXM9PSVzJyAlIChzZWxmLmVnZ19uYW1lLHNlbGYuZWdnX3ZlcnNpb24pKQotICAgICAgICAgICAgKQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAotICAgICAgICAgICAgICAgICJJbnZhbGlkIGRpc3RyaWJ1dGlvbiBuYW1lIG9yIHZlcnNpb24gc3ludGF4OiAlcy0lcyIgJQotICAgICAgICAgICAgICAgIChzZWxmLmVnZ19uYW1lLHNlbGYuZWdnX3ZlcnNpb24pCi0gICAgICAgICAgICApCi0KLSAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSBpcyBOb25lOgotICAgICAgICAgICAgZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyCi0gICAgICAgICAgICBzZWxmLmVnZ19iYXNlID0gKGRpcnMgb3Ige30pLmdldCgnJyxvcy5jdXJkaXIpCi0KLSAgICAgICAgc2VsZi5lbnN1cmVfZGlybmFtZSgnZWdnX2Jhc2UnKQotICAgICAgICBzZWxmLmVnZ19pbmZvID0gdG9fZmlsZW5hbWUoc2VsZi5lZ2dfbmFtZSkrJy5lZ2ctaW5mbycKLSAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6Ci0gICAgICAgICAgICBzZWxmLmVnZ19pbmZvID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIHNlbGYuZWdnX2luZm8pCi0gICAgICAgIGlmICctJyBpbiBzZWxmLmVnZ19uYW1lOiBzZWxmLmNoZWNrX2Jyb2tlbl9lZ2dfaW5mbygpCi0KLSAgICAgICAgIyBTZXQgcGFja2FnZSB2ZXJzaW9uIGZvciB0aGUgYmVuZWZpdCBvZiBkdW1iZXIgY29tbWFuZHMKLSAgICAgICAgIyAoZS5nLiBzZGlzdCwgYmRpc3Rfd2luaW5zdCwgZXRjLikKLSAgICAgICAgIwotICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS52ZXJzaW9uID0gc2VsZi5lZ2dfdmVyc2lvbgotCi0gICAgICAgICMgSWYgd2UgYm9vdHN0cmFwcGVkIGFyb3VuZCB0aGUgbGFjayBvZiBhIFBLRy1JTkZPLCBhcyBtaWdodCBiZSB0aGUKLSAgICAgICAgIyBjYXNlIGluIGEgZnJlc2ggY2hlY2tvdXQsIG1ha2Ugc3VyZSB0aGF0IGFueSBzcGVjaWFsIHRhZ3MgZ2V0IGFkZGVkCi0gICAgICAgICMgdG8gdGhlIHZlcnNpb24gaW5mbwotICAgICAgICAjCi0gICAgICAgIHBkID0gc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdAotICAgICAgICBpZiBwZCBpcyBub3QgTm9uZSBhbmQgcGQua2V5PT1zZWxmLmVnZ19uYW1lLmxvd2VyKCk6Ci0gICAgICAgICAgICBwZC5fdmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KLSAgICAgICAgICAgIHBkLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi5lZ2dfdmVyc2lvbikKLSAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLl9wYXRjaGVkX2Rpc3QgPSBOb25lCi0KLQotCi0gICAgZGVmIHdyaXRlX29yX2RlbGV0ZV9maWxlKHNlbGYsIHdoYXQsIGZpbGVuYW1lLCBkYXRhLCBmb3JjZT1GYWxzZSk6Ci0gICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIG9yIGRlbGV0ZSBpZiBlbXB0eQotCi0gICAgICAgIElmIGBkYXRhYCBpcyBub24tZW1wdHksIHRoaXMgcm91dGluZSBpcyB0aGUgc2FtZSBhcyBgYHdyaXRlX2ZpbGUoKWBgLgotICAgICAgICBJZiBgZGF0YWAgaXMgZW1wdHkgYnV0IG5vdCBgYE5vbmVgYCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nCi0gICAgICAgIGBgZGVsZXRlX2ZpbGUoZmlsZW5hbWUpYC4gIElmIGBkYXRhYCBpcyBgYE5vbmVgYCwgdGhlbiB0aGlzIGlzIGEgbm8tb3AKLSAgICAgICAgdW5sZXNzIGBmaWxlbmFtZWAgZXhpc3RzLCBpbiB3aGljaCBjYXNlIGEgd2FybmluZyBpcyBpc3N1ZWQgYWJvdXQgdGhlCi0gICAgICAgIG9ycGhhbmVkIGZpbGUgKGlmIGBmb3JjZWAgaXMgZmFsc2UpLCBvciBkZWxldGVkIChpZiBgZm9yY2VgIGlzIHRydWUpLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgZGF0YToKLSAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZSh3aGF0LCBmaWxlbmFtZSwgZGF0YSkKLSAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6Ci0gICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmUgYW5kIG5vdCBmb3JjZToKLSAgICAgICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAgICAgIiVzIG5vdCBzZXQgaW4gc2V0dXAoKSwgYnV0ICVzIGV4aXN0cyIsIHdoYXQsIGZpbGVuYW1lCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZV9maWxlKGZpbGVuYW1lKQotCi0gICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgd2hhdCwgZmlsZW5hbWUsIGRhdGEpOgotICAgICAgICAiIiJXcml0ZSBgZGF0YWAgdG8gYGZpbGVuYW1lYCAoaWYgbm90IGEgZHJ5IHJ1bikgYWZ0ZXIgYW5ub3VuY2luZyBpdAotCi0gICAgICAgIGB3aGF0YCBpcyB1c2VkIGluIGEgbG9nIG1lc3NhZ2UgdG8gaWRlbnRpZnkgd2hhdCBpcyBiZWluZyB3cml0dGVuCi0gICAgICAgIHRvIHRoZSBmaWxlLgotICAgICAgICAiIiIKLSAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMgdG8gJXMiLCB3aGF0LCBmaWxlbmFtZSkKLSAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKLSAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQotICAgICAgICAgICAgZi53cml0ZShkYXRhKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0KLSAgICBkZWYgZGVsZXRlX2ZpbGUoc2VsZiwgZmlsZW5hbWUpOgotICAgICAgICAiIiJEZWxldGUgYGZpbGVuYW1lYCAoaWYgbm90IGEgZHJ5IHJ1bikgYWZ0ZXIgYW5ub3VuY2luZyBpdCIiIgotICAgICAgICBsb2cuaW5mbygiZGVsZXRpbmcgJXMiLCBmaWxlbmFtZSkKLSAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKLSAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLQotCi0KLQotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgIHNlbGYubWtwYXRoKHNlbGYuZWdnX2luZm8pCi0gICAgICAgIGluc3RhbGxlciA9IHNlbGYuZGlzdHJpYnV0aW9uLmZldGNoX2J1aWxkX2VnZwotICAgICAgICBmb3IgZXAgaW4gaXRlcl9lbnRyeV9wb2ludHMoJ2VnZ19pbmZvLndyaXRlcnMnKToKLSAgICAgICAgICAgIHdyaXRlciA9IGVwLmxvYWQoaW5zdGFsbGVyPWluc3RhbGxlcikKLSAgICAgICAgICAgIHdyaXRlcihzZWxmLCBlcC5uYW1lLCBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbyxlcC5uYW1lKSkKLSAgICAgICAgc2VsZi5maW5kX3NvdXJjZXMoKQotCi0gICAgZGVmIHRhZ2dlZF92ZXJzaW9uKHNlbGYpOgotICAgICAgICB2ZXJzaW9uID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKQotICAgICAgICBpZiBzZWxmLnRhZ19idWlsZDoKLSAgICAgICAgICAgIHZlcnNpb24rPXNlbGYudGFnX2J1aWxkCi0gICAgICAgIGlmIHNlbGYudGFnX3N2bl9yZXZpc2lvbiBhbmQgKAotICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoJy5zdm4nKSBvciBvcy5wYXRoLmV4aXN0cygnUEtHLUlORk8nKQotICAgICAgICApOiAgdmVyc2lvbiArPSAnLXIlcycgJSBzZWxmLmdldF9zdm5fcmV2aXNpb24oKQotICAgICAgICBpZiBzZWxmLnRhZ19kYXRlOgotICAgICAgICAgICAgaW1wb3J0IHRpbWU7IHZlcnNpb24gKz0gdGltZS5zdHJmdGltZSgiLSVZJW0lZCIpCi0gICAgICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbikKLQotICAgIGRlZiBnZXRfc3ZuX3JldmlzaW9uKHNlbGYpOgotICAgICAgICByZXZpc2lvbiA9IDAKLSAgICAgICAgdXJscmUgPSByZS5jb21waWxlKCd1cmw9IihbXiJdKykiJykKLSAgICAgICAgcmV2cmUgPSByZS5jb21waWxlKCdjb21taXR0ZWQtcmV2PSIoXGQrKSInKQotICAgICAgICBmb3IgYmFzZSxkaXJzLGZpbGVzIGluIG9zLndhbGsob3MuY3VyZGlyKToKLSAgICAgICAgICAgIGlmICcuc3ZuJyBub3QgaW4gZGlyczoKLSAgICAgICAgICAgICAgICBkaXJzWzpdID0gW10KLSAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vIHNlbnNlIHdhbGtpbmcgdW5jb250cm9sbGVkIHN1YmRpcnMKLSAgICAgICAgICAgIGRpcnMucmVtb3ZlKCcuc3ZuJykKLSAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihiYXNlLCcuc3ZuJywnZW50cmllcycpKQotICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGRpcnVybCA9IHVybHJlLnNlYXJjaChkYXRhKS5ncm91cCgxKSAgICAjIGdldCByZXBvc2l0b3J5IFVSTAotICAgICAgICAgICAgaWYgYmFzZT09b3MuY3VyZGlyOgotICAgICAgICAgICAgICAgIGJhc2VfdXJsID0gZGlydXJsKycvJyAgICMgc2F2ZSB0aGUgcm9vdCB1cmwKLSAgICAgICAgICAgIGVsaWYgbm90IGRpcnVybC5zdGFydHN3aXRoKGJhc2VfdXJsKToKLSAgICAgICAgICAgICAgICBkaXJzWzpdID0gW10KLSAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHN2biB0cmVlLCBza2lwIGl0Ci0gICAgICAgICAgICBmb3IgbWF0Y2ggaW4gcmV2cmUuZmluZGl0ZXIoZGF0YSk6Ci0gICAgICAgICAgICAgICAgcmV2aXNpb24gPSBtYXgocmV2aXNpb24sIGludChtYXRjaC5ncm91cCgxKSkpCi0gICAgICAgIHJldHVybiBzdHIocmV2aXNpb24gb3IgZ2V0X3BrZ19pbmZvX3JldmlzaW9uKCkpCi0KLSAgICBkZWYgZmluZF9zb3VyY2VzKHNlbGYpOgotICAgICAgICAiIiJHZW5lcmF0ZSBTT1VSQ0VTLnR4dCBtYW5pZmVzdCBmaWxlIiIiCi0gICAgICAgIG1hbmlmZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sIlNPVVJDRVMudHh0IikKLSAgICAgICAgbW0gPSBtYW5pZmVzdF9tYWtlcihzZWxmLmRpc3RyaWJ1dGlvbikKLSAgICAgICAgbW0ubWFuaWZlc3QgPSBtYW5pZmVzdF9maWxlbmFtZQotICAgICAgICBtbS5ydW4oKQotICAgICAgICBzZWxmLmZpbGVsaXN0ID0gbW0uZmlsZWxpc3QKLQotICAgIGRlZiBjaGVja19icm9rZW5fZWdnX2luZm8oc2VsZik6Ci0gICAgICAgIGJlaSA9IHNlbGYuZWdnX25hbWUrJy5lZ2ctaW5mbycKLSAgICAgICAgaWYgc2VsZi5lZ2dfYmFzZSAhPSBvcy5jdXJkaXI6Ci0gICAgICAgICAgICBiZWkgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfYmFzZSwgYmVpKQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhiZWkpOgotICAgICAgICAgICAgbG9nLndhcm4oCi0gICAgICAgICAgICAgICAgIi0iKjc4KydcbicKLSAgICAgICAgICAgICAgICAiTm90ZTogWW91ciBjdXJyZW50IC5lZ2ctaW5mbyBkaXJlY3RvcnkgaGFzIGEgJy0nIGluIGl0cyBuYW1lOyIKLSAgICAgICAgICAgICAgICAnXG50aGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggInNldHVwLnB5IGRldmVsb3AiLlxuXG4nCi0gICAgICAgICAgICAgICAgJ1BsZWFzZSByZW5hbWUgJXMgdG8gJXMgdG8gY29ycmVjdCB0aGlzIHByb2JsZW0uXG4nKyctJyo3OCwKLSAgICAgICAgICAgICAgICBiZWksIHNlbGYuZWdnX2luZm8KLSAgICAgICAgICAgICkKLSAgICAgICAgICAgIHNlbGYuYnJva2VuX2VnZ19pbmZvID0gc2VsZi5lZ2dfaW5mbwotICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGJlaSAgICAgIyBtYWtlIGl0IHdvcmsgZm9yIG5vdwotCi1jbGFzcyBGaWxlTGlzdChGaWxlTGlzdCk6Ci0gICAgIiIiRmlsZSBsaXN0IHRoYXQgYWNjZXB0cyBvbmx5IGV4aXN0aW5nLCBwbGF0Zm9ybS1pbmRlcGVuZGVudCBwYXRocyIiIgotCi0gICAgZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKLSAgICAgICAgcGF0aCA9IGNvbnZlcnRfcGF0aChpdGVtKQotICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKHBhdGgpCi0KLQotCi0KLQotCi0KLQotCi0KLQotY2xhc3MgbWFuaWZlc3RfbWFrZXIoc2Rpc3QpOgotCi0gICAgdGVtcGxhdGUgPSAiTUFOSUZFU1QuaW4iCi0KLSAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKLSAgICAgICAgc2VsZi51c2VfZGVmYXVsdHMgPSAxCi0gICAgICAgIHNlbGYucHJ1bmUgPSAxCi0gICAgICAgIHNlbGYubWFuaWZlc3Rfb25seSA9IDEKLSAgICAgICAgc2VsZi5mb3JjZV9tYW5pZmVzdCA9IDEKLQotICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICBzZWxmLmZpbGVsaXN0ID0gRmlsZUxpc3QoKQotICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5tYW5pZmVzdCk6Ci0gICAgICAgICAgICBzZWxmLndyaXRlX21hbmlmZXN0KCkgICAjIGl0IG11c3QgZXhpc3Qgc28gaXQnbGwgZ2V0IGluIHRoZSBsaXN0Ci0gICAgICAgIHNlbGYuZmlsZWxpc3QuZmluZGFsbCgpCi0gICAgICAgIHNlbGYuYWRkX2RlZmF1bHRzKCkKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50ZW1wbGF0ZSk6Ci0gICAgICAgICAgICBzZWxmLnJlYWRfdGVtcGxhdGUoKQotICAgICAgICBzZWxmLnBydW5lX2ZpbGVfbGlzdCgpCi0gICAgICAgIHNlbGYuZmlsZWxpc3Quc29ydCgpCi0gICAgICAgIHNlbGYuZmlsZWxpc3QucmVtb3ZlX2R1cGxpY2F0ZXMoKQotICAgICAgICBzZWxmLndyaXRlX21hbmlmZXN0KCkKLQotICAgIGRlZiB3cml0ZV9tYW5pZmVzdCAoc2VsZik6Ci0gICAgICAgICIiIldyaXRlIHRoZSBmaWxlIGxpc3QgaW4gJ3NlbGYuZmlsZWxpc3QnIChwcmVzdW1hYmx5IGFzIGZpbGxlZCBpbgotICAgICAgICBieSAnYWRkX2RlZmF1bHRzKCknIGFuZCAncmVhZF90ZW1wbGF0ZSgpJykgdG8gdGhlIG1hbmlmZXN0IGZpbGUKLSAgICAgICAgbmFtZWQgYnkgJ3NlbGYubWFuaWZlc3QnLgotICAgICAgICAiIiIKLSAgICAgICAgZmlsZXMgPSBzZWxmLmZpbGVsaXN0LmZpbGVzCi0gICAgICAgIGlmIG9zLnNlcCE9Jy8nOgotICAgICAgICAgICAgZmlsZXMgPSBbZi5yZXBsYWNlKG9zLnNlcCwnLycpIGZvciBmIGluIGZpbGVzXQotICAgICAgICBzZWxmLmV4ZWN1dGUoZmlsZV91dGlsLndyaXRlX2ZpbGUsIChzZWxmLm1hbmlmZXN0LCBmaWxlcyksCi0gICAgICAgICAgICAgICAgICAgICAid3JpdGluZyBtYW5pZmVzdCBmaWxlICclcyciICUgc2VsZi5tYW5pZmVzdCkKLQotCi0KLQotCi0gICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKLSAgICAgICAgc2Rpc3QuYWRkX2RlZmF1bHRzKHNlbGYpCi0gICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYudGVtcGxhdGUpCi0gICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHNlbGYubWFuaWZlc3QpCi0gICAgICAgIHJjZmlsZXMgPSBsaXN0KHdhbGtfcmV2Y3RybCgpKQotICAgICAgICBpZiByY2ZpbGVzOgotICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQocmNmaWxlcykKLSAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKLSAgICAgICAgICAgIHNlbGYucmVhZF9tYW5pZmVzdCgpCi0gICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCi0gICAgICAgIHNlbGYuZmlsZWxpc3QuaW5jbHVkZV9wYXR0ZXJuKCIqIiwgcHJlZml4PWVpX2NtZC5lZ2dfaW5mbykKLQotICAgIGRlZiBwcnVuZV9maWxlX2xpc3QgKHNlbGYpOgotICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCi0gICAgICAgIGJhc2VfZGlyID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkKLSAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWJ1aWxkLmJ1aWxkX2Jhc2UpCi0gICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1iYXNlX2RpcikKLSAgICAgICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKLSAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4oc2VwK3InKFJDU3xDVlN8XC5zdm4pJytzZXAsIGlzX3JlZ2V4PTEpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWRlZiB3cml0ZV9wa2dfaW5mbyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6Ci0gICAgbG9nLmluZm8oIndyaXRpbmcgJXMiLCBmaWxlbmFtZSkKLSAgICBpZiBub3QgY21kLmRyeV9ydW46Ci0gICAgICAgIG1ldGFkYXRhID0gY21kLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQotICAgICAgICBtZXRhZGF0YS52ZXJzaW9uLCBvbGR2ZXIgPSBjbWQuZWdnX3ZlcnNpb24sIG1ldGFkYXRhLnZlcnNpb24KLSAgICAgICAgbWV0YWRhdGEubmFtZSwgb2xkbmFtZSAgID0gY21kLmVnZ19uYW1lLCBtZXRhZGF0YS5uYW1lCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgICMgd3JpdGUgdW5lc2NhcGVkIGRhdGEgdG8gUEtHLUlORk8sIHNvIG9sZGVyIHBrZ19yZXNvdXJjZXMKLSAgICAgICAgICAgICMgY2FuIHN0aWxsIHBhcnNlIGl0Ci0gICAgICAgICAgICBtZXRhZGF0YS53cml0ZV9wa2dfaW5mbyhjbWQuZWdnX2luZm8pCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uID0gb2xkbmFtZSwgb2xkdmVyCi0KLSAgICAgICAgc2FmZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwnemlwX3NhZmUnLE5vbmUpCi0gICAgICAgIGltcG9ydCBiZGlzdF9lZ2c7IGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZyhjbWQuZWdnX2luZm8sIHNhZmUpCi0KLWRlZiB3YXJuX2RlcGVuZHNfb2Jzb2xldGUoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgotICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKLSAgICAgICAgbG9nLndhcm4oCi0gICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyBpcyBub3QgdXNlZCBieSBzZXR1cHRvb2xzIDAuNiFcbiIKLSAgICAgICAgICAgICJVc2UgdGhlIGluc3RhbGxfcmVxdWlyZXMvZXh0cmFzX3JlcXVpcmUgc2V0dXAoKSBhcmdzIGluc3RlYWQuIgotICAgICAgICApCi0KLQotZGVmIHdyaXRlX3JlcXVpcmVtZW50cyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6Ci0gICAgZGlzdCA9IGNtZC5kaXN0cmlidXRpb24KLSAgICBkYXRhID0gWydcbicuam9pbih5aWVsZF9saW5lcyhkaXN0Lmluc3RhbGxfcmVxdWlyZXMgb3IgKCkpKV0KLSAgICBmb3IgZXh0cmEscmVxcyBpbiAoZGlzdC5leHRyYXNfcmVxdWlyZSBvciB7fSkuaXRlbXMoKToKLSAgICAgICAgZGF0YS5hcHBlbmQoJ1xuXG5bJXNdXG4lcycgJSAoZXh0cmEsICdcbicuam9pbih5aWVsZF9saW5lcyhyZXFzKSkpKQotICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgicmVxdWlyZW1lbnRzIiwgZmlsZW5hbWUsICcnLmpvaW4oZGF0YSkpCi0KLWRlZiB3cml0ZV90b3BsZXZlbF9uYW1lcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6Ci0gICAgcGtncyA9IGRpY3QuZnJvbWtleXMoCi0gICAgICAgIFtrLnNwbGl0KCcuJywxKVswXQotICAgICAgICAgICAgZm9yIGsgaW4gY21kLmRpc3RyaWJ1dGlvbi5pdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcygpCi0gICAgICAgIF0KLSAgICApCi0gICAgY21kLndyaXRlX2ZpbGUoInRvcC1sZXZlbCBuYW1lcyIsIGZpbGVuYW1lLCAnXG4nLmpvaW4ocGtncykrJ1xuJykKLQotCi0KLWRlZiBvdmVyd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKLSAgICB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIFRydWUpCi0KLWRlZiB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIGZvcmNlPUZhbHNlKToKLSAgICBhcmduYW1lID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSlbMF0KLSAgICB2YWx1ZSA9IGdldGF0dHIoY21kLmRpc3RyaWJ1dGlvbiwgYXJnbmFtZSwgTm9uZSkKLSAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKLSAgICAgICAgdmFsdWUgPSAnXG4nLmpvaW4odmFsdWUpKydcbicKLSAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoYXJnbmFtZSwgZmlsZW5hbWUsIHZhbHVlLCBmb3JjZSkKLQotZGVmIHdyaXRlX2VudHJpZXMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgotICAgIGVwID0gY21kLmRpc3RyaWJ1dGlvbi5lbnRyeV9wb2ludHMKLQotICAgIGlmIGlzaW5zdGFuY2UoZXAsYmFzZXN0cmluZykgb3IgZXAgaXMgTm9uZToKLSAgICAgICAgZGF0YSA9IGVwCi0gICAgZWxpZiBlcCBpcyBub3QgTm9uZToKLSAgICAgICAgZGF0YSA9IFtdCi0gICAgICAgIGZvciBzZWN0aW9uLCBjb250ZW50cyBpbiBlcC5pdGVtcygpOgotICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29udGVudHMsYmFzZXN0cmluZyk6Ci0gICAgICAgICAgICAgICAgY29udGVudHMgPSBFbnRyeVBvaW50LnBhcnNlX2dyb3VwKHNlY3Rpb24sIGNvbnRlbnRzKQotICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gJ1xuJy5qb2luKG1hcChzdHIsY29udGVudHMudmFsdWVzKCkpKQotICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ1slc11cbiVzXG5cbicgJSAoc2VjdGlvbixjb250ZW50cykpCi0gICAgICAgIGRhdGEgPSAnJy5qb2luKGRhdGEpCi0KLSAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoJ2VudHJ5IHBvaW50cycsIGZpbGVuYW1lLCBkYXRhLCBUcnVlKQotCi1kZWYgZ2V0X3BrZ19pbmZvX3JldmlzaW9uKCk6Ci0gICAgIyBTZWUgaWYgd2UgY2FuIGdldCBhIC1yIyMjIG9mZiBvZiBQS0ctSU5GTywgaW4gY2FzZSB0aGlzIGlzIGFuIHNkaXN0IG9mCi0gICAgIyBhIHN1YnZlcnNpb24gcmV2aXNpb24KLSAgICAjCi0gICAgaWYgb3MucGF0aC5leGlzdHMoJ1BLRy1JTkZPJyk6Ci0gICAgICAgIGYgPSBvcGVuKCdQS0ctSU5GTycsJ3JVJykKLSAgICAgICAgZm9yIGxpbmUgaW4gZjoKLSAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gociJWZXJzaW9uOi4qLXIoXGQrKVxzKiQiLCBsaW5lKQotICAgICAgICAgICAgaWYgbWF0Y2g6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGludChtYXRjaC5ncm91cCgxKSkKLSAgICByZXR1cm4gMApkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmI5YWY1Li4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi1pbXBvcnQgc2V0dXB0b29scywgc3lzCi1mcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwgYXMgX2luc3RhbGwKLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzQXJnRXJyb3IKLQotY2xhc3MgaW5zdGFsbChfaW5zdGFsbCk6Ci0gICAgIiIiVXNlIGVhc3lfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlLCB3L2RlcGVuZGVuY2llcyIiIgotCi0gICAgdXNlcl9vcHRpb25zID0gX2luc3RhbGwudXNlcl9vcHRpb25zICsgWwotICAgICAgICAoJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgTm9uZSwgIlRyeSBub3QgdG8gdXNlIHRoaXMhIiksCi0gICAgICAgICgnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywgTm9uZSwKLSAgICAgICAgICAgICJ1c2VkIGJ5IHN5c3RlbSBwYWNrYWdlIGJ1aWxkZXJzIHRvIGNyZWF0ZSAnZmxhdCcgZWdncyIpLAotICAgIF0KLSAgICBib29sZWFuX29wdGlvbnMgPSBfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbCi0gICAgICAgICdvbGQtYW5kLXVubWFuYWdlYWJsZScsICdzaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnLAotICAgIF0KLSAgICBuZXdfY29tbWFuZHMgPSBbCi0gICAgICAgICgnaW5zdGFsbF9lZ2dfaW5mbycsIGxhbWJkYSBzZWxmOiBUcnVlKSwKLSAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCAgbGFtYmRhIHNlbGY6IFRydWUpLAotICAgIF0KLSAgICBfbmMgPSBkaWN0KG5ld19jb21tYW5kcykKLSAgICBzdWJfY29tbWFuZHMgPSBbCi0gICAgICAgIGNtZCBmb3IgY21kIGluIF9pbnN0YWxsLnN1Yl9jb21tYW5kcyBpZiBjbWRbMF0gbm90IGluIF9uYwotICAgIF0gKyBuZXdfY29tbWFuZHMKLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIF9pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQotICAgICAgICBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlID0gTm9uZQotICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IE5vbmUKLSAgICAgICAgc2VsZi5ub19jb21waWxlID0gTm9uZSAgIyBtYWtlIERJU1RVVElMU19ERUJVRyB3b3JrIHJpZ2h0IQotCi0gICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIF9pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKLSAgICAgICAgaWYgc2VsZi5yb290OgotICAgICAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBUcnVlCi0gICAgICAgIGVsaWYgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6Ci0gICAgICAgICAgICBpZiBub3Qgc2VsZi5yb290IGFuZCBub3Qgc2VsZi5yZWNvcmQ6Ci0gICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IC0tcmVjb3JkIG9yIC0tcm9vdCB3aGVuIGJ1aWxkaW5nIHN5c3RlbSIKLSAgICAgICAgICAgICAgICAgICAgIiBwYWNrYWdlcyIKLSAgICAgICAgICAgICAgICApCi0KLSAgICBkZWYgaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6Ci0gICAgICAgICMgV2UgYWx3YXlzIGlnbm9yZSBleHRyYV9wYXRoLCBiZWNhdXNlIHdlIGluc3RhbGwgYXMgLmVnZyBvciAuZWdnLWluZm8KLSAgICAgICAgc2VsZi5wYXRoX2ZpbGUgPSBOb25lCi0gICAgICAgIHNlbGYuZXh0cmFfZGlycyA9ICcnCi0KLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICAjIEV4cGxpY2l0IHJlcXVlc3QgZm9yIG9sZC1zdHlsZSBpbnN0YWxsPyAgSnVzdCBkbyBpdAotICAgICAgICBpZiBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlIG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgotICAgICAgICAgICAgcmV0dXJuIF9pbnN0YWxsLnJ1bihzZWxmKQotCi0gICAgICAgICMgQXR0ZW1wdCB0byBkZXRlY3Qgd2hldGhlciB3ZSB3ZXJlIGNhbGxlZCBmcm9tIHNldHVwKCkgb3IgYnkgYW5vdGhlcgotICAgICAgICAjIGNvbW1hbmQuICBJZiB3ZSB3ZXJlIGNhbGxlZCBieSBzZXR1cCgpLCBvdXIgY2FsbGVyIHdpbGwgYmUgdGhlCi0gICAgICAgICMgJ3J1bl9jb21tYW5kJyBtZXRob2QgaW4gJ2Rpc3R1dGlscy5kaXN0JywgYW5kICppdHMqIGNhbGxlciB3aWxsIGJlCi0gICAgICAgICMgdGhlICdydW5fY29tbWFuZHMnIG1ldGhvZC4gIElmIHdlIHdlcmUgY2FsbGVkIGFueSBvdGhlciB3YXksIG91cgotICAgICAgICAjIGltbWVkaWF0ZSBjYWxsZXIgKm1pZ2h0KiBiZSAncnVuX2NvbW1hbmQnLCBidXQgaXQgd29uJ3QgaGF2ZSBiZWVuCi0gICAgICAgICMgY2FsbGVkIGJ5ICdydW5fY29tbWFuZHMnLiAgVGhpcyBpcyBzbGlnaHRseSBrbHVkZ3ksIGJ1dCBzZWVtcyB0bwotICAgICAgICAjIHdvcmsuCi0gICAgICAgICMKLSAgICAgICAgY2FsbGVyID0gc3lzLl9nZXRmcmFtZSgyKQotICAgICAgICBjYWxsZXJfbW9kdWxlID0gY2FsbGVyLmZfZ2xvYmFscy5nZXQoJ19fbmFtZV9fJywnJykKLSAgICAgICAgY2FsbGVyX25hbWUgPSBjYWxsZXIuZl9jb2RlLmNvX25hbWUKLQotICAgICAgICBpZiBjYWxsZXJfbW9kdWxlICE9ICdkaXN0dXRpbHMuZGlzdCcgb3IgY2FsbGVyX25hbWUhPSdydW5fY29tbWFuZHMnOgotICAgICAgICAgICAgIyBXZSB3ZXJlbid0IGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3Igc2V0dXAoKSwgc28gd2UKLSAgICAgICAgICAgICMgc2hvdWxkIHJ1biBpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUgdG8gc3VwcG9ydCBiZGlzdF8qCi0gICAgICAgICAgICAjIGNvbW1hbmRzLgotICAgICAgICAgICAgX2luc3RhbGwucnVuKHNlbGYpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmRvX2VnZ19pbnN0YWxsKCkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLSAgICBkZWYgZG9fZWdnX2luc3RhbGwoc2VsZik6Ci0KLSAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKLQotICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCi0gICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbiwgYXJncz0ieCIsIHJvb3Q9c2VsZi5yb290LCByZWNvcmQ9c2VsZi5yZWNvcmQsCi0gICAgICAgICkKLSAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKSAgIyBmaW5hbGl6ZSBiZWZvcmUgYmRpc3RfZWdnIG11bmdlcyBpbnN0YWxsIGNtZAotCi0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2JkaXN0X2VnZycpCi0gICAgICAgIGFyZ3MgPSBbc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCdiZGlzdF9lZ2cnKS5lZ2dfb3V0cHV0XQotCi0gICAgICAgIGlmIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbToKLSAgICAgICAgICAgICMgQm9vdHN0cmFwIHNlbGYtaW5zdGFsbGF0aW9uIG9mIHNldHVwdG9vbHMKLSAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSkKLQotICAgICAgICBjbWQuYXJncyA9IGFyZ3MKLSAgICAgICAgY21kLnJ1bigpCi0gICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTkzZTkxYS4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKLWZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAotaW1wb3J0IG9zLCBzaHV0aWwsIHBrZ19yZXNvdXJjZXMKLQotY2xhc3MgaW5zdGFsbF9lZ2dfaW5mbyhDb21tYW5kKToKLSAgICAiIiJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIiIiCi0KLSAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIgotCi0gICAgdXNlcl9vcHRpb25zID0gWwotICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRvIiksCi0gICAgXQotCi0gICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKLQotICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgotICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCgnaW5zdGFsbF9kaXInLCdpbnN0YWxsX2RpcicpKQotICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQotICAgICAgICBiYXNlbmFtZSA9IHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAotICAgICAgICAgICAgTm9uZSwgTm9uZSwgZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24KLSAgICAgICAgKS5lZ2dfbmFtZSgpKycuZWdnLWluZm8nCi0gICAgICAgIHNlbGYuc291cmNlID0gZWlfY21kLmVnZ19pbmZvCi0gICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQotICAgICAgICBzZWxmLm91dHB1dHMgPSBbc2VsZi50YXJnZXRdCi0KLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCi0gICAgICAgIHRhcmdldCA9IHNlbGYudGFyZ2V0Ci0gICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi50YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoc2VsZi50YXJnZXQpOgotICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoc2VsZi50YXJnZXQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQotICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFyZ2V0KToKLSAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssKHNlbGYudGFyZ2V0LCksIlJlbW92aW5nICIrc2VsZi50YXJnZXQpCi0gICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICBwa2dfcmVzb3VyY2VzLmVuc3VyZV9kaXJlY3Rvcnkoc2VsZi50YXJnZXQpCi0gICAgICAgIHNlbGYuZXhlY3V0ZShzZWxmLmNvcHl0cmVlLCAoKSwKLSAgICAgICAgICAgICJDb3B5aW5nICVzIHRvICVzIiAlIChzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQpCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5pbnN0YWxsX25hbWVzcGFjZXMoKQotCi0gICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRzCi0KLSAgICBkZWYgY29weXRyZWUoc2VsZik6Ci0gICAgICAgICMgQ29weSB0aGUgLmVnZy1pbmZvIHRyZWUgdG8gc2l0ZS1wYWNrYWdlcwotICAgICAgICBkZWYgc2tpbW1lcihzcmMsZHN0KToKLSAgICAgICAgICAgICMgZmlsdGVyIG91dCBzb3VyY2UtY29udHJvbCBkaXJlY3Rvcmllczsgbm90ZSB0aGF0ICdzcmMnIGlzIGFsd2F5cwotICAgICAgICAgICAgIyBhICcvJy1zZXBhcmF0ZWQgcGF0aCwgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gICdkc3QnIGlzIGEKLSAgICAgICAgICAgICMgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aC4KLSAgICAgICAgICAgIGZvciBza2lwIGluICcuc3ZuLycsJ0NWUy8nOgotICAgICAgICAgICAgICAgIGlmIHNyYy5zdGFydHN3aXRoKHNraXApIG9yICcvJytza2lwIGluIHNyYzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZHN0KQotICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3B5aW5nICVzIHRvICVzIiwgc3JjLCBkc3QpCi0gICAgICAgICAgICByZXR1cm4gZHN0Ci0gICAgICAgIHVucGFja19hcmNoaXZlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCwgc2tpbW1lcikKLQotICAgIGRlZiBpbnN0YWxsX25hbWVzcGFjZXMoc2VsZik6Ci0gICAgICAgIG5zcCA9IChzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXMgb3IgW10pWzpdCi0gICAgICAgIGlmIG5vdCBuc3A6IHJldHVybgotICAgICAgICBuc3Auc29ydCgpICAjIHNldCB1cCBzaG9ydGVyIG5hbWVzIGZpcnN0Ci0gICAgICAgIGZpbGVuYW1lLGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi50YXJnZXQpCi0gICAgICAgIGZpbGVuYW1lICs9ICctbnNwa2cucHRoJzsgc2VsZi5vdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKLSAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMiLGZpbGVuYW1lKQotICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgotICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3diJykKLSAgICAgICAgICAgIGZvciBwa2cgaW4gbnNwOgotICAgICAgICAgICAgICAgIHB0aCA9IHR1cGxlKHBrZy5zcGxpdCgnLicpKQotICAgICAgICAgICAgICAgIGYud3JpdGUoCi0gICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzLG5ldyxvczsgIgotICAgICAgICAgICAgICAgICAgICAicCA9IG9zLnBhdGguam9pbihzeXMuX2dldGZyYW1lKDEpLmZfbG9jYWxzWydzaXRlZGlyJ10sICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIqJShwdGgpcik7ICIKLSAgICAgICAgICAgICAgICAgICAgImllID0gb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHAsJ19faW5pdF9fLnB5JykpOyAiCi0gICAgICAgICAgICAgICAgICAgICJtID0gbm90IGllIGFuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAic3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCglKHBrZylyLG5ldy5tb2R1bGUoJShwa2cpcikpOyAiCi0gICAgICAgICAgICAgICAgICAgICJtcCA9IChtIG9yIFtdKSBhbmQgbS5fX2RpY3RfXy5zZXRkZWZhdWx0KCdfX3BhdGhfXycsW10pOyAiCi0gICAgICAgICAgICAgICAgICAgICIocCBub3QgaW4gbXApIGFuZCBtcC5hcHBlbmQocClcbiIKLSAgICAgICAgICAgICAgICAgICAgJSBsb2NhbHMoKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIGYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YzhkZmUuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9saWIgaW1wb3J0IGluc3RhbGxfbGliIGFzIF9pbnN0YWxsX2xpYgotaW1wb3J0IG9zCi0KLWNsYXNzIGluc3RhbGxfbGliKF9pbnN0YWxsX2xpYik6Ci0gICAgIiIiRG9uJ3QgYWRkIGNvbXBpbGVkIGZsYWdzIHRvIGZpbGVuYW1lcyBvZiBub24tUHl0aG9uIGZpbGVzIiIiCi0KLSAgICBkZWYgX2J5dGVjb2RlX2ZpbGVuYW1lcyAoc2VsZiwgcHlfZmlsZW5hbWVzKToKLSAgICAgICAgYnl0ZWNvZGVfZmlsZXMgPSBbXQotICAgICAgICBmb3IgcHlfZmlsZSBpbiBweV9maWxlbmFtZXM6Ci0gICAgICAgICAgICBpZiBub3QgcHlfZmlsZS5lbmRzd2l0aCgnLnB5Jyk6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIHNlbGYuY29tcGlsZToKLSAgICAgICAgICAgICAgICBieXRlY29kZV9maWxlcy5hcHBlbmQocHlfZmlsZSArICJjIikKLSAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemUgPiAwOgotICAgICAgICAgICAgICAgIGJ5dGVjb2RlX2ZpbGVzLmFwcGVuZChweV9maWxlICsgIm8iKQotCi0gICAgICAgIHJldHVybiBieXRlY29kZV9maWxlcwotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgc2VsZi5idWlsZCgpCi0gICAgICAgIG91dGZpbGVzID0gc2VsZi5pbnN0YWxsKCkKLSAgICAgICAgaWYgb3V0ZmlsZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAjIGFsd2F5cyBjb21waWxlLCBpbiBjYXNlIHdlIGhhdmUgYW55IGV4dGVuc2lvbiBzdHVicyB0byBkZWFsIHdpdGgKLSAgICAgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKG91dGZpbGVzKQotCi0gICAgZGVmIGdldF9leGNsdXNpb25zKHNlbGYpOgotICAgICAgICBleGNsdWRlID0ge30KLSAgICAgICAgbnNwID0gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzCi0KLSAgICAgICAgaWYgKG5zcCBhbmQgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKQotICAgICAgICAgICAgICAgLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZAotICAgICAgICApOgotICAgICAgICAgICAgZm9yIHBrZyBpbiBuc3A6Ci0gICAgICAgICAgICAgICAgcGFydHMgPSBwa2cuc3BsaXQoJy4nKQotICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzOgotICAgICAgICAgICAgICAgICAgICBwa2dkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgKnBhcnRzKQotICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiAnX19pbml0X18ucHknLCAnX19pbml0X18ucHljJywgJ19faW5pdF9fLnB5byc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlW29zLnBhdGguam9pbihwa2dkaXIsZildID0gMQotICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQotICAgICAgICByZXR1cm4gZXhjbHVkZQotCi0gICAgZGVmIGNvcHlfdHJlZSgKLSAgICAgICAgc2VsZiwgaW5maWxlLCBvdXRmaWxlLAotICAgICAgICBwcmVzZXJ2ZV9tb2RlPTEsIHByZXNlcnZlX3RpbWVzPTEsIHByZXNlcnZlX3N5bWxpbmtzPTAsIGxldmVsPTEKLSAgICApOgotICAgICAgICBhc3NlcnQgcHJlc2VydmVfbW9kZSBhbmQgcHJlc2VydmVfdGltZXMgYW5kIG5vdCBwcmVzZXJ2ZV9zeW1saW5rcwotICAgICAgICBleGNsdWRlID0gc2VsZi5nZXRfZXhjbHVzaW9ucygpCi0KLSAgICAgICAgaWYgbm90IGV4Y2x1ZGU6Ci0gICAgICAgICAgICByZXR1cm4gX2luc3RhbGxfbGliLmNvcHlfdHJlZShzZWxmLCBpbmZpbGUsIG91dGZpbGUpCi0KLSAgICAgICAgIyBFeGNsdWRlIG5hbWVzcGFjZSBwYWNrYWdlIF9faW5pdF9fLnB5KiBmaWxlcyBmcm9tIHRoZSBvdXRwdXQKLQotICAgICAgICBmcm9tIHNldHVwdG9vbHMuYXJjaGl2ZV91dGlsIGltcG9ydCB1bnBhY2tfZGlyZWN0b3J5Ci0gICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKLQotICAgICAgICBvdXRmaWxlcyA9IFtdCi0KLSAgICAgICAgZGVmIHBmKHNyYywgZHN0KToKLSAgICAgICAgICAgIGlmIGRzdCBpbiBleGNsdWRlOgotICAgICAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBpbnN0YWxsYXRpb24gb2YgJXMgKG5hbWVzcGFjZSBwYWNrYWdlKSIsZHN0KQotICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgICAgICAgICBsb2cuaW5mbygiY29weWluZyAlcyAtPiAlcyIsIHNyYywgb3MucGF0aC5kaXJuYW1lKGRzdCkpCi0gICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQoZHN0KQotICAgICAgICAgICAgcmV0dXJuIGRzdAotCi0gICAgICAgIHVucGFja19kaXJlY3RvcnkoaW5maWxlLCBvdXRmaWxlLCBwZikKLSAgICAgICAgcmV0dXJuIG91dGZpbGVzCi0KLSAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6Ci0gICAgICAgIG91dHB1dHMgPSBfaW5zdGFsbF9saWIuZ2V0X291dHB1dHMoc2VsZikKLSAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQotICAgICAgICBpZiBleGNsdWRlOgotICAgICAgICAgICAgcmV0dXJuIFtmIGZvciBmIGluIG91dHB1dHMgaWYgZiBub3QgaW4gZXhjbHVkZV0KLSAgICAgICAgcmV0dXJuIG91dHB1dHMKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5NTU4YmYuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1mcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfc2NyaXB0cyBpbXBvcnQgaW5zdGFsbF9zY3JpcHRzIFwKLSAgICAgYXMgX2luc3RhbGxfc2NyaXB0cwotZnJvbSBlYXN5X2luc3RhbGwgaW1wb3J0IGdldF9zY3JpcHRfYXJncywgc3lzX2V4ZWN1dGFibGUKLWZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIGVuc3VyZV9kaXJlY3RvcnkKLWltcG9ydCBvcwotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwotCi1jbGFzcyBpbnN0YWxsX3NjcmlwdHMoX2luc3RhbGxfc2NyaXB0cyk6Ci0gICAgIiIiRG8gbm9ybWFsIHNjcmlwdCBpbnN0YWxsLCBwbHVzIGFueSBlZ2dfaW5mbyB3cmFwcGVyIHNjcmlwdHMiIiIKLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIF9pbnN0YWxsX3NjcmlwdHMuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCi0gICAgICAgIHNlbGYubm9fZXAgPSBGYWxzZQotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQotICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgotICAgICAgICAgICAgX2luc3RhbGxfc2NyaXB0cy5ydW4oc2VsZikgICMgcnVuIGZpcnN0IHRvIHNldCB1cCBzZWxmLm91dGZpbGVzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLm91dGZpbGVzID0gW10KLSAgICAgICAgaWYgc2VsZi5ub19lcDoKLSAgICAgICAgICAgICMgZG9uJ3QgaW5zdGFsbCBlbnRyeSBwb2ludCBzY3JpcHRzIGludG8gLmVnZyBmaWxlIQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKLSAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigKLSAgICAgICAgICAgIGVpX2NtZC5lZ2dfYmFzZSwgUGF0aE1ldGFkYXRhKGVpX2NtZC5lZ2dfYmFzZSwgZWlfY21kLmVnZ19pbmZvKSwKLSAgICAgICAgICAgIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAotICAgICAgICApCi0gICAgICAgIGJzX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKLSAgICAgICAgZXhlY3V0YWJsZSA9IGdldGF0dHIoYnNfY21kLCdleGVjdXRhYmxlJyxzeXNfZXhlY3V0YWJsZSkKLQotICAgICAgICBmb3IgYXJncyBpbiBnZXRfc2NyaXB0X2FyZ3MoZGlzdCwgZXhlY3V0YWJsZSk6Ci0gICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKLQotCi0KLQotCi0KLQotICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgKmlnbm9yZWQpOgotICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCi0gICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLmluc3RhbGxfZGlyKQotICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgc2NyaXB0X25hbWUpCi0gICAgICAgIHNlbGYub3V0ZmlsZXMuYXBwZW5kKHRhcmdldCkKLQotICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgotICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCi0gICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsInciK21vZGUpCi0gICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0LDA3NTUpCi0gICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBvcy5lcnJvcik6Ci0gICAgICAgICAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFhYjMxMi4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLWltcG9ydCBkaXN0dXRpbHMsIG9zCi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKLWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwotZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCi0KLWNsYXNzIHJvdGF0ZShDb21tYW5kKToKLSAgICAiIiJEZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucyIiIgotCi0gICAgZGVzY3JpcHRpb24gPSAiZGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMsIGtlZXBpbmcgTiBuZXdlc3QgZmlsZXMiCi0gICAgdXNlcl9vcHRpb25zID0gWwotICAgICAgICAoJ21hdGNoPScsICAgICdtJywgInBhdHRlcm5zIHRvIG1hdGNoIChyZXF1aXJlZCkiKSwKLSAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsICJkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpc3RyaWJ1dGlvbnMgYXJlIiksCi0gICAgICAgICgna2VlcD0nLCAgICAgJ2snLCAibnVtYmVyIG9mIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbnMgdG8ga2VlcCIpLAotICAgIF0KLQotICAgIGJvb2xlYW5fb3B0aW9ucyA9IFtdCi0KLSAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgotICAgICAgICBzZWxmLm1hdGNoID0gTm9uZQotICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQotICAgICAgICBzZWxmLmtlZXAgPSBOb25lCi0KLSAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi5tYXRjaCBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCi0gICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSAoY29tbWEtc2VwYXJhdGVkKSBtYXRjaCBwYXR0ZXJucyAiCi0gICAgICAgICAgICAgICAgIihlLmcuICcuemlwJyBvciAnLmVnZycpIgotICAgICAgICAgICAgKQotICAgICAgICBpZiBzZWxmLmtlZXAgaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgbnVtYmVyIG9mIGZpbGVzIHRvIGtlZXAiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmtlZXAgPSBpbnQoc2VsZi5rZWVwKQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCItLWtlZXAgbXVzdCBiZSBhbiBpbnRlZ2VyIikKLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1hdGNoLCBiYXNlc3RyaW5nKToKLSAgICAgICAgICAgIHNlbGYubWF0Y2ggPSBbCi0gICAgICAgICAgICAgICAgY29udmVydF9wYXRoKHAuc3RyaXAoKSkgZm9yIHAgaW4gc2VsZi5tYXRjaC5zcGxpdCgnLCcpCi0gICAgICAgICAgICBdCi0gICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQotICAgICAgICBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKLSAgICAgICAgZm9yIHBhdHRlcm4gaW4gc2VsZi5tYXRjaDoKLSAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKycqJytwYXR0ZXJuCi0gICAgICAgICAgICBmaWxlcyA9IGdsb2Iob3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIscGF0dGVybikpCi0gICAgICAgICAgICBmaWxlcyA9IFsob3MucGF0aC5nZXRtdGltZShmKSxmKSBmb3IgZiBpbiBmaWxlc10KLSAgICAgICAgICAgIGZpbGVzLnNvcnQoKQotICAgICAgICAgICAgZmlsZXMucmV2ZXJzZSgpCi0KLSAgICAgICAgICAgIGxvZy5pbmZvKCIlZCBmaWxlKHMpIG1hdGNoaW5nICVzIiwgbGVuKGZpbGVzKSwgcGF0dGVybikKLSAgICAgICAgICAgIGZpbGVzID0gZmlsZXNbc2VsZi5rZWVwOl0KLSAgICAgICAgICAgIGZvciAodCxmKSBpbiBmaWxlczoKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgJXMiLCBmKQotICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDljNThkNzIuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLWltcG9ydCBkaXN0dXRpbHMsIG9zCi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKLWZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcsIG9wdGlvbl9iYXNlCi0KLWNsYXNzIHNhdmVvcHRzKG9wdGlvbl9iYXNlKToKLSAgICAiIiJTYXZlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgZmlsZSIiIgotCi0gICAgZGVzY3JpcHRpb24gPSAic2F2ZSBzdXBwbGllZCBvcHRpb25zIHRvIHNldHVwLmNmZyBvciBvdGhlciBjb25maWcgZmlsZSIKLQotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgIGRpc3QgPSBzZWxmLmRpc3RyaWJ1dGlvbgotICAgICAgICBjb21tYW5kcyA9IGRpc3QuY29tbWFuZF9vcHRpb25zLmtleXMoKQotICAgICAgICBzZXR0aW5ncyA9IHt9Ci0KLSAgICAgICAgZm9yIGNtZCBpbiBjb21tYW5kczoKLQotICAgICAgICAgICAgaWYgY21kPT0nc2F2ZW9wdHMnOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgZG9uJ3Qgc2F2ZSBvdXIgb3duIG9wdGlvbnMhCi0KLSAgICAgICAgICAgIGZvciBvcHQsKHNyYyx2YWwpIGluIGRpc3QuZ2V0X29wdGlvbl9kaWN0KGNtZCkuaXRlbXMoKToKLSAgICAgICAgICAgICAgICBpZiBzcmM9PSJjb21tYW5kIGxpbmUiOgotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRkZWZhdWx0KGNtZCx7fSlbb3B0XSA9IHZhbAotCi0gICAgICAgIGVkaXRfY29uZmlnKHNlbGYuZmlsZW5hbWUsIHNldHRpbmdzLCBzZWxmLmRyeV9ydW4pCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI5Y2QzYy4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NkaXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLWZyb20gZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHNkaXN0IGFzIF9zZGlzdAotZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCi1pbXBvcnQgb3MsIHJlLCBzeXMsIHBrZ19yZXNvdXJjZXMKLQotZW50aXRpZXMgPSBbCi0gICAgKCImbHQ7IiwiPCIpLCAoIiZndDsiLCAiPiIpLCAoIiZxdW90OyIsICciJyksICgiJmFwb3M7IiwgIiciKSwKLSAgICAoIiZhbXA7IiwgIiYiKQotXQotCi1kZWYgdW5lc2NhcGUoZGF0YSk6Ci0gICAgZm9yIG9sZCxuZXcgaW4gZW50aXRpZXM6Ci0gICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2Uob2xkLG5ldykKLSAgICByZXR1cm4gZGF0YQotCi1kZWYgcmVfZmluZGVyKHBhdHRlcm4sIHBvc3Rwcm9jPU5vbmUpOgotICAgIGRlZiBmaW5kKGRpcm5hbWUsIGZpbGVuYW1lKToKLSAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3JVJykKLSAgICAgICAgZGF0YSA9IGYucmVhZCgpCi0gICAgICAgIGYuY2xvc2UoKQotICAgICAgICBmb3IgbWF0Y2ggaW4gcGF0dGVybi5maW5kaXRlcihkYXRhKToKLSAgICAgICAgICAgIHBhdGggPSBtYXRjaC5ncm91cCgxKQotICAgICAgICAgICAgaWYgcG9zdHByb2M6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBvc3Rwcm9jKHBhdGgpCi0gICAgICAgICAgICB5aWVsZCBqb2lucGF0aChkaXJuYW1lLHBhdGgpCi0gICAgcmV0dXJuIGZpbmQKLQotZGVmIGpvaW5wYXRoKHByZWZpeCxzdWZmaXgpOgotICAgIGlmIG5vdCBwcmVmaXg6Ci0gICAgICAgIHJldHVybiBzdWZmaXgKLSAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCxzdWZmaXgpCi0KLQotCi0KLQotCi0KLQotCi0KLQotZGVmIHdhbGtfcmV2Y3RybChkaXJuYW1lPScnKToKLSAgICAiIiJGaW5kIGFsbCBmaWxlcyB1bmRlciByZXZpc2lvbiBjb250cm9sIiIiCi0gICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ3NldHVwdG9vbHMuZmlsZV9maW5kZXJzJyk6Ci0gICAgICAgIGZvciBpdGVtIGluIGVwLmxvYWQoKShkaXJuYW1lKToKLSAgICAgICAgICAgIHlpZWxkIGl0ZW0KLQotZGVmIF9kZWZhdWx0X3JldmN0cmwoZGlybmFtZT0nJyk6Ci0gICAgZm9yIHBhdGgsIGZpbmRlciBpbiBmaW5kZXJzOgotICAgICAgICBwYXRoID0gam9pbnBhdGgoZGlybmFtZSxwYXRoKQotICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKLSAgICAgICAgICAgIGZvciBwYXRoIGluIGZpbmRlcihkaXJuYW1lLHBhdGgpOgotICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYXRoCi0gICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgotICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBfZGVmYXVsdF9yZXZjdHJsKHBhdGgpOgotICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQotCi1kZWYgZXh0ZXJuYWxzX2ZpbmRlcihkaXJuYW1lLCBmaWxlbmFtZSk6Ci0gICAgIiIiRmluZCBhbnkgJ3N2bjpleHRlcm5hbHMnIGRpcmVjdG9yaWVzIiIiCi0gICAgZm91bmQgPSBGYWxzZQotICAgIGYgPSBvcGVuKGZpbGVuYW1lLCdyYicpCi0gICAgZm9yIGxpbmUgaW4gaXRlcihmLnJlYWRsaW5lLCAnJyk6ICAgICMgY2FuJ3QgdXNlIGRpcmVjdCBpdGVyIQotICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoKQotICAgICAgICBpZiBsZW4ocGFydHMpPT0yOgotICAgICAgICAgICAga2luZCxsZW5ndGggPSBwYXJ0cwotICAgICAgICAgICAgZGF0YSA9IGYucmVhZChpbnQobGVuZ3RoKSkKLSAgICAgICAgICAgIGlmIGtpbmQ9PSdLJyBhbmQgZGF0YT09J3N2bjpleHRlcm5hbHMnOgotICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQotICAgICAgICAgICAgZWxpZiBraW5kPT0nVicgYW5kIGZvdW5kOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgZWxzZToKLSAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHJldHVybgotCi0gICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6Ci0gICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgpCi0gICAgICAgIGlmIHBhcnRzOgotICAgICAgICAgICAgeWllbGQgam9pbnBhdGgoZGlybmFtZSwgcGFydHNbMF0pCi0KLQotZmluZGVycyA9IFsKLSAgICAoY29udmVydF9wYXRoKCdDVlMvRW50cmllcycpLAotICAgICAgICByZV9maW5kZXIocmUuY29tcGlsZShyIl5cdz8vKFteL10rKS8iLCByZS5NKSkpLAotICAgIChjb252ZXJ0X3BhdGgoJy5zdm4vZW50cmllcycpLAotICAgICAgICByZV9maW5kZXIoCi0gICAgICAgICAgICByZS5jb21waWxlKHInbmFtZT0iKFteIl0rKSIoPyFbXj5dK2RlbGV0ZWQ9InRydWUiKScsIHJlLkkpLAotICAgICAgICAgICAgdW5lc2NhcGUKLSAgICAgICAgKQotICAgICksCi0gICAgKGNvbnZlcnRfcGF0aCgnLnN2bi9kaXItcHJvcHMnKSwgZXh0ZXJuYWxzX2ZpbmRlciksCi1dCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1jbGFzcyBzZGlzdChfc2Rpc3QpOgotICAgICIiIlNtYXJ0IHNkaXN0IHRoYXQgZmluZHMgYW55dGhpbmcgc3VwcG9ydGVkIGJ5IHJldmlzaW9uIGNvbnRyb2wiIiIKLQotICAgIHVzZXJfb3B0aW9ucyA9IFsKLSAgICAgICAgKCdmb3JtYXRzPScsIE5vbmUsCi0gICAgICAgICAiZm9ybWF0cyBmb3Igc291cmNlIGRpc3RyaWJ1dGlvbiAoY29tbWEtc2VwYXJhdGVkIGxpc3QpIiksCi0gICAgICAgICgna2VlcC10ZW1wJywgJ2snLAotICAgICAgICAgImtlZXAgdGhlIGRpc3RyaWJ1dGlvbiB0cmVlIGFyb3VuZCBhZnRlciBjcmVhdGluZyAiICsKLSAgICAgICAgICJhcmNoaXZlIGZpbGUocykiKSwKLSAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCi0gICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpIGluICIKLSAgICAgICAgICJbZGVmYXVsdDogZGlzdF0iKSwKLSAgICAgICAgXQotCi0gICAgbmVnYXRpdmVfb3B0ID0ge30KLQotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKLSAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKLSAgICAgICAgc2VsZi5maWxlbGlzdCA9IGVpX2NtZC5maWxlbGlzdAotICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oZWlfY21kLmVnZ19pbmZvLCdTT1VSQ0VTLnR4dCcpKQotCi0gICAgICAgIHNlbGYuY2hlY2tfbWV0YWRhdGEoKQotICAgICAgICBzZWxmLm1ha2VfZGlzdHJpYnV0aW9uKCkKLQotICAgICAgICBkaXN0X2ZpbGVzID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwnZGlzdF9maWxlcycsW10pCi0gICAgICAgIGZvciBmaWxlIGluIHNlbGYuYXJjaGl2ZV9maWxlczoKLSAgICAgICAgICAgIGRhdGEgPSAoJ3NkaXN0JywgJycsIGZpbGUpCi0gICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBkaXN0X2ZpbGVzOgotICAgICAgICAgICAgICAgIGRpc3RfZmlsZXMuYXBwZW5kKGRhdGEpCi0KLSAgICBkZWYgcmVhZF90ZW1wbGF0ZShzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgX3NkaXN0LnJlYWRfdGVtcGxhdGUoc2VsZikKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgIyBncm9keSBoYWNrIHRvIGNsb3NlIHRoZSB0ZW1wbGF0ZSBmaWxlIChNQU5JRkVTVC5pbikKLSAgICAgICAgICAgICMgdGhpcyBwcmV2ZW50cyBlYXN5X2luc3RhbGwncyBhdHRlbXB0IGF0IGRlbGV0aW5nIHRoZSBmaWxlIGZyb20KLSAgICAgICAgICAgICMgZHlpbmcgYW5kIHRodXMgbWFza2luZyB0aGUgcmVhbCBlcnJvcgotICAgICAgICAgICAgc3lzLmV4Y19pbmZvKClbMl0udGJfbmV4dC50Yl9mcmFtZS5mX2xvY2Fsc1sndGVtcGxhdGUnXS5jbG9zZSgpCi0gICAgICAgICAgICByYWlzZQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTBjMTA1OC4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi1pbXBvcnQgZGlzdHV0aWxzLCBvcwotZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCi1mcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKLWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgotCi1fX2FsbF9fID0gWydjb25maWdfZmlsZScsICdlZGl0X2NvbmZpZycsICdvcHRpb25fYmFzZScsICdzZXRvcHQnXQotCi0KLWRlZiBjb25maWdfZmlsZShraW5kPSJsb2NhbCIpOgotICAgICIiIkdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIGRpc3R1dGlscywgbG9jYWwsIGdsb2JhbCwgb3IgcGVyLXVzZXIgY29uZmlnCi0KLSAgICBga2luZGAgbXVzdCBiZSBvbmUgb2YgImxvY2FsIiwgImdsb2JhbCIsIG9yICJ1c2VyIgotICAgICIiIgotICAgIGlmIGtpbmQ9PSdsb2NhbCc6Ci0gICAgICAgIHJldHVybiAnc2V0dXAuY2ZnJwotICAgIGlmIGtpbmQ9PSdnbG9iYWwnOgotICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAotICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRpc3R1dGlscy5fX2ZpbGVfXyksJ2Rpc3R1dGlscy5jZmcnCi0gICAgICAgICkKLSAgICBpZiBraW5kPT0ndXNlcic6Ci0gICAgICAgIGRvdCA9IG9zLm5hbWU9PSdwb3NpeCcgYW5kICcuJyBvciAnJwotICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKGNvbnZlcnRfcGF0aCgifi8lc3B5ZGlzdHV0aWxzLmNmZyIgJSBkb3QpKQotICAgIHJhaXNlIFZhbHVlRXJyb3IoCi0gICAgICAgICJjb25maWdfZmlsZSgpIHR5cGUgbXVzdCBiZSAnbG9jYWwnLCAnZ2xvYmFsJywgb3IgJ3VzZXInIiwga2luZAotICAgICkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWRlZiBlZGl0X2NvbmZpZyhmaWxlbmFtZSwgc2V0dGluZ3MsIGRyeV9ydW49RmFsc2UpOgotICAgICIiIkVkaXQgYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gaW5jbHVkZSBgc2V0dGluZ3NgCi0KLSAgICBgc2V0dGluZ3NgIGlzIGEgZGljdGlvbmFyeSBvZiBkaWN0aW9uYXJpZXMgb3IgYGBOb25lYGAgdmFsdWVzLCBrZXllZCBieQotICAgIGNvbW1hbmQvc2VjdGlvbiBuYW1lLiAgQSBgYE5vbmVgYCB2YWx1ZSBtZWFucyB0byBkZWxldGUgdGhlIGVudGlyZSBzZWN0aW9uLAotICAgIHdoaWxlIGEgZGljdGlvbmFyeSBsaXN0cyBzZXR0aW5ncyB0byBiZSBjaGFuZ2VkIG9yIGRlbGV0ZWQgaW4gdGhhdCBzZWN0aW9uLgotICAgIEEgc2V0dGluZyBvZiBgYE5vbmVgYCBtZWFucyB0byBkZWxldGUgdGhhdCBzZXR0aW5nLgotICAgICIiIgotICAgIGZyb20gQ29uZmlnUGFyc2VyIGltcG9ydCBSYXdDb25maWdQYXJzZXIKLSAgICBsb2cuZGVidWcoIlJlYWRpbmcgY29uZmlndXJhdGlvbiBmcm9tICVzIiwgZmlsZW5hbWUpCi0gICAgb3B0cyA9IFJhd0NvbmZpZ1BhcnNlcigpCi0gICAgb3B0cy5yZWFkKFtmaWxlbmFtZV0pCi0gICAgZm9yIHNlY3Rpb24sIG9wdGlvbnMgaW4gc2V0dGluZ3MuaXRlbXMoKToKLSAgICAgICAgaWYgb3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nIHNlY3Rpb24gWyVzXSBmcm9tICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCi0gICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiBub3Qgb3B0cy5oYXNfc2VjdGlvbihzZWN0aW9uKToKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBuZXcgc2VjdGlvbiBbJXNdIHRvICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgb3B0cy5hZGRfc2VjdGlvbihzZWN0aW9uKQotICAgICAgICAgICAgZm9yIG9wdGlvbix2YWx1ZSBpbiBvcHRpb25zLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyAlcy4lcyBmcm9tICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9vcHRpb24oc2VjdGlvbixvcHRpb24pCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRzLm9wdGlvbnMoc2VjdGlvbik6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgZW1wdHkgWyVzXSBzZWN0aW9uIGZyb20gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGZpbGVuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nICVzLiVzIHRvICVyIGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUsIGZpbGVuYW1lCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgb3B0cy5zZXQoc2VjdGlvbixvcHRpb24sdmFsdWUpCi0KLSAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIGZpbGVuYW1lKQotICAgIGlmIG5vdCBkcnlfcnVuOgotICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwndycpOyBvcHRzLndyaXRlKGYpOyBmLmNsb3NlKCkKLQotY2xhc3Mgb3B0aW9uX2Jhc2UoQ29tbWFuZCk6Ci0gICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBtZXNzIHdpdGggY29uZmlnIGZpbGVzIiIiCi0KLSAgICB1c2VyX29wdGlvbnMgPSBbCi0gICAgICAgICgnZ2xvYmFsLWNvbmZpZycsICdnJywKLSAgICAgICAgICAgICAgICAgInNhdmUgb3B0aW9ucyB0byB0aGUgc2l0ZS13aWRlIGRpc3R1dGlscy5jZmcgZmlsZSIpLAotICAgICAgICAoJ3VzZXItY29uZmlnJywgJ3UnLAotICAgICAgICAgICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBjdXJyZW50IHVzZXIncyBweWRpc3R1dGlscy5jZmcgZmlsZSIpLAotICAgICAgICAoJ2ZpbGVuYW1lPScsICdmJywKLSAgICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24gZmlsZSB0byB1c2UgKGRlZmF1bHQ9c2V0dXAuY2ZnKSIpLAotICAgIF0KLQotICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsKLSAgICAgICAgJ2dsb2JhbC1jb25maWcnLCAndXNlci1jb25maWcnLAotICAgIF0KLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYuZ2xvYmFsX2NvbmZpZyA9IE5vbmUKLSAgICAgICAgc2VsZi51c2VyX2NvbmZpZyAgID0gTm9uZQotICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQotCi0gICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIGZpbGVuYW1lcyA9IFtdCi0gICAgICAgIGlmIHNlbGYuZ2xvYmFsX2NvbmZpZzoKLSAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2dsb2JhbCcpKQotICAgICAgICBpZiBzZWxmLnVzZXJfY29uZmlnOgotICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgndXNlcicpKQotICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChzZWxmLmZpbGVuYW1lKQotICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgotICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnbG9jYWwnKSkKLSAgICAgICAgaWYgbGVuKGZpbGVuYW1lcyk+MToKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAotICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgb25seSBvbmUgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiIsCi0gICAgICAgICAgICAgICAgZmlsZW5hbWVzCi0gICAgICAgICAgICApCi0gICAgICAgIHNlbGYuZmlsZW5hbWUsID0gZmlsZW5hbWVzCi0KLQotCi0KLWNsYXNzIHNldG9wdChvcHRpb25fYmFzZSk6Ci0gICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKLQotICAgIGRlc2NyaXB0aW9uID0gInNldCBhbiBvcHRpb24gaW4gc2V0dXAuY2ZnIG9yIGFub3RoZXIgY29uZmlnIGZpbGUiCi0KLSAgICB1c2VyX29wdGlvbnMgPSBbCi0gICAgICAgICgnY29tbWFuZD0nLCAnYycsICdjb21tYW5kIHRvIHNldCBhbiBvcHRpb24gZm9yJyksCi0gICAgICAgICgnb3B0aW9uPScsICAnbycsICAnb3B0aW9uIHRvIHNldCcpLAotICAgICAgICAoJ3NldC12YWx1ZT0nLCAgICdzJywgJ3ZhbHVlIG9mIHRoZSBvcHRpb24nKSwKLSAgICAgICAgKCdyZW1vdmUnLCAgICdyJywgJ3JlbW92ZSAodW5zZXQpIHRoZSB2YWx1ZScpLAotICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKLQotICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9wdGlvbl9iYXNlLmJvb2xlYW5fb3B0aW9ucyArIFsncmVtb3ZlJ10KLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIG9wdGlvbl9iYXNlLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQotICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCi0gICAgICAgIHNlbGYub3B0aW9uID0gTm9uZQotICAgICAgICBzZWxmLnNldF92YWx1ZSA9IE5vbmUKLSAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCi0KLSAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQotICAgICAgICBpZiBzZWxmLmNvbW1hbmQgaXMgTm9uZSBvciBzZWxmLm9wdGlvbiBpcyBOb25lOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSAtLWNvbW1hbmQgKmFuZCogLS1vcHRpb24iKQotICAgICAgICBpZiBzZWxmLnNldF92YWx1ZSBpcyBOb25lIGFuZCBub3Qgc2VsZi5yZW1vdmU6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tc2V0LXZhbHVlIG9yIC0tcmVtb3ZlIikKLQotICAgIGRlZiBydW4oc2VsZik6Ci0gICAgICAgIGVkaXRfY29uZmlnKAotICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgewotICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZDoge3NlbGYub3B0aW9uLnJlcGxhY2UoJy0nLCdfJyk6c2VsZi5zZXRfdmFsdWV9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgc2VsZi5kcnlfcnVuCi0gICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmY2EzNS4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCi1pbXBvcnQgc3lzCi1mcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKLWZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RMb2FkZXIsIG1haW4KLQotY2xhc3MgU2Nhbm5pbmdMb2FkZXIoVGVzdExvYWRlcik6Ci0KLSAgICBkZWYgbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUpOgotICAgICAgICAiIiJSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBtb2R1bGUKLQotICAgICAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSwgbG9hZCB0ZXN0cyBmcm9tIGFsbCB0aGUgbW9kdWxlcyBpbiBpdC4KLSAgICAgICAgSWYgdGhlIG1vZHVsZSBoYXMgYW4gYGBhZGRpdGlvbmFsX3Rlc3RzYGAgZnVuY3Rpb24sIGNhbGwgaXQgYW5kIGFkZAotICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIHRvIHRoZSB0ZXN0cy4KLSAgICAgICAgIiIiCi0gICAgICAgIHRlc3RzID0gW10KLSAgICAgICAgaWYgbW9kdWxlLl9fbmFtZV9fIT0nc2V0dXB0b29scy50ZXN0cy5kb2N0ZXN0JzogICMgdWdoCi0gICAgICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsbW9kdWxlKSkKLQotICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgImFkZGl0aW9uYWxfdGVzdHMiKToKLSAgICAgICAgICAgIHRlc3RzLmFwcGVuZChtb2R1bGUuYWRkaXRpb25hbF90ZXN0cygpKQotCi0gICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKLSAgICAgICAgICAgIGZvciBmaWxlIGluIHJlc291cmNlX2xpc3RkaXIobW9kdWxlLl9fbmFtZV9fLCAnJyk6Ci0gICAgICAgICAgICAgICAgaWYgZmlsZS5lbmRzd2l0aCgnLnB5JykgYW5kIGZpbGUhPSdfX2luaXRfXy5weSc6Ci0gICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXysnLicrZmlsZVs6LTNdCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaWYgcmVzb3VyY2VfZXhpc3RzKAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLl9fbmFtZV9fLCBmaWxlKycvX19pbml0X18ucHknCi0gICAgICAgICAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGUuX19uYW1lX18rJy4nK2ZpbGUKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgdGVzdHMuYXBwZW5kKHNlbGYubG9hZFRlc3RzRnJvbU5hbWUoc3VibW9kdWxlKSkKLQotICAgICAgICBpZiBsZW4odGVzdHMpIT0xOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VpdGVDbGFzcyh0ZXN0cykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiB0ZXN0c1swXSAjIGRvbid0IGNyZWF0ZSBhIG5lc3RlZCBzdWl0ZSBmb3Igb25seSBvbmUgcmV0dXJuCi0KLQotY2xhc3MgdGVzdChDb21tYW5kKToKLQotICAgICIiIkNvbW1hbmQgdG8gcnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQiIiIKLQotICAgIGRlc2NyaXB0aW9uID0gInJ1biB1bml0IHRlc3RzIGFmdGVyIGluLXBsYWNlIGJ1aWxkIgotCi0gICAgdXNlcl9vcHRpb25zID0gWwotICAgICAgICAoJ3Rlc3QtbW9kdWxlPScsJ20nLCAiUnVuICd0ZXN0X3N1aXRlJyBpbiBzcGVjaWZpZWQgbW9kdWxlIiksCi0gICAgICAgICgndGVzdC1zdWl0ZT0nLCdzJywKLSAgICAgICAgICAgICJUZXN0IHN1aXRlIHRvIHJ1biAoZS5nLiAnc29tZV9tb2R1bGUudGVzdF9zdWl0ZScpIiksCi0gICAgXQotCi0gICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gTm9uZQotICAgICAgICBzZWxmLnRlc3RfbW9kdWxlID0gTm9uZQotICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gTm9uZQotCi0KLSAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKLQotICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGUgaXMgTm9uZToKLSAgICAgICAgICAgIGlmIHNlbGYudGVzdF9tb2R1bGUgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLmRpc3RyaWJ1dGlvbi50ZXN0X3N1aXRlCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IHNlbGYudGVzdF9tb2R1bGUrIi50ZXN0X3N1aXRlIgotICAgICAgICBlbGlmIHNlbGYudGVzdF9tb2R1bGU6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKLSAgICAgICAgICAgICAgICAiWW91IG1heSBzcGVjaWZ5IGEgbW9kdWxlIG9yIGEgc3VpdGUsIGJ1dCBub3QgYm90aCIKLSAgICAgICAgICAgICkKLQotICAgICAgICBzZWxmLnRlc3RfYXJncyA9IFtzZWxmLnRlc3Rfc3VpdGVdCi0KLSAgICAgICAgaWYgc2VsZi52ZXJib3NlOgotICAgICAgICAgICAgc2VsZi50ZXN0X2FyZ3MuaW5zZXJ0KDAsJy0tdmVyYm9zZScpCi0gICAgICAgIGlmIHNlbGYudGVzdF9sb2FkZXIgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCd0ZXN0X2xvYWRlcicsTm9uZSkKLSAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9ICJzZXR1cHRvb2xzLmNvbW1hbmQudGVzdDpTY2FubmluZ0xvYWRlciIKLQotCi0KLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICAjIEVuc3VyZSBtZXRhZGF0YSBpcyB1cC10by1kYXRlCi0gICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKLQotICAgICAgICAjIEJ1aWxkIGV4dGVuc2lvbnMgaW4tcGxhY2UKLSAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0xKQotICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQotCi0gICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnRlc3RzX3JlcXVpcmU6Ci0gICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5mZXRjaF9idWlsZF9lZ2dzKHNlbGYuZGlzdHJpYnV0aW9uLnRlc3RzX3JlcXVpcmUpCi0KLSAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlOgotICAgICAgICAgICAgY21kID0gJyAnLmpvaW4oc2VsZi50ZXN0X2FyZ3MpCi0gICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46Ci0gICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnc2tpcHBpbmcgInVuaXR0ZXN0ICVzIiAoZHJ5IHJ1biknICUgY21kKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdydW5uaW5nICJ1bml0dGVzdCAlcyInICUgY21kKQotICAgICAgICAgICAgICAgIHNlbGYucnVuX3Rlc3RzKCkKLQotCi0gICAgZGVmIHJ1bl90ZXN0cyhzZWxmKToKLSAgICAgICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgICAgIG9sZF9wYXRoID0gc3lzLnBhdGhbOl0KLSAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKLSAgICAgICAgcGF0aF9pdGVtID0gbm9ybWFsaXplX3BhdGgoZWlfY21kLmVnZ19iYXNlKQotICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YSgKLSAgICAgICAgICAgIHBhdGhfaXRlbSwgbm9ybWFsaXplX3BhdGgoZWlfY21kLmVnZ19pbmZvKQotICAgICAgICApCi0gICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24ocGF0aF9pdGVtLCBtZXRhZGF0YSwgcHJvamVjdF9uYW1lPWVpX2NtZC5lZ2dfbmFtZSkKLSAgICAgICAgd29ya2luZ19zZXQuYWRkKGRpc3QpCi0gICAgICAgIHJlcXVpcmUoc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkpCi0gICAgICAgIGxvYWRlcl9lcCA9IEVudHJ5UG9pbnQucGFyc2UoIng9IitzZWxmLnRlc3RfbG9hZGVyKQotICAgICAgICBsb2FkZXJfY2xhc3MgPSBsb2FkZXJfZXAubG9hZChyZXF1aXJlPUZhbHNlKQotICAgICAgICB1bml0dGVzdC5tYWluKAotICAgICAgICAgICAgTm9uZSwgTm9uZSwgW3VuaXR0ZXN0Ll9fZmlsZV9fXStzZWxmLnRlc3RfYXJncywKLSAgICAgICAgICAgIHRlc3RMb2FkZXIgPSBsb2FkZXJfY2xhc3MoKQotICAgICAgICApCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NDRjNDAwLi4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLSIiImRpc3R1dGlscy5jb21tYW5kLnVwbG9hZAotCi1JbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ3VwbG9hZCcgc3ViY29tbWFuZCAodXBsb2FkIHBhY2thZ2UgdG8gUHlQSSkuIiIiCi0KLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAotZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCi1mcm9tIG1kNSBpbXBvcnQgbWQ1Ci1pbXBvcnQgb3MKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IENvbmZpZ1BhcnNlcgotaW1wb3J0IGh0dHBsaWIKLWltcG9ydCBiYXNlNjQKLWltcG9ydCB1cmxwYXJzZQotaW1wb3J0IGNTdHJpbmdJTyBhcyBTdHJpbmdJTwotCi1jbGFzcyB1cGxvYWQoQ29tbWFuZCk6Ci0KLSAgICBkZXNjcmlwdGlvbiA9ICJ1cGxvYWQgYmluYXJ5IHBhY2thZ2UgdG8gUHlQSSIKLQotICAgIERFRkFVTFRfUkVQT1NJVE9SWSA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHlwaScKLQotICAgIHVzZXJfb3B0aW9ucyA9IFsKLSAgICAgICAgKCdyZXBvc2l0b3J5PScsICdyJywKLSAgICAgICAgICJ1cmwgb2YgcmVwb3NpdG9yeSBbZGVmYXVsdDogJXNdIiAlIERFRkFVTFRfUkVQT1NJVE9SWSksCi0gICAgICAgICgnc2hvdy1yZXNwb25zZScsIE5vbmUsCi0gICAgICAgICAnZGlzcGxheSBmdWxsIHJlc3BvbnNlIHRleHQgZnJvbSBzZXJ2ZXInKSwKLSAgICAgICAgKCdzaWduJywgJ3MnLAotICAgICAgICAgJ3NpZ24gZmlsZXMgdG8gdXBsb2FkIHVzaW5nIGdwZycpLAotICAgICAgICAoJ2lkZW50aXR5PScsICdpJywgJ0dQRyBpZGVudGl0eSB1c2VkIHRvIHNpZ24gZmlsZXMnKSwKLSAgICAgICAgXQotICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnc2hvdy1yZXNwb25zZScsICdzaWduJ10KLQotICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYudXNlcm5hbWUgPSAnJwotICAgICAgICBzZWxmLnBhc3N3b3JkID0gJycKLSAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gJycKLSAgICAgICAgc2VsZi5zaG93X3Jlc3BvbnNlID0gMAotICAgICAgICBzZWxmLnNpZ24gPSBGYWxzZQotICAgICAgICBzZWxmLmlkZW50aXR5ID0gTm9uZQotCi0gICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuaWRlbnRpdHkgYW5kIG5vdCBzZWxmLnNpZ246Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKLSAgICAgICAgICAgICAgICAiTXVzdCB1c2UgLS1zaWduIGZvciAtLWlkZW50aXR5IHRvIGhhdmUgbWVhbmluZyIKLSAgICAgICAgICAgICkKLSAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdIT01FJyk6Ci0gICAgICAgICAgICByYyA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWydIT01FJ10sICcucHlwaXJjJykKLSAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKLSAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdVc2luZyBQeVBJIGxvZ2luIGZyb20gJXMnICUgcmMpCi0gICAgICAgICAgICAgICAgY29uZmlnID0gQ29uZmlnUGFyc2VyLkNvbmZpZ1BhcnNlcih7Ci0gICAgICAgICAgICAgICAgICAgICAgICAndXNlcm5hbWUnOicnLAotICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJzonJywKLSAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvc2l0b3J5JzonJ30pCi0gICAgICAgICAgICAgICAgY29uZmlnLnJlYWQocmMpCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVwb3NpdG9yeToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gY29uZmlnLmdldCgnc2VydmVyLWxvZ2luJywgJ3JlcG9zaXRvcnknKQotICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnVzZXJuYW1lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZXJuYW1lID0gY29uZmlnLmdldCgnc2VydmVyLWxvZ2luJywgJ3VzZXJuYW1lJykKLSAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXNzd29yZDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXNzd29yZCA9IGNvbmZpZy5nZXQoJ3NlcnZlci1sb2dpbicsICdwYXNzd29yZCcpCi0gICAgICAgIGlmIG5vdCBzZWxmLnJlcG9zaXRvcnk6Ci0gICAgICAgICAgICBzZWxmLnJlcG9zaXRvcnkgPSBzZWxmLkRFRkFVTFRfUkVQT1NJVE9SWQotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXM6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTm8gZGlzdCBmaWxlIGNyZWF0ZWQgaW4gZWFybGllciBjb21tYW5kIikKLSAgICAgICAgZm9yIGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUgaW4gc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlczoKLSAgICAgICAgICAgIHNlbGYudXBsb2FkX2ZpbGUoY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSkKLQotICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lKToKLSAgICAgICAgIyBTaWduIGlmIHJlcXVlc3RlZAotICAgICAgICBpZiBzZWxmLnNpZ246Ci0gICAgICAgICAgICBncGdfYXJncyA9IFsiZ3BnIiwgIi0tZGV0YWNoLXNpZ24iLCAiLWEiLCBmaWxlbmFtZV0KLSAgICAgICAgICAgIGlmIHNlbGYuaWRlbnRpdHk6Ci0gICAgICAgICAgICAgICAgZ3BnX2FyZ3NbMjoyXSA9IFsiLS1sb2NhbC11c2VyIiwgc2VsZi5pZGVudGl0eV0KLSAgICAgICAgICAgIHNwYXduKGdwZ19hcmdzLAotICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCi0KLSAgICAgICAgIyBGaWxsIGluIHRoZSBkYXRhCi0gICAgICAgIGNvbnRlbnQgPSBvcGVuKGZpbGVuYW1lLCdyYicpLnJlYWQoKQotICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCi0gICAgICAgIGNvbW1lbnQgPSAnJwotICAgICAgICBpZiBjb21tYW5kPT0nYmRpc3RfZWdnJyBhbmQgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6Ci0gICAgICAgICAgICBjb21tZW50ID0gImJ1aWx0IG9uICVzIiAlIHBsYXRmb3JtLnBsYXRmb3JtKHRlcnNlPTEpCi0gICAgICAgIGRhdGEgPSB7Ci0gICAgICAgICAgICAnOmFjdGlvbic6J2ZpbGVfdXBsb2FkJywKLSAgICAgICAgICAgICdwcm90Y29sX3ZlcnNpb24nOicxJywKLSAgICAgICAgICAgICduYW1lJzpzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpLAotICAgICAgICAgICAgJ3ZlcnNpb24nOnNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCi0gICAgICAgICAgICAnY29udGVudCc6KGJhc2VuYW1lLGNvbnRlbnQpLAotICAgICAgICAgICAgJ2ZpbGV0eXBlJzpjb21tYW5kLAotICAgICAgICAgICAgJ3B5dmVyc2lvbic6cHl2ZXJzaW9uLAotICAgICAgICAgICAgJ21kNV9kaWdlc3QnOm1kNShjb250ZW50KS5oZXhkaWdlc3QoKSwKLSAgICAgICAgICAgIH0KLSAgICAgICAgaWYgY29tbWFuZCA9PSAnYmRpc3RfcnBtJzoKLSAgICAgICAgICAgIGRpc3QsIHZlcnNpb24sIGlkID0gcGxhdGZvcm0uZGlzdCgpCi0gICAgICAgICAgICBpZiBkaXN0OgotICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAnYnVpbHQgZm9yICVzICVzJyAlIChkaXN0LCB2ZXJzaW9uKQotICAgICAgICBlbGlmIGNvbW1hbmQgPT0gJ2JkaXN0X2R1bWInOgotICAgICAgICAgICAgY29tbWVudCA9ICdidWlsdCBmb3IgJXMnICUgcGxhdGZvcm0ucGxhdGZvcm0odGVyc2U9MSkKLSAgICAgICAgZGF0YVsnY29tbWVudCddID0gY29tbWVudAotCi0gICAgICAgIGlmIHNlbGYuc2lnbjoKLSAgICAgICAgICAgIGRhdGFbJ2dwZ19zaWduYXR1cmUnXSA9IChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSArICIuYXNjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuKGZpbGVuYW1lKyIuYXNjIikucmVhZCgpKQotCi0gICAgICAgICMgc2V0IHVwIHRoZSBhdXRoZW50aWNhdGlvbgotICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBiYXNlNjQuZW5jb2Rlc3RyaW5nKHNlbGYudXNlcm5hbWUgKyAiOiIgKyBzZWxmLnBhc3N3b3JkKS5zdHJpcCgpCi0KLSAgICAgICAgIyBCdWlsZCB1cCB0aGUgTUlNRSBwYXlsb2FkIGZvciB0aGUgUE9TVCBkYXRhCi0gICAgICAgIGJvdW5kYXJ5ID0gJy0tLS0tLS0tLS0tLS0tR0hTS0ZKRExHRFM3NTQzRkpLTEZIUkU3NTY0Mjc1Njc0MzI1NCcKLSAgICAgICAgc2VwX2JvdW5kYXJ5ID0gJ1xuLS0nICsgYm91bmRhcnkKLSAgICAgICAgZW5kX2JvdW5kYXJ5ID0gc2VwX2JvdW5kYXJ5ICsgJy0tJwotICAgICAgICBib2R5ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQotICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6Ci0gICAgICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCi0gICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSAhPSB0eXBlKFtdKToKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV0KLSAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZToKLSAgICAgICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSBpcyB0dXBsZToKLSAgICAgICAgICAgICAgICAgICAgZm4gPSAnO2ZpbGVuYW1lPSIlcyInICUgdmFsdWVbMF0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxXQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGZuID0gIiIKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cih2YWx1ZSkKLSAgICAgICAgICAgICAgICBib2R5LndyaXRlKHNlcF9ib3VuZGFyeSkKLSAgICAgICAgICAgICAgICBib2R5LndyaXRlKCdcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyVrZXkpCi0gICAgICAgICAgICAgICAgYm9keS53cml0ZShmbikKLSAgICAgICAgICAgICAgICBib2R5LndyaXRlKCJcblxuIikKLSAgICAgICAgICAgICAgICBib2R5LndyaXRlKHZhbHVlKQotICAgICAgICAgICAgICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVstMV0gPT0gJ1xyJzoKLSAgICAgICAgICAgICAgICAgICAgYm9keS53cml0ZSgnXG4nKSAgIyB3cml0ZSBhbiBleHRyYSBuZXdsaW5lIChsdXJ2ZSBNYWNzKQotICAgICAgICBib2R5LndyaXRlKGVuZF9ib3VuZGFyeSkKLSAgICAgICAgYm9keS53cml0ZSgiXG4iKQotICAgICAgICBib2R5ID0gYm9keS5nZXR2YWx1ZSgpCi0KLSAgICAgICAgc2VsZi5hbm5vdW5jZSgiU3VibWl0dGluZyAlcyB0byAlcyIgJSAoZmlsZW5hbWUsIHNlbGYucmVwb3NpdG9yeSksIGxvZy5JTkZPKQotCi0gICAgICAgICMgYnVpbGQgdGhlIFJlcXVlc3QKLSAgICAgICAgIyBXZSBjYW4ndCB1c2UgdXJsbGliMiBzaW5jZSB3ZSBuZWVkIHRvIHNlbmQgdGhlIEJhc2ljCi0gICAgICAgICMgYXV0aCByaWdodCB3aXRoIHRoZSBmaXJzdCByZXF1ZXN0Ci0gICAgICAgIHNjaGVtYSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50cyA9IFwKLSAgICAgICAgICAgIHVybHBhcnNlLnVybHBhcnNlKHNlbGYucmVwb3NpdG9yeSkKLSAgICAgICAgYXNzZXJ0IG5vdCBwYXJhbXMgYW5kIG5vdCBxdWVyeSBhbmQgbm90IGZyYWdtZW50cwotICAgICAgICBpZiBzY2hlbWEgPT0gJ2h0dHAnOgotICAgICAgICAgICAgaHR0cCA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24obmV0bG9jKQotICAgICAgICBlbGlmIHNjaGVtYSA9PSAnaHR0cHMnOgotICAgICAgICAgICAgaHR0cCA9IGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKG5ldGxvYykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAidW5zdXBwb3J0ZWQgc2NoZW1hICIrc2NoZW1hCi0KLSAgICAgICAgZGF0YSA9ICcnCi0gICAgICAgIGxvZ2xldmVsID0gbG9nLklORk8KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaHR0cC5jb25uZWN0KCkKLSAgICAgICAgICAgIGh0dHAucHV0cmVxdWVzdCgiUE9TVCIsIHVybCkKLSAgICAgICAgICAgIGh0dHAucHV0aGVhZGVyKCdDb250ZW50LXR5cGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyVib3VuZGFyeSkKLSAgICAgICAgICAgIGh0dHAucHV0aGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihsZW4oYm9keSkpKQotICAgICAgICAgICAgaHR0cC5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCBhdXRoKQotICAgICAgICAgICAgaHR0cC5lbmRoZWFkZXJzKCkKLSAgICAgICAgICAgIGh0dHAuc2VuZChib2R5KQotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShlLm1zZywgbG9nLkVSUk9SKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgciA9IGh0dHAuZ2V0cmVzcG9uc2UoKQotICAgICAgICBpZiByLnN0YXR1cyA9PSAyMDA6Ci0gICAgICAgICAgICBzZWxmLmFubm91bmNlKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5JTkZPKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXBsb2FkIGZhaWxlZCAoJXMpOiAlcycgJSAoci5zdGF0dXMsIHIucmVhc29uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLkVSUk9SKQotICAgICAgICBpZiBzZWxmLnNob3dfcmVzcG9uc2U6Ci0gICAgICAgICAgICBwcmludCAnLScqNzUsIHIucmVhZCgpLCAnLScqNzUKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2RlcGVuZHMucHkgYi9MaWIvc2V0dXB0b29scy9kZXBlbmRzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQ4MTk0Li4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL2RlcGVuZHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzCi1pbXBvcnQgc3lzLCBpbXAsIG1hcnNoYWwKLWZyb20gaW1wIGltcG9ydCBQS0dfRElSRUNUT1JZLCBQWV9DT01QSUxFRCwgUFlfU09VUkNFLCBQWV9GUk9aRU4KLWZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24sIExvb3NlVmVyc2lvbgotCi1fX2FsbF9fID0gWwotICAgICdSZXF1aXJlJywgJ2ZpbmRfbW9kdWxlJywgJ2dldF9tb2R1bGVfY29uc3RhbnQnLCAnZXh0cmFjdF9jb25zdGFudCcKLV0KLQotY2xhc3MgUmVxdWlyZToKLSAgICAiIiJBIHByZXJlcXVpc2l0ZSB0byBidWlsZGluZyBvciBpbnN0YWxsaW5nIGEgZGlzdHJpYnV0aW9uIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZixuYW1lLHJlcXVlc3RlZF92ZXJzaW9uLG1vZHVsZSxob21lcGFnZT0nJywKLSAgICAgICAgYXR0cmlidXRlPU5vbmUsZm9ybWF0PU5vbmUKLSAgICApOgotCi0gICAgICAgIGlmIGZvcm1hdCBpcyBOb25lIGFuZCByZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGZvcm1hdCA9IFN0cmljdFZlcnNpb24KLQotICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICByZXF1ZXN0ZWRfdmVyc2lvbiA9IGZvcm1hdChyZXF1ZXN0ZWRfdmVyc2lvbikKLSAgICAgICAgICAgIGlmIGF0dHJpYnV0ZSBpcyBOb25lOgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9ICdfX3ZlcnNpb25fXycKLQotICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShsb2NhbHMoKSkKLSAgICAgICAgZGVsIHNlbGYuc2VsZgotCi0KLSAgICBkZWYgZnVsbF9uYW1lKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gZnVsbCBwYWNrYWdlL2Rpc3RyaWJ1dGlvbiBuYW1lLCB3L3ZlcnNpb24iIiIKLSAgICAgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYubmFtZSxzZWxmLnJlcXVlc3RlZF92ZXJzaW9uKQotICAgICAgICByZXR1cm4gc2VsZi5uYW1lCi0KLQotICAgIGRlZiB2ZXJzaW9uX29rKHNlbGYsdmVyc2lvbik6Ci0gICAgICAgICIiIklzICd2ZXJzaW9uJyBzdWZmaWNpZW50bHkgdXAtdG8tZGF0ZT8iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuYXR0cmlidXRlIGlzIE5vbmUgb3Igc2VsZi5mb3JtYXQgaXMgTm9uZSBvciBcCi0gICAgICAgICAgICBzdHIodmVyc2lvbik8PiJ1bmtub3duIiBhbmQgdmVyc2lvbiA+PSBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uCi0KLQotICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmLCBwYXRocz1Ob25lLCBkZWZhdWx0PSJ1bmtub3duIik6Ci0KLSAgICAgICAgIiIiR2V0IHZlcnNpb24gbnVtYmVyIG9mIGluc3RhbGxlZCBtb2R1bGUsICdOb25lJywgb3IgJ2RlZmF1bHQnCi0KLSAgICAgICAgU2VhcmNoICdwYXRocycgZm9yIG1vZHVsZS4gIElmIG5vdCBmb3VuZCwgcmV0dXJuICdOb25lJy4gIElmIGZvdW5kLAotICAgICAgICByZXR1cm4gdGhlIGV4dHJhY3RlZCB2ZXJzaW9uIGF0dHJpYnV0ZSwgb3IgJ2RlZmF1bHQnIGlmIG5vIHZlcnNpb24KLSAgICAgICAgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0Ci0gICAgICAgIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhlIHZlcnNpb24gaXMgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUKLSAgICAgICAgcmVxdWlyZW1lbnQncyB2ZXJzaW9uIGZvcm1hdCAoaWYgYW55KSwgdW5sZXNzIGl0IGlzICdOb25lJyBvciB0aGUKLSAgICAgICAgc3VwcGxpZWQgJ2RlZmF1bHQnLgotICAgICAgICAiIiIKLQotICAgICAgICBpZiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGYscCxpID0gZmluZF9tb2R1bGUoc2VsZi5tb2R1bGUscGF0aHMpCi0gICAgICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIHYgPSBnZXRfbW9kdWxlX2NvbnN0YW50KHNlbGYubW9kdWxlLHNlbGYuYXR0cmlidXRlLGRlZmF1bHQscGF0aHMpCi0KLSAgICAgICAgaWYgdiBpcyBub3QgTm9uZSBhbmQgdiBpcyBub3QgZGVmYXVsdCBhbmQgc2VsZi5mb3JtYXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQodikKLQotICAgICAgICByZXR1cm4gdgotCi0KLSAgICBkZWYgaXNfcHJlc2VudChzZWxmLHBhdGhzPU5vbmUpOgotICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgb24gJ3BhdGhzJyIiIgotICAgICAgICByZXR1cm4gc2VsZi5nZXRfdmVyc2lvbihwYXRocykgaXMgbm90IE5vbmUKLQotCi0gICAgZGVmIGlzX2N1cnJlbnQoc2VsZixwYXRocz1Ob25lKToKLSAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgZGVwZW5kZW5jeSBpcyBwcmVzZW50IGFuZCB1cC10by1kYXRlIG9uICdwYXRocyciIiIKLSAgICAgICAgdmVyc2lvbiA9IHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpCi0gICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX29rKHZlcnNpb24pCi0KLQotZGVmIF9pdGVyX2NvZGUoY29kZSk6Ci0KLSAgICAiIiJZaWVsZCAnKG9wLGFyZyknIHBhaXIgZm9yIGVhY2ggb3BlcmF0aW9uIGluIGNvZGUgb2JqZWN0ICdjb2RlJyIiIgotCi0gICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKLSAgICBmcm9tIGRpcyBpbXBvcnQgSEFWRV9BUkdVTUVOVCwgRVhURU5ERURfQVJHCi0KLSAgICBieXRlcyA9IGFycmF5KCdiJyxjb2RlLmNvX2NvZGUpCi0gICAgZW9mID0gbGVuKGNvZGUuY29fY29kZSkKLQotICAgIHB0ciA9IDAKLSAgICBleHRlbmRlZF9hcmcgPSAwCi0KLSAgICB3aGlsZSBwdHI8ZW9mOgotCi0gICAgICAgIG9wID0gYnl0ZXNbcHRyXQotCi0gICAgICAgIGlmIG9wPj1IQVZFX0FSR1VNRU5UOgotCi0gICAgICAgICAgICBhcmcgPSBieXRlc1twdHIrMV0gKyBieXRlc1twdHIrMl0qMjU2ICsgZXh0ZW5kZWRfYXJnCi0gICAgICAgICAgICBwdHIgKz0gMwotCi0gICAgICAgICAgICBpZiBvcD09RVhURU5ERURfQVJHOgotICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IGFyZyAqIDY1NTM2TAotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGFyZyA9IE5vbmUKLSAgICAgICAgICAgIHB0ciArPSAxCi0KLSAgICAgICAgeWllbGQgb3AsYXJnCi0KLQotCi0KLQotCi0KLQotCi0KLWRlZiBmaW5kX21vZHVsZShtb2R1bGUsIHBhdGhzPU5vbmUpOgotICAgICIiIkp1c3QgbGlrZSAnaW1wLmZpbmRfbW9kdWxlKCknLCBidXQgd2l0aCBwYWNrYWdlIHN1cHBvcnQiIiIKLQotICAgIHBhcnRzID0gbW9kdWxlLnNwbGl0KCcuJykKLQotICAgIHdoaWxlIHBhcnRzOgotICAgICAgICBwYXJ0ID0gcGFydHMucG9wKDApCi0gICAgICAgIGYsIHBhdGgsIChzdWZmaXgsbW9kZSxraW5kKSA9IGluZm8gPSBpbXAuZmluZF9tb2R1bGUocGFydCwgcGF0aHMpCi0KLSAgICAgICAgaWYga2luZD09UEtHX0RJUkVDVE9SWToKLSAgICAgICAgICAgIHBhcnRzID0gcGFydHMgb3IgWydfX2luaXRfXyddCi0gICAgICAgICAgICBwYXRocyA9IFtwYXRoXQotCi0gICAgICAgIGVsaWYgcGFydHM6Ci0gICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ2FuJ3QgZmluZCAlciBpbiAlcyIgJSAocGFydHMsbW9kdWxlKSkKLQotICAgIHJldHVybiBpbmZvCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1kZWYgZ2V0X21vZHVsZV9jb25zdGFudChtb2R1bGUsIHN5bWJvbCwgZGVmYXVsdD0tMSwgcGF0aHM9Tm9uZSk6Ci0KLSAgICAiIiJGaW5kICdtb2R1bGUnIGJ5IHNlYXJjaGluZyAncGF0aHMnLCBhbmQgZXh0cmFjdCAnc3ltYm9sJwotCi0gICAgUmV0dXJuICdOb25lJyBpZiAnbW9kdWxlJyBkb2VzIG5vdCBleGlzdCBvbiAncGF0aHMnLCBvciBpdCBkb2VzIG5vdCBkZWZpbmUKLSAgICAnc3ltYm9sJy4gIElmIHRoZSBtb2R1bGUgZGVmaW5lcyAnc3ltYm9sJyBhcyBhIGNvbnN0YW50LCByZXR1cm4gdGhlCi0gICAgY29uc3RhbnQuICBPdGhlcndpc2UsIHJldHVybiAnZGVmYXVsdCcuIiIiCi0KLSAgICB0cnk6Ci0gICAgICAgIGYsIHBhdGgsIChzdWZmaXgsbW9kZSxraW5kKSA9IGZpbmRfbW9kdWxlKG1vZHVsZSxwYXRocykKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICMgTW9kdWxlIGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIHRyeToKLSAgICAgICAgaWYga2luZD09UFlfQ09NUElMRUQ6Ci0gICAgICAgICAgICBmLnJlYWQoOCkgICAjIHNraXAgbWFnaWMgJiBkYXRlCi0gICAgICAgICAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGYpCi0gICAgICAgIGVsaWYga2luZD09UFlfRlJPWkVOOgotICAgICAgICAgICAgY29kZSA9IGltcC5nZXRfZnJvemVuX29iamVjdChtb2R1bGUpCi0gICAgICAgIGVsaWYga2luZD09UFlfU09VUkNFOgotICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgTm90IHNvbWV0aGluZyB3ZSBjYW4gcGFyc2U7IHdlJ2xsIGhhdmUgdG8gaW1wb3J0IGl0LiAgOigKLSAgICAgICAgICAgIGlmIG1vZHVsZSBub3QgaW4gc3lzLm1vZHVsZXM6Ci0gICAgICAgICAgICAgICAgaW1wLmxvYWRfbW9kdWxlKG1vZHVsZSxmLHBhdGgsKHN1ZmZpeCxtb2RlLGtpbmQpKQotICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kdWxlXSxzeW1ib2wsTm9uZSkKLQotICAgIGZpbmFsbHk6Ci0gICAgICAgIGlmIGY6Ci0gICAgICAgICAgICBmLmNsb3NlKCkKLQotICAgIHJldHVybiBleHRyYWN0X2NvbnN0YW50KGNvZGUsc3ltYm9sLGRlZmF1bHQpCi0KLQotCi0KLQotCi0KLQotZGVmIGV4dHJhY3RfY29uc3RhbnQoY29kZSxzeW1ib2wsZGVmYXVsdD0tMSk6Ci0KLSAgICAiIiJFeHRyYWN0IHRoZSBjb25zdGFudCB2YWx1ZSBvZiAnc3ltYm9sJyBmcm9tICdjb2RlJwotCi0gICAgSWYgdGhlIG5hbWUgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYSBjb25zdGFudCB2YWx1ZSBieSB0aGUgUHl0aG9uIGNvZGUKLSAgICBvYmplY3QgJ2NvZGUnLCByZXR1cm4gdGhhdCB2YWx1ZS4gIElmICdzeW1ib2wnIGlzIGJvdW5kIHRvIGFuIGV4cHJlc3Npb24sCi0gICAgcmV0dXJuICdkZWZhdWx0Jy4gIE90aGVyd2lzZSwgcmV0dXJuICdOb25lJy4KLQotICAgIFJldHVybiB2YWx1ZSBpcyBiYXNlZCBvbiB0aGUgZmlyc3QgYXNzaWdubWVudCB0byAnc3ltYm9sJy4gICdzeW1ib2wnIG11c3QKLSAgICBiZSBhIGdsb2JhbCwgb3IgYXQgbGVhc3QgYSBub24tImZhc3QiIGxvY2FsIGluIHRoZSBjb2RlIGJsb2NrLiAgVGhhdCBpcywKLSAgICBvbmx5ICdTVE9SRV9OQU1FJyBhbmQgJ1NUT1JFX0dMT0JBTCcgb3Bjb2RlcyBhcmUgY2hlY2tlZCwgYW5kICdzeW1ib2wnCi0gICAgbXVzdCBiZSBwcmVzZW50IGluICdjb2RlLmNvX25hbWVzJy4KLSAgICAiIiIKLQotICAgIGlmIHN5bWJvbCBub3QgaW4gY29kZS5jb19uYW1lczoKLSAgICAgICAgIyBuYW1lJ3Mgbm90IHRoZXJlLCBjYW4ndCBwb3NzaWJseSBiZSBhbiBhc3NpZ21lbnQKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIG5hbWVfaWR4ID0gbGlzdChjb2RlLmNvX25hbWVzKS5pbmRleChzeW1ib2wpCi0KLSAgICBTVE9SRV9OQU1FID0gOTAKLSAgICBTVE9SRV9HTE9CQUwgPSA5NwotICAgIExPQURfQ09OU1QgPSAxMDAKLQotICAgIGNvbnN0ID0gZGVmYXVsdAotCi0gICAgZm9yIG9wLCBhcmcgaW4gX2l0ZXJfY29kZShjb2RlKToKLQotICAgICAgICBpZiBvcD09TE9BRF9DT05TVDoKLSAgICAgICAgICAgIGNvbnN0ID0gY29kZS5jb19jb25zdHNbYXJnXQotICAgICAgICBlbGlmIGFyZz09bmFtZV9pZHggYW5kIChvcD09U1RPUkVfTkFNRSBvciBvcD09U1RPUkVfR0xPQkFMKToKLSAgICAgICAgICAgIHJldHVybiBjb25zdAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgY29uc3QgPSBkZWZhdWx0CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9kaXN0LnB5IGIvTGliL3NldHVwdG9vbHMvZGlzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0MTdjMS4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9kaXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzk4ICswLDAgQEAKLV9fYWxsX18gPSBbJ0Rpc3RyaWJ1dGlvbiddCi0KLWZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbiBhcyBfRGlzdHJpYnV0aW9uCi1mcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQotZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgaW5zdGFsbAotZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHNkaXN0Ci1mcm9tIHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2xpYiBpbXBvcnQgaW5zdGFsbF9saWIKLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgotaW1wb3J0IHNldHVwdG9vbHMsIHBrZ19yZXNvdXJjZXMsIGRpc3R1dGlscy5jb3JlLCBkaXN0dXRpbHMuZGlzdCwgZGlzdHV0aWxzLmNtZAotaW1wb3J0IG9zCi0KLWRlZiBfZ2V0X3VucGF0Y2hlZChjbHMpOgotICAgICIiIlByb3RlY3QgYWdhaW5zdCByZS1wYXRjaGluZyB0aGUgZGlzdHV0aWxzIGlmIHJlbG9hZGVkCi0KLSAgICBBbHNvIGVuc3VyZXMgdGhhdCBubyBvdGhlciBkaXN0dXRpbHMgZXh0ZW5zaW9uIG1vbmtleXBhdGNoZWQgdGhlIGRpc3R1dGlscwotICAgIGZpcnN0LgotICAgICIiIgotICAgIHdoaWxlIGNscy5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ3NldHVwdG9vbHMnKToKLSAgICAgICAgY2xzLCA9IGNscy5fX2Jhc2VzX18KLSAgICBpZiBub3QgY2xzLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnZGlzdHV0aWxzJyk6Ci0gICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAotICAgICAgICAgICAgImRpc3R1dGlscyBoYXMgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgJXIiICUgY2xzCi0gICAgICAgICkKLSAgICByZXR1cm4gY2xzCi0KLV9EaXN0cmlidXRpb24gPSBfZ2V0X3VucGF0Y2hlZChfRGlzdHJpYnV0aW9uKQotCi1zZXF1ZW5jZSA9IHR1cGxlLCBsaXN0Ci0KLWRlZiBjaGVja19pbXBvcnRhYmxlKGRpc3QsIGF0dHIsIHZhbHVlKToKLSAgICB0cnk6Ci0gICAgICAgIGVwID0gcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlKCd4PScrdmFsdWUpCi0gICAgICAgIGFzc2VydCBub3QgZXAuZXh0cmFzCi0gICAgZXhjZXB0IChUeXBlRXJyb3IsVmFsdWVFcnJvcixBdHRyaWJ1dGVFcnJvcixBc3NlcnRpb25FcnJvcik6Ci0gICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCi0gICAgICAgICAgICAiJXIgbXVzdCBiZSBpbXBvcnRhYmxlICdtb2R1bGU6YXR0cnMnIHN0cmluZyAoZ290ICVyKSIKLSAgICAgICAgICAgICUgKGF0dHIsdmFsdWUpCi0gICAgICAgICkKLQotCi1kZWYgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsIGF0dHIsIHZhbHVlKToKLSAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIHN0cmluZyBsaXN0IG9yIE5vbmUiIiIKLSAgICB0cnk6Ci0gICAgICAgIGFzc2VydCAnJy5qb2luKHZhbHVlKSE9dmFsdWUKLSAgICBleGNlcHQgKFR5cGVFcnJvcixWYWx1ZUVycm9yLEF0dHJpYnV0ZUVycm9yLEFzc2VydGlvbkVycm9yKToKLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKLSAgICAgICAgICAgICIlciBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIChnb3QgJXIpIiAlIChhdHRyLHZhbHVlKQotICAgICAgICApCi0KLWRlZiBjaGVja19uc3AoZGlzdCwgYXR0ciwgdmFsdWUpOgotICAgICIiIlZlcmlmeSB0aGF0IG5hbWVzcGFjZSBwYWNrYWdlcyBhcmUgdmFsaWQiIiIKLSAgICBhc3NlcnRfc3RyaW5nX2xpc3QoZGlzdCxhdHRyLHZhbHVlKQotCi0gICAgZm9yIG5zcCBpbiB2YWx1ZToKLSAgICAgICAgaWYgbm90IGRpc3QuaGFzX2NvbnRlbnRzX2Zvcihuc3ApOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKLSAgICAgICAgICAgICAgICAiRGlzdHJpYnV0aW9uIGNvbnRhaW5zIG5vIG1vZHVsZXMgb3IgcGFja2FnZXMgZm9yICIgKwotICAgICAgICAgICAgICAgICJuYW1lc3BhY2UgcGFja2FnZSAlciIgJSBuc3AKLSAgICAgICAgICAgICkKLQotZGVmIGNoZWNrX2V4dHJhcyhkaXN0LCBhdHRyLCB2YWx1ZSk6Ci0gICAgIiIiVmVyaWZ5IHRoYXQgZXh0cmFzX3JlcXVpcmUgbWFwcGluZyBpcyB2YWxpZCIiIgotICAgIHRyeToKLSAgICAgICAgZm9yIGssdiBpbiB2YWx1ZS5pdGVtcygpOgotICAgICAgICAgICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyh2KSkKLSAgICBleGNlcHQgKFR5cGVFcnJvcixWYWx1ZUVycm9yLEF0dHJpYnV0ZUVycm9yKToKLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKLSAgICAgICAgICAgICInZXh0cmFzX3JlcXVpcmUnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IHdob3NlIHZhbHVlcyBhcmUgIgotICAgICAgICAgICAgInN0cmluZ3Mgb3IgbGlzdHMgb2Ygc3RyaW5ncyBjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiAiCi0gICAgICAgICAgICAicmVxdWlyZW1lbnQgc3BlY2lmaWVycy4iCi0gICAgICAgICkKLQotZGVmIGFzc2VydF9ib29sKGRpc3QsIGF0dHIsIHZhbHVlKToKLSAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBUcnVlLCBGYWxzZSwgMCwgb3IgMSIiIgotICAgIGlmIGJvb2wodmFsdWUpICE9IHZhbHVlOgotICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAotICAgICAgICAgICAgIiVyIG11c3QgYmUgYSBib29sZWFuIHZhbHVlIChnb3QgJXIpIiAlIChhdHRyLHZhbHVlKQotICAgICAgICApCi0KLQotCi1kZWYgY2hlY2tfcmVxdWlyZW1lbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKLSAgICAiIiJWZXJpZnkgdGhhdCBpbnN0YWxsX3JlcXVpcmVzIGlzIGEgdmFsaWQgcmVxdWlyZW1lbnRzIGxpc3QiIiIKLSAgICB0cnk6Ci0gICAgICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModmFsdWUpKQotICAgIGV4Y2VwdCAoVHlwZUVycm9yLFZhbHVlRXJyb3IpOgotICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAotICAgICAgICAgICAgIiVyIG11c3QgYmUgYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzICIKLSAgICAgICAgICAgICJjb250YWluaW5nIHZhbGlkIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZXJzIiAlIChhdHRyLCkKLSAgICAgICAgKQotCi1kZWYgY2hlY2tfZW50cnlfcG9pbnRzKGRpc3QsIGF0dHIsIHZhbHVlKToKLSAgICAiIiJWZXJpZnkgdGhhdCBlbnRyeV9wb2ludHMgbWFwIGlzIHBhcnNlYWJsZSIiIgotICAgIHRyeToKLSAgICAgICAgcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlX21hcCh2YWx1ZSkKLSAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcihlKQotCi0KLWRlZiBjaGVja190ZXN0X3N1aXRlKGRpc3QsIGF0dHIsIHZhbHVlKToKLSAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSxiYXNlc3RyaW5nKToKLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigidGVzdF9zdWl0ZSBtdXN0IGJlIGEgc3RyaW5nIikKLQotCi1kZWYgY2hlY2tfcGFja2FnZV9kYXRhKGRpc3QsIGF0dHIsIHZhbHVlKToKLSAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIGRpY3Rpb25hcnkgb2YgcGFja2FnZSBuYW1lcyB0byBnbG9iIGxpc3RzIiIiCi0gICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSxkaWN0KToKLSAgICAgICAgZm9yIGssdiBpbiB2YWx1ZS5pdGVtcygpOgotICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoayxzdHIpOiBicmVhawotICAgICAgICAgICAgdHJ5OiBpdGVyKHYpCi0gICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAotICAgICAgICBhdHRyKyIgbXVzdCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZyBwYWNrYWdlIG5hbWVzIHRvIGxpc3RzIG9mICIKLSAgICAgICAgIndpbGRjYXJkIHBhdHRlcm5zIgotICAgICkKLQotCi0KLQotY2xhc3MgRGlzdHJpYnV0aW9uKF9EaXN0cmlidXRpb24pOgotICAgICIiIkRpc3RyaWJ1dGlvbiB3aXRoIHN1cHBvcnQgZm9yIGZlYXR1cmVzLCB0ZXN0cywgYW5kIHBhY2thZ2UgZGF0YQotCi0gICAgVGhpcyBpcyBhbiBlbmhhbmNlZCB2ZXJzaW9uIG9mICdkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24nIHRoYXQKLSAgICBlZmZlY3RpdmVseSBhZGRzIHRoZSBmb2xsb3dpbmcgbmV3IG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIHRvICdzZXR1cCgpJzoKLQotICAgICAnaW5zdGFsbF9yZXF1aXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHByb2plY3QKLSAgICAgICAgdmVyc2lvbnMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIHJlcXVpcmVzIHdoZW4gaW5zdGFsbGVkLCBpbiB0aGUgZm9ybWF0Ci0gICAgICAgIHVzZWQgYnkgJ3BrZ19yZXNvdXJjZXMucmVxdWlyZSgpJy4gIFRoZXkgd2lsbCBiZSBpbnN0YWxsZWQKLSAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZC4gIElmIHlvdSB3aXNoIHRvIHVzZQotICAgICAgICBwYWNrYWdlcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGluIFB5UEksIG9yIHdhbnQgdG8gZ2l2ZSB5b3VyIHVzZXJzIGFuCi0gICAgICAgIGFsdGVybmF0ZSBkb3dubG9hZCBsb2NhdGlvbiwgeW91IGNhbiBhZGQgYSAnZmluZF9saW5rcycgb3B0aW9uIHRvIHRoZQotICAgICAgICAnW2Vhc3lfaW5zdGFsbF0nIHNlY3Rpb24gb2YgeW91ciBwcm9qZWN0J3MgJ3NldHVwLmNmZycgZmlsZSwgYW5kIHRoZW4KLSAgICAgICAgc2V0dXB0b29scyB3aWxsIHNjYW4gdGhlIGxpc3RlZCB3ZWIgcGFnZXMgZm9yIGxpbmtzIHRoYXQgc2F0aXNmeSB0aGUKLSAgICAgICAgcmVxdWlyZW1lbnRzLgotCi0gICAgICdleHRyYXNfcmVxdWlyZScgLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgbmFtZXMgb2Ygb3B0aW9uYWwgImV4dHJhcyIgdG8gdGhlCi0gICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQocykgdGhhdCB1c2luZyB0aG9zZSBleHRyYXMgaW5jdXJzLiBGb3IgZXhhbXBsZSwKLSAgICAgICAgdGhpczo6Ci0KLSAgICAgICAgICAgIGV4dHJhc19yZXF1aXJlID0gZGljdChyZVNUID0gWyJkb2N1dGlscz49MC4zIiwgInJlU1RlZGl0Il0pCi0KLSAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGFuIGV4dHJhCi0gICAgICAgIGNhcGFiaWxpdHkgY2FsbGVkICJyZVNUIiwgYnV0IGl0IGNhbiBvbmx5IGJlIHVzZWQgaWYgZG9jdXRpbHMgYW5kCi0gICAgICAgIHJlU1RlZGl0IGFyZSBpbnN0YWxsZWQuICBJZiB0aGUgdXNlciBpbnN0YWxscyB5b3VyIHBhY2thZ2UgdXNpbmcKLSAgICAgICAgRWFzeUluc3RhbGwgYW5kIHJlcXVlc3RzIG9uZSBvZiB5b3VyIGV4dHJhcywgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgd2lsbCBiZSBpbnN0YWxsZWQgaWYgbmVlZGVkLgotCi0gICAgICdmZWF0dXJlcycgLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3B0aW9uIG5hbWVzIHRvICdzZXR1cHRvb2xzLkZlYXR1cmUnCi0gICAgICAgIG9iamVjdHMuICBGZWF0dXJlcyBhcmUgYSBwb3J0aW9uIG9mIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjYW4gYmUKLSAgICAgICAgaW5jbHVkZWQgb3IgZXhjbHVkZWQgYmFzZWQgb24gdXNlciBvcHRpb25zLCBpbnRlci1mZWF0dXJlIGRlcGVuZGVuY2llcywKLSAgICAgICAgYW5kIGF2YWlsYWJpbGl0eSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBFeGNsdWRlZCBmZWF0dXJlcyBhcmUgb21pdHRlZAotICAgICAgICBmcm9tIGFsbCBzZXR1cCBjb21tYW5kcywgaW5jbHVkaW5nIHNvdXJjZSBhbmQgYmluYXJ5IGRpc3RyaWJ1dGlvbnMsIHNvCi0gICAgICAgIHlvdSBjYW4gY3JlYXRlIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnMgZnJvbSB0aGUgc2FtZSBzb3VyY2UgdHJlZS4KLSAgICAgICAgRmVhdHVyZSBuYW1lcyBzaG91bGQgYmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLCBleGNlcHQgdGhhdCB0aGV5IG1heQotICAgICAgICBjb250YWluIHRoZSAnLScgKG1pbnVzKSBzaWduLiAgRmVhdHVyZXMgY2FuIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkCi0gICAgICAgIHZpYSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0td2l0aC1YJyBhbmQgJy0td2l0aG91dC1YJywgd2hlcmUgJ1gnIGlzCi0gICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlLiAgV2hldGhlciBhIGZlYXR1cmUgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCwgYW5kCi0gICAgICAgIHdoZXRoZXIgeW91IGFyZSBhbGxvd2VkIHRvIGNvbnRyb2wgdGhpcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGlzCi0gICAgICAgIGRldGVybWluZWQgYnkgdGhlIEZlYXR1cmUgb2JqZWN0LiAgU2VlIHRoZSAnRmVhdHVyZScgY2xhc3MgZm9yIG1vcmUKLSAgICAgICAgaW5mb3JtYXRpb24uCi0KLSAgICAgJ3Rlc3Rfc3VpdGUnIC0tIHRoZSBuYW1lIG9mIGEgdGVzdCBzdWl0ZSB0byBydW4gZm9yIHRoZSAndGVzdCcgY29tbWFuZC4KLSAgICAgICAgSWYgdGhlIHVzZXIgcnVucyAncHl0aG9uIHNldHVwLnB5IHRlc3QnLCB0aGUgcGFja2FnZSB3aWxsIGJlIGluc3RhbGxlZCwKLSAgICAgICAgYW5kIHRoZSBuYW1lZCB0ZXN0IHN1aXRlIHdpbGwgYmUgcnVuLiAgVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcwotICAgICAgICB3b3VsZCBiZSB1c2VkIG9uIGEgJ3VuaXR0ZXN0LnB5JyBjb21tYW5kIGxpbmUuICBUaGF0IGlzLCBpdCBpcyB0aGUKLSAgICAgICAgZG90dGVkIG5hbWUgb2YgYW4gb2JqZWN0IHRvIGltcG9ydCBhbmQgY2FsbCB0byBnZW5lcmF0ZSBhIHRlc3Qgc3VpdGUuCi0KLSAgICAgJ3BhY2thZ2VfZGF0YScgLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byBsaXN0cyBvZiBmaWxlbmFtZXMKLSAgICAgICAgb3IgZ2xvYnMgdG8gdXNlIHRvIGZpbmQgZGF0YSBmaWxlcyBjb250YWluZWQgaW4gdGhlIG5hbWVkIHBhY2thZ2VzLgotICAgICAgICBJZiB0aGUgZGljdGlvbmFyeSBoYXMgZmlsZW5hbWVzIG9yIGdsb2JzIGxpc3RlZCB1bmRlciAnIiInICh0aGUgZW1wdHkKLSAgICAgICAgc3RyaW5nKSwgdGhvc2UgbmFtZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaW4gZXZlcnkgcGFja2FnZSwgaW4gYWRkaXRpb24KLSAgICAgICAgdG8gYW55IG5hbWVzIGZvciB0aGUgc3BlY2lmaWMgcGFja2FnZS4gIERhdGEgZmlsZXMgZm91bmQgdXNpbmcgdGhlc2UKLSAgICAgICAgbmFtZXMvZ2xvYnMgd2lsbCBiZSBpbnN0YWxsZWQgYWxvbmcgd2l0aCB0aGUgcGFja2FnZSwgaW4gdGhlIHNhbWUKLSAgICAgICAgbG9jYXRpb24gYXMgdGhlIHBhY2thZ2UuICBOb3RlIHRoYXQgZ2xvYnMgYXJlIGFsbG93ZWQgdG8gcmVmZXJlbmNlCi0gICAgICAgIHRoZSBjb250ZW50cyBvZiBub24tcGFja2FnZSBzdWJkaXJlY3RvcmllcywgYXMgbG9uZyBhcyB5b3UgdXNlICcvJyBhcwotICAgICAgICBhIHBhdGggc2VwYXJhdG9yLiAgKEdsb2JzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0bwotICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRocyBhdCBydW50aW1lLikKLQotICAgIEluIGFkZGl0aW9uIHRvIHRoZXNlIG5ldyBrZXl3b3JkcywgdGhpcyBjbGFzcyBhbHNvIGhhcyBzZXZlcmFsIG5ldyBtZXRob2RzCi0gICAgZm9yIG1hbmlwdWxhdGluZyB0aGUgZGlzdHJpYnV0aW9uJ3MgY29udGVudHMuICBGb3IgZXhhbXBsZSwgdGhlICdpbmNsdWRlKCknCi0gICAgYW5kICdleGNsdWRlKCknIG1ldGhvZHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgaW4tcGxhY2UgYWRkIGFuZCBzdWJ0cmFjdAotICAgIGNvbW1hbmRzIHRoYXQgYWRkIG9yIHJlbW92ZSBwYWNrYWdlcywgbW9kdWxlcywgZXh0ZW5zaW9ucywgYW5kIHNvIG9uIGZyb20KLSAgICB0aGUgZGlzdHJpYnV0aW9uLiAgVGhleSBhcmUgdXNlZCBieSB0aGUgZmVhdHVyZSBzdWJzeXN0ZW0gdG8gY29uZmlndXJlIHRoZQotICAgIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGluY2x1ZGVkIGFuZCBleGNsdWRlZCBmZWF0dXJlcy4KLSAgICAiIiIKLQotICAgIF9wYXRjaGVkX2Rpc3QgPSBOb25lCi0KLSAgICBkZWYgcGF0Y2hfbWlzc2luZ19wa2dfaW5mbyhzZWxmLCBhdHRycyk6Ci0gICAgICAgICMgRmFrZSB1cCBhIHJlcGxhY2VtZW50IGZvciB0aGUgZGF0YSB0aGF0IHdvdWxkIG5vcm1hbGx5IGNvbWUgZnJvbQotICAgICAgICAjIFBLRy1JTkZPLCBidXQgd2hpY2ggbWlnaHQgbm90IHlldCBiZSBidWlsdCBpZiB0aGlzIGlzIGEgZnJlc2gKLSAgICAgICAgIyBjaGVja291dC4KLSAgICAgICAgIwotICAgICAgICBpZiBub3QgYXR0cnMgb3IgJ25hbWUnIG5vdCBpbiBhdHRycyBvciAndmVyc2lvbicgbm90IGluIGF0dHJzOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGtleSA9IHBrZ19yZXNvdXJjZXMuc2FmZV9uYW1lKHN0cihhdHRyc1snbmFtZSddKSkubG93ZXIoKQotICAgICAgICBkaXN0ID0gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5ieV9rZXkuZ2V0KGtleSkKLSAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgbm90IGRpc3QuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgotICAgICAgICAgICAgZGlzdC5fdmVyc2lvbiA9IHBrZ19yZXNvdXJjZXMuc2FmZV92ZXJzaW9uKHN0cihhdHRyc1sndmVyc2lvbiddKSkKLSAgICAgICAgICAgIHNlbGYuX3BhdGNoZWRfZGlzdCA9IGRpc3QKLQotICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgYXR0cnM9Tm9uZSk6Ci0gICAgICAgIGhhdmVfcGFja2FnZV9kYXRhID0gaGFzYXR0cihzZWxmLCAicGFja2FnZV9kYXRhIikKLSAgICAgICAgaWYgbm90IGhhdmVfcGFja2FnZV9kYXRhOgotICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSB7fQotICAgICAgICBzZWxmLnJlcXVpcmVfZmVhdHVyZXMgPSBbXQotICAgICAgICBzZWxmLmZlYXR1cmVzID0ge30KLSAgICAgICAgc2VsZi5kaXN0X2ZpbGVzID0gW10KLSAgICAgICAgc2VsZi5wYXRjaF9taXNzaW5nX3BrZ19pbmZvKGF0dHJzKQotICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFueSBlZ2dzIG5lZWRlZCB0byBpbnRlcnByZXQgJ2F0dHJzJwotICAgICAgICBpZiBhdHRycyBhbmQgJ2RlcGVuZGVuY3lfbGlua3MnIGluIGF0dHJzOgotICAgICAgICAgICAgc2VsZi5kZXBlbmRlbmN5X2xpbmtzID0gYXR0cnMucG9wKCdkZXBlbmRlbmN5X2xpbmtzJykKLSAgICAgICAgICAgIGFzc2VydF9zdHJpbmdfbGlzdChzZWxmLCdkZXBlbmRlbmN5X2xpbmtzJyxzZWxmLmRlcGVuZGVuY3lfbGlua3MpCi0gICAgICAgIGlmIGF0dHJzIGFuZCAnc2V0dXBfcmVxdWlyZXMnIGluIGF0dHJzOgotICAgICAgICAgICAgc2VsZi5mZXRjaF9idWlsZF9lZ2dzKGF0dHJzLnBvcCgnc2V0dXBfcmVxdWlyZXMnKSkKLSAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5zZXR1cF9rZXl3b3JkcycpOgotICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZixlcC5uYW1lKToKLSAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsZXAubmFtZSxOb25lKQotICAgICAgICBfRGlzdHJpYnV0aW9uLl9faW5pdF9fKHNlbGYsYXR0cnMpCi0gICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5tZXRhZGF0YS52ZXJzaW9uLCAoaW50LGxvbmcsZmxvYXQpKToKLSAgICAgICAgICAgICMgU29tZSBwZW9wbGUgYXBwYXJlbnRseSB0YWtlICJ2ZXJzaW9uIG51bWJlciIgdG9vIGxpdGVyYWxseSA6KQotICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uID0gc3RyKHNlbGYubWV0YWRhdGEudmVyc2lvbikKLQotICAgIGRlZiBwYXJzZV9jb21tYW5kX2xpbmUoc2VsZik6Ci0gICAgICAgICIiIlByb2Nlc3MgZmVhdHVyZXMgYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyIiIgotICAgICAgICByZXN1bHQgPSBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbW1hbmRfbGluZShzZWxmKQotICAgICAgICBpZiBzZWxmLmZlYXR1cmVzOgotICAgICAgICAgICAgc2VsZi5fZmluYWxpemVfZmVhdHVyZXMoKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICBkZWYgX2ZlYXR1cmVfYXR0cm5hbWUoc2VsZixuYW1lKToKLSAgICAgICAgIiIiQ29udmVydCBmZWF0dXJlIG5hbWUgdG8gY29ycmVzcG9uZGluZyBvcHRpb24gYXR0cmlidXRlIG5hbWUiIiIKLSAgICAgICAgcmV0dXJuICd3aXRoXycrbmFtZS5yZXBsYWNlKCctJywnXycpCi0KLSAgICBkZWYgZmV0Y2hfYnVpbGRfZWdncyhzZWxmLCByZXF1aXJlcyk6Ci0gICAgICAgICIiIlJlc29sdmUgcHJlLXNldHVwIHJlcXVpcmVtZW50cyIiIgotICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHdvcmtpbmdfc2V0LCBwYXJzZV9yZXF1aXJlbWVudHMKLSAgICAgICAgZm9yIGRpc3QgaW4gd29ya2luZ19zZXQucmVzb2x2ZSgKLSAgICAgICAgICAgIHBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlcyksIGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZwotICAgICAgICApOgotICAgICAgICAgICAgd29ya2luZ19zZXQuYWRkKGRpc3QpCi0KLSAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKLSAgICAgICAgX0Rpc3RyaWJ1dGlvbi5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCi0gICAgICAgIGlmIHNlbGYuZmVhdHVyZXM6Ci0gICAgICAgICAgICBzZWxmLl9zZXRfZ2xvYmFsX29wdHNfZnJvbV9mZWF0dXJlcygpCi0KLSAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5zZXR1cF9rZXl3b3JkcycpOgotICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYsZXAubmFtZSxOb25lKQotICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCi0gICAgICAgICAgICAgICAgZXAubG9hZCgpKHNlbGYsIGVwLm5hbWUsIHZhbHVlKQotCi0gICAgZGVmIGZldGNoX2J1aWxkX2VnZyhzZWxmLCByZXEpOgotICAgICAgICAiIiJGZXRjaCBhbiBlZ2cgbmVlZGVkIGZvciBidWlsZGluZyIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjbWQgPSBzZWxmLl9lZ2dfZmV0Y2hlcgotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IGVhc3lfaW5zdGFsbAotICAgICAgICAgICAgZGlzdCA9IHNlbGYuX19jbGFzc19fKHsnc2NyaXB0X2FyZ3MnOlsnZWFzeV9pbnN0YWxsJ119KQotICAgICAgICAgICAgZGlzdC5wYXJzZV9jb25maWdfZmlsZXMoKQotICAgICAgICAgICAgb3B0cyA9IGRpc3QuZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQotICAgICAgICAgICAga2VlcCA9ICgKLSAgICAgICAgICAgICAgICAnZmluZF9saW5rcycsICdzaXRlX2RpcnMnLCAnaW5kZXhfdXJsJywgJ29wdGltaXplJywKLSAgICAgICAgICAgICAgICAnc2l0ZV9kaXJzJywgJ2FsbG93X2hvc3RzJwotICAgICAgICAgICAgKQotICAgICAgICAgICAgZm9yIGtleSBpbiBvcHRzLmtleXMoKToKLSAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIGtlZXA6Ci0gICAgICAgICAgICAgICAgICAgIGRlbCBvcHRzW2tleV0gICAjIGRvbid0IHVzZSBhbnkgb3RoZXIgc2V0dGluZ3MKLSAgICAgICAgICAgIGlmIHNlbGYuZGVwZW5kZW5jeV9saW5rczoKLSAgICAgICAgICAgICAgICBsaW5rcyA9IHNlbGYuZGVwZW5kZW5jeV9saW5rc1s6XQotICAgICAgICAgICAgICAgIGlmICdmaW5kX2xpbmtzJyBpbiBvcHRzOgotICAgICAgICAgICAgICAgICAgICBsaW5rcyA9IG9wdHNbJ2ZpbmRfbGlua3MnXVsxXS5zcGxpdCgpICsgbGlua3MKLSAgICAgICAgICAgICAgICBvcHRzWydmaW5kX2xpbmtzJ10gPSAoJ3NldHVwJywgbGlua3MpCi0gICAgICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCi0gICAgICAgICAgICAgICAgZGlzdCwgYXJncz1bIngiXSwgaW5zdGFsbF9kaXI9b3MuY3VyZGlyLCBleGNsdWRlX3NjcmlwdHM9VHJ1ZSwKLSAgICAgICAgICAgICAgICBhbHdheXNfY29weT1GYWxzZSwgYnVpbGRfZGlyZWN0b3J5PU5vbmUsIGVkaXRhYmxlPUZhbHNlLAotICAgICAgICAgICAgICAgIHVwZ3JhZGU9RmFsc2UsIG11bHRpX3ZlcnNpb249VHJ1ZSwgbm9fcmVwb3J0ID0gVHJ1ZQotICAgICAgICAgICAgKQotICAgICAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQotICAgICAgICAgICAgc2VsZi5fZWdnX2ZldGNoZXIgPSBjbWQKLSAgICAgICAgcmV0dXJuIGNtZC5lYXN5X2luc3RhbGwocmVxKQotCi0gICAgZGVmIF9zZXRfZ2xvYmFsX29wdHNfZnJvbV9mZWF0dXJlcyhzZWxmKToKLSAgICAgICAgIiIiQWRkIC0td2l0aC1YLy0td2l0aG91dC1YIG9wdGlvbnMgYmFzZWQgb24gb3B0aW9uYWwgZmVhdHVyZXMiIiIKLQotICAgICAgICBnbyA9IFtdCi0gICAgICAgIG5vID0gc2VsZi5uZWdhdGl2ZV9vcHQuY29weSgpCi0KLSAgICAgICAgZm9yIG5hbWUsZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLE5vbmUpCi0gICAgICAgICAgICBmZWF0dXJlLnZhbGlkYXRlKHNlbGYpCi0KLSAgICAgICAgICAgIGlmIGZlYXR1cmUub3B0aW9uYWw6Ci0gICAgICAgICAgICAgICAgZGVzY3IgPSBmZWF0dXJlLmRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgaW5jZGVmID0gJyAoZGVmYXVsdCknCi0gICAgICAgICAgICAgICAgZXhjZGVmPScnCi0gICAgICAgICAgICAgICAgaWYgbm90IGZlYXR1cmUuaW5jbHVkZV9ieV9kZWZhdWx0KCk6Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2RlZiwgaW5jZGVmID0gaW5jZGVmLCBleGNkZWYKLQotICAgICAgICAgICAgICAgIGdvLmFwcGVuZCgoJ3dpdGgtJytuYW1lLCBOb25lLCAnaW5jbHVkZSAnK2Rlc2NyK2luY2RlZikpCi0gICAgICAgICAgICAgICAgZ28uYXBwZW5kKCgnd2l0aG91dC0nK25hbWUsIE5vbmUsICdleGNsdWRlICcrZGVzY3IrZXhjZGVmKSkKLSAgICAgICAgICAgICAgICBub1snd2l0aG91dC0nK25hbWVdID0gJ3dpdGgtJytuYW1lCi0KLSAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuZmVhdHVyZV9vcHRpb25zID0gZ28gKyBzZWxmLmdsb2JhbF9vcHRpb25zCi0gICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5mZWF0dXJlX25lZ29wdCA9IG5vCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgZGVmIF9maW5hbGl6ZV9mZWF0dXJlcyhzZWxmKToKLSAgICAgICAgIiIiQWRkL3JlbW92ZSBmZWF0dXJlcyBhbmQgcmVzb2x2ZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVtIiIiCi0KLSAgICAgICAgIyBGaXJzdCwgZmxhZyBhbGwgdGhlIGVuYWJsZWQgaXRlbXMgKGFuZCB0aHVzIHRoZWlyIGRlcGVuZGVuY2llcykKLSAgICAgICAgZm9yIG5hbWUsZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6Ci0gICAgICAgICAgICBlbmFibGVkID0gc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpCi0gICAgICAgICAgICBpZiBlbmFibGVkIG9yIChlbmFibGVkIGlzIE5vbmUgYW5kIGZlYXR1cmUuaW5jbHVkZV9ieV9kZWZhdWx0KCkpOgotICAgICAgICAgICAgICAgIGZlYXR1cmUuaW5jbHVkZV9pbihzZWxmKQotICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsMSkKLQotICAgICAgICAjIFRoZW4gZGlzYWJsZSB0aGUgcmVzdCwgc28gdGhhdCBvZmYtYnktZGVmYXVsdCBmZWF0dXJlcyBkb24ndAotICAgICAgICAjIGdldCBmbGFnZ2VkIGFzIGVycm9ycyB3aGVuIHRoZXkncmUgcmVxdWlyZWQgYnkgYW4gZW5hYmxlZCBmZWF0dXJlCi0gICAgICAgIGZvciBuYW1lLGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgotICAgICAgICAgICAgaWYgbm90IHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKToKLSAgICAgICAgICAgICAgICBmZWF0dXJlLmV4Y2x1ZGVfZnJvbShzZWxmKQotICAgICAgICAgICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsMCkKLQotCi0gICAgZGVmIGdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpOgotICAgICAgICAiIiJQbHVnZ2FibGUgdmVyc2lvbiBvZiBnZXRfY29tbWFuZF9jbGFzcygpIiIiCi0gICAgICAgIGlmIGNvbW1hbmQgaW4gc2VsZi5jbWRjbGFzczoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdCi0KLSAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycsY29tbWFuZCk6Ci0gICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKLSAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbY29tbWFuZF0gPSBjbWRjbGFzcyA9IGVwLmxvYWQoKQotICAgICAgICAgICAgcmV0dXJuIGNtZGNsYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKQotCi0gICAgZGVmIHByaW50X2NvbW1hbmRzKHNlbGYpOgotICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJyk6Ci0gICAgICAgICAgICBpZiBlcC5uYW1lIG5vdCBpbiBzZWxmLmNtZGNsYXNzOgotICAgICAgICAgICAgICAgIGNtZGNsYXNzID0gZXAubG9hZChGYWxzZSkgIyBkb24ndCByZXF1aXJlIGV4dHJhcywgd2UncmUgbm90IHJ1bm5pbmcKLSAgICAgICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2VwLm5hbWVdID0gY21kY2xhc3MKLSAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24ucHJpbnRfY29tbWFuZHMoc2VsZikKLQotCi0KLQotCi0gICAgZGVmIF9zZXRfZmVhdHVyZShzZWxmLG5hbWUsc3RhdHVzKToKLSAgICAgICAgIiIiU2V0IGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIiIiCi0gICAgICAgIHNldGF0dHIoc2VsZixzZWxmLl9mZWF0dXJlX2F0dHJuYW1lKG5hbWUpLHN0YXR1cykKLQotICAgIGRlZiBmZWF0dXJlX2lzX2luY2x1ZGVkKHNlbGYsbmFtZSk6Ci0gICAgICAgICIiIlJldHVybiAxIGlmIGZlYXR1cmUgaXMgaW5jbHVkZWQsIDAgaWYgZXhjbHVkZWQsICdOb25lJyBpZiB1bmtub3duIiIiCi0gICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsc2VsZi5fZmVhdHVyZV9hdHRybmFtZShuYW1lKSkKLQotICAgIGRlZiBpbmNsdWRlX2ZlYXR1cmUoc2VsZixuYW1lKToKLSAgICAgICAgIiIiUmVxdWVzdCBpbmNsdXNpb24gb2YgZmVhdHVyZSBuYW1lZCAnbmFtZSciIiIKLQotICAgICAgICBpZiBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSk9PTA6Ci0gICAgICAgICAgICBkZXNjciA9IHNlbGYuZmVhdHVyZXNbbmFtZV0uZGVzY3JpcHRpb24KLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAotICAgICAgICAgICAgICAgZGVzY3IgKyAiIGlzIHJlcXVpcmVkLCBidXQgd2FzIGV4Y2x1ZGVkIG9yIGlzIG5vdCBhdmFpbGFibGUiCi0gICAgICAgICAgICkKLSAgICAgICAgc2VsZi5mZWF0dXJlc1tuYW1lXS5pbmNsdWRlX2luKHNlbGYpCi0gICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsMSkKLQotICAgIGRlZiBpbmNsdWRlKHNlbGYsKiphdHRycyk6Ci0gICAgICAgICIiIkFkZCBpdGVtcyB0byBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKLQotICAgICAgICBGb3IgZXhhbXBsZSwgJ2Rpc3QuZXhjbHVkZShweV9tb2R1bGVzPVsieCJdKScgd291bGQgYWRkICd4JyB0bwotICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZSwgaWYgaXQgd2FzIG5vdCBhbHJlYWR5Ci0gICAgICAgIHRoZXJlLgotCi0gICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBpbmNsdXNpb24gZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLSAgICAgICAgbGlzdHMgb3IgdHVwbGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yIGFkZGluZyB0byBvdGhlcgotICAgICAgICBhdHRyaWJ1dGVzIGluIHRoaXMgb3IgYSBzdWJjbGFzcywgeW91IGNhbiBhZGQgYW4gJ19pbmNsdWRlX1gnIG1ldGhvZCwKLSAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKLSAgICAgICAgdGhlIHZhbHVlIHBhc3NlZCB0byAnaW5jbHVkZSgpJy4gIFNvLCAnZGlzdC5pbmNsdWRlKGZvbz17ImJhciI6ImJheiJ9KScKLSAgICAgICAgd2lsbCB0cnkgdG8gY2FsbCAnZGlzdC5faW5jbHVkZV9mb28oeyJiYXIiOiJiYXoifSknLCB3aGljaCBjYW4gdGhlbgotICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBpbmNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgotICAgICAgICAiIiIKLSAgICAgICAgZm9yIGssdiBpbiBhdHRycy5pdGVtcygpOgotICAgICAgICAgICAgaW5jbHVkZSA9IGdldGF0dHIoc2VsZiwgJ19pbmNsdWRlXycraywgTm9uZSkKLSAgICAgICAgICAgIGlmIGluY2x1ZGU6Ci0gICAgICAgICAgICAgICAgaW5jbHVkZSh2KQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9pbmNsdWRlX21pc2Moayx2KQotCi0gICAgZGVmIGV4Y2x1ZGVfcGFja2FnZShzZWxmLHBhY2thZ2UpOgotICAgICAgICAiIiJSZW1vdmUgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb25zIGluIG5hbWVkIHBhY2thZ2UiIiIKLQotICAgICAgICBwZnggPSBwYWNrYWdlKycuJwotICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgotICAgICAgICAgICAgc2VsZi5wYWNrYWdlcyA9IFsKLSAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYucGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgaWYgcDw+cGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCi0gICAgICAgICAgICBdCi0KLSAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgotICAgICAgICAgICAgc2VsZi5weV9tb2R1bGVzID0gWwotICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5weV9tb2R1bGVzCi0gICAgICAgICAgICAgICAgICAgIGlmIHA8PnBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQotICAgICAgICAgICAgXQotCi0gICAgICAgIGlmIHNlbGYuZXh0X21vZHVsZXM6Ci0gICAgICAgICAgICBzZWxmLmV4dF9tb2R1bGVzID0gWwotICAgICAgICAgICAgICAgIHAgZm9yIHAgaW4gc2VsZi5leHRfbW9kdWxlcwotICAgICAgICAgICAgICAgICAgICBpZiBwLm5hbWU8PnBhY2thZ2UgYW5kIG5vdCBwLm5hbWUuc3RhcnRzd2l0aChwZngpCi0gICAgICAgICAgICBdCi0KLQotICAgIGRlZiBoYXNfY29udGVudHNfZm9yKHNlbGYscGFja2FnZSk6Ci0gICAgICAgICIiIlJldHVybiB0cnVlIGlmICdleGNsdWRlX3BhY2thZ2UocGFja2FnZSknIHdvdWxkIGRvIHNvbWV0aGluZyIiIgotCi0gICAgICAgIHBmeCA9IHBhY2thZ2UrJy4nCi0KLSAgICAgICAgZm9yIHAgaW4gc2VsZi5pdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcygpOgotICAgICAgICAgICAgaWYgcD09cGFja2FnZSBvciBwLnN0YXJ0c3dpdGgocGZ4KToKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgZGVmIF9leGNsdWRlX21pc2Moc2VsZixuYW1lLHZhbHVlKToKLSAgICAgICAgIiIiSGFuZGxlICdleGNsdWRlKCknIGZvciBsaXN0L3R1cGxlIGF0dHJzIHdpdGhvdXQgYSBzcGVjaWFsIGhhbmRsZXIiIiIKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsc2VxdWVuY2UpOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKLSAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgKCVyKSIgJSAobmFtZSwgdmFsdWUpCi0gICAgICAgICAgICApCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZixuYW1lKQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAotICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCi0gICAgICAgICAgICApCi0gICAgICAgIGlmIG9sZCBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2Uob2xkLHNlcXVlbmNlKToKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCi0gICAgICAgICAgICAgICAgbmFtZSsiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKLSAgICAgICAgICAgICkKLSAgICAgICAgZWxpZiBvbGQ6Ci0gICAgICAgICAgICBzZXRhdHRyKHNlbGYsbmFtZSxbaXRlbSBmb3IgaXRlbSBpbiBvbGQgaWYgaXRlbSBub3QgaW4gdmFsdWVdKQotCi0gICAgZGVmIF9pbmNsdWRlX21pc2Moc2VsZixuYW1lLHZhbHVlKToKLSAgICAgICAgIiIiSGFuZGxlICdpbmNsdWRlKCknIGZvciBsaXN0L3R1cGxlIGF0dHJzIHdpdGhvdXQgYSBzcGVjaWFsIGhhbmRsZXIiIiIKLQotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSxzZXF1ZW5jZSk6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAotICAgICAgICAgICAgICAgICIlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCAoJXIpIiAlIChuYW1lLCB2YWx1ZSkKLSAgICAgICAgICAgICkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb2xkID0gZ2V0YXR0cihzZWxmLG5hbWUpCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCi0gICAgICAgICAgICAgICAgIiVzOiBObyBzdWNoIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIiAlIG5hbWUKLSAgICAgICAgICAgICkKLSAgICAgICAgaWYgb2xkIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZXRhdHRyKHNlbGYsbmFtZSx2YWx1ZSkKLSAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvbGQsc2VxdWVuY2UpOgotICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKLSAgICAgICAgICAgICAgICBuYW1lKyI6IHRoaXMgc2V0dGluZyBjYW5ub3QgYmUgY2hhbmdlZCB2aWEgaW5jbHVkZS9leGNsdWRlIgotICAgICAgICAgICAgKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2V0YXR0cihzZWxmLG5hbWUsb2xkK1tpdGVtIGZvciBpdGVtIGluIHZhbHVlIGlmIGl0ZW0gbm90IGluIG9sZF0pCi0KLSAgICBkZWYgZXhjbHVkZShzZWxmLCoqYXR0cnMpOgotICAgICAgICAiIiJSZW1vdmUgaXRlbXMgZnJvbSBkaXN0cmlidXRpb24gdGhhdCBhcmUgbmFtZWQgaW4ga2V5d29yZCBhcmd1bWVudHMKLQotICAgICAgICBGb3IgZXhhbXBsZSwgJ2Rpc3QuZXhjbHVkZShweV9tb2R1bGVzPVsieCJdKScgd291bGQgcmVtb3ZlICd4JyBmcm9tCi0gICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLiAgRXhjbHVkaW5nIHBhY2thZ2VzIHVzZXMKLSAgICAgICAgdGhlICdleGNsdWRlX3BhY2thZ2UoKScgbWV0aG9kLCBzbyBhbGwgb2YgdGhlIHBhY2thZ2UncyBjb250YWluZWQKLSAgICAgICAgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb25zIGFyZSBhbHNvIGV4Y2x1ZGVkLgotCi0gICAgICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSBzdXBwb3J0cyBleGNsdXNpb24gZnJvbSBhdHRyaWJ1dGVzIHRoYXQgYXJlCi0gICAgICAgIGxpc3RzIG9yIHR1cGxlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBleGNsdWRpbmcgZnJvbSBvdGhlcgotICAgICAgICBhdHRyaWJ1dGVzIGluIHRoaXMgb3IgYSBzdWJjbGFzcywgeW91IGNhbiBhZGQgYW4gJ19leGNsdWRlX1gnIG1ldGhvZCwKLSAgICAgICAgd2hlcmUgJ1gnIGlzIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGgKLSAgICAgICAgdGhlIHZhbHVlIHBhc3NlZCB0byAnZXhjbHVkZSgpJy4gIFNvLCAnZGlzdC5leGNsdWRlKGZvbz17ImJhciI6ImJheiJ9KScKLSAgICAgICAgd2lsbCB0cnkgdG8gY2FsbCAnZGlzdC5fZXhjbHVkZV9mb28oeyJiYXIiOiJiYXoifSknLCB3aGljaCBjYW4gdGhlbgotICAgICAgICBoYW5kbGUgd2hhdGV2ZXIgc3BlY2lhbCBleGNsdXNpb24gbG9naWMgaXMgbmVlZGVkLgotICAgICAgICAiIiIKLSAgICAgICAgZm9yIGssdiBpbiBhdHRycy5pdGVtcygpOgotICAgICAgICAgICAgZXhjbHVkZSA9IGdldGF0dHIoc2VsZiwgJ19leGNsdWRlXycraywgTm9uZSkKLSAgICAgICAgICAgIGlmIGV4Y2x1ZGU6Ci0gICAgICAgICAgICAgICAgZXhjbHVkZSh2KQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLl9leGNsdWRlX21pc2Moayx2KQotCi0gICAgZGVmIF9leGNsdWRlX3BhY2thZ2VzKHNlbGYscGFja2FnZXMpOgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlcyxzZXF1ZW5jZSk6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAotICAgICAgICAgICAgICAgICJwYWNrYWdlczogc2V0dGluZyBtdXN0IGJlIGEgbGlzdCBvciB0dXBsZSAoJXIpIiAlIChwYWNrYWdlcywpCi0gICAgICAgICAgICApCi0gICAgICAgIG1hcChzZWxmLmV4Y2x1ZGVfcGFja2FnZSwgcGFja2FnZXMpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgZGVmIF9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKToKLSAgICAgICAgIyBSZW1vdmUgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyB3aGVuIHByb2Nlc3NpbmcgY29tbWFuZCBhcmdzCi0gICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBzZWxmLl9fY2xhc3NfXy5nbG9iYWxfb3B0aW9ucwotICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuX19jbGFzc19fLm5lZ2F0aXZlX29wdAotCi0gICAgICAgICMgRmlyc3QsIGV4cGFuZCBhbnkgYWxpYXNlcwotICAgICAgICBjb21tYW5kID0gYXJnc1swXQotICAgICAgICBhbGlhc2VzID0gc2VsZi5nZXRfb3B0aW9uX2RpY3QoJ2FsaWFzZXMnKQotICAgICAgICB3aGlsZSBjb21tYW5kIGluIGFsaWFzZXM6Ci0gICAgICAgICAgICBzcmMsYWxpYXMgPSBhbGlhc2VzW2NvbW1hbmRdCi0gICAgICAgICAgICBkZWwgYWxpYXNlc1tjb21tYW5kXSAgICAjIGVuc3VyZSBlYWNoIGFsaWFzIGNhbiBleHBhbmQgb25seSBvbmNlIQotICAgICAgICAgICAgaW1wb3J0IHNobGV4Ci0gICAgICAgICAgICBhcmdzWzoxXSA9IHNobGV4LnNwbGl0KGFsaWFzLFRydWUpCi0gICAgICAgICAgICBjb21tYW5kID0gYXJnc1swXQotCi0gICAgICAgIG5hcmdzID0gX0Rpc3RyaWJ1dGlvbi5fcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncykKLQotICAgICAgICAjIEhhbmRsZSBjb21tYW5kcyB0aGF0IHdhbnQgdG8gY29uc3VtZSBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cwotICAgICAgICBjbWRfY2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCi0gICAgICAgIGlmIGdldGF0dHIoY21kX2NsYXNzLCdjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cycsTm9uZSk6Ci0gICAgICAgICAgICBzZWxmLmdldF9vcHRpb25fZGljdChjb21tYW5kKVsnYXJncyddID0gKCJjb21tYW5kIGxpbmUiLCBuYXJncykKLSAgICAgICAgICAgIGlmIG5hcmdzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHJldHVybiBbXQotCi0gICAgICAgIHJldHVybiBuYXJncwotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgZGVmIGdldF9jbWRsaW5lX29wdGlvbnMoc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBhICd7Y21kOiB7b3B0OnZhbH19JyBtYXAgb2YgYWxsIGNvbW1hbmQtbGluZSBvcHRpb25zCi0KLSAgICAgICAgT3B0aW9uIG5hbWVzIGFyZSBhbGwgbG9uZywgYnV0IGRvIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nICctLScsIGFuZAotICAgICAgICBjb250YWluIGRhc2hlcyByYXRoZXIgdGhhbiB1bmRlcnNjb3Jlcy4gIElmIHRoZSBvcHRpb24gZG9lc24ndCB0YWtlCi0gICAgICAgIGFuIGFyZ3VtZW50IChlLmcuICctLXF1aWV0JyksIHRoZSAndmFsJyBpcyAnTm9uZScuCi0KLSAgICAgICAgTm90ZSB0aGF0IG9wdGlvbnMgcHJvdmlkZWQgYnkgY29uZmlnIGZpbGVzIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkLgotICAgICAgICAiIiIKLQotICAgICAgICBkID0ge30KLQotICAgICAgICBmb3IgY21kLG9wdHMgaW4gc2VsZi5jb21tYW5kX29wdGlvbnMuaXRlbXMoKToKLQotICAgICAgICAgICAgZm9yIG9wdCwoc3JjLHZhbCkgaW4gb3B0cy5pdGVtcygpOgotCi0gICAgICAgICAgICAgICAgaWYgc3JjICE9ICJjb21tYW5kIGxpbmUiOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgICAgICAgICAgb3B0ID0gb3B0LnJlcGxhY2UoJ18nLCctJykKLQotICAgICAgICAgICAgICAgIGlmIHZhbD09MDoKLSAgICAgICAgICAgICAgICAgICAgY21kb2JqID0gc2VsZi5nZXRfY29tbWFuZF9vYmooY21kKQotICAgICAgICAgICAgICAgICAgICBuZWdfb3B0ID0gc2VsZi5uZWdhdGl2ZV9vcHQuY29weSgpCi0gICAgICAgICAgICAgICAgICAgIG5lZ19vcHQudXBkYXRlKGdldGF0dHIoY21kb2JqLCduZWdhdGl2ZV9vcHQnLHt9KSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIG5lZyxwb3MgaW4gbmVnX29wdC5pdGVtcygpOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgcG9zPT1vcHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0PW5lZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbD1Ob25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgaGVyZSIpCi0KLSAgICAgICAgICAgICAgICBlbGlmIHZhbD09MToKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gTm9uZQotCi0gICAgICAgICAgICAgICAgZC5zZXRkZWZhdWx0KGNtZCx7fSlbb3B0XSA9IHZhbAotCi0gICAgICAgIHJldHVybiBkCi0KLQotICAgIGRlZiBpdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKLSAgICAgICAgIiIiWWllbGQgYWxsIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9uIG5hbWVzIGluIGRpc3RyaWJ1dGlvbiIiIgotCi0gICAgICAgIGZvciBwa2cgaW4gc2VsZi5wYWNrYWdlcyBvciAoKToKLSAgICAgICAgICAgIHlpZWxkIHBrZwotCi0gICAgICAgIGZvciBtb2R1bGUgaW4gc2VsZi5weV9tb2R1bGVzIG9yICgpOgotICAgICAgICAgICAgeWllbGQgbW9kdWxlCi0KLSAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dF9tb2R1bGVzIG9yICgpOgotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsdHVwbGUpOgotICAgICAgICAgICAgICAgIG5hbWUsYnVpbGRpbmZvID0gZXh0Ci0gICAgICAgICAgICAgICAgeWllbGQgbmFtZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB5aWVsZCBleHQubmFtZQotCi0jIEluc3RhbGwgaXQgdGhyb3VnaG91dCB0aGUgZGlzdHV0aWxzCi1mb3IgbW9kdWxlIGluIGRpc3R1dGlscy5kaXN0LCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmNtZDoKLSAgICBtb2R1bGUuRGlzdHJpYnV0aW9uID0gRGlzdHJpYnV0aW9uCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWNsYXNzIEZlYXR1cmU6Ci0gICAgIiIiQSBzdWJzZXQgb2YgdGhlIGRpc3RyaWJ1dGlvbiB0aGF0IGNhbiBiZSBleGNsdWRlZCBpZiB1bm5lZWRlZC93YW50ZWQKLQotICAgIEZlYXR1cmVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZXNlIGtleXdvcmQgYXJndW1lbnRzOgotCi0gICAgICAnZGVzY3JpcHRpb24nIC0tIGEgc2hvcnQsIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlLCB0bwotICAgICAgICAgYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcywgYW5kIG9wdGlvbiBoZWxwIG1lc3NhZ2VzLgotCi0gICAgICAnc3RhbmRhcmQnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaWYgaXQgaXMKLSAgICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzeXN0ZW0uICBPdGhlcndpc2UsIHRoZSBmZWF0dXJlIGlzIG9ubHkKLSAgICAgICAgIGluY2x1ZGVkIGlmIHJlcXVlc3RlZCB2aWEgYSBjb21tYW5kIGxpbmUgJy0td2l0aC1YJyBvcHRpb24sIG9yIGlmCi0gICAgICAgICBhbm90aGVyIGluY2x1ZGVkIGZlYXR1cmUgcmVxdWlyZXMgaXQuICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdGYWxzZScuCi0KLSAgICAgICdhdmFpbGFibGUnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlIGlzIGF2YWlsYWJsZSBmb3IgaW5zdGFsbGF0aW9uIG9uIHRoZQotICAgICAgICAgY3VycmVudCBzeXN0ZW0uICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdUcnVlJy4KLQotICAgICAgJ29wdGlvbmFsJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBjYW4gYmUgY29udHJvbGxlZCBmcm9tIHRoZQotICAgICAgICAgY29tbWFuZCBsaW5lLCB1c2luZyB0aGUgJy0td2l0aC1YJyBvciAnLS13aXRob3V0LVgnIG9wdGlvbnMuICBJZgotICAgICAgICAgZmFsc2UsIHRoZSBmZWF0dXJlJ3MgaW5jbHVzaW9uIHN0YXR1cyBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHksCi0gICAgICAgICBiYXNlZCBvbiAnYXZhaWxhYmlsZScsICdzdGFuZGFyZCcsIGFuZCB3aGV0aGVyIGFueSBvdGhlciBmZWF0dXJlCi0gICAgICAgICByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgotCi0gICAgICAncmVxdWlyZV9mZWF0dXJlcycgLS0gYSBzdHJpbmcgb3Igc2VxdWVuY2Ugb2Ygc3RyaW5ncyBuYW1pbmcgZmVhdHVyZXMKLSAgICAgICAgIHRoYXQgc2hvdWxkIGFsc28gYmUgaW5jbHVkZWQgaWYgdGhpcyBmZWF0dXJlIGlzIGluY2x1ZGVkLiAgRGVmYXVsdHMgdG8KLSAgICAgICAgIGVtcHR5IGxpc3QuICBNYXkgYWxzbyBjb250YWluICdSZXF1aXJlJyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlCi0gICAgICAgICBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAgICAgJ3JlbW92ZScgLS0gYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBwYWNrYWdlcyB0byBiZSByZW1vdmVkCi0gICAgICAgICBmcm9tIHRoZSBkaXN0cmlidXRpb24gaWYgdGhpcyBmZWF0dXJlIGlzICpub3QqIGluY2x1ZGVkLiAgSWYgdGhlCi0gICAgICAgICBmZWF0dXJlICppcyogaW5jbHVkZWQsIHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoaXMgYXJndW1lbnQgZXhpc3RzCi0gICAgICAgICB0byBzdXBwb3J0IHJlbW92aW5nIGZlYXR1cmVzIHRoYXQgImNyb3NzY3V0IiBhIGRpc3RyaWJ1dGlvbiwgc3VjaCBhcwotICAgICAgICAgZGVmaW5pbmcgYSAndGVzdHMnIGZlYXR1cmUgdGhhdCByZW1vdmVzIGFsbCB0aGUgJ3Rlc3RzJyBzdWJwYWNrYWdlcwotICAgICAgICAgcHJvdmlkZWQgYnkgb3RoZXIgZmVhdHVyZXMuICBUaGUgZGVmYXVsdCBmb3IgdGhpcyBhcmd1bWVudCBpcyBhbiBlbXB0eQotICAgICAgICAgbGlzdC4gIChOb3RlOiB0aGUgbmFtZWQgcGFja2FnZShzKSBvciBtb2R1bGVzIG11c3QgZXhpc3QgaW4gdGhlIGJhc2UKLSAgICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuIHRoZSAnc2V0dXAoKScgZnVuY3Rpb24gaXMgaW5pdGlhbGx5IGNhbGxlZC4pCi0KLSAgICAgIG90aGVyIGtleXdvcmRzIC0tIGFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc2F2ZWQsIGFuZCBwYXNzZWQgdG8KLSAgICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAnaW5jbHVkZSgpJyBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyB3aGVuIHRoZQotICAgICAgICAgZmVhdHVyZSBpcyBpbmNsdWRlZCBvciBleGNsdWRlZCwgcmVzcGVjdGl2ZWx5LiAgU28sIGZvciBleGFtcGxlLCB5b3UKLSAgICAgICAgIGNvdWxkIHBhc3MgJ3BhY2thZ2VzPVsiYSIsImIiXScgdG8gY2F1c2UgcGFja2FnZXMgJ2EnIGFuZCAnYicgdG8gYmUKLSAgICAgICAgIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGFzIGFwcHJvcHJpYXRlLgotCi0gICAgQSBmZWF0dXJlIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgJ3JlcXVpcmVzJywgJ3JlbW92ZScsIG9yIG90aGVyCi0gICAga2V5d29yZCBhcmd1bWVudC4gIE90aGVyd2lzZSwgaXQgY2FuJ3QgYWZmZWN0IHRoZSBkaXN0cmlidXRpb24gaW4gYW55IHdheS4KLSAgICBOb3RlIGFsc28gdGhhdCB5b3UgY2FuIHN1YmNsYXNzICdGZWF0dXJlJyB0byBjcmVhdGUgeW91ciBvd24gc3BlY2lhbGl6ZWQKLSAgICBmZWF0dXJlIHR5cGVzIHRoYXQgbW9kaWZ5IHRoZSBkaXN0cmlidXRpb24gaW4gb3RoZXIgd2F5cyB3aGVuIGluY2x1ZGVkIG9yCi0gICAgZXhjbHVkZWQuICBTZWUgdGhlIGRvY3N0cmluZ3MgZm9yIHRoZSB2YXJpb3VzIG1ldGhvZHMgaGVyZSBmb3IgbW9yZSBkZXRhaWwuCi0gICAgQXNpZGUgZnJvbSB0aGUgbWV0aG9kcywgdGhlIG9ubHkgZmVhdHVyZSBhdHRyaWJ1dGVzIHRoYXQgZGlzdHJpYnV0aW9ucyBsb29rCi0gICAgYXQgYXJlICdkZXNjcmlwdGlvbicgYW5kICdvcHRpb25hbCcuCi0gICAgIiIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlc2NyaXB0aW9uLCBzdGFuZGFyZD1GYWxzZSwgYXZhaWxhYmxlPVRydWUsCi0gICAgICAgIG9wdGlvbmFsPVRydWUsIHJlcXVpcmVfZmVhdHVyZXM9KCksIHJlbW92ZT0oKSwgKipleHRyYXMKLSAgICApOgotCi0gICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgotICAgICAgICBzZWxmLnN0YW5kYXJkID0gc3RhbmRhcmQKLSAgICAgICAgc2VsZi5hdmFpbGFibGUgPSBhdmFpbGFibGUKLSAgICAgICAgc2VsZi5vcHRpb25hbCA9IG9wdGlvbmFsCi0gICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZV9mZWF0dXJlcywoc3RyLFJlcXVpcmUpKToKLSAgICAgICAgICAgIHJlcXVpcmVfZmVhdHVyZXMgPSByZXF1aXJlX2ZlYXR1cmVzLAotCi0gICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFsKLSAgICAgICAgICAgIHIgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBpc2luc3RhbmNlKHIsc3RyKQotICAgICAgICBdCi0gICAgICAgIGVyID0gW3IgZm9yIHIgaW4gcmVxdWlyZV9mZWF0dXJlcyBpZiBub3QgaXNpbnN0YW5jZShyLHN0cildCi0gICAgICAgIGlmIGVyOiBleHRyYXNbJ3JlcXVpcmVfZmVhdHVyZXMnXSA9IGVyCi0KLSAgICAgICAgaWYgaXNpbnN0YW5jZShyZW1vdmUsc3RyKToKLSAgICAgICAgICAgIHJlbW92ZSA9IHJlbW92ZSwKLSAgICAgICAgc2VsZi5yZW1vdmUgPSByZW1vdmUKLSAgICAgICAgc2VsZi5leHRyYXMgPSBleHRyYXMKLQotICAgICAgICBpZiBub3QgcmVtb3ZlIGFuZCBub3QgcmVxdWlyZV9mZWF0dXJlcyBhbmQgbm90IGV4dHJhczoKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCi0gICAgICAgICAgICAgICAgIkZlYXR1cmUgJXM6IG11c3QgZGVmaW5lICdyZXF1aXJlX2ZlYXR1cmVzJywgJ3JlbW92ZScsIG9yIGF0IGxlYXN0IG9uZSIKLSAgICAgICAgICAgICAgICAiIG9mICdwYWNrYWdlcycsICdweV9tb2R1bGVzJywgZXRjLiIKLSAgICAgICAgICAgICkKLQotICAgIGRlZiBpbmNsdWRlX2J5X2RlZmF1bHQoc2VsZik6Ci0gICAgICAgICIiIlNob3VsZCB0aGlzIGZlYXR1cmUgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdD8iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuYXZhaWxhYmxlIGFuZCBzZWxmLnN0YW5kYXJkCi0KLSAgICBkZWYgaW5jbHVkZV9pbihzZWxmLGRpc3QpOgotCi0gICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGFuZCBpdHMgcmVxdWlyZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiBkaXN0cmlidXRpb24KLQotICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgotICAgICAgICB0aGUgZGlzdHJpYnV0aW9uLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKLSAgICAgICAgcGVyIGZlYXR1cmUsIGFuZCBzbyBzaG91bGQgYmUgaWRlbXBvdGVudC4KLQotICAgICAgICAiIiIKLQotICAgICAgICBpZiBub3Qgc2VsZi5hdmFpbGFibGU6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAotICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpcHRpb24rIiBpcyByZXF1aXJlZCwiCi0gICAgICAgICAgICAgICAgImJ1dCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iCi0gICAgICAgICAgICApCi0KLSAgICAgICAgZGlzdC5pbmNsdWRlKCoqc2VsZi5leHRyYXMpCi0KLSAgICAgICAgZm9yIGYgaW4gc2VsZi5yZXF1aXJlX2ZlYXR1cmVzOgotICAgICAgICAgICAgZGlzdC5pbmNsdWRlX2ZlYXR1cmUoZikKLQotCi0KLSAgICBkZWYgZXhjbHVkZV9mcm9tKHNlbGYsZGlzdCk6Ci0KLSAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgaXMgZXhjbHVkZWQgZnJvbSBkaXN0cmlidXRpb24KLQotICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbgotICAgICAgICB0aGUgZGlzdHJpYnV0aW9uLiAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHBlcgotICAgICAgICBmZWF0dXJlLCBhbmQgb25seSBhZnRlciBhbGwgaW5jbHVkZWQgZmVhdHVyZXMgaGF2ZSBiZWVuIGFza2VkIHRvCi0gICAgICAgIGluY2x1ZGUgdGhlbXNlbHZlcy4KLSAgICAgICAgIiIiCi0KLSAgICAgICAgZGlzdC5leGNsdWRlKCoqc2VsZi5leHRyYXMpCi0KLSAgICAgICAgaWYgc2VsZi5yZW1vdmU6Ci0gICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKLSAgICAgICAgICAgICAgICBkaXN0LmV4Y2x1ZGVfcGFja2FnZShpdGVtKQotCi0KLQotICAgIGRlZiB2YWxpZGF0ZShzZWxmLGRpc3QpOgotCi0gICAgICAgICIiIlZlcmlmeSB0aGF0IGZlYXR1cmUgbWFrZXMgc2Vuc2UgaW4gY29udGV4dCBvZiBkaXN0cmlidXRpb24KLQotICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRpc3RyaWJ1dGlvbiBqdXN0IGJlZm9yZSBpdCBwYXJzZXMgaXRzCi0gICAgICAgIGNvbW1hbmQgbGluZS4gIEl0IGNoZWNrcyB0byBlbnN1cmUgdGhhdCB0aGUgJ3JlbW92ZScgYXR0cmlidXRlLCBpZiBhbnksCi0gICAgICAgIGNvbnRhaW5zIG9ubHkgdmFsaWQgcGFja2FnZS9tb2R1bGUgbmFtZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgYmFzZQotICAgICAgICBkaXN0cmlidXRpb24gd2hlbiAnc2V0dXAoKScgaXMgY2FsbGVkLiAgWW91IG1heSBvdmVycmlkZSBpdCBpbiBhCi0gICAgICAgIHN1YmNsYXNzIHRvIHBlcmZvcm0gYW55IG90aGVyIHJlcXVpcmVkIHZhbGlkYXRpb24gb2YgdGhlIGZlYXR1cmUKLSAgICAgICAgYWdhaW5zdCBhIHRhcmdldCBkaXN0cmlidXRpb24uCi0gICAgICAgICIiIgotCi0gICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgotICAgICAgICAgICAgaWYgbm90IGRpc3QuaGFzX2NvbnRlbnRzX2ZvcihpdGVtKToKLSAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAotICAgICAgICAgICAgICAgICAgICAiJXMgd2FudHMgdG8gYmUgYWJsZSB0byByZW1vdmUgJXMsIGJ1dCB0aGUgZGlzdHJpYnV0aW9uIgotICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3QgY29udGFpbiBhbnkgcGFja2FnZXMgb3IgbW9kdWxlcyB1bmRlciAlcyIKLSAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgaXRlbSwgaXRlbSkKLSAgICAgICAgICAgICAgICApCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9leHRlbnNpb24ucHkgYi9MaWIvc2V0dXB0b29scy9leHRlbnNpb24ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmY2Y1NWIuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRXh0ZW5zaW9uIGFzIF9FeHRlbnNpb24KLWZyb20gZGlzdCBpbXBvcnQgX2dldF91bnBhdGNoZWQKLV9FeHRlbnNpb24gPSBfZ2V0X3VucGF0Y2hlZChfRXh0ZW5zaW9uKQotCi10cnk6Ci0gICAgZnJvbSBQeXJleC5EaXN0dXRpbHMuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBoYXZlX3B5cmV4ID0gRmFsc2UKLWVsc2U6Ci0gICAgaGF2ZV9weXJleCA9IFRydWUKLQotCi1jbGFzcyBFeHRlbnNpb24oX0V4dGVuc2lvbik6Ci0gICAgIiIiRXh0ZW5zaW9uIHRoYXQgdXNlcyAnLmMnIGZpbGVzIGluIHBsYWNlIG9mICcucHl4JyBmaWxlcyIiIgotCi0gICAgaWYgbm90IGhhdmVfcHlyZXg6Ci0gICAgICAgICMgY29udmVydCAucHl4IGV4dGVuc2lvbnMgdG8gLmMKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsKmFyZ3MsKiprdyk6Ci0gICAgICAgICAgICBfRXh0ZW5zaW9uLl9faW5pdF9fKHNlbGYsKmFyZ3MsKiprdykKLSAgICAgICAgICAgIHNvdXJjZXMgPSBbXQotICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5zb3VyY2VzOgotICAgICAgICAgICAgICAgIGlmIHMuZW5kc3dpdGgoJy5weXgnKToKLSAgICAgICAgICAgICAgICAgICAgc291cmNlcy5hcHBlbmQoc1s6LTNdKydjJykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLmFwcGVuZChzKQotICAgICAgICAgICAgc2VsZi5zb3VyY2VzID0gc291cmNlcwotCi1jbGFzcyBMaWJyYXJ5KEV4dGVuc2lvbik6Ci0gICAgIiIiSnVzdCBsaWtlIGEgcmVndWxhciBFeHRlbnNpb24sIGJ1dCBidWlsdCBhcyBhIGxpYnJhcnkgaW5zdGVhZCIiIgotCi1pbXBvcnQgc3lzLCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmV4dGVuc2lvbgotZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uID0gRXh0ZW5zaW9uCi1kaXN0dXRpbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbiA9IEV4dGVuc2lvbgotaWYgJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCcgaW4gc3lzLm1vZHVsZXM6Ci0gICAgc3lzLm1vZHVsZXNbJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCddLkV4dGVuc2lvbiA9IEV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvZ3VpLmV4ZSBiL0xpYi9zZXR1cHRvb2xzL2d1aS5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzZmYzNWYuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvZ3VpLmV4ZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkgYi9MaWIvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDdlMjIyLi4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotIiIiUHlQSSBhbmQgZGlyZWN0IHBhY2thZ2UgZG93bmxvYWRpbmciIiIKLQotaW1wb3J0IHN5cywgb3MucGF0aCwgcmUsIHVybHBhcnNlLCB1cmxsaWIyLCBzaHV0aWwsIHJhbmRvbSwgc29ja2V0Ci1mcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKLWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKLWZyb20gbWQ1IGltcG9ydCBtZDUKLWZyb20gZm5tYXRjaCBpbXBvcnQgdHJhbnNsYXRlCi0KLUVHR19GUkFHTUVOVCA9IHJlLmNvbXBpbGUocideZWdnPShbLUEtWmEtejAtOV8uXSspJCcpCi1IUkVGID0gcmUuY29tcGlsZSgiIiJocmVmXFxzKj1cXHMqWyciXT8oW14nIj4gXSspIiIiLCByZS5JKQotIyB0aGlzIGlzIGhlcmUgdG8gZml4IGVtYWNzJyBjcnVkZHkgYnJva2VuIHN5bnRheCBoaWdobGlnaHRpbmcKLVBZUElfTUQ1ID0gcmUuY29tcGlsZSgKLSAgICAnPGEgaHJlZj0iKFteIiNdKykiPihbXjxdKyk8L2E+XG5ccytcXCg8YSBocmVmPSJbXj9dK1w/OmFjdGlvbj1zaG93X21kNScKLSAgICAnJmFtcDtkaWdlc3Q9KFswLTlhLWZdezMyfSkiPm1kNTwvYT5cXCknCi0pCi0KLVVSTF9TQ0hFTUUgPSByZS5jb21waWxlKCcoWy0rLmEtejAtOV17Mix9KTonLHJlLkkpLm1hdGNoCi1FWFRFTlNJT05TID0gIi50YXIuZ3ogLnRhci5iejIgLnRhciAuemlwIC50Z3oiLnNwbGl0KCkKLQotX19hbGxfXyA9IFsKLSAgICAnUGFja2FnZUluZGV4JywgJ2Rpc3Ryb3NfZm9yX3VybCcsICdwYXJzZV9iZGlzdF93aW5pbnN0JywKLSAgICAnaW50ZXJwcmV0X2Rpc3Ryb19uYW1lJywKLV0KLQotCi1kZWYgcGFyc2VfYmRpc3Rfd2luaW5zdChuYW1lKToKLSAgICAiIiJSZXR1cm4gKGJhc2UscHl2ZXJzaW9uKSBvciAoTm9uZSxOb25lKSBmb3IgcG9zc2libGUgLmV4ZSBuYW1lIiIiCi0KLSAgICBsb3dlciA9IG5hbWUubG93ZXIoKQotICAgIGJhc2UsIHB5X3ZlciA9IE5vbmUsIE5vbmUKLQotICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZXhlJyk6Ci0gICAgICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcud2luMzIuZXhlJyk6Ci0gICAgICAgICAgICBiYXNlID0gbmFtZVs6LTEwXQotICAgICAgICBlbGlmIGxvd2VyLnN0YXJ0c3dpdGgoJy53aW4zMi1weScsLTE2KToKLSAgICAgICAgICAgIHB5X3ZlciA9IG5hbWVbLTc6LTRdCi0gICAgICAgICAgICBiYXNlID0gbmFtZVs6LTE2XQotCi0gICAgcmV0dXJuIGJhc2UscHlfdmVyCi0KLWRlZiBlZ2dfaW5mb19mb3JfdXJsKHVybCk6Ci0gICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtZXRlcnMsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKLSAgICBiYXNlID0gdXJsbGliMi51bnF1b3RlKHBhdGguc3BsaXQoJy8nKVstMV0pCi0gICAgaWYgJyMnIGluIGJhc2U6IGJhc2UsIGZyYWdtZW50ID0gYmFzZS5zcGxpdCgnIycsMSkKLSAgICByZXR1cm4gYmFzZSxmcmFnbWVudAotCi1kZWYgZGlzdHJvc19mb3JfdXJsKHVybCwgbWV0YWRhdGE9Tm9uZSk6Ci0gICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGF0IGEgVVJMIiIiCi0gICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHVybCkKLSAgICBkaXN0cyA9IGRpc3Ryb3NfZm9yX2xvY2F0aW9uKHVybCwgYmFzZSwgbWV0YWRhdGEpCi0gICAgaWYgZnJhZ21lbnQgYW5kIG5vdCBkaXN0czoKLSAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpCi0gICAgICAgIGlmIG1hdGNoOgotICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZSgKLSAgICAgICAgICAgICAgICB1cmwsIG1hdGNoLmdyb3VwKDEpLCBtZXRhZGF0YSwgcHJlY2VkZW5jZSA9IENIRUNLT1VUX0RJU1QKLSAgICAgICAgICAgICkKLSAgICByZXR1cm4gZGlzdHMKLQotZGVmIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGE9Tm9uZSk6Ci0gICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBiYXNlbmFtZSIiIgotICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgotICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzotNF0gICAgIyBzdHJpcCB0aGUgLnppcAotICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZWdnJyk6ICAgIyBvbmx5IG9uZSwgdW5hbWJpZ3VvdXMgaW50ZXJwcmV0YXRpb24KLSAgICAgICAgcmV0dXJuIFtEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhKV0KLQotICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZXhlJyk6Ci0gICAgICAgIHdpbl9iYXNlLCBweV92ZXIgPSBwYXJzZV9iZGlzdF93aW5pbnN0KGJhc2VuYW1lKQotICAgICAgICBpZiB3aW5fYmFzZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCi0gICAgICAgICAgICAgICAgbG9jYXRpb24sIHdpbl9iYXNlLCBtZXRhZGF0YSwgcHlfdmVyLCBCSU5BUllfRElTVCwgIndpbjMyIgotICAgICAgICAgICAgKQotCi0gICAgIyBUcnkgc291cmNlIGRpc3RybyBleHRlbnNpb25zICguemlwLCAudGd6LCBldGMuKQotICAgICMKLSAgICBmb3IgZXh0IGluIEVYVEVOU0lPTlM6Ci0gICAgICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKGV4dCk6Ci0gICAgICAgICAgICBiYXNlbmFtZSA9IGJhc2VuYW1lWzotbGVuKGV4dCldCi0gICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEpCi0gICAgcmV0dXJuIFtdICAjIG5vIGV4dGVuc2lvbiBtYXRjaGVkCi0KLQotZGVmIGRpc3Ryb3NfZm9yX2ZpbGVuYW1lKGZpbGVuYW1lLCBtZXRhZGF0YT1Ob25lKToKLSAgICAiIiJZaWVsZCBwb3NzaWJsZSBlZ2cgb3Igc291cmNlIGRpc3RyaWJ1dGlvbiBvYmplY3RzIGJhc2VkIG9uIGEgZmlsZW5hbWUiIiIKLSAgICByZXR1cm4gZGlzdHJvc19mb3JfbG9jYXRpb24oCi0gICAgICAgIG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIG1ldGFkYXRhCi0gICAgKQotCi0KLWRlZiBpbnRlcnByZXRfZGlzdHJvX25hbWUobG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSwKLSAgICBweV92ZXJzaW9uPU5vbmUsIHByZWNlZGVuY2U9U09VUkNFX0RJU1QsIHBsYXRmb3JtPU5vbmUKLSk6Ci0gICAgIiIiR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCi0KLSAgICBOb3RlOiBpZiBgbG9jYXRpb25gIGlzIGEgZmlsZXN5c3RlbSBmaWxlbmFtZSwgeW91IHNob3VsZCBjYWxsCi0gICAgYGBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKClgYCBvbiBpdCBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzCi0gICAgcm91dGluZSEKLSAgICAiIiIKLQotICAgICMgR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCi0gICAgIyBCZWNhdXNlIHNvbWUgcGFja2FnZXMgYXJlIGFtYmlndW91cyBhcyB0byBuYW1lL3ZlcnNpb25zIHNwbGl0Ci0gICAgIyBlLmcuICJhZG5zLXB5dGhvbi0xLjEuMCIsICJlZ2VuaXgtbXgtY29tbWVyY2lhbCIsIGV0Yy4KLSAgICAjIFNvLCB3ZSBnZW5lcmF0ZSBlYWNoIHBvc3NpYmxlIGludGVyZXByZXRhdGlvbiAoZS5nLiAiYWRucywgcHl0aG9uLTEuMS4wIgotICAgICMgImFkbnMtcHl0aG9uLCAxLjEuMCIsIGFuZCAiYWRucy1weXRob24tMS4xLjAsIG5vIHZlcnNpb24iKS4gIEluIHByYWN0aWNlLAotICAgICMgdGhlIHNwdXJpb3VzIGludGVycHJldGF0aW9ucyBzaG91bGQgYmUgaWdub3JlZCwgYmVjYXVzZSBpbiB0aGUgZXZlbnQKLSAgICAjIHRoZXJlJ3MgYWxzbyBhbiAiYWRucyIgcGFja2FnZSwgdGhlIHNwdXJpb3VzICJweXRob24tMS4xLjAiIHZlcnNpb24gd2lsbAotICAgICMgY29tcGFyZSBsb3dlciB0aGFuIGFueSBudW1lcmljIHZlcnNpb24gbnVtYmVyLCBhbmQgaXMgdGhlcmVmb3JlIHVubGlrZWx5Ci0gICAgIyB0byBtYXRjaCBhIHJlcXVlc3QgZm9yIGl0LiAgSXQncyBzdGlsbCBhIHBvdGVudGlhbCBwcm9ibGVtLCB0aG91Z2gsIGFuZAotICAgICMgaW4gdGhlIGxvbmcgcnVuIFB5UEkgYW5kIHRoZSBkaXN0dXRpbHMgc2hvdWxkIGdvIGZvciAic2FmZSIgbmFtZXMgYW5kCi0gICAgIyB2ZXJzaW9ucyBpbiBkaXN0cmlidXRpb24gYXJjaGl2ZSBuYW1lcyAoc2Rpc3QgYW5kIGJkaXN0KS4KLQotICAgIHBhcnRzID0gYmFzZW5hbWUuc3BsaXQoJy0nKQotICAgIGZvciBwIGluIHJhbmdlKDEsbGVuKHBhcnRzKSsxKToKLSAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uKAotICAgICAgICAgICAgbG9jYXRpb24sIG1ldGFkYXRhLCAnLScuam9pbihwYXJ0c1s6cF0pLCAnLScuam9pbihwYXJ0c1twOl0pLAotICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwcmVjZWRlbmNlID0gcHJlY2VkZW5jZSwKLSAgICAgICAgICAgIHBsYXRmb3JtID0gcGxhdGZvcm0KLSAgICAgICAgKQotCi0KLQotCi0KLWNsYXNzIFBhY2thZ2VJbmRleChFbnZpcm9ubWVudCk6Ci0gICAgIiIiQSBkaXN0cmlidXRpb24gaW5kZXggdGhhdCBzY2FucyB3ZWIgcGFnZXMgZm9yIGRvd25sb2FkIFVSTHMiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLGluZGV4X3VybD0iaHR0cDovL3d3dy5weXRob24ub3JnL3B5cGkiLGhvc3RzPSgnKicsKSwqYXJncywqKmt3KToKLSAgICAgICAgRW52aXJvbm1lbnQuX19pbml0X18oc2VsZiwqYXJncywqKmt3KQotICAgICAgICBzZWxmLmluZGV4X3VybCA9IGluZGV4X3VybCArICIvIls6bm90IGluZGV4X3VybC5lbmRzd2l0aCgnLycpXQotICAgICAgICBzZWxmLnNjYW5uZWRfdXJscyA9IHt9Ci0gICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzID0ge30KLSAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzID0ge30KLSAgICAgICAgc2VsZi5hbGxvd3MgPSByZS5jb21waWxlKCd8Jy5qb2luKG1hcCh0cmFuc2xhdGUsaG9zdHMpKSkubWF0Y2gKLSAgICAgICAgc2VsZi50b19zY2FuID0gW10KLQotICAgIGRlZiBwcm9jZXNzX3VybChzZWxmLCB1cmwsIHJldHJpZXZlPUZhbHNlKToKLSAgICAgICAgIiIiRXZhbHVhdGUgYSBVUkwgYXMgYSBwb3NzaWJsZSBkb3dubG9hZCwgYW5kIG1heWJlIHJldHJpZXZlIGl0IiIiCi0gICAgICAgIHVybCA9IGZpeF9zZl91cmwodXJsKQotICAgICAgICBpZiB1cmwgaW4gc2VsZi5zY2FubmVkX3VybHMgYW5kIG5vdCByZXRyaWV2ZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnNjYW5uZWRfdXJsc1t1cmxdID0gVHJ1ZQotICAgICAgICBpZiBub3QgVVJMX1NDSEVNRSh1cmwpOgotICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKHVybCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGlzdHMgPSBsaXN0KGRpc3Ryb3NfZm9yX3VybCh1cmwpKQotICAgICAgICAgICAgaWYgZGlzdHM6Ci0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIHNlbGYuZGVidWcoIkZvdW5kIGxpbms6ICVzIiwgdXJsKQotCi0gICAgICAgIGlmIGRpc3RzIG9yIG5vdCByZXRyaWV2ZSBvciB1cmwgaW4gc2VsZi5mZXRjaGVkX3VybHM6Ci0gICAgICAgICAgICBtYXAoc2VsZi5hZGQsIGRpc3RzKQotICAgICAgICAgICAgcmV0dXJuICAjIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBwYWdlCi0KLSAgICAgICAgaWYgbm90IHNlbGYudXJsX29rKHVybCk6Ci0gICAgICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gVHJ1ZQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgc2VsZi5pbmZvKCJSZWFkaW5nICVzIiwgdXJsKQotICAgICAgICBmID0gc2VsZi5vcGVuX3VybCh1cmwpCi0gICAgICAgIHNlbGYuZmV0Y2hlZF91cmxzW3VybF0gPSBzZWxmLmZldGNoZWRfdXJsc1tmLnVybF0gPSBUcnVlCi0KLQotICAgICAgICBpZiAnaHRtbCcgbm90IGluIGYuaGVhZGVyc1snY29udGVudC10eXBlJ10ubG93ZXIoKToKLSAgICAgICAgICAgIGYuY2xvc2UoKSAgICMgbm90IGh0bWwsIHdlIGNhbid0IHByb2Nlc3MgaXQKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGJhc2UgPSBmLnVybCAgICAgIyBoYW5kbGUgcmVkaXJlY3RzCi0gICAgICAgIHBhZ2UgPSBmLnJlYWQoKQotICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoc2VsZi5pbmRleF91cmwpOgotICAgICAgICAgICAgcGFnZSA9IHNlbGYucHJvY2Vzc19pbmRleCh1cmwsIHBhZ2UpCi0KLSAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6Ci0gICAgICAgICAgICBsaW5rID0gdXJscGFyc2UudXJsam9pbihiYXNlLCBtYXRjaC5ncm91cCgxKSkKLSAgICAgICAgICAgIHNlbGYucHJvY2Vzc191cmwobGluaykKLQotICAgIGRlZiBwcm9jZXNzX2ZpbGVuYW1lKHNlbGYsIGZuLCBuZXN0ZWQ9RmFsc2UpOgotICAgICAgICAjIHByb2Nlc3MgZmlsZW5hbWVzIG9yIGRpcmVjdG9yaWVzCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbik6Ci0gICAgICAgICAgICBzZWxmLndhcm4oIk5vdCBmb3VuZDogJXMiLCB1cmwpCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZuKSBhbmQgbm90IG5lc3RlZDoKLSAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGZuKQotICAgICAgICAgICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcihwYXRoKToKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZmlsZW5hbWUob3MucGF0aC5qb2luKHBhdGgsaXRlbSksIFRydWUpCi0KLSAgICAgICAgZGlzdHMgPSBkaXN0cm9zX2Zvcl9maWxlbmFtZShmbikKLSAgICAgICAgaWYgZGlzdHM6Ci0gICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZDogJXMiLCBmbikKLSAgICAgICAgICAgIG1hcChzZWxmLmFkZCwgZGlzdHMpCi0KLSAgICBkZWYgdXJsX29rKHNlbGYsIHVybCwgZmF0YWw9RmFsc2UpOgotICAgICAgICBpZiBzZWxmLmFsbG93cyh1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzFdKToKLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgIG1zZyA9ICJcbkxpbmsgdG8gJSBzICoqKkJMT0NLRUQqKiogYnkgLS1hbGxvdy1ob3N0c1xuIgotICAgICAgICBpZiBmYXRhbDoKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKG1zZyAlIHVybCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYud2Fybihtc2csIHVybCkKLQotCi0KLSAgICBkZWYgcHJvY2Vzc19pbmRleChzZWxmLHVybCxwYWdlKToKLSAgICAgICAgIiIiUHJvY2VzcyB0aGUgY29udGVudHMgb2YgYSBQeVBJIHBhZ2UiIiIKLSAgICAgICAgZGVmIHNjYW4obGluayk6Ci0gICAgICAgICAgICAjIFByb2Nlc3MgYSBVUkwgdG8gc2VlIGlmIGl0J3MgZm9yIGEgcGFja2FnZSBwYWdlCi0gICAgICAgICAgICBpZiBsaW5rLnN0YXJ0c3dpdGgoc2VsZi5pbmRleF91cmwpOgotICAgICAgICAgICAgICAgIHBhcnRzID0gbWFwKAotICAgICAgICAgICAgICAgICAgICB1cmxsaWIyLnVucXVvdGUsIGxpbmtbbGVuKHNlbGYuaW5kZXhfdXJsKTpdLnNwbGl0KCcvJykKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgaWYgbGVuKHBhcnRzKT09MjoKLSAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgcGFja2FnZSBwYWdlLCBzYW5pdGl6ZSBhbmQgaW5kZXggaXQKLSAgICAgICAgICAgICAgICAgICAgcGtnID0gc2FmZV9uYW1lKHBhcnRzWzBdKQotICAgICAgICAgICAgICAgICAgICB2ZXIgPSBzYWZlX3ZlcnNpb24ocGFydHNbMV0pCi0gICAgICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9wYWdlcy5zZXRkZWZhdWx0KHBrZy5sb3dlcigpLHt9KVtsaW5rXSA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvX2ZpbGVuYW1lKHBrZyksIHRvX2ZpbGVuYW1lKHZlcikKLSAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCi0KLSAgICAgICAgaWYgdXJsPT1zZWxmLmluZGV4X3VybCBvciAnSW5kZXggb2YgUGFja2FnZXM8L3RpdGxlPicgaW4gcGFnZToKLSAgICAgICAgICAgICMgcHJvY2VzcyBhbiBpbmRleCBwYWdlIGludG8gdGhlIHBhY2thZ2UtcGFnZSBpbmRleAotICAgICAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIocGFnZSk6Ci0gICAgICAgICAgICAgICAgc2NhbiggdXJscGFyc2UudXJsam9pbih1cmwsIG1hdGNoLmdyb3VwKDEpKSApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwa2csdmVyID0gc2Nhbih1cmwpICAgIyBlbnN1cmUgdGhpcyBwYWdlIGlzIGluIHRoZSBwYWdlIGluZGV4Ci0gICAgICAgICAgICAjIHByb2Nlc3MgaW5kaXZpZHVhbCBwYWNrYWdlIHBhZ2UKLSAgICAgICAgICAgIGZvciB0YWcgaW4gKCI8dGg+SG9tZSBQYWdlIiwgIjx0aD5Eb3dubG9hZCBVUkwiKToKLSAgICAgICAgICAgICAgICBwb3MgPSBwYWdlLmZpbmQodGFnKQotICAgICAgICAgICAgICAgIGlmIHBvcyE9LTE6Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gSFJFRi5zZWFyY2gocGFnZSxwb3MpCi0gICAgICAgICAgICAgICAgICAgIGlmIG1hdGNoOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIHRoZSBmb3VuZCBVUkwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld191cmwgPSB1cmxwYXJzZS51cmxqb2luKHVybCwgbWF0Y2guZ3JvdXAoMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBmcmFnID0gZWdnX2luZm9fZm9yX3VybChuZXdfdXJsKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5JykgYW5kIG5vdCBmcmFnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBrZyBhbmQgdmVyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdXJsKz0nI2VnZz0lcy0lcycgJSAocGtnLHZlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5lZWRfdmVyc2lvbl9pbmZvKHVybCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwobmV3X3VybCkKLSAgICAgICAgcmV0dXJuIFBZUElfTUQ1LnN1YigKLSAgICAgICAgICAgIGxhbWJkYSBtOiAnPGEgaHJlZj0iJXMjbWQ1PSVzIj4lczwvYT4nICUgbS5ncm91cCgxLDMsMiksIHBhZ2UKLSAgICAgICAgKQotCi0gICAgZGVmIG5lZWRfdmVyc2lvbl9pbmZvKHNlbGYsIHVybCk6Ci0gICAgICAgIHNlbGYuc2Nhbl9hbGwoCi0gICAgICAgICAgICAiUGFnZSBhdCAlcyBsaW5rcyB0byAucHkgZmlsZShzKSB3aXRob3V0IHZlcnNpb24gaW5mbzsgYW4gaW5kZXggIgotICAgICAgICAgICAgInNjYW4gaXMgcmVxdWlyZWQuIiwgdXJsCi0gICAgICAgICkKLQotICAgIGRlZiBzY2FuX2FsbChzZWxmLCBtc2c9Tm9uZSwgKmFyZ3MpOgotICAgICAgICBpZiBzZWxmLmluZGV4X3VybCBub3QgaW4gc2VsZi5mZXRjaGVkX3VybHM6Ci0gICAgICAgICAgICBpZiBtc2c6IHNlbGYud2Fybihtc2csKmFyZ3MpCi0gICAgICAgICAgICBzZWxmLndhcm4oCi0gICAgICAgICAgICAgICAgIlNjYW5uaW5nIGluZGV4IG9mIGFsbCBwYWNrYWdlcyAodGhpcyBtYXkgdGFrZSBhIHdoaWxlKSIKLSAgICAgICAgICAgICkKLSAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCkKLQotICAgIGRlZiBmaW5kX3BhY2thZ2VzKHNlbGYsIHJlcXVpcmVtZW50KToKLSAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCArIHJlcXVpcmVtZW50LnVuc2FmZV9uYW1lKycvJykKLQotICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgotICAgICAgICAgICAgIyBGYWxsIGJhY2sgdG8gc2FmZSB2ZXJzaW9uIG9mIHRoZSBuYW1lCi0gICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHNlbGYuaW5kZXhfdXJsICsgcmVxdWlyZW1lbnQucHJvamVjdF9uYW1lKycvJykKLQotICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgotICAgICAgICAgICAgIyBXZSBjb3VsZG4ndCBmaW5kIHRoZSB0YXJnZXQgcGFja2FnZSwgc28gc2VhcmNoIHRoZSBpbmRleCBwYWdlIHRvbwotICAgICAgICAgICAgc2VsZi53YXJuKAotICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIGluZGV4IHBhZ2UgZm9yICVyIChtYXliZSBtaXNzcGVsbGVkPykiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LnVuc2FmZV9uYW1lCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBzZWxmLnNjYW5fYWxsKCkKLQotICAgICAgICBmb3IgdXJsIGluIHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5LCgpKToKLSAgICAgICAgICAgICMgc2NhbiBlYWNoIHBhZ2UgdGhhdCBtaWdodCBiZSByZWxhdGVkIHRvIHRoZSBkZXNpcmVkIHBhY2thZ2UKLSAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwodXJsKQotCi0gICAgZGVmIG9idGFpbihzZWxmLCByZXF1aXJlbWVudCwgaW5zdGFsbGVyPU5vbmUpOgotICAgICAgICBzZWxmLnByZXNjYW4oKTsgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQotICAgICAgICBmb3IgZGlzdCBpbiBzZWxmW3JlcXVpcmVtZW50LmtleV06Ci0gICAgICAgICAgICBpZiBkaXN0IGluIHJlcXVpcmVtZW50OgotICAgICAgICAgICAgICAgIHJldHVybiBkaXN0Ci0gICAgICAgICAgICBzZWxmLmRlYnVnKCIlcyBkb2VzIG5vdCBtYXRjaCAlcyIsIHJlcXVpcmVtZW50LCBkaXN0KQotICAgICAgICByZXR1cm4gc3VwZXIoUGFja2FnZUluZGV4LCBzZWxmKS5vYnRhaW4ocmVxdWlyZW1lbnQsaW5zdGFsbGVyKQotCi0gICAgZGVmIGNoZWNrX21kNShzZWxmLCBjcywgaW5mbywgZmlsZW5hbWUsIHRmcCk6Ci0gICAgICAgIGlmIHJlLm1hdGNoKCdtZDU9WzAtOWEtZl17MzJ9JCcsIGluZm8pOgotICAgICAgICAgICAgc2VsZi5kZWJ1ZygiVmFsaWRhdGluZyBtZDUgY2hlY2tzdW0gZm9yICVzIiwgZmlsZW5hbWUpCi0gICAgICAgICAgICBpZiBjcy5oZXhkaWdlc3QoKTw+aW5mb1s0Ol06Ci0gICAgICAgICAgICAgICAgdGZwLmNsb3NlKCkKLSAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJNRDUgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICIrb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkrCi0gICAgICAgICAgICAgICAgICAgICI7IHBvc3NpYmxlIGRvd25sb2FkIHByb2JsZW0/IgotICAgICAgICAgICAgICAgICkKLQotICAgIGRlZiBhZGRfZmluZF9saW5rcyhzZWxmLCB1cmxzKToKLSAgICAgICAgIiIiQWRkIGB1cmxzYCB0byB0aGUgbGlzdCB0aGF0IHdpbGwgYmUgcHJlc2Nhbm5lZCBmb3Igc2VhcmNoZXMiIiIKLSAgICAgICAgZm9yIHVybCBpbiB1cmxzOgotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIHNlbGYudG9fc2NhbiBpcyBOb25lICAgICAgICAjIGlmIHdlIGhhdmUgYWxyZWFkeSAiZ29uZSBvbmxpbmUiCi0gICAgICAgICAgICAgICAgb3Igbm90IFVSTF9TQ0hFTUUodXJsKSAgICAgICMgb3IgaXQncyBhIGxvY2FsIGZpbGUvZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgb3IgdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6JykKLSAgICAgICAgICAgICAgICBvciBsaXN0KGRpc3Ryb3NfZm9yX3VybCh1cmwpKSAgICMgb3IgYSBkaXJlY3QgcGFja2FnZSBsaW5rCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgICMgdGhlbiBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpdCBub3cKLSAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIGRlZmVyIHJldHJpZXZhbCB0aWxsIGxhdGVyCi0gICAgICAgICAgICAgICAgc2VsZi50b19zY2FuLmFwcGVuZCh1cmwpCi0KLSAgICBkZWYgcHJlc2NhbihzZWxmKToKLSAgICAgICAgIiIiU2NhbiB1cmxzIHNjaGVkdWxlZCBmb3IgcHJlc2Nhbm5pbmcgKGUuZy4gLS1maW5kLWxpbmtzKSIiIgotICAgICAgICBpZiBzZWxmLnRvX3NjYW46Ci0gICAgICAgICAgICBtYXAoc2VsZi5zY2FuX3VybCwgc2VsZi50b19zY2FuKQotICAgICAgICBzZWxmLnRvX3NjYW4gPSBOb25lICAgICAjIGZyb20gbm93IG9uLCBnbyBhaGVhZCBhbmQgcHJvY2VzcyBpbW1lZGlhdGVseQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgZGVmIGRvd25sb2FkKHNlbGYsIHNwZWMsIHRtcGRpcik6Ci0gICAgICAgICIiIkxvY2F0ZSBhbmQvb3IgZG93bmxvYWQgYHNwZWNgIHRvIGB0bXBkaXJgLCByZXR1cm5pbmcgYSBsb2NhbCBwYXRoCi0KLSAgICAgICAgYHNwZWNgIG1heSBiZSBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QsIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBVUkwsCi0gICAgICAgIGFuIGV4aXN0aW5nIGxvY2FsIGZpbGVuYW1lLCBvciBhIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjCi0gICAgICAgIChpLmUuIHRoZSBzdHJpbmcgZm9ybSBvZiBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QpLiAgSWYgaXQgaXMgdGhlIFVSTAotICAgICAgICBvZiBhIC5weSBmaWxlIHdpdGggYW4gdW5hbWJpZ3VvdXMgYGAjZWdnPW5hbWUtdmVyc2lvbmBgIHRhZyAoaS5lLiwgb25lCi0gICAgICAgIHRoYXQgZXNjYXBlcyBgYC1gYCBhcyBgYF9gYCB0aHJvdWdob3V0KSwgYSB0cml2aWFsIGBgc2V0dXAucHlgYCBpcwotICAgICAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYWxvbmdzaWRlIHRoZSBkb3dubG9hZGVkIGZpbGUuCi0KLSAgICAgICAgSWYgYHNwZWNgIGlzIGEgYGBSZXF1aXJlbWVudGBgIG9iamVjdCBvciBhIHN0cmluZyBjb250YWluaW5nIGEKLSAgICAgICAgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxvY2F0aW9uIG9mCi0gICAgICAgIGEgbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIChwb3NzaWJseSBhZnRlciBkb3dubG9hZGluZyBpdCB0byBgdG1wZGlyYCkuCi0gICAgICAgIElmIGBzcGVjYCBpcyBhIGxvY2FsbHkgZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkgbmFtZSwgaXQgaXMgc2ltcGx5Ci0gICAgICAgIHJldHVybmVkIHVuY2hhbmdlZC4gIElmIGBzcGVjYCBpcyBhIFVSTCwgaXQgaXMgZG93bmxvYWRlZCB0byBhIHN1YnBhdGgKLSAgICAgICAgb2YgYHRtcGRpcmAsIGFuZCB0aGUgbG9jYWwgZmlsZW5hbWUgaXMgcmV0dXJuZWQuICBWYXJpb3VzIGVycm9ycyBtYXkgYmUKLSAgICAgICAgcmFpc2VkIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGRvd25sb2FkaW5nLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYyxSZXF1aXJlbWVudCk6Ci0gICAgICAgICAgICBzY2hlbWUgPSBVUkxfU0NIRU1FKHNwZWMpCi0gICAgICAgICAgICBpZiBzY2hlbWU6Ci0gICAgICAgICAgICAgICAgIyBJdCdzIGEgdXJsLCBkb3dubG9hZCBpdCB0byB0bXBkaXIKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2Rvd25sb2FkX3VybChzY2hlbWUuZ3JvdXAoMSksIHNwZWMsIHRtcGRpcikKLSAgICAgICAgICAgICAgICBiYXNlLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwoc3BlYykKLSAgICAgICAgICAgICAgICBpZiBiYXNlLmVuZHN3aXRoKCcucHknKToKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLmdlbl9zZXR1cChmb3VuZCxmcmFnbWVudCx0bXBkaXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCi0gICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNwZWMpOgotICAgICAgICAgICAgICAgICMgRXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnksIGp1c3QgcmV0dXJuIGl0Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBzcGVjID0gUmVxdWlyZW1lbnQucGFyc2Uoc3BlYykKLSAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm90IGEgVVJMLCBleGlzdGluZyBmaWxlLCBvciByZXF1aXJlbWVudCBzcGVjOiAlciIgJQotICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWMsKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHNwZWMsIHRtcGRpciksJ2xvY2F0aW9uJyxOb25lKQotCi0KLSAgICBkZWYgZmV0Y2hfZGlzdHJpYnV0aW9uKHNlbGYsCi0gICAgICAgIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSwgZGV2ZWxvcF9vaz1GYWxzZQotICAgICk6Ci0gICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBzdWl0YWJsZSBmb3IgZnVsZmlsbGluZyBgcmVxdWlyZW1lbnRgCi0KLSAgICAgICAgYHJlcXVpcmVtZW50YCBtdXN0IGJlIGEgYGBwa2dfcmVzb3VyY2VzLlJlcXVpcmVtZW50YGAgaW5zdGFuY2UuCi0gICAgICAgIElmIG5lY2Vzc2FyeSwgb3IgaWYgdGhlIGBmb3JjZV9zY2FuYCBmbGFnIGlzIHNldCwgdGhlIHJlcXVpcmVtZW50IGlzCi0gICAgICAgIHNlYXJjaGVkIGZvciBpbiB0aGUgKG9ubGluZSkgcGFja2FnZSBpbmRleCBhcyB3ZWxsIGFzIHRoZSBsb2NhbGx5Ci0gICAgICAgIGluc3RhbGxlZCBwYWNrYWdlcy4gIElmIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgaXMgZm91bmQsCi0gICAgICAgIHRoZSByZXR1cm5lZCBkaXN0cmlidXRpb24ncyBgYGxvY2F0aW9uYGAgaXMgdGhlIHZhbHVlIHlvdSB3b3VsZCBoYXZlCi0gICAgICAgIGdvdHRlbiBmcm9tIGNhbGxpbmcgdGhlIGBgZG93bmxvYWQoKWBgIG1ldGhvZCB3aXRoIHRoZSBtYXRjaGluZwotICAgICAgICBkaXN0cmlidXRpb24ncyBVUkwgb3IgZmlsZW5hbWUuICBJZiBubyBtYXRjaGluZyBkaXN0cmlidXRpb24gaXMgZm91bmQsCi0gICAgICAgIGBgTm9uZWBgIGlzIHJldHVybmVkLgotCi0gICAgICAgIElmIHRoZSBgc291cmNlYCBmbGFnIGlzIHNldCwgb25seSBzb3VyY2UgZGlzdHJpYnV0aW9ucyBhbmQgc291cmNlCi0gICAgICAgIGNoZWNrb3V0IGxpbmtzIHdpbGwgYmUgY29uc2lkZXJlZC4gIFVubGVzcyB0aGUgYGRldmVsb3Bfb2tgIGZsYWcgaXMKLSAgICAgICAgc2V0LCBkZXZlbG9wbWVudCBhbmQgc3lzdGVtIGVnZ3MgKGkuZS4sIHRob3NlIHVzaW5nIHRoZSBgYC5lZ2ctaW5mb2BgCi0gICAgICAgIGZvcm1hdCkgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAiIiIKLQotICAgICAgICAjIHByb2Nlc3MgYSBSZXF1aXJlbWVudAotICAgICAgICBzZWxmLmluZm8oIlNlYXJjaGluZyBmb3IgJXMiLCByZXF1aXJlbWVudCkKLSAgICAgICAgc2tpcHBlZCA9IHt9Ci0KLSAgICAgICAgZGVmIGZpbmQocmVxKToKLSAgICAgICAgICAgICMgRmluZCBhIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbjsgbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZQotCi0gICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmW3JlcS5rZXldOgotCi0gICAgICAgICAgICAgICAgaWYgZGlzdC5wcmVjZWRlbmNlPT1ERVZFTE9QX0RJU1QgYW5kIG5vdCBkZXZlbG9wX29rOgotICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBza2lwcGVkOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJTa2lwcGluZyBkZXZlbG9wbWVudCBvciBzeXN0ZW0gZWdnOiAlcyIsZGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRbZGlzdF0gPSAxCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgICAgICAgICBpZiBkaXN0IGluIHJlcSBhbmQgKGRpc3QucHJlY2VkZW5jZTw9U09VUkNFX0RJU1Qgb3Igbm90IHNvdXJjZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuaW5mbygiQmVzdCBtYXRjaDogJXMiLCBkaXN0KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdC5jbG9uZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPXNlbGYuZG93bmxvYWQoZGlzdC5sb2NhdGlvbiwgdG1wZGlyKQotICAgICAgICAgICAgICAgICAgICApCi0KLSAgICAgICAgaWYgZm9yY2Vfc2NhbjoKLSAgICAgICAgICAgIHNlbGYucHJlc2NhbigpCi0gICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCi0KLSAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCi0gICAgICAgIGlmIGRpc3QgaXMgTm9uZSBhbmQgc2VsZi50b19zY2FuIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5wcmVzY2FuKCkKLSAgICAgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQotCi0gICAgICAgIGlmIGRpc3QgaXMgTm9uZSBhbmQgbm90IGZvcmNlX3NjYW46Ci0gICAgICAgICAgICBzZWxmLmZpbmRfcGFja2FnZXMocmVxdWlyZW1lbnQpCi0gICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKLQotICAgICAgICBpZiBkaXN0IGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLndhcm4oCi0gICAgICAgICAgICAgICAgIk5vIGxvY2FsIHBhY2thZ2VzIG9yIGRvd25sb2FkIGxpbmtzIGZvdW5kIGZvciAlcyVzIiwKLSAgICAgICAgICAgICAgICAoc291cmNlIGFuZCAiYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mICIgb3IgIiIpLAotICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LAotICAgICAgICAgICAgKQotICAgICAgICByZXR1cm4gZGlzdAotCi0gICAgZGVmIGZldGNoKHNlbGYsIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSk6Ci0gICAgICAgICIiIk9idGFpbiBhIGZpbGUgc3VpdGFibGUgZm9yIGZ1bGZpbGxpbmcgYHJlcXVpcmVtZW50YAotCi0gICAgICAgIERFUFJFQ0FURUQ7IHVzZSB0aGUgYGBmZXRjaF9kaXN0cmlidXRpb24oKWBgIG1ldGhvZCBub3cgaW5zdGVhZC4gIEZvcgotICAgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIGJ1dCByZXR1cm5zIHRoZQotICAgICAgICBgYGxvY2F0aW9uYGAgb2YgdGhlIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uIGluc3RlYWQgb2YgYSBkaXN0cmlidXRpb24KLSAgICAgICAgb2JqZWN0LgotICAgICAgICAiIiIKLSAgICAgICAgZGlzdCA9IHNlbGYuZmV0Y2hfZGlzdHJpYnV0aW9uKHJlcXVpcmVtZW50LHRtcGRpcixmb3JjZV9zY2FuLHNvdXJjZSkKLSAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJldHVybiBkaXN0LmxvY2F0aW9uCi0gICAgICAgIHJldHVybiBOb25lCi0KLQotCi0KLQotCi0KLQotICAgIGRlZiBnZW5fc2V0dXAoc2VsZiwgZmlsZW5hbWUsIGZyYWdtZW50LCB0bXBkaXIpOgotICAgICAgICBtYXRjaCA9IEVHR19GUkFHTUVOVC5tYXRjaChmcmFnbWVudCk7ICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKLSAgICAgICAgZGlzdHMgPSBtYXRjaCBhbmQgW2QgZm9yIGQgaW4KLSAgICAgICAgICAgIGludGVycHJldF9kaXN0cm9fbmFtZShmaWxlbmFtZSwgbWF0Y2guZ3JvdXAoMSksIE5vbmUpIGlmIGQudmVyc2lvbgotICAgICAgICBdIG9yIFtdCi0KLSAgICAgICAgaWYgbGVuKGRpc3RzKT09MTogICAjIHVuYW1iaWd1b3VzIGBgI2VnZ2BgIGZyYWdtZW50Ci0gICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCi0KLSAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBmaWxlIGhhcyBiZWVuIGRvd25sb2FkZWQgdG8gdGhlIHRlbXAgZGlyLgotICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSAhPSB0bXBkaXI6Ci0gICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHRtcGRpciwgYmFzZW5hbWUpCi0gICAgICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBzYW1lZmlsZQotICAgICAgICAgICAgICAgIGlmIG5vdCBzYW1lZmlsZShmaWxlbmFtZSwgZHN0KToKLSAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKGZpbGVuYW1lLCBkc3QpCi0gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPWRzdAotCi0gICAgICAgICAgICBmaWxlID0gb3Blbihvcy5wYXRoLmpvaW4odG1wZGlyLCAnc2V0dXAucHknKSwgJ3cnKQotICAgICAgICAgICAgZmlsZS53cml0ZSgKLSAgICAgICAgICAgICAgICAiZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cFxuIgotICAgICAgICAgICAgICAgICJzZXR1cChuYW1lPSVyLCB2ZXJzaW9uPSVyLCBweV9tb2R1bGVzPVslcl0pXG4iCi0gICAgICAgICAgICAgICAgJSAoCi0gICAgICAgICAgICAgICAgICAgIGRpc3RzWzBdLnByb2plY3RfbmFtZSwgZGlzdHNbMF0udmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSlbMF0KLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBmaWxlLmNsb3NlKCkKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQotCi0gICAgICAgIGVsaWYgbWF0Y2g6Ci0gICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKLSAgICAgICAgICAgICAgICAiQ2FuJ3QgdW5hbWJpZ3VvdXNseSBpbnRlcnByZXQgcHJvamVjdC92ZXJzaW9uIGlkZW50aWZpZXIgJXI7ICIKLSAgICAgICAgICAgICAgICAiYW55IGRhc2hlcyBpbiB0aGUgbmFtZSBvciB2ZXJzaW9uIHNob3VsZCBiZSBlc2NhcGVkIHVzaW5nICIKLSAgICAgICAgICAgICAgICAidW5kZXJzY29yZXMuICVyIiAlIChmcmFnbWVudCxkaXN0cykKLSAgICAgICAgICAgICkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAotICAgICAgICAgICAgICAgICJDYW4ndCBwcm9jZXNzIHBsYWluIC5weSBmaWxlcyB3aXRob3V0IGFuICcjZWdnPW5hbWUtdmVyc2lvbiciCi0gICAgICAgICAgICAgICAgIiBzdWZmaXggdG8gZW5hYmxlIGF1dG9tYXRpYyBzZXR1cCBzY3JpcHQgZ2VuZXJhdGlvbi4iCi0gICAgICAgICAgICApCi0KLSAgICBkbF9ibG9ja3NpemUgPSA4MTkyCi0gICAgZGVmIF9kb3dubG9hZF90byhzZWxmLCB1cmwsIGZpbGVuYW1lKToKLSAgICAgICAgc2VsZi51cmxfb2sodXJsLFRydWUpICAgIyByYWlzZXMgZXJyb3IgaWYgbm90IGFsbG93ZWQKLSAgICAgICAgc2VsZi5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKLSAgICAgICAgIyBEb3dubG9hZCB0aGUgZmlsZQotICAgICAgICBmcCwgdGZwLCBpbmZvID0gTm9uZSwgTm9uZSwgTm9uZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiAnIycgaW4gdXJsOgotICAgICAgICAgICAgICAgIHVybCwgaW5mbyA9IHVybC5zcGxpdCgnIycsIDEpCi0gICAgICAgICAgICBmcCA9IHNlbGYub3Blbl91cmwodXJsKQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmcCwgdXJsbGliMi5IVFRQRXJyb3IpOgotICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZG93bmxvYWQgJXM6ICVzICVzIiAlICh1cmwsIGZwLmNvZGUsZnAubXNnKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIGNzID0gbWQ1KCkKLSAgICAgICAgICAgIGhlYWRlcnMgPSBmcC5pbmZvKCkKLSAgICAgICAgICAgIGJsb2NrbnVtID0gMAotICAgICAgICAgICAgYnMgPSBzZWxmLmRsX2Jsb2Nrc2l6ZQotICAgICAgICAgICAgc2l6ZSA9IC0xCi0gICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IGludChoZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKQotICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0aG9vayh1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYnMsIHNpemUpCi0gICAgICAgICAgICB0ZnAgPSBvcGVuKGZpbGVuYW1lLCd3YicpCi0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIGJsb2NrID0gZnAucmVhZChicykKLSAgICAgICAgICAgICAgICBpZiBibG9jazoKLSAgICAgICAgICAgICAgICAgICAgY3MudXBkYXRlKGJsb2NrKQotICAgICAgICAgICAgICAgICAgICB0ZnAud3JpdGUoYmxvY2spCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrbnVtICs9IDEKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRob29rKHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBicywgc2l6ZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaWYgaW5mbzogc2VsZi5jaGVja19tZDUoY3MsIGluZm8sIGZpbGVuYW1lLCB0ZnApCi0gICAgICAgICAgICByZXR1cm4gaGVhZGVycwotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgZnA6IGZwLmNsb3NlKCkKLSAgICAgICAgICAgIGlmIHRmcDogdGZwLmNsb3NlKCkKLQotICAgIGRlZiByZXBvcnRob29rKHNlbGYsIHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBibGtzaXplLCBzaXplKToKLSAgICAgICAgcGFzcyAgICAjIG5vLW9wCi0KLSAgICBkZWYgcmV0cnlfc2ZfZG93bmxvYWQoc2VsZiwgdXJsLCBmaWxlbmFtZSk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF90byh1cmwsIGZpbGVuYW1lKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW0sIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UudXJscGFyc2UodXJsKQotICAgICAgICAgICAgaWYgc2VydmVyIT0nZGwuc291cmNlZm9yZ2UubmV0JzoKLSAgICAgICAgICAgICAgICByYWlzZQotCi0gICAgICAgIG1pcnJvciA9IGdldF9zZl9pcCgpCi0KLSAgICAgICAgd2hpbGUgX3NmX21pcnJvcnM6Ci0gICAgICAgICAgICBzZWxmLndhcm4oIkRvd25sb2FkIGZhaWxlZDogJXMiLCBzeXMuZXhjX2luZm8oKVsxXSkKLSAgICAgICAgICAgIHVybCA9IHVybHBhcnNlLnVybHVucGFyc2UoKHNjaGVtZSwgbWlycm9yLCBwYXRoLCBwYXJhbSwgJycsIGZyYWcpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF90byh1cmwsIGZpbGVuYW1lKQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIF9zZl9taXJyb3JzLnJlbW92ZShtaXJyb3IpICAjIGRvbid0IHJldHJ5IHRoZSBzYW1lIG1pcnJvcgotICAgICAgICAgICAgICAgIG1pcnJvciA9IGdldF9zZl9pcCgpCi0KLSAgICAgICAgcmFpc2UgICAjIGZhaWwgaWYgbm8gbWlycm9yIHdvcmtzCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0gICAgZGVmIG9wZW5fdXJsKHNlbGYsIHVybCk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiB1cmxsaWIyLnVybG9wZW4odXJsKQotICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIHY6Ci0gICAgICAgICAgICByZXR1cm4gdgotICAgICAgICBleGNlcHQgdXJsbGliMi5VUkxFcnJvciwgdjoKLSAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCJEb3dubG9hZCBlcnJvcjogJXMiICUgdi5yZWFzb24pCi0KLQotICAgIGRlZiBfZG93bmxvYWRfdXJsKHNlbGYsIHNjaGVtZSwgdXJsLCB0bXBkaXIpOgotCi0gICAgICAgICMgRGV0ZXJtaW5lIGRvd25sb2FkIGZpbGVuYW1lCi0gICAgICAgICMKLSAgICAgICAgbmFtZSA9IGZpbHRlcihOb25lLHVybHBhcnNlLnVybHBhcnNlKHVybClbMl0uc3BsaXQoJy8nKSkKLSAgICAgICAgaWYgbmFtZToKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lWy0xXQotICAgICAgICAgICAgd2hpbGUgJy4uJyBpbiBuYW1lOgotICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy4uJywnLicpLnJlcGxhY2UoJ1xcJywnXycpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuYW1lID0gIl9fZG93bmxvYWRlZF9fIiAgICAjIGRlZmF1bHQgaWYgVVJMIGhhcyBubyBwYXRoIGNvbnRlbnRzCi0KLSAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLmVnZy56aXAnKToKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotNF0gICAgIyBzdHJpcCB0aGUgZXh0cmEgLnppcCBiZWZvcmUgZG93bmxvYWQKLQotICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIsbmFtZSkKLQotICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCi0gICAgICAgICMKLSAgICAgICAgaWYgc2NoZW1lPT0nc3ZuJyBvciBzY2hlbWUuc3RhcnRzd2l0aCgnc3ZuKycpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3N2bih1cmwsIGZpbGVuYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYucmV0cnlfc2ZfZG93bmxvYWQodXJsLCBmaWxlbmFtZSkKLSAgICAgICAgICAgIGlmICdodG1sJyBpbiBoZWFkZXJzWydjb250ZW50LXR5cGUnXS5sb3dlcigpOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9odG1sKHVybCwgaGVhZGVycywgZmlsZW5hbWUsIHRtcGRpcikKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCi0KLSAgICBkZWYgc2Nhbl91cmwoc2VsZiwgdXJsKToKLSAgICAgICAgc2VsZi5wcm9jZXNzX3VybCh1cmwsIFRydWUpCi0KLQotICAgIGRlZiBfZG93bmxvYWRfaHRtbChzZWxmLCB1cmwsIGhlYWRlcnMsIGZpbGVuYW1lLCB0bXBkaXIpOgotICAgICAgICBmaWxlID0gb3BlbihmaWxlbmFtZSkKLSAgICAgICAgZm9yIGxpbmUgaW4gZmlsZToKLSAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKToKLSAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIHN1YnZlcnNpb24gaW5kZXggcGFnZQotICAgICAgICAgICAgICAgIGlmIHJlLnNlYXJjaChyJzx0aXRsZT5SZXZpc2lvbiBcZCs6JywgbGluZSk6Ci0gICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHN1YnZlcnNpb24gaW5kZXggcGFnZToKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX3N2bih1cmwsIGZpbGVuYW1lKQotICAgICAgICAgICAgICAgIGJyZWFrICAgIyBub3QgYW4gaW5kZXggcGFnZQotICAgICAgICBmaWxlLmNsb3NlKCkKLSAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQotICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiVW5leHBlY3RlZCBIVE1MIHBhZ2UgZm91bmQgYXQgIit1cmwpCi0KLSAgICBkZWYgX2Rvd25sb2FkX3N2bihzZWxmLCB1cmwsIGZpbGVuYW1lKToKLSAgICAgICAgdXJsID0gdXJsLnNwbGl0KCcjJywxKVswXSAgICMgcmVtb3ZlIGFueSBmcmFnbWVudCBmb3Igc3ZuJ3Mgc2FrZQotICAgICAgICBzZWxmLmluZm8oIkRvaW5nIHN1YnZlcnNpb24gY2hlY2tvdXQgZnJvbSAlcyB0byAlcyIsIHVybCwgZmlsZW5hbWUpCi0gICAgICAgIG9zLnN5c3RlbSgic3ZuIGNoZWNrb3V0IC1xICVzICVzIiAlICh1cmwsIGZpbGVuYW1lKSkKLSAgICAgICAgcmV0dXJuIGZpbGVuYW1lCi0KLSAgICBkZWYgZGVidWcoc2VsZiwgbXNnLCAqYXJncyk6Ci0gICAgICAgIGxvZy5kZWJ1Zyhtc2csICphcmdzKQotCi0gICAgZGVmIGluZm8oc2VsZiwgbXNnLCAqYXJncyk6Ci0gICAgICAgIGxvZy5pbmZvKG1zZywgKmFyZ3MpCi0KLSAgICBkZWYgd2FybihzZWxmLCBtc2csICphcmdzKToKLSAgICAgICAgbG9nLndhcm4obXNnLCAqYXJncykKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWRlZiBmaXhfc2ZfdXJsKHVybCk6Ci0gICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKLSAgICBpZiBzZXJ2ZXIhPSdwcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQnOgotICAgICAgICByZXR1cm4gdXJsCi0gICAgcmV0dXJuIHVybHBhcnNlLnVybHVucGFyc2UoCi0gICAgICAgIChzY2hlbWUsICdkbC5zb3VyY2Vmb3JnZS5uZXQnLCAnc291cmNlZm9yZ2UnK3BhdGgsIHBhcmFtLCAnJywgZnJhZykKLSAgICApCi0KLV9zZl9taXJyb3JzID0gW10KLQotZGVmIGdldF9zZl9pcCgpOgotICAgIGlmIG5vdCBfc2ZfbWlycm9yczoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgX3NmX21pcnJvcnNbOl0gPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZV9leCgnZGwuc291cmNlZm9yZ2UubmV0JylbLTFdCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6Ci0gICAgICAgICAgICAjIEROUy1ibDBjazFuOSBmMXIzdzRsbHogc1V4MHJzIQotICAgICAgICAgICAgX3NmX21pcnJvcnNbOl0gPSBbJ2RsLnNvdXJjZWZvcmdlLm5ldCddCi0gICAgcmV0dXJuIHJhbmRvbS5jaG9pY2UoX3NmX21pcnJvcnMpCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9zYW5kYm94LnB5IGIvTGliL3NldHVwdG9vbHMvc2FuZGJveC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA2OTQ0Yi4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy9zYW5kYm94LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLWltcG9ydCBvcywgc3lzLCBfX2J1aWx0aW5fXywgdGVtcGZpbGUKLV9vcyA9IHN5cy5tb2R1bGVzW29zLm5hbWVdCi1fb3BlbiA9IG9wZW4KLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKLV9fYWxsX18gPSBbCi0gICAgIkFic3RyYWN0U2FuZGJveCIsICJEaXJlY3RvcnlTYW5kYm94IiwgIlNhbmRib3hWaW9sYXRpb24iLCAicnVuX3NldHVwIiwKLV0KLQotZGVmIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpOgotICAgICIiIlJ1biBhIGRpc3R1dGlscyBzZXR1cCBzY3JpcHQsIHNhbmRib3hlZCBpbiBpdHMgZGlyZWN0b3J5IiIiCi0KLSAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKLSAgICBzYXZlX2FyZ3YgPSBzeXMuYXJndls6XQotICAgIHNhdmVfcGF0aCA9IHN5cy5wYXRoWzpdCi0gICAgc2V0dXBfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpKQotICAgIHRlbXBfZGlyID0gb3MucGF0aC5qb2luKHNldHVwX2RpciwndGVtcCcpCi0gICAgaWYgbm90IG9zLnBhdGguaXNkaXIodGVtcF9kaXIpOiBvcy5tYWtlZGlycyh0ZW1wX2RpcikKLSAgICBzYXZlX3RtcCA9IHRlbXBmaWxlLnRlbXBkaXIKLQotICAgIHRyeToKLSAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHRlbXBfZGlyCi0gICAgICAgIG9zLmNoZGlyKHNldHVwX2RpcikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBbc2V0dXBfc2NyaXB0XStsaXN0KGFyZ3MpCi0gICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2V0dXBfZGlyKQotICAgICAgICAgICAgRGlyZWN0b3J5U2FuZGJveChzZXR1cF9kaXIpLnJ1bigKLSAgICAgICAgICAgICAgICBsYW1iZGE6IGV4ZWNmaWxlKAotICAgICAgICAgICAgICAgICAgICAic2V0dXAucHkiLAotICAgICAgICAgICAgICAgICAgICB7J19fZmlsZV9fJzpzZXR1cF9zY3JpcHQsICdfX25hbWVfXyc6J19fbWFpbl9fJ30KLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCB2OgotICAgICAgICAgICAgaWYgdi5hcmdzIGFuZCB2LmFyZ3NbMF06Ci0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgICAgICMgTm9ybWFsIGV4aXQsIGp1c3QgcmV0dXJuCi0gICAgZmluYWxseToKLSAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKLSAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlX3BhdGgKLSAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlX2FyZ3YKLSAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHNhdmVfdG1wCi0KLWNsYXNzIEFic3RyYWN0U2FuZGJveDoKLSAgICAiIiJXcmFwICdvcycgbW9kdWxlIGFuZCAnb3BlbigpJyBidWlsdGluIGZvciB2aXJ0dWFsaXppbmcgc2V0dXAgc2NyaXB0cyIiIgotCi0gICAgX2FjdGl2ZSA9IEZhbHNlCi0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuX2F0dHJzID0gWwotICAgICAgICAgICAgbmFtZSBmb3IgbmFtZSBpbiBkaXIoX29zKQotICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKSBhbmQgaGFzYXR0cihzZWxmLG5hbWUpCi0gICAgICAgIF0KLQotICAgIGRlZiBfY29weShzZWxmLCBzb3VyY2UpOgotICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9hdHRyczoKLSAgICAgICAgICAgIHNldGF0dHIob3MsIG5hbWUsIGdldGF0dHIoc291cmNlLG5hbWUpKQotCi0gICAgZGVmIHJ1bihzZWxmLCBmdW5jKToKLSAgICAgICAgIiIiUnVuICdmdW5jJyB1bmRlciBvcyBzYW5kYm94aW5nIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuX2NvcHkoc2VsZikKLSAgICAgICAgICAgIF9fYnVpbHRpbl9fLm9wZW4gPSBfX2J1aWx0aW5fXy5maWxlID0gc2VsZi5fb3BlbgotICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gVHJ1ZQotICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKLSAgICAgICAgICAgIF9fYnVpbHRpbl9fLm9wZW4gPSBfX2J1aWx0aW5fXy5maWxlID0gX29wZW4KLSAgICAgICAgICAgIHNlbGYuX2NvcHkoX29zKQotCi0KLSAgICBkZWYgX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpOgotICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLG5hbWUpCi0gICAgICAgIGRlZiB3cmFwKHNlbGYsc3JjLGRzdCwqYXJncywqKmt3KToKLSAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKLSAgICAgICAgICAgICAgICBzcmMsZHN0ID0gc2VsZi5fcmVtYXBfcGFpcihuYW1lLHNyYyxkc3QsKmFyZ3MsKiprdykKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChzcmMsZHN0LCphcmdzLCoqa3cpCi0gICAgICAgIHJldHVybiB3cmFwCi0KLQotICAgIGZvciBuYW1lIGluIFsicmVuYW1lIiwgImxpbmsiLCAic3ltbGluayJdOgotICAgICAgICBpZiBoYXNhdHRyKF9vcyxuYW1lKTogbG9jYWxzKClbbmFtZV0gPSBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSkKLQotCi0gICAgZGVmIF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUsIG9yaWdpbmFsPU5vbmUpOgotICAgICAgICBvcmlnaW5hbCA9IG9yaWdpbmFsIG9yIGdldGF0dHIoX29zLG5hbWUpCi0gICAgICAgIGRlZiB3cmFwKHNlbGYscGF0aCwqYXJncywqKmt3KToKLSAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKLSAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5fcmVtYXBfaW5wdXQobmFtZSxwYXRoLCphcmdzLCoqa3cpCi0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwqYXJncywqKmt3KQotICAgICAgICByZXR1cm4gd3JhcAotCi0gICAgX29wZW4gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignZmlsZScsIF9vcGVuKQotICAgIGZvciBuYW1lIGluIFsKLSAgICAgICAgInN0YXQiLCAibGlzdGRpciIsICJjaGRpciIsICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwKLSAgICAgICAgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLCAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJsc3RhdCIsCi0gICAgICAgICJzdGFydGZpbGUiLCAibWtmaWZvIiwgIm1rbm9kIiwgInBhdGhjb25mIiwgImFjY2VzcyIKLSAgICBdOgotICAgICAgICBpZiBoYXNhdHRyKF9vcyxuYW1lKTogbG9jYWxzKClbbmFtZV0gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lKQotCi0KLSAgICBkZWYgX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKToKLSAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcyxuYW1lKQotICAgICAgICBkZWYgd3JhcChzZWxmLHBhdGgsKmFyZ3MsKiprdyk6Ci0gICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUscGF0aCwqYXJncywqKmt3KQotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgb3JpZ2luYWwocGF0aCwqYXJncywqKmt3KSkKLSAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChwYXRoLCphcmdzLCoqa3cpCi0gICAgICAgIHJldHVybiB3cmFwCi0KLSAgICBmb3IgbmFtZSBpbiBbJ3JlYWRsaW5rJywgJ3RlbXBuYW0nXToKLSAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKQotCi0gICAgZGVmIF9ta19xdWVyeShuYW1lKToKLSAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcyxuYW1lKQotICAgICAgICBkZWYgd3JhcChzZWxmLCphcmdzLCoqa3cpOgotICAgICAgICAgICAgcmV0dmFsID0gb3JpZ2luYWwoKmFyZ3MsKiprdykKLSAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIHJldHZhbCkKLSAgICAgICAgICAgIHJldHVybiByZXR2YWwKLSAgICAgICAgcmV0dXJuIHdyYXAKLQotICAgIGZvciBuYW1lIGluIFsnZ2V0Y3dkJywgJ3RtcG5hbSddOgotICAgICAgICBpZiBoYXNhdHRyKF9vcyxuYW1lKTogbG9jYWxzKClbbmFtZV0gPSBfbWtfcXVlcnkobmFtZSkKLQotICAgIGRlZiBfdmFsaWRhdGVfcGF0aChzZWxmLHBhdGgpOgotICAgICAgICAiIiJDYWxsZWQgdG8gcmVtYXAgb3IgdmFsaWRhdGUgYW55IHBhdGgsIHdoZXRoZXIgaW5wdXQgb3Igb3V0cHV0IiIiCi0gICAgICAgIHJldHVybiBwYXRoCi0KLSAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsb3BlcmF0aW9uLHBhdGgsKmFyZ3MsKiprdyk6Ci0gICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKLQotICAgIGRlZiBfcmVtYXBfb3V0cHV0KHNlbGYsb3BlcmF0aW9uLHBhdGgpOgotICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggb3V0cHV0cyIiIgotICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQotCi0gICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsb3BlcmF0aW9uLHNyYyxkc3QsKmFyZ3MsKiprdyk6Ci0gICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgotICAgICAgICByZXR1cm4gKAotICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uKyctZnJvbScsc3JjLCphcmdzLCoqa3cpLAotICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uKyctdG8nLGRzdCwqYXJncywqKmt3KQotICAgICAgICApCi0KLQotY2xhc3MgRGlyZWN0b3J5U2FuZGJveChBYnN0cmFjdFNhbmRib3gpOgotICAgICIiIlJlc3RyaWN0IG9wZXJhdGlvbnMgdG8gYSBzaW5nbGUgc3ViZGlyZWN0b3J5IC0gcHNldWRvLWNocm9vdCIiIgotCi0gICAgd3JpdGVfb3BzID0gZGljdC5mcm9ta2V5cyhbCi0gICAgICAgICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLAotICAgICAgICAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJta2ZpZm8iLCAibWtub2QiLCAidGVtcG5hbSIsCi0gICAgXSkKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLHNhbmRib3gpOgotICAgICAgICBzZWxmLl9zYW5kYm94ID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHNhbmRib3gpKQotICAgICAgICBzZWxmLl9wcmVmaXggPSBvcy5wYXRoLmpvaW4oc2VsZi5fc2FuZGJveCwnJykKLSAgICAgICAgQWJzdHJhY3RTYW5kYm94Ll9faW5pdF9fKHNlbGYpCi0KLSAgICBkZWYgX3Zpb2xhdGlvbihzZWxmLCBvcGVyYXRpb24sICphcmdzLCAqKmt3KToKLSAgICAgICAgcmFpc2UgU2FuZGJveFZpb2xhdGlvbihvcGVyYXRpb24sIGFyZ3MsIGt3KQotCi0gICAgZGVmIF9vcGVuKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6Ci0gICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScpIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6Ci0gICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9wZW4iLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKLSAgICAgICAgcmV0dXJuIF9vcGVuKHBhdGgsbW9kZSwqYXJncywqKmt3KQotCi0gICAgZGVmIHRtcG5hbShzZWxmKToKLSAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJ0bXBuYW0iKQotCi0gICAgZGVmIF9vayhzZWxmLHBhdGgpOgotICAgICAgICBhY3RpdmUgPSBzZWxmLl9hY3RpdmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKLSAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQotICAgICAgICAgICAgaWYgcmVhbHBhdGg9PXNlbGYuX3NhbmRib3ggb3IgcmVhbHBhdGguc3RhcnRzd2l0aChzZWxmLl9wcmVmaXgpOgotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzZWxmLl9hY3RpdmUgPSBhY3RpdmUKLQotICAgIGRlZiBfcmVtYXBfaW5wdXQoc2VsZixvcGVyYXRpb24scGF0aCwqYXJncywqKmt3KToKLSAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIGlucHV0cyIiIgotICAgICAgICBpZiBvcGVyYXRpb24gaW4gc2VsZi53cml0ZV9vcHMgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKLSAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIG9zLnBhdGgucmVhbHBhdGgocGF0aCksICphcmdzLCAqKmt3KQotICAgICAgICByZXR1cm4gcGF0aAotCi0gICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsb3BlcmF0aW9uLHNyYyxkc3QsKmFyZ3MsKiprdyk6Ci0gICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgotICAgICAgICBpZiBub3Qgc2VsZi5fb2soc3JjKSBvciBub3Qgc2VsZi5fb2soZHN0KToKLSAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdykKLSAgICAgICAgcmV0dXJuIChzcmMsZHN0KQotCi0KLWNsYXNzIFNhbmRib3hWaW9sYXRpb24oRGlzdHV0aWxzRXJyb3IpOgotICAgICIiIkEgc2V0dXAgc2NyaXB0IGF0dGVtcHRlZCB0byBtb2RpZnkgdGhlIGZpbGVzeXN0ZW0gb3V0c2lkZSB0aGUgc2FuZGJveCIiIgotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiIiJTYW5kYm94VmlvbGF0aW9uOiAlcyVyICVzCi0KLVRoZSBwYWNrYWdlIHNldHVwIHNjcmlwdCBoYXMgYXR0ZW1wdGVkIHRvIG1vZGlmeSBmaWxlcyBvbiB5b3VyIHN5c3RlbQotdGhhdCBhcmUgbm90IHdpdGhpbiB0aGUgRWFzeUluc3RhbGwgYnVpbGQgYXJlYSwgYW5kIGhhcyBiZWVuIGFib3J0ZWQuCi0KLVRoaXMgcGFja2FnZSBjYW5ub3QgYmUgc2FmZWx5IGluc3RhbGxlZCBieSBFYXN5SW5zdGFsbCwgYW5kIG1heSBub3QKLXN1cHBvcnQgYWx0ZXJuYXRlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMgZXZlbiBpZiB5b3UgcnVuIGl0cyBzZXR1cAotc2NyaXB0IGJ5IGhhbmQuICBQbGVhc2UgaW5mb3JtIHRoZSBwYWNrYWdlJ3MgYXV0aG9yIGFuZCB0aGUgRWFzeUluc3RhbGwKLW1haW50YWluZXJzIHRvIGZpbmQgb3V0IGlmIGEgZml4IG9yIHdvcmthcm91bmQgaXMgYXZhaWxhYmxlLiIiIiAlIHNlbGYuYXJncwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weSBiL0xpYi9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxYjI3YjkuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLWRlZiBfX2Jvb3QoKToKLSAgICBpbXBvcnQgc3lzLCBpbXAsIG9zLCBvcy5wYXRoCi0gICAgUFlUSE9OUEFUSCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJykKLSAgICBpZiBQWVRIT05QQVRIIGlzIE5vbmUgb3IgKHN5cy5wbGF0Zm9ybT09J3dpbjMyJyBhbmQgbm90IFBZVEhPTlBBVEgpOgotICAgICAgICBQWVRIT05QQVRIID0gW10KLSAgICBlbHNlOgotICAgICAgICBQWVRIT05QQVRIID0gUFlUSE9OUEFUSC5zcGxpdChvcy5wYXRoc2VwKQotCi0gICAgcGljID0gZ2V0YXR0cihzeXMsJ3BhdGhfaW1wb3J0ZXJfY2FjaGUnLHt9KQotICAgIHN0ZHBhdGggPSBzeXMucGF0aFtsZW4oUFlUSE9OUEFUSCk6XQotICAgIG15ZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQotICAgICNwcmludCAic2VhcmNoaW5nIixzdGRwYXRoLHN5cy5wYXRoCi0KLSAgICBmb3IgaXRlbSBpbiBzdGRwYXRoOgotICAgICAgICBpZiBpdGVtPT1teWRpciBvciBub3QgaXRlbToKLSAgICAgICAgICAgIGNvbnRpbnVlICAgICMgc2tpcCBpZiBjdXJyZW50IGRpci4gb24gV2luZG93cywgb3IgbXkgb3duIGRpcmVjdG9yeQotICAgICAgICBpbXBvcnRlciA9IHBpYy5nZXQoaXRlbSkKLSAgICAgICAgaWYgaW1wb3J0ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZSgnc2l0ZScpCi0gICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBhY3R1YWxseSByZWxvYWQgdGhlIGN1cnJlbnQgbW9kdWxlCi0gICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKCdzaXRlJykKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHN0cmVhbSwgcGF0aCwgZGVzY3IgPSBpbXAuZmluZF9tb2R1bGUoJ3NpdGUnLFtpdGVtXSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKLSAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUoJ3NpdGUnLHN0cmVhbSxwYXRoLGRlc2NyKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQotICAgICAgICAgICAgYnJlYWsKLSAgICBlbHNlOgotICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiQ291bGRuJ3QgZmluZCB0aGUgcmVhbCAnc2l0ZScgbW9kdWxlIikKLQotICAgICNwcmludCAibG9hZGVkIiwgX19maWxlX18KLQotICAgIGtub3duX3BhdGhzID0gZGljdChbKG1ha2VwYXRoKGl0ZW0pWzFdLDEpIGZvciBpdGVtIGluIHN5cy5wYXRoXSkgIyAyLjIgY29tcAotCi0gICAgb2xkcG9zID0gZ2V0YXR0cihzeXMsJ19fZWdnaW5zZXJ0JywwKSAgICMgc2F2ZSBvbGQgaW5zZXJ0aW9uIHBvc2l0aW9uCi0gICAgc3lzLl9fZWdnaW5zZXJ0ID0gMCAgICAgICAgICAgICAgICAgICAgICMgYW5kIHJlc2V0IHRoZSBjdXJyZW50IG9uZQotCi0gICAgZm9yIGl0ZW0gaW4gUFlUSE9OUEFUSDoKLSAgICAgICAgYWRkc2l0ZWRpcihpdGVtKQotCi0gICAgc3lzLl9fZWdnaW5zZXJ0ICs9IG9sZHBvcyAgICAgICAgICAgIyByZXN0b3JlIGVmZmVjdGl2ZSBvbGQgcG9zaXRpb24KLQotICAgIGQsbmQgPSBtYWtlcGF0aChzdGRwYXRoWzBdKQotICAgIGluc2VydF9hdCA9IE5vbmUKLSAgICBuZXdfcGF0aCA9IFtdCi0KLSAgICBmb3IgaXRlbSBpbiBzeXMucGF0aDoKLSAgICAgICAgcCxucCA9IG1ha2VwYXRoKGl0ZW0pCi0KLSAgICAgICAgaWYgbnA9PW5kIGFuZCBpbnNlcnRfYXQgaXMgTm9uZToKLSAgICAgICAgICAgICMgV2UndmUgaGl0IHRoZSBmaXJzdCAnc3lzdGVtJyBwYXRoIGVudHJ5LCBzbyBhZGRlZCBlbnRyaWVzIGdvIGhlcmUKLSAgICAgICAgICAgIGluc2VydF9hdCA9IGxlbihuZXdfcGF0aCkKLQotICAgICAgICBpZiBucCBpbiBrbm93bl9wYXRocyBvciBpbnNlcnRfYXQgaXMgTm9uZToKLSAgICAgICAgICAgIG5ld19wYXRoLmFwcGVuZChpdGVtKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBuZXcgcGF0aCBhZnRlciB0aGUgaW5zZXJ0IHBvaW50LCBiYWNrLWluc2VydCBpdAotICAgICAgICAgICAgbmV3X3BhdGguaW5zZXJ0KGluc2VydF9hdCwgaXRlbSkKLSAgICAgICAgICAgIGluc2VydF9hdCArPSAxCi0KLSAgICBzeXMucGF0aFs6XSA9IG5ld19wYXRoCi0KLWlmIF9fbmFtZV9fPT0nc2l0ZSc6Ci0gICAgX19ib290KCkKLSAgICBkZWwgX19ib290CmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy90ZXN0cy9fX2luaXRfXy5weSBiL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTc2N2RjLi4wMDAwMDAwCi0tLSBhL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL19faW5pdF9fLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLSIiIlRlc3RzIGZvciB0aGUgJ3NldHVwdG9vbHMnIHBhY2thZ2UiIiIKLQotZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdFN1aXRlLCBUZXN0Q2FzZSwgbWFrZVN1aXRlLCBkZWZhdWx0VGVzdExvYWRlcgotaW1wb3J0IGRpc3R1dGlscy5jb3JlLCBkaXN0dXRpbHMuY21kCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKLWltcG9ydCBzZXR1cHRvb2xzLCBzZXR1cHRvb2xzLmRpc3QKLWZyb20gc2V0dXB0b29scyBpbXBvcnQgRmVhdHVyZQotZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRXh0ZW5zaW9uCi1mcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgZXh0cmFjdF9jb25zdGFudCwgZ2V0X21vZHVsZV9jb25zdGFudAotZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IGZpbmRfbW9kdWxlLCBSZXF1aXJlCi1mcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBTdHJpY3RWZXJzaW9uLCBMb29zZVZlcnNpb24KLWZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAotaW1wb3J0IHN5cywgb3MucGF0aAotCi1kZWYgYWRkaXRpb25hbF90ZXN0cygpOgotICAgIGltcG9ydCBkb2N0ZXN0Ci0gICAgcmV0dXJuIGRvY3Rlc3QuRG9jRmlsZVN1aXRlKAotICAgICAgICAnYXBpX3Rlc3RzLnR4dCcsIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRUxMSVBTSVMsIHBhY2thZ2U9X19uYW1lX18sCi0gICAgKQotCi0KLWRlZiBtYWtlU2V0dXAoKiphcmdzKToKLSAgICAiIiJSZXR1cm4gZGlzdHJpYnV0aW9uIGZyb20gJ3NldHVwKCoqYXJncyknLCB3aXRob3V0IGV4ZWN1dGluZyBjb21tYW5kcyIiIgotCi0gICAgZGlzdHV0aWxzLmNvcmUuX3NldHVwX3N0b3BfYWZ0ZXIgPSAiY29tbWFuZGxpbmUiCi0KLSAgICAjIERvbid0IGxldCBzeXN0ZW0gY29tbWFuZCBsaW5lIGxlYWsgaW50byB0ZXN0cyEKLSAgICBhcmdzLnNldGRlZmF1bHQoJ3NjcmlwdF9hcmdzJyxbJ2luc3RhbGwnXSkKLQotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIHNldHVwdG9vbHMuc2V0dXAoKiphcmdzKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIGRpc3R1dGlscy5jb3JlX3NldHVwX3N0b3BfYWZ0ZXIgPSBOb25lCi0KLQotCi0KLQotCi0KLWNsYXNzIERlcGVuZHNUZXN0cyhUZXN0Q2FzZSk6Ci0KLSAgICBkZWYgdGVzdEV4dHJhY3RDb25zdChzZWxmKToKLQotICAgICAgICBmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgZXh0cmFjdF9jb25zdGFudAotCi0gICAgICAgIGRlZiBmMSgpOgotICAgICAgICAgICAgZ2xvYmFsIHgseSx6Ci0gICAgICAgICAgICB4ID0gInRlc3QiCi0gICAgICAgICAgICB5ID0gegotCi0gICAgICAgICMgdW5yZWNvZ25pemVkIG5hbWUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0X2NvbnN0YW50KGYxLmZ1bmNfY29kZSwncScsIC0xKSwgTm9uZSkKLQotICAgICAgICAjIGNvbnN0YW50IGFzc2lnbmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdF9jb25zdGFudChmMS5mdW5jX2NvZGUsJ3gnLCAtMSksICJ0ZXN0IikKLQotICAgICAgICAjIGV4cHJlc3Npb24gYXNzaWduZWQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0X2NvbnN0YW50KGYxLmZ1bmNfY29kZSwneScsIC0xKSwgLTEpCi0KLSAgICAgICAgIyByZWNvZ25pemVkIG5hbWUsIG5vdCBhc3NpZ25lZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHJhY3RfY29uc3RhbnQoZjEuZnVuY19jb2RlLCd6JywgLTEpLCBOb25lKQotCi0KLSAgICBkZWYgdGVzdEZpbmRNb2R1bGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBmaW5kX21vZHVsZSwgJ25vLXN1Y2guLXRoaW5nJykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIGZpbmRfbW9kdWxlLCAnc2V0dXB0b29scy5ub24tZXhpc3RlbnQnKQotICAgICAgICBmLHAsaSA9IGZpbmRfbW9kdWxlKCdzZXR1cHRvb2xzLnRlc3RzJyk7IGYuY2xvc2UoKQotCi0gICAgZGVmIHRlc3RNb2R1bGVFeHRyYWN0KHNlbGYpOgotICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgX192ZXJzaW9uX18KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGdldF9tb2R1bGVfY29uc3RhbnQoJ2Rpc3R1dGlscycsJ19fdmVyc2lvbl9fJyksIF9fdmVyc2lvbl9fCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGdldF9tb2R1bGVfY29uc3RhbnQoJ3N5cycsJ3ZlcnNpb24nKSwgc3lzLnZlcnNpb24KLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgZ2V0X21vZHVsZV9jb25zdGFudCgnc2V0dXB0b29scy50ZXN0cycsJ19fZG9jX18nKSxfX2RvY19fCi0gICAgICAgICkKLQotICAgIGRlZiB0ZXN0UmVxdWlyZShzZWxmKToKLQotICAgICAgICByZXEgPSBSZXF1aXJlKCdEaXN0dXRpbHMnLCcxLjAuMycsJ2Rpc3R1dGlscycpCi0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEubmFtZSwgJ0Rpc3R1dGlscycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLm1vZHVsZSwgJ2Rpc3R1dGlscycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnJlcXVlc3RlZF92ZXJzaW9uLCAnMS4wLjMnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5hdHRyaWJ1dGUsICdfX3ZlcnNpb25fXycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmZ1bGxfbmFtZSgpLCAnRGlzdHV0aWxzLTEuMC4zJykKLQotICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgX192ZXJzaW9uX18KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X3ZlcnNpb24oKSwgX192ZXJzaW9uX18pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXEudmVyc2lvbl9vaygnMS4wLjknKSkKLSAgICAgICAgc2VsZi5mYWlsSWYocmVxLnZlcnNpb25fb2soJzAuOS4xJykpCi0gICAgICAgIHNlbGYuZmFpbElmKHJlcS52ZXJzaW9uX29rKCd1bmtub3duJykpCi0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS5pc19wcmVzZW50KCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXEuaXNfY3VycmVudCgpKQotCi0gICAgICAgIHJlcSA9IFJlcXVpcmUoJ0Rpc3R1dGlscyAzMDAwJywnMDMwMDAnLCdkaXN0dXRpbHMnLGZvcm1hdD1Mb29zZVZlcnNpb24pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXEuaXNfcHJlc2VudCgpKQotICAgICAgICBzZWxmLmZhaWxJZihyZXEuaXNfY3VycmVudCgpKQotICAgICAgICBzZWxmLmZhaWxJZihyZXEudmVyc2lvbl9vaygndW5rbm93bicpKQotCi0gICAgICAgIHJlcSA9IFJlcXVpcmUoJ0RvLXdoYXQtSS1tZWFuJywnMS4wJywnZC13LWktbScpCi0gICAgICAgIHNlbGYuZmFpbElmKHJlcS5pc19wcmVzZW50KCkpCi0gICAgICAgIHNlbGYuZmFpbElmKHJlcS5pc19jdXJyZW50KCkpCi0KLSAgICAgICAgcmVxID0gUmVxdWlyZSgnVGVzdHMnLCBOb25lLCAndGVzdHMnLCBob21lcGFnZT0iaHR0cDovL2V4YW1wbGUuY29tIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZm9ybWF0LCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5hdHRyaWJ1dGUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnJlcXVlc3RlZF92ZXJzaW9uLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5mdWxsX25hbWUoKSwgJ1Rlc3RzJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuaG9tZXBhZ2UsICdodHRwOi8vZXhhbXBsZS5jb20nKQotCi0gICAgICAgIHBhdGhzID0gW29zLnBhdGguZGlybmFtZShwKSBmb3IgcCBpbiBfX3BhdGhfX10KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS5pc19wcmVzZW50KHBhdGhzKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcS5pc19jdXJyZW50KHBhdGhzKSkKLQotCi0KLWNsYXNzIERpc3Ryb1Rlc3RzKFRlc3RDYXNlKToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5lMSA9IEV4dGVuc2lvbignYmFyLmV4dCcsWydiYXIuYyddKQotICAgICAgICBzZWxmLmUyID0gRXh0ZW5zaW9uKCdjLnknLCBbJ3kuYyddKQotCi0gICAgICAgIHNlbGYuZGlzdCA9IG1ha2VTZXR1cCgKLSAgICAgICAgICAgIHBhY2thZ2VzPVsnYScsICdhLmInLCAnYS5iLmMnLCAnYicsICdjJ10sCi0gICAgICAgICAgICBweV9tb2R1bGVzPVsnYi5kJywneCddLAotICAgICAgICAgICAgZXh0X21vZHVsZXMgPSAoc2VsZi5lMSwgc2VsZi5lMiksCi0gICAgICAgICAgICBwYWNrYWdlX2RpciA9IHt9LAotICAgICAgICApCi0KLQotICAgIGRlZiB0ZXN0RGlzdHJvVHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5kaXN0LHNldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24pKQotCi0KLSAgICBkZWYgdGVzdEV4Y2x1ZGVQYWNrYWdlKHNlbGYpOgotICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZV9wYWNrYWdlKCdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucGFja2FnZXMsIFsnYicsJ2MnXSkKLQotICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZV9wYWNrYWdlKCdiJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucGFja2FnZXMsIFsnYyddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5weV9tb2R1bGVzLCBbJ3gnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QuZXh0X21vZHVsZXMsIFtzZWxmLmUxLCBzZWxmLmUyXSkKLQotICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZV9wYWNrYWdlKCdjJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucGFja2FnZXMsIFtdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5weV9tb2R1bGVzLCBbJ3gnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QuZXh0X21vZHVsZXMsIFtzZWxmLmUxXSkKLQotICAgICAgICAjIHRlc3QgcmVtb3ZhbHMgZnJvbSB1bnNwZWNpZmllZCBvcHRpb25zCi0gICAgICAgIG1ha2VTZXR1cCgpLmV4Y2x1ZGVfcGFja2FnZSgneCcpCi0KLQotCi0KLQotCi0KLSAgICBkZWYgdGVzdEluY2x1ZGVFeGNsdWRlKHNlbGYpOgotICAgICAgICAjIHJlbW92ZSBhbiBleHRlbnNpb24KLSAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGUoZXh0X21vZHVsZXM9W3NlbGYuZTFdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTJdKQotCi0gICAgICAgICMgYWRkIGl0IGJhY2sgaW4KLSAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUoZXh0X21vZHVsZXM9W3NlbGYuZTFdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTIsIHNlbGYuZTFdKQotCi0gICAgICAgICMgc2hvdWxkIG5vdCBhZGQgZHVwbGljYXRlCi0gICAgICAgIHNlbGYuZGlzdC5pbmNsdWRlKGV4dF9tb2R1bGVzPVtzZWxmLmUxXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QuZXh0X21vZHVsZXMsIFtzZWxmLmUyLCBzZWxmLmUxXSkKLQotICAgIGRlZiB0ZXN0RXhjbHVkZVBhY2thZ2VzKHNlbGYpOgotICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZShwYWNrYWdlcz1bJ2MnLCdiJywnYSddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5wYWNrYWdlcywgW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnB5X21vZHVsZXMsIFsneCddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5leHRfbW9kdWxlcywgW3NlbGYuZTFdKQotCi0gICAgZGVmIHRlc3RFbXB0eShzZWxmKToKLSAgICAgICAgZGlzdCA9IG1ha2VTZXR1cCgpCi0gICAgICAgIGRpc3QuaW5jbHVkZShwYWNrYWdlcz1bJ2EnXSwgcHlfbW9kdWxlcz1bJ2InXSwgZXh0X21vZHVsZXM9W3NlbGYuZTJdKQotICAgICAgICBkaXN0ID0gbWFrZVNldHVwKCkKLSAgICAgICAgZGlzdC5leGNsdWRlKHBhY2thZ2VzPVsnYSddLCBweV9tb2R1bGVzPVsnYiddLCBleHRfbW9kdWxlcz1bc2VsZi5lMl0pCi0KLSAgICBkZWYgdGVzdENvbnRlbnRzKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2EnKSkKLSAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGVfcGFja2FnZSgnYScpCi0gICAgICAgIHNlbGYuZmFpbElmKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdhJykpCi0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdiJykpCi0gICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2InKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYicpKQotCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYycpKQotICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZV9wYWNrYWdlKCdjJykKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2MnKSkKLQotCi0KLQotICAgIGRlZiB0ZXN0SW52YWxpZEluY2x1ZGVFeGNsdWRlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAotICAgICAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUsIG5vbmV4aXN0ZW50X29wdGlvbj0neCcKLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAotICAgICAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGUsIG5vbmV4aXN0ZW50X29wdGlvbj0neCcKLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAotICAgICAgICAgICAgc2VsZi5kaXN0LmluY2x1ZGUsIHBhY2thZ2VzPXsneCc6J3knfQotICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCi0gICAgICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZSwgcGFja2FnZXM9eyd4JzoneSd9Ci0gICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKLSAgICAgICAgICAgIHNlbGYuZGlzdC5pbmNsdWRlLCBleHRfbW9kdWxlcz17J3gnOid5J30KLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAotICAgICAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGUsIGV4dF9tb2R1bGVzPXsneCc6J3knfQotICAgICAgICApCi0KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKLSAgICAgICAgICAgIHNlbGYuZGlzdC5pbmNsdWRlLCBwYWNrYWdlX2Rpcj1bJ3EnXQotICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCi0gICAgICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZSwgcGFja2FnZV9kaXI9WydxJ10KLSAgICAgICAgKQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotY2xhc3MgRmVhdHVyZVRlc3RzKFRlc3RDYXNlKToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5yZXEgPSBSZXF1aXJlKCdEaXN0dXRpbHMnLCcxLjAuMycsJ2Rpc3R1dGlscycpCi0gICAgICAgIHNlbGYuZGlzdCA9IG1ha2VTZXR1cCgKLSAgICAgICAgICAgIGZlYXR1cmVzPXsKLSAgICAgICAgICAgICAgICAnZm9vJzogRmVhdHVyZSgiZm9vIixzdGFuZGFyZD1UcnVlLHJlcXVpcmVfZmVhdHVyZXM9WydiYXonLHNlbGYucmVxXSksCi0gICAgICAgICAgICAgICAgJ2Jhcic6IEZlYXR1cmUoImJhciIsICBzdGFuZGFyZD1UcnVlLCBwYWNrYWdlcz1bJ3BrZy5iYXInXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9tb2R1bGVzPVsnYmFyX2V0J10sIHJlbW92ZT1bJ2Jhci5leHQnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKSwKLSAgICAgICAgICAgICAgICAnYmF6JzogRmVhdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJiYXoiLCBvcHRpb25hbD1GYWxzZSwgcGFja2FnZXM9Wydwa2cuYmF6J10sCi0gICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzID0gWydzY3JpcHRzL2Jhel9pdCddLAotICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVsoJ2xpYmZvbycsJ2Zvby9mb29mb28uYycpXQotICAgICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgICAgICdkd2ltJzogRmVhdHVyZSgiRFdJTSIsIGF2YWlsYWJsZT1GYWxzZSwgcmVtb3ZlPSdiYXppc2gnKSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBzY3JpcHRfYXJncz1bJy0td2l0aG91dC1iYXInLCAnaW5zdGFsbCddLAotICAgICAgICAgICAgcGFja2FnZXMgPSBbJ3BrZy5iYXInLCAncGtnLmZvbyddLAotICAgICAgICAgICAgcHlfbW9kdWxlcyA9IFsnYmFyX2V0JywgJ2JhemlzaCddLAotICAgICAgICAgICAgZXh0X21vZHVsZXMgPSBbRXh0ZW5zaW9uKCdiYXIuZXh0JyxbJ2Jhci5jJ10pXQotICAgICAgICApCi0KLSAgICBkZWYgdGVzdERlZmF1bHRzKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZigKLSAgICAgICAgICAgIEZlYXR1cmUoCi0gICAgICAgICAgICAgICAgInRlc3QiLHN0YW5kYXJkPVRydWUscmVtb3ZlPSd4JyxhdmFpbGFibGU9RmFsc2UKLSAgICAgICAgICAgICkuaW5jbHVkZV9ieV9kZWZhdWx0KCkKLSAgICAgICAgKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCi0gICAgICAgICAgICBGZWF0dXJlKCJ0ZXN0IixzdGFuZGFyZD1UcnVlLHJlbW92ZT0neCcpLmluY2x1ZGVfYnlfZGVmYXVsdCgpCi0gICAgICAgICkKLSAgICAgICAgIyBGZWF0dXJlIG11c3QgaGF2ZSBlaXRoZXIga3dhcmdzLCByZW1vdmVzLCBvciByZXF1aXJlX2ZlYXR1cmVzCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIEZlYXR1cmUsICJ0ZXN0IikKLQotICAgIGRlZiB0ZXN0QXZhaWxhYmlsaXR5KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgICAgIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCi0gICAgICAgICAgICBzZWxmLmRpc3QuZmVhdHVyZXNbJ2R3aW0nXS5pbmNsdWRlX2luLCBzZWxmLmRpc3QKLSAgICAgICAgKQotCi0gICAgZGVmIHRlc3RGZWF0dXJlT3B0aW9ucyhzZWxmKToKLSAgICAgICAgZGlzdCA9IHNlbGYuZGlzdAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCi0gICAgICAgICAgICAoJ3dpdGgtZHdpbScsTm9uZSwnaW5jbHVkZSBEV0lNJykgaW4gZGlzdC5mZWF0dXJlX29wdGlvbnMKLSAgICAgICAgKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCi0gICAgICAgICAgICAoJ3dpdGhvdXQtZHdpbScsTm9uZSwnZXhjbHVkZSBEV0lNIChkZWZhdWx0KScpIGluIGRpc3QuZmVhdHVyZV9vcHRpb25zCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAotICAgICAgICAgICAgKCd3aXRoLWJhcicsTm9uZSwnaW5jbHVkZSBiYXIgKGRlZmF1bHQpJykgaW4gZGlzdC5mZWF0dXJlX29wdGlvbnMKLSAgICAgICAgKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoCi0gICAgICAgICAgICAoJ3dpdGhvdXQtYmFyJyxOb25lLCdleGNsdWRlIGJhcicpIGluIGRpc3QuZmVhdHVyZV9vcHRpb25zCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LmZlYXR1cmVfbmVnb3B0Wyd3aXRob3V0LWZvbyddLCd3aXRoLWZvbycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5mZWF0dXJlX25lZ29wdFsnd2l0aG91dC1iYXInXSwnd2l0aC1iYXInKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZmVhdHVyZV9uZWdvcHRbJ3dpdGhvdXQtZHdpbSddLCd3aXRoLWR3aW0nKQotICAgICAgICBzZWxmLmZhaWxJZignd2l0aG91dC1iYXonIGluIGRpc3QuZmVhdHVyZV9uZWdvcHQpCi0KLSAgICBkZWYgdGVzdFVzZUZlYXR1cmVzKHNlbGYpOgotICAgICAgICBkaXN0ID0gc2VsZi5kaXN0Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC53aXRoX2ZvbywxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3Qud2l0aF9iYXIsMCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LndpdGhfYmF6LDEpCi0gICAgICAgIHNlbGYuZmFpbElmKCdiYXJfZXQnIGluIGRpc3QucHlfbW9kdWxlcykKLSAgICAgICAgc2VsZi5mYWlsSWYoJ3BrZy5iYXInIGluIGRpc3QucGFja2FnZXMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygncGtnLmJheicgaW4gZGlzdC5wYWNrYWdlcykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdzY3JpcHRzL2Jhel9pdCcgaW4gZGlzdC5zY3JpcHRzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoKCdsaWJmb28nLCdmb28vZm9vZm9vLmMnKSBpbiBkaXN0LmxpYnJhcmllcykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LmV4dF9tb2R1bGVzLFtdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QucmVxdWlyZV9mZWF0dXJlcywgW3NlbGYucmVxXSkKLQotICAgICAgICAjIElmIHdlIGFzayBmb3IgYmFyLCBpdCBzaG91bGQgZmFpbCBiZWNhdXNlIHdlIGV4cGxpY2l0bHkgZGlzYWJsZWQKLSAgICAgICAgIyBpdCBvbiB0aGUgY29tbWFuZCBsaW5lCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBkaXN0LmluY2x1ZGVfZmVhdHVyZSwgJ2JhcicpCi0KLSAgICBkZWYgdGVzdEZlYXR1cmVXaXRoSW52YWxpZFJlbW92ZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCi0gICAgICAgICAgICBTeXN0ZW1FeGl0LCBtYWtlU2V0dXAsIGZlYXR1cmVzID0geyd4JzpGZWF0dXJlKCd4JywgcmVtb3ZlPSd5Jyl9Ci0gICAgICAgICkKLQotY2xhc3MgVGVzdENvbW1hbmRUZXN0cyhUZXN0Q2FzZSk6Ci0KLSAgICBkZWYgdGVzdFRlc3RJc0NvbW1hbmQoc2VsZik6Ci0gICAgICAgIHRlc3RfY21kID0gbWFrZVNldHVwKCkuZ2V0X2NvbW1hbmRfb2JqKCd0ZXN0JykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UodGVzdF9jbWQsIGRpc3R1dGlscy5jbWQuQ29tbWFuZCkpCi0KLSAgICBkZWYgdGVzdExvbmdPcHRTdWl0ZVdOb0RlZmF1bHQoc2VsZik6Ci0gICAgICAgIHRzMSA9IG1ha2VTZXR1cChzY3JpcHRfYXJncz1bJ3Rlc3QnLCctLXRlc3Qtc3VpdGU9Zm9vLnRlc3RzLnN1aXRlJ10pCi0gICAgICAgIHRzMSA9IHRzMS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQotICAgICAgICB0czEuZW5zdXJlX2ZpbmFsaXplZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMxLnRlc3Rfc3VpdGUsICdmb28udGVzdHMuc3VpdGUnKQotCi0gICAgZGVmIHRlc3REZWZhdWx0U3VpdGUoc2VsZik6Ci0gICAgICAgIHRzMiA9IG1ha2VTZXR1cCh0ZXN0X3N1aXRlPSdiYXIudGVzdHMuc3VpdGUnKS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQotICAgICAgICB0czIuZW5zdXJlX2ZpbmFsaXplZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMyLnRlc3Rfc3VpdGUsICdiYXIudGVzdHMuc3VpdGUnKQotCi0gICAgZGVmIHRlc3REZWZhdWx0V01vZHVsZU9uQ21kTGluZShzZWxmKToKLSAgICAgICAgdHMzID0gbWFrZVNldHVwKAotICAgICAgICAgICAgdGVzdF9zdWl0ZT0nYmFyLnRlc3RzJywKLSAgICAgICAgICAgIHNjcmlwdF9hcmdzPVsndGVzdCcsJy1tJywnZm9vLnRlc3RzJ10KLSAgICAgICAgKS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQotICAgICAgICB0czMuZW5zdXJlX2ZpbmFsaXplZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMzLnRlc3RfbW9kdWxlLCAnZm9vLnRlc3RzJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czMudGVzdF9zdWl0ZSwgICdmb28udGVzdHMudGVzdF9zdWl0ZScpCi0KLSAgICBkZWYgdGVzdENvbmZsaWN0aW5nT3B0aW9ucyhzZWxmKToKLSAgICAgICAgdHM0ID0gbWFrZVNldHVwKAotICAgICAgICAgICAgc2NyaXB0X2FyZ3M9Wyd0ZXN0JywnLW0nLCdiYXIudGVzdHMnLCAnLXMnLCdmb28udGVzdHMuc3VpdGUnXQotICAgICAgICApLmdldF9jb21tYW5kX29iaigndGVzdCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCB0czQuZW5zdXJlX2ZpbmFsaXplZCkKLQotICAgIGRlZiB0ZXN0Tm9TdWl0ZShzZWxmKToKLSAgICAgICAgdHM1ID0gbWFrZVNldHVwKCkuZ2V0X2NvbW1hbmRfb2JqKCd0ZXN0JykKLSAgICAgICAgdHM1LmVuc3VyZV9maW5hbGl6ZWQoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzNS50ZXN0X3N1aXRlLCBOb25lKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvdGVzdHMvYXBpX3Rlc3RzLnR4dCBiL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL2FwaV90ZXN0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczNWFkOGQuLjAwMDAwMDAKLS0tIGEvTGliL3NldHVwdG9vbHMvdGVzdHMvYXBpX3Rlc3RzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi1QbHVnZ2FibGUgRGlzdHJpYnV0aW9ucyBvZiBQeXRob24gU29mdHdhcmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1EaXN0cmlidXRpb25zCi0tLS0tLS0tLS0tLS0tCi0KLUEgIkRpc3RyaWJ1dGlvbiIgaXMgYSBjb2xsZWN0aW9uIG9mIGZpbGVzIHRoYXQgcmVwcmVzZW50IGEgIlJlbGVhc2UiIG9mIGEKLSJQcm9qZWN0IiBhcyBvZiBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSwgZGVub3RlZCBieSBhCi0iVmVyc2lvbiI6OgotCi0gICAgPj4+IGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMKLSAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24KLSAgICA+Pj4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIiwgdmVyc2lvbj0iMS4yIikKLSAgICBGb28gMS4yCi0KLURpc3RyaWJ1dGlvbnMgaGF2ZSBhIGxvY2F0aW9uLCB3aGljaCBjYW4gYmUgYSBmaWxlbmFtZSwgVVJMLCBvciByZWFsbHkgYW55dGhpbmcKLWVsc2UgeW91IGNhcmUgdG8gdXNlOjoKLQotICAgID4+PiBkaXN0ID0gRGlzdHJpYnV0aW9uKAotICAgIC4uLiAgICAgbG9jYXRpb249Imh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmciLAotICAgIC4uLiAgICAgcHJvamVjdF9uYW1lPSJCYXIiLCB2ZXJzaW9uPSIwLjkiCi0gICAgLi4uICkKLQotICAgID4+PiBkaXN0Ci0gICAgQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZykKLQotCi1EaXN0cmlidXRpb25zIGhhdmUgdmFyaW91cyBpbnRyb3NwZWN0YWJsZSBhdHRyaWJ1dGVzOjoKLQotICAgID4+PiBkaXN0LmxvY2F0aW9uCi0gICAgJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnCi0KLSAgICA+Pj4gZGlzdC5wcm9qZWN0X25hbWUKLSAgICAnQmFyJwotCi0gICAgPj4+IGRpc3QudmVyc2lvbgotICAgICcwLjknCi0KLSAgICA+Pj4gZGlzdC5weV92ZXJzaW9uID09IHN5cy52ZXJzaW9uWzozXQotICAgIFRydWUKLQotICAgID4+PiBwcmludCBkaXN0LnBsYXRmb3JtCi0gICAgTm9uZQotCi1JbmNsdWRpbmcgdmFyaW91cyBjb21wdXRlZCBhdHRyaWJ1dGVzOjoKLQotICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHBhcnNlX3ZlcnNpb24KLSAgICA+Pj4gZGlzdC5wYXJzZWRfdmVyc2lvbiA9PSBwYXJzZV92ZXJzaW9uKGRpc3QudmVyc2lvbikKLSAgICBUcnVlCi0KLSAgICA+Pj4gZGlzdC5rZXkgICAgIyBjYXNlLWluc2Vuc2l0aXZlIGZvcm0gb2YgdGhlIHByb2plY3QgbmFtZQotICAgICdiYXInCi0KLURpc3RyaWJ1dGlvbnMgYXJlIGNvbXBhcmVkIChhbmQgaGFzaGVkKSBieSB2ZXJzaW9uIGZpcnN0OjoKLQotICAgID4+PiBEaXN0cmlidXRpb24odmVyc2lvbj0nMS4wJykgPT0gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpCi0gICAgVHJ1ZQotICAgID4+PiBEaXN0cmlidXRpb24odmVyc2lvbj0nMS4wJykgPT0gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMScpCi0gICAgRmFsc2UKLSAgICA+Pj4gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpIDwgIERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjEnKQotICAgIFRydWUKLQotYnV0IGFsc28gYnkgcHJvamVjdCBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKSwgcGxhdGZvcm0sIFB5dGhvbiB2ZXJzaW9uLAotbG9jYXRpb24sIGV0Yy46OgotCi0gICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsdmVyc2lvbj0iMS4wIikgPT0gXAotICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpCi0gICAgVHJ1ZQotCi0gICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsdmVyc2lvbj0iMS4wIikgPT0gXAotICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJmb28iLHZlcnNpb249IjEuMCIpCi0gICAgVHJ1ZQotCi0gICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsdmVyc2lvbj0iMS4wIikgPT0gXAotICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMSIpCi0gICAgRmFsc2UKLQotICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHB5X3ZlcnNpb249IjIuMyIsdmVyc2lvbj0iMS4wIikgPT0gXAotICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHB5X3ZlcnNpb249IjIuNCIsdmVyc2lvbj0iMS4wIikKLSAgICBGYWxzZQotCi0gICAgPj4+IERpc3RyaWJ1dGlvbihsb2NhdGlvbj0ic3BhbSIsdmVyc2lvbj0iMS4wIikgPT0gXAotICAgIC4uLiBEaXN0cmlidXRpb24obG9jYXRpb249InNwYW0iLHZlcnNpb249IjEuMCIpCi0gICAgVHJ1ZQotCi0gICAgPj4+IERpc3RyaWJ1dGlvbihsb2NhdGlvbj0ic3BhbSIsdmVyc2lvbj0iMS4wIikgPT0gXAotICAgIC4uLiBEaXN0cmlidXRpb24obG9jYXRpb249ImJheiIsdmVyc2lvbj0iMS4wIikKLSAgICBGYWxzZQotCi0KLQotSGFzaCBhbmQgY29tcGFyZSBkaXN0cmlidXRpb24gYnkgcHJpby9wbGF0Ci0KLUdldCB2ZXJzaW9uIGZyb20gbWV0YWRhdGEKLXByb3ZpZGVyIGNhcGFiaWxpdGllcwotZWdnX25hbWUoKQotYXNfcmVxdWlyZW1lbnQoKQotZnJvbV9sb2NhdGlvbiwgZnJvbV9maWxlbmFtZSAody9wYXRoIG5vcm1hbGl6YXRpb24pCi0KLVJlbGVhc2VzIG1heSBoYXZlIHplcm8gb3IgbW9yZSAiUmVxdWlyZW1lbnRzIiwgd2hpY2ggaW5kaWNhdGUKLXdoYXQgcmVsZWFzZXMgb2YgYW5vdGhlciBwcm9qZWN0IHRoZSByZWxlYXNlIHJlcXVpcmVzIGluIG9yZGVyIHRvCi1mdW5jdGlvbi4gIEEgUmVxdWlyZW1lbnQgbmFtZXMgdGhlIG90aGVyIHByb2plY3QsIGV4cHJlc3NlcyBzb21lIGNyaXRlcmlhCi1hcyB0byB3aGF0IHJlbGVhc2VzIG9mIHRoYXQgcHJvamVjdCBhcmUgYWNjZXB0YWJsZSwgYW5kIGxpc3RzIGFueSAiRXh0cmFzIgotdGhhdCB0aGUgcmVxdWlyaW5nIHJlbGVhc2UgbWF5IG5lZWQgZnJvbSB0aGF0IHByb2plY3QuICAoQW4gRXh0cmEgaXMgYW4KLW9wdGlvbmFsIGZlYXR1cmUgb2YgYSBSZWxlYXNlLCB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgaWYgaXRzIGFkZGl0aW9uYWwKLVJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkLikKLQotCi0KLVRoZSBXb3JraW5nIFNldAotLS0tLS0tLS0tLS0tLS0tCi0KLUEgY29sbGVjdGlvbiBvZiBhY3RpdmUgZGlzdHJpYnV0aW9ucyBpcyBjYWxsZWQgYSBXb3JraW5nIFNldC4gIE5vdGUgdGhhdCBhCi1Xb3JraW5nIFNldCBjYW4gY29udGFpbiBhbnkgaW1wb3J0YWJsZSBkaXN0cmlidXRpb24sIG5vdCBqdXN0IHBsdWdnYWJsZSBvbmVzLgotRm9yIGV4YW1wbGUsIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSBpcyBhbiBpbXBvcnRhYmxlIGRpc3RyaWJ1dGlvbiB0aGF0Ci13aWxsIHVzdWFsbHkgYmUgcGFydCBvZiB0aGUgV29ya2luZyBTZXQsIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCBwbHVnZ2FibGUuCi1TaW1pbGFybHksIHdoZW4geW91IGFyZSBkb2luZyBkZXZlbG9wbWVudCB3b3JrIG9uIGEgcHJvamVjdCwgdGhlIGZpbGVzIHlvdSBhcmUKLWVkaXRpbmcgYXJlIGFsc28gYSBEaXN0cmlidXRpb24uICAoQW5kLCB3aXRoIGEgbGl0dGxlIGF0dGVudGlvbiB0byB0aGUKLWRpcmVjdG9yeSBuYW1lcyB1c2VkLCAgYW5kIGluY2x1ZGluZyBzb21lIGFkZGl0aW9uYWwgbWV0YWRhdGEsIHN1Y2ggYQotImRldmVsb3BtZW50IGRpc3RyaWJ1dGlvbiIgY2FuIGJlIG1hZGUgcGx1Z2dhYmxlIGFzIHdlbGwuKQotCi0gICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgV29ya2luZ1NldAotCi1BIHdvcmtpbmcgc2V0J3MgZW50cmllcyBhcmUgdGhlIHN5cy5wYXRoIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBhY3RpdmUKLWRpc3RyaWJ1dGlvbnMuICBCeSBkZWZhdWx0LCB0aGUgd29ya2luZyBzZXQncyBlbnRyaWVzIGFyZSB0aGUgaXRlbXMgb24KLWBgc3lzLnBhdGhgYDo6Ci0KLSAgICA+Pj4gd3MgPSBXb3JraW5nU2V0KCkKLSAgICA+Pj4gd3MuZW50cmllcyA9PSBzeXMucGF0aAotICAgIFRydWUKLQotQnV0IHlvdSBjYW4gYWxzbyBjcmVhdGUgYW4gZW1wdHkgd29ya2luZyBzZXQgZXhwbGljaXRseSwgYW5kIGFkZCBkaXN0cmlidXRpb25zCi10byBpdDo6Ci0KLSAgICA+Pj4gd3MgPSBXb3JraW5nU2V0KFtdKQotICAgID4+PiB3cy5hZGQoZGlzdCkKLSAgICA+Pj4gd3MuZW50cmllcwotICAgIFsnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyddCi0gICAgPj4+IGRpc3QgaW4gd3MKLSAgICBUcnVlCi0gICAgPj4+IERpc3RyaWJ1dGlvbignZm9vJyx2ZXJzaW9uPSIiKSBpbiB3cwotICAgIEZhbHNlCi0KLUFuZCB5b3UgY2FuIGl0ZXJhdGUgb3ZlciBpdHMgZGlzdHJpYnV0aW9uczo6Ci0KLSAgICA+Pj4gbGlzdCh3cykKLSAgICBbQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyldCi0KLUFkZGluZyB0aGUgc2FtZSBkaXN0cmlidXRpb24gbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcDo6Ci0KLSAgICA+Pj4gd3MuYWRkKGRpc3QpCi0gICAgPj4+IGxpc3Qod3MpCi0gICAgW0JhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpXQotCi1Gb3IgdGhhdCBtYXR0ZXIsIGFkZGluZyBtdWx0aXBsZSBkaXN0cmlidXRpb25zIGZvciB0aGUgc2FtZSBwcm9qZWN0IGFsc28gZG9lcwotbm90aGluZywgYmVjYXVzZSBhIHdvcmtpbmcgc2V0IGNhbiBvbmx5IGhvbGQgb25lIGFjdGl2ZSBkaXN0cmlidXRpb24gcGVyCi1wcm9qZWN0IC0tIHRoZSBmaXJzdCBvbmUgYWRkZWQgdG8gaXQ6OgotCi0gICAgPj4+IHdzLmFkZCgKLSAgICAuLi4gICAgIERpc3RyaWJ1dGlvbigKLSAgICAuLi4gICAgICAgICAnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZycsIHByb2plY3RfbmFtZT0iQmFyIiwKLSAgICAuLi4gICAgICAgICB2ZXJzaW9uPSI3LjIiCi0gICAgLi4uICAgICApCi0gICAgLi4uICkKLSAgICA+Pj4gbGlzdCh3cykKLSAgICBbQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyldCi0KLVlvdSBjYW4gYXBwZW5kIGEgcGF0aCBlbnRyeSB0byBhIHdvcmtpbmcgc2V0IHVzaW5nIGBgYWRkX2VudHJ5KClgYDo6Ci0KLSAgICA+Pj4gd3MuZW50cmllcwotICAgIFsnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyddCi0gICAgPj4+IHdzLmFkZF9lbnRyeShwa2dfcmVzb3VyY2VzLl9fZmlsZV9fKQotICAgID4+PiB3cy5lbnRyaWVzCi0gICAgWydodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nJywgJy4uLnBrZ19yZXNvdXJjZXMucHkuLi4nXQotCi1NdWx0aXBsZSBhZGRpdGlvbnMgcmVzdWx0IGluIG11bHRpcGxlIGVudHJpZXMsIGV2ZW4gaWYgdGhlIGVudHJ5IGlzIGFscmVhZHkgaW4KLXRoZSB3b3JraW5nIHNldCAoYmVjYXVzZSBgYHN5cy5wYXRoYGAgY2FuIGNvbnRhaW4gdGhlIHNhbWUgZW50cnkgbW9yZSB0aGFuCi1vbmNlKTo6Ci0KLSAgICA+Pj4gd3MuYWRkX2VudHJ5KHBrZ19yZXNvdXJjZXMuX19maWxlX18pCi0gICAgPj4+IHdzLmVudHJpZXMKLSAgICBbJy4uLmV4YW1wbGUuY29tLi4uJywgJy4uLnBrZ19yZXNvdXJjZXMuLi4nLCAnLi4ucGtnX3Jlc291cmNlcy4uLiddCi0KLUFuZCB5b3UgY2FuIHNwZWNpZnkgdGhlIHBhdGggZW50cnkgYSBkaXN0cmlidXRpb24gd2FzIGZvdW5kIHVuZGVyLCB1c2luZyB0aGUKLW9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgdG8gYGBhZGQoKWBgOjoKLQotICAgID4+PiB3cyA9IFdvcmtpbmdTZXQoW10pCi0gICAgPj4+IHdzLmFkZChkaXN0LCJmb28iKQotICAgID4+PiB3cy5lbnRyaWVzCi0gICAgWydmb28nXQotCi1CdXQgZXZlbiBpZiBhIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCB1bmRlciBtdWx0aXBsZSBwYXRoIGVudHJpZXMsIGl0IHN0aWxsIG9ubHkKLXNob3dzIHVwIG9uY2Ugd2hlbiBpdGVyYXRpbmcgdGhlIHdvcmtpbmcgc2V0OgotCi0gICAgPj4+IHdzLmFkZF9lbnRyeSh3cy5lbnRyaWVzWzBdKQotICAgID4+PiBsaXN0KHdzKQotICAgIFtCYXIgMC45IChodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nKV0KLQotWW91IGNhbiBhc2sgYSBXb3JraW5nU2V0IHRvIGBgZmluZCgpYGAgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYSByZXF1aXJlbWVudDo6Ci0KLSAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBSZXF1aXJlbWVudAotICAgID4+PiBwcmludCB3cy5maW5kKFJlcXVpcmVtZW50LnBhcnNlKCJGb289PTEuMCIpKSAgICAjIG5vIG1hdGNoLCByZXR1cm4gTm9uZQotICAgIE5vbmUKLQotICAgID4+PiB3cy5maW5kKFJlcXVpcmVtZW50LnBhcnNlKCJCYXI9PTAuOSIpKSAgIyBtYXRjaCwgcmV0dXJuIGRpc3RyaWJ1dGlvbgotICAgIEJhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpCi0KLU5vdGUgdGhhdCBhc2tpbmcgZm9yIGEgY29uZmxpY3RpbmcgdmVyc2lvbiBvZiBhIGRpc3RyaWJ1dGlvbiBhbHJlYWR5IGluIGEKLXdvcmtpbmcgc2V0IHRyaWdnZXJzIGEgYGBwa2dfcmVzb3VyY2VzLlZlcnNpb25Db25mbGljdGBgIGVycm9yOgotCi0gICAgPj4+IHdzLmZpbmQoUmVxdWlyZW1lbnQucGFyc2UoIkJhcj09MS4wIikpICMgZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCi0gICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotICAgICAgLi4uCi0gICAgVmVyc2lvbkNvbmZsaWN0OiAoQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyksCi0gICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQucGFyc2UoJ0Jhcj09MS4wJykpCi0KLVlvdSBjYW4gc3Vic2NyaWJlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW5ldmVyIGEgbmV3Ci1kaXN0cmlidXRpb24gaXMgYWRkZWQgdG8gYSB3b3JraW5nIHNldC4gIFRoZSBjYWxsYmFjayBpcyBpbW1lZGlhdGVseSBpbnZva2VkCi1vbmNlIGZvciBlYWNoIGV4aXN0aW5nIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd29ya2luZyBzZXQsIGFuZCB0aGVuIGlzIGNhbGxlZAotYWdhaW4gZm9yIG5ldyBkaXN0cmlidXRpb25zIGFkZGVkIHRoZXJlYWZ0ZXI6OgotCi0gICAgPj4+IGRlZiBhZGRlZChkaXN0KTogcHJpbnQgIkFkZGVkIiwgZGlzdAotICAgID4+PiB3cy5zdWJzY3JpYmUoYWRkZWQpCi0gICAgQWRkZWQgQmFyIDAuOQotICAgID4+PiBmb28xMiA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsIHZlcnNpb249IjEuMiIsIGxvY2F0aW9uPSJmMTIiKSAKLSAgICA+Pj4gd3MuYWRkKGZvbzEyKQotICAgIEFkZGVkIEZvbyAxLjIKLQotTm90ZSwgaG93ZXZlciwgdGhhdCBvbmx5IHRoZSBmaXJzdCBkaXN0cmlidXRpb24gYWRkZWQgZm9yIGEgZ2l2ZW4gcHJvamVjdCBuYW1lCi13aWxsIHRyaWdnZXIgYSBjYWxsYmFjaywgZXZlbiBkdXJpbmcgdGhlIGluaXRpYWwgYGBzdWJzY3JpYmUoKWBgIGNhbGxiYWNrOjoKLQotICAgID4+PiBmb28xNCA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsIHZlcnNpb249IjEuNCIsIGxvY2F0aW9uPSJmMTQiKSAKLSAgICA+Pj4gd3MuYWRkKGZvbzE0KSAgICMgbm8gY2FsbGJhY2ssIGJlY2F1c2UgRm9vIDEuMiBpcyBhbHJlYWR5IGFjdGl2ZQotCi0gICAgPj4+IHdzID0gV29ya2luZ1NldChbXSkKLSAgICA+Pj4gd3MuYWRkKGZvbzEyKQotICAgID4+PiB3cy5hZGQoZm9vMTQpCi0gICAgPj4+IHdzLnN1YnNjcmliZShhZGRlZCkKLSAgICBBZGRlZCBGb28gMS4yCi0gICAgCi1BbmQgYWRkaW5nIGEgY2FsbGJhY2sgbW9yZSB0aGFuIG9uY2UgaGFzIG5vIGVmZmVjdCwgZWl0aGVyOjoKLQotICAgID4+PiB3cy5zdWJzY3JpYmUoYWRkZWQpICAgICAjIG5vIGNhbGxiYWNrcwotCi0gICAgIyBhbmQgbm8gZG91YmxlLWNhbGxiYWNrcyBvbiBzdWJzZXF1ZW50IGFkZGl0aW9ucywgZWl0aGVyCi0gICAgPj4+IGp1c3RfYV90ZXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iSnVzdEFUZXN0IiwgdmVyc2lvbj0iMC45OSIpCi0gICAgPj4+IHdzLmFkZChqdXN0X2FfdGVzdCkKLSAgICBBZGRlZCBKdXN0QVRlc3QgMC45OQotCi0KLUZpbmRpbmcgUGx1Z2lucwotLS0tLS0tLS0tLS0tLS0tCi0KLWBgV29ya2luZ1NldGBgIG9iamVjdHMgY2FuIGJlIHVzZWQgdG8gZmlndXJlIG91dCB3aGF0IHBsdWdpbnMgaW4gYW4KLWBgRW52aXJvbm1lbnRgYCBjYW4gYmUgbG9hZGVkIHdpdGhvdXQgYW55IHJlc29sdXRpb24gZXJyb3JzOjoKLQotICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IEVudmlyb25tZW50Ci0KLSAgICA+Pj4gcGx1Z2lucyA9IEVudmlyb25tZW50KFtdKSAgICMgbm9ybWFsbHksIGEgbGlzdCBvZiBwbHVnaW4gZGlyZWN0b3JpZXMKLSAgICA+Pj4gcGx1Z2lucy5hZGQoZm9vMTIpCi0gICAgPj4+IHBsdWdpbnMuYWRkKGZvbzE0KQotICAgID4+PiBwbHVnaW5zLmFkZChqdXN0X2FfdGVzdCkKLSAgICAKLUluIHRoZSBzaW1wbGVzdCBjYXNlLCB3ZSBqdXN0IGdldCB0aGUgbmV3ZXN0IHZlcnNpb24gb2YgZWFjaCBkaXN0cmlidXRpb24gaW4KLXRoZSBwbHVnaW4gZW52aXJvbm1lbnQ6OgotCi0gICAgPj4+IHdzID0gV29ya2luZ1NldChbXSkKLSAgICA+Pj4gd3MuZmluZF9wbHVnaW5zKHBsdWdpbnMpCi0gICAgKFtKdXN0QVRlc3QgMC45OSwgRm9vIDEuNCAoZjE0KV0sIHt9KQotCi1CdXQgaWYgdGhlcmUncyBhIHByb2JsZW0gd2l0aCBhIHZlcnNpb24gY29uZmxpY3Qgb3IgbWlzc2luZyByZXF1aXJlbWVudHMsIHRoZQotbWV0aG9kIGZhbGxzIGJhY2sgdG8gb2xkZXIgdmVyc2lvbnMsIGFuZCB0aGUgZXJyb3IgaW5mbyBkaWN0IHdpbGwgY29udGFpbiBhbgotZXhjZXB0aW9uIGluc3RhbmNlIGZvciBlYWNoIHVubG9hZGFibGUgcGx1Z2luOjoKLQotICAgID4+PiB3cy5hZGQoZm9vMTIpICAgIyB0aGlzIHdpbGwgY29uZmxpY3Qgd2l0aCBGb28gMS40Ci0gICAgPj4+IHdzLmZpbmRfcGx1Z2lucyhwbHVnaW5zKQotICAgIChbSnVzdEFUZXN0IDAuOTksIEZvbyAxLjIgKGYxMildLCB7Rm9vIDEuNCAoZjE0KTogVmVyc2lvbkNvbmZsaWN0KC4uLil9KQotCi1CdXQgaWYgeW91IGRpc2FsbG93IGZhbGxiYWNrcywgdGhlIGZhaWxlZCBwbHVnaW4gd2lsbCBiZSBza2lwcGVkIGluc3RlYWQgb2YKLXRyeWluZyBvbGRlciB2ZXJzaW9uczo6Ci0KLSAgICA+Pj4gd3MuZmluZF9wbHVnaW5zKHBsdWdpbnMsIGZhbGxiYWNrPUZhbHNlKQotICAgIChbSnVzdEFUZXN0IDAuOTldLCB7Rm9vIDEuNCAoZjE0KTogVmVyc2lvbkNvbmZsaWN0KC4uLil9KQotCi0KLQotUGxhdGZvcm0gQ29tcGF0aWJpbGl0eSBSdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1PbiB0aGUgTWFjLCB0aGVyZSBhcmUgcG90ZW50aWFsIGNvbXBhdGliaWxpdHkgaXNzdWVzIGZvciBtb2R1bGVzIGNvbXBpbGVkCi1vbiBuZXdlciB2ZXJzaW9ucyBvZiBNYWMgT1MgWCB0aGFuIHdoYXQgdGhlIHVzZXIgaXMgcnVubmluZy4gQWRkaXRpb25hbGx5LAotTWFjIE9TIFggd2lsbCBzb29uIGhhdmUgdHdvIHBsYXRmb3JtcyB0byBjb250ZW5kIHdpdGg6IEludGVsIGFuZCBQb3dlclBDLgotCi1CYXNpYyBlcXVhbGl0eSB3b3JrcyBhcyBvbiBvdGhlciBwbGF0Zm9ybXM6OgotCi0gICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgY29tcGF0aWJsZV9wbGF0Zm9ybXMgYXMgY3AKLSAgICA+Pj4gcmVxZCA9ICdtYWNvc3gtMTAuNC1wcGMnCi0gICAgPj4+IGNwKHJlcWQsIHJlcWQpCi0gICAgVHJ1ZQotICAgID4+PiBjcCgid2luMzIiLCByZXFkKQotICAgIEZhbHNlCi0KLURpc3RyaWJ1dGlvbnMgbWFkZSBvbiBvdGhlciBtYWNoaW5lIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZTo6Ci0KLSAgICA+Pj4gY3AoIm1hY29zeC0xMC40LWkzODYiLCByZXFkKQotICAgIEZhbHNlCi0KLURpc3RyaWJ1dGlvbnMgbWFkZSBvbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBPUyBhcmUgY29tcGF0aWJsZSwgYXMKLWxvbmcgYXMgdGhleSBhcmUgZnJvbSB0aGUgc2FtZSB0b3AtbGV2ZWwgdmVyc2lvbi4gVGhlIHBhdGNobGV2ZWwgdmVyc2lvbgotbnVtYmVyIGRvZXMgbm90IG1hdHRlcjo6Ci0KLSAgICA+Pj4gY3AoIm1hY29zeC0xMC40LXBwYyIsIHJlcWQpCi0gICAgVHJ1ZQotICAgID4+PiBjcCgibWFjb3N4LTEwLjMtcHBjIiwgcmVxZCkKLSAgICBUcnVlCi0gICAgPj4+IGNwKCJtYWNvc3gtMTAuNS1wcGMiLCByZXFkKQotICAgIEZhbHNlCi0gICAgPj4+IGNwKCJtYWNvc3gtOS41LXBwYyIsIHJlcWQpCi0gICAgRmFsc2UKLQotQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHBhY2thZ2VzIG1hZGUgdmlhIGVhcmxpZXIgdmVyc2lvbnMgb2YgCi1zZXR1cHRvb2xzIGlzIHByb3ZpZGVkIGFzIHdlbGw6OgotCi0gICAgPj4+IGNwKCJkYXJ3aW4tOC4yLjAtUG93ZXJfTWFjaW50b3NoIiwgcmVxZCkKLSAgICBUcnVlCi0gICAgPj4+IGNwKCJkYXJ3aW4tNy4yLjAtUG93ZXJfTWFjaW50b3NoIiwgcmVxZCkKLSAgICBUcnVlCi0gICAgPj4+IGNwKCJkYXJ3aW4tOC4yLjAtUG93ZXJfTWFjaW50b3NoIiwgIm1hY29zeC0xMC4zLXBwYyIpCi0gICAgRmFsc2UKLQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvdGVzdHMvdGVzdF9yZXNvdXJjZXMucHkgYi9MaWIvc2V0dXB0b29scy90ZXN0cy90ZXN0X3Jlc291cmNlcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyYzcyZS4uMDAwMDAwMAotLS0gYS9MaWIvc2V0dXB0b29scy90ZXN0cy90ZXN0X3Jlc291cmNlcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi1mcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZSwgbWFrZVN1aXRlCi1mcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0ICoKLWltcG9ydCBwa2dfcmVzb3VyY2VzLCBzeXMKLWZyb20gc2V0cyBpbXBvcnQgSW1tdXRhYmxlU2V0Ci0KLWNsYXNzIE1ldGFkYXRhKEVtcHR5UHJvdmlkZXIpOgotICAgICIiIk1vY2sgb2JqZWN0IHRvIHJldHVybiBtZXRhZGF0YSBhcyBpZiBmcm9tIGFuIG9uLWRpc2sgZGlzdHJpYnV0aW9uIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwqcGFpcnMpOgotICAgICAgICBzZWxmLm1ldGFkYXRhID0gZGljdChwYWlycykKLQotICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZixuYW1lKToKLSAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5tZXRhZGF0YQotCi0gICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLG5hbWUpOgotICAgICAgICByZXR1cm4gc2VsZi5tZXRhZGF0YVtuYW1lXQotCi0gICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLG5hbWUpOgotICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCi0KLQotY2xhc3MgRGlzdHJvVGVzdHMoVGVzdENhc2UpOgotCi0gICAgZGVmIHRlc3RDb2xsZWN0aW9uKHNlbGYpOgotICAgICAgICAjIGVtcHR5IHBhdGggc2hvdWxkIHByb2R1Y2Ugbm8gZGlzdHJpYnV0aW9ucwotICAgICAgICBhZCA9IEVudmlyb25tZW50KFtdLCBwbGF0Zm9ybT1Ob25lLCBweXRob249Tm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFkKSwgW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRbJ0Zvb1BrZyddLFtdKQotCi0gICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuM18xLmVnZyIpKQotICAgICAgICBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjQtcHkyLjQtd2luMzIuZWdnIikpCi0gICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuMi1weTIuNC5lZ2ciKSkKLQotICAgICAgICAjIE5hbWUgaXMgaW4gdGhlcmUgbm93Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhhZFsnRm9vUGtnJ10pCi0KLSAgICAgICAgIyBCdXQgb25seSAxIHBhY2thZ2UKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFkKSwgWydmb29wa2cnXSkKLQotCi0KLSAgICAgICAgIyBEaXN0cmlidXRpb25zIHNvcnQgYnkgdmVyc2lvbgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgW2Rpc3QudmVyc2lvbiBmb3IgZGlzdCBpbiBhZFsnRm9vUGtnJ11dLCBbJzEuNCcsJzEuMy0xJywnMS4yJ10KLSAgICAgICAgKQotICAgICAgICAjIFJlbW92aW5nIGEgZGlzdHJpYnV0aW9uIGxlYXZlcyBzZXF1ZW5jZSBhbG9uZQotICAgICAgICBhZC5yZW1vdmUoYWRbJ0Zvb1BrZyddWzFdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgW2Rpc3QudmVyc2lvbiBmb3IgZGlzdCBpbiBhZFsnRm9vUGtnJ11dLCBbJzEuNCcsJzEuMiddCi0gICAgICAgICkKLSAgICAgICAgIyBBbmQgaW5zZXJ0aW5nIGFkZHMgdGhlbSBpbiBvcmRlcgotICAgICAgICBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjkuZWdnIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICBbZGlzdC52ZXJzaW9uIGZvciBkaXN0IGluIGFkWydGb29Qa2cnXV0sIFsnMS45JywnMS40JywnMS4yJ10KLSAgICAgICAgKQotCi0gICAgICAgIHdzID0gV29ya2luZ1NldChbXSkKLSAgICAgICAgZm9vMTIgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuMi1weTIuNC5lZ2ciKQotICAgICAgICBmb28xNCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS40LXB5Mi40LXdpbjMyLmVnZyIpCi0gICAgICAgIHJlcSwgPSBwYXJzZV9yZXF1aXJlbWVudHMoIkZvb1BrZz49MS4zIikKLQotICAgICAgICAjIE5vbWluYWwgY2FzZTogbm8gZGlzdHJvcyBvbiBwYXRoLCBzaG91bGQgeWllbGQgYWxsIGFwcGxpY2FibGUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZC5iZXN0X21hdGNoKHJlcSx3cykudmVyc2lvbiwgJzEuOScpCi0gICAgICAgICMgSWYgYSBtYXRjaGluZyBkaXN0cm8gaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHNob3VsZCByZXR1cm4gb25seSB0aGF0Ci0gICAgICAgIHdzLmFkZChmb28xNCk7IHNlbGYuYXNzZXJ0RXF1YWwoYWQuYmVzdF9tYXRjaChyZXEsd3MpLnZlcnNpb24sICcxLjQnKQotCi0gICAgICAgICMgSWYgdGhlIGZpcnN0IG1hdGNoaW5nIGRpc3RybyBpcyB1bnN1aXRhYmxlLCBpdCdzIGEgdmVyc2lvbiBjb25mbGljdAotICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pOyB3cy5hZGQoZm9vMTIpOyB3cy5hZGQoZm9vMTQpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZlcnNpb25Db25mbGljdCwgYWQuYmVzdF9tYXRjaCwgcmVxLCB3cykKLQotICAgICAgICAjIElmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggb24gdGhlIHBhdGgsIHRoZSBmaXJzdCBvbmUgdGFrZXMgcHJlY2VkZW5jZQotICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pOyB3cy5hZGQoZm9vMTQpOyB3cy5hZGQoZm9vMTIpOyB3cy5hZGQoZm9vMTQpOwotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkLmJlc3RfbWF0Y2gocmVxLHdzKS52ZXJzaW9uLCAnMS40JykKLQotICAgIGRlZiBjaGVja0Zvb1BrZyhzZWxmLGQpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucHJvamVjdF9uYW1lLCAiRm9vUGtnIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleSwgImZvb3BrZyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52ZXJzaW9uLCAiMS4zLTEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucHlfdmVyc2lvbiwgIjIuNCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wbGF0Zm9ybSwgIndpbjMyIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBhcnNlZF92ZXJzaW9uLCBwYXJzZV92ZXJzaW9uKCIxLjMtMSIpKQotCi0gICAgZGVmIHRlc3REaXN0cm9CYXNpY3Moc2VsZik6Ci0gICAgICAgIGQgPSBEaXN0cmlidXRpb24oCi0gICAgICAgICAgICAiL3NvbWUvcGF0aCIsCi0gICAgICAgICAgICBwcm9qZWN0X25hbWU9IkZvb1BrZyIsdmVyc2lvbj0iMS4zLTEiLHB5X3ZlcnNpb249IjIuNCIscGxhdGZvcm09IndpbjMyIgotICAgICAgICApCi0gICAgICAgIHNlbGYuY2hlY2tGb29Qa2coZCkKLQotICAgICAgICBkID0gRGlzdHJpYnV0aW9uKCIvc29tZS9wYXRoIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnB5X3ZlcnNpb24sIHN5cy52ZXJzaW9uWzozXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBsYXRmb3JtLCBOb25lKQotCi0gICAgZGVmIHRlc3REaXN0cm9QYXJzZShzZWxmKToKLSAgICAgICAgZCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4zXzEtcHkyLjQtd2luMzIuZWdnIikKLSAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQotICAgICAgICBkID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjNfMS1weTIuNC13aW4zMi5lZ2ctaW5mbyIpCi0gICAgICAgIHNlbGYuY2hlY2tGb29Qa2coZCkKLQotICAgIGRlZiB0ZXN0RGlzdHJvTWV0YWRhdGEoc2VsZik6Ci0gICAgICAgIGQgPSBEaXN0cmlidXRpb24oCi0gICAgICAgICAgICAiL3NvbWUvcGF0aCIsIHByb2plY3RfbmFtZT0iRm9vUGtnIiwgcHlfdmVyc2lvbj0iMi40IiwgcGxhdGZvcm09IndpbjMyIiwKLSAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgKCdQS0ctSU5GTycsIk1ldGFkYXRhLVZlcnNpb246IDEuMFxuVmVyc2lvbjogMS4zLTFcbiIpCi0gICAgICAgICAgICApCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQotCi0KLSAgICBkZWYgZGlzdFJlcXVpcmVzKHNlbGYsIHR4dCk6Ci0gICAgICAgIHJldHVybiBEaXN0cmlidXRpb24oIi9mb28iLCBtZXRhZGF0YT1NZXRhZGF0YSgoJ2RlcGVuZHMudHh0JywgdHh0KSkpCi0KLSAgICBkZWYgY2hlY2tSZXF1aXJlcyhzZWxmLCBkaXN0LCB0eHQsIGV4dHJhcz0oKSk6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICBsaXN0KGRpc3QucmVxdWlyZXMoZXh0cmFzKSksCi0gICAgICAgICAgICBsaXN0KHBhcnNlX3JlcXVpcmVtZW50cyh0eHQpKQotICAgICAgICApCi0KLSAgICBkZWYgdGVzdERpc3Ryb0RlcGVuZHNTaW1wbGUoc2VsZik6Ci0gICAgICAgIGZvciB2IGluICJUd2lzdGVkPj0xLjUiLCAiVHdpc3RlZD49MS41XG5aQ29uZmlnPj0yLjAiOgotICAgICAgICAgICAgc2VsZi5jaGVja1JlcXVpcmVzKHNlbGYuZGlzdFJlcXVpcmVzKHYpLCB2KQotCi0KLSAgICBkZWYgdGVzdFJlc29sdmUoc2VsZik6Ci0gICAgICAgIGFkID0gRW52aXJvbm1lbnQoW10pOyB3cyA9IFdvcmtpbmdTZXQoW10pCi0gICAgICAgICMgUmVzb2x2aW5nIG5vIHJlcXVpcmVtZW50cyAtPiBub3RoaW5nIHRvIGluc3RhbGwKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCggbGlzdCh3cy5yZXNvbHZlKFtdLGFkKSksIFtdICkKLSAgICAgICAgIyBSZXF1ZXN0IHNvbWV0aGluZyBub3QgaW4gdGhlIGNvbGxlY3Rpb24gLT4gRGlzdHJpYnV0aW9uTm90Rm91bmQKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCi0gICAgICAgICAgICBEaXN0cmlidXRpb25Ob3RGb3VuZCwgd3MucmVzb2x2ZSwgcGFyc2VfcmVxdWlyZW1lbnRzKCJGb28iKSwgYWQKLSAgICAgICAgKQotICAgICAgICBGb28gPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKLSAgICAgICAgICAgICIvZm9vX2Rpci9Gb28tMS4yLmVnZyIsCi0gICAgICAgICAgICBtZXRhZGF0YT1NZXRhZGF0YSgoJ2RlcGVuZHMudHh0JywgIltiYXJdXG5CYXo+PTIuMCIpKQotICAgICAgICApCi0gICAgICAgIGFkLmFkZChGb28pOyBhZC5hZGQoRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvby0wLjkuZWdnIikpCi0KLSAgICAgICAgIyBSZXF1ZXN0IHRoaW5nKHMpIHRoYXQgYXJlIGF2YWlsYWJsZSAtPiBsaXN0IHRvIGFjdGl2YXRlCi0gICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgotICAgICAgICAgICAgdGFyZ2V0cyA9IGxpc3Qod3MucmVzb2x2ZShwYXJzZV9yZXF1aXJlbWVudHMoIkZvbyIpLCBhZCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHMsIFtGb29dKQotICAgICAgICAgICAgbWFwKHdzLmFkZCx0YXJnZXRzKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWZXJzaW9uQ29uZmxpY3QsIHdzLnJlc29sdmUsCi0gICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoIkZvbz09MC45IiksIGFkKQotICAgICAgICB3cyA9IFdvcmtpbmdTZXQoW10pICMgcmVzZXQKLQotICAgICAgICAjIFJlcXVlc3QgYW4gZXh0cmEgdGhhdCBjYXVzZXMgYW4gdW5yZXNvbHZlZCBkZXBlbmRlbmN5IGZvciAiQmF6IgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgICAgIERpc3RyaWJ1dGlvbk5vdEZvdW5kLCB3cy5yZXNvbHZlLHBhcnNlX3JlcXVpcmVtZW50cygiRm9vW2Jhcl0iKSwgYWQKLSAgICAgICAgKQotICAgICAgICBCYXogPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKLSAgICAgICAgICAgICIvZm9vX2Rpci9CYXotMi4xLmVnZyIsIG1ldGFkYXRhPU1ldGFkYXRhKCgnZGVwZW5kcy50eHQnLCAiRm9vIikpCi0gICAgICAgICkKLSAgICAgICAgYWQuYWRkKEJheikKLQotICAgICAgICAjIEFjdGl2YXRpb24gbGlzdCBub3cgaW5jbHVkZXMgcmVzb2x2ZWQgZGVwZW5kZW5jeQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgbGlzdCh3cy5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cygiRm9vW2Jhcl0iKSwgYWQpKSwgW0ZvbyxCYXpdCi0gICAgICAgICkKLSAgICAgICAgIyBSZXF1ZXN0cyBmb3IgY29uZmxpY3RpbmcgdmVyc2lvbnMgcHJvZHVjZSBWZXJzaW9uQ29uZmxpY3QKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoIFZlcnNpb25Db25mbGljdCwKLSAgICAgICAgICAgIHdzLnJlc29sdmUsIHBhcnNlX3JlcXVpcmVtZW50cygiRm9vPT0xLjJcbkZvbyE9MS4yIiksIGFkCi0gICAgICAgICkKLQotICAgIGRlZiB0ZXN0RGlzdHJvRGVwZW5kc09wdGlvbnMoc2VsZik6Ci0gICAgICAgIGQgPSBzZWxmLmRpc3RSZXF1aXJlcygiIiIKLSAgICAgICAgICAgIFR3aXN0ZWQ+PTEuNQotICAgICAgICAgICAgW2RvY2dlbl0KLSAgICAgICAgICAgIFpDb25maWc+PTIuMAotICAgICAgICAgICAgZG9jdXRpbHM+PTAuMwotICAgICAgICAgICAgW2Zhc3RjZ2ldCi0gICAgICAgICAgICBmY2dpYXBwPj0wLjEiIiIpCi0gICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcyhkLCJUd2lzdGVkPj0xLjUiKQotICAgICAgICBzZWxmLmNoZWNrUmVxdWlyZXMoCi0gICAgICAgICAgICBkLCJUd2lzdGVkPj0xLjUgWkNvbmZpZz49Mi4wIGRvY3V0aWxzPj0wLjMiLnNwbGl0KCksIFsiZG9jZ2VuIl0KLSAgICAgICAgKQotICAgICAgICBzZWxmLmNoZWNrUmVxdWlyZXMoCi0gICAgICAgICAgICBkLCJUd2lzdGVkPj0xLjUgZmNnaWFwcD49MC4xIi5zcGxpdCgpLCBbImZhc3RjZ2kiXQotICAgICAgICApCi0gICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKLSAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBaQ29uZmlnPj0yLjAgZG9jdXRpbHM+PTAuMyBmY2dpYXBwPj0wLjEiLnNwbGl0KCksCi0gICAgICAgICAgICBbImRvY2dlbiIsImZhc3RjZ2kiXQotICAgICAgICApCi0gICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKLSAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBmY2dpYXBwPj0wLjEgWkNvbmZpZz49Mi4wIGRvY3V0aWxzPj0wLjMiLnNwbGl0KCksCi0gICAgICAgICAgICBbImZhc3RjZ2kiLCAiZG9jZ2VuIl0KLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmtub3duRXh0cmEsIGQucmVxdWlyZXMsIFsiZm9vIl0pCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotY2xhc3MgRW50cnlQb2ludFRlc3RzKFRlc3RDYXNlKToKLQotICAgIGRlZiBhc3NlcnRmaWVsZHMoc2VsZiwgZXApOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubW9kdWxlX25hbWUsInNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXMiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmF0dHJzLCAoIkVudHJ5UG9pbnRUZXN0cyIsKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5leHRyYXMsICgieCIsKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGVwLmxvYWQoKSBpcyBFbnRyeVBvaW50VGVzdHMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICBzdHIoZXApLAotICAgICAgICAgICAgImZvbyA9IHNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXM6RW50cnlQb2ludFRlc3RzIFt4XSIKLSAgICAgICAgKQotCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLmRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKLSAgICAgICAgICAgICJGb29Qa2ctMS4yLXB5Mi40LmVnZyIsIG1ldGFkYXRhPU1ldGFkYXRhKCgncmVxdWlyZXMudHh0JywnW3hdJykpKQotCi0gICAgZGVmIHRlc3RCYXNpY3Moc2VsZik6Ci0gICAgICAgIGVwID0gRW50cnlQb2ludCgKLSAgICAgICAgICAgICJmb28iLCAic2V0dXB0b29scy50ZXN0cy50ZXN0X3Jlc291cmNlcyIsIFsiRW50cnlQb2ludFRlc3RzIl0sCi0gICAgICAgICAgICBbIngiXSwgc2VsZi5kaXN0Ci0gICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRmaWVsZHMoZXApCi0KLSAgICBkZWYgdGVzdFBhcnNlKHNlbGYpOgotICAgICAgICBzID0gImZvbyA9IHNldHVwdG9vbHMudGVzdHMudGVzdF9yZXNvdXJjZXM6RW50cnlQb2ludFRlc3RzIFt4XSIKLSAgICAgICAgZXAgPSBFbnRyeVBvaW50LnBhcnNlKHMsIHNlbGYuZGlzdCkKLSAgICAgICAgc2VsZi5hc3NlcnRmaWVsZHMoZXApCi0KLSAgICAgICAgZXAgPSBFbnRyeVBvaW50LnBhcnNlKCJiYXIgYmF6PSAgc3BhbW1pdHlbUElOR10iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImJhciBiYXoiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm1vZHVsZV9uYW1lLCJzcGFtbWl0eSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuYXR0cnMsICgpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmV4dHJhcywgKCJwaW5nIiwpKQotCi0gICAgICAgIGVwID0gRW50cnlQb2ludC5wYXJzZSgiIGZpenpseSA9ICB3b2NrYTpmb28iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm5hbWUsImZpenpseSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubW9kdWxlX25hbWUsIndvY2thIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5hdHRycywgKCJmb28iLCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuZXh0cmFzLCAoKSkKLQotICAgIGRlZiB0ZXN0UmVqZWN0cyhzZWxmKToKLSAgICAgICAgZm9yIGVwIGluIFsKLSAgICAgICAgICAgICJmb28iLCAieD0xPTIiLCAieD1hOmI6YyIsICJxPXgvbmEiLCAiZmV6PXBpc2g6dHVzaC16IiwgIng9ZlthXT4yIiwKLSAgICAgICAgXToKLSAgICAgICAgICAgIHRyeTogRW50cnlQb2ludC5wYXJzZShlcCkKLSAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCi0gICAgICAgICAgICBlbHNlOiByYWlzZSBBc3NlcnRpb25FcnJvcigiU2hvdWxkJ3ZlIGJlZW4gYmFkIiwgZXApCi0KLSAgICBkZWYgY2hlY2tTdWJNYXAoc2VsZiwgbSk6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG0pLAotICAgICAgICAgICAgInsiCi0gICAgICAgICAgICAiJ2ZlYXR1cmUyJzogRW50cnlQb2ludC5wYXJzZSgiCi0gICAgICAgICAgICAgICAgIidmZWF0dXJlMiA9IGFub3RoZXIubW9kdWxlOlNvbWVDbGFzcyBbZXh0cmExLGV4dHJhMl0nKSwgIgotICAgICAgICAgICAgIidmZWF0dXJlMSc6IEVudHJ5UG9pbnQucGFyc2UoIgotICAgICAgICAgICAgICAgICInZmVhdHVyZTEgPSBzb21lbW9kdWxlOnNvbWVmdW5jdGlvbicpIgotICAgICAgICAgICAgIn0iCi0gICAgICAgICkKLQotICAgIHN1Ym1hcF9zdHIgPSAiIiIKLSAgICAgICAgICAgICMgZGVmaW5lIGZlYXR1cmVzIGZvciBibGFoIGJsYWgKLSAgICAgICAgICAgIGZlYXR1cmUxID0gc29tZW1vZHVsZTpzb21lZnVuY3Rpb24KLSAgICAgICAgICAgIGZlYXR1cmUyID0gYW5vdGhlci5tb2R1bGU6U29tZUNsYXNzIFtleHRyYTEsZXh0cmEyXQotICAgICIiIgotCi0gICAgZGVmIHRlc3RQYXJzZUxpc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuY2hlY2tTdWJNYXAoRW50cnlQb2ludC5wYXJzZV9ncm91cCgieHl6Iiwgc2VsZi5zdWJtYXBfc3RyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRW50cnlQb2ludC5wYXJzZV9ncm91cCwgInggYSIsICJmb289YmFyIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRW50cnlQb2ludC5wYXJzZV9ncm91cCwgIngiLAotICAgICAgICAgICAgWyJmb289YmF6IiwgImZvbz1iYXIiXSkKLQotICAgIGRlZiB0ZXN0UGFyc2VNYXAoc2VsZik6Ci0gICAgICAgIG0gPSBFbnRyeVBvaW50LnBhcnNlX21hcCh7J3h5eic6c2VsZi5zdWJtYXBfc3RyfSkKLSAgICAgICAgc2VsZi5jaGVja1N1Yk1hcChtWyd4eXonXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmtleXMoKSxbJ3h5eiddKQotICAgICAgICBtID0gRW50cnlQb2ludC5wYXJzZV9tYXAoIlt4eXpdXG4iK3NlbGYuc3VibWFwX3N0cikKLSAgICAgICAgc2VsZi5jaGVja1N1Yk1hcChtWyd4eXonXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmtleXMoKSxbJ3h5eiddKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX21hcCwgWyJbeHl6XSIsICJbeHl6XSJdKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX21hcCwgc2VsZi5zdWJtYXBfc3RyKQotCi0KLWNsYXNzIFJlcXVpcmVtZW50c1Rlc3RzKFRlc3RDYXNlKToKLQotICAgIGRlZiB0ZXN0QmFzaWNzKHNlbGYpOgotICAgICAgICByID0gUmVxdWlyZW1lbnQucGFyc2UoIlR3aXN0ZWQ+PTEuMiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIpLCJUd2lzdGVkPj0xLjIiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIociksIlJlcXVpcmVtZW50LnBhcnNlKCdUd2lzdGVkPj0xLjInKSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc+PScsJzEuMicpXSwgKCkpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIFJlcXVpcmVtZW50KCJ0d2lzVGVkIiwgWygnPj0nLCcxLjInKV0sICgpKSkKLSAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyLCBSZXF1aXJlbWVudCgiVHdpc3RlZCIsIFsoJz49JywnMi4wJyldLCAoKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwociwgUmVxdWlyZW1lbnQoIlpvcGUiLCBbKCc+PScsJzEuMicpXSwgKCkpKQotICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHIsIFJlcXVpcmVtZW50KCJab3BlIiwgWygnPj0nLCczLjAnKV0sICgpKSkKLSAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyLCBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtleHRyYXNdPj0xLjIiKSkKLQotICAgIGRlZiB0ZXN0T3JkZXJpbmcoc2VsZik6Ci0gICAgICAgIHIxID0gUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc9PScsJzEuMmMxJyksKCc+PScsJzEuMicpXSwgKCkpCi0gICAgICAgIHIyID0gUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc+PScsJzEuMicpLCgnPT0nLCcxLjJjMScpXSwgKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEscjIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIxKSxzdHIocjIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihyMiksIlR3aXN0ZWQ9PTEuMmMxLD49MS4yIikKLQotICAgIGRlZiB0ZXN0QmFzaWNDb250YWlucyhzZWxmKToKLSAgICAgICAgciA9IFJlcXVpcmVtZW50KCJUd2lzdGVkIiwgWygnPj0nLCcxLjInKV0sICgpKQotICAgICAgICBmb29fZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4zXzEuZWdnIikKLSAgICAgICAgdHdpc3QxMSAgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiVHdpc3RlZC0xLjEuZWdnIikKLSAgICAgICAgdHdpc3QxMiAgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiVHdpc3RlZC0xLjIuZWdnIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHBhcnNlX3ZlcnNpb24oJzEuMicpIGluIHIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhwYXJzZV92ZXJzaW9uKCcxLjEnKSBub3QgaW4gcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCcxLjInIGluIHIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnMS4xJyBub3QgaW4gcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvb19kaXN0IG5vdCBpbiByKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHdpc3QxMSBub3QgaW4gcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR3aXN0MTIgaW4gcikKLQotICAgIGRlZiB0ZXN0QWR2YW5jZWRDb250YWlucyhzZWxmKToKLSAgICAgICAgciwgPSBwYXJzZV9yZXF1aXJlbWVudHMoIkZvbz49MS4yLDw9MS4zLD09MS45LD4yLjAsIT0yLjUsPDMuMCw9PTQuNSIpCi0gICAgICAgIGZvciB2IGluICgnMS4yJywnMS4yLjInLCcxLjMnLCcxLjknLCcyLjAuMScsJzIuMycsJzIuNicsJzMuMGMxJywnNC41Jyk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModiBpbiByLCAodixyKSkKLSAgICAgICAgZm9yIHYgaW4gKCcxLjJjMScsJzEuMy4xJywnMS41JywnMS45LjEnLCcyLjAnLCcyLjUnLCczLjAnLCc0LjAnKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2IG5vdCBpbiByLCAodixyKSkKLQotCi0gICAgZGVmIHRlc3RPcHRpb25zQW5kSGFzaGluZyhzZWxmKToKLSAgICAgICAgcjEgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtmb28sYmFyXT49MS4yIikKLSAgICAgICAgcjIgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtiYXIsRk9PXT49MS4yIikKLSAgICAgICAgcjMgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZFtCQVIsRk9PXT49MS4yLjAiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLHIyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLHIzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLmV4dHJhcywgKCJmb28iLCJiYXIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMi5leHRyYXMsICgiYmFyIiwiZm9vIikpICAjIGV4dHJhcyBhcmUgbm9ybWFsaXplZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocjEpLCBoYXNoKHIyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGhhc2gocjEpLCBoYXNoKCgidHdpc3RlZCIsICgoIj49IixwYXJzZV92ZXJzaW9uKCIxLjIiKSksKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQoWyJmb28iLCJiYXIiXSkpKQotICAgICAgICApCi0KLSAgICBkZWYgdGVzdFZlcnNpb25FcXVhbGl0eShzZWxmKToKLSAgICAgICAgcjEgPSBSZXF1aXJlbWVudC5wYXJzZSgic2V0dXB0b29scz09MC4zYTIiKQotICAgICAgICByMiA9IFJlcXVpcmVtZW50LnBhcnNlKCJzZXR1cHRvb2xzIT0wLjNhNCIpCi0gICAgICAgIGQgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZQotCi0gICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTQuZWdnIikgaW4gcjEpCi0gICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTEuZWdnIikgaW4gcjEpCi0gICAgICAgIHNlbGYuZmFpbElmKGQoInNldHVwdG9vbHMtMC4zYTQuZWdnIikgaW4gcjIpCi0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQoInNldHVwdG9vbHMtMC4zYTIuZWdnIikgaW4gcjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkKCJzZXR1cHRvb2xzLTAuM2EyLmVnZyIpIGluIHIyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZCgic2V0dXB0b29scy0wLjNhMy5lZ2ciKSBpbiByMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQoInNldHVwdG9vbHMtMC4zYTUuZWdnIikgaW4gcjIpCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotY2xhc3MgUGFyc2VUZXN0cyhUZXN0Q2FzZSk6Ci0KLSAgICBkZWYgdGVzdEVtcHR5UGFyc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwYXJzZV9yZXF1aXJlbWVudHMoJycpKSwgW10pCi0KLSAgICBkZWYgdGVzdFlpZWxkaW5nKHNlbGYpOgotICAgICAgICBmb3IgaW5wLG91dCBpbiBbCi0gICAgICAgICAgICAoW10sIFtdKSwgKCd4JyxbJ3gnXSksIChbW11dLFtdKSwgKCcgeFxuIHknLCBbJ3gnLCd5J10pLAotICAgICAgICAgICAgKFsneFxuXG4nLCd5J10sIFsneCcsJ3knXSksCi0gICAgICAgIF06Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGtnX3Jlc291cmNlcy55aWVsZF9saW5lcyhpbnApKSxvdXQpCi0KLSAgICBkZWYgdGVzdFNwbGl0dGluZyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGxpc3QoCi0gICAgICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucygiIiIKLSAgICAgICAgICAgICAgICAgICAgeAotICAgICAgICAgICAgICAgICAgICBbWV0KLSAgICAgICAgICAgICAgICAgICAgegotCi0gICAgICAgICAgICAgICAgICAgIGEKLSAgICAgICAgICAgICAgICAgICAgW2IgXQotICAgICAgICAgICAgICAgICAgICAjIGZvbwotICAgICAgICAgICAgICAgICAgICBjCi0gICAgICAgICAgICAgICAgICAgIFsgZF0KLSAgICAgICAgICAgICAgICAgICAgW3FdCi0gICAgICAgICAgICAgICAgICAgIHYKLSAgICAgICAgICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIFsoTm9uZSxbIngiXSksICgiWSIsWyJ6IiwiYSJdKSwgKCJiIixbImMiXSksICgiZCIsW10pLCAoInEiLFsidiJdKV0KLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLGxpc3QscGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucygiW2ZvbyIpKQotCi0gICAgZGVmIHRlc3RTYWZlTmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX25hbWUoImFkbnMtcHl0aG9uIiksICJhZG5zLXB5dGhvbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJXU0dJIFV0aWxzIiksICAiV1NHSS1VdGlscyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJXU0dJICBVdGlscyIpLCAiV1NHSS1VdGlscyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV9uYW1lKCJNb25leSQkJE1ha2VyIiksICJNb25leS1NYWtlciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2FmZV9uYW1lKCJwZWFrLndlYiIpLCAicGVhay13ZWIiKQotCi0gICAgZGVmIHRlc3RTYWZlVmVyc2lvbihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oIjEuMi0xIiksICIxLjItMSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV92ZXJzaW9uKCIxLjIgYWxwaGEiKSwgICIxLjIuYWxwaGEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhZmVfdmVyc2lvbigiMi4zLjQgMjAwNTA1MjEiKSwgIjIuMy40LjIwMDUwNTIxIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oIk1vbmV5JCQkTWFrZXIiKSwgIk1vbmV5LU1ha2VyIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oInBlYWsud2ViIiksICJwZWFrLndlYiIpCi0KLSAgICBkZWYgdGVzdFNpbXBsZVJlcXVpcmVtZW50cyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGxpc3QocGFyc2VfcmVxdWlyZW1lbnRzKCdUd2lzLVRlZD49MS4yLTEnKSksCi0gICAgICAgICAgICBbUmVxdWlyZW1lbnQoJ1R3aXMtVGVkJyxbKCc+PScsJzEuMi0xJyldLCAoKSldCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgIGxpc3QocGFyc2VfcmVxdWlyZW1lbnRzKCdUd2lzdGVkID49MS4yLCBcICMgbW9yZVxuPDIuMCcpKSwKLSAgICAgICAgICAgIFtSZXF1aXJlbWVudCgnVHdpc3RlZCcsWygnPj0nLCcxLjInKSwoJzwnLCcyLjAnKV0sICgpKV0KLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgUmVxdWlyZW1lbnQucGFyc2UoIkZvb0Jhcj09MS45OWEzIiksCi0gICAgICAgICAgICBSZXF1aXJlbWVudCgiRm9vQmFyIiwgWygnPT0nLCcxLjk5YTMnKV0sICgpKQotICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsUmVxdWlyZW1lbnQucGFyc2UsIj49Mi4zIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwieFxcIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwieD09MiBxIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwiWD09MVxuWT09MiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsUmVxdWlyZW1lbnQucGFyc2UsIiMiKQotCi0gICAgZGVmIHRlc3RWZXJzaW9uRXF1YWxpdHkoc2VsZik6Ci0gICAgICAgIGRlZiBjKHMxLHMyKToKLSAgICAgICAgICAgIHAxLCBwMiA9IHBhcnNlX3ZlcnNpb24oczEpLHBhcnNlX3ZlcnNpb24oczIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLHAyLCAoczEsczIscDEscDIpKQotCi0gICAgICAgIGMoJzEuMi1yYzEnLCAnMS4ycmMxJykKLSAgICAgICAgYygnMC40JywgJzAuNC4wJykKLSAgICAgICAgYygnMC40LjAuMCcsICcwLjQuMCcpCi0gICAgICAgIGMoJzAuNC4wLTAnLCAnMC40LTAnKQotICAgICAgICBjKCcwcGwxJywgJzAuMHBsMScpCi0gICAgICAgIGMoJzBwcmUxJywgJzAuMGMxJykKLSAgICAgICAgYygnMC4wLjBwcmV2aWV3MScsICcwYzEnKQotICAgICAgICBjKCcwLjBjMScsICcwLXJjMScpCi0gICAgICAgIGMoJzEuMmExJywgJzEuMi5hLjEnKTsgYygnMS4yLi4uYScsICcxLjJhJykKLQotICAgIGRlZiB0ZXN0VmVyc2lvbk9yZGVyaW5nKHNlbGYpOgotICAgICAgICBkZWYgYyhzMSxzMik6Ci0gICAgICAgICAgICBwMSwgcDIgPSBwYXJzZV92ZXJzaW9uKHMxKSxwYXJzZV92ZXJzaW9uKHMyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHAxPHAyLCAoczEsczIscDEscDIpKQotCi0gICAgICAgIGMoJzIuMScsJzIuMS4xJykKLSAgICAgICAgYygnMmExJywnMmIwJykKLSAgICAgICAgYygnMmExJywnMi4xJykKLSAgICAgICAgYygnMi4zYTEnLCAnMi4zJykKLSAgICAgICAgYygnMi4xLTEnLCAnMi4xLTInKQotICAgICAgICBjKCcyLjEtMScsICcyLjEuMScpCi0gICAgICAgIGMoJzIuMScsICcyLjFwbDQnKQotICAgICAgICBjKCcyLjFhMC0yMDA0MDUwMScsICcyLjEnKQotICAgICAgICBjKCcxLjEnLCAnMDIuMScpCi0gICAgICAgIGMoJ0E1NicsJ0IyNycpCi0gICAgICAgIGMoJzMuMicsICczLjIucGwwJykKLSAgICAgICAgYygnMy4yLTEnLCAnMy4ycGwxJykKLSAgICAgICAgYygnMy4ycGwxJywgJzMuMnBsMS0xJykKLSAgICAgICAgYygnMC40JywgJzQuMCcpCi0gICAgICAgIGMoJzAuMC40JywgJzAuNC4wJykKLSAgICAgICAgYygnMHBsMScsICcwLjRwbDEnKQotICAgICAgICBjKCcyLjEuMC1yYzEnLCcyLjEuMCcpCi0KLSAgICAgICAgdG9ydHVyZSA9IiIiCi0gICAgICAgIDAuODAuMS0zIDAuODAuMS0yIDAuODAuMS0xIDAuNzkuOTk5OSswLjgwLjBwcmU0LTEKLSAgICAgICAgMC43OS45OTk5KzAuODAuMHByZTItMyAwLjc5Ljk5OTkrMC44MC4wcHJlMi0yCi0gICAgICAgIDAuNzcuMi0xIDAuNzcuMS0xIDAuNzcuMC0xCi0gICAgICAgICIiIi5zcGxpdCgpCi0KLSAgICAgICAgZm9yIHAsdjEgaW4gZW51bWVyYXRlKHRvcnR1cmUpOgotICAgICAgICAgICAgZm9yIHYyIGluIHRvcnR1cmVbcCsxOl06Ci0gICAgICAgICAgICAgICAgYyh2Mix2MSkKZGlmZiAtLWdpdCBhL0xpYi9zaHV0aWwucHkgYi9MaWIvc2h1dGlsLnB5CmluZGV4IDJmY2E2MWMuLmM1MDE4NGMgMTAwNjQ0Ci0tLSBhL0xpYi9zaHV0aWwucHkKKysrIGIvTGliL3NodXRpbC5weQpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgY29weTIoc3JjbmFtZSwgZHN0bmFtZSkKICAgICAgICAgICAgICMgWFhYIFdoYXQgYWJvdXQgZGV2aWNlcywgc29ja2V0cyBldGMuPwogICAgICAgICBleGNlcHQgKElPRXJyb3IsIG9zLmVycm9yKSwgd2h5OgotICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgoc3JjbmFtZSwgZHN0bmFtZSwgd2h5KSkKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoKHNyY25hbWUsIGRzdG5hbWUsIHN0cih3aHkpKSkKICAgICAgICAgIyBjYXRjaCB0aGUgRXJyb3IgZnJvbSB0aGUgcmVjdXJzaXZlIGNvcHl0cmVlIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgICMgY29udGludWUgd2l0aCBvdGhlciBmaWxlcwogICAgICAgICBleGNlcHQgRXJyb3IsIGVycjoKZGlmZiAtLWdpdCBhL0xpYi9zb2NrZXQucHkgYi9MaWIvc29ja2V0LnB5CmluZGV4IDMyYTkyYjQuLmNjNWU2NWUgMTAwNjQ0Ci0tLSBhL0xpYi9zb2NrZXQucHkKKysrIGIvTGliL3NvY2tldC5weQpAQCAtMTQwLDcgKzE0MCw5IEBACiAKICAgICBfX2RvY19fID0gX3JlYWxzb2NrZXQuX19kb2NfXwogCi0gICAgX19zbG90c19fID0gWyJfc29jayIsICJzZW5kIiwgInJlY3YiLCAic2VuZHRvIiwgInJlY3Zmcm9tIiwKKyAgICBfX3Nsb3RzX18gPSBbIl9zb2NrIiwKKyAgICAgICAgICAgICAgICAgInJlY3YiLCAicmVjdl9idWYiLCAicmVjdmZyb21fYnVmIiwKKyAgICAgICAgICAgICAgICAgInNlbmQiLCAic2VuZHRvIiwgInJlY3Zmcm9tIiwKICAgICAgICAgICAgICAgICAgIl9fd2Vha3JlZl9fIl0KIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmYW1pbHk9QUZfSU5FVCwgdHlwZT1TT0NLX1NUUkVBTSwgcHJvdG89MCwgX3NvY2s9Tm9uZSk6CkBAIC0xNDksOCArMTUxLDEwIEBACiAgICAgICAgIHNlbGYuX3NvY2sgPSBfc29jawogICAgICAgICBzZWxmLnNlbmQgPSBzZWxmLl9zb2NrLnNlbmQKICAgICAgICAgc2VsZi5yZWN2ID0gc2VsZi5fc29jay5yZWN2CisgICAgICAgIHNlbGYucmVjdl9idWYgPSBzZWxmLl9zb2NrLnJlY3ZfYnVmCiAgICAgICAgIHNlbGYuc2VuZHRvID0gc2VsZi5fc29jay5zZW5kdG8KICAgICAgICAgc2VsZi5yZWN2ZnJvbSA9IHNlbGYuX3NvY2sucmVjdmZyb20KKyAgICAgICAgc2VsZi5yZWN2ZnJvbV9idWYgPSBzZWxmLl9zb2NrLnJlY3Zmcm9tX2J1ZgogCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICBzZWxmLl9zb2NrID0gX2Nsb3NlZHNvY2tldCgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy9kYmFwaTIucHkgYi9MaWIvc3FsaXRlMy9kYmFwaTIucHkKaW5kZXggZTBjOGE4NC4uNjY1ZGJiMiAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvZGJhcGkyLnB5CisrKyBiL0xpYi9zcWxpdGUzL2RiYXBpMi5weQpAQCAtMjIsNiArMjIsOSBAQAogIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCiBpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCB0aW1lCisKK2Zyb20gX3NxbGl0ZTMgaW1wb3J0ICoKIAogcGFyYW1zdHlsZSA9ICJxbWFyayIKIApAQCAtMjksMTAgKzMyLDYgQEAKIAogYXBpbGV2ZWwgPSAiMi4wIgogCi1mcm9tIF9zcWxpdGUzIGltcG9ydCAqCi0KLWltcG9ydCBkYXRldGltZSwgdGltZQotCiBEYXRlID0gZGF0ZXRpbWUuZGF0ZQogCiBUaW1lID0gZGF0ZXRpbWUudGltZQpAQCAtNDAsNDUgKzM5LDUwIEBACiBUaW1lc3RhbXAgPSBkYXRldGltZS5kYXRldGltZQogCiBkZWYgRGF0ZUZyb21UaWNrcyh0aWNrcyk6Ci0gICAgcmV0dXJuIGFwcGx5KERhdGUsdGltZS5sb2NhbHRpbWUodGlja3MpWzozXSkKKyAgICByZXR1cm4gYXBwbHkoRGF0ZSwgdGltZS5sb2NhbHRpbWUodGlja3MpWzozXSkKIAogZGVmIFRpbWVGcm9tVGlja3ModGlja3MpOgotICAgIHJldHVybiBhcHBseShUaW1lLHRpbWUubG9jYWx0aW1lKHRpY2tzKVszOjZdKQorICAgIHJldHVybiBhcHBseShUaW1lLCB0aW1lLmxvY2FsdGltZSh0aWNrcylbMzo2XSkKIAogZGVmIFRpbWVzdGFtcEZyb21UaWNrcyh0aWNrcyk6Ci0gICAgcmV0dXJuIGFwcGx5KFRpbWVzdGFtcCx0aW1lLmxvY2FsdGltZSh0aWNrcylbOjZdKQorICAgIHJldHVybiBhcHBseShUaW1lc3RhbXAsIHRpbWUubG9jYWx0aW1lKHRpY2tzKVs6Nl0pCiAKLV9tYWpvciwgX21pbm9yLCBfbWljcm8gPSB2ZXJzaW9uLnNwbGl0KCIuIikKLXZlcnNpb25faW5mbyA9IChpbnQoX21ham9yKSwgaW50KF9taW5vciksIF9taWNybykKLV9tYWpvciwgX21pbm9yLCBfbWljcm8gPSBzcWxpdGVfdmVyc2lvbi5zcGxpdCgiLiIpCi1zcWxpdGVfdmVyc2lvbl9pbmZvID0gKGludChfbWFqb3IpLCBpbnQoX21pbm9yKSwgX21pY3JvKQordmVyc2lvbl9pbmZvID0gdHVwbGUoW2ludCh4KSBmb3IgeCBpbiB2ZXJzaW9uLnNwbGl0KCIuIildKQorc3FsaXRlX3ZlcnNpb25faW5mbyA9IHR1cGxlKFtpbnQoeCkgZm9yIHggaW4gc3FsaXRlX3ZlcnNpb24uc3BsaXQoIi4iKV0pCiAKIEJpbmFyeSA9IGJ1ZmZlcgogCi1kZWYgYWRhcHRfZGF0ZSh2YWwpOgotICAgIHJldHVybiB2YWwuaXNvZm9ybWF0KCkKK2RlZiByZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpOgorICAgIGRlZiBhZGFwdF9kYXRlKHZhbCk6CisgICAgICAgIHJldHVybiB2YWwuaXNvZm9ybWF0KCkKIAotZGVmIGFkYXB0X2RhdGV0aW1lKHZhbCk6Ci0gICAgcmV0dXJuIHZhbC5pc29mb3JtYXQoIiAiKQorICAgIGRlZiBhZGFwdF9kYXRldGltZSh2YWwpOgorICAgICAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgiICIpCiAKLWRlZiBjb252ZXJ0X2RhdGUodmFsKToKLSAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSgqbWFwKGludCwgdmFsLnNwbGl0KCItIikpKQorICAgIGRlZiBjb252ZXJ0X2RhdGUodmFsKToKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGUoKm1hcChpbnQsIHZhbC5zcGxpdCgiLSIpKSkKIAotZGVmIGNvbnZlcnRfdGltZXN0YW1wKHZhbCk6Ci0gICAgZGF0ZXBhcnQsIHRpbWVwYXJ0ID0gdmFsLnNwbGl0KCIgIikKLSAgICB5ZWFyLCBtb250aCwgZGF5ID0gbWFwKGludCwgZGF0ZXBhcnQuc3BsaXQoIi0iKSkKLSAgICB0aW1lcGFydF9mdWxsID0gdGltZXBhcnQuc3BsaXQoIi4iKQotICAgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzID0gbWFwKGludCwgdGltZXBhcnRfZnVsbFswXS5zcGxpdCgiOiIpKQotICAgIGlmIGxlbih0aW1lcGFydF9mdWxsKSA9PSAyOgotICAgICAgICBtaWNyb3NlY29uZHMgPSBpbnQoZmxvYXQoIjAuIiArIHRpbWVwYXJ0X2Z1bGxbMV0pICogMTAwMDAwMCkKLSAgICBlbHNlOgotICAgICAgICBtaWNyb3NlY29uZHMgPSAwCisgICAgZGVmIGNvbnZlcnRfdGltZXN0YW1wKHZhbCk6CisgICAgICAgIGRhdGVwYXJ0LCB0aW1lcGFydCA9IHZhbC5zcGxpdCgiICIpCisgICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSBtYXAoaW50LCBkYXRlcGFydC5zcGxpdCgiLSIpKQorICAgICAgICB0aW1lcGFydF9mdWxsID0gdGltZXBhcnQuc3BsaXQoIi4iKQorICAgICAgICBob3VycywgbWludXRlcywgc2Vjb25kcyA9IG1hcChpbnQsIHRpbWVwYXJ0X2Z1bGxbMF0uc3BsaXQoIjoiKSkKKyAgICAgICAgaWYgbGVuKHRpbWVwYXJ0X2Z1bGwpID09IDI6CisgICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBpbnQoZmxvYXQoIjAuIiArIHRpbWVwYXJ0X2Z1bGxbMV0pICogMTAwMDAwMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IDAKIAotICAgIHZhbCA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWNyb3NlY29uZHMpCi0gICAgcmV0dXJuIHZhbAorICAgICAgICB2YWwgPSBkYXRldGltZS5kYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWljcm9zZWNvbmRzKQorICAgICAgICByZXR1cm4gdmFsCiAKIAotcmVnaXN0ZXJfYWRhcHRlcihkYXRldGltZS5kYXRlLCBhZGFwdF9kYXRlKQotcmVnaXN0ZXJfYWRhcHRlcihkYXRldGltZS5kYXRldGltZSwgYWRhcHRfZGF0ZXRpbWUpCi1yZWdpc3Rlcl9jb252ZXJ0ZXIoImRhdGUiLCBjb252ZXJ0X2RhdGUpCi1yZWdpc3Rlcl9jb252ZXJ0ZXIoInRpbWVzdGFtcCIsIGNvbnZlcnRfdGltZXN0YW1wKQorICAgIHJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZSwgYWRhcHRfZGF0ZSkKKyAgICByZWdpc3Rlcl9hZGFwdGVyKGRhdGV0aW1lLmRhdGV0aW1lLCBhZGFwdF9kYXRldGltZSkKKyAgICByZWdpc3Rlcl9jb252ZXJ0ZXIoImRhdGUiLCBjb252ZXJ0X2RhdGUpCisgICAgcmVnaXN0ZXJfY29udmVydGVyKCJ0aW1lc3RhbXAiLCBjb252ZXJ0X3RpbWVzdGFtcCkKKworcmVnaXN0ZXJfYWRhcHRlcnNfYW5kX2NvbnZlcnRlcnMoKQorCisjIENsZWFuIHVwIG5hbWVzcGFjZQorCitkZWwocmVnaXN0ZXJfYWRhcHRlcnNfYW5kX2NvbnZlcnRlcnMpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQppbmRleCAyMWY3Yjg4Li5iMTBiM2VmIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKQEAgLTIyLDcgKzIyLDcgQEAKICMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KIAogaW1wb3J0IG9zLCB1bml0dGVzdAotaW1wb3J0IHB5c3FsaXRlMi5kYmFwaTIgYXMgc3FsaXRlCitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKIAogY2xhc3MgQ29sbGF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlOiBteWNvbGwiKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLmxvd2VyKCksICJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsIikKIAogICAgIGRlZiBDaGVja0NvbGxhdGlvblJlZ2lzdGVyVHdpY2Uoc2VsZik6CiAgICAgICAgICIiIgpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CmluZGV4IDY0OGFkYTUuLjI1ZTRiNjMgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKQEAgLTIyLDcgKzIyLDcgQEAKICMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KIAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgcHlzcWxpdGUyLmRiYXBpMiBhcyBzcWxpdGUKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQogCiBjbGFzcyBSZWdyZXNzaW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTM2LDYgKzM2LDMxIEBACiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJwcmFnbWEgdXNlcl92ZXJzaW9uIikKIAorICAgIGRlZiBDaGVja1ByYWdtYVNjaGVtYVZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGhpcyBzdGlsbCBjcmFzaGVkIHB5c3FsaXRlIDw9IDIuMi4xCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHNjaGVtYV92ZXJzaW9uIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGN1ci5jbG9zZSgpCisgICAgICAgICAgICBjb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3RhdGVtZW50UmVzZXQoc2VsZik6CisgICAgICAgICMgcHlzcWxpdGUgMi4xLjAgdG8gMi4yLjAgaGF2ZSB0aGUgcHJvYmxlbSB0aGF0IG5vdCBhbGwgc3RhdGVtZW50cyBhcmUKKyAgICAgICAgIyByZXNldCBiZWZvcmUgYSByb2xsYmFjaywgYnV0IG9ubHkgdGhvc2UgdGhhdCBhcmUgc3RpbGwgaW4gdGhlCisgICAgICAgICMgc3RhdGVtZW50IGNhY2hlLiBUaGUgb3RoZXJzIGFyZSBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgY2FjaGVkX3N0YXRlbWVudHM9NSkKKyAgICAgICAgY3Vyc29ycyA9IFtjb24uY3Vyc29yKCkgZm9yIHggaW4geHJhbmdlKDUpXQorICAgICAgICBjdXJzb3JzWzBdLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpIikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgY3Vyc29yc1swXS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgWyh4LCkgZm9yIHggaW4geHJhbmdlKDEwKV0pCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBjdXJzb3JzW2ldLmV4ZWN1dGUoIiAiICogaSArICJzZWxlY3QgeCBmcm9tIHRlc3QiKQorCisgICAgICAgIGNvbi5yb2xsYmFjaygpCisKIGRlZiBzdWl0ZSgpOgogICAgIHJlZ3Jlc3Npb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUmVncmVzc2lvblRlc3RzLCAiQ2hlY2siKQogICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHJlZ3Jlc3Npb25fc3VpdGUsKSkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQppbmRleCBmZjdkYjljLi43ODY1NmU3IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CkBAIC0xMzQsNiArMTM0LDEzIEBACiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKKyAgICBkZWYgQ2hlY2tGdW5jRXJyb3JPbkNyZWF0ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJibGEiLCAtMTAwLCBsYW1iZGEgeDogMip4KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKwogICAgIGRlZiBDaGVja0Z1bmNSZWZDb3VudChzZWxmKToKICAgICAgICAgZGVmIGdldGZ1bmMoKToKICAgICAgICAgICAgIGRlZiBmKCk6CkBAIC0yNTEsNiArMjU4LDEzIEBACiAgICAgICAgICNzZWxmLmNvbi5jbG9zZSgpCiAgICAgICAgIHBhc3MKIAorICAgIGRlZiBDaGVja0FnZ3JFcnJvck9uQ3JlYXRlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIEFnZ3JTdW0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcGFzcworCiAgICAgZGVmIENoZWNrQWdnck5vU3RlcChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub3N0ZXAodCkgZnJvbSB0ZXN0IikKZGlmZiAtLWdpdCBhL0xpYi9zdHJ1Y3QucHkgYi9MaWIvc3RydWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZWUyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3RydWN0LnB5CkBAIC0wLDAgKzEsOTkgQEAKKyIiIgorRnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiBQeXRob24gdmFsdWVzIGFuZCBDIHN0cnVjdHMuCitQeXRob24gc3RyaW5ncyBhcmUgdXNlZCB0byBob2xkIHRoZSBkYXRhIHJlcHJlc2VudGluZyB0aGUgQyBzdHJ1Y3QKK2FuZCBhbHNvIGFzIGZvcm1hdCBzdHJpbmdzIHRvIGRlc2NyaWJlIHRoZSBsYXlvdXQgb2YgZGF0YSBpbiB0aGUgQyBzdHJ1Y3QuCisKK1RoZSBvcHRpb25hbCBmaXJzdCBmb3JtYXQgY2hhciBpbmRpY2F0ZXMgYnl0ZSBvcmRlciwgc2l6ZSBhbmQgYWxpZ25tZW50OgorIEA6IG5hdGl2ZSBvcmRlciwgc2l6ZSAmIGFsaWdubWVudCAoZGVmYXVsdCkKKyA9OiBuYXRpdmUgb3JkZXIsIHN0ZC4gc2l6ZSAmIGFsaWdubWVudAorIDw6IGxpdHRsZS1lbmRpYW4sIHN0ZC4gc2l6ZSAmIGFsaWdubWVudAorID46IGJpZy1lbmRpYW4sIHN0ZC4gc2l6ZSAmIGFsaWdubWVudAorICE6IHNhbWUgYXMgPgorCitUaGUgcmVtYWluaW5nIGNoYXJzIGluZGljYXRlIHR5cGVzIG9mIGFyZ3MgYW5kIG11c3QgbWF0Y2ggZXhhY3RseTsKK3RoZXNlIGNhbiBiZSBwcmVjZWRlZCBieSBhIGRlY2ltYWwgcmVwZWF0IGNvdW50OgorIHg6IHBhZCBieXRlIChubyBkYXRhKTsgYzpjaGFyOyBiOnNpZ25lZCBieXRlOyBCOnVuc2lnbmVkIGJ5dGU7CisgaDpzaG9ydDsgSDp1bnNpZ25lZCBzaG9ydDsgaTppbnQ7IEk6dW5zaWduZWQgaW50OworIGw6bG9uZzsgTDp1bnNpZ25lZCBsb25nOyBmOmZsb2F0OyBkOmRvdWJsZS4KK1NwZWNpYWwgY2FzZXMgKHByZWNlZGluZyBkZWNpbWFsIGNvdW50IGluZGljYXRlcyBsZW5ndGgpOgorIHM6c3RyaW5nIChhcnJheSBvZiBjaGFyKTsgcDogcGFzY2FsIHN0cmluZyAod2l0aCBjb3VudCBieXRlKS4KK1NwZWNpYWwgY2FzZSAob25seSBhdmFpbGFibGUgaW4gbmF0aXZlIGZvcm1hdCk6CisgUDphbiBpbnRlZ2VyIHR5cGUgdGhhdCBpcyB3aWRlIGVub3VnaCB0byBob2xkIGEgcG9pbnRlci4KK1NwZWNpYWwgY2FzZSAobm90IGluIG5hdGl2ZSBtb2RlIHVubGVzcyAnbG9uZyBsb25nJyBpbiBwbGF0Zm9ybSBDKToKKyBxOmxvbmcgbG9uZzsgUTp1bnNpZ25lZCBsb25nIGxvbmcKK1doaXRlc3BhY2UgYmV0d2VlbiBmb3JtYXRzIGlzIGlnbm9yZWQuCisKK1RoZSB2YXJpYWJsZSBzdHJ1Y3QuZXJyb3IgaXMgYW4gZXhjZXB0aW9uIHJhaXNlZCBvbiBlcnJvcnMuCisiIiIKK19fdmVyc2lvbl9fID0gJzAuMScKKworZnJvbSBfc3RydWN0IGltcG9ydCBTdHJ1Y3QsIGVycm9yCisKK19NQVhDQUNIRSA9IDEwMAorX2NhY2hlID0ge30KKworZGVmIF9jb21waWxlKGZtdCk6CisgICAgIyBJbnRlcm5hbDogY29tcGlsZSBzdHJ1Y3QgcGF0dGVybgorICAgIGlmIGxlbihfY2FjaGUpID49IF9NQVhDQUNIRToKKyAgICAgICAgX2NhY2hlLmNsZWFyKCkKKyAgICBzID0gU3RydWN0KGZtdCkKKyAgICBfY2FjaGVbZm10XSA9IHMKKyAgICByZXR1cm4gcworCitkZWYgY2FsY3NpemUoZm10KToKKyAgICAiIiIKKyAgICBSZXR1cm4gc2l6ZSBvZiBDIHN0cnVjdCBkZXNjcmliZWQgYnkgZm9ybWF0IHN0cmluZyBmbXQuCisgICAgU2VlIHN0cnVjdC5fX2RvY19fIGZvciBtb3JlIG9uIGZvcm1hdCBzdHJpbmdzLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgbyA9IF9jYWNoZVtmbXRdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBvID0gX2NvbXBpbGUoZm10KQorICAgIHJldHVybiBvLnNpemUKKworZGVmIHBhY2soZm10LCAqYXJncyk6CisgICAgIiIiCisgICAgUmV0dXJuIHN0cmluZyBjb250YWluaW5nIHZhbHVlcyB2MSwgdjIsIC4uLiBwYWNrZWQgYWNjb3JkaW5nIHRvIGZtdC4KKyAgICBTZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0IHN0cmluZ3MuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBvID0gX2NhY2hlW2ZtdF0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIG8gPSBfY29tcGlsZShmbXQpCisgICAgcmV0dXJuIG8ucGFjaygqYXJncykKKworZGVmIHBhY2tfdG8oZm10LCBidWYsIG9mZnNldCwgKmFyZ3MpOgorICAgICIiIgorICAgIFBhY2sgdGhlIHZhbHVlcyB2MiwgdjIsIC4uLiBhY2NvcmRpbmcgdG8gZm10LCB3cml0ZQorICAgIHRoZSBwYWNrZWQgYnl0ZXMgaW50byB0aGUgd3JpdGFibGUgYnVmZmVyIGJ1ZiBzdGFydGluZyBhdCBvZmZzZXQuCisgICAgU2VlIHN0cnVjdC5fX2RvY19fIGZvciBtb3JlIG9uIGZvcm1hdCBzdHJpbmdzLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgbyA9IF9jYWNoZVtmbXRdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBvID0gX2NvbXBpbGUoZm10KQorICAgIHJldHVybiBvLnBhY2tfdG8oYnVmLCBvZmZzZXQsICphcmdzKQorCitkZWYgdW5wYWNrKGZtdCwgcyk6CisgICAgIiIiCisgICAgVW5wYWNrIHRoZSBzdHJpbmcsIGNvbnRhaW5pbmcgcGFja2VkIEMgc3RydWN0dXJlIGRhdGEsIGFjY29yZGluZworICAgIHRvIGZtdC4gIFJlcXVpcmVzIGxlbihzdHJpbmcpPT1jYWxjc2l6ZShmbXQpLgorICAgIFNlZSBzdHJ1Y3QuX19kb2NfXyBmb3IgbW9yZSBvbiBmb3JtYXQgc3RyaW5ncy4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIG8gPSBfY2FjaGVbZm10XQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgbyA9IF9jb21waWxlKGZtdCkKKyAgICByZXR1cm4gby51bnBhY2socykKKworZGVmIHVucGFja19mcm9tKGZtdCwgYnVmLCBvZmZzZXQ9MCk6CisgICAgIiIiCisgICAgVW5wYWNrIHRoZSBidWZmZXIsIGNvbnRhaW5pbmcgcGFja2VkIEMgc3RydWN0dXJlIGRhdGEsIGFjY29yZGluZyB0bworICAgIGZtdCBzdGFydGluZyBhdCBvZmZzZXQuIFJlcXVpcmVzIGxlbihidWZmZXJbb2Zmc2V0Ol0pID49IGNhbGNzaXplKGZtdCkuCisgICAgU2VlIHN0cnVjdC5fX2RvY19fIGZvciBtb3JlIG9uIGZvcm1hdCBzdHJpbmdzLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgbyA9IF9jYWNoZVtmbXRdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBvID0gX2NvbXBpbGUoZm10KQorICAgIHJldHVybiBvLnVucGFja19mcm9tKGJ1Ziwgb2Zmc2V0KQpkaWZmIC0tZ2l0IGEvTGliL3N1YnByb2Nlc3MucHkgYi9MaWIvc3VicHJvY2Vzcy5weQppbmRleCAzY2QwZGY1Li4xOWZlODQ3IDEwMDY0NAotLS0gYS9MaWIvc3VicHJvY2Vzcy5weQorKysgYi9MaWIvc3VicHJvY2Vzcy5weQpAQCAtODcyLDcgKzg3Miw3IEBACiAgICAgICAgICAgICAjIG9iamVjdCBkbyB0aGUgdHJhbnNsYXRpb246IEl0IGlzIGJhc2VkIG9uIHN0ZGlvLCB3aGljaCBpcwogICAgICAgICAgICAgIyBpbXBvc3NpYmxlIHRvIGNvbWJpbmUgd2l0aCBzZWxlY3QgKHVubGVzcyBmb3JjaW5nIG5vCiAgICAgICAgICAgICAjIGJ1ZmZlcmluZykuCi0gICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyBhbmQgaGFzYXR0cihvcGVuLCAnbmV3bGluZXMnKToKKyAgICAgICAgICAgIGlmIHNlbGYudW5pdmVyc2FsX25ld2xpbmVzIGFuZCBoYXNhdHRyKGZpbGUsICduZXdsaW5lcycpOgogICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZG91dCkKICAgICAgICAgICAgICAgICBpZiBzdGRlcnI6CkBAIC0xMTQxLDcgKzExNDEsNyBAQAogICAgICAgICAgICAgIyBvYmplY3QgZG8gdGhlIHRyYW5zbGF0aW9uOiBJdCBpcyBiYXNlZCBvbiBzdGRpbywgd2hpY2ggaXMKICAgICAgICAgICAgICMgaW1wb3NzaWJsZSB0byBjb21iaW5lIHdpdGggc2VsZWN0ICh1bmxlc3MgZm9yY2luZyBubwogICAgICAgICAgICAgIyBidWZmZXJpbmcpLgotICAgICAgICAgICAgaWYgc2VsZi51bml2ZXJzYWxfbmV3bGluZXMgYW5kIGhhc2F0dHIob3BlbiwgJ25ld2xpbmVzJyk6CisgICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyBhbmQgaGFzYXR0cihmaWxlLCAnbmV3bGluZXMnKToKICAgICAgICAgICAgICAgICBpZiBzdGRvdXQ6CiAgICAgICAgICAgICAgICAgICAgIHN0ZG91dCA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRvdXQpCiAgICAgICAgICAgICAgICAgaWYgc3RkZXJyOgpkaWZmIC0tZ2l0IGEvTGliL3RhcmZpbGUucHkgYi9MaWIvdGFyZmlsZS5weQppbmRleCAwYjNkNDc3Li4wNjFkMGY1IDEwMDY0NAotLS0gYS9MaWIvdGFyZmlsZS5weQorKysgYi9MaWIvdGFyZmlsZS5weQpAQCAtMzMsNyArMzMsNyBAQAogX192ZXJzaW9uX18gPSAiJFJldmlzaW9uJCIKICMgJFNvdXJjZSQKIAotdmVyc2lvbiAgICAgPSAiMC42LjQiCit2ZXJzaW9uICAgICA9ICIwLjguMCIKIF9fYXV0aG9yX18gID0gIkxhcnMgR3VzdORiZWwgKGxhcnNAZ3VzdGFlYmVsLmRlKSIKIF9fZGF0ZV9fICAgID0gIiREYXRlJCIKIF9fY3ZzaWRfXyAgID0gIiRJZCQiCkBAIC0xMzIsMjEgKzEzMiw2NSBAQAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBTb21lIHVzZWZ1bCBmdW5jdGlvbnMKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWRlZiBudHMocyk6Ci0gICAgIiIiQ29udmVydCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgYnVmZmVyIHRvIGEgcHl0aG9uIHN0cmluZy4KLSAgICAiIiIKLSAgICByZXR1cm4gcy5yc3RyaXAoTlVMKQogCi1kZWYgY2FsY19jaGtzdW0oYnVmKToKLSAgICAiIiJDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGZvciBhIG1lbWJlcidzIGhlYWRlci4gSXQncyBhIHNpbXBsZSBhZGRpdGlvbgotICAgICAgIG9mIGFsbCBieXRlcywgdHJlYXRpbmcgdGhlIGNoa3N1bSBmaWVsZCBhcyBpZiBmaWxsZWQgd2l0aCBzcGFjZXMuCi0gICAgICAgYnVmIGlzIGEgNTEyIGJ5dGUgbG9uZyBzdHJpbmcgYnVmZmVyIHdoaWNoIGhvbGRzIHRoZSBoZWFkZXIuCitkZWYgc3RuKHMsIGxlbmd0aCk6CisgICAgIiIiQ29udmVydCBhIHB5dGhvbiBzdHJpbmcgdG8gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlci4KICAgICAiIiIKLSAgICBjaGsgPSAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNoa3N1bSBmaWVsZCBpcyB0cmVhdGVkIGFzIGJsYW5rcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvIHRoZSBpbml0aWFsIHZhbHVlIGlzIDggKiBvcmQoIiAiKQotICAgIGZvciBjIGluIGJ1Zls6MTQ4XTogY2hrICs9IG9yZChjKSAgICMgc3VtIHVwIGFsbCBieXRlcyBiZWZvcmUgY2hrc3VtCi0gICAgZm9yIGMgaW4gYnVmWzE1NjpdOiBjaGsgKz0gb3JkKGMpICAgIyBzdW0gdXAgYWxsIGJ5dGVzIGFmdGVyIGNoa3N1bQotICAgIHJldHVybiBjaGsKKyAgICByZXR1cm4gc1s6bGVuZ3RoLTFdICsgKGxlbmd0aCAtIGxlbihzKSAtIDEpICogTlVMICsgTlVMCisKK2RlZiBudGkocyk6CisgICAgIiIiQ29udmVydCBhIG51bWJlciBmaWVsZCB0byBhIHB5dGhvbiBudW1iZXIuCisgICAgIiIiCisgICAgIyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBudW1iZXIgZmllbGQsIHNlZQorICAgICMgaXRuKCkgYmVsb3cuCisgICAgaWYgc1swXSAhPSBjaHIoMDIwMCk6CisgICAgICAgIG4gPSBpbnQocy5yc3RyaXAoTlVMKSBvciAiMCIsIDgpCisgICAgZWxzZToKKyAgICAgICAgbiA9IDBMCisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4ocykgLSAxKToKKyAgICAgICAgICAgIG4gPDw9IDgKKyAgICAgICAgICAgIG4gKz0gb3JkKHNbaSArIDFdKQorICAgIHJldHVybiBuCisKK2RlZiBpdG4obiwgZGlnaXRzPTgsIHBvc2l4PUZhbHNlKToKKyAgICAiIiJDb252ZXJ0IGEgcHl0aG9uIG51bWJlciB0byBhIG51bWJlciBmaWVsZC4KKyAgICAiIiIKKyAgICAjIFBPU0lYIDEwMDMuMS0xOTg4IHJlcXVpcmVzIG51bWJlcnMgdG8gYmUgZW5jb2RlZCBhcyBhIHN0cmluZyBvZgorICAgICMgb2N0YWwgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbnVsbC1ieXRlLCB0aGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8KKyAgICAjICg4KiooZGlnaXRzLTEpKS0xLiBHTlUgdGFyIGFsbG93cyBzdG9yaW5nIG51bWJlcnMgZ3JlYXRlciB0aGFuCisgICAgIyB0aGF0IGlmIG5lY2Vzc2FyeS4gQSBsZWFkaW5nIDAyMDAgYnl0ZSBpbmRpY2F0ZXMgdGhpcyBwYXJ0aWN1bGFyCisgICAgIyBlbmNvZGluZywgdGhlIGZvbGxvd2luZyBkaWdpdHMtMSBieXRlcyBhcmUgYSBiaWctZW5kaWFuCisgICAgIyByZXByZXNlbnRhdGlvbi4gVGhpcyBhbGxvd3MgdmFsdWVzIHVwIHRvICgyNTYqKihkaWdpdHMtMSkpLTEuCisgICAgaWYgMCA8PSBuIDwgOCAqKiAoZGlnaXRzIC0gMSk6CisgICAgICAgIHMgPSAiJTAqbyIgJSAoZGlnaXRzIC0gMSwgbikgKyBOVUwKKyAgICBlbHNlOgorICAgICAgICBpZiBwb3NpeDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm92ZXJmbG93IGluIG51bWJlciBmaWVsZCIpCisKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICAjIFhYWCBXZSBtaW1pYyBHTlUgdGFyJ3MgYmVoYXZpb3VyIHdpdGggbmVnYXRpdmUgbnVtYmVycywKKyAgICAgICAgICAgICMgdGhpcyBjb3VsZCByYWlzZSBPdmVyZmxvd0Vycm9yLgorICAgICAgICAgICAgbiA9IHN0cnVjdC51bnBhY2soIkwiLCBzdHJ1Y3QucGFjaygibCIsIG4pKVswXQorCisgICAgICAgIHMgPSAiIgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoZGlnaXRzIC0gMSk6CisgICAgICAgICAgICBzID0gY2hyKG4gJiAwMzc3KSArIHMKKyAgICAgICAgICAgIG4gPj49IDgKKyAgICAgICAgcyA9IGNocigwMjAwKSArIHMKKyAgICByZXR1cm4gcworCitkZWYgY2FsY19jaGtzdW1zKGJ1Zik6CisgICAgIiIiQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBmb3IgYSBtZW1iZXIncyBoZWFkZXIgYnkgc3VtbWluZyB1cCBhbGwKKyAgICAgICBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGNoa3N1bSBmaWVsZCB3aGljaCBpcyB0cmVhdGVkIGFzIGlmCisgICAgICAgaXQgd2FzIGZpbGxlZCB3aXRoIHNwYWNlcy4gQWNjb3JkaW5nIHRvIHRoZSBHTlUgdGFyIHNvdXJjZXMsCisgICAgICAgc29tZSB0YXJzIChTdW4gYW5kIE5lWFQpIGNhbGN1bGF0ZSBjaGtzdW0gd2l0aCBzaWduZWQgY2hhciwKKyAgICAgICB3aGljaCB3aWxsIGJlIGRpZmZlcmVudCBpZiB0aGVyZSBhcmUgY2hhcnMgaW4gdGhlIGJ1ZmZlciB3aXRoCisgICAgICAgdGhlIGhpZ2ggYml0IHNldC4gU28gd2UgY2FsY3VsYXRlIHR3byBjaGVja3N1bXMsIHVuc2lnbmVkIGFuZAorICAgICAgIHNpZ25lZC4KKyAgICAiIiIKKyAgICB1bnNpZ25lZF9jaGtzdW0gPSAyNTYgKyBzdW0oc3RydWN0LnVucGFjaygiMTQ4QiIsIGJ1Zls6MTQ4XSkgKyBzdHJ1Y3QudW5wYWNrKCIzNTZCIiwgYnVmWzE1Njo1MTJdKSkKKyAgICBzaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OGIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2YiIsIGJ1ZlsxNTY6NTEyXSkpCisgICAgcmV0dXJuIHVuc2lnbmVkX2Noa3N1bSwgc2lnbmVkX2Noa3N1bQogCiBkZWYgY29weWZpbGVvYmooc3JjLCBkc3QsIGxlbmd0aD1Ob25lKToKICAgICAiIiJDb3B5IGxlbmd0aCBieXRlcyBmcm9tIGZpbGVvYmogc3JjIHRvIGZpbGVvYmogZHN0LgpAQCAtMTYzLDEzICsyMDcsMTMgQEAKICAgICBmb3IgYiBpbiB4cmFuZ2UoYmxvY2tzKToKICAgICAgICAgYnVmID0gc3JjLnJlYWQoQlVGU0laRSkKICAgICAgICAgaWYgbGVuKGJ1ZikgPCBCVUZTSVpFOgotICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgImVuZCBvZiBmaWxlIHJlYWNoZWQiCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJlbmQgb2YgZmlsZSByZWFjaGVkIikKICAgICAgICAgZHN0LndyaXRlKGJ1ZikKIAogICAgIGlmIHJlbWFpbmRlciAhPSAwOgogICAgICAgICBidWYgPSBzcmMucmVhZChyZW1haW5kZXIpCiAgICAgICAgIGlmIGxlbihidWYpIDwgcmVtYWluZGVyOgotICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgImVuZCBvZiBmaWxlIHJlYWNoZWQiCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJlbmQgb2YgZmlsZSByZWFjaGVkIikKICAgICAgICAgZHN0LndyaXRlKGJ1ZikKICAgICByZXR1cm4KIApAQCAtMzAxLDcgKzM0NSw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgaW1wb3J0IHpsaWIKICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAiemxpYiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ6bGliIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKICAgICAgICAgICAgIHNlbGYuemxpYiA9IHpsaWIKICAgICAgICAgICAgIHNlbGYuY3JjID0gemxpYi5jcmMzMigiIikKICAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgpAQCAtMzEzLDcgKzM1Nyw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IsICJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiCisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKICAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgogICAgICAgICAgICAgICAgIHNlbGYuZGJ1ZiA9ICIiCiAgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyRGVjb21wcmVzc29yKCkKQEAgLTM4OSw5ICs0MzMsOSBAQAogCiAgICAgICAgICMgdGFrZW4gZnJvbSBnemlwLkd6aXBGaWxlIHdpdGggc29tZSBhbHRlcmF0aW9ucwogICAgICAgICBpZiBzZWxmLl9fcmVhZCgyKSAhPSAiXDAzN1wyMTMiOgotICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCAibm90IGEgZ3ppcCBmaWxlIgorICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgICBpZiBzZWxmLl9fcmVhZCgxKSAhPSAiXDAxMCI6Ci0gICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kIgorICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kIikKIAogICAgICAgICBmbGFnID0gb3JkKHNlbGYuX19yZWFkKDEpKQogICAgICAgICBzZWxmLl9fcmVhZCg2KQpAQCAtNDI3LDcgKzQ3MSw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgIHNlbGYucmVhZChyZW1haW5kZXIpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBTdHJlYW1FcnJvciwgInNlZWtpbmcgYmFja3dhcmRzIGlzIG5vdCBhbGxvd2VkIgorICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IoInNlZWtpbmcgYmFja3dhcmRzIGlzIG5vdCBhbGxvd2VkIikKICAgICAgICAgcmV0dXJuIHNlbGYucG9zCiAKICAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgpAQCAtNTA4LDYgKzU1Miw2OSBAQAogICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQogIyBjbGFzcyBTdHJlYW1Qcm94eQogCitjbGFzcyBfQloyUHJveHkob2JqZWN0KToKKyAgICAiIiJTbWFsbCBwcm94eSBjbGFzcyB0aGF0IGVuYWJsZXMgZXh0ZXJuYWwgZmlsZSBvYmplY3QKKyAgICAgICBzdXBwb3J0IGZvciAicjpiejIiIGFuZCAidzpiejIiIG1vZGVzLiBUaGlzIGlzIGFjdHVhbGx5CisgICAgICAgYSB3b3JrYXJvdW5kIGZvciBhIGxpbWl0YXRpb24gaW4gYnoyIG1vZHVsZSdzIEJaMkZpbGUKKyAgICAgICBjbGFzcyB3aGljaCAodW5saWtlIGd6aXAuR3ppcEZpbGUpIGhhcyBubyBzdXBwb3J0IGZvcgorICAgICAgIGEgZmlsZSBvYmplY3QgYXJndW1lbnQuCisgICAgIiIiCisKKyAgICBibG9ja3NpemUgPSAxNiAqIDEwMjQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBtb2RlKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuaW5pdCgpCisKKyAgICBkZWYgaW5pdChzZWxmKToKKyAgICAgICAgaW1wb3J0IGJ6MgorICAgICAgICBzZWxmLnBvcyA9IDAKKyAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyIjoKKyAgICAgICAgICAgIHNlbGYuYnoyb2JqID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCisgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgc2VsZi5idWYgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5iejJvYmogPSBiejIuQloyQ29tcHJlc3NvcigpCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgYiA9IFtzZWxmLmJ1Zl0KKyAgICAgICAgeCA9IGxlbihzZWxmLmJ1ZikKKyAgICAgICAgd2hpbGUgeCA8IHNpemU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5ibG9ja3NpemUpCisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuYnoyb2JqLmRlY29tcHJlc3MocmF3KQorICAgICAgICAgICAgICAgIGIuYXBwZW5kKGRhdGEpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHggKz0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYuYnVmID0gIiIuam9pbihiKQorCisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmWzpzaXplXQorICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NpemU6XQorICAgICAgICBzZWxmLnBvcyArPSBsZW4oYnVmKQorICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MpOgorICAgICAgICBpZiBwb3MgPCBzZWxmLnBvczoKKyAgICAgICAgICAgIHNlbGYuaW5pdCgpCisgICAgICAgIHNlbGYucmVhZChwb3MgLSBzZWxmLnBvcykKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wb3MKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGRhdGEpCisgICAgICAgIHJhdyA9IHNlbGYuYnoyb2JqLmNvbXByZXNzKGRhdGEpCisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShyYXcpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyI6CisgICAgICAgICAgICByYXcgPSBzZWxmLmJ6Mm9iai5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUocmF3KQorICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQorIyBjbGFzcyBfQloyUHJveHkKKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBFeHRyYWN0aW9uIGZpbGUgb2JqZWN0CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01ODEsNyArNjg4LDcgQEAKICAgICAgICAgIiIiUmVhZCBvcGVyYXRpb24gZm9yIHJlZ3VsYXIgZmlsZXMuCiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJmaWxlIGlzIGNsb3NlZCIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgY2xvc2VkIikKICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQgKyBzZWxmLnBvcykKICAgICAgICAgYnl0ZXNsZWZ0ID0gc2VsZi5zaXplIC0gc2VsZi5wb3MKICAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgpAQCAtNTk1LDcgKzcwMiw3IEBACiAgICAgICAgICIiIlJlYWQgb3BlcmF0aW9uIGZvciBzcGFyc2UgZmlsZXMuCiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJmaWxlIGlzIGNsb3NlZCIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgY2xvc2VkIikKIAogICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgICBzaXplID0gc2VsZi5zaXplIC0gc2VsZi5wb3MKQEAgLTY4NCwyNCArNzkxLDI0IEBACiAgICAgICAgICAgIG9mIHRoZSBtZW1iZXIuCiAgICAgICAgICIiIgogCi0gICAgICAgIHNlbGYubmFtZSAgICAgPSBuYW1lICAgICAgICMgbWVtYmVyIG5hbWUgKGRpcm5hbWVzIG11c3QgZW5kIHdpdGggJy8nKQotICAgICAgICBzZWxmLm1vZGUgICAgID0gMDY2NiAgICAgICAjIGZpbGUgcGVybWlzc2lvbnMKLSAgICAgICAgc2VsZi51aWQgICAgICA9IDAgICAgICAgICAgIyB1c2VyIGlkCi0gICAgICAgIHNlbGYuZ2lkICAgICAgPSAwICAgICAgICAgICMgZ3JvdXAgaWQKLSAgICAgICAgc2VsZi5zaXplICAgICA9IDAgICAgICAgICAgIyBmaWxlIHNpemUKLSAgICAgICAgc2VsZi5tdGltZSAgICA9IDAgICAgICAgICAgIyBtb2RpZmljYXRpb24gdGltZQotICAgICAgICBzZWxmLmNoa3N1bSAgID0gMCAgICAgICAgICAjIGhlYWRlciBjaGVja3N1bQotICAgICAgICBzZWxmLnR5cGUgICAgID0gUkVHVFlQRSAgICAjIG1lbWJlciB0eXBlCi0gICAgICAgIHNlbGYubGlua25hbWUgPSAiIiAgICAgICAgICMgbGluayBuYW1lCi0gICAgICAgIHNlbGYudW5hbWUgICAgPSAidXNlciIgICAgICMgdXNlciBuYW1lCi0gICAgICAgIHNlbGYuZ25hbWUgICAgPSAiZ3JvdXAiICAgICMgZ3JvdXAgbmFtZQotICAgICAgICBzZWxmLmRldm1ham9yID0gMCAgICAgICAgICAjLQotICAgICAgICBzZWxmLmRldm1pbm9yID0gMCAgICAgICAgICAjLWZvciB1c2Ugd2l0aCBDSFJUWVBFIGFuZCBCTEtUWVBFCi0gICAgICAgIHNlbGYucHJlZml4ICAgPSAiIiAgICAgICAgICMgcHJlZml4IHRvIGZpbGVuYW1lIG9yIGhvbGRpbmcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm91dCBzcGFyc2UgZmlsZXMKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZSAgICAgICAgIyBtZW1iZXIgbmFtZSAoZGlybmFtZXMgbXVzdCBlbmQgd2l0aCAnLycpCisgICAgICAgIHNlbGYubW9kZSA9IDA2NjYgICAgICAgICMgZmlsZSBwZXJtaXNzaW9ucworICAgICAgICBzZWxmLnVpZCA9IDAgICAgICAgICAgICAjIHVzZXIgaWQKKyAgICAgICAgc2VsZi5naWQgPSAwICAgICAgICAgICAgIyBncm91cCBpZAorICAgICAgICBzZWxmLnNpemUgPSAwICAgICAgICAgICAjIGZpbGUgc2l6ZQorICAgICAgICBzZWxmLm10aW1lID0gMCAgICAgICAgICAjIG1vZGlmaWNhdGlvbiB0aW1lCisgICAgICAgIHNlbGYuY2hrc3VtID0gMCAgICAgICAgICMgaGVhZGVyIGNoZWNrc3VtCisgICAgICAgIHNlbGYudHlwZSA9IFJFR1RZUEUgICAgICMgbWVtYmVyIHR5cGUKKyAgICAgICAgc2VsZi5saW5rbmFtZSA9ICIiICAgICAgIyBsaW5rIG5hbWUKKyAgICAgICAgc2VsZi51bmFtZSA9ICJ1c2VyIiAgICAgIyB1c2VyIG5hbWUKKyAgICAgICAgc2VsZi5nbmFtZSA9ICJncm91cCIgICAgIyBncm91cCBuYW1lCisgICAgICAgIHNlbGYuZGV2bWFqb3IgPSAwICAgICAgICMgZGV2aWNlIG1ham9yIG51bWJlcgorICAgICAgICBzZWxmLmRldm1pbm9yID0gMCAgICAgICAjIGRldmljZSBtaW5vciBudW1iZXIKKyAgICAgICAgc2VsZi5wcmVmaXggPSAiIiAgICAgICAgIyBwcmVmaXggdG8gZmlsZW5hbWUgb3IgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm91dCBzcGFyc2UgZmlsZXMKIAotICAgICAgICBzZWxmLm9mZnNldCAgID0gMCAgICAgICAgICAjIHRoZSB0YXIgaGVhZGVyIHN0YXJ0cyBoZXJlCi0gICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSAwICAgICAgICMgdGhlIGZpbGUncyBkYXRhIHN0YXJ0cyBoZXJlCisgICAgICAgIHNlbGYub2Zmc2V0ID0gMCAgICAgICAgICMgdGhlIHRhciBoZWFkZXIgc3RhcnRzIGhlcmUKKyAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IDAgICAgIyB0aGUgZmlsZSdzIGRhdGEgc3RhcnRzIGhlcmUKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICI8JXMgJXIgYXQgJSN4PiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sc2VsZi5uYW1lLGlkKHNlbGYpKQpAQCAtNzEwLDk1ICs4MTcsNTcgQEAKICAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1Zik6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBzdHJpbmcgYnVmZmVyLgogICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKGJ1ZikgIT0gQkxPQ0tTSVpFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidHJ1bmNhdGVkIGhlYWRlciIpCisgICAgICAgIGlmIGJ1Zi5jb3VudChOVUwpID09IEJMT0NLU0laRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IGhlYWRlciIpCisKICAgICAgICAgdGFyaW5mbyA9IGNscygpCi0gICAgICAgIHRhcmluZm8ubmFtZSAgID0gbnRzKGJ1ZlswOjEwMF0pCi0gICAgICAgIHRhcmluZm8ubW9kZSAgID0gaW50KGJ1ZlsxMDA6MTA4XSwgOCkKLSAgICAgICAgdGFyaW5mby51aWQgICAgPSBpbnQoYnVmWzEwODoxMTZdLDgpCi0gICAgICAgIHRhcmluZm8uZ2lkICAgID0gaW50KGJ1ZlsxMTY6MTI0XSw4KQotCi0gICAgICAgICMgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjb2RpbmdzIGZvciB0aGUgc2l6ZSBmaWVsZCB3ZQotICAgICAgICAjIGhhdmUgdG8gZGlzY3JpbWluYXRlLCBzZWUgY29tbWVudCBpbiB0b2J1ZigpIGJlbG93LgotICAgICAgICBpZiBidWZbMTI0XSAhPSBjaHIoMDIwMCk6Ci0gICAgICAgICAgICB0YXJpbmZvLnNpemUgPSBsb25nKGJ1ZlsxMjQ6MTM2XSwgOCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA9IDBMCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMSk6Ci0gICAgICAgICAgICAgICAgdGFyaW5mby5zaXplIDw8PSA4Ci0gICAgICAgICAgICAgICAgdGFyaW5mby5zaXplICs9IG9yZChidWZbMTI1ICsgaV0pCi0KLSAgICAgICAgdGFyaW5mby5tdGltZSAgPSBsb25nKGJ1ZlsxMzY6MTQ4XSwgOCkKLSAgICAgICAgdGFyaW5mby5jaGtzdW0gPSBpbnQoYnVmWzE0ODoxNTZdLCA4KQotICAgICAgICB0YXJpbmZvLnR5cGUgICA9IGJ1ZlsxNTY6MTU3XQotICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbnRzKGJ1ZlsxNTc6MjU3XSkKLSAgICAgICAgdGFyaW5mby51bmFtZSAgPSBudHMoYnVmWzI2NToyOTddKQotICAgICAgICB0YXJpbmZvLmduYW1lICA9IG50cyhidWZbMjk3OjMyOV0pCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSBpbnQoYnVmWzMyOTozMzddLCA4KQotICAgICAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IGludChidWZbMzM3OjM0NV0sIDgpCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IHRhcmluZm8uZGV2bWFqb3IgPSAwCisgICAgICAgIHRhcmluZm8uYnVmID0gYnVmCisgICAgICAgIHRhcmluZm8ubmFtZSA9IGJ1ZlswOjEwMF0ucnN0cmlwKE5VTCkKKyAgICAgICAgdGFyaW5mby5tb2RlID0gbnRpKGJ1ZlsxMDA6MTA4XSkKKyAgICAgICAgdGFyaW5mby51aWQgPSBudGkoYnVmWzEwODoxMTZdKQorICAgICAgICB0YXJpbmZvLmdpZCA9IG50aShidWZbMTE2OjEyNF0pCisgICAgICAgIHRhcmluZm8uc2l6ZSA9IG50aShidWZbMTI0OjEzNl0pCisgICAgICAgIHRhcmluZm8ubXRpbWUgPSBudGkoYnVmWzEzNjoxNDhdKQorICAgICAgICB0YXJpbmZvLmNoa3N1bSA9IG50aShidWZbMTQ4OjE1Nl0pCisgICAgICAgIHRhcmluZm8udHlwZSA9IGJ1ZlsxNTY6MTU3XQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gYnVmWzE1NzoyNTddLnJzdHJpcChOVUwpCisgICAgICAgIHRhcmluZm8udW5hbWUgPSBidWZbMjY1OjI5N10ucnN0cmlwKE5VTCkKKyAgICAgICAgdGFyaW5mby5nbmFtZSA9IGJ1ZlsyOTc6MzI5XS5yc3RyaXAoTlVMKQorICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gbnRpKGJ1ZlszMjk6MzM3XSkKKyAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IG50aShidWZbMzM3OjM0NV0pCiAgICAgICAgIHRhcmluZm8ucHJlZml4ID0gYnVmWzM0NTo1MDBdCiAKLSAgICAgICAgIyBTb21lIG9sZCB0YXIgcHJvZ3JhbXMgcmVwcmVzZW50IGEgZGlyZWN0b3J5IGFzIGEgcmVndWxhcgotICAgICAgICAjIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgotICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCkgYW5kIHRhcmluZm8ubmFtZS5lbmRzd2l0aCgiLyIpOgotICAgICAgICAgICAgdGFyaW5mby50eXBlID0gRElSVFlQRQotCi0gICAgICAgICMgVGhlIHByZWZpeCBmaWVsZCBpcyB1c2VkIGZvciBmaWxlbmFtZXMgPiAxMDAgaW4KLSAgICAgICAgIyB0aGUgUE9TSVggc3RhbmRhcmQuCi0gICAgICAgICMgbmFtZSA9IHByZWZpeCArICcvJyArIG5hbWUKLSAgICAgICAgaWYgdGFyaW5mby50eXBlICE9IEdOVVRZUEVfU1BBUlNFOgotICAgICAgICAgICAgdGFyaW5mby5uYW1lID0gbm9ybXBhdGgob3MucGF0aC5qb2luKG50cyh0YXJpbmZvLnByZWZpeCksIHRhcmluZm8ubmFtZSkpCi0KLSAgICAgICAgIyBEaXJlY3RvcnkgbmFtZXMgc2hvdWxkIGhhdmUgYSAnLycgYXQgdGhlIGVuZC4KLSAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgotICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgorICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGhlYWRlciIpCiAgICAgICAgIHJldHVybiB0YXJpbmZvCiAKLSAgICBkZWYgdG9idWYoc2VsZik6CisgICAgZGVmIHRvYnVmKHNlbGYsIHBvc2l4PUZhbHNlKToKICAgICAgICAgIiIiUmV0dXJuIGEgdGFyIGhlYWRlciBibG9jayBhcyBhIDUxMiBieXRlIHN0cmluZy4KICAgICAgICAgIiIiCi0gICAgICAgICMgUHJlZmVyIHRoZSBzaXplIHRvIGJlIGVuY29kZWQgYXMgMTEgb2N0YWwgYXNjaWkgZGlnaXRzCi0gICAgICAgICMgd2hpY2ggaXMgdGhlIG1vc3QgcG9ydGFibGUuIElmIHRoZSBzaXplIGV4Y2VlZHMgdGhpcwotICAgICAgICAjIGxpbWl0ICg+PSA4IEdCKSwgZW5jb2RlIGl0IGFzIGFuIDg4LWJpdCB2YWx1ZSB3aGljaCBpcwotICAgICAgICAjIGEgR05VIHRhciBmZWF0dXJlLgotICAgICAgICBpZiBzZWxmLnNpemUgPD0gTUFYU0laRV9NRU1CRVI6Ci0gICAgICAgICAgICBzaXplID0gIiUwMTFvIiAlIHNlbGYuc2l6ZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcyA9IHNlbGYuc2l6ZQotICAgICAgICAgICAgc2l6ZSA9ICIiCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMSk6Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IGNocihzICYgMDM3NykgKyBzaXplCi0gICAgICAgICAgICAgICAgcyA+Pj0gOAotICAgICAgICAgICAgc2l6ZSA9IGNocigwMjAwKSArIHNpemUKKyAgICAgICAgcGFydHMgPSBbCisgICAgICAgICAgICBzdG4oc2VsZi5uYW1lLCAxMDApLAorICAgICAgICAgICAgaXRuKHNlbGYubW9kZSAmIDA3Nzc3LCA4LCBwb3NpeCksCisgICAgICAgICAgICBpdG4oc2VsZi51aWQsIDgsIHBvc2l4KSwKKyAgICAgICAgICAgIGl0bihzZWxmLmdpZCwgOCwgcG9zaXgpLAorICAgICAgICAgICAgaXRuKHNlbGYuc2l6ZSwgMTIsIHBvc2l4KSwKKyAgICAgICAgICAgIGl0bihzZWxmLm10aW1lLCAxMiwgcG9zaXgpLAorICAgICAgICAgICAgIiAgICAgICAgIiwgIyBjaGVja3N1bSBmaWVsZAorICAgICAgICAgICAgc2VsZi50eXBlLAorICAgICAgICAgICAgc3RuKHNlbGYubGlua25hbWUsIDEwMCksCisgICAgICAgICAgICBzdG4oTUFHSUMsIDYpLAorICAgICAgICAgICAgc3RuKFZFUlNJT04sIDIpLAorICAgICAgICAgICAgc3RuKHNlbGYudW5hbWUsIDMyKSwKKyAgICAgICAgICAgIHN0bihzZWxmLmduYW1lLCAzMiksCisgICAgICAgICAgICBpdG4oc2VsZi5kZXZtYWpvciwgOCwgcG9zaXgpLAorICAgICAgICAgICAgaXRuKHNlbGYuZGV2bWlub3IsIDgsIHBvc2l4KSwKKyAgICAgICAgICAgIHN0bihzZWxmLnByZWZpeCwgMTU1KQorICAgICAgICBdCiAKLSAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IERldGxlZiBMYW5uZXJ0LgotICAgICAgICBwYXJ0cyA9IFtdCi0gICAgICAgIGZvciB2YWx1ZSwgZmllbGRzaXplIGluICgKLSAgICAgICAgICAgICAgICAoc2VsZi5uYW1lLCAxMDApLAotICAgICAgICAgICAgICAgICgiJTA3byIgJSAoc2VsZi5tb2RlICYgMDc3NzcpLCA4KSwKLSAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi51aWQsIDgpLAotICAgICAgICAgICAgICAgICgiJTA3byIgJSBzZWxmLmdpZCwgOCksCi0gICAgICAgICAgICAgICAgKHNpemUsIDEyKSwKLSAgICAgICAgICAgICAgICAoIiUwMTFvIiAlIHNlbGYubXRpbWUsIDEyKSwKLSAgICAgICAgICAgICAgICAoIiAgICAgICAgIiwgOCksCi0gICAgICAgICAgICAgICAgKHNlbGYudHlwZSwgMSksCi0gICAgICAgICAgICAgICAgKHNlbGYubGlua25hbWUsIDEwMCksCi0gICAgICAgICAgICAgICAgKE1BR0lDLCA2KSwKLSAgICAgICAgICAgICAgICAoVkVSU0lPTiwgMiksCi0gICAgICAgICAgICAgICAgKHNlbGYudW5hbWUsIDMyKSwKLSAgICAgICAgICAgICAgICAoc2VsZi5nbmFtZSwgMzIpLAotICAgICAgICAgICAgICAgICgiJTA3byIgJSBzZWxmLmRldm1ham9yLCA4KSwKLSAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5kZXZtaW5vciwgOCksCi0gICAgICAgICAgICAgICAgKHNlbGYucHJlZml4LCAxNTUpCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgbCA9IGxlbih2YWx1ZSkKLSAgICAgICAgICAgIHBhcnRzLmFwcGVuZCh2YWx1ZVs6ZmllbGRzaXplXSArIChmaWVsZHNpemUgLSBsKSAqIE5VTCkKLQotICAgICAgICBidWYgPSAiIi5qb2luKHBhcnRzKQotICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bShidWYpCisgICAgICAgIGJ1ZiA9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCAiIi5qb2luKHBhcnRzKSkKKyAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZilbMF0KICAgICAgICAgYnVmID0gYnVmWzoxNDhdICsgIiUwNm9cMCIgJSBjaGtzdW0gKyBidWZbMTU1Ol0KLSAgICAgICAgYnVmICs9IChCTE9DS1NJWkUgLSBsZW4oYnVmKSkgKiBOVUwKICAgICAgICAgc2VsZi5idWYgPSBidWYKICAgICAgICAgcmV0dXJuIGJ1ZgogCkBAIC04NTcsNyArOTI2LDcgQEAKICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogCiAgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQogICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQogICAgICAgICBzZWxmLm1vZGUgPSB7InIiOiAicmIiLCAiYSI6ICJyK2IiLCAidyI6ICJ3YiJ9W21vZGVdCiAKQEAgLTg3MywxMiArOTQyLDEyIEBACiAgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKIAogICAgICAgICAjIEluaXQgZGF0YXN0cnVjdHVyZXMKLSAgICAgICAgc2VsZi5jbG9zZWQgICAgICA9IEZhbHNlCi0gICAgICAgIHNlbGYubWVtYmVycyAgICAgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKLSAgICAgICAgc2VsZi5fbG9hZGVkICAgICA9IEZhbHNlICAgICMgZmxhZyBpZiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZAotICAgICAgICBzZWxmLm9mZnNldCAgICAgID0gMEwgICAgICAgIyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBhcmNoaXZlIGZpbGUKLSAgICAgICAgc2VsZi5pbm9kZXMgICAgICA9IHt9ICAgICAgICMgZGljdGlvbmFyeSBjYWNoaW5nIHRoZSBpbm9kZXMgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICBzZWxmLm1lbWJlcnMgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKKyAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UgICAgIyBmbGFnIGlmIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkCisgICAgICAgIHNlbGYub2Zmc2V0ID0gMEwgICAgICAgICMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJjaGl2ZSBmaWxlCisgICAgICAgIHNlbGYuaW5vZGVzID0ge30gICAgICAgICMgZGljdGlvbmFyeSBjYWNoaW5nIHRoZSBpbm9kZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlIG1lbWJlcnMgYWxyZWFkeSBhZGRlZAogCiAgICAgICAgIGlmIHNlbGYuX21vZGUgPT0gInIiOgogICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IE5vbmUKQEAgLTkzNyw3ICsxMDA2LDcgQEAKICAgICAgICAgIiIiCiAKICAgICAgICAgaWYgbm90IG5hbWUgYW5kIG5vdCBmaWxlb2JqOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vdGhpbmcgdG8gb3BlbiIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdGhpbmcgdG8gb3BlbiIpCiAKICAgICAgICAgaWYgbW9kZSBpbiAoInIiLCAicjoqIik6CiAgICAgICAgICAgICAjIEZpbmQgb3V0IHdoaWNoICpvcGVuKCkgaXMgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUuCkBAIC05NDcsNyArMTAxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsICJyIiwgZmlsZW9iaikKICAgICAgICAgICAgICAgICBleGNlcHQgKFJlYWRFcnJvciwgQ29tcHJlc3Npb25FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsICJmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5IgorICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5IikKIAogICAgICAgICBlbGlmICI6IiBpbiBtb2RlOgogICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgiOiIsIDEpCkBAIC05NTksNyArMTAyOCw3IEBACiAgICAgICAgICAgICBpZiBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgogICAgICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGNscywgY2xzLk9QRU5fTUVUSFtjb21wdHlwZV0pCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUpCiAgICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaikKIAogICAgICAgICBlbGlmICJ8IiBpbiBtb2RlOgpAQCAtOTY4LDcgKzEwMzcsNyBAQAogICAgICAgICAgICAgY29tcHR5cGUgPSBjb21wdHlwZSBvciAidGFyIgogCiAgICAgICAgICAgICBpZiBmaWxlbW9kZSBub3QgaW4gInJ3IjoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibW9kZSBtdXN0IGJlICdyJyBvciAndyciCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQogCiAgICAgICAgICAgICB0ID0gY2xzKG5hbWUsIGZpbGVtb2RlLAogICAgICAgICAgICAgICAgICAgICBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSkpCkBAIC05NzgsMTQgKzEwNDcsMTQgQEAKICAgICAgICAgZWxpZiBtb2RlIGluICJhdyI6CiAgICAgICAgICAgICByZXR1cm4gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaikKIAotICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5kaXNjZXJuaWJsZSBtb2RlIgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRhcm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lKToKICAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAiIiIKICAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCiAgICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaikKIAogICAgIEBjbGFzc21ldGhvZApAQCAtOTk0LDEzICsxMDYzLDEzIEBACiAgICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbXBvcnQgZ3ppcAogICAgICAgICAgICAgZ3ppcC5HemlwRmlsZQogICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6Ci0gICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAiZ3ppcCBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIKKyAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImd6aXAgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQogCiAgICAgICAgIHByZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQogICAgICAgICBwcmUgPSBvcy5wYXRoLmJhc2VuYW1lKHByZSkKQEAgLTEwMjEsNyArMTA5MCw3IEBACiAgICAgICAgICAgICAgICAgZ3ppcC5HemlwRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsLCBmaWxlb2JqKQogICAgICAgICAgICAgKQogICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvciwgIm5vdCBhIGd6aXAgZmlsZSIKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgZ3ppcCBmaWxlIikKICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgIHJldHVybiB0CiAKQEAgLTEwMzEsMTIgKzExMDAsMTIgQEAKICAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICAiIiIKICAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnLiIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnLiIpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgorICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKIAogICAgICAgICBwcmUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKICAgICAgICAgcHJlID0gb3MucGF0aC5iYXNlbmFtZShwcmUpCkBAIC0xMDQ3LDEyICsxMTE2LDE0IEBACiAgICAgICAgIHRhcm5hbWUgPSBwcmUgKyBleHQKIAogICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vIHN1cHBvcnQgZm9yIGV4dGVybmFsIGZpbGUgb2JqZWN0cyIKKyAgICAgICAgICAgIGZpbGVvYmogPSBfQloyUHJveHkoZmlsZW9iaiwgbW9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGVvYmogPSBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpCiAKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKHRhcm5hbWUsIG1vZGUsIGJ6Mi5CWjJGaWxlKG5hbWUsIG1vZGUsIGNvbXByZXNzbGV2ZWw9Y29tcHJlc3NsZXZlbCkpCisgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4odGFybmFtZSwgbW9kZSwgZmlsZW9iaikKICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsICJub3QgYSBiemlwMiBmaWxlIgorICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBiemlwMiBmaWxlIikKICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgIHJldHVybiB0CiAKQEAgLTEwOTQsNyArMTE2NSw3IEBACiAgICAgICAgICIiIgogICAgICAgICB0YXJpbmZvID0gc2VsZi5fZ2V0bWVtYmVyKG5hbWUpCiAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCAiZmlsZW5hbWUgJXIgbm90IGZvdW5kIiAlIG5hbWUKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJmaWxlbmFtZSAlciBub3QgZm91bmQiICUgbmFtZSkKICAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogICAgIGRlZiBnZXRtZW1iZXJzKHNlbGYpOgpAQCAtMTMxMywxNSArMTM4NCwxNCBAQAogCiAgICAgICAgIGlmIHRhcmluZm8uc2l6ZSA+IE1BWFNJWkVfTUVNQkVSOgogICAgICAgICAgICAgaWYgc2VsZi5wb3NpeDoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZmlsZSBpcyB0b28gbGFyZ2UgKD49IDggR0IpIgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgdG9vIGxhcmdlICg+PSA4IEdCKSIpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogQ3JlYXRlZCBHTlUgdGFyIGxhcmdlZmlsZSBoZWFkZXIiKQogCiAKICAgICAgICAgaWYgbGVuKHRhcmluZm8ubGlua25hbWUpID4gTEVOR1RIX0xJTks6CiAgICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJsaW5rbmFtZSBpcyB0b28gbG9uZyAoPiVkKSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKExFTkdUSF9MSU5LKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nICg+JWQpIiAlIChMRU5HVEhfTElOSykpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9nbnVsb25nKHRhcmluZm8ubGlua25hbWUsIEdOVVRZUEVfTE9OR0xJTkspCiAgICAgICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IHRhcmluZm8ubGlua25hbWVbOkxFTkdUSF9MSU5LIC0xXQpAQCAtMTMzNyw4ICsxNDA3LDcgQEAKICAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhbOi0xXQogCiAgICAgICAgICAgICAgICAgaWYgbm90IHByZWZpeCBvciBsZW4obmFtZSkgPiBMRU5HVEhfTkFNRToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5hbWUgaXMgdG9vIGxvbmcgKD4lZCkiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoTEVOR1RIX05BTUUpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmcgKD4lZCkiICUgKExFTkdUSF9OQU1FKSkKIAogICAgICAgICAgICAgICAgIHRhcmluZm8ubmFtZSAgID0gbmFtZQogICAgICAgICAgICAgICAgIHRhcmluZm8ucHJlZml4ID0gcHJlZml4CkBAIC0xMzQ3LDcgKzE0MTYsNyBAQAogICAgICAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHRhcmluZm8ubmFtZVs6TEVOR1RIX05BTUUgLSAxXQogICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogQ3JlYXRlZCBHTlUgdGFyIGV4dGVuc2lvbiBMT05HTkFNRSIpCiAKLSAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHRhcmluZm8udG9idWYoKSkKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHRhcmluZm8udG9idWYoc2VsZi5wb3NpeCkpCiAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogCiAgICAgICAgICMgSWYgdGhlcmUncyBkYXRhIHRvIGZvbGxvdywgYXBwZW5kIGl0LgpAQCAtMTQ2NCw3ICsxNTMzLDcgQEAKICAgICAgICAgICAgICAgICAjIEEgc21hbGwgYnV0IHVnbHkgd29ya2Fyb3VuZCBmb3IgdGhlIGNhc2UgdGhhdCBzb21lb25lIHRyaWVzCiAgICAgICAgICAgICAgICAgIyB0byBleHRyYWN0IGEgKHN5bSlsaW5rIGFzIGEgZmlsZS1vYmplY3QgZnJvbSBhIG5vbi1zZWVrYWJsZQogICAgICAgICAgICAgICAgICMgc3RyZWFtIG9mIHRhciBibG9ja3MuCi0gICAgICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IsICJjYW5ub3QgZXh0cmFjdCAoc3ltKWxpbmsgYXMgZmlsZSBvYmplY3QiCisgICAgICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IoImNhbm5vdCBleHRyYWN0IChzeW0pbGluayBhcyBmaWxlIG9iamVjdCIpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICMgQSAoc3ltKWxpbmsncyBmaWxlIG9iamVjdCBpcyBpdHMgdGFyZ2V0J3MgZmlsZSBvYmplY3QuCiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXh0cmFjdGZpbGUoc2VsZi5fZ2V0bWVtYmVyKHRhcmluZm8ubGlua25hbWUsCkBAIC0xNTY0LDEzICsxNjMzLDEzIEBACiAgICAgICAgIGlmIGhhc2F0dHIob3MsICJta2ZpZm8iKToKICAgICAgICAgICAgIG9zLm1rZmlmbyh0YXJnZXRwYXRoKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yLCAiZmlmbyBub3Qgc3VwcG9ydGVkIGJ5IHN5c3RlbSIKKyAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiZmlmbyBub3Qgc3VwcG9ydGVkIGJ5IHN5c3RlbSIpCiAKICAgICBkZWYgbWFrZWRldihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAgIiIiTWFrZSBhIGNoYXJhY3RlciBvciBibG9jayBkZXZpY2UgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgICIiIgogICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgIm1rbm9kIikgb3Igbm90IGhhc2F0dHIob3MsICJtYWtlZGV2Iik6Ci0gICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IsICJzcGVjaWFsIGRldmljZXMgbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iCisgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoInNwZWNpYWwgZGV2aWNlcyBub3Qgc3VwcG9ydGVkIGJ5IHN5c3RlbSIpCiAKICAgICAgICAgbW9kZSA9IHRhcmluZm8ubW9kZQogICAgICAgICBpZiB0YXJpbmZvLmlzYmxrKCk6CkBAIC0xNjA2LDcgKzE2NzUsNyBAQAogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKGxpbmtwYXRoLCB0YXJnZXRwYXRoKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAibGluayBjb3VsZCBub3QgYmUgY3JlYXRlZCIKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigibGluayBjb3VsZCBub3QgYmUgY3JlYXRlZCIpCiAKICAgICBkZWYgY2hvd24oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgICIiIlNldCBvd25lciBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgpAQCAtMTYzNCw3ICsxNzAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJvczJlbXgiOgogICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hvd24odGFyZ2V0cGF0aCwgdSwgZykKICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgotICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImNvdWxkIG5vdCBjaGFuZ2Ugb3duZXIiCisgICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG93bmVyIikKIAogICAgIGRlZiBjaG1vZChzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAgIiIiU2V0IGZpbGUgcGVybWlzc2lvbnMgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KQEAgLTE2NDMsNyArMTcxMiw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0cGF0aCwgdGFyaW5mby5tb2RlKQogICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yLCAiY291bGQgbm90IGNoYW5nZSBtb2RlIgorICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiY291bGQgbm90IGNoYW5nZSBtb2RlIikKIAogICAgIGRlZiB1dGltZShzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAgIiIiU2V0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCkBAIC0xNjU3LDEwICsxNzI2LDkgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgb3MudXRpbWUodGFyZ2V0cGF0aCwgKHRhcmluZm8ubXRpbWUsIHRhcmluZm8ubXRpbWUpKQogICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKLSAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImNvdWxkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUiCisgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUiKQogCiAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IG1lbWJlciBvZiB0aGUgYXJjaGl2ZSBhcyBhIFRhckluZm8gb2JqZWN0LCB3aGVuCiAgICAgICAgICAgIFRhckZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLiBSZXR1cm4gTm9uZSBpZiB0aGVyZSBpcyBubyBtb3JlCkBAIC0xNjc4LDcwICsxNzQ2LDkxIEBACiAgICAgICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB0YXJpbmZvID0gVGFySW5mby5mcm9tYnVmKGJ1ZikKLSAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorCisgICAgICAgICAgICAgICAgIyBXZSBzaG91bGRuJ3QgcmVseSBvbiB0aGlzIGNoZWNrc3VtLCBiZWNhdXNlIHNvbWUgdGFyIHByb2dyYW1zCisgICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgaXQgZGlmZmVyZW50bHkgYW5kIGl0IGlzIG1lcmVseSB2YWxpZGF0aW5nIHRoZQorICAgICAgICAgICAgICAgICMgaGVhZGVyIGJsb2NrLiBXZSBjb3VsZCBqdXN0IGFzIHdlbGwgc2tpcCB0aGlzIHBhcnQsIHdoaWNoIHdvdWxkCisgICAgICAgICAgICAgICAgIyBoYXZlIGEgc2xpZ2h0IGVmZmVjdCBvbiBwZXJmb3JtYW5jZS4uLgorICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBCYWQgQ2hlY2tzdW0gJXIiICUgdGFyaW5mby5uYW1lKQorCisgICAgICAgICAgICAgICAgIyBTZXQgdGhlIFRhckluZm8gb2JqZWN0J3Mgb2Zmc2V0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZQorICAgICAgICAgICAgICAgICMgVGFyRmlsZSBhbmQgc2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MKKyAgICAgICAgICAgICAgICAjIHNob3VsZCBiZWdpbi4KKyAgICAgICAgICAgICAgICB0YXJpbmZvLm9mZnNldCA9IHNlbGYub2Zmc2V0CisgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5wcm9jX21lbWJlcih0YXJpbmZvKQorCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKICAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKLSAgICAgICAgICAgICAgICAgICAgaWYgYnVmLmNvdW50KE5VTCkgPT0gQkxPQ0tTSVpFOgotICAgICAgICAgICAgICAgICAgICAgICAgYWRqID0gImVtcHR5IgotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgYWRqID0gImludmFsaWQiCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAiMHglWDogJXMgYmxvY2siICUgKHNlbGYub2Zmc2V0LCBhZGopKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6IGVtcHR5IG9yIGludmFsaWQgYmxvY2s6ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5vZmZzZXQsIGUpKQogICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIGlzIGVtcHR5IG9yIHVucmVhZGFibGUuCiAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub2Zmc2V0ID09IDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBmaXJzdCBibG9jayBpcyBpbnZhbGlkLiBUaGF0IGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIGxvb2sgbGlrZSBhIHRhciBhcmNoaXZlIHdlIGNhbiBoYW5kbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsImVtcHR5LCB1bnJlYWRhYmxlIG9yIGNvbXByZXNzZWQgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiZW1wdHksIHVucmVhZGFibGUgb3IgY29tcHJlc3NlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGU6ICVzIiAlIGUpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgICBicmVhawogCi0gICAgICAgICMgV2Ugc2hvdWxkbid0IHJlbHkgb24gdGhpcyBjaGVja3N1bSwgYmVjYXVzZSBzb21lIHRhciBwcm9ncmFtcwotICAgICAgICAjIGNhbGN1bGF0ZSBpdCBkaWZmZXJlbnRseSBhbmQgaXQgaXMgbWVyZWx5IHZhbGlkYXRpbmcgdGhlCi0gICAgICAgICMgaGVhZGVyIGJsb2NrLiBXZSBjb3VsZCBqdXN0IGFzIHdlbGwgc2tpcCB0aGlzIHBhcnQsIHdoaWNoIHdvdWxkCi0gICAgICAgICMgaGF2ZSBhIHNsaWdodCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuLi4KLSAgICAgICAgaWYgdGFyaW5mby5jaGtzdW0gIT0gY2FsY19jaGtzdW0oYnVmKToKLSAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogQmFkIENoZWNrc3VtICVyIiAlIHRhcmluZm8ubmFtZSkKKyAgICAgICAgIyBTb21lIG9sZCB0YXIgcHJvZ3JhbXMgcmVwcmVzZW50IGEgZGlyZWN0b3J5IGFzIGEgcmVndWxhcgorICAgICAgICAjIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgorICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCkgYW5kIHRhcmluZm8ubmFtZS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgdGFyaW5mby50eXBlID0gRElSVFlQRQogCi0gICAgICAgICMgU2V0IHRoZSBUYXJJbmZvIG9iamVjdCdzIG9mZnNldCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUKLSAgICAgICAgIyBUYXJGaWxlIGFuZCBzZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcwotICAgICAgICAjIHNob3VsZCBiZWdpbi4KLSAgICAgICAgdGFyaW5mby5vZmZzZXQgPSBzZWxmLm9mZnNldAotICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKKyAgICAgICAgIyBUaGUgcHJlZml4IGZpZWxkIGlzIHVzZWQgZm9yIGZpbGVuYW1lcyA+IDEwMCBpbgorICAgICAgICAjIHRoZSBQT1NJWCBzdGFuZGFyZC4KKyAgICAgICAgIyBuYW1lID0gcHJlZml4ICsgJy8nICsgbmFtZQorICAgICAgICB0YXJpbmZvLm5hbWUgPSBub3JtcGF0aChvcy5wYXRoLmpvaW4odGFyaW5mby5wcmVmaXgucnN0cmlwKE5VTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLm5hbWUpKQogCi0gICAgICAgICMgQ2hlY2sgaWYgdGhlIFRhckluZm8gb2JqZWN0IGhhcyBhIHR5cGVmbGFnIGZvciB3aGljaCBhIGNhbGxiYWNrCi0gICAgICAgICMgbWV0aG9kIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIFRZUEVfTUVUSC4gSWYgc28sIHRoZW4gY2FsbCBpdC4KLSAgICAgICAgaWYgdGFyaW5mby50eXBlIGluIHNlbGYuVFlQRV9NRVRIOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuVFlQRV9NRVRIW3RhcmluZm8udHlwZV0oc2VsZiwgdGFyaW5mbykKLQotICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhID0gc2VsZi5vZmZzZXQKLSAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIG9yIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgotICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCi0gICAgICAgICAgICBzZWxmLm9mZnNldCArPSBzZWxmLl9ibG9jayh0YXJpbmZvLnNpemUpCisgICAgICAgICMgRGlyZWN0b3J5IG5hbWVzIHNob3VsZCBoYXZlIGEgJy8nIGF0IHRoZSBlbmQuCisgICAgICAgIGlmIHRhcmluZm8uaXNkaXIoKToKKyAgICAgICAgICAgIHRhcmluZm8ubmFtZSArPSAiLyIKIAogICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCiAgICAgICAgIHJldHVybiB0YXJpbmZvCiAKICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAjIEJlbG93IGFyZSBzb21lIG1ldGhvZHMgd2hpY2ggYXJlIGNhbGxlZCBmb3Igc3BlY2lhbCB0eXBlZmxhZ3MgaW4gdGhlCi0gICAgIyBuZXh0KCkgbWV0aG9kLCBlLmcuIGZvciB1bndyYXBwaW5nIEdOVSBsb25nbmFtZS9sb25nbGluayBibG9ja3MuIFRoZXkKLSAgICAjIGFyZSByZWdpc3RlcmVkIGluIFRZUEVfTUVUSCBiZWxvdy4gWW91IGNhbiByZWdpc3RlciB5b3VyIG93biBtZXRob2RzCi0gICAgIyB3aXRoIHRoaXMgbWFwcGluZy4KLSAgICAjIEEgcmVnaXN0ZXJlZCBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBUYXJJbmZvIG9iamVjdCBhcyBvbmx5IGFyZ3VtZW50LgotICAgICMKLSAgICAjIER1cmluZyBpdHMgZXhlY3V0aW9uIHRoZSBtZXRob2QgTVVTVCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6Ci0gICAgIyAxLiBzZXQgdGFyaW5mby5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAotICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0byBmb2xsb3cuCi0gICAgIyAyLiBzZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCisgICAgIyBUaGUgZm9sbG93aW5nIGFyZSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYQorICAgICMgbWVtYmVyLiBUaGUgZW50cnkgcG9pbnQgaXMgcHJvY19tZW1iZXIoKSB3aGljaCBpcyBjYWxsZWQgd2l0aCBhIFRhckluZm8KKyAgICAjIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIGhlYWRlciBibG9jayBmcm9tIHRoZSBjdXJyZW50IG9mZnNldC4gVGhlCisgICAgIyBwcm9jX21lbWJlcigpIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzIHRvIGFkZCBjdXN0b20KKyAgICAjIHByb2NfKigpIG1ldGhvZHMuIEEgcHJvY18qKCkgbWV0aG9kIE1VU1QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKyAgICAjIG9wZXJhdGlvbnM6CisgICAgIyAxLiBTZXQgdGFyaW5mby5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAorICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCisgICAgIyAyLiBTZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCiAgICAgIyAgICBiZWdpbi4KLSAgICAjIDMuIGFwcGVuZCB0aGUgdGFyaW5mbyBvYmplY3QgdG8gc2VsZi5tZW1iZXJzLCBpZiBpdCBpcyBzdXBwb3NlZCB0byBhcHBlYXIKLSAgICAjICAgIGFzIGEgbWVtYmVyIG9mIHRoZSBUYXJGaWxlIG9iamVjdC4KLSAgICAjIDQuIHJldHVybiB0YXJpbmZvIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCisgICAgIyAzLiBSZXR1cm4gdGFyaW5mbyBvciBhbm90aGVyIHZhbGlkIFRhckluZm8gb2JqZWN0LgorICAgIGRlZiBwcm9jX21lbWJlcihzZWxmLCB0YXJpbmZvKToKKyAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgdGFyaW5mbyBkZXBlbmRpbmcKKyAgICAgICAgICAgb24gaXRzIHR5cGUgYW5kIGNhbGwgaXQuCisgICAgICAgICIiIgorICAgICAgICBpZiB0YXJpbmZvLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19nbnVsb25nKHRhcmluZm8pCisgICAgICAgIGVsaWYgdGFyaW5mby50eXBlID09IEdOVVRZUEVfU1BBUlNFOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19zcGFyc2UodGFyaW5mbykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2NfYnVpbHRpbih0YXJpbmZvKQorCisgICAgZGVmIHByb2NfYnVpbHRpbihzZWxmLCB0YXJpbmZvKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIGJ1aWx0aW4gdHlwZSBtZW1iZXIgb3IgYW4gdW5rbm93biBtZW1iZXIKKyAgICAgICAgICAgd2hpY2ggd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSA9IHNlbGYub2Zmc2V0CisgICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBvciB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgICMgU2tpcCB0aGUgZm9sbG93aW5nIGRhdGEgYmxvY2tzLgorICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2VsZi5fYmxvY2sodGFyaW5mby5zaXplKQorICAgICAgICByZXR1cm4gdGFyaW5mbwogCiAgICAgZGVmIHByb2NfZ251bG9uZyhzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiRXZhbHVhdGUgdGhlIGJsb2NrcyB0aGF0IGhvbGQgYSBHTlUgbG9uZ25hbWUKKyAgICAgICAgIiIiUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgaG9sZCBhIEdOVSBsb25nbmFtZQogICAgICAgICAgICBvciBsb25nbGluayBtZW1iZXIuCiAgICAgICAgICIiIgogICAgICAgICBidWYgPSAiIgpAQCAtMTc1MiwyMSArMTg0MSwyNyBAQAogICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgICAgICBjb3VudCAtPSBCTE9DS1NJWkUKIAotICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlcgotICAgICAgICBuZXh0ID0gc2VsZi5uZXh0KCkKKyAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgYW5kIHByb2Nlc3MgaXQuCisgICAgICAgIGIgPSBzZWxmLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgIHQgPSBUYXJJbmZvLmZyb21idWYoYikKKyAgICAgICAgdC5vZmZzZXQgPSBzZWxmLm9mZnNldAorICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKKyAgICAgICAgbmV4dCA9IHNlbGYucHJvY19tZW1iZXIodCkKIAorICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBuZXh0IGhlYWRlciB3aXRoCisgICAgICAgICMgdGhlIGxvbmduYW1lIGluZm9ybWF0aW9uLgogICAgICAgICBuZXh0Lm9mZnNldCA9IHRhcmluZm8ub2Zmc2V0CiAgICAgICAgIGlmIHRhcmluZm8udHlwZSA9PSBHTlVUWVBFX0xPTkdOQU1FOgotICAgICAgICAgICAgbmV4dC5uYW1lID0gbnRzKGJ1ZikKKyAgICAgICAgICAgIG5leHQubmFtZSA9IGJ1Zi5yc3RyaXAoTlVMKQogICAgICAgICBlbGlmIHRhcmluZm8udHlwZSA9PSBHTlVUWVBFX0xPTkdMSU5LOgotICAgICAgICAgICAgbmV4dC5saW5rbmFtZSA9IG50cyhidWYpCisgICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gYnVmLnJzdHJpcChOVUwpCiAKICAgICAgICAgcmV0dXJuIG5leHQKIAogICAgIGRlZiBwcm9jX3NwYXJzZShzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiQW5hbHl6ZSBhIEdOVSBzcGFyc2UgaGVhZGVyIHBsdXMgZXh0cmEgaGVhZGVycy4KKyAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSBzcGFyc2UgaGVhZGVyIHBsdXMgZXh0cmEgaGVhZGVycy4KICAgICAgICAgIiIiCi0gICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoKQorICAgICAgICBidWYgPSB0YXJpbmZvLmJ1ZgogICAgICAgICBzcCA9IF9yaW5nYnVmZmVyKCkKICAgICAgICAgcG9zID0gMzg2CiAgICAgICAgIGxhc3Rwb3MgPSAwTApAQCAtMTc3NSw4ICsxODcwLDggQEAKICAgICAgICAgIyBmaXJzdCBoZWFkZXIuCiAgICAgICAgIGZvciBpIGluIHhyYW5nZSg0KToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBpbnQoYnVmW3Bvczpwb3MgKyAxMl0sIDgpCi0gICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBpbnQoYnVmW3BvcyArIDEyOnBvcyArIDI0XSwgOCkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCisgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgpAQCAtMTc4Nyw3ICsxODgyLDcgQEAKICAgICAgICAgICAgIHBvcyArPSAyNAogCiAgICAgICAgIGlzZXh0ZW5kZWQgPSBvcmQoYnVmWzQ4Ml0pCi0gICAgICAgIG9yaWdzaXplID0gaW50KGJ1Zls0ODM6NDk1XSwgOCkKKyAgICAgICAgb3JpZ3NpemUgPSBudGkoYnVmWzQ4Mzo0OTVdKQogCiAgICAgICAgICMgSWYgdGhlIGlzZXh0ZW5kZWQgZmxhZyBpcyBnaXZlbiwKICAgICAgICAgIyB0aGVyZSBhcmUgZXh0cmEgaGVhZGVycyB0byBwcm9jZXNzLgpAQCAtMTc5Nyw4ICsxODkyLDggQEAKICAgICAgICAgICAgIHBvcyA9IDAKICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMSk6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBpbnQoYnVmW3Bvczpwb3MgKyAxMl0sIDgpCi0gICAgICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gaW50KGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0sIDgpCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG50aShidWZbcG9zOnBvcyArIDEyXSkKKyAgICAgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgpAQCAtMTgxOCwxNyArMTkxMywxMSBAQAogICAgICAgICBzZWxmLm9mZnNldCArPSBzZWxmLl9ibG9jayh0YXJpbmZvLnNpemUpCiAgICAgICAgIHRhcmluZm8uc2l6ZSA9IG9yaWdzaXplCiAKLSAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQotICAgICAgICByZXR1cm4gdGFyaW5mbworICAgICAgICAjIENsZWFyIHRoZSBwcmVmaXggZmllbGQgc28gdGhhdCBpdCBpcyBub3QgdXNlZAorICAgICAgICAjIGFzIGEgcGF0aG5hbWUgaW4gbmV4dCgpLgorICAgICAgICB0YXJpbmZvLnByZWZpeCA9ICIiCiAKLSAgICAjIFRoZSB0eXBlIG1hcHBpbmcgZm9yIHRoZSBuZXh0KCkgbWV0aG9kLiBUaGUga2V5cyBhcmUgc2luZ2xlIGNoYXJhY3RlcgotICAgICMgc3RyaW5ncywgdGhlIHR5cGVmbGFnLiBUaGUgdmFsdWVzIGFyZSBtZXRob2RzIHdoaWNoIGFyZSBjYWxsZWQgd2hlbgotICAgICMgbmV4dCgpIGVuY291bnRlcnMgc3VjaCBhIHR5cGVmbGFnLgotICAgIFRZUEVfTUVUSCA9IHsKLSAgICAgICAgR05VVFlQRV9MT05HTkFNRTogcHJvY19nbnVsb25nLAotICAgICAgICBHTlVUWVBFX0xPTkdMSU5LOiBwcm9jX2dudWxvbmcsCi0gICAgICAgIEdOVVRZUEVfU1BBUlNFOiAgIHByb2Nfc3BhcnNlCi0gICAgfQorICAgICAgICByZXR1cm4gdGFyaW5mbwogCiAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CkBAIC0xODczLDkgKzE5NjIsOSBAQAogICAgICAgICAgICBjb3JyZXNwb25kcyB0byBUYXJGaWxlJ3MgbW9kZS4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiJXMgaXMgY2xvc2VkIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQogICAgICAgICBpZiBtb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLl9tb2RlIG5vdCBpbiBtb2RlOgotICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgImJhZCBvcGVyYXRpb24gZm9yIG1vZGUgJXIiICUgc2VsZi5fbW9kZQorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLl9tb2RlKQogCiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAiIiJQcm92aWRlIGFuIGl0ZXJhdG9yIG9iamVjdC4KQEAgLTIwMTEsNyArMjEwMCw3IEBACiAgICAgICAgIGVsaWYgY29tcHJlc3Npb24gPT0gVEFSX0daSVBQRUQ6CiAgICAgICAgICAgICBzZWxmLnRhcmZpbGUgPSBUYXJGaWxlLmd6b3BlbihmaWxlLCBtb2RlKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gY29uc3RhbnQiCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIGNvbnN0YW50IikKICAgICAgICAgaWYgbW9kZVswOjFdID09ICJyIjoKICAgICAgICAgICAgIG1lbWJlcnMgPSBzZWxmLnRhcmZpbGUuZ2V0bWVtYmVycygpCiAgICAgICAgICAgICBmb3IgbSBpbiBtZW1iZXJzOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZXhjZXB0aW9uX2hpZXJhcmNoeS50eHQgYi9MaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dAppbmRleCA5ZWQ5MmQwLi41ODEzMWQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dAorKysgYi9MaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dApAQCAtMTUsNiArMTUsNyBAQAogICAgICAgfCAgICB8ICAgICstLSBJT0Vycm9yCiAgICAgICB8ICAgIHwgICAgKy0tIE9TRXJyb3IKICAgICAgIHwgICAgfCAgICAgICAgICstLSBXaW5kb3dzRXJyb3IgKFdpbmRvd3MpCisgICAgICB8ICAgIHwgICAgICAgICArLS0gVk1TRXJyb3IgKFZNUykKICAgICAgIHwgICAgKy0tIEVPRkVycm9yCiAgICAgICB8ICAgICstLSBJbXBvcnRFcnJvcgogICAgICAgfCAgICArLS0gTG9va3VwRXJyb3IKQEAgLTQzLDQgKzQ0LDQgQEAKICAgICAgICAgICAgKy0tIFN5bnRheFdhcm5pbmcKICAgICAgICAgICAgKy0tIFVzZXJXYXJuaW5nCiAgICAgICAgICAgICstLSBGdXR1cmVXYXJuaW5nCi0JICAgKy0tIE92ZXJmbG93V2FybmluZyBbbm90IGdlbmVyYXRlZCBieSB0aGUgaW50ZXJwcmV0ZXJdCisJICAgKy0tIEltcG9ydFdhcm5pbmcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2xvZ2dpbmcgYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9sb2dnaW5nCmluZGV4IDdiZTNhM2UuLmMwZDZlMDYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2xvZ2dpbmcKKysrIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfbG9nZ2luZwpAQCAtNDg4LDEyICs0ODgsMTIgQEAKIC0tIGxvZ190ZXN0NCAgYmVnaW4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY29uZmlnMDogb2suCiBjb25maWcxOiBvay4KLWNvbmZpZzI6IDxjbGFzcyAnZXhjZXB0aW9ucy5BdHRyaWJ1dGVFcnJvcic+Ci1jb25maWczOiA8Y2xhc3MgJ2V4Y2VwdGlvbnMuS2V5RXJyb3InPgorY29uZmlnMjogPHR5cGUgJ2V4Y2VwdGlvbnMuQXR0cmlidXRlRXJyb3InPgorY29uZmlnMzogPHR5cGUgJ2V4Y2VwdGlvbnMuS2V5RXJyb3InPgogLS0gbG9nX3Rlc3Q0ICBlbmQgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAtLSBsb2dfdGVzdDUgIGJlZ2luICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEVSUk9SOnJvb3Q6anVzdCB0ZXN0aW5nCi08Y2xhc3MgJ2V4Y2VwdGlvbnMuS2V5RXJyb3InPi4uLiBEb24ndCBwYW5pYyEKKzx0eXBlICdleGNlcHRpb25zLktleUVycm9yJz4uLi4gRG9uJ3QgcGFuaWMhCiAtLSBsb2dfdGVzdDUgIGVuZCAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC0tIGxvZ3JlY3Ygb3V0cHV0IGJlZ2luICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEVSUiAtPiBDUklUSUNBTDogTWVzc2FnZSAwICh2aWEgbG9ncmVjdi50Y3AuRVJSKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IDg1ZTFkZWEuLjViOWRhNTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTQsNyArNCw4IEBACiBpbXBvcnQgcGlja2xldG9vbHMKIGltcG9ydCBjb3B5X3JlZwogCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkLCBoYXZlX3VuaWNvZGUsIFRFU1RGTgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZCwgaGF2ZV91bmljb2RlLCBURVNURk4sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl93aXRoX2xvY2FsZQogCiAjIFRlc3RzIHRoYXQgdHJ5IGEgbnVtYmVyIG9mIHBpY2tsZSBwcm90b2NvbHMgc2hvdWxkIGhhdmUgYQogIyAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKQEAgLTUyNyw2ICs1MjgsMTEgQEAKICAgICAgICAgICAgIGdvdCA9IHNlbGYubG9hZHMocCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgZ290KQogCisgICAgQHJ1bl93aXRoX2xvY2FsZSgnTENfQUxMJywgJ2RlX0RFJywgJ2ZyX0ZSJykKKyAgICBkZWYgdGVzdF9mbG9hdF9mb3JtYXQoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgZmxvYXRzIGFyZSBmb3JtYXR0ZWQgbG9jYWxlIGluZGVwZW5kZW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcygxLjIpWzA6M10sICdGMS4nKQorCiAgICAgZGVmIHRlc3RfcmVkdWNlKHNlbGYpOgogICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKaW5kZXggNTY2ZTU0Yi4uODY5NjFiMCAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvcmVncnRlc3QucHkKKysrIGIvTGliL3Rlc3QvcmVncnRlc3QucHkKQEAgLTI1LDYgKzI1LDcgQEAKIC1OOiBub2NvdmVyZGlyIC0tIFB1dCBjb3ZlcmFnZSBmaWxlcyBhbG9uZ3NpZGUgbW9kdWxlcwogLUw6IHJ1bmxlYWtzICAgLS0gcnVuIHRoZSBsZWFrcygxKSBjb21tYW5kIGp1c3QgYmVmb3JlIGV4aXQKIC1SOiBodW50cmxlYWtzIC0tIHNlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgdi4gc2xvdykKKy1NOiBtZW1saW1pdCAgIC0tIHJ1biB2ZXJ5IGxhcmdlIG1lbW9yeS1jb25zdW1pbmcgdGVzdHMKIAogSWYgbm9uLW9wdGlvbiBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIG5hbWVzIGZvciB0ZXN0cyB0byBydW4sCiB1bmxlc3MgLXggaXMgZ2l2ZW4sIGluIHdoaWNoIGNhc2UgdGhleSBhcmUgbmFtZXMgZm9yIHRlc3RzIG5vdCB0byBydW4uCkBAIC02Myw2ICs2NCwxOSBAQAogcmVwb3J0cyBhcmUgd3JpdHRlbiB0by4gIFRoZXNlIHBhcmFtZXRlcnMgYWxsIGhhdmUgZGVmYXVsdHMgKDUsIDQgYW5kCiAicmVmbG9nLnR4dCIgcmVzcGVjdGl2ZWx5KSwgc28gdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOjonLgogCistTSBydW5zIHRlc3RzIHRoYXQgcmVxdWlyZSBhbiBleG9yYml0YW50IGFtb3VudCBvZiBtZW1vcnkuIFRoZXNlIHRlc3RzCit0eXBpY2FsbHkgdHJ5IHRvIGFzY2VydGFpbiBjb250YWluZXJzIGtlZXAgd29ya2luZyB3aGVuIGNvbnRhaW5pbmcgbW9yZSB0aGFuCisyIGJpbGlvbiBvYmplY3RzLCBhbmQgb25seSB3b3JrIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGUgcGFzc2VkLWluIG1lbWxpbWl0LAord2hpY2ggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgJzIuNUdiJywgZGV0ZXJtaW5lcyBob3dtdWNoIG1lbW9yeSB0aGUKK3Rlc3RzIHdpbGwgbGltaXQgdGhlbXNlbHZlcyB0byAoYnV0IHRoZXkgbWF5IGdvIHNsaWdodGx5IG92ZXIuKSBUaGUgbnVtYmVyCitzaG91bGRuJ3QgYmUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgbWFjaGluZSBoYXMgKGluY2x1ZGluZyBzd2FwIG1lbW9yeSkuIFlvdQorc2hvdWxkIGFsc28ga2VlcCBpbiBtaW5kIHRoYXQgc3dhcCBtZW1vcnkgaXMgZ2VuZXJhbGx5IG11Y2gsIG11Y2ggc2xvd2VyCit0aGFuIFJBTSwgYW5kIHNldHRpbmcgbWVtbGltaXQgdG8gYWxsIGF2YWlsYWJsZSBSQU0gb3IgaGlnaGVyIHdpbGwgaGVhdmlseQordGF4IHRoZSBtYWNoaW5lLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaXMgbm8gdXNlIHJ1bm5pbmcgdGhlc2UgdGVzdHMgd2l0aCBhCitsaW1pdCBvZiBsZXNzIHRoYW4gMi41R2IsIGFuZCBtYW55IHJlcXVpcmUgbW9yZSB0aGFuIDIwR2IuIFRlc3RzIHRoYXQgZXhwZWN0Cit0byB1c2UgbW9yZSB0aGFuIG1lbWxpbWl0IG1lbW9yeSB3aWxsIGJlIHNraXBwZWQuIFRoZSBiaWctbWVtb3J5IHRlc3RzCitnZW5lcmFsbHkgcnVuIHZlcnksIHZlcnkgbG9uZy4KKwogLXUgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzIHRvIHJ1biwKIHN1Y2ggYXMgdGhvc2UgcmVxdWlyaW5nIGxhcmdlIGZpbGUgc3VwcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpdml0eS4KIFRoZSBhcmd1bWVudCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmRzIGluZGljYXRpbmcgdGhlCkBAIC0xMjQsNiArMTM4LDE0IEBACiAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJoZXgvb2N0IGNvbnN0YW50cyIsIEZ1dHVyZVdhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdHJpbmc+IikKIAorIyBJZ25vcmUgSW1wb3J0V2FybmluZ3MgdGhhdCBvbmx5IG9jY3VyIGluIHRoZSBzb3VyY2UgdHJlZSwKKyMgKGJlY2F1c2Ugb2YgbW9kdWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgc291cmNlLWRpcmVjdG9yaWVzIGluIE1vZHVsZXMvKQorZm9yIG1vZCBpbiAoImN0eXBlcyIsICJnemlwIiwgInppcGZpbGUiLCAidGFyZmlsZSIsICJlbmNvZGluZ3MuemxpYl9jb2RlYyIsCisgICAgICAgICAgICAidGVzdC50ZXN0X3ppcGltcG9ydCIsICJ0ZXN0LnRlc3RfemxpYiIsICJ0ZXN0LnRlc3RfemlwZmlsZSIsCisgICAgICAgICAgICAidGVzdC50ZXN0X2NvZGVjcyIsICJ0ZXN0LnN0cmluZ190ZXN0cyIpOgorICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKG1vZHVsZT0iLiolcyQiICUgKG1vZCwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iaWdub3JlIiwgY2F0ZWdvcnk9SW1wb3J0V2FybmluZykKKwogIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAogIyBmb3IgZGVlcGx5IHJlY3Vyc2l2ZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2Ugc2VlIHRoaXMgYXMgY3Jhc2hlcyBpbgogIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCkBAIC0xODAsMTIgKzIwMiwxMiBAQAogCiAgICAgdGVzdF9zdXBwb3J0LnJlY29yZF9vcmlnaW5hbF9zdGRvdXQoc3lzLnN0ZG91dCkKICAgICB0cnk6Ci0gICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2h2Z3F4c3JmOmx1OnQ6VEQ6TkxSOncnLAorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdodmdxeHNyZjpsdTp0OlREOk5MUjp3TTonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2hlbHAnLCAndmVyYm9zZScsICdxdWlldCcsICdnZW5lcmF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhjbHVkZScsICdzaW5nbGUnLCAncmFuZG9tJywgJ2Zyb21maWxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5kbGVha3MnLCAndXNlPScsICd0aHJlc2hvbGQ9JywgJ3RyYWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3ZlcmRpcj0nLCAnbm9jb3ZlcmRpcicsICdydW5sZWFrcycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHVudHJsZWFrcz0nLCAndmVyYm9zZTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h1bnRybGVha3M9JywgJ3ZlcmJvc2UyJywgJ21lbWxpbWl0PScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKICAgICAgICAgdXNhZ2UoMiwgbXNnKQpAQCAtMjQxLDYgKzI2Myw4IEBACiAgICAgICAgICAgICAgICAgaHVudHJsZWFrc1sxXSA9IGludChodW50cmxlYWtzWzFdKQogICAgICAgICAgICAgaWYgbGVuKGh1bnRybGVha3NbMl0pID09IDA6CiAgICAgICAgICAgICAgICAgaHVudHJsZWFrc1syXSA9ICJyZWZsb2cudHh0IgorICAgICAgICBlbGlmIG8gaW4gKCctTScsICctLW1lbWxpbWl0Jyk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuc2V0X21lbWxpbWl0KGEpCiAgICAgICAgIGVsaWYgbyBpbiAoJy11JywgJy0tdXNlJyk6CiAgICAgICAgICAgICB1ID0gW3gubG93ZXIoKSBmb3IgeCBpbiBhLnNwbGl0KCcsJyldCiAgICAgICAgICAgICBmb3IgciBpbiB1OgpAQCAtNTIxLDYgKzU0NSw3IEBACiAgICAgICAgICAgICAgICAgZGVmIGNsZWFudXAoKToKICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlLCB3YXJuaW5ncywgZGlyY2FjaGUKICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHVybHBhcnNlLCB1cmxsaWIsIHVybGxpYjIsIG1pbWV0eXBlcywgZG9jdGVzdAorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3RydWN0CiAgICAgICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBfcGF0aF9jcmVhdGVkCiAgICAgICAgICAgICAgICAgICAgIF9wYXRoX2NyZWF0ZWQuY2xlYXIoKQogICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gZnMKQEAgLTUzNyw2ICs1NjIsNyBAQAogICAgICAgICAgICAgICAgICAgICBkaXJjYWNoZS5yZXNldCgpCiAgICAgICAgICAgICAgICAgICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuX2NhY2hlLmNsZWFyKCkKICAgICAgICAgICAgICAgICAgICAgZG9jdGVzdC5tYXN0ZXIgPSBOb25lCiAgICAgICAgICAgICAgICAgaWYgaW5kaXJlY3RfdGVzdDoKICAgICAgICAgICAgICAgICAgICAgZGVmIHJ1bl90aGVfdGVzdCgpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5IGIvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CmluZGV4IGFhYjk4YzIuLjQ4OWFmMjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQorKysgYi9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKQEAgLTI0MywyOSArMjQzLDcyIEBACiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjIGQnXSwgJ2EgYiBjIGQnLCAnc3BsaXQnLCBOb25lLCAyKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgMykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCcsICdzcGxpdCcsIE5vbmUsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAnc3BsaXQnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLm1heGludC0xKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhIGIgYyBkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSBiIGMgZCddLCAnICBhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgMCkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MgIGQnXSwgJ2EgIGIgIGMgIGQnLCAnc3BsaXQnLCBOb25lLCAyKQogCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbXSwgJyAgICAgICAgICcsICdzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSwgJyAgYSAgICAnLCAnc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InXSwgJyAgYSAgICBiICAgJywgJ3NwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiICAgJ10sICcgIGEgICAgYiAgICcsICdzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYiAgIGMgICAnXSwgJyAgYSAgICBiICAgYyAgICcsICdzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjICAgJ10sICcgIGEgICAgYiAgIGMgICAnLCAnc3BsaXQnLCBOb25lLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InXSwgJ1xuXHRhIFx0XHIgYiBcdiAnLCAnc3BsaXQnKQorICAgICAgICBhYWEgPSAnIGEgJyoyMAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsIGFhYSwgJ3NwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddICsgW2FhYVs0Ol1dLCBhYWEsICdzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoxOSArIFsnYSAnXSwgYWFhLCAnc3BsaXQnLCBOb25lLCAxOSkKKwogICAgICAgICAjIGJ5IGEgY2hhcgogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhfGJ8Y3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAwKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2J8Y3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAxKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnY3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAyKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAzKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLAorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLm1heGludC0yKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhfGJ8Y3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAwKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJycsICdifHxjfHxkJ10sICdhfHxifHxjfHxkJywgJ3NwbGl0JywgJ3wnLCAyKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydlbmRjYXNlICcsICcnXSwgJ2VuZGNhc2UgfCcsICdzcGxpdCcsICd8JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBzdGFydGNhc2UnXSwgJ3wgc3RhcnRjYXNlJywgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnYm90aGNhc2UnLCAnJ10sICd8Ym90aGNhc2V8JywgJ3NwbGl0JywgJ3wnKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJycsICdiXHgwMGNceDAwZCddLCAnYVx4MDBceDAwYlx4MDBjXHgwMGQnLCAnc3BsaXQnLCAnXHgwMCcsIDIpCiAKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjIwLCAoJ2F8JyoyMClbOi0xXSwgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMTUgK1snYXxhfGF8YXxhJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYXwnKjIwKVs6LTFdLCAnc3BsaXQnLCAnfCcsIDE1KQorCiAgICAgICAgICMgYnkgc3RyaW5nCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2IvL2MvL2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nLCAxKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYy8vZCddLCAnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycsIDIpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nLCAzKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3NwbGl0JywgJy8vJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMubWF4aW50LTEwKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhLy9iLy9jLy9kJ10sICdhLy9iLy9jLy9kJywgJ3NwbGl0JywgJy8vJywgMCkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICcnLCAnYi8vLy9jLy8vL2QnXSwgJ2EvLy8vYi8vLy9jLy8vL2QnLCAnc3BsaXQnLCAnLy8nLCAyKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydlbmRjYXNlICcsICcnXSwgJ2VuZGNhc2UgdGVzdCcsICdzcGxpdCcsICd0ZXN0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBiZWdpbmNhc2UnXSwgJ3Rlc3QgYmVnaW5jYXNlJywgJ3NwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIGJvdGhjYXNlICcsICcnXSwgJ3Rlc3QgYm90aGNhc2UgdGVzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnc3BsaXQnLCAndGVzdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYmMnXSwgJ2FiYmJjJywgJ3NwbGl0JywgJ2JiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyddLCAnYWFhJywgJ3NwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhYSddLCAnYWFhJywgJ3NwbGl0JywgJ2FhYScsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FiJywgJ2FiJ10sICdhYmJhYWInLCAnc3BsaXQnLCAnYmEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYWFhJ10sICdhYWFhJywgJ3NwbGl0JywgJ2FhYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyddLCAnJywgJ3NwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhJ10sICdhYScsICdzcGxpdCcsICdhYWEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydBJywgJ2JvYmInXSwgJ0FiYm9iYmJvYmInLCAnc3BsaXQnLCAnYmJvYmInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydBJywgJ0InLCAnJ10sICdBYmJvYmJCYmJvYmInLCAnc3BsaXQnLCAnYmJvYmInKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgKCdhQkxBSCcqMjApWzotNF0sICdzcGxpdCcsICdCTEFIJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjIwLCAoJ2FCTEFIJyoyMClbOi00XSwgJ3NwbGl0JywgJ0JMQUgnLCAxOSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjE4ICsgWydhQkxBSGEnXSwgKCdhQkxBSCcqMjApWzotNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAnc3BsaXQnLCAnQkxBSCcsIDE4KQogCiAgICAgICAgICMgbWl4ZWQgdXNlIG9mIHN0ciBhbmQgdW5pY29kZQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoW3UnYScsIHUnYicsIHUnYyBkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgdScgJywgMikKQEAgLTI3Myw2ICszMTYsMTAgQEAKICAgICAgICAgIyBhcmd1bWVudCB0eXBlCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnc3BsaXQnLCA0MiwgNDIsIDQyKQogCisgICAgICAgICMgbnVsbCBjYXNlCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2hlbGxvJywgJ3NwbGl0JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2hlbGxvJywgJ3NwbGl0JywgJycsIDApCisKICAgICBkZWYgdGVzdF9yc3BsaXQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ3RoaXMnLCAnaXMnLCAndGhlJywgJ3JzcGxpdCcsICdmdW5jdGlvbiddLAogICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlzIGlzIHRoZSByc3BsaXQgZnVuY3Rpb24nLCAncnNwbGl0JykKQEAgLTI4MywyOSArMzMwLDc1IEBACiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwgMikKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCcsICdyc3BsaXQnLCBOb25lLCAzKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJywgJ3JzcGxpdCcsIE5vbmUsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5tYXhpbnQtMjApCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgYiBjIGQnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSBiIGMgZCddLCAnYSBiIGMgZCAgJywgJ3JzcGxpdCcsIE5vbmUsIDApCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgIGInLCAnYycsICdkJ10sICdhICBiICBjICBkJywgJ3JzcGxpdCcsIE5vbmUsIDIpCiAKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFtdLCAnICAgICAgICAgJywgJ3JzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSwgJyAgYSAgICAnLCAncnNwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJ10sICcgIGEgICAgYiAgICcsICdyc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycgIGEnLCAnYiddLCAnICBhICAgIGIgICAnLCAncnNwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnICBhICAgIGInLCdjJ10sICcgIGEgICAgYiAgIGMgICAnLCAncnNwbGl0JywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyAgYScsICdiJywgJ2MnXSwgJyAgYSAgICBiICAgYyAgICcsICdyc3BsaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJ10sICdcblx0YSBcdFxyIGIgXHYgJywgJ3JzcGxpdCcsIE5vbmUsIDg4KQorICAgICAgICBhYWEgPSAnIGEgJyoyMAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsIGFhYSwgJ3JzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbYWFhWzotNF1dICsgWydhJ10sIGFhYSwgJ3JzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyBhICBhJ10gKyBbJ2EnXSoxOCwgYWFhLCAncnNwbGl0JywgTm9uZSwgMTgpCisKKwogICAgICAgICAjIGJ5IGEgY2hhcgogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3JzcGxpdCcsICd8JykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYXxifGMnLCAnZCddLCAnYXxifGN8ZCcsICdyc3BsaXQnLCAnfCcsIDEpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnLCAyKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3JzcGxpdCcsICd8JywgMykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYXxifGN8ZCcsICdyc3BsaXQnLCAnfCcsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnLAorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLm1heGludC0xMDApCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YnxjfGQnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnLCAwKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhfHxifHxjJywgJycsICdkJ10sICdhfHxifHxjfHxkJywgJ3JzcGxpdCcsICd8JywgMikKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBiZWdpbmNhc2UnXSwgJ3wgYmVnaW5jYXNlJywgJ3JzcGxpdCcsICd8JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnZW5kY2FzZSAnLCAnJ10sICdlbmRjYXNlIHwnLCAncnNwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnYm90aGNhc2UnLCAnJ10sICd8Ym90aGNhc2V8JywgJ3JzcGxpdCcsICd8JykKKwogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhXHgwMFx4MDBiJywgJ2MnLCAnZCddLCAnYVx4MDBceDAwYlx4MDBjXHgwMGQnLCAncnNwbGl0JywgJ1x4MDAnLCAyKQogCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgKCdhfCcqMjApWzotMV0sICdyc3BsaXQnLCAnfCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YXxhfGF8YSddK1snYSddKjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgKCdhfCcqMjApWzotMV0sICdyc3BsaXQnLCAnfCcsIDE1KQorCiAgICAgICAgICMgYnkgc3RyaW5nCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYS8vYi8vYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3JzcGxpdCcsICcvLycsIDEpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EvL2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3JzcGxpdCcsICcvLycsIDIpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJywgMykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdyc3BsaXQnLCAnLy8nLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3JzcGxpdCcsICcvLycsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMubWF4aW50LTUpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EvL2IvL2MvL2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJywgMCkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYS8vLy9iLy8vL2MnLCAnJywgJ2QnXSwgJ2EvLy8vYi8vLy9jLy8vL2QnLCAncnNwbGl0JywgJy8vJywgMikKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBiZWdpbmNhc2UnXSwgJ3Rlc3QgYmVnaW5jYXNlJywgJ3JzcGxpdCcsICd0ZXN0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnZW5kY2FzZSAnLCAnJ10sICdlbmRjYXNlIHRlc3QnLCAncnNwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIGJvdGhjYXNlICcsICcnXSwgJ3Rlc3QgYm90aGNhc2UgdGVzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAncnNwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYicsICdjJ10sICdhYmJiYycsICdyc3BsaXQnLCAnYmInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnJ10sICdhYWEnLCAncnNwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhYSddLCAnYWFhJywgJ3JzcGxpdCcsICdhYWEnLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYicsICdhYiddLCAnYWJiYWFiJywgJ3JzcGxpdCcsICdiYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhYWEnXSwgJ2FhYWEnLCAncnNwbGl0JywgJ2FhYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyddLCAnJywgJ3JzcGxpdCcsICdhYWEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYSddLCAnYWEnLCAncnNwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2Jib2InLCAnQSddLCAnYmJvYmJib2JiQScsICdyc3BsaXQnLCAnYmJvYmInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnQicsICdBJ10sICdiYm9iYkJiYm9iYkEnLCAncnNwbGl0JywgJ2Jib2JiJykKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsICgnYUJMQUgnKjIwKVs6LTRdLCAncnNwbGl0JywgJ0JMQUgnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsICgnYUJMQUgnKjIwKVs6LTRdLCAncnNwbGl0JywgJ0JMQUgnLCAxOSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYUJMQUhhJ10gKyBbJ2EnXSoxOCwgKCdhQkxBSCcqMjApWzotNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAncnNwbGl0JywgJ0JMQUgnLCAxOCkKIAogICAgICAgICAjIG1peGVkIHVzZSBvZiBzdHIgYW5kIHVuaWNvZGUKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKFt1J2EgYicsIHUnYycsIHUnZCddLCAnYSBiIGMgZCcsICdyc3BsaXQnLCB1JyAnLCAyKQpAQCAtMzEzLDYgKzQwNiwxMCBAQAogICAgICAgICAjIGFyZ3VtZW50IHR5cGUKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyc3BsaXQnLCA0MiwgNDIsIDQyKQogCisgICAgICAgICMgbnVsbCBjYXNlCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2hlbGxvJywgJ3JzcGxpdCcsICcnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdoZWxsbycsICdyc3BsaXQnLCAnJywgMCkKKwogICAgIGRlZiB0ZXN0X3N0cmlwKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvJywgJyAgIGhlbGxvICAgJywgJ3N0cmlwJykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbyAgICcsICcgICBoZWxsbyAgICcsICdsc3RyaXAnKQpAQCAtMzc2LDYgKzQ3MywxNTggQEAKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzd2FwY2FzZScsIDQyKQogCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKKyAgICAgICAgRVEgPSBzZWxmLmNoZWNrZXF1YWwKKworICAgICAgICAjIE9wZXJhdGlvbnMgb24gdGhlIGVtcHR5IHN0cmluZworICAgICAgICBFUSgiIiwgIiIsICJyZXBsYWNlIiwgIiIsICIiKQorCisgICAgICAgICNFUSgiQSIsICIiLCAicmVwbGFjZSIsICIiLCAiQSIpCisgICAgICAgICMgVGhhdCB3YXMgdGhlIGNvcnJlY3QgcmVzdWx0OyB0aGlzIGlzIHRoZSByZXN1bHQgd2UgYWN0dWFsbHkgZ2V0CisgICAgICAgICMgbm93IChmb3Igc3RyLCBidXQgbm90IGZvciB1bmljb2RlKToKKyAgICAgICAgI0VRKCIiLCAiIiwgInJlcGxhY2UiLCAiIiwgIkEiKQorCisgICAgICAgIEVRKCIiLCAiIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiIiwgIiIsICJyZXBsYWNlIiwgIkEiLCAiQSIpCisgICAgICAgIEVRKCIiLCAiIiwgInJlcGxhY2UiLCAiIiwgIiIsIDEwMCkKKyAgICAgICAgRVEoIiIsICIiLCAicmVwbGFjZSIsICIiLCAiIiwgc3lzLm1heGludCkKKworICAgICAgICAjIGludGVybGVhdmUgKGZyb209PSIiLCAndG8nIGdldHMgaW5zZXJ0ZWQgZXZlcnl3aGVyZSkKKyAgICAgICAgRVEoIkEiLCAiQSIsICJyZXBsYWNlIiwgIiIsICIiKQorICAgICAgICBFUSgiKkEqIiwgIkEiLCAicmVwbGFjZSIsICIiLCAiKiIpCisgICAgICAgIEVRKCIqMUEqMSIsICJBIiwgInJlcGxhY2UiLCAiIiwgIioxIikKKyAgICAgICAgRVEoIiotI0EqLSMiLCAiQSIsICJyZXBsYWNlIiwgIiIsICIqLSMiKQorICAgICAgICBFUSgiKi1BKi1BKi0iLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iKQorICAgICAgICBFUSgiKi1BKi1BKi0iLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iLCAtMSkKKyAgICAgICAgRVEoIiotQSotQSotIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoIiotQSotQSotIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIiwgNCkKKyAgICAgICAgRVEoIiotQSotQSotIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIiwgMykKKyAgICAgICAgRVEoIiotQSotQSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIsIDIpCisgICAgICAgIEVRKCIqLUFBIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIiwgMSkKKyAgICAgICAgRVEoIkFBIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIiwgMCkKKworICAgICAgICAjIHNpbmdsZSBjaGFyYWN0ZXIgZGVsZXRpb24gKGZyb209PSJBIiwgdG89PSIiKQorICAgICAgICBFUSgiIiwgIkEiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCIiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgLTEpCisgICAgICAgIEVRKCIiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgNCkKKyAgICAgICAgRVEoIiIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDMpCisgICAgICAgIEVRKCJBIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMikKKyAgICAgICAgRVEoIkFBIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMSkKKyAgICAgICAgRVEoIkFBQSIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDApCisgICAgICAgIEVRKCIiLCAiQUFBQUFBQUFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIkJDRCIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiQkNEIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIC0xKQorICAgICAgICBFUSgiQkNEIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCJCQ0QiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgNSkKKyAgICAgICAgRVEoIkJDRCIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCA0KQorICAgICAgICBFUSgiQkNEQSIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAzKQorICAgICAgICBFUSgiQkNBREEiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMikKKyAgICAgICAgRVEoIkJBQ0FEQSIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAxKQorICAgICAgICBFUSgiQUJBQ0FEQSIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAwKQorICAgICAgICBFUSgiQkNEIiwgIkFCQ0FEIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiQkNEIiwgIkFCQ0FEQUEiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCJCQ0QiLCAiQkNEIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiKioqKioqKioqKioqKiIsICIqKioqKioqKioqKioqIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiXkFeIiwgIl4iKyJBIioxMDAwKyJeIiwgInJlcGxhY2UiLCAiQSIsICIiLCA5OTkpCisKKyAgICAgICAgIyBzdWJzdHJpbmcgZGVsZXRpb24gKGZyb209PSJ0aGUiLCB0bz09IiIpCisgICAgICAgIEVRKCIiLCAidGhlIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCJhdGVyIiwgInRoZWF0ZXIiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoIiIsICJ0aGV0aGUiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoIiIsICJ0aGV0aGV0aGV0aGUiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoImFhYWEiLCAidGhlYXRoZWF0aGVhdGhlYSIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgidGhhdCIsICJ0aGF0IiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCJ0aGFldCIsICJ0aGFldCIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgiaGVyZSBhbmQgcmUiLCAiaGVyZSBhbmQgdGhlcmUiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoImhlcmUgYW5kIHJlIGFuZCByZSIsICJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLAorICAgICAgICAgICAicmVwbGFjZSIsICJ0aGUiLCAiIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoImhlcmUgYW5kIHJlIGFuZCByZSIsICJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLAorICAgICAgICAgICAicmVwbGFjZSIsICJ0aGUiLCAiIiwgLTEpCisgICAgICAgIEVRKCJoZXJlIGFuZCByZSBhbmQgcmUiLCAiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAidGhlIiwgIiIsIDMpCisgICAgICAgIEVRKCJoZXJlIGFuZCByZSBhbmQgcmUiLCAiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAidGhlIiwgIiIsIDIpCisgICAgICAgIEVRKCJoZXJlIGFuZCByZSBhbmQgdGhlcmUiLCAiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAidGhlIiwgIiIsIDEpCisgICAgICAgIEVRKCJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLCAiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAidGhlIiwgIiIsIDApCisgICAgICAgIEVRKCJoZXJlIGFuZCByZSBhbmQgcmUiLCAiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisKKyAgICAgICAgRVEoImFiYyIsICJhYmMiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoImFiY2RlZmciLCAiYWJjZGVmZyIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorCisgICAgICAgICMgc3Vic3RyaW5nIGRlbGV0aW9uIChmcm9tPT0iYm9iIiwgdG89PSIiKQorICAgICAgICBFUSgiYm9iIiwgImJib2JvYiIsICJyZXBsYWNlIiwgImJvYiIsICIiKQorICAgICAgICBFUSgiYm9iWGJvYiIsICJiYm9ib2JYYmJvYm9iIiwgInJlcGxhY2UiLCAiYm9iIiwgIiIpCisgICAgICAgIEVRKCJhYWFhYWFhIiwgImFhYWFhYWFib2IiLCAicmVwbGFjZSIsICJib2IiLCAiIikKKyAgICAgICAgRVEoImFhYWFhYWEiLCAiYWFhYWFhYSIsICJyZXBsYWNlIiwgImJvYiIsICIiKQorCisgICAgICAgICMgc2luZ2xlIGNoYXJhY3RlciByZXBsYWNlIGluIHBsYWNlIChsZW4oZnJvbSk9PWxlbih0byk9PTEpCisgICAgICAgIEVRKCJXaG8gZ29lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJvIikKKyAgICAgICAgRVEoIldoTyBnT2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIk8iKQorICAgICAgICBFUSgiV2hPIGdPZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAiTyIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCJXaE8gZ09lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJPIiwgLTEpCisgICAgICAgIEVRKCJXaE8gZ09lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJPIiwgMykKKyAgICAgICAgRVEoIldoTyBnT2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIk8iLCAyKQorICAgICAgICBFUSgiV2hPIGdvZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAiTyIsIDEpCisgICAgICAgIEVRKCJXaG8gZ29lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJPIiwgMCkKKworICAgICAgICBFUSgiV2hvIGdvZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgImEiLCAicSIpCisgICAgICAgIEVRKCJ3aG8gZ29lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAiVyIsICJ3IikKKyAgICAgICAgRVEoInd3aG8gZ29lcyB0aGVyZT93dyIsICJXV2hvIGdvZXMgdGhlcmU/V1ciLCAicmVwbGFjZSIsICJXIiwgInciKQorICAgICAgICBFUSgiV2hvIGdvZXMgdGhlcmUhIiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIj8iLCAiISIpCisgICAgICAgIEVRKCJXaG8gZ29lcyB0aGVyZSEhIiwgIldobyBnb2VzIHRoZXJlPz8iLCAicmVwbGFjZSIsICI/IiwgIiEiKQorCisgICAgICAgIEVRKCJXaG8gZ29lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAiLiIsICIhIikKKworICAgICAgICAjIHN1YnN0cmluZyByZXBsYWNlIGluIHBsYWNlIChsZW4oZnJvbSk9PWxlbih0bykgPiAxKQorICAgICAgICBFUSgiVGgqKiAqKiBhIHQqKnN1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiKQorICAgICAgICBFUSgiVGgqKiAqKiBhIHQqKnN1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiVGgqKiAqKiBhIHQqKnN1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiLCAtMSkKKyAgICAgICAgRVEoIlRoKiogKiogYSB0KipzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIiwgNCkKKyAgICAgICAgRVEoIlRoKiogKiogYSB0KipzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIiwgMykKKyAgICAgICAgRVEoIlRoKiogKiogYSB0aXNzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIiwgMikKKyAgICAgICAgRVEoIlRoKiogaXMgYSB0aXNzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIiwgMSkKKyAgICAgICAgRVEoIlRoaXMgaXMgYSB0aXNzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIiwgMCkKKyAgICAgICAgRVEoImNvYm9iIiwgImJvYm9iIiwgInJlcGxhY2UiLCAiYm9iIiwgImNvYiIpCisgICAgICAgIEVRKCJjb2JvYlhjb2JvY29iIiwgImJvYm9iWGJvYm9ib2IiLCAicmVwbGFjZSIsICJib2IiLCAiY29iIikKKyAgICAgICAgRVEoImJvYm9iIiwgImJvYm9iIiwgInJlcGxhY2UiLCAiYm90IiwgImJvdCIpCisKKyAgICAgICAgIyByZXBsYWNlIHNpbmdsZSBjaGFyYWN0ZXIgKGxlbihmcm9tKT09MSwgbGVuKHRvKT4xKQorICAgICAgICBFUSgiUmV5S0tqYXZpS0siLCAiUmV5a2phdmlrIiwgInJlcGxhY2UiLCAiayIsICJLSyIpCisgICAgICAgIEVRKCJSZXlLS2phdmlLSyIsICJSZXlramF2aWsiLCAicmVwbGFjZSIsICJrIiwgIktLIiwgLTEpCisgICAgICAgIEVRKCJSZXlLS2phdmlLSyIsICJSZXlramF2aWsiLCAicmVwbGFjZSIsICJrIiwgIktLIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoIlJleUtLamF2aUtLIiwgIlJleWtqYXZpayIsICJyZXBsYWNlIiwgImsiLCAiS0siLCAyKQorICAgICAgICBFUSgiUmV5S0tqYXZpayIsICJSZXlramF2aWsiLCAicmVwbGFjZSIsICJrIiwgIktLIiwgMSkKKyAgICAgICAgRVEoIlJleWtqYXZpayIsICJSZXlramF2aWsiLCAicmVwbGFjZSIsICJrIiwgIktLIiwgMCkKKyAgICAgICAgRVEoIkEtLS0tQi0tLS1DLS0tLSIsICJBLkIuQy4iLCAicmVwbGFjZSIsICIuIiwgIi0tLS0iKQorCisgICAgICAgIEVRKCJSZXlramF2aWsiLCAiUmV5a2phdmlrIiwgInJlcGxhY2UiLCAicSIsICJLSyIpCisKKyAgICAgICAgIyByZXBsYWNlIHN1YnN0cmluZyAobGVuKGZyb20pPjEsIGxlbih0bykhPWxlbihmcm9tKSkKKyAgICAgICAgRVEoImhhbSwgaGFtLCBlZ2dzIGFuZCBoYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIikKKyAgICAgICAgRVEoImhhbSwgaGFtLCBlZ2dzIGFuZCBoYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoImhhbSwgaGFtLCBlZ2dzIGFuZCBoYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIiwgLTEpCisgICAgICAgIEVRKCJoYW0sIGhhbSwgZWdncyBhbmQgaGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIsIDQpCisgICAgICAgIEVRKCJoYW0sIGhhbSwgZWdncyBhbmQgaGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIsIDMpCisgICAgICAgIEVRKCJoYW0sIGhhbSwgZWdncyBhbmQgc3BhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iLCAyKQorICAgICAgICBFUSgiaGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIsIDEpCisgICAgICAgIEVRKCJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIsIDApCisKKyAgICAgICAgRVEoImJvYm9iIiwgImJvYm9ib2IiLCAicmVwbGFjZSIsICJib2JvYiIsICJib2IiKQorICAgICAgICBFUSgiYm9ib2JYYm9ib2IiLCAiYm9ib2JvYlhib2JvYm9iIiwgInJlcGxhY2UiLCAiYm9ib2IiLCAiYm9iIikKKyAgICAgICAgRVEoIkJPQk9CT0IiLCAiQk9CT0JPQiIsICJyZXBsYWNlIiwgImJvYiIsICJib2JieSIpCisKKyAgICAgICAgIwogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZUB0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICdAJywgMSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmV0d290aHJlZScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnJykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmVAdHdvQHRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnQCcsIDIpCkBAIC00MDMsNiArNjUyLDE1IEBACiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmVwbGFjZScsIDQyLCAnaCcpCiAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmVwbGFjZScsICdoJywgNDIpCiAKKyAgICBkZWYgdGVzdF9yZXBsYWNlX292ZXJmbG93KHNlbGYpOgorICAgICAgICAjIENoZWNrIGZvciBvdmVyZmxvdyBjaGVja2luZyBvbiAzMiBiaXQgbWFjaGluZXMKKyAgICAgICAgaWYgc3lzLm1heGludCAhPSAyMTQ3NDgzNjQ3OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIEEyXzE2ID0gIkEiICogKDIqKjE2KQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsIEEyXzE2LCAicmVwbGFjZSIsICIiLCBBMl8xNikKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCBBMl8xNiwgInJlcGxhY2UiLCAiQSIsIEEyXzE2KQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsIEEyXzE2LCAicmVwbGFjZSIsICJBQSIsIEEyXzE2K0EyXzE2KQorCiAgICAgZGVmIHRlc3RfemZpbGwoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnMTIzJywgJzEyMycsICd6ZmlsbCcsIDIpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnMTIzJywgJzEyMycsICd6ZmlsbCcsIDMpCkBAIC03MjAsNiArOTc4LDU1IEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2NhbGwoZm9ybWF0LCAiX19tb2RfXyIsIHZhbHVlKQogCisgICAgZGVmIHRlc3RfaW5wbGFjZV9yZXdyaXRlcyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHN0cmluZ3MgZG9uJ3QgY29weSBhbmQgbW9kaWZ5IGNhY2hlZCBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZ3MKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhJywgJ0EnLCAnbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0EnLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnQScsICdhJywgJ3VwcGVyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhJywgJ2lzbG93ZXInKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYScsICdBJywgJ3JlcGxhY2UnLCAnQScsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdBJywgJ2lzdXBwZXInKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnQScsICdhJywgJ2NhcGl0YWxpemUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBJywgJ2EnLCAnc3dhcGNhc2UnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBJywgJ2EnLCAndGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisKKyAgICBkZWYgdGVzdF9wYXJ0aXRpb24oc2VsZik6CisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgndGhpcyBpcyB0aGUgcGFyJywgJ3RpJywgJ3Rpb24gbWV0aG9kJyksCisgICAgICAgICAgICAndGhpcyBpcyB0aGUgcGFydGl0aW9uIG1ldGhvZCcsICdwYXJ0aXRpb24nLCAndGknKQorCisgICAgICAgICMgZnJvbSByYXltb25kJ3Mgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbgorICAgICAgICBTID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnaHR0cCcsICc6Ly8nLCAnd3d3LnB5dGhvbi5vcmcnKSwgUywgJ3BhcnRpdGlvbicsICc6Ly8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi5vcmcnLCAnJywgJycpLCBTLCAncGFydGl0aW9uJywgJz8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCcnLCAnaHR0cDovLycsICd3d3cucHl0aG9uLm9yZycpLCBTLCAncGFydGl0aW9uJywgJ2h0dHA6Ly8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi4nLCAnb3JnJywgJycpLCBTLCAncGFydGl0aW9uJywgJ29yZycpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCBTLCAncGFydGl0aW9uJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCBTLCAncGFydGl0aW9uJywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JwYXJ0aXRpb24oc2VsZik6CisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgndGhpcyBpcyB0aGUgcnBhcnRpJywgJ3RpJywgJ29uIG1ldGhvZCcpLAorICAgICAgICAgICAgJ3RoaXMgaXMgdGhlIHJwYXJ0aXRpb24gbWV0aG9kJywgJ3JwYXJ0aXRpb24nLCAndGknKQorCisgICAgICAgICMgZnJvbSByYXltb25kJ3Mgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbgorICAgICAgICBTID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnaHR0cCcsICc6Ly8nLCAnd3d3LnB5dGhvbi5vcmcnKSwgUywgJ3JwYXJ0aXRpb24nLCAnOi8vJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnaHR0cDovL3d3dy5weXRob24ub3JnJywgJycsICcnKSwgUywgJ3JwYXJ0aXRpb24nLCAnPycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJycsICdodHRwOi8vJywgJ3d3dy5weXRob24ub3JnJyksIFMsICdycGFydGl0aW9uJywgJ2h0dHA6Ly8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi4nLCAnb3JnJywgJycpLCBTLCAncnBhcnRpdGlvbicsICdvcmcnKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgUywgJ3JwYXJ0aXRpb24nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsIFMsICdycGFydGl0aW9uJywgTm9uZSkKKwogCiBjbGFzcyBNaXhpblN0clN0cmluZ1VzZXJTdHJpbmdUZXN0OgogICAgICMgQWRkaXRpb25hbCB0ZXN0cyBmb3IgOGJpdCBzdHJpbmdzLCBpLmUuIHN0ciwgVXNlclN0cmluZyBhbmQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5IGIvTGliL3Rlc3QvdGVzdF9iaWdtZW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1NDI4ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0wLDAgKzEsOTY0IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgYmlnbWVtdGVzdCwgXzFHLCBfMkcKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKKworIyBCaWdtZW0gdGVzdGluZyBob3VzZXJ1bGVzOgorIworIyAgLSBUcnkgbm90IHRvIGFsbG9jYXRlIHRvbyBtYW55IGxhcmdlIG9iamVjdHMuIEl0J3Mgb2theSB0byByZWx5IG9uCisjICAgIHJlZmNvdW50aW5nIHNlbWFudGljcywgYnV0IGRvbid0IGZvcmdldCB0aGF0ICdzID0gY3JlYXRlX2xhcmdlc3RyaW5nKCknCisjICAgIGRvZXNuJ3QgcmVsZWFzZSB0aGUgb2xkICdzJyAoaWYgaXQgZXhpc3RzKSB1bnRpbCB3ZWxsIGFmdGVyIGl0cyBuZXcKKyMgICAgdmFsdWUgaGFzIGJlZW4gY3JlYXRlZC4gVXNlICdkZWwgcycgYmVmb3JlIHRoZSBjcmVhdGVfbGFyZ2VzdHJpbmcgY2FsbC4KKyMKKyMgIC0gRG8gKm5vdCogY29tcGFyZSBsYXJnZSBvYmplY3RzIHVzaW5nIGFzc2VydEVxdWFscyBvciBzaW1pbGFyLiBJdCdzIGEKKyMgICAgbGVuZ3R5IG9wZXJhdGlvbiBhbmQgdGhlIGVycm9ybWVzc2FnZSB3aWxsIGJlIHV0dGVybHkgdXNlbGVzcyBkdWUgdG8KKyMgICAgaXRzIHNpemUuIFRvIG1ha2Ugc3VyZSB3aGV0aGVyIGEgcmVzdWx0IGhhcyB0aGUgcmlnaHQgY29udGVudHMsIGJldHRlcgorIyAgICB0byB1c2UgdGhlIHN0cmlwIG9yIGNvdW50IG1ldGhvZHMsIG9yIGNvbXBhcmUgbWVhbmluZ2Z1bCBzbGljZXMuCisjCisjICAtIERvbid0IGZvcmdldCB0byB0ZXN0IGZvciBsYXJnZSBpbmRpY2VzLCBvZmZzZXRzIGFuZCByZXN1bHRzIGFuZCBzdWNoLAorIyAgICBpbiBhZGRpdGlvbiB0byBsYXJnZSBzaXplcy4KKyMKKyMgIC0gV2hlbiByZXBlYXRpbmcgYW4gb2JqZWN0IChzYXksIGEgc3Vic3RyaW5nLCBvciBhIHNtYWxsIGxpc3QpIHRvIGNyZWF0ZQorIyAgICBhIGxhcmdlIG9iamVjdCwgbWFrZSB0aGUgc3Vib2JqZWN0IG9mIGEgbGVuZ3RoIHRoYXQgaXMgbm90IGEgcG93ZXIgb2YKKyMgICAgMi4gVGhhdCB3YXksIGludC13cmFwcGluZyBwcm9ibGVtcyBhcmUgbW9yZSBlYXNpbHkgZGV0ZWN0ZWQuCisjCisjICAtIFdoaWxlIHRoZSBiaWdtZW10ZXN0IGRlY29yYXRvciBzcGVha3Mgb2YgJ21pbnNpemUnLCBhbGwgdGVzdHMgd2lsbAorIyAgICBhY3R1YWxseSBiZSBjYWxsZWQgd2l0aCBhIG11Y2ggc21hbGxlciBudW1iZXIgdG9vLCBpbiB0aGUgbm9ybWFsCisjICAgIHRlc3QgcnVuICg1S2IgY3VycmVudGx5LikgVGhpcyBpcyBzbyB0aGUgdGVzdHMgdGhlbXNlbHZlcyBnZXQgZnJlcXVlbnQKKyMgICAgdGVzdGluZyBDb25zZXF1ZW50bHksIGFsd2F5cyBtYWtlIGFsbCBsYXJnZSBhbGxvY2F0aW9ucyBiYXNlZCBvbiB0aGUKKyMgICAgcGFzc2VkLWluICdzaXplJywgYW5kIGRvbid0IHJlbHkgb24gdGhlIHNpemUgYmVpbmcgdmVyeSBsYXJnZS4gQWxzbywKKyMgICAgbWVtdXNlLXBlci1zaXplIHNob3VsZCByZW1haW4gc2FuZSAobGVzcyB0aGFuIGEgZmV3IHRob3VzYW5kKTsgaWYgeW91cgorIyAgICB0ZXN0IHVzZXMgbW9yZSwgYWRqdXN0ICdzaXplJyB1cHdhcmQsIGluc3RlYWQuCisKK2NsYXNzIFN0clRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9jYXBpdGFsaXplKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gJy0nICogc2l6ZSArIFNVQlNUUgorICAgICAgICBjYXBzID0gcy5jYXBpdGFsaXplKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY2Fwc1stbGVuKFNVQlNUUik6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVFIuY2FwaXRhbGl6ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjYXBzLmxzdHJpcCgnLScpLCBTVUJTVFIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9jZW50ZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSBTVUJTVFIuY2VudGVyKHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgbHBhZHNpemUgPSBycGFkc2l6ZSA9IChsZW4ocykgLSBsZW4oU1VCU1RSKSkgLy8gMgorICAgICAgICBpZiBsZW4ocykgJSAyOgorICAgICAgICAgICAgbHBhZHNpemUgKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzW2xwYWRzaXplOi1ycGFkc2l6ZV0sIFNVQlNUUikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5zdHJpcCgpLCBTVUJTVFIuc3RyaXAoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9ICcuJyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnLicpLCBzaXplKQorICAgICAgICBzICs9ICcuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCcuJyksIHNpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCcgJyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJ2knKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnaicpLCAwKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT0wLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHBhc3MKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9MCwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYsIHNpemUpOgorICAgICAgICBwYXNzCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfZW5kc3dpdGgoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSAnLScgKiBzaXplICsgU1VCU1RSCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmVuZHN3aXRoKFNVQlNUUikpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmVuZHN3aXRoKHMpKQorICAgICAgICBzMiA9ICcuLi4nICsgcworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoczIuZW5kc3dpdGgocykpCisgICAgICAgIHNlbGYuZmFpbElmKHMuZW5kc3dpdGgoJ2EnICsgU1VCU1RSKSkKKyAgICAgICAgc2VsZi5mYWlsSWYoU1VCU1RSLmVuZHN3aXRoKHMpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfZXhwYW5kdGFicyhzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICctJyAqIHNpemUKKyAgICAgICAgdGFic2l6ZSA9IDgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5leHBhbmR0YWJzKCksIHMpCisgICAgICAgIGRlbCBzCisgICAgICAgIHNsZW4sIHJlbWFpbmRlciA9IGRpdm1vZChzaXplLCB0YWJzaXplKQorICAgICAgICBzID0gJyAgICAgICBcdCcgKiBzbGVuCisgICAgICAgIHMgPSBzLmV4cGFuZHRhYnModGFic2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplIC0gcmVtYWluZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocy5zdHJpcCgnICcpKSwgMCkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzdWJsZW4gPSBsZW4oU1VCU1RSKQorICAgICAgICBzID0gJycuam9pbihbU1VCU1RSLCAnLScgKiBzaXplLCBTVUJTVFJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmZpbmQoJyAnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5maW5kKFNVQlNUUiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuZmluZCgnICcsIHN1YmxlbiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuZmluZChTVUJTVFIsIGxlbihTVUJTVFIpKSwgc3VibGVuICsgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5maW5kKCdpJyksIFNVQlNUUi5maW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuZmluZCgnaScsIHN1YmxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5maW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuZmluZCgnaScsIHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxlbiArIHNpemUgKyBTVUJTVFIuZmluZCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmZpbmQoJ2onKSwgLTEpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSAnJy5qb2luKFtTVUJTVFIsICctJyAqIHNpemUsIFNVQlNUUl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuaW5kZXgoJyAnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5pbmRleChTVUJTVFIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmluZGV4KCcgJywgc3VibGVuKSwgc3VibGVuICsgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5pbmRleChTVUJTVFIsIHN1YmxlbiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuaW5kZXgoJ2knKSwgU1VCU1RSLmluZGV4KCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuaW5kZXgoJ2knLCBzdWJsZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxlbiArIHNpemUgKyBTVUJTVFIuaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5pbmRleCgnaScsIHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxlbiArIHNpemUgKyBTVUJTVFIuaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcy5pbmRleCwgJ2onKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzYWxudW0oc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcxMjM0NTYnCisgICAgICAgIHMgPSAnYScgKiBzaXplICsgU1VCU1RSCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzYWxudW0oKSkKKyAgICAgICAgcyArPSAnLicKKyAgICAgICAgc2VsZi5mYWlsSWYocy5pc2FsbnVtKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaXNhbHBoYShzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJ3p6enp6enonCisgICAgICAgIHMgPSAnYScgKiBzaXplICsgU1VCU1RSCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzYWxwaGEoKSkKKyAgICAgICAgcyArPSAnLicKKyAgICAgICAgc2VsZi5mYWlsSWYocy5pc2FscGhhKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaXNkaWdpdChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKKyAgICAgICAgcyA9ICc5JyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNkaWdpdCgpKQorICAgICAgICBzICs9ICd6JworICAgICAgICBzZWxmLmZhaWxJZihzLmlzZGlnaXQoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9pc2xvd2VyKHNlbGYsIHNpemUpOgorICAgICAgICBjaGFycyA9ICcnLmpvaW4oWyBjaHIoYykgZm9yIGMgaW4gcmFuZ2UoMjU1KSBpZiBub3QgY2hyKGMpLmlzdXBwZXIoKSBdKQorICAgICAgICByZXBlYXRzID0gc2l6ZSAvLyBsZW4oY2hhcnMpICsgMgorICAgICAgICBzID0gY2hhcnMgKiByZXBlYXRzCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzbG93ZXIoKSkKKyAgICAgICAgcyArPSAnQScKKyAgICAgICAgc2VsZi5mYWlsSWYocy5pc2xvd2VyKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaXNzcGFjZShzZWxmLCBzaXplKToKKyAgICAgICAgd2hpdGVzcGFjZSA9ICcgXGZcblxyXHRcdicKKyAgICAgICAgcmVwZWF0cyA9IHNpemUgLy8gbGVuKHdoaXRlc3BhY2UpICsgMgorICAgICAgICBzID0gd2hpdGVzcGFjZSAqIHJlcGVhdHMKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNzcGFjZSgpKQorICAgICAgICBzICs9ICdqJworICAgICAgICBzZWxmLmZhaWxJZihzLmlzc3BhY2UoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9pc3RpdGxlKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnMTIzNDU2JworICAgICAgICBzID0gJycuam9pbihbJ0EnLCAnYScgKiBzaXplLCBTVUJTVFJdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5pc3RpdGxlKCkpCisgICAgICAgIHMgKz0gJ0EnCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzdGl0bGUoKSkKKyAgICAgICAgcyArPSAnYUEnCisgICAgICAgIHNlbGYuZmFpbElmKHMuaXN0aXRsZSgpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzdXBwZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIGNoYXJzID0gJycuam9pbihbIGNocihjKSBmb3IgYyBpbiByYW5nZSgyNTUpIGlmIG5vdCBjaHIoYykuaXNsb3dlcigpIF0pCisgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbihjaGFycykgKyAyCisgICAgICAgIHMgPSBjaGFycyAqIHJlcGVhdHMKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXN1cHBlcigpKQorICAgICAgICBzICs9ICdhJworICAgICAgICBzZWxmLmZhaWxJZihzLmlzdXBwZXIoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9qb2luKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJ0EnICogc2l6ZQorICAgICAgICB4ID0gcy5qb2luKFsnYWFhYWEnLCAnYmJiYmInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5jb3VudCgnYScpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LmNvdW50KCdiJyksIDUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh4LnN0YXJ0c3dpdGgoJ2FhYWFhQScpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoeC5lbmRzd2l0aCgnQWJiYmJiJykpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9sanVzdChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9IFNVQlNUUi5sanVzdChzaXplKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5zdGFydHN3aXRoKFNVQlNUUiArICcgICcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuc3RyaXAoKSwgU1VCU1RSLnN0cmlwKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9sb3dlcihzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICdBJyAqIHNpemUKKyAgICAgICAgcyA9IHMubG93ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJ2EnKSwgc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2xzdHJpcChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJ2FiYyBkZWYgZ2hpJworICAgICAgICBzID0gU1VCU1RSLnJqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5sc3RyaXAoKSwgU1VCU1RSLmxzdHJpcCgpKQorICAgICAgICBkZWwgcworICAgICAgICBzID0gU1VCU1RSLmxqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc3RyaXBwZWQgPSBzLmxzdHJpcCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJpcHBlZCBpcyBzKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmLCBzaXplKToKKyAgICAgICAgcmVwbGFjZW1lbnQgPSAnYScKKyAgICAgICAgcyA9ICcgJyAqIHNpemUKKyAgICAgICAgcyA9IHMucmVwbGFjZSgnICcsIHJlcGxhY2VtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQocmVwbGFjZW1lbnQpLCBzaXplKQorICAgICAgICBzID0gcy5yZXBsYWNlKHJlcGxhY2VtZW50LCAnICcsIHNpemUgLSA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQocmVwbGFjZW1lbnQpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWy0xMDpdLCAnICAgICAgYWFhYScpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfcmZpbmQoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSAnJy5qb2luKFtTVUJTVFIsICctJyAqIHNpemUsIFNVQlNUUl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmZpbmQoJyAnKSwgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5yZmluZCgnICcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnJmaW5kKFNVQlNUUiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmZpbmQoJyAnLCAwLCBzaXplKSwgU1VCU1RSLnJmaW5kKCcgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmZpbmQoU1VCU1RSLCAwLCBzdWJsZW4gKyBzaXplKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5yZmluZCgnaScpLCBzdWJsZW4gKyBzaXplICsgU1VCU1RSLnJmaW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmZpbmQoJ2knLCAwLCBzdWJsZW4pLCBTVUJTVFIucmZpbmQoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5yZmluZCgnaScsIDAsIHN1YmxlbiArIHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVFIucmZpbmQoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5yZmluZCgnaicpLCAtMSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9yaW5kZXgoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSAnJy5qb2luKFtTVUJTVFIsICctJyAqIHNpemUsIFNVQlNUUl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmluZGV4KCcgJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxlbiArIHNpemUgKyBTVUJTVFIucmluZGV4KCcgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmluZGV4KFNVQlNUUiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmluZGV4KCcgJywgMCwgc3VibGVuICsgc2l6ZSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVFIucmluZGV4KCcgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmluZGV4KFNVQlNUUiwgMCwgc3VibGVuICsgc2l6ZSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmluZGV4KCdpJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxlbiArIHNpemUgKyBTVUJTVFIucmluZGV4KCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMucmluZGV4KCdpJywgMCwgc3VibGVuKSwgU1VCU1RSLnJpbmRleCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnJpbmRleCgnaScsIDAsIHN1YmxlbiArIHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVFIucmluZGV4KCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHMucmluZGV4LCAnaicpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9yanVzdChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9IFNVQlNUUi5sanVzdChzaXplKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5zdGFydHN3aXRoKFNVQlNUUiArICcgICcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuc3RyaXAoKSwgU1VCU1RSLnN0cmlwKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9yc3RyaXAoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnJzdHJpcCgpLCBTVUJTVFIucnN0cmlwKCkpCisgICAgICAgIGRlbCBzCisgICAgICAgIHMgPSBTVUJTVFIucmp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQorICAgICAgICBzdHJpcHBlZCA9IHMucnN0cmlwKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmlwcGVkIGlzIHMpCisKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGFib3V0IHNpemUgYnl0ZXMgdG8gYnVpbGQgYSBzdHJpbmcsIGFuZCB0aGVuIGFib3V0CisgICAgIyBzcXJ0KHNpemUpIHN1YnN0cmluZ3Mgb2Ygc3FydChzaXplKSBpbiBzaXplIGFuZCBhIGxpc3QgdG8KKyAgICAjIGhvbGQgc3FydChzaXplKSBpdGVtcy4gSXQncyBjbG9zZSBidXQganVzdCBvdmVyIDJ4IHNpemUuCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yLjEpCisgICAgZGVmIHRlc3Rfc3BsaXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgICMgQ3J1ZGVseSBjYWxjdWxhdGUgYW4gZXN0aW1hdGUgc28gdGhhdCB0aGUgcmVzdWx0IG9mIHMuc3BsaXQgd29uJ3QKKyAgICAgICAgIyB0YWtlIHVwIGFuIGlub3JkaW5hdGUgYW1vdW50IG9mIG1lbW9yeQorICAgICAgICBjaHVua3NpemUgPSBpbnQoc2l6ZSAqKiAwLjUgKyAyKQorICAgICAgICBTVUJTVFIgPSAnYScgKyAnICcgKiBjaHVua3NpemUKKyAgICAgICAgcyA9IFNVQlNUUiAqIGNodW5rc2l6ZQorICAgICAgICBsID0gcy5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgY2h1bmtzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZXQobCksIHNldChbJ2EnXSkpCisgICAgICAgIGRlbCBsCisgICAgICAgIGwgPSBzLnNwbGl0KCdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBjaHVua3NpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZXQobCksIHNldChbJycsICcgJyAqIGNodW5rc2l6ZV0pKQorCisgICAgIyBBbGxvY2F0ZXMgYSBzdHJpbmcgb2YgdHdpY2Ugc2l6ZSAoYW5kIGJyaWVmbHkgdHdvKSBhbmQgYSBsaXN0IG9mCisgICAgIyBzaXplLiAgQmVjYXVzZSBvZiBpbnRlcm5hbCBhZmZhaXJzLCB0aGUgcy5zcGxpdCgpIGNhbGwgcHJvZHVjZXMgYQorICAgICMgbGlzdCBvZiBzaXplIHRpbWVzIHRoZSBzYW1lIG9uZS1jaGFyYWN0ZXIgc3RyaW5nLCBzbyB3ZSBvbmx5CisgICAgIyBzdWZmZXIgZm9yIHRoZSBsaXN0IHNpemUuIChPdGhlcndpc2UsIGl0J2QgY29zdCBhbm90aGVyIDQ4IHRpbWVzCisgICAgIyBzaXplIGluIGJ5dGVzISkgTmV2ZXJ0aGVsZXNzLCBhIGxpc3Qgb2Ygc2l6ZSB0YWtlcworICAgICMgOCpzaXplIGJ5dGVzLgorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgNSwgbWVtdXNlPTEwKQorICAgIGRlZiB0ZXN0X3NwbGl0X2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJyBhJyAqIHNpemUgKyAnICcKKyAgICAgICAgbCA9IHMuc3BsaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNldChsKSwgc2V0KFsnYSddKSkKKyAgICAgICAgZGVsIGwKKyAgICAgICAgbCA9IHMuc3BsaXQoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZXQobCksIHNldChbJyAnXSkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIuMSkKKyAgICBkZWYgdGVzdF9zcGxpdGxpbmVzKHNlbGYsIHNpemUpOgorICAgICAgICAjIENydWRlbHkgY2FsY3VsYXRlIGFuIGVzdGltYXRlIHNvIHRoYXQgdGhlIHJlc3VsdCBvZiBzLnNwbGl0IHdvbid0CisgICAgICAgICMgdGFrZSB1cCBhbiBpbm9yZGluYXRlIGFtb3VudCBvZiBtZW1vcnkKKyAgICAgICAgY2h1bmtzaXplID0gaW50KHNpemUgKiogMC41ICsgMikgLy8gMgorICAgICAgICBTVUJTVFIgPSAnICcgKiBjaHVua3NpemUgKyAnXG4nICsgJyAnICogY2h1bmtzaXplICsgJ1xyXG4nCisgICAgICAgIHMgPSBTVUJTVFIgKiBjaHVua3NpemUKKyAgICAgICAgbCA9IHMuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgY2h1bmtzaXplICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2V0KGwpLCBzZXQoWycgJyAqIGNodW5rc2l6ZV0pKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3N0YXJ0c3dpdGgoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSAnLScgKiBzaXplICsgU1VCU1RSCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgocykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoJy0nICogc2l6ZSkpCisgICAgICAgIHNlbGYuZmFpbElmKHMuc3RhcnRzd2l0aChTVUJTVFIpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X3N0cmlwKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnICAgYWJjIGRlZiBnaGkgICAnCisgICAgICAgIHMgPSBTVUJTVFIucmp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQorICAgICAgICBkZWwgcworICAgICAgICBzID0gU1VCU1RSLmxqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5zdHJpcCgpLCBTVUJTVFIuc3RyaXAoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9zd2FwY2FzZShzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gImFCY0RlRkcxMi4nXHhhOVx4MDAiCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIHN1YmxlbiArIDIKKyAgICAgICAgcyA9IFNVQlNUUiAqIHJlcGVhdHMKKyAgICAgICAgcyA9IHMuc3dhcGNhc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHN1YmxlbiAqIHJlcGVhdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbOnN1YmxlbiAqIDNdLCBTVUJTVFIuc3dhcGNhc2UoKSAqIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbLXN1YmxlbiAqIDM6XSwgU1VCU1RSLnN3YXBjYXNlKCkgKiAzKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3RpdGxlKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnU3BhYUhBYWFBYWhhbScKKyAgICAgICAgcyA9IFNVQlNUUiAqIChzaXplIC8vIGxlbihTVUJTVFIpICsgMikKKyAgICAgICAgcyA9IHMudGl0bGUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5zdGFydHN3aXRoKChTVUJTVFIgKiAzKS50aXRsZSgpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuZW5kc3dpdGgoU1VCU1RSLmxvd2VyKCkgKiAzKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHRyYW5zID0gc3RyaW5nLm1ha2V0cmFucygnLmFaJywgJy0hJCcpCisgICAgICAgIFNVQlNUUiA9ICdhWnouei5BYXouJworICAgICAgICBzdWJsZW4gPSBsZW4oU1VCU1RSKQorICAgICAgICByZXBlYXRzID0gc2l6ZSAvLyBzdWJsZW4gKyAyCisgICAgICAgIHMgPSBTVUJTVFIgKiByZXBlYXRzCisgICAgICAgIHMgPSBzLnRyYW5zbGF0ZSh0cmFucykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCByZXBlYXRzICogc3VibGVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWzpzdWJsZW5dLCBTVUJTVFIudHJhbnNsYXRlKHRyYW5zKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc1stc3VibGVuOl0sIFNVQlNUUi50cmFuc2xhdGUodHJhbnMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCcuJyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJyEnKSwgcmVwZWF0cyAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJ3onKSwgcmVwZWF0cyAqIDMpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDUsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3VwcGVyKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJ2EnICogc2l6ZQorICAgICAgICBzID0gcy51cHBlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnQScpLCBzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyMCwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfemZpbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICctNTY4MzI0NzIzNTk4MjM0JworICAgICAgICBzID0gU1VCU1RSLnpmaWxsKHNpemUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmVuZHN3aXRoKCcwJyArIFNVQlNUUlsxOl0pKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5zdGFydHN3aXRoKCctMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJzAnKSwgc2l6ZSAtIGxlbihTVUJTVFIpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJy0nICogc2l6ZQorICAgICAgICBzZiA9ICclcycgJSAocywpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzID09IHNmKQorICAgICAgICBkZWwgc2YKKyAgICAgICAgc2YgPSAnLi4lcy4uJyAlIChzLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHNmKSwgbGVuKHMpICsgNCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNmLnN0YXJ0c3dpdGgoJy4uLScpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2YuZW5kc3dpdGgoJy0uLicpKQorICAgICAgICBkZWwgcywgc2YKKworICAgICAgICBzaXplIC8vPSAyCisgICAgICAgIGVkZ2UgPSAnLScgKiBzaXplCisgICAgICAgIHMgPSAnJy5qb2luKFtlZGdlLCAnJXMnLCBlZGdlXSkKKyAgICAgICAgZGVsIGVkZ2UKKyAgICAgICAgcyA9IHMgJSAnLi4uJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUgKiAyICsgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnLicpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCctJyksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfcmVwcl9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICctJyAqIHNpemUKKyAgICAgICAgcyA9IHJlcHIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc1swXSwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWy0xXSwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCctJyksIHNpemUpCisgICAgICAgIGRlbCBzCisgICAgICAgICMgcmVwcigpIHdpbGwgY3JlYXRlIGEgc3RyaW5nIGZvdXIgdGltZXMgYXMgbGFyZ2UgYXMgdGhpcyAnYmluYXJ5CisgICAgICAgICMgc3RyaW5nJywgYnV0IHdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgbXVjaCBtb3JlIHRoYW4gdHdpY2UKKyAgICAgICAgIyBzaXplIGluIHRvdGFsLiAgKFdlIGRvIGV4dHJhIHRlc3RpbmcgaW4gdGVzdF9yZXByX2xhcmdlKCkpCisgICAgICAgIHNpemUgPSBzaXplIC8vIDUgKiAyCisgICAgICAgIHMgPSAnXHgwMCcgKiBzaXplCisgICAgICAgIHMgPSByZXByKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzKSwgc2l6ZSAqIDQgKyAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWzBdLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbLTFdLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJ1xcJyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJzAnKSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9NSkKKyAgICBkZWYgdGVzdF9yZXByX2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJ1x4MDAnICogc2l6ZQorICAgICAgICBzID0gcmVwcihzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUgKiA0ICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc1swXSwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWy0xXSwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCdcXCcpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCcwJyksIHNpemUgKiAyKQorCisgICAgIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2Z1bCBldmVuIHdpdGggc2l6ZSA8IDJHLCBhcyBsb25nIGFzIHRoZQorICAgICMgZG91YmxlZCBzdHJpbmcgaXMgPiAyRyAoYnV0IGl0IHRlc3RzIG1vcmUgaWYgYm90aCBhcmUgPiAyRyA6KQorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzFHICsgMiwgbWVtdXNlPTMpCisgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJy4nICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCisgICAgICAgIHMgPSBzICsgcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLmNvdW50KCcuJyksIHNpemUgKiAyKQorCisgICAgIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2Z1bCBldmVuIHdpdGggc2l6ZSA8IDJHLCBhcyBsb25nIGFzIHRoZQorICAgICMgcmVwZWF0ZWQgc3RyaW5nIGlzID4gMkcgKGJ1dCBpdCB0ZXN0cyBtb3JlIGlmIGJvdGggYXJlID4gMkcgOikKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8xRyArIDIsIG1lbXVzZT0zKQorICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICcuJyAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQorICAgICAgICBzID0gcyAqIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnLicpLCBzaXplICogMikKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMjAsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X3NsaWNlX2FuZF9nZXRpdGVtKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnMDEyMzQ1Njc4OScKKyAgICAgICAgc3VibGVuID0gbGVuKFNVQlNUUikKKyAgICAgICAgcyA9IFNVQlNUUiAqIChzaXplIC8vIHN1YmxlbikKKyAgICAgICAgc3RlcHNpemUgPSBsZW4ocykgLy8gMTAwCisgICAgICAgIHN0ZXBzaXplID0gc3RlcHNpemUgLSAoc3RlcHNpemUgJSBzdWJsZW4pCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzKSAtIHN0ZXBzaXplLCBzdGVwc2l6ZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzW2ldLCBTVUJTVFJbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzW2k6aSArIHN1Ymxlbl0sIFNVQlNUUikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbaTppICsgc3VibGVuOjJdLCBTVUJTVFJbOjoyXSkKKyAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbaSArIHN1YmxlbiAtIDE6aSAtIDE6LTNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlNUUltzdWJsZW46Oi0zXSkKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG8gc29tZSBzbGljaW5nIGFuZCBpbmRleGluZyBuZWFyIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICMgc3RyaW5nLCB0b28uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbbGVuKHMpIC0gMV0sIFNVQlNUUlstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbLTFdLCBTVUJTVFJbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzW2xlbihzKSAtIDEwXSwgU1VCU1RSWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWy1zdWJsZW5dLCBTVUJTVFJbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbbGVuKHMpOl0sICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzW2xlbihzKSAtIDE6XSwgU1VCU1RSWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc1stMTpdLCBTVUJTVFJbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzW2xlbihzKSAtIHN1YmxlbjpdLCBTVUJTVFIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbLXN1YmxlbjpdLCBTVUJTVFIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzWzpdKSwgbGVuKHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oc1s6bGVuKHMpIC0gNV0pLCBsZW4ocykgLSA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oc1s1Oi01XSksIGxlbihzKSAtIDEwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHMsIGxlbihzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgcywgbGVuKHMpICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgcywgbGVuKHMpICsgMTw8MzEpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcwMTIzNDU2Nzg5JworICAgICAgICBlZGdlID0gJy0nICogKHNpemUgLy8gMikKKyAgICAgICAgcyA9ICcnLmpvaW4oW2VkZ2UsIFNVQlNUUiwgZWRnZV0pCisgICAgICAgIGRlbCBlZGdlCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhTVUJTVFIgaW4gcykKKyAgICAgICAgc2VsZi5mYWlsSWYoU1VCU1RSICogMiBpbiBzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJy0nIGluIHMpCisgICAgICAgIHNlbGYuZmFpbElmKCdhJyBpbiBzKQorICAgICAgICBzICs9ICdhJworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ2EnIGluIHMpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYsIHNpemUpOgorICAgICAgICBzMSA9ICctJyAqIHNpemUKKyAgICAgICAgczIgPSAnLScgKiBzaXplCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzMSA9PSBzMikKKyAgICAgICAgZGVsIHMyCisgICAgICAgIHMyID0gczEgKyAnYScKKyAgICAgICAgc2VsZi5mYWlsSWYoczEgPT0gczIpCisgICAgICAgIGRlbCBzMgorICAgICAgICBzMiA9ICcuJyAqIHNpemUKKyAgICAgICAgc2VsZi5mYWlsSWYoczEgPT0gczIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYsIHNpemUpOgorICAgICAgICAjIE5vdCBzdXJlIGlmIHdlIGNhbiBkbyBhbnkgbWVhbmluZ2Z1bCB0ZXN0cyBoZXJlLi4uICBFdmVuIGlmIHdlCisgICAgICAgICMgc3RhcnQgcmVseWluZyBvbiB0aGUgZXhhY3QgYWxnb3JpdGhtIHVzZWQsIHRoZSByZXN1bHQgd2lsbCBiZQorICAgICAgICAjIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIEMgJ2xvbmcgaW50Jy4gIEV2ZW4gdGhpcworICAgICAgICAjIHRlc3QgaXMgZG9kZ3kgKHRoZXJlJ3Mgbm8gKmd1YXJhbnRlZSogdGhhdCB0aGUgdHdvIHRoaW5ncyBzaG91bGQKKyAgICAgICAgIyBoYXZlIGEgZGlmZmVyZW50IGhhc2gsIGV2ZW4gaWYgdGhleSwgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiwgYWxtb3N0IGFsd2F5cyBkby4pCisgICAgICAgIHMgPSAnXHgwMCcgKiBzaXplCisgICAgICAgIGgxID0gaGFzaChzKQorICAgICAgICBkZWwgcworICAgICAgICBzID0gJ1x4MDAnICogKHNpemUgKyAxKQorICAgICAgICBzZWxmLmZhaWxJZihoMSA9PSBoYXNoKHMpKQorCitjbGFzcyBUdXBsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBUdXBsZXMgaGF2ZSBhIHNtYWxsLCBmaXhlZC1zaXplZCBoZWFkIGFuZCBhbiBhcnJheSBvZiBwb2ludGVycyB0bworICAgICMgZGF0YS4gIFNpbmNlIHdlJ3JlIHRlc3RpbmcgNjQtYml0IGFkZHJlc3NpbmcsIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKKyAgICAjIHBvaW50ZXJzIGFyZSA4IGJ5dGVzLCBhbmQgdGhhdCB0aHVzIHRoYXQgdGhlIHR1cGxlcyB0YWtlIHVwIDggYnl0ZXMKKyAgICAjIHBlciBzaXplLgorCisgICAgIyBBcyBhIHNpZGUtZWZmZWN0IG9mIHRlc3RpbmcgbG9uZyB0dXBsZXMsIHRoZXNlIHRlc3RzIGhhcHBlbiB0byB0ZXN0CisgICAgIyBoYXZpbmcgbW9yZSB0aGFuIDI8PDMxIHJlZmVyZW5jZXMgdG8gYW55IGdpdmVuIG9iamVjdC4gSGVuY2UgdGhlCisgICAgIyB1c2Ugb2YgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdHMgYXMgY29udGVudHMgaW4gZGlmZmVyZW50IHRlc3RzLgorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9MTYpCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKKyAgICAgICAgdDEgPSAodScnLCkgKiBzaXplCisgICAgICAgIHQyID0gKHUnJywpICogc2l6ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDIpCisgICAgICAgIGRlbCB0MgorICAgICAgICB0MiA9ICh1JycsKSAqIChzaXplICsgMSkKKyAgICAgICAgc2VsZi5mYWlsSWYodDEgPT0gdDIpCisgICAgICAgIGRlbCB0MgorICAgICAgICB0MiA9ICgxLCkgKiBzaXplCisgICAgICAgIHNlbGYuZmFpbElmKHQxID09IHQyKQorCisgICAgIyBUZXN0IGNvbmNhdGVuYXRpbmcgaW50byBhIHNpbmdsZSB0dXBsZSBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoLAorICAgICMgYW5kIGNvbmNhdGVuYXRpbmcgYSB0dXBsZSBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoIHNlcGFyYXRlbHksIHNvCisgICAgIyB0aGUgc21hbGxlciB0ZXN0IHN0aWxsIGdldHMgcnVuIGV2ZW4gaWYgdGhlcmUgaXNuJ3QgbWVtb3J5IGZvciB0aGUKKyAgICAjIGxhcmdlciB0ZXN0IChidXQgd2Ugc3RpbGwgbGV0IHRoZSB0ZXN0ZXIga25vdyB0aGUgbGFyZ2VyIHRlc3QgaXMKKyAgICAjIHNraXBwZWQsIGluIHZlcmJvc2UgbW9kZS4pCisgICAgZGVmIGJhc2ljX2NvbmNhdF90ZXN0KHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKCgpLCkgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih0KSwgc2l6ZSkKKyAgICAgICAgdCA9IHQgKyB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih0KSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X2NvbmNhdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfY29uY2F0X3Rlc3Qoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X2NvbmNhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfY29uY2F0X3Rlc3Qoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyAxMCwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKDEsIDIsIDMsIDQsIDUpICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4odCksIHNpemUgKiA1KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoNSBpbiB0KQorICAgICAgICBzZWxmLmZhaWxJZigoMSwgMiwgMywgNCwgNSkgaW4gdCkKKyAgICAgICAgc2VsZi5mYWlsSWYoMCBpbiB0KQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTgpCisgICAgZGVmIHRlc3RfaGFzaChzZWxmLCBzaXplKToKKyAgICAgICAgdDEgPSAoMCwpICogc2l6ZQorICAgICAgICBoMSA9IGhhc2godDEpCisgICAgICAgIGRlbCB0MQorICAgICAgICB0MiA9ICgwLCkgKiAoc2l6ZSArIDEpCisgICAgICAgIHNlbGYuZmFpbElmKGgxID09IGhhc2godDIpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTgpCisgICAgZGVmIHRlc3RfaW5kZXhfYW5kX3NsaWNlKHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKE5vbmUsKSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHQpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0Wy0xXSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFs1XSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFtzaXplIC0gMV0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHQsIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRbOjVdLCAoTm9uZSwpICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFstNTpdLCAoTm9uZSwpICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFsyMDoyNV0sIChOb25lLCkgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0Wy0yNTotMjBdLCAoTm9uZSwpICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFtzaXplIC0gNTpdLCAoTm9uZSwpICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFtzaXplIC0gNTpzaXplXSwgKE5vbmUsKSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRbc2l6ZSAtIDY6c2l6ZSAtIDJdLCAoTm9uZSwpICogNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFtzaXplOnNpemVdLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModFtzaXplOnNpemUrNV0sICgpKQorCisgICAgIyBMaWtlIHRlc3RfY29uY2F0LCBzcGxpdCBpbiB0d28uCisgICAgZGVmIGJhc2ljX3Rlc3RfcmVwZWF0KHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKCcnLCkgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih0KSwgc2l6ZSkKKyAgICAgICAgdCA9IHQgKiAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih0KSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgICMgTGlrZSB0ZXN0X2NvbmNhdCwgc3BsaXQgaW4gdHdvLgorICAgIGRlZiBiYXNpY190ZXN0X3JlcHIoc2VsZiwgc2l6ZSk6CisgICAgICAgIHQgPSAoMCwpICogc2l6ZQorICAgICAgICBzID0gcmVwcih0KQorICAgICAgICAjIFRoZSByZXByIG9mIGEgdHVwbGUgb2YgMCdzIGlzIGV4YWN0bHkgdGhyZWUgdGltZXMgdGhlIHR1cGxlIGxlbmd0aC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplICogMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc1s6NV0sICcoMCwgMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbLTU6XSwgJzAsIDApJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnMCcpLCBzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMyArIDIsIG1lbXVzZT04ICsgMykKKyAgICBkZWYgdGVzdF9yZXByX3NtYWxsKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X3JlcHIoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTggKyAzKQorICAgIGRlZiB0ZXN0X3JlcHJfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfcmVwcihzaXplKQorCitjbGFzcyBMaXN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIExpa2UgdHVwbGVzLCBsaXN0cyBoYXZlIGEgc21hbGwsIGZpeGVkLXNpemVkIGhlYWQgYW5kIGFuIGFycmF5IG9mCisgICAgIyBwb2ludGVycyB0byBkYXRhLCBzbyA4IGJ5dGVzIHBlciBzaXplLiBBbHNvIGxpa2UgdHVwbGVzLCB3ZSBtYWtlIHRoZQorICAgICMgbGlzdHMgaG9sZCByZWZlcmVuY2VzIHRvIHZhcmlvdXMgb2JqZWN0cyB0byB0ZXN0IHRoZWlyIHJlZmNvdW50CisgICAgIyBsaW1pdHMuCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0xNikKKyAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYsIHNpemUpOgorICAgICAgICBsMSA9IFt1JyddICogc2l6ZQorICAgICAgICBsMiA9IFt1JyddICogc2l6ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobDEgPT0gbDIpCisgICAgICAgIGRlbCBsMgorICAgICAgICBsMiA9IFt1JyddICogKHNpemUgKyAxKQorICAgICAgICBzZWxmLmZhaWxJZihsMSA9PSBsMikKKyAgICAgICAgZGVsIGwyCisgICAgICAgIGwyID0gWzJdICogc2l6ZQorICAgICAgICBzZWxmLmZhaWxJZihsMSA9PSBsMikKKworICAgICMgVGVzdCBjb25jYXRlbmF0aW5nIGludG8gYSBzaW5nbGUgbGlzdCBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoLAorICAgICMgYW5kIGNvbmNhdGVuYXRpbmcgYSBsaXN0IG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGggc2VwYXJhdGVseSwgc28KKyAgICAjIHRoZSBzbWFsbGVyIHRlc3Qgc3RpbGwgZ2V0cyBydW4gZXZlbiBpZiB0aGVyZSBpc24ndCBtZW1vcnkgZm9yIHRoZQorICAgICMgbGFyZ2VyIHRlc3QgKGJ1dCB3ZSBzdGlsbCBsZXQgdGhlIHRlc3RlciBrbm93IHRoZSBsYXJnZXIgdGVzdCBpcworICAgICMgc2tpcHBlZCwgaW4gdmVyYm9zZSBtb2RlLikKKyAgICBkZWYgYmFzaWNfdGVzdF9jb25jYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbW11dICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIGwgPSBsICsgbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMiArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9jb25jYXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfY29uY2F0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9jb25jYXRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfY29uY2F0KHNpemUpCisKKyAgICBkZWYgYmFzaWNfdGVzdF9pbnBsYWNlX2NvbmNhdChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFtzeXMuc3Rkb3V0XSAqIHNpemUKKyAgICAgICAgbCArPSBsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSAqIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsWzBdIGlzIGxbLTFdKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobFtzaXplIC0gMV0gaXMgbFtzaXplICsgMV0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X2lucGxhY2VfY29uY2F0X3NtYWxsKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2lucGxhY2VfY29uY2F0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9pbnBsYWNlX2NvbmNhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9pbnBsYWNlX2NvbmNhdChzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gNSArIDEwLCBtZW11c2U9OCAqIDUpCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMSwgMiwgMywgNCwgNV0gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSAqIDUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyg1IGluIGwpCisgICAgICAgIHNlbGYuZmFpbElmKFsxLCAyLCAzLCA0LCA1XSBpbiBsKQorICAgICAgICBzZWxmLmZhaWxJZigwIGluIGwpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9OCkKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzBdICogc2l6ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBsKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTgpCisgICAgZGVmIHRlc3RfaW5kZXhfYW5kX3NsaWNlKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gW05vbmVdICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbLTFdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWzVdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsW3NpemUgLSAxXSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgbCwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobFs6NV0sIFtOb25lXSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbLTU6XSwgW05vbmVdICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobFsyMDoyNV0sIFtOb25lXSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbLTI1Oi0yMF0sIFtOb25lXSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbc2l6ZSAtIDU6XSwgW05vbmVdICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobFtzaXplIC0gNTpzaXplXSwgW05vbmVdICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobFtzaXplIC0gNjpzaXplIC0gMl0sIFtOb25lXSAqIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbc2l6ZTpzaXplXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbc2l6ZTpzaXplKzVdLCBbXSkKKworICAgICAgICBsW3NpemUgLSAyXSA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWy0zOl0sIFtOb25lLCA1LCBOb25lXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobC5jb3VudCg1KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgbCwgc2l6ZSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorCisgICAgICAgIGxbc2l6ZSAtIDc6XSA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBzaXplIC09IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWy03Ol0sIFtOb25lLCBOb25lLCAxLCAyLCAzLCA0LCA1XSkKKworICAgICAgICBsWzo3XSA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBzaXplIC09IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWzo3XSwgWzEsIDIsIDMsIDQsIDUsIE5vbmUsIE5vbmVdKQorCisgICAgICAgIGRlbCBsW3NpemUgLSAxXQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWy0xXSwgNCkKKworICAgICAgICBkZWwgbFstMjpdCisgICAgICAgIHNpemUgLT0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbLTFdLCAyKQorCisgICAgICAgIGRlbCBsWzBdCisgICAgICAgIHNpemUgLT0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbMF0sIDIpCisKKyAgICAgICAgZGVsIGxbOjJdCisgICAgICAgIHNpemUgLT0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbMF0sIDQpCisKKyAgICAjIExpa2UgdGVzdF9jb25jYXQsIHNwbGl0IGluIHR3by4KKyAgICBkZWYgYmFzaWNfdGVzdF9yZXBlYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbXSAqIHNpemUKKyAgICAgICAgc2VsZi5mYWlsSWYobCkKKyAgICAgICAgbCA9IFsnJ10gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgbCA9IGwgKiAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIGRlZiBiYXNpY190ZXN0X2lucGxhY2VfcmVwZWF0KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWycnXQorICAgICAgICBsICo9IHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobFswXSBpcyBsWy0xXSkKKyAgICAgICAgZGVsIGwKKworICAgICAgICBsID0gWycnXSAqIHNpemUKKyAgICAgICAgbCAqPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSAqIDIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsW3NpemUgLSAxXSBpcyBsWy0xXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MTYpCisgICAgZGVmIHRlc3RfaW5wbGFjZV9yZXBlYXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfaW5wbGFjZV9yZXBlYXQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTE2KQorICAgIGRlZiB0ZXN0X2lucGxhY2VfcmVwZWF0X2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2lucGxhY2VfcmVwZWF0KHNpemUpCisKKyAgICBkZWYgYmFzaWNfdGVzdF9yZXByKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzBdICogc2l6ZQorICAgICAgICBzID0gcmVwcihsKQorICAgICAgICAjIFRoZSByZXByIG9mIGEgbGlzdCBvZiAwJ3MgaXMgZXhhY3RseSB0aHJlZSB0aW1lcyB0aGUgbGlzdCBsZW5ndGguCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihzKSwgc2l6ZSAqIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNbOjVdLCAnWzAsIDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzWy01Ol0sICcwLCAwXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJzAnKSwgc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDMgKyAyLCBtZW11c2U9OCArIDMpCisgICAgZGVmIHRlc3RfcmVwcl9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXByKHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT04ICsgMykKKyAgICBkZWYgdGVzdF9yZXByX2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X3JlcHIoc2l6ZSkKKworICAgICMgbGlzdCBvdmVyYWxsb2NhdGVzIH4xLzh0aCBvZiB0aGUgdG90YWwgc2l6ZSAob24gZmlyc3QgZXhwYW5zaW9uKSBzbworICAgICMgdGhlIHNpbmdsZSBsaXN0LmFwcGVuZCBjYWxsIHB1dHMgbWVtdXNlIGF0IDkgYnl0ZXMgcGVyIHNpemUuCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT05KQorICAgIGRlZiB0ZXN0X2FwcGVuZChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFtvYmplY3QoKV0gKiBzaXplCisgICAgICAgIGwuYXBwZW5kKG9iamVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUrMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbLTNdIGlzIGxbLTJdKQorICAgICAgICBzZWxmLmZhaWxJZihsWy0yXSBpcyBsWy0xXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyAyLCBtZW11c2U9OCAqIDUpCisgICAgZGVmIHRlc3RfY291bnQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMSwgMiwgMywgNCwgNV0gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwuY291bnQoMSksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwuY291bnQoIjEiKSwgMCkKKworICAgIGRlZiBiYXNpY190ZXN0X2V4dGVuZChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFtmaWxlXSAqIHNpemUKKyAgICAgICAgbC5leHRlbmQobCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplICogMikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MTYpCisgICAgZGVmIHRlc3RfZXh0ZW5kX3NtYWxsKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2V4dGVuZChzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9MTYpCisgICAgZGVmIHRlc3RfZXh0ZW5kX2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2V4dGVuZChzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gNSArIDIsIG1lbXVzZT04ICogNSkKKyAgICBkZWYgdGVzdF9pbmRleChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFsxTCwgMkwsIDNMLCA0TCwgNUxdICogc2l6ZQorICAgICAgICBzaXplICo9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobC5pbmRleCgxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobC5pbmRleCg1LCBzaXplIC0gNSksIHNpemUgLSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsLmluZGV4KDUsIHNpemUgLSA1LCBzaXplKSwgc2l6ZSAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGwuaW5kZXgsIDEsIHNpemUgLSA0LCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsLmluZGV4LCA2TCkKKworICAgICMgVGhpcyB0ZXN0cyBzdWZmZXJzIGZyb20gb3ZlcmFsbG9jYXRpb24sIGp1c3QgbGlrZSB0ZXN0X2FwcGVuZC4KKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9OSkKKyAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMS4wXSAqIHNpemUKKyAgICAgICAgbC5pbnNlcnQoc2l6ZSAtIDEsICJBIikKKyAgICAgICAgc2l6ZSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobFstMzpdLCBbMS4wLCAiQSIsIDEuMF0pCisKKyAgICAgICAgbC5pbnNlcnQoc2l6ZSArIDEsICJCIikKKyAgICAgICAgc2l6ZSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobFstMzpdLCBbIkEiLCAxLjAsICJCIl0pCisKKyAgICAgICAgbC5pbnNlcnQoMSwgIkMiKQorICAgICAgICBzaXplICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWzozXSwgWzEuMCwgIkMiLCAxLjBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsW3NpemUgLSAzOl0sIFsiQSIsIDEuMCwgIkIiXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyA0LCBtZW11c2U9OCAqIDUpCisgICAgZGVmIHRlc3RfcG9wKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gW3UiYSIsIHUiYiIsIHUiYyIsIHUiZCIsIHUiZSJdICogc2l6ZQorICAgICAgICBzaXplICo9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorCisgICAgICAgIGl0ZW0gPSBsLnBvcCgpCisgICAgICAgIHNpemUgLT0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGl0ZW0sIHUiZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbLTI6XSwgW3UiYyIsIHUiZCJdKQorCisgICAgICAgIGl0ZW0gPSBsLnBvcCgwKQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpdGVtLCB1ImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWzoyXSwgW3UiYiIsIHUiYyJdKQorCisgICAgICAgIGl0ZW0gPSBsLnBvcChzaXplIC0gMikKKyAgICAgICAgc2l6ZSAtPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaXRlbSwgdSJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobFstMjpdLCBbdSJiIiwgdSJkIl0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9OCkKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMTBdICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisKKyAgICAgICAgbC5yZW1vdmUoMTApCisgICAgICAgIHNpemUgLT0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisKKyAgICAgICAgIyBCZWNhdXNlIG9mIHRoZSBlYXJsaWVyIGwucmVtb3ZlKCksIHRoaXMgYXBwZW5kIGRvZXNuJ3QgdHJpZ2dlcgorICAgICAgICAjIGEgcmVzaXplLgorICAgICAgICBsLmFwcGVuZCg1KQorICAgICAgICBzaXplICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWy0yOl0sIFsxMCwgNV0pCisgICAgICAgIGwucmVtb3ZlKDUpCisgICAgICAgIHNpemUgLT0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbLTI6XSwgWzEwLCAxMF0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgMiwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMSwgMiwgMywgNCwgNV0gKiBzaXplCisgICAgICAgIGwucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxbLTU6XSwgWzUsIDQsIDMsIDIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWzo1XSwgWzUsIDQsIDMsIDIsIDFdKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gNSArIDIsIG1lbXVzZT04ICogNSkKKyAgICBkZWYgdGVzdF9zb3J0KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzEsIDIsIDMsIDQsIDVdICogc2l6ZQorICAgICAgICBsLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsLmNvdW50KDEpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWzoxMF0sIFsxXSAqIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsWy0xMDpdLCBbNV0gKiAxMCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RyVGVzdCwgVHVwbGVUZXN0LCBMaXN0VGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnNldF9tZW1saW1pdChzeXMuYXJndlsxXSkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IGVmNGY0MDcuLjcxZTJiMGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTEsNyArMSw4IEBACiAjIFB5dGhvbiB0ZXN0IHNldCAtLSBidWlsdC1pbiBmdW5jdGlvbnMKIAogaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0LCB1bml0dGVzdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmNtcCwgaGF2ZV91bmljb2RlLCBURVNURk4sIHVubGluaywgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmY21wLCBoYXZlX3VuaWNvZGUsIFRFU1RGTiwgdW5saW5rLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fdW5pdHRlc3QsIHJ1bl93aXRoX2xvY2FsZQogZnJvbSBvcGVyYXRvciBpbXBvcnQgbmVnCiAKIGltcG9ydCBzeXMsIHdhcm5pbmdzLCBjU3RyaW5nSU8sIHJhbmRvbSwgVXNlckRpY3QKQEAgLTUyOCwzMyArNTI5LDIwIEBACiAgICAgICAgICAgICAjIEltcGxlbWVudGF0aW9uIGxpbWl0YXRpb24gaW4gUHlGbG9hdF9Gcm9tU3RyaW5nKCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCB1bmljb2RlKCIxIioxMDAwMCkpCiAKKyAgICBAcnVuX3dpdGhfbG9jYWxlKCdMQ19OVU1FUklDJywgJ2ZyX0ZSJywgJ2RlX0RFJykKICAgICBkZWYgdGVzdF9mbG9hdF93aXRoX2NvbW1hKHNlbGYpOgogICAgICAgICAjIHNldCBsb2NhbGUgdG8gc29tZXRoaW5nIHRoYXQgZG9lc24ndCB1c2UgJy4nIGZvciB0aGUgZGVjaW1hbCBwb2ludAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgbG9jYWxlCi0gICAgICAgICAgICBvcmlnX2xvY2FsZSA9IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX05VTUVSSUMpCi0gICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19OVU1FUklDLCAnZnJfRlInKQotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAjIGlmIHdlIGNhbid0IHNldCB0aGUgbG9jYWxlLCBqdXN0IGlnbm9yZSB0aGlzIHRlc3QKKyAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICBpZiBub3QgbG9jYWxlLmxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddID09ICcsJzoKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLmxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddLCAnLCcpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICMgdGhpcyB0ZXN0IGlzIHdvcnRobGVzcywganVzdCBza2lwIGl0IGFuZCByZXNldCB0aGUgbG9jYWxlCi0gICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19OVU1FUklDLCBvcmlnX2xvY2FsZSkKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMywxNCAgIiksIDMuMTQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgICszLDE0ICAiKSwgMy4xNCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgLTMsMTQgICIpLCAtMy4xNCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAweDMuMSAgIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAtMHgzLnAtMSAgIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMjUuZS0xICAiKSwgMi41KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmY21wKGZsb2F0KCIgIC4yNWUtMSAgIiksIC4wMjUpLCAwKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfTlVNRVJJQywgb3JpZ19sb2NhbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMywxNCAgIiksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgKzMsMTQgICIpLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIC0zLDE0ICAiKSwgLTMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAweDMuMSAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIC0weDMucC0xICAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIDI1LmUtMSAgIiksIDIuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmY21wKGZsb2F0KCIgIC4yNWUtMSAgIiksIC4wMjUpLCAwKQogCiAgICAgZGVmIHRlc3RfZmxvYXRjb252ZXJzaW9uKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGNhbGxzIHRvIF9fZmxvYXRfXygpIHdvcmsgcHJvcGVybHkKQEAgLTY5Myw2ICs2ODEsODQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzAxMjMnLCAwKSwgODMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcweDEyMycsIDE2KSwgMjkxKQogCisgICAgICAgICMgU0YgYnVnIDEzMzQ2NjI6IGludChzdHJpbmcsIGJhc2UpIHdyb25nIGFuc3dlcnMKKyAgICAgICAgIyBWYXJpb3VzIHJlcHJlc2VudGF0aW9ucyBvZiAyKiozMiBldmFsdWF0ZWQgdG8gMAorICAgICAgICAjIHJhdGhlciB0aGFuIDIqKjMyIGluIHByZXZpb3VzIHZlcnNpb25zCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIDIpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEwMjAwMjAyMjIwMTIyMTExMTIxMScsIDMpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEwMDAwMDAwMDAwMDAwMDAwJywgNCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMzIyNDQwMDI0MjMxNDEnLCA1KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxNTUwMTA0MDE1NTA0JywgNiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMjExMzAxNDIyMzU0JywgNyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNDAwMDAwMDAwMDAnLCA4KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMjA2ODY1NzQ1NCcsIDkpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzQyOTQ5NjcyOTYnLCAxMCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTkwNDQ0MDU1NCcsIDExKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc5YmE0NjE1OTQnLCAxMiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNTM1YTc5ODg5JywgMTMpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzJjYTViNzQ2NCcsIDE0KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxYTIwZGNkODEnLCAxNSksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwJywgMTYpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2E3ZmZkYTkxJywgMTcpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzcwNGhlN2c0JywgMTgpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzRmNWFmZjY2JywgMTkpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzM3MjNhaTRnJywgMjApLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzI4MWQ1NWk0JywgMjEpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzFmajhiMTg0JywgMjIpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzE2MDZrN2ljJywgMjMpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ21iOTk0YWcnLCAyNCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnaGVrMm1nbCcsIDI1KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdkbmNoYm5tJywgMjYpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2IyOGpwZG0nLCAyNyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnOHBmZ2loNCcsIDI4KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc3NmJlaWdnJywgMjkpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzVxbWNwcWcnLCAzMCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNHEwanRvNCcsIDMxKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0MDAwMDAwJywgMzIpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzNhb2txOTQnLCAzMyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMnFoeGpsaScsIDM0KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcyYnI0NXFiJywgMzUpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzF6MTQxejQnLCAzNiksIDQyOTQ5NjcyOTZMKQorCisgICAgICAgICMgU0YgYnVnIDEzMzQ2NjI6IGludChzdHJpbmcsIGJhc2UpIHdyb25nIGFuc3dlcnMKKyAgICAgICAgIyBDaGVja3MgZm9yIHByb3BlciBldmFsdWF0aW9uIG9mIDIqKjMyICsgMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywgMiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAyMDAyMDIyMjAxMjIxMTExMjEyJywgMyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwMDAwMDAwMDEnLCA0KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCczMjI0NDAwMjQyMzE0MicsIDUpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzE1NTAxMDQwMTU1MDUnLCA2KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcyMTEzMDE0MjIzNTUnLCA3KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0MDAwMDAwMDAwMScsIDgpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEyMDY4NjU3NDU1JywgOSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNDI5NDk2NzI5NycsIDEwKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxOTA0NDQwNTU1JywgMTEpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzliYTQ2MTU5NScsIDEyKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc1MzVhNzk4OGEnLCAxMyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMmNhNWI3NDY1JywgMTQpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzFhMjBkY2Q4MicsIDE1KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMDAwMDAwMDEnLCAxNiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnYTdmZmRhOTInLCAxNyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNzA0aGU3ZzUnLCAxOCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNGY1YWZmNjcnLCAxOSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMzcyM2FpNGgnLCAyMCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMjgxZDU1aTUnLCAyMSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMWZqOGIxODUnLCAyMiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTYwNms3aWQnLCAyMyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnbWI5OTRhaCcsIDI0KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdoZWsybWdtJywgMjUpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2RuY2hibm4nLCAyNiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnYjI4anBkbicsIDI3KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc4cGZnaWg1JywgMjgpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzc2YmVpZ2gnLCAyOSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNXFtY3BxaCcsIDMwKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0cTBqdG81JywgMzEpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzQwMDAwMDEnLCAzMiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnM2Fva3E5NScsIDMzKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcycWh4amxqJywgMzQpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzJicjQ1cWMnLCAzNSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMXoxNDF6NScsIDM2KSwgNDI5NDk2NzI5N0wpCisKICAgICBkZWYgdGVzdF9pbnRjb252ZXJzaW9uKHNlbGYpOgogICAgICAgICAjIFRlc3QgX19pbnRfXygpCiAgICAgICAgIGNsYXNzIEZvbzA6CkBAIC04ODYsNiArOTUyLDgxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvbmcsICc1MycsIDQwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxvbmcsIDEsIDEyKQogCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDIwMDIwMjIyMDEyMjExMTEyMTEnLCAzKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDAwMDAwMDAwMDAwMDAwMCcsIDQpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzMyMjQ0MDAyNDIzMTQxJywgNSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTU1MDEwNDAxNTUwNCcsIDYpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzIxMTMwMTQyMjM1NCcsIDcpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzQwMDAwMDAwMDAwJywgOCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTIwNjg2NTc0NTQnLCA5KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0Mjk0OTY3Mjk2JywgMTApLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzE5MDQ0NDA1NTQnLCAxMSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnOWJhNDYxNTk0JywgMTIpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzUzNWE3OTg4OScsIDEzKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyY2E1Yjc0NjQnLCAxNCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMWEyMGRjZDgxJywgMTUpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMDAwMDAwMCcsIDE2KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdhN2ZmZGE5MScsIDE3KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc3MDRoZTdnNCcsIDE4KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0ZjVhZmY2NicsIDE5KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczNzIzYWk0ZycsIDIwKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyODFkNTVpNCcsIDIxKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxZmo4YjE4NCcsIDIyKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxNjA2azdpYycsIDIzKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdtYjk5NGFnJywgMjQpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2hlazJtZ2wnLCAyNSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnZG5jaGJubScsIDI2KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdiMjhqcGRtJywgMjcpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzhwZmdpaDQnLCAyOCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNzZiZWlnZycsIDI5KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc1cW1jcHFnJywgMzApLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzRxMGp0bzQnLCAzMSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNDAwMDAwMCcsIDMyKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczYW9rcTk0JywgMzMpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzJxaHhqbGknLCAzNCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMmJyNDVxYicsIDM1KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxejE0MXo0JywgMzYpLCA0Mjk0OTY3Mjk2KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDIwMDIwMjIyMDEyMjExMTEyMTInLCAzKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDAwMDAwMDAwMDAwMDAwMScsIDQpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzMyMjQ0MDAyNDIzMTQyJywgNSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTU1MDEwNDAxNTUwNScsIDYpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzIxMTMwMTQyMjM1NScsIDcpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzQwMDAwMDAwMDAxJywgOCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTIwNjg2NTc0NTUnLCA5KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0Mjk0OTY3Mjk3JywgMTApLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzE5MDQ0NDA1NTUnLCAxMSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnOWJhNDYxNTk1JywgMTIpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzUzNWE3OTg4YScsIDEzKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyY2E1Yjc0NjUnLCAxNCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMWEyMGRjZDgyJywgMTUpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMDAwMDAwMScsIDE2KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdhN2ZmZGE5MicsIDE3KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc3MDRoZTdnNScsIDE4KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0ZjVhZmY2NycsIDE5KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczNzIzYWk0aCcsIDIwKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyODFkNTVpNScsIDIxKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxZmo4YjE4NScsIDIyKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxNjA2azdpZCcsIDIzKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdtYjk5NGFoJywgMjQpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2hlazJtZ20nLCAyNSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnZG5jaGJubicsIDI2KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdiMjhqcGRuJywgMjcpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzhwZmdpaDUnLCAyOCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNzZiZWlnaCcsIDI5KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc1cW1jcHFoJywgMzApLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzRxMGp0bzUnLCAzMSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNDAwMDAwMScsIDMyKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczYW9rcTk1JywgMzMpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzJxaHhqbGonLCAzNCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMmJyNDVxYycsIDM1KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxejE0MXo1JywgMzYpLCA0Mjk0OTY3Mjk3KQorCisKICAgICBkZWYgdGVzdF9sb25nY29udmVyc2lvbihzZWxmKToKICAgICAgICAgIyBUZXN0IF9fbG9uZ19fKCkKICAgICAgICAgY2xhc3MgRm9vMDoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CmluZGV4IDAxOGJlYzYuLmVjODYwZDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtMTUsOCArMTUsMTEgQEAKICAgICAgICAgcG9wZW4yLl9jbGVhbnVwKCkKICAgICAgICAgcmV0dXJuIGRhdGEKIAotICAgIGRlZiBleGl0X2NvZGUoc2VsZiwgY21kX2xpbmUpOgotICAgICAgICByZXR1cm4gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgY21kX2xpbmVdLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgIGRlZiBleGl0X2NvZGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBjbWRfbGluZSA9IFtzeXMuZXhlY3V0YWJsZV0KKyAgICAgICAgY21kX2xpbmUuZXh0ZW5kKGFyZ3MpCisgICAgICAgIHJldHVybiBzdWJwcm9jZXNzLmNhbGwoY21kX2xpbmUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCiAKICAgICBkZWYgdGVzdF9kaXJlY3RvcmllcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmV4aXRfY29kZSgnLicpLCAwKQpAQCAtNTAsNiArNTMsMzggQEAKICAgICAgICAgdmVyc2lvbiA9ICdQeXRob24gJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3RhcnRfcHl0aG9uKCctVicpLnN0YXJ0c3dpdGgodmVyc2lvbikpCiAKKyAgICBkZWYgdGVzdF9ydW5fbW9kdWxlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXhwZWN0ZWQgb3BlcmF0aW9uIG9mIHRoZSAnLW0nIHN3aXRjaAorICAgICAgICAjIFN3aXRjaCBuZWVkcyBhbiBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZXhpdF9jb2RlKCctbScpLCAwKQorICAgICAgICAjIENoZWNrIHdlIGdldCBhbiBlcnJvciBmb3IgYSBub25leGlzdGVudCBtb2R1bGUKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jb2RlKCctbScsICdmbm9yZDQzNTIweHl6JyksCisgICAgICAgICAgICAwKQorICAgICAgICAjIENoZWNrIHRoZSBydW5weSBtb2R1bGUgYWxzbyBnaXZlcyBhbiBlcnJvciBmb3IKKyAgICAgICAgIyBhIG5vbmV4aXN0ZW50IG1vZHVsZQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAorICAgICAgICAgICAgc2VsZi5leGl0X2NvZGUoJy1tJywgJ3J1bnB5JywgJ2Zub3JkNDM1MjB4eXonKSwKKyAgICAgICAgICAgIDApCisgICAgICAgICMgQWxsIGdvb2QgaWYgbW9kdWxlIGlzIGxvY2F0ZWQgYW5kIHJ1biBzdWNjZXNzZnVsbHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jb2RlKCctbScsICd0aW1laXQnLCAnLW4nLCAnMScpLAorICAgICAgICAgICAgMCkKKworICAgIGRlZiB0ZXN0X3J1bl9jb2RlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXhwZWN0ZWQgb3BlcmF0aW9uIG9mIHRoZSAnLWMnIHN3aXRjaAorICAgICAgICAjIFN3aXRjaCBuZWVkcyBhbiBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZXhpdF9jb2RlKCctYycpLCAwKQorICAgICAgICAjIENoZWNrIHdlIGdldCBhbiBlcnJvciBmb3IgYW4gdW5jYXVnaHQgZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCisgICAgICAgICAgICBzZWxmLmV4aXRfY29kZSgnLWMnLCAncmFpc2UgRXhjZXB0aW9uJyksCisgICAgICAgICAgICAwKQorICAgICAgICAjIEFsbCBnb29kIGlmIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmV4aXRfY29kZSgnLWMnLCAncGFzcycpLAorICAgICAgICAgICAgMCkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENtZExpbmVUZXN0KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weQppbmRleCBjNmU1NmM5Li4xNTljODZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKQEAgLTE4LDMwICsxOCwxMiBAQAogICAgICAgICAgICAgc2VsZi5wb3MgPSBsZW4oZXhjLm9iamVjdCkKICAgICAgICAgcmV0dXJuICh1Ijw/PiIsIG9sZHBvcykKIAotIyBBIFVuaWNvZGVFbmNvZGVFcnJvciBvYmplY3Qgd2l0aG91dCBhIHN0YXJ0IGF0dHJpYnV0ZQotY2xhc3MgTm9TdGFydFVuaWNvZGVFbmNvZGVFcnJvcihVbmljb2RlRW5jb2RlRXJyb3IpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLl9faW5pdF9fKHNlbGYsICJhc2NpaSIsIHUiIiwgMCwgMSwgImJhZCIpCi0gICAgICAgIGRlbCBzZWxmLnN0YXJ0Ci0KICMgQSBVbmljb2RlRW5jb2RlRXJyb3Igb2JqZWN0IHdpdGggYSBiYWQgc3RhcnQgYXR0cmlidXRlCiBjbGFzcyBCYWRTdGFydFVuaWNvZGVFbmNvZGVFcnJvcihVbmljb2RlRW5jb2RlRXJyb3IpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLl9faW5pdF9fKHNlbGYsICJhc2NpaSIsIHUiIiwgMCwgMSwgImJhZCIpCiAgICAgICAgIHNlbGYuc3RhcnQgPSBbXQogCi0jIEEgVW5pY29kZUVuY29kZUVycm9yIG9iamVjdCB3aXRob3V0IGFuIGVuZCBhdHRyaWJ1dGUKLWNsYXNzIE5vRW5kVW5pY29kZUVuY29kZUVycm9yKFVuaWNvZGVFbmNvZGVFcnJvcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IuX19pbml0X18oc2VsZiwgImFzY2lpIiwgdSIiLCAwLCAxLCAiYmFkIikKLSAgICAgICAgZGVsIHNlbGYuZW5kCi0KLSMgQSBVbmljb2RlRW5jb2RlRXJyb3Igb2JqZWN0IHdpdGhvdXQgYW4gb2JqZWN0IGF0dHJpYnV0ZQotY2xhc3MgTm9PYmplY3RVbmljb2RlRW5jb2RlRXJyb3IoVW5pY29kZUVuY29kZUVycm9yKToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIFVuaWNvZGVFbmNvZGVFcnJvci5fX2luaXRfXyhzZWxmLCAiYXNjaWkiLCB1IiIsIDAsIDEsICJiYWQiKQotICAgICAgICBkZWwgc2VsZi5vYmplY3QKLQogIyBBIFVuaWNvZGVFbmNvZGVFcnJvciBvYmplY3Qgd2l0aCBhIGJhZCBvYmplY3QgYXR0cmlidXRlCiBjbGFzcyBCYWRPYmplY3RVbmljb2RlRW5jb2RlRXJyb3IoVW5pY29kZUVuY29kZUVycm9yKToKICAgICBkZWYgX19pbml0X18oc2VsZik6CkBAIC00NzgsNTUgKzQ2MCwxNSBAQAogICAgICAgICAgICBVbmljb2RlRXJyb3IoIm91Y2giKQogICAgICAgICApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCi0gICAgICAgICAgICBOb1N0YXJ0VW5pY29kZUVuY29kZUVycm9yKCkKLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgICAgIFR5cGVFcnJvciwKLSAgICAgICAgICAgIGNvZGVjcy5yZXBsYWNlX2Vycm9ycywKLSAgICAgICAgICAgIEJhZFN0YXJ0VW5pY29kZUVuY29kZUVycm9yKCkKLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLAotICAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzLAotICAgICAgICAgICAgTm9FbmRVbmljb2RlRW5jb2RlRXJyb3IoKQotICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCi0gICAgICAgICAgICBOb09iamVjdFVuaWNvZGVFbmNvZGVFcnJvcigpCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCiAgICAgICAgICAgICBCYWRPYmplY3RVbmljb2RlRW5jb2RlRXJyb3IoKQogICAgICAgICApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCi0gICAgICAgICAgICBOb0VuZFVuaWNvZGVEZWNvZGVFcnJvcigpCi0gICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBUeXBlRXJyb3IsCiAgICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCiAgICAgICAgICAgICBCYWRPYmplY3RVbmljb2RlRGVjb2RlRXJyb3IoKQogICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCi0gICAgICAgICAgICBOb1N0YXJ0VW5pY29kZVRyYW5zbGF0ZUVycm9yKCkKLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLAotICAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzLAotICAgICAgICAgICAgTm9FbmRVbmljb2RlVHJhbnNsYXRlRXJyb3IoKQotICAgICAgICApCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCi0gICAgICAgICAgICBOb09iamVjdFVuaWNvZGVUcmFuc2xhdGVFcnJvcigpCi0gICAgICAgICkKICAgICAgICAgIyBXaXRoIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiwgInJlcGxhY2UiIHJldHVybnMgYW4gIj8iIG9yIHUiXHVmZmZkIiByZXBsYWNlbWVudAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKICAgICAgICAgICAgIGNvZGVjcy5yZXBsYWNlX2Vycm9ycyhVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpKSwKQEAgLTU2NSwyMSArNTA3LDYgQEAKICAgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCiAgICAgICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IodSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpCiAgICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCi0gICAgICAgICAgICBBdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCi0gICAgICAgICAgICBOb1N0YXJ0VW5pY29kZUVuY29kZUVycm9yKCkKLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLAotICAgICAgICAgICAgY29kZWNzLnhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycywKLSAgICAgICAgICAgIE5vRW5kVW5pY29kZUVuY29kZUVycm9yKCkKLSAgICAgICAgKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLAotICAgICAgICAgICAgY29kZWNzLnhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycywKLSAgICAgICAgICAgIE5vT2JqZWN0VW5pY29kZUVuY29kZUVycm9yKCkKLSAgICAgICAgKQogICAgICAgICAjIFVzZSB0aGUgY29ycmVjdCBleGNlcHRpb24KICAgICAgICAgY3MgPSAoMCwgMSwgOSwgMTAsIDk5LCAxMDAsIDk5OSwgMTAwMCwgOTk5OSwgMTAwMDAsIDB4MzA0MikKICAgICAgICAgcyA9ICIiLmpvaW4odW5pY2hyKGMpIGZvciBjIGluIGNzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKaW5kZXggMDYzOGY0Zi4uMWJmODU4MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CkBAIC0zLDcgKzMsNiBAQAogIyB0ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFBSQyBlbmNvZGluZ3MuCiAjCi0jICRDSktDb2RlY3M6IHRlc3RfY29kZWNlbmNvZGluZ3NfY24ucHksdiAxLjIgMjAwNC8wNi8xOSAwNjowOTo1NSBwZXJreSBFeHAgJAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5CmluZGV4IGU3ZmFkOTAuLjFjZDAyMGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQpAQCAtMyw3ICszLDYgQEAKICMgdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBIb25nS29uZyBlbmNvZGluZ3MuCiAjCi0jICRDSktDb2RlY3M6IHRlc3RfY29kZWNlbmNvZGluZ3NfaGsucHksdiAxLjEgMjAwNC8wNy8xMCAxNzozNToyMCBwZXJreSBFeHAgJAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5CmluZGV4IDQ4M2I3ZGIuLjU1ODU5OGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQpAQCAtMyw3ICszLDYgQEAKICMgdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBKYXBhbmVzZSBlbmNvZGluZ3MuCiAjCi0jICRDSktDb2RlY3M6IHRlc3RfY29kZWNlbmNvZGluZ3NfanAucHksdiAxLjMgMjAwNC8wNi8xOSAwNjowOTo1NSBwZXJreSBFeHAgJAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CmluZGV4IDQ4OWM5ZjEuLjgxMzlmNzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQpAQCAtMyw3ICszLDYgQEAKICMgdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBST0sgZW5jb2RpbmdzLgogIwotIyAkQ0pLQ29kZWNzOiB0ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5LHYgMS4yIDIwMDQvMDYvMTkgMDY6MDk6NTUgcGVya3kgRXhwICQKIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weQppbmRleCBmYjhhNGQwLi43YzU5NDc4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKQEAgLTMsNyArMyw2IEBACiAjIHRlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUk9DIGVuY29kaW5ncy4KICMKLSMgJENKS0NvZGVjczogdGVzdF9jb2RlY2VuY29kaW5nc190dy5weSx2IDEuMiAyMDA0LzA2LzE5IDA2OjA5OjU1IHBlcmt5IEV4cCAkCiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQppbmRleCAyNWVjYzAyLi44Y2JlZTc2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQpAQCAtMyw3ICszLDYgQEAKICMgdGVzdF9jb2RlY21hcHNfY24ucHkKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzCiAjCi0jICRDSktDb2RlY3M6IHRlc3RfY29kZWNtYXBzX2NuLnB5LHYgMS4zIDIwMDQvMDYvMTkgMDY6MDk6NTUgcGVya3kgRXhwICQKIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5CmluZGV4IDIzMzVjNTEuLmU3ZjdiOTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5CkBAIC0zLDcgKzMsNiBAQAogIyB0ZXN0X2NvZGVjbWFwc19oay5weQogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEhvbmdLb25nIGVuY29kaW5ncwogIwotIyAkQ0pLQ29kZWNzOiB0ZXN0X2NvZGVjbWFwc19oay5weSx2IDEuMSAyMDA0LzA3LzEwIDE3OjM1OjIwIHBlcmt5IEV4cCAkCiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfanAucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQppbmRleCBlNzVhNWE4Li4wODA1MmQ0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQpAQCAtMyw3ICszLDYgQEAKICMgdGVzdF9jb2RlY21hcHNfanAucHkKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBKYXBhbmVzZSBlbmNvZGluZ3MKICMKLSMgJENKS0NvZGVjczogdGVzdF9jb2RlY21hcHNfanAucHksdiAxLjMgMjAwNC8wNi8xOSAwNjowOTo1NSBwZXJreSBFeHAgJAogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKaW5kZXggZGI2NWMwMS4uNzQ4NGE2NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKQEAgLTMsNyArMyw2IEBACiAjIHRlc3RfY29kZWNtYXBzX2tyLnB5CiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncwogIwotIyAkQ0pLQ29kZWNzOiB0ZXN0X2NvZGVjbWFwc19rci5weSx2IDEuMyAyMDA0LzA2LzE5IDA2OjA5OjU1IHBlcmt5IEV4cCAkCiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weQppbmRleCAyZDQ2OWIwLi4wYjE5NWY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weQpAQCAtMyw3ICszLDYgQEAKICMgdGVzdF9jb2RlY21hcHNfdHcucHkKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBST0MgZW5jb2RpbmdzCiAjCi0jICRDSktDb2RlY3M6IHRlc3RfY29kZWNtYXBzX3R3LnB5LHYgMS4zIDIwMDQvMDYvMTkgMDY6MDk6NTUgcGVya3kgRXhwICQKIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQppbmRleCBhNTlkNmFhLi40OGYxNjQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKQEAgLTI2LDYgKzI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgXAogICAgICAgICAgICAgICAgICAgICAgICAnICB0ZXN0Q29tcGlsZUxpYnJhcnkgc3RpbGwgd29ya2luZywgYmUgcGF0aWVudC4uLicKKyAgICAgICAgICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQogCiAgICAgICAgICAgICAgICAgaWYgbm90IGJhc2VuYW1lLmVuZHN3aXRoKCIucHkiKToKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKQEAgLTU1LDYgKzU2LDkgQEAKICAgICBkZWYgdGVzdFlpZWxkRXhwcihzZWxmKToKICAgICAgICAgY29tcGlsZXIuY29tcGlsZSgiZGVmIGcoKTogeWllbGRcblxuIiwgIjxzdHJpbmc+IiwgImV4ZWMiKQogCisgICAgZGVmIHRlc3REZWZhdWx0QXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGVyLnBhcnNlLCAiZGVmIGZvbyhhPTEsIGIpOiBwYXNzIikKKwogICAgIGRlZiB0ZXN0TGluZU5vKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBhbGwgbm9kZXMgZXhjZXB0IE1vZHVsZSBoYXZlIGEgY29ycmVjdCBsaW5lbm8gYXR0cmlidXRlLgogICAgICAgICBmaWxlbmFtZSA9IF9fZmlsZV9fCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKaW5kZXggOTc0NzBjNy4uMmNmMzlhZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBAY29udGV4dG1hbmFnZXIKICAgICAgICAgZGVmIHdoZWUoKToKICAgICAgICAgICAgIHlpZWxkCi0gICAgICAgIGN0eCA9IHdoZWUoKS5fX2NvbnRleHRfXygpCisgICAgICAgIGN0eCA9IHdoZWUoKQogICAgICAgICBjdHguX19lbnRlcl9fKCkKICAgICAgICAgIyBDYWxsaW5nIF9fZXhpdF9fIHNob3VsZCBub3QgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbgogICAgICAgICBzZWxmLmZhaWxJZihjdHguX19leGl0X18oVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lKSkKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICB5aWVsZAogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHlpZWxkCi0gICAgICAgIGN0eCA9IHdob28oKS5fX2NvbnRleHRfXygpCisgICAgICAgIGN0eCA9IHdob28oKQogICAgICAgICBjdHguX19lbnRlcl9fKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBSdW50aW1lRXJyb3IsIGN0eC5fX2V4aXRfXywgVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lCkBAIC0xNDYsNiArMTQ2LDI5IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKKyAgICBkZWYgdGVzdF9uZXN0ZWRfcmlnaHRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBzdGF0ZSA9IFtdCisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgeWllbGQgMQorICAgICAgICBjbGFzcyBiKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggbmVzdGVkKGEoKSwgYigpKSBhcyAoeCwgeSk6CisgICAgICAgICAgICAgICAgMS8wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHgsIHkpLCAoMSwgMikpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBzZWxmLmZhaWwoIlJlcmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCisKICAgICBkZWYgdGVzdF9uZXN0ZWRfYl9zd2FsbG93cyhzZWxmKToKICAgICAgICAgQGNvbnRleHRtYW5hZ2VyCiAgICAgICAgIGRlZiBhKCk6CkBAIC0zMTYsMTIgKzMzOSwxMiBAQAogICAgICAgICBvcmlnX2NvbnRleHQgPSBjdHguY29weSgpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGN0eC5wcmVjID0gc2F2ZV9wcmVjID0gZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYyArIDUKLSAgICAgICAgICAgIHdpdGggZGVjaW1hbC5FeHRlbmRlZENvbnRleHQ6CisgICAgICAgICAgICB3aXRoIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0LmdldF9tYW5hZ2VyKCk6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywgc2F2ZV9wcmVjKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHdpdGggZGVjaW1hbC5FeHRlbmRlZENvbnRleHQ6CisgICAgICAgICAgICAgICAgd2l0aCBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5nZXRfbWFuYWdlcigpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5FeHRlbmRlZENvbnRleHQucHJlYykKICAgICAgICAgICAgICAgICAgICAgMS8wCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfY29va2llbGliLnB5CmluZGV4IDQ5ZTdkNDcuLjk5MTUwNmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29va2llbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29va2llbGliLnB5CkBAIC02OTUsNiArNjk1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj1mcmllbmRseS5vcmc7IFZlcnNpb249IjEiJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAwKQogCisgICAgZGVmIHRlc3Rfc3RyaWN0X2RvbWFpbihzZWxmKToKKyAgICAgICAgIyBDb29raWVzIHdob3NlIGRvbWFpbiBpcyBhIGNvdW50cnktY29kZSB0bGQgbGlrZSAuY28udWsgc2hvdWxkCisgICAgICAgICMgbm90IGJlIHNldCBpZiBDb29raWVQb2xpY3kuc3RyaWN0X2RvbWFpbiBpcyB0cnVlLgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgY3AgPSBEZWZhdWx0Q29va2llUG9saWN5KHN0cmljdF9kb21haW49VHJ1ZSkKKyAgICAgICAgY2ogPSBDb29raWVKYXIocG9saWN5PWNwKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjaiwgImh0dHA6Ly9leGFtcGxlLmNvLnVrLyIsICdubz1wcm9ibGVtbycpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGNqLCAiaHR0cDovL2V4YW1wbGUuY28udWsvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ29rZXk9ZG9rZXk7IERvbWFpbj0uZXhhbXBsZS5jby51aycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjaiksIDIpCisgICAgICAgIGZvciBwc2V1ZG9fdGxkIGluIFsiLmNvLnVrIiwgIi5vcmcuemEiLCAiLnR4LnVzIiwgIi5uYW1lLnVzIl06CisgICAgICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjaiwgImh0dHA6Ly9leGFtcGxlLiVzLyIgJSBwc2V1ZG9fdGxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgRG9tYWluPS5jby51aycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oY2opLCAyKQorCiAgICAgZGVmIHRlc3RfdHdvX2NvbXBvbmVudF9kb21haW5fbnMoc2VsZik6CiAgICAgICAgICMgTmV0c2NhcGU6IC53d3cuYmFyLmNvbSwgd3d3LmJhci5jb20sIC5iYXIuY29tLCBiYXIuY29tLCBubyBkb21haW4KICAgICAgICAgIyBzaG91bGQgYWxsIGdldCBhY2NlcHRlZCwgYXMgc2hvdWxkIC5hY21lLmNvbSwgYWNtZS5jb20gYW5kIG5vIGRvbWFpbgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKaW5kZXggMjUyOGI0YS4uMjAzYmVhMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CkBAIC0xNDAwLDYgKzE0MDAsMTIgQEAKICAgICAgICAgZ290ID0gc2VsZi50aGVjbGFzcy51dGNmcm9tdGltZXN0YW1wKHRzKQogICAgICAgICBzZWxmLnZlcmlmeV9maWVsZF9lcXVhbGl0eShleHBlY3RlZCwgZ290KQogCisgICAgZGVmIHRlc3RfbWljcm9zZWNvbmRfcm91bmRpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCB3aGV0aGVyIGZyb210aW1lc3RhbXAgInJvdW5kcyB1cCIgZmxvYXRzIHRoYXQgYXJlIGxlc3MKKyAgICAgICAgIyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYW4gaW50ZWdlci4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKDAuOTk5OTk5OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGhlY2xhc3MuZnJvbXRpbWVzdGFtcCgxKSkKKwogICAgIGRlZiB0ZXN0X2luc2FuZV9mcm9tdGltZXN0YW1wKHNlbGYpOgogICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIHBsYXRmb3JtIG1hcHMgdGltZV90IHRvIGRvdWJsZSwKICAgICAgICAgIyBhbmQgdGhhdCB0aGlzIHRlc3Qgd2lsbCBmYWlsIHRoZXJlLiAgVGhpcyB0ZXN0IHNob3VsZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CmluZGV4IGIxNzYwN2QuLjQ0M2M5NjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTEwNzksNiArMTA3OSwyNSBAQAogICAgIC4uLiAgICAgICAgICAgICAgICAgIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKICAgICBbMCwgICAgMSwgLi4uLCAgIDE4LCAgICAxOV0KIAorVGhlIFNLSVAgZmxhZyBjYXVzZXMgYW4gZXhhbXBsZSB0byBiZSBza2lwcGVkIGVudGlyZWx5LiAgSS5lLiwgdGhlCitleGFtcGxlIGlzIG5vdCBydW4uICBJdCBjYW4gYmUgdXNlZnVsIGluIGNvbnRleHRzIHdoZXJlIGRvY3Rlc3QKK2V4YW1wbGVzIHNlcnZlIGFzIGJvdGggZG9jdW1lbnRhdGlvbiBhbmQgdGVzdCBjYXNlcywgYW5kIGFuIGV4YW1wbGUKK3Nob3VsZCBiZSBpbmNsdWRlZCBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcywgYnV0IHNob3VsZCBub3QgYmUKK2NoZWNrZWQgKGUuZy4sIGJlY2F1c2UgaXRzIG91dHB1dCBpcyByYW5kb20sIG9yIGRlcGVuZHMgb24gcmVzb3VyY2VzCit3aGljaCB3b3VsZCBiZSB1bmF2YWlsYWJsZS4pICBUaGUgU0tJUCBmbGFnIGNhbiBhbHNvIGJlIHVzZWQgZm9yCisnY29tbWVudGluZyBvdXQnIGJyb2tlbiBleGFtcGxlcy4KKworICAgID4+PiBpbXBvcnQgdW5hdmFpbGFibGVfcmVzb3VyY2UgICAgICAgICAgICMgZG9jdGVzdDogK1NLSVAKKyAgICA+Pj4gdW5hdmFpbGFibGVfcmVzb3VyY2UuZG9fc29tZXRoaW5nKCkgICAjIGRvY3Rlc3Q6ICtTS0lQCisgICAgPj4+IHVuYXZhaWxhYmxlX3Jlc291cmNlLmJsb3dfdXAoKSAgICAgICAgIyBkb2N0ZXN0OiArU0tJUAorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgLi4uCisgICAgVW5jaGVja2VkQmxvd1VwRXJyb3I6ICBOb2JvZHkgY2hlY2tzIG1lLgorCisgICAgPj4+IGltcG9ydCByYW5kb20KKyAgICA+Pj4gcHJpbnQgcmFuZG9tLnJhbmRvbSgpICMgZG9jdGVzdDogK1NLSVAKKyAgICAwLjcyMTIxNjkyMzg4OQorCiBUaGUgUkVQT1JUX1VESUZGIGZsYWcgY2F1c2VzIGZhaWx1cmVzIHRoYXQgaW52b2x2ZSBtdWx0aS1saW5lIGV4cGVjdGVkCiBhbmQgYWN0dWFsIG91dHB1dHMgdG8gYmUgZGlzcGxheWVkIHVzaW5nIGEgdW5pZmllZCBkaWZmOgogCkBAIC0xMjgxLDYgKzEzMDAsMjYgQEAKICAgICAgICAgVmFsdWVFcnJvcjogMgogICAgICgzLCA1KQogCitOZXcgb3B0aW9uIGZsYWdzIGNhbiBhbHNvIGJlIHJlZ2lzdGVyZWQsIHZpYSByZWdpc3Rlcl9vcHRpb25mbGFnKCkuICBIZXJlCit3ZSByZWFjaCBpbnRvIGRvY3Rlc3QncyBpbnRlcm5hbHMgYSBiaXQuCisKKyAgICA+Pj4gdW5saWtlbHkgPSAiVU5MSUtFTFlfT1BUSU9OX05BTUUiCisgICAgPj4+IHVubGlrZWx5IGluIGRvY3Rlc3QuT1BUSU9ORkxBR1NfQllfTkFNRQorICAgIEZhbHNlCisgICAgPj4+IG5ld19mbGFnX3ZhbHVlID0gZG9jdGVzdC5yZWdpc3Rlcl9vcHRpb25mbGFnKHVubGlrZWx5KQorICAgID4+PiB1bmxpa2VseSBpbiBkb2N0ZXN0Lk9QVElPTkZMQUdTX0JZX05BTUUKKyAgICBUcnVlCisKK0JlZm9yZSAyLjQuNC8yLjUsIHJlZ2lzdGVyaW5nIGEgbmFtZSBtb3JlIHRoYW4gb25jZSBlcnJvbmVvdXNseSBjcmVhdGVkCittb3JlIHRoYW4gb25lIGZsYWcgdmFsdWUuICBIZXJlIHdlIHZlcmlmeSB0aGF0J3MgZml4ZWQ6CisKKyAgICA+Pj4gcmVkdW5kYW50X2ZsYWdfdmFsdWUgPSBkb2N0ZXN0LnJlZ2lzdGVyX29wdGlvbmZsYWcodW5saWtlbHkpCisgICAgPj4+IHJlZHVuZGFudF9mbGFnX3ZhbHVlID09IG5ld19mbGFnX3ZhbHVlCisgICAgVHJ1ZQorCitDbGVhbiB1cC4KKyAgICA+Pj4gZGVsIGRvY3Rlc3QuT1BUSU9ORkxBR1NfQllfTkFNRVt1bmxpa2VseV0KKwogICAgICIiIgogCiAgICAgZGVmIG9wdGlvbl9kaXJlY3RpdmVzKCk6IHIiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weSBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQppbmRleCA3OTQ2MTQyLi44Zjk5NWY3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CkBAIC04MSwxNCArODEsNiBAQAogZXhjZXB0IE5hbWVFcnJvcjogcGFzcwogCiByKE92ZXJmbG93RXJyb3IpCi0jIFhYWAotIyBPYnNjdXJlOiAgaW4gMi4yIGFuZCAyLjMsIHRoaXMgdGVzdCByZWxpZWQgb24gY2hhbmdpbmcgT3ZlcmZsb3dXYXJuaW5nCi0jIGludG8gYW4gZXJyb3IsIGluIG9yZGVyIHRvIHRyaWdnZXIgT3ZlcmZsb3dFcnJvci4gIEluIDIuNCwgT3ZlcmZsb3dXYXJuaW5nCi0jIHNob3VsZCBubyBsb25nZXIgYmUgZ2VuZXJhdGVkLCBzbyB0aGUgZm9jdXMgb2YgdGhlIHRlc3Qgc2hpZnRzIHRvIHNob3dpbmcKLSMgdGhhdCBPdmVyZmxvd0Vycm9yICppc24ndCogZ2VuZXJhdGVkLiAgT3ZlcmZsb3dXYXJuaW5nIHNob3VsZCBiZSBnb25lCi0jIGluIFB5dGhvbiAyLjUsIGFuZCB0aGVuIHRoZSBmaWx0ZXJ3YXJuaW5ncygpIGNhbGwsIGFuZCB0aGlzIGNvbW1lbnQsCi0jIHNob3VsZCBnbyBhd2F5Lgotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgIiIsIE92ZXJmbG93V2FybmluZywgX19uYW1lX18pCiB4ID0gMQogZm9yIGR1bW15IGluIHJhbmdlKDEyOCk6CiAgICAgeCArPSB4ICAjIHRoaXMgc2ltcGx5IHNob3VsZG4ndCBibG93IHVwCkBAIC0yMjQsMyArMjE2LDg4IEBACiAgICAgdGVzdF9jYXBpMygpCiAKIHVubGluayhURVNURk4pCisKKyMgIHRlc3QgdGhhdCBleGNlcHRpb24gYXR0cmlidXRlcyBhcmUgaGFwcHkuCit0cnk6IHN0cih1J0hlbGxvIFx1MDBFMScpCitleGNlcHQgRXhjZXB0aW9uLCBlOiBzYW1wbGVVbmljb2RlRW5jb2RlRXJyb3IgPSBlCit0cnk6IHVuaWNvZGUoJ1x4ZmYnKQorZXhjZXB0IEV4Y2VwdGlvbiwgZTogc2FtcGxlVW5pY29kZURlY29kZUVycm9yID0gZQorZXhjZXB0aW9uTGlzdCA9IFsKKyAgICAgICAgKCBCYXNlRXhjZXB0aW9uLCAoKSwgeyAnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCkgfSksCisgICAgICAgICggQmFzZUV4Y2VwdGlvbiwgKDEsICksIHsgJ21lc3NhZ2UnIDogMSwgJ2FyZ3MnIDogKCAxLCApIH0pLAorICAgICAgICAoIEJhc2VFeGNlcHRpb24sICgnZm9vJywgKSwgeyAnbWVzc2FnZScgOiAnZm9vJywgJ2FyZ3MnIDogKCAnZm9vJywgKSB9KSwKKyAgICAgICAgKCBCYXNlRXhjZXB0aW9uLCAoJ2ZvbycsIDEpLCB7ICdtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoICdmb28nLCAxICkgfSksCisgICAgICAgICggU3lzdGVtRXhpdCwgKCdmb28nLCksIHsgJ21lc3NhZ2UnIDogJ2ZvbycsICdhcmdzJyA6ICggJ2ZvbycsICksCisgICAgICAgICAgICAgICAgJ2NvZGUnIDogJ2ZvbycgfSksCisgICAgICAgICggSU9FcnJvciwgKCdmb28nLCksIHsgJ21lc3NhZ2UnIDogJ2ZvbycsICdhcmdzJyA6ICggJ2ZvbycsICksIH0pLAorICAgICAgICAoIElPRXJyb3IsICgnZm9vJywgJ2JhcicpLCB7ICdtZXNzYWdlJyA6ICcnLAorICAgICAgICAgICAgICAgICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpLCB9KSwKKyAgICAgICAgKCBJT0Vycm9yLCAoJ2ZvbycsICdiYXInLCAnYmF6JyksCisgICAgICAgICAgICAgICAgIHsgJ21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpLCB9KSwKKyAgICAgICAgKCBFbnZpcm9ubWVudEVycm9yLCAoJ2Vycm5vU3RyJywgJ3N0ckVycm9yU3RyJywgJ2ZpbGVuYW1lU3RyJyksCisgICAgICAgICAgICAgICAgeyAnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdlcnJub1N0cicsICdzdHJFcnJvclN0cicpLAorICAgICAgICAgICAgICAgICAgICAnc3RyZXJyb3InIDogJ3N0ckVycm9yU3RyJywKKyAgICAgICAgICAgICAgICAgICAgJ2Vycm5vJyA6ICdlcnJub1N0cicsICdmaWxlbmFtZScgOiAnZmlsZW5hbWVTdHInIH0pLAorICAgICAgICAoIEVudmlyb25tZW50RXJyb3IsICgxLCAnc3RyRXJyb3JTdHInLCAnZmlsZW5hbWVTdHInKSwKKyAgICAgICAgICAgICAgICB7ICdtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoMSwgJ3N0ckVycm9yU3RyJyksCisgICAgICAgICAgICAgICAgICAgICdzdHJlcnJvcicgOiAnc3RyRXJyb3JTdHInLCAnZXJybm8nIDogMSwKKyAgICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJyA6ICdmaWxlbmFtZVN0cicgfSksCisgICAgICAgICggU3ludGF4RXJyb3IsICgnbXNnU3RyJywpLAorICAgICAgICAgICAgICAgIHsgJ21lc3NhZ2UnIDogJ21zZ1N0cicsICdhcmdzJyA6ICgnbXNnU3RyJywgKSwKKyAgICAgICAgICAgICAgICAgICAgJ3ByaW50X2ZpbGVfYW5kX2xpbmUnIDogTm9uZSwgJ21zZycgOiAnbXNnU3RyJywKKyAgICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJyA6IE5vbmUsICdsaW5lbm8nIDogTm9uZSwgJ29mZnNldCcgOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAndGV4dCcgOiBOb25lIH0pLAorICAgICAgICAoIFN5bnRheEVycm9yLCAoJ21zZ1N0cicsICgnZmlsZW5hbWVTdHInLCAnbGluZW5vU3RyJywgJ29mZnNldFN0cicsCisgICAgICAgICAgICAgICAgICAgICAgICAndGV4dFN0cicpKSwKKyAgICAgICAgICAgICAgICB7ICdtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ21zZ1N0cicsICgnZmlsZW5hbWVTdHInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmVub1N0cicsICdvZmZzZXRTdHInLCAndGV4dFN0cicgKSksCisgICAgICAgICAgICAgICAgICAgICdwcmludF9maWxlX2FuZF9saW5lJyA6IE5vbmUsICdtc2cnIDogJ21zZ1N0cicsCisgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZScgOiAnZmlsZW5hbWVTdHInLCAnbGluZW5vJyA6ICdsaW5lbm9TdHInLAorICAgICAgICAgICAgICAgICAgICAnb2Zmc2V0JyA6ICdvZmZzZXRTdHInLCAndGV4dCcgOiAndGV4dFN0cicgfSksCisgICAgICAgICggU3ludGF4RXJyb3IsICgnbXNnU3RyJywgJ2ZpbGVuYW1lU3RyJywgJ2xpbmVub1N0cicsICdvZmZzZXRTdHInLAorICAgICAgICAgICAgICAgICAgICAndGV4dFN0cicsICdwcmludF9maWxlX2FuZF9saW5lU3RyJyksCisgICAgICAgICAgICAgICAgeyAnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdtc2dTdHInLCAnZmlsZW5hbWVTdHInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmVub1N0cicsICdvZmZzZXRTdHInLCAndGV4dFN0cicsCisgICAgICAgICAgICAgICAgICAgICAgICAncHJpbnRfZmlsZV9hbmRfbGluZVN0cicpLAorICAgICAgICAgICAgICAgICAgICAncHJpbnRfZmlsZV9hbmRfbGluZScgOiBOb25lLCAnbXNnJyA6ICdtc2dTdHInLAorICAgICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnIDogTm9uZSwgJ2xpbmVubycgOiBOb25lLCAnb2Zmc2V0JyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICd0ZXh0JyA6IE5vbmUgfSksCisgICAgICAgICggVW5pY29kZUVycm9yLCAoKSwKKyAgICAgICAgICAgICAgICB7ICdtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoKSwgfSksCisgICAgICAgICggc2FtcGxlVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgICAgIHsgJ21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnYXNjaWknLCB1J0hlbGxvIFx4ZTEnLCA2LCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgJ29yZGluYWwgbm90IGluIHJhbmdlKDEyOCknKSwKKyAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyA6ICdhc2NpaScsICdvYmplY3QnIDogdSdIZWxsbyBceGUxJywKKyAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDYsICdyZWFzb24nIDogJ29yZGluYWwgbm90IGluIHJhbmdlKDEyOCknIH0pLAorICAgICAgICAoIHNhbXBsZVVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICB7ICdtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgJ1x4ZmYnLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ29yZGluYWwgbm90IGluIHJhbmdlKDEyOCknKSwKKyAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyA6ICdhc2NpaScsICdvYmplY3QnIDogJ1x4ZmYnLAorICAgICAgICAgICAgICAgICAgICAnc3RhcnQnIDogMCwgJ3JlYXNvbicgOiAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KScgfSksCisgICAgICAgICggVW5pY29kZVRyYW5zbGF0ZUVycm9yLCAodSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpLAorICAgICAgICAgICAgICAgIHsgJ21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICh1J1x1MzA0MicsIDAsIDEsICdvdWNoJyksCisgICAgICAgICAgICAgICAgICAgICdvYmplY3QnIDogdSdcdTMwNDInLCAncmVhc29uJyA6ICdvdWNoJywKKyAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDAsICdlbmQnIDogMSB9KSwKKyAgICAgICAgXQordHJ5OgorICAgIGV4Y2VwdGlvbkxpc3QuYXBwZW5kKAorICAgICAgICAgICAgKCBXaW5kb3dzRXJyb3IsICgxLCAnc3RyRXJyb3JTdHInLCAnZmlsZW5hbWVTdHInKSwKKyAgICAgICAgICAgICAgICAgICAgeyAnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKDEsICdzdHJFcnJvclN0cicpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmVycm9yJyA6ICdzdHJFcnJvclN0cicsCisgICAgICAgICAgICAgICAgICAgICAgICAnZXJybm8nIDogMjIsICdmaWxlbmFtZScgOiAnZmlsZW5hbWVTdHInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3dpbmVycm9yJyA6IDEgfSkpCitleGNlcHQgTmFtZUVycm9yOiBwYXNzCisKK2ZvciBhcmdzIGluIGV4Y2VwdGlvbkxpc3Q6CisgICAgZXhwZWN0ZWQgPSBhcmdzWy0xXQorICAgIHRyeToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6IHJhaXNlIGFyZ3NbMF0KKyAgICAgICAgZWxzZTogcmFpc2UgYXBwbHkoYXJnc1swXSwgYXJnc1sxXSkKKyAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiwgZToKKyAgICAgICAgZm9yIGNoZWNrQXJnTmFtZSBpbiBleHBlY3RlZC5rZXlzKCk6CisgICAgICAgICAgICBpZiByZXByKGdldGF0dHIoZSwgY2hlY2tBcmdOYW1lKSkgIT0gcmVwcihleHBlY3RlZFtjaGVja0FyZ05hbWVdKToKKyAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCdDaGVja2luZyBleGNlcHRpb24gYXJndW1lbnRzLCBleGNlcHRpb24gJworICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIsIGF0dHJpYnV0ZSAiJXMiIGV4cGVjdGVkICVzIGdvdCAlcy4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICggcmVwcihlKSwgY2hlY2tBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoZXhwZWN0ZWRbY2hlY2tBcmdOYW1lXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihnZXRhdHRyKGUsIGNoZWNrQXJnTmFtZSkpICkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKaW5kZXggY2ZjMTAxOS4uY2ExYzZiYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtMTQ3LDcgKzE0Nyw3IEBACiBiYWRfbW9kZSA9ICJxd2VydHkiCiB0cnk6CiAgICAgb3BlbihURVNURk4sIGJhZF9tb2RlKQotZXhjZXB0IElPRXJyb3IsIG1zZzoKK2V4Y2VwdCBWYWx1ZUVycm9yLCBtc2c6CiAgICAgaWYgbXNnWzBdICE9IDA6CiAgICAgICAgIHMgPSBzdHIobXNnKQogICAgICAgICBpZiBzLmZpbmQoVEVTVEZOKSAhPSAtMSBvciBzLmZpbmQoYmFkX21vZGUpID09IC0xOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncnAucHkgYi9MaWIvdGVzdC90ZXN0X2dycC5weQppbmRleCAyYzNhYjI5Li4wODk1OGJhIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2dycC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dycC5weQpAQCAtMzEsNyArMzEsMTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTIuZ3JfZ2lkLCBlLmdyX2dpZCkKICAgICAgICAgICAgIGUyID0gZ3JwLmdldGdybmFtKGUuZ3JfbmFtZSkKICAgICAgICAgICAgIHNlbGYuY2hlY2tfdmFsdWUoZTIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUyLmdyX25hbWUsIGUuZ3JfbmFtZSkKKyAgICAgICAgICAgICMgVGhlcmUgYXJlIGluc3RhbmNlcyB3aGVyZSBnZXRncmFsbCgpIHJldHVybnMgZ3JvdXAgbmFtZXMgaW4KKyAgICAgICAgICAgICMgbG93ZXJjYXNlIHdoaWxlIGdldGdyZ2lkKCkgcmV0dXJucyBwcm9wZXIgY2FzaW5nLgorICAgICAgICAgICAgIyBEaXNjb3ZlcmVkIG9uIFVidW50dSA1LjA0IChjdXN0b20pLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMi5ncl9uYW1lLmxvd2VyKCksIGUuZ3JfbmFtZS5sb3dlcigpKQogCiAgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdycC5nZXRncmdpZCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKaW5kZXggYTcyYjhiZC4uZWZmYmEzYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkKQEAgLTIwNSwzICsyMDUsMjAgQEAKICAgICBhc3NlcnQgeSBpcyB0ZXN0LnRlc3Rfc3VwcG9ydCwgeS5fX25hbWVfXwogCiB0ZXN0X2ltcG9ydF9uYW1lX2JpbmRpbmcoKQorCitkZWYgdGVzdF9pbXBvcnRfaW5pdGxlc3NfZGlyZWN0b3J5X3dhcm5pbmcoKToKKyAgICBpbXBvcnQgd2FybmluZ3MKKyAgICBvbGRmaWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQorICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignZXJyb3InLCBJbXBvcnRXYXJuaW5nKTsKKyAgICB0cnk6CisgICAgICAgICMgSnVzdCBhIHJhbmRvbSBub24tcGFja2FnZSBkaXJlY3Rvcnkgd2UgYWx3YXlzIGV4cGVjdCB0byBiZQorICAgICAgICAjIHNvbWV3aGVyZSBpbiBzeXMucGF0aC4uLgorICAgICAgICBfX2ltcG9ydF9fKCJzaXRlLXBhY2thZ2VzIikKKyAgICBleGNlcHQgSW1wb3J0V2FybmluZzoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgZmluYWxseToKKyAgICAgICAgd2FybmluZ3MuZmlsdGVycyA9IG9sZGZpbHRlcnMKKwordGVzdF9pbXBvcnRfaW5pdGxlc3NfZGlyZWN0b3J5X3dhcm5pbmcoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkKaW5kZXggMDY5MzU4MS4uZThiNDY5NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5CkBAIC0xNCw2ICsxNCw3IEBACiAKIGFic2ltcCA9ICJpbXBvcnQgc3ViXG4iCiByZWxpbXAgPSAiZnJvbSAuIGltcG9ydCBzdWJcbiIKK2RlZXByZWxpbXAgPSAiZnJvbSAuLi4uIGltcG9ydCBzdWJcbiIKIGZ1dGltcCA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydFxuIgogCiByZWxvYWRfc3JjID0gdGVzdF9zcmMrIiIiXApAQCAtMjYsNiArMjcsNyBAQAogdGVzdDJfb2xkYWJzX2NvID0gY29tcGlsZShhYnNpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQogdGVzdDJfbmV3YWJzX2NvID0gY29tcGlsZShmdXRpbXAgKyBhYnNpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQogdGVzdDJfbmV3cmVsX2NvID0gY29tcGlsZShyZWxpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQordGVzdDJfZGVlcHJlbF9jbyA9IGNvbXBpbGUoZGVlcHJlbGltcCArIHRlc3Rfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpCiB0ZXN0Ml9mdXRyZWxfY28gPSBjb21waWxlKGZ1dGltcCArIHJlbGltcCArIHRlc3Rfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpCiAKIHRlc3RfcGF0aCA9ICIhISFfdGVzdF8hISEiCkBAIC00NiwxMCArNDgsMTEgQEAKICAgICAgICAgImhvb2t0ZXN0bW9kdWxlIjogKEZhbHNlLCB0ZXN0X2NvKSwKICAgICAgICAgImhvb2t0ZXN0cGFja2FnZSI6IChUcnVlLCB0ZXN0X2NvKSwKICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIiOiAoVHJ1ZSwgdGVzdF9jbyksCi0gICAgICAgICJob29rdGVzdHBhY2thZ2Uuc3ViLnN1YmJlciI6IChGYWxzZSwgdGVzdF9jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2Uuc3ViLnN1YmJlciI6IChUcnVlLCB0ZXN0X2NvKSwKICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5vbGRhYnMiOiAoRmFsc2UsIHRlc3QyX29sZGFic19jbyksCiAgICAgICAgICJob29rdGVzdHBhY2thZ2UubmV3YWJzIjogKEZhbHNlLCB0ZXN0Ml9uZXdhYnNfY28pLAogICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLm5ld3JlbCI6IChGYWxzZSwgdGVzdDJfbmV3cmVsX2NvKSwKKyAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyLnN1YmVzdCI6IChUcnVlLCB0ZXN0Ml9kZWVwcmVsX2NvKSwKICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5mdXRyZWwiOiAoRmFsc2UsIHRlc3QyX2Z1dHJlbF9jbyksCiAgICAgICAgICJzdWIiOiAoRmFsc2UsIHRlc3RfY28pLAogICAgICAgICAicmVsb2FkbW9kdWxlIjogKEZhbHNlLCB0ZXN0X2NvKSwKQEAgLTIwMyw2ICsyMDYsMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UubmV3cmVsLnN1YiwKICAgICAgICAgICAgICAgICAgICAgICAgICBob29rdGVzdHBhY2thZ2Uuc3ViKQogCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2Uuc3ViLnN1YmJlci5zdWJlc3QgYXMgc3ViZXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ViZXN0LmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyLnN1YmVzdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ViZXN0LnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob29rdGVzdHBhY2thZ2Uuc3ViKQorCiAgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2UuZnV0cmVsCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLmZ1dHJlbC5nZXRfbmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJob29rdGVzdHBhY2thZ2UuZnV0cmVsIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9jYWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9sb2NhbGUucHkKaW5kZXggMTUyM2U3Ny4uOWUyNjRiOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb2NhbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb2NhbGUucHkKQEAgLTIwLDE0ICsyMCwxNCBAQAogZWxzZToKICAgICByYWlzZSBJbXBvcnRFcnJvciwgInRlc3QgbG9jYWxlIG5vdCBzdXBwb3J0ZWQgKHRyaWVkICVzKSIlKCcsICcuam9pbih0bG9jcykpCiAKLWRlZiB0ZXN0Zm9ybWF0KGZvcm1hdHN0ciwgdmFsdWUsIGdyb3VwaW5nID0gMCwgb3V0cHV0PU5vbmUpOgorZGVmIHRlc3Rmb3JtYXQoZm9ybWF0c3RyLCB2YWx1ZSwgZ3JvdXBpbmcgPSAwLCBvdXRwdXQ9Tm9uZSwgZnVuYz1sb2NhbGUuZm9ybWF0KToKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBpZiBvdXRwdXQ6CiAgICAgICAgICAgICBwcmludCAiJXMgJSUgJXMgPT8gJXMgLi4uIiAlXAogICAgICAgICAgICAgICAgIChyZXByKGZvcm1hdHN0ciksIHJlcHIodmFsdWUpLCByZXByKG91dHB1dCkpLAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcHJpbnQgIiVzICUlICVzIHdvcmtzPyAuLi4iICUgKHJlcHIoZm9ybWF0c3RyKSwgcmVwcih2YWx1ZSkpLAotICAgIHJlc3VsdCA9IGxvY2FsZS5mb3JtYXQoZm9ybWF0c3RyLCB2YWx1ZSwgZ3JvdXBpbmcgPSBncm91cGluZykKKyAgICByZXN1bHQgPSBmdW5jKGZvcm1hdHN0ciwgdmFsdWUsIGdyb3VwaW5nID0gZ3JvdXBpbmcpCiAgICAgaWYgb3V0cHV0IGFuZCByZXN1bHQgIT0gb3V0cHV0OgogICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgJ25vJwpAQCAtNDksNiArNDksMzAgQEAKICAgICB0ZXN0Zm9ybWF0KCIlLTEwLmYiLCA0MjAwLCBncm91cGluZz0xLCBvdXRwdXQ9JzQlczIwMCAgICAgJyAlIHNlcCkKICAgICAjIEludm9rZSBnZXRwcmVmZXJyZWRlbmNvZGluZyB0byBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgZXhjZXB0aW9ucywKICAgICBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoKQorCisgICAgIyA9PT0gVGVzdCBmb3JtYXQoKSB3aXRoIG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN0cmluZ3MKKyAgICAjIHRlc3QgaWYgZ3JvdXBpbmcgaXMgaW5kZXBlbmRlbnQgZnJvbSBvdGhlciBjaGFyYWN0ZXJzIGluIGZvcm1hdHRpbmcgc3RyaW5nCisgICAgdGVzdGZvcm1hdCgiT25lIG1pbGxpb24gaXMgJWkiLCAxMDAwMDAwLCBncm91cGluZz0xLAorICAgICAgICAgICAgICAgb3V0cHV0PSdPbmUgbWlsbGlvbiBpcyAxJXMwMDAlczAwMCcgJSAoc2VwLCBzZXApLAorICAgICAgICAgICAgICAgZnVuYz1sb2NhbGUuZm9ybWF0X3N0cmluZykKKyAgICB0ZXN0Zm9ybWF0KCJPbmUgIG1pbGxpb24gaXMgJWkiLCAxMDAwMDAwLCBncm91cGluZz0xLAorICAgICAgICAgICAgICAgb3V0cHV0PSdPbmUgIG1pbGxpb24gaXMgMSVzMDAwJXMwMDAnICUgKHNlcCwgc2VwKSwKKyAgICAgICAgICAgICAgIGZ1bmM9bG9jYWxlLmZvcm1hdF9zdHJpbmcpCisgICAgIyB0ZXN0IGRvdHMgaW4gZm9ybWF0dGluZyBzdHJpbmcKKyAgICB0ZXN0Zm9ybWF0KCIuJWYuIiwgMTAwMC4wLCBvdXRwdXQ9Jy4xMDAwLjAwMDAwMC4nLCBmdW5jPWxvY2FsZS5mb3JtYXRfc3RyaW5nKQorICAgICMgdGVzdCBmbG9hdHMKKyAgICB0ZXN0Zm9ybWF0KCItLT4gJTEwLjJmIiwgMTAwMC4wLCBncm91cGluZz0xLCBvdXRwdXQ9Jy0tPiAgIDElczAwMC4wMCcgJSBzZXAsCisgICAgICAgICAgICAgICBmdW5jPWxvY2FsZS5mb3JtYXRfc3RyaW5nKQorICAgICMgdGVzdCBhc3RlcmlzayBmb3JtYXRzCisgICAgdGVzdGZvcm1hdCgiJTEwLipmIiwgKDIsIDEwMDAuMCksIGdyb3VwaW5nPTAsIG91dHB1dD0nICAgMTAwMC4wMCcsCisgICAgICAgICAgICAgICBmdW5jPWxvY2FsZS5mb3JtYXRfc3RyaW5nKQorICAgIHRlc3Rmb3JtYXQoIiUqLipmIiwgKDEwLCAyLCAxMDAwLjApLCBncm91cGluZz0xLCBvdXRwdXQ9JyAgMSVzMDAwLjAwJyAlIHNlcCwKKyAgICAgICAgICAgICAgIGZ1bmM9bG9jYWxlLmZvcm1hdF9zdHJpbmcpCisgICAgIyB0ZXN0IG1vcmUtaW4tb25lCisgICAgdGVzdGZvcm1hdCgiaW50ICVpIGZsb2F0ICUuMmYgc3RyICVzIiwgKDEwMDAsIDEwMDAuMCwgJ3N0cicpLCBncm91cGluZz0xLAorICAgICAgICAgICAgICAgb3V0cHV0PSdpbnQgMSVzMDAwIGZsb2F0IDElczAwMC4wMCBzdHIgc3RyJyAlIChzZXAsIHNlcCksCisgICAgICAgICAgICAgICBmdW5jPWxvY2FsZS5mb3JtYXRfc3RyaW5nKQorCiBmaW5hbGx5OgogICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX05VTUVSSUMsIG9sZGxvY2FsZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CmluZGV4IGI2ODlkYzguLjczZjgyODggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBvcywgc3lzLCBzdHJpbmcsIHN0cnVjdCwgdHlwZXMsIGNQaWNrbGUsIGNTdHJpbmdJTwogaW1wb3J0IHNvY2tldCwgdGVtcGZpbGUsIHRocmVhZGluZywgdGltZQogaW1wb3J0IGxvZ2dpbmcsIGxvZ2dpbmcuaGFuZGxlcnMsIGxvZ2dpbmcuY29uZmlnCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fd2l0aF9sb2NhbGUKIAogQkFOTkVSID0gIi0tICUtMTBzICUtNnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCiAKQEAgLTY1NywxOSArNjU4LDExIEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHJvb3RMb2dnZXIucmVtb3ZlSGFuZGxlcihoZGxyKQogCisjIFNldCB0aGUgbG9jYWxlIHRvIHRoZSBwbGF0Zm9ybS1kZXBlbmRlbnQgZGVmYXVsdC4gIEkgaGF2ZSBubyBpZGVhCisjIHdoeSB0aGUgdGVzdCBkb2VzIHRoaXMsIGJ1dCBpbiBhbnkgY2FzZSB3ZSBzYXZlIHRoZSBjdXJyZW50IGxvY2FsZQorIyBmaXJzdCBhbmQgcmVzdG9yZSBpdCBhdCB0aGUgZW5kLgorQHJ1bl93aXRoX2xvY2FsZSgnTENfQUxMJywgJycpCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgaW1wb3J0IGxvY2FsZQotICAgICMgU2V0IHRoZSBsb2NhbGUgdG8gdGhlIHBsYXRmb3JtLWRlcGVuZGVudCBkZWZhdWx0LiAgSSBoYXZlIG5vIGlkZWEKLSAgICAjIHdoeSB0aGUgdGVzdCBkb2VzIHRoaXMsIGJ1dCBpbiBhbnkgY2FzZSB3ZSBzYXZlIHRoZSBjdXJyZW50IGxvY2FsZQotICAgICMgZmlyc3Qgc28gd2UgY2FuIHJlc3RvcmUgaXQgYXQgdGhlIGVuZC4KLSAgICB0cnk6Ci0gICAgICAgIG9yaWdpbmFsX2xvY2FsZSA9IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCkKLSAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCAnJykKLSAgICBleGNlcHQgKFZhbHVlRXJyb3IsIGxvY2FsZS5FcnJvcik6Ci0gICAgICAgICMgdGhpcyBoYXBwZW5zIG9uIGEgU29sYXJpcyBib3ggd2hpY2ggb25seSBzdXBwb3J0cyAiQyIgbG9jYWxlCi0gICAgICAgICMgb3IgYSBNYWMgT1MgWCBib3ggd2hpY2ggc3VwcG9ydHMgdmVyeSBsaXR0bGUgbG9jYWxlIHN0dWZmIGF0IGFsbAotICAgICAgICBvcmlnaW5hbF9sb2NhbGUgPSBOb25lCi0KICAgICAjIFNhdmUgYW5kIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHJvb3QgbG9nZ2VyIGxldmVsIGFjcm9zcyB0aGUgdGVzdHMuCiAgICAgIyBPdGhlcndpc2UsIGUuZy4sIGlmIGFueSB0ZXN0IHVzaW5nIGNvb2tpZWxpYiBydW5zIGFmdGVyIHRlc3RfbG9nZ2luZywKICAgICAjIGNvb2tpZWxpYidzIGRlYnVnLWxldmVsIGxvZ2dlciB0cmllcyB0byBsb2cgbWVzc2FnZXMsIGxlYWRpbmcgdG8KQEAgLTY4MSw4ICs2NzQsNiBAQAogICAgIHRyeToKICAgICAgICAgdGVzdF9tYWluX2lubmVyKCkKICAgICBmaW5hbGx5OgotICAgICAgICBpZiBvcmlnaW5hbF9sb2NhbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwsIG9yaWdpbmFsX2xvY2FsZSkKICAgICAgICAgcm9vdF9sb2dnZXIuc2V0TGV2ZWwob3JpZ2luYWxfbG9nZ2luZ19sZXZlbCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQppbmRleCA3N2QzOWE2Li45MTRhMjBjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC0xLDE1ICsxLDE1NzYgQEAKLWltcG9ydCBtYWlsYm94CiBpbXBvcnQgb3MKIGltcG9ydCB0aW1lCi1pbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdGF0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgZW1haWwKK2ltcG9ydCBlbWFpbC5NZXNzYWdlCitpbXBvcnQgcmZjODIyCitpbXBvcnQgcmUKK2ltcG9ydCBTdHJpbmdJTwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKLQotIyBjbGVhbnVwIGVhcmxpZXIgdGVzdHMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG1haWxib3gKK2ltcG9ydCBnbG9iCiB0cnk6Ci0gICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCi1leGNlcHQgb3MuZXJyb3I6CisgICAgaW1wb3J0IGZjbnRsCitleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgcGFzcwogCisKK2NsYXNzIFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfY2hlY2tfc2FtcGxlKHNlbGYsIG1zZyk6CisgICAgICAgICMgSW5zcGVjdCBhIG1haWxib3guTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtcGxlIG1lc3NhZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnLCBlbWFpbC5NZXNzYWdlLk1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2csIG1haWxib3guTWVzc2FnZSkpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIF9zYW1wbGVfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZSBpbiBtc2cuZ2V0X2FsbChrZXkpKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKG1zZy5nZXRfcGF5bG9hZCgpKSA9PSBsZW4oX3NhbXBsZV9wYXlsb2FkcykpCisgICAgICAgIGZvciBpLCBwYXlsb2FkIGluIGVudW1lcmF0ZShfc2FtcGxlX3BheWxvYWRzKToKKyAgICAgICAgICAgIHBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHBhcnQsIGVtYWlsLk1lc3NhZ2UuTWVzc2FnZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzaW5zdGFuY2UocGFydCwgbWFpbGJveC5NZXNzYWdlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhwYXJ0LmdldF9wYXlsb2FkKCkgPT0gcGF5bG9hZCkKKworICAgIGRlZiBfZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYsIHRhcmdldCk6CisgICAgICAgICMgRGVsZXRlIGEgZmlsZSBvciBkZWxldGUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXQpOgorICAgICAgICAgICAgZm9yIHBhdGgsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsodGFyZ2V0LCB0b3Bkb3duPUZhbHNlKToKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihwYXRoLCBuYW1lKSkKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBkaXJzOgorICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkpCisgICAgICAgICAgICBvcy5ybWRpcih0YXJnZXQpCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHModGFyZ2V0KToKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0YXJnZXQpCisKKworY2xhc3MgVGVzdE1haWxib3goVGVzdEJhc2UpOgorCisgICAgX2ZhY3RvcnkgPSBOb25lICAgICAjIE92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byByZXVzZSB0ZXN0cworICAgIF90ZW1wbGF0ZSA9ICdGcm9tOiBmb29cblxuJXMnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYuX3BhdGgpCisKKyAgICBkZWYgdGVzdF9hZGQoc2VsZik6CisgICAgICAgICMgQWRkIGNvcGllcyBvZiBhIHNhbXBsZSBtZXNzYWdlCisgICAgICAgIGtleXMgPSBbXQorICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAxKQorICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKG1haWxib3guTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDIpCisgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhfc2FtcGxlX21lc3NhZ2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDMpCisgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoU3RyaW5nSU8uU3RyaW5nSU8oX3NhbXBsZV9tZXNzYWdlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSA0KQorICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5c1swXSkgPT0gc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBmb3IgaSBpbiAoMSwgMiwgMywgNCk6CisgICAgICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUoc2VsZi5fYm94W2tleXNbaV1dKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICAjIFJlbW92ZSBtZXNzYWdlcyB1c2luZyByZW1vdmUoKQorICAgICAgICBzZWxmLl90ZXN0X3JlbW92ZV9vcl9kZWxpdGVtKHNlbGYuX2JveC5yZW1vdmUpCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICAjIFJlbW92ZSBtZXNzYWdlcyB1c2luZyBfX2RlbGl0ZW1fXygpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVtb3ZlX29yX2RlbGl0ZW0oc2VsZi5fYm94Ll9fZGVsaXRlbV9fKQorCisgICAgZGVmIF90ZXN0X3JlbW92ZV9vcl9kZWxpdGVtKHNlbGYsIG1ldGhvZCk6CisgICAgICAgICMgKFVzZWQgYnkgdGVzdF9yZW1vdmUoKSBhbmQgdGVzdF9kZWxpdGVtKCkuKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDIpCisgICAgICAgIG1ldGhvZChrZXkwKQorICAgICAgICBsID0gbGVuKHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGwgPT0gMSwgImFjdHVhbCBsOiAlcyIgJSBsKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IG1ldGhvZChrZXkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09IHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAyKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMikKKyAgICAgICAgbWV0aG9kKGtleTIpCisgICAgICAgIGwgPSBsZW4oc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydF8obCA9PSAxLCAiYWN0dWFsIGw6ICVzIiAlIGwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogbWV0aG9kKGtleTIpKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBtZXRob2Qoa2V5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogbWV0aG9kKGtleTEpKQorCisgICAgZGVmIHRlc3RfZGlzY2FyZChzZWxmLCByZXBldGl0aW9ucz0xMCk6CisgICAgICAgICMgRGlzY2FyZCBtZXNzYWdlcworICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDIpCisgICAgICAgIHNlbGYuX2JveC5kaXNjYXJkKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCisgICAgICAgIHNlbGYuX2JveC5kaXNjYXJkKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgICMgUmV0cmlldmUgbWVzc2FnZXMgdXNpbmcgZ2V0KCkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfcGF5bG9hZCgpID09ICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXQoJ2ZvbycpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0KCdmb28nLCBGYWxzZSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5mcC5yZWFkKCkgPT0gJzEnKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgIyBSZXRyaWV2ZSBtZXNzYWdlIHVzaW5nIF9fZ2V0aXRlbV9fKCkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cgPSBzZWxmLl9ib3hba2V5MF0KKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ1snZnJvbSddID09ICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9wYXlsb2FkKCkgPT0gJzAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hbJ2ZvbyddKQorICAgICAgICBzZWxmLl9ib3guZGlzY2FyZChrZXkwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCisKKyAgICBkZWYgdGVzdF9nZXRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgIyBHZXQgTWVzc2FnZSByZXByZXNlbnRhdGlvbnMgb2YgbWVzc2FnZXMKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZzAgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnMCwgbWFpbGJveC5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZzBbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZzAuZ2V0X3BheWxvYWQoKSA9PSAnMCcpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MSkpCisKKyAgICBkZWYgdGVzdF9nZXRfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gX3NhbXBsZV9tZXNzYWdlKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGUoc2VsZik6CisgICAgICAgICMgR2V0IGZpbGUgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9maWxlKGtleTApLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpCisgICAgICAgICAgICAgICAgICAgICA9PSBzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X2ZpbGUoa2V5MSkucmVhZCgpLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgID09IF9zYW1wbGVfbWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2l0ZXJrZXlzKHNlbGYpOgorICAgICAgICAjIEdldCBrZXlzIHVzaW5nIGl0ZXJrZXlzKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmF0aW9uKHNlbGYuX2JveC5pdGVya2V5cywgZG9fa2V5cz1UcnVlLCBkb192YWx1ZXM9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgorICAgICAgICAjIEdldCBrZXlzIHVzaW5nIGtleXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94LmtleXMsIGRvX2tleXM9VHJ1ZSwgZG9fdmFsdWVzPUZhbHNlKQorCisgICAgZGVmIHRlc3RfaXRlcnZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBHZXQgdmFsdWVzIHVzaW5nIGl0ZXJ2YWx1ZXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94Lml0ZXJ2YWx1ZXMsIGRvX2tleXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2l0ZXIoc2VsZik6CisgICAgICAgICMgR2V0IHZhbHVlcyB1c2luZyBfX2l0ZXJfXygpCisgICAgICAgIHNlbGYuX2NoZWNrX2l0ZXJhdGlvbihzZWxmLl9ib3guX19pdGVyX18sIGRvX2tleXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBHZXQgdmFsdWVzIHVzaW5nIHZhbHVlcygpCisgICAgICAgIHNlbGYuX2NoZWNrX2l0ZXJhdGlvbihzZWxmLl9ib3gudmFsdWVzLCBkb19rZXlzPUZhbHNlLCBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2l0ZXJpdGVtcyhzZWxmKToKKyAgICAgICAgIyBHZXQga2V5cyBhbmQgdmFsdWVzIHVzaW5nIGl0ZXJpdGVtcygpCisgICAgICAgIHNlbGYuX2NoZWNrX2l0ZXJhdGlvbihzZWxmLl9ib3guaXRlcml0ZW1zLCBkb19rZXlzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2l0ZW1zKHNlbGYpOgorICAgICAgICAjIEdldCBrZXlzIGFuZCB2YWx1ZXMgdXNpbmcgaXRlbXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94Lml0ZW1zLCBkb19rZXlzPVRydWUsIGRvX3ZhbHVlcz1UcnVlKQorCisgICAgZGVmIF9jaGVja19pdGVyYXRpb24oc2VsZiwgbWV0aG9kLCBkb19rZXlzLCBkb192YWx1ZXMsIHJlcGV0aXRpb25zPTEwKToKKyAgICAgICAgZm9yIHZhbHVlIGluIG1ldGhvZCgpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJOb3QgZW1wdHkiKQorICAgICAgICBrZXlzLCB2YWx1ZXMgPSBbXSwgW10KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHJlcGV0aXRpb25zKToKKyAgICAgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSBpKSkKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5fdGVtcGxhdGUgJSBpKQorICAgICAgICBpZiBkb19rZXlzIGFuZCBub3QgZG9fdmFsdWVzOgorICAgICAgICAgICAgcmV0dXJuZWRfa2V5cyA9IGxpc3QobWV0aG9kKCkpCisgICAgICAgIGVsaWYgZG9fdmFsdWVzIGFuZCBub3QgZG9fa2V5czoKKyAgICAgICAgICAgIHJldHVybmVkX3ZhbHVlcyA9IGxpc3QobWV0aG9kKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm5lZF9rZXlzLCByZXR1cm5lZF92YWx1ZXMgPSBbXSwgW10KKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG1ldGhvZCgpOgorICAgICAgICAgICAgICAgIHJldHVybmVkX2tleXMuYXBwZW5kKGtleSkKKyAgICAgICAgICAgICAgICByZXR1cm5lZF92YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgICAgICBpZiBkb19rZXlzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihrZXlzKSA9PSBsZW4ocmV0dXJuZWRfa2V5cykpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oc2V0KGtleXMpID09IHNldChyZXR1cm5lZF9rZXlzKSkKKyAgICAgICAgaWYgZG9fdmFsdWVzOgorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gcmV0dXJuZWRfdmFsdWVzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZVsnZnJvbSddID09ICdmb28nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQodmFsdWUuZ2V0X3BheWxvYWQoKSkgPCByZXBldGl0aW9ucykKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKHZhbHVlcykgPT0gY291bnQpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICAjIENoZWNrIGV4aXN0ZW5jZSBvZiBrZXlzIHVzaW5nIGhhc19rZXkoKQorICAgICAgICBzZWxmLl90ZXN0X2hhc19rZXlfb3JfY29udGFpbnMoc2VsZi5fYm94Lmhhc19rZXkpCisKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgIyBDaGVjayBleGlzdGVuY2Ugb2Yga2V5cyB1c2luZyBfX2NvbnRhaW5zX18oKQorICAgICAgICBzZWxmLl90ZXN0X2hhc19rZXlfb3JfY29udGFpbnMoc2VsZi5fYm94Ll9fY29udGFpbnNfXykKKworICAgIGRlZiBfdGVzdF9oYXNfa2V5X29yX2NvbnRhaW5zKHNlbGYsIG1ldGhvZCk6CisgICAgICAgICMgKFVzZWQgYnkgdGVzdF9oYXNfa2V5KCkgYW5kIHRlc3RfY29udGFpbnMoKS4pCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgbWV0aG9kKCdmb28nKSkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1ldGhvZChrZXkxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1ldGhvZChrZXkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtZXRob2QoJ2ZvbycpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgbWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTEpKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtZXRob2Qoa2V5MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgbWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZiwgcmVwZXRpdGlvbnM9MTApOgorICAgICAgICAjIEdldCBtZXNzYWdlIGNvdW50CisgICAgICAgIGtleXMgPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocmVwZXRpdGlvbnMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IGkpCisgICAgICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gaSArIDEpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShyZXBldGl0aW9ucyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gcmVwZXRpdGlvbnMgLSBpKQorICAgICAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXlzW2ldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IHJlcGV0aXRpb25zIC0gaSAtIDEpCisKKyAgICBkZWYgdGVzdF9zZXRfaXRlbShzZWxmKToKKyAgICAgICAgIyBNb2RpZnkgbWVzc2FnZXMgdXNpbmcgX19zZXRpdGVtX18oKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApID09IFwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09IFwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDEnKQorICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDAnCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PSBcCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDAnKQorICAgICAgICBzZWxmLl9ib3hba2V5MV0gPSBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDEnCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBcCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDEnKQorICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBfc2FtcGxlX21lc3NhZ2UKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKHNlbGYuX2JveFtrZXkwXSkKKyAgICAgICAgc2VsZi5fYm94W2tleTFdID0gc2VsZi5fYm94W2tleTBdCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5MV0pCisgICAgICAgIHNlbGYuX2JveFtrZXkwXSA9IHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PQorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5MV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHNlbGYuX2JveC5fX3NldGl0ZW1fXygnZm9vJywgJ2JhcicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hbJ2ZvbyddKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMikKKworICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgorICAgICAgICAjIFJlbW92ZSBhbGwgbWVzc2FnZXMgdXNpbmcgY2xlYXIoKQorICAgICAgICBrZXlzID0gW10KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgorICAgICAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpCisgICAgICAgIGZvciBpLCBrZXkgaW4gZW51bWVyYXRlKGtleXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgPT0gc2VsZi5fdGVtcGxhdGUgJSBpKQorICAgICAgICBzZWxmLl9ib3guY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMCkKKyAgICAgICAgZm9yIGksIGtleSBpbiBlbnVtZXJhdGUoa2V5cyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkpKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICAjIEdldCBhbmQgcmVtb3ZlIGEgbWVzc2FnZSB1c2luZyBwb3AoKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhrZXkwIGluIHNlbGYuX2JveCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gucG9wKGtleTApLmdldF9wYXlsb2FkKCkgPT0gJzAnKQorICAgICAgICBzZWxmLmFzc2VydF8oa2V5MCBub3QgaW4gc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGtleTIgaW4gc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LnBvcChrZXkyKS5nZXRfcGF5bG9hZCgpID09ICcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGtleTIgbm90IGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGtleTEgaW4gc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LnBvcChrZXkxKS5nZXRfcGF5bG9hZCgpID09ICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGtleTEgbm90IGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDApCisKKyAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgorICAgICAgICAjIEdldCBhbmQgcmVtb3ZlIGFuIGFyYml0cmFyeSAoa2V5LCBtZXNzYWdlKSB1c2luZyBwb3BpdGVtKCkKKyAgICAgICAga2V5cyA9IFtdCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CisgICAgICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgaSkpCisgICAgICAgIHNlZW4gPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTApOgorICAgICAgICAgICAga2V5LCBtc2cgPSBzZWxmLl9ib3gucG9waXRlbSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IGluIGtleXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IG5vdCBpbiBzZWVuKQorICAgICAgICAgICAgc2Vlbi5hcHBlbmQoa2V5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGludChtc2cuZ2V0X3BheWxvYWQoKSkgPT0ga2V5cy5pbmRleChrZXkpKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMCkKKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleV0pCisKKyAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CisgICAgICAgICMgTW9kaWZ5IG11bHRpcGxlIG1lc3NhZ2VzIHVzaW5nIHVwZGF0ZSgpCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAxJykKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMicpCisgICAgICAgIHNlbGYuX2JveC51cGRhdGUoe2tleTA6IHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTI6IF9zYW1wbGVfbWVzc2FnZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5Ml0pCisgICAgICAgIHNlbGYuX2JveC51cGRhdGUoWyhrZXkyLCBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDInKSwKKyAgICAgICAgICAgICAgICAgICAgKGtleTEsIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMScpLAorICAgICAgICAgICAgICAgICAgICAoa2V5MCwgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PQorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTIpID09CisgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzZWxmLl9ib3gudXBkYXRlKHsnZm9vJzogJ2JhcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkwOiBzZWxmLl90ZW1wbGF0ZSAlICJjaGFuZ2VkIDAifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAiY2hhbmdlZCAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTIpID09CisgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICJjaGFuZ2VkIDIiKQorCisgICAgZGVmIHRlc3RfZmx1c2goc2VsZik6CisgICAgICAgICMgV3JpdGUgY2hhbmdlcyB0byBkaXNrCisgICAgICAgIHNlbGYuX3Rlc3RfZmx1c2hfb3JfY2xvc2Uoc2VsZi5fYm94LmZsdXNoKQorCisgICAgZGVmIHRlc3RfbG9ja191bmxvY2soc2VsZik6CisgICAgICAgICMgTG9jayBhbmQgdW5sb2NrIHRoZSBtYWlsYm94CisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5fZ2V0X2xvY2tfcGF0aCgpKSkKKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoc2VsZi5fZ2V0X2xvY2tfcGF0aCgpKSkKKyAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5fZ2V0X2xvY2tfcGF0aCgpKSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICAjIENsb3NlIG1haWxib3ggYW5kIGZsdXNoIGNoYW5nZXMgdG8gZGlzaworICAgICAgICBzZWxmLl90ZXN0X2ZsdXNoX29yX2Nsb3NlKHNlbGYuX2JveC5jbG9zZSkKKworICAgIGRlZiBfdGVzdF9mbHVzaF9vcl9jbG9zZShzZWxmLCBtZXRob2QpOgorICAgICAgICBjb250ZW50cyA9IFtzZWxmLl90ZW1wbGF0ZSAlIGkgZm9yIGkgaW4geHJhbmdlKDMpXQorICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzBdKQorICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzFdKQorICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzJdKQorICAgICAgICBtZXRob2QoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCisgICAgICAgIGtleXMgPSBzZWxmLl9ib3gua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oa2V5cykgPT0gMykKKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gY29udGVudHMpCisKKyAgICBkZWYgdGVzdF9kdW1wX21lc3NhZ2Uoc2VsZik6CisgICAgICAgICMgV3JpdGUgbWVzc2FnZSByZXByZXNlbnRhdGlvbnMgdG8gZGlzaworICAgICAgICBmb3IgaW5wdXQgaW4gKGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoX3NhbXBsZV9tZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2UsIFN0cmluZ0lPLlN0cmluZ0lPKF9zYW1wbGVfbWVzc2FnZSkpOgorICAgICAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgc2VsZi5fYm94Ll9kdW1wX21lc3NhZ2UoaW5wdXQsIG91dHB1dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdXRwdXQuZ2V0dmFsdWUoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgIF9zYW1wbGVfbWVzc2FnZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzZWxmLl9ib3guX2R1bXBfbWVzc2FnZShOb25lLCBvdXRwdXQpKQorCisgICAgZGVmIF9nZXRfbG9ja19wYXRoKHNlbGYpOgorICAgICAgICAjIFJldHVybiB0aGUgcGF0aCBvZiB0aGUgZG90IGxvY2sgZmlsZS4gTWF5IGJlIG92ZXJyaWRkZW4uCisgICAgICAgIHJldHVybiBzZWxmLl9wYXRoICsgJy5sb2NrJworCisKK2NsYXNzIFRlc3RNYWlsYm94U3VwZXJjbGFzcyhUZXN0QmFzZSk6CisKKyAgICBkZWYgdGVzdF9ub3RpbXBsZW1lbnRlZChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgYWxsIE1haWxib3ggbWV0aG9kcyByYWlzZSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgYm94ID0gbWFpbGJveC5NYWlsYm94KCdwYXRoJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guYWRkKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gucmVtb3ZlKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guX19kZWxpdGVtX18oJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5kaXNjYXJkKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guX19zZXRpdGVtX18oJycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guaXRlcmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5pdGVydmFsdWVzKCkubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2l0ZXJfXygpLm5leHQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gudmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Lml0ZXJpdGVtcygpLm5leHQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guaXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guZ2V0KCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guX19nZXRpdGVtX18oJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5nZXRfbWVzc2FnZSgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LmdldF9zdHJpbmcoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5nZXRfZmlsZSgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Lmhhc19rZXkoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2NvbnRhaW5zX18oJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2xlbl9fKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LmNsZWFyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LnBvcCgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LnBvcGl0ZW0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gudXBkYXRlKCgoJycsICcnKSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guZmx1c2goKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gubG9jaygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC51bmxvY2soKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guY2xvc2UoKSkKKworCitjbGFzcyBUZXN0TWFpbGRpcihUZXN0TWFpbGJveCk6CisKKyAgICBfZmFjdG9yeSA9IGxhbWJkYSBzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmU6IG1haWxib3guTWFpbGRpcihwYXRoLCBmYWN0b3J5KQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBUZXN0TWFpbGJveC5zZXRVcChzZWxmKQorICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICBzZWxmLl9ib3guY29sb24gPSAnIScKKworICAgIGRlZiB0ZXN0X2FkZF9NTShzZWxmKToKKyAgICAgICAgIyBBZGQgYSBNYWlsZGlyTWVzc2FnZSBpbnN0YW5jZQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgIG1zZy5zZXRfaW5mbygnZm9vJykKKyAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2N1cicsICclcyVzZm9vJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleSwgc2VsZi5fYm94LmNvbG9uKSkpKQorCisgICAgZGVmIHRlc3RfZ2V0X01NKHNlbGYpOgorICAgICAgICAjIEdldCBhIE1haWxkaXJNZXNzYWdlIGluc3RhbmNlCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgbXNnLnNldF9mbGFncygnUkYnKQorICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKG1zZykKKyAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnX3JldHVybmVkLCBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJ0ZSJykKKworICAgIGRlZiB0ZXN0X3NldF9NTShzZWxmKToKKyAgICAgICAgIyBTZXQgd2l0aCBhIE1haWxkaXJNZXNzYWdlIGluc3RhbmNlCisgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnMC5zZXRfZmxhZ3MoJ1RQJykKKyAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQorICAgICAgICBzZWxmLmFzc2VydF8obXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnUFQnKQorICAgICAgICBtc2cxID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuX2JveFtrZXldID0gbXNnMQorICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQorICAgICAgICBzZWxmLmFzc2VydF8obXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfcGF5bG9hZCgpID09ICcxJykKKyAgICAgICAgbXNnMiA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAyKQorICAgICAgICBtc2cyLnNldF9pbmZvKCcyLFMnKQorICAgICAgICBzZWxmLl9ib3hba2V5XSA9IG1zZzIKKyAgICAgICAgc2VsZi5fYm94W2tleV0gPSBzZWxmLl90ZW1wbGF0ZSAlIDMKKyAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJ1MnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnX3JldHVybmVkLmdldF9wYXlsb2FkKCkgPT0gJzMnKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV9uZXcoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBhIG5vbi1leGlzdGVudCBtYWlsYm94CisgICAgICAgIHNlbGYudGVhckRvd24oKQorICAgICAgICBzZWxmLl9ib3ggPSBtYWlsYm94Lk1haWxkaXIoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgsIGZhY3Rvcnk9Tm9uZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKCkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfZXhpc3Rpbmcoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBhbiBleGlzdGluZyBtYWlsYm94CisgICAgICAgIHNlbGYudGVhckRvd24oKQorICAgICAgICBmb3Igc3ViZGlyIGluICcnLCAndG1wJywgJ25ldycsICdjdXInOgorICAgICAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YmRpcikpCisgICAgICAgIHNlbGYuX2JveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9jaGVja19iYXNpY3MoZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSkKKyAgICAgICAgc2VsZi5fYm94ID0gbWFpbGJveC5NYWlsZGlyKHNlbGYuX3BhdGgsIGZhY3Rvcnk9Tm9uZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKCkKKworICAgIGRlZiBfY2hlY2tfYmFzaWNzKHNlbGYsIGZhY3Rvcnk9Tm9uZSk6CisgICAgICAgICMgKFVzZWQgYnkgdGVzdF9vcGVuX25ldygpIGFuZCB0ZXN0X29wZW5fZXhpc3RpbmcoKS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll9wYXRoLCBvcy5wYXRoLmFic3BhdGgoc2VsZi5fcGF0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll9mYWN0b3J5LCBmYWN0b3J5KQorICAgICAgICBmb3Igc3ViZGlyIGluICcnLCAndG1wJywgJ25ldycsICdjdXInOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIpCisgICAgICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKVtzdGF0LlNUX01PREVdCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oc3RhdC5TX0lTRElSKG1vZGUpLCAiTm90IGEgZGlyZWN0b3J5OiAnJXMnIiAlIHBhdGgpCisKKyAgICBkZWYgdGVzdF9saXN0X2ZvbGRlcnMoc2VsZik6CisgICAgICAgICMgTGlzdCBmb2xkZXJzCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdvbmUnKQorICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndHdvJykKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3RocmVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PQorICAgICAgICAgICAgICAgICAgICAgc2V0KCgnb25lJywgJ3R3bycsICd0aHJlZScpKSkKKworICAgIGRlZiB0ZXN0X2dldF9mb2xkZXIoc2VsZik6CisgICAgICAgICMgT3BlbiBmb2xkZXJzCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuZm9vLmJhcicpKSkKKyAgICAgICAgZm9sZGVyMSA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSkgPT0gXAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKKworICAgIGRlZiB0ZXN0X2FkZF9hbmRfcmVtb3ZlX2ZvbGRlcnMoc2VsZik6CisgICAgICAgICMgRGVsZXRlIGZvbGRlcnMKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ29uZScsICd0d28nKSkpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCdvbmUnKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywgJ3RocmVlJykpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcigndGhyZWUnKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSA9PSBbXSkKKworICAgIGRlZiB0ZXN0X2NsZWFuKHNlbGYpOgorICAgICAgICAjIFJlbW92ZSBvbGQgZmlsZXMgZnJvbSAndG1wJworICAgICAgICBmb29fcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAndG1wJywgJ2ZvbycpCisgICAgICAgIGJhcl9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICd0bXAnLCAnYmFyJykKKyAgICAgICAgZiA9IG9wZW4oZm9vX3BhdGgsICd3JykKKyAgICAgICAgZi53cml0ZSgiQCIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihiYXJfcGF0aCwgJ3cnKQorICAgICAgICBmLndyaXRlKCJAIikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuX2JveC5jbGVhbigpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhmb29fcGF0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhiYXJfcGF0aCkpCisgICAgICAgIGZvb19zdGF0ID0gb3Muc3RhdChmb29fcGF0aCkKKyAgICAgICAgb3MudXRpbWUoZm9vX3BhdGgsICh0aW1lLnRpbWUoKSAtIDEyOTYwMCAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vX3N0YXQuc3RfbXRpbWUpKQorICAgICAgICBzZWxmLl9ib3guY2xlYW4oKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV90bXAoc2VsZiwgcmVwZXRpdGlvbnM9MTApOgorICAgICAgICAjIENyZWF0ZSBmaWxlcyBpbiB0bXAgZGlyZWN0b3J5CisgICAgICAgIGhvc3RuYW1lID0gc29ja2V0LmdldGhvc3RuYW1lKCkKKyAgICAgICAgaWYgJy8nIGluIGhvc3RuYW1lOgorICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKCcvJywgcidcMDU3JykKKyAgICAgICAgaWYgJzonIGluIGhvc3RuYW1lOgorICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKCc6JywgcidcMDcyJykKKyAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUociIoP1A8dGltZT5cZCspXC5NKD9QPE0+XGR7MSw2fSlQKD9QPFA+XGQrKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJRKD9QPFE+XGQrKVwuKD9QPGhvc3Q+W146L10rKSIpCisgICAgICAgIHByZXZpb3VzX2dyb3VwcyA9IE5vbmUKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKHJlcGV0aXRpb25zKToKKyAgICAgICAgICAgIHRtcF9maWxlID0gc2VsZi5fYm94Ll9jcmVhdGVfdG1wKCkKKyAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHRtcF9maWxlLm5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWQsIG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG1wIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBpbiB3cm9uZyBsb2NhdGlvbjogJyVzJyIgJSBoZWFkKQorICAgICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLm1hdGNoKHRhaWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obWF0Y2ggIT0gTm9uZSwgIkludmFsaWQgZmlsZSBuYW1lOiAnJXMnIiAlIHRhaWwpCisgICAgICAgICAgICBncm91cHMgPSBtYXRjaC5ncm91cHMoKQorICAgICAgICAgICAgaWYgcHJldmlvdXNfZ3JvdXBzICE9IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGludChncm91cHNbMF0gPj0gcHJldmlvdXNfZ3JvdXBzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1tb25vdG9uaWMgc2Vjb25kczogJyVzJyBiZWZvcmUgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzBdLCBncm91cHNbMF0pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQoZ3JvdXBzWzFdID49IHByZXZpb3VzX2dyb3Vwc1sxXSkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzWzBdICE9IGdyb3Vwc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1tb25vdG9uaWMgbWlsbGlzZWNvbmRzOiAnJXMnIGJlZm9yZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2aW91c19ncm91cHNbMV0sIGdyb3Vwc1sxXSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGludChncm91cHNbMl0pID09IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgSUQgbWlzbWF0Y2g6ICclcycgc2hvdWxkIGJlICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3Vwc1syXSwgcGlkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KGdyb3Vwc1szXSkgPT0gaW50KHByZXZpb3VzX2dyb3Vwc1szXSkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLXNlcXVlbnRpYWwgY291bnRlcjogJyVzJyBiZWZvcmUgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzNdLCBncm91cHNbM10pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhncm91cHNbNF0gPT0gaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3N0IG5hbWUgbWlzbWF0Y2g6ICclcycgc2hvdWxkIGJlICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3Vwc1s0XSwgaG9zdG5hbWUpKQorICAgICAgICAgICAgcHJldmlvdXNfZ3JvdXBzID0gZ3JvdXBzCisgICAgICAgICAgICB0bXBfZmlsZS53cml0ZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICB0bXBfZmlsZS5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8odG1wX2ZpbGUucmVhZCgpID09IF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIHRtcF9maWxlLmNsb3NlKCkKKyAgICAgICAgZmlsZV9jb3VudCA9IGxlbihvcy5saXN0ZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAidG1wIikpKQorICAgICAgICBzZWxmLmFzc2VydF8oZmlsZV9jb3VudCA9PSByZXBldGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBmaWxlIGNvdW50OiAnJXMnIHNob3VsZCBiZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAoZmlsZV9jb3VudCwgcmVwZXRpdGlvbnMpKQorCisgICAgZGVmIHRlc3RfcmVmcmVzaChzZWxmKToKKyAgICAgICAgIyBVcGRhdGUgdGhlIHRhYmxlIG9mIGNvbnRlbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7fSkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7fSkKKyAgICAgICAgc2VsZi5fYm94Ll9yZWZyZXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTE6IG9zLnBhdGguam9pbignbmV3Jywga2V5MSl9KQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkxOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTEpfSkKKyAgICAgICAgc2VsZi5fYm94Ll9yZWZyZXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTE6IG9zLnBhdGguam9pbignbmV3Jywga2V5MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Mjogb3MucGF0aC5qb2luKCduZXcnLCBrZXkyKX0pCisKKyAgICBkZWYgdGVzdF9sb29rdXAoc2VsZik6CisgICAgICAgICMgTG9vayB1cCBtZXNzYWdlIHN1YnBhdGhzIGluIHRoZSBUT0MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94Ll9sb29rdXAoJ2ZvbycpKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX2xvb2t1cChrZXkwKSA9PSBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApKQorICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICduZXcnLCBrZXkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94Ll9sb29rdXAoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7fSkKKworICAgIGRlZiB0ZXN0X2xvY2tfdW5sb2NrKHNlbGYpOgorICAgICAgICAjIExvY2sgYW5kIHVubG9jayB0aGUgbWFpbGJveC4gRm9yIE1haWxkaXIsIHRoaXMgZG9lcyBub3RoaW5nLgorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorCisKK2NsYXNzIF9UZXN0TWJveE1NREYoVGVzdE1haWxib3gpOgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLl9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZi5fcGF0aCkKKyAgICAgICAgZm9yIGxvY2tfcmVtbmFudCBpbiBnbG9iLmdsb2Ioc2VsZi5fcGF0aCArICcuKicpOgorICAgICAgICAgICAgb3MucmVtb3ZlKGxvY2tfcmVtbmFudCkKKworICAgIGRlZiB0ZXN0X2FkZF9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBBZGQgYSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnRnJvbSAnIHRvIHRoZSBtYWlsYm94CisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQoJ0Zyb20gZm9vQGJhciBibGFoXG5Gcm9tOiBmb29cblxuMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3hba2V5XS5nZXRfZnJvbSgpID09ICdmb29AYmFyIGJsYWgnKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94W2tleV0uZ2V0X3BheWxvYWQoKSA9PSAnMCcpCisKKyAgICBkZWYgdGVzdF9hZGRfbWJveF9vcl9tbWRmX21lc3NhZ2Uoc2VsZik6CisgICAgICAgICMgQWRkIGFuIG1ib3hNZXNzYWdlIG9yIE1NREZNZXNzYWdlCisgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgbXNnID0gY2xhc3NfKCdGcm9tIGZvb0BiYXIgYmxhaFxuRnJvbTogZm9vXG5cbjAnKQorICAgICAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChtc2cpCisKKyAgICBkZWYgdGVzdF9vcGVuX2Nsb3NlX29wZW4oc2VsZik6CisgICAgICAgICMgT3BlbiBhbmQgaW5zcGVjdCBwcmV2aW91c2x5LWNyZWF0ZWQgbWFpbGJveAorICAgICAgICB2YWx1ZXMgPSBbc2VsZi5fdGVtcGxhdGUgJSBpIGZvciBpIGluIHhyYW5nZSgzKV0KKyAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuX2JveC5hZGQodmFsdWUpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIG10aW1lID0gb3MucGF0aC5nZXRtdGltZShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAzKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2JveC5pdGVya2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gdmFsdWVzKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydF8obXRpbWUgPT0gb3MucGF0aC5nZXRtdGltZShzZWxmLl9wYXRoKSkKKworICAgIGRlZiB0ZXN0X2FkZF9hbmRfY2xvc2Uoc2VsZik6CisgICAgICAgICMgVmVyaWZ5aW5nIHRoYXQgY2xvc2luZyBhIG1haWxib3ggZG9lc24ndCBjaGFuZ2UgYWRkZWQgaXRlbXMKKyAgICAgICAgc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgzKToKKyAgICAgICAgICAgIHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSBpKQorICAgICAgICBzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5fYm94Ll9maWxlLmZsdXNoKCkKKyAgICAgICAgc2VsZi5fYm94Ll9maWxlLnNlZWsoMCkKKyAgICAgICAgY29udGVudHMgPSBzZWxmLl9ib3guX2ZpbGUucmVhZCgpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb250ZW50cyA9PSBvcGVuKHNlbGYuX3BhdGgsICdyYicpLnJlYWQoKSkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorCisKK2NsYXNzIFRlc3RNYm94KF9UZXN0TWJveE1NREYpOgorCisgICAgX2ZhY3RvcnkgPSBsYW1iZGEgc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lOiBtYWlsYm94Lm1ib3gocGF0aCwgZmFjdG9yeSkKKworCitjbGFzcyBUZXN0TU1ERihfVGVzdE1ib3hNTURGKToKKworICAgIF9mYWN0b3J5ID0gbGFtYmRhIHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZTogbWFpbGJveC5NTURGKHBhdGgsIGZhY3RvcnkpCisKKworY2xhc3MgVGVzdE1IKFRlc3RNYWlsYm94KToKKworICAgIF9mYWN0b3J5ID0gbGFtYmRhIHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZTogbWFpbGJveC5NSChwYXRoLCBmYWN0b3J5KQorCisgICAgZGVmIHRlc3RfbGlzdF9mb2xkZXJzKHNlbGYpOgorICAgICAgICAjIExpc3QgZm9sZGVycworICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignb25lJykKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3R3bycpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgIHNldCgoJ29uZScsICd0d28nLCAndGhyZWUnKSkpCisKKyAgICBkZWYgdGVzdF9nZXRfZm9sZGVyKHNlbGYpOgorICAgICAgICAjIE9wZW4gZm9sZGVycworICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignZm9vLmJhcicpCisgICAgICAgIGZvbGRlcjAgPSBzZWxmLl9ib3guZ2V0X2ZvbGRlcignZm9vLmJhcicpCisgICAgICAgIGZvbGRlcjAuYWRkKHNlbGYuX3RlbXBsYXRlICUgJ2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnZm9vLmJhcicpKSkKKyAgICAgICAgZm9sZGVyMSA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSkgPT0gXAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKKworICAgIGRlZiB0ZXN0X2FkZF9hbmRfcmVtb3ZlX2ZvbGRlcnMoc2VsZik6CisgICAgICAgICMgRGVsZXRlIGZvbGRlcnMKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ29uZScsICd0d28nKSkpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCdvbmUnKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywgJ3RocmVlJykpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcigndGhyZWUnKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSA9PSBbXSkKKworICAgIGRlZiB0ZXN0X3NlcXVlbmNlcyhzZWxmKToKKyAgICAgICAgIyBHZXQgYW5kIHNldCBzZXF1ZW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0ge30pCisgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZzAuYWRkX3NlcXVlbmNlKCdmb28nKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7J2Zvbyc6W2tleTBdfSkKKyAgICAgICAgbXNnMSA9IG1haWxib3guTUhNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgbXNnMS5zZXRfc2VxdWVuY2VzKFsnYmFyJywgJ3JlcGxpZWQnLCAnZm9vJ10pCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpID09CisgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6W2tleTAsIGtleTFdLCAnYmFyJzpba2V5MV0sICdyZXBsaWVkJzpba2V5MV19KQorICAgICAgICBtc2cwLnNldF9zZXF1ZW5jZXMoWydmbGFnZ2VkJ10pCisgICAgICAgIHNlbGYuX2JveFtrZXkwXSA9IG1zZzAKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpba2V5MV0sICdiYXInOltrZXkxXSwgJ3JlcGxpZWQnOltrZXkxXSwKKyAgICAgICAgICAgICAgICAgICAgICAnZmxhZ2dlZCc6W2tleTBdfSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkxKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7J2ZsYWdnZWQnOltrZXkwXX0pCisKKyAgICBkZWYgdGVzdF9wYWNrKHNlbGYpOgorICAgICAgICAjIFBhY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYWlsYm94CisgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZzEgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIG1zZzIgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDIpCisgICAgICAgIG1zZzMgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDMpCisgICAgICAgIG1zZzAuc2V0X3NlcXVlbmNlcyhbJ2ZvbycsICd1bnNlZW4nXSkKKyAgICAgICAgbXNnMS5zZXRfc2VxdWVuY2VzKFsnZm9vJ10pCisgICAgICAgIG1zZzIuc2V0X3NlcXVlbmNlcyhbJ2ZvbycsICdmbGFnZ2VkJ10pCisgICAgICAgIG1zZzMuc2V0X3NlcXVlbmNlcyhbJ2ZvbycsICdiYXInLCAncmVwbGllZCddKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChtc2cyKQorICAgICAgICBrZXkzID0gc2VsZi5fYm94LmFkZChtc2czKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLGtleTEsa2V5MixrZXkzXSwgJ3Vuc2Vlbic6W2tleTBdLAorICAgICAgICAgICAgICAgICAgICAgICdmbGFnZ2VkJzpba2V5Ml0sICdiYXInOltrZXkzXSwgJ3JlcGxpZWQnOltrZXkzXX0pCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpba2V5MCxrZXkxLGtleTNdLCAndW5zZWVuJzpba2V5MF0sICdiYXInOltrZXkzXSwKKyAgICAgICAgICAgICAgICAgICAgICAncmVwbGllZCc6W2tleTNdfSkKKyAgICAgICAgc2VsZi5fYm94LnBhY2soKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmtleXMoKSA9PSBbMSwgMiwgM10pCisgICAgICAgIGtleTAgPSBrZXkwCisgICAgICAgIGtleTEgPSBrZXkwICsgMQorICAgICAgICBrZXkyID0ga2V5MSArIDEKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpbMSwgMiwgM10sICd1bnNlZW4nOlsxXSwgJ2Jhcic6WzNdLCAncmVwbGllZCc6WzNdfSkKKworICAgIGRlZiBfZ2V0X2xvY2tfcGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcy5sb2NrJykKKworCitjbGFzcyBUZXN0QmFieWwoVGVzdE1haWxib3gpOgorCisgICAgX2ZhY3RvcnkgPSBsYW1iZGEgc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lOiBtYWlsYm94LkJhYnlsKHBhdGgsIGZhY3RvcnkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorICAgICAgICBmb3IgbG9ja19yZW1uYW50IGluIGdsb2IuZ2xvYihzZWxmLl9wYXRoICsgJy4qJyk6CisgICAgICAgICAgICBvcy5yZW1vdmUobG9ja19yZW1uYW50KQorCisgICAgZGVmIHRlc3RfbGFiZWxzKHNlbGYpOgorICAgICAgICAjIEdldCBsYWJlbHMgZnJvbSB0aGUgbWFpbGJveAorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9sYWJlbHMoKSA9PSBbXSkKKyAgICAgICAgbXNnMCA9IG1haWxib3guQmFieWxNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnMC5hZGRfbGFiZWwoJ2ZvbycpCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKG1zZzApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X2xhYmVscygpID09IFsnZm9vJ10pCisgICAgICAgIG1zZzEgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIG1zZzEuc2V0X2xhYmVscyhbJ2JhcicsICdhbnN3ZXJlZCcsICdmb28nXSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3guZ2V0X2xhYmVscygpKSA9PSBzZXQoWydmb28nLCAnYmFyJ10pKQorICAgICAgICBtc2cwLnNldF9sYWJlbHMoWydibGFoJywgJ2ZpbGVkJ10pCisgICAgICAgIHNlbGYuX2JveFtrZXkwXSA9IG1zZzAKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3guZ2V0X2xhYmVscygpKSA9PQorICAgICAgICAgICAgICAgICAgICAgc2V0KFsnZm9vJywgJ2JhcicsICdibGFoJ10pKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSkgPT0gc2V0KFsnYmxhaCddKSkKKworCitjbGFzcyBUZXN0TWVzc2FnZShUZXN0QmFzZSk6CisKKyAgICBfZmFjdG9yeSA9IG1haWxib3guTWVzc2FnZSAgICAgICMgT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIHJldXNlIHRlc3RzCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV93aXRoX2VNTShzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIGJhc2VkIG9uIGVtYWlsLk1lc3NhZ2UuTWVzc2FnZSBpbnN0YW5jZQorICAgICAgICBlTU0gPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeShlTU0pCisgICAgICAgIHNlbGYuX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKG1zZykKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfd2l0aF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBiYXNlZCBvbiBzdHJpbmcKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKG1zZykKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfd2l0aF9maWxlKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgYmFzZWQgb24gY29udGVudHMgb2YgZmlsZQorICAgICAgICBmID0gb3BlbihzZWxmLl9wYXRoLCAndysnKQorICAgICAgICBmLndyaXRlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIG1zZyA9IHNlbGYuX2ZhY3RvcnkoZikKKyAgICAgICAgc2VsZi5fcG9zdF9pbml0aWFsaXplX2hvb2sobXNnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfd2l0aF9ub3RoaW5nKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgd2l0aG91dCBhcmd1bWVudHMKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeSgpCisgICAgICAgIHNlbGYuX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnLCBlbWFpbC5NZXNzYWdlLk1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2csIG1haWxib3guTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG1zZywgc2VsZi5fZmFjdG9yeSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cua2V5cygpID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydF8obm90IG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfcGF5bG9hZCgpID09IE5vbmUpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplX2luY29ycmVjdGx5KHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgd2l0aCBpbnZhbGlkIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLl9mYWN0b3J5KG9iamVjdCgpKSkKKworICAgIGRlZiB0ZXN0X2JlY29tZV9tZXNzYWdlKHNlbGYpOgorICAgICAgICAjIFRha2Ugb24gdGhlIHN0YXRlIG9mIGFub3RoZXIgbWVzc2FnZQorICAgICAgICBlTU0gPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeSgpCisgICAgICAgIG1zZy5fYmVjb21lX21lc3NhZ2UoZU1NKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfZXhwbGFpbl90byhzZWxmKToKKyAgICAgICAgIyBDb3B5IHNlbGYncyBmb3JtYXQtc3BlY2lmaWMgZGF0YSB0byBvdGhlciBtZXNzYWdlIGZvcm1hdHMuCisgICAgICAgICMgVGhpcyB0ZXN0IGlzIHN1cGVyZmljaWFsOyBiZXR0ZXIgb25lcyBhcmUgaW4gVGVzdE1lc3NhZ2VDb252ZXJzaW9uLgorICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KCkKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5NZXNzYWdlLCBtYWlsYm94Lk1haWxkaXJNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1ITWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveC5CYWJ5bE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgb3RoZXJfbXNnID0gY2xhc3NfKCkKKyAgICAgICAgICAgIG1zZy5fZXhwbGFpbl90byhvdGhlcl9tc2cpCisgICAgICAgIG90aGVyX21zZyA9IGVtYWlsLk1lc3NhZ2UuTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtc2cuX2V4cGxhaW5fdG8ob3RoZXJfbXNnKSkKKworICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKKyAgICAgICAgIyBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gY2hlY2sgZXh0cmEgdGhpbmdzIGFmdGVyIGluaXRpYWxpemF0aW9uCisgICAgICAgIHBhc3MKKworCitjbGFzcyBUZXN0TWFpbGRpck1lc3NhZ2UoVGVzdE1lc3NhZ2UpOgorCisgICAgX2ZhY3RvcnkgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlCisKKyAgICBkZWYgX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuX3N1YmRpciA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5faW5mbyA9PSAnJykKKworICAgIGRlZiB0ZXN0X3N1YmRpcihzZWxmKToKKyAgICAgICAgIyBVc2UgZ2V0X3N1YmRpcigpIGFuZCBzZXRfc3ViZGlyKCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBtc2cuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCisgICAgICAgIG1zZy5zZXRfc3ViZGlyKCduZXcnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBtc2cuc2V0X3N1YmRpcigndG1wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBtc2cuc2V0X3N1YmRpcignbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKyAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKKyAgICAgICAgIyBVc2UgZ2V0X2ZsYWdzKCksIHNldF9mbGFncygpLCBhZGRfZmxhZygpLCByZW1vdmVfZmxhZygpCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgbXNnLnNldF9mbGFncygnRicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICdGJykKKyAgICAgICAgbXNnLnNldF9mbGFncygnU0RUUCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0RQU1QnKQorICAgICAgICBtc2cuYWRkX2ZsYWcoJ0ZUJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnREZQU1QnKQorICAgICAgICBtc2cucmVtb3ZlX2ZsYWcoJ1REUlAnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICdGUycpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfZGF0ZShzZWxmKToKKyAgICAgICAgIyBVc2UgZ2V0X2RhdGUoKSBhbmQgc2V0X2RhdGUoKQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGFicyhtc2cuZ2V0X2RhdGUoKSAtIHRpbWUudGltZSgpKSA8IDYwKQorICAgICAgICBtc2cuc2V0X2RhdGUoMC4wKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9kYXRlKCkgPT0gMC4wKQorCisgICAgZGVmIHRlc3RfaW5mbyhzZWxmKToKKyAgICAgICAgIyBVc2UgZ2V0X2luZm8oKSBhbmQgc2V0X2luZm8oKQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfaW5mbygpID09ICcnKQorICAgICAgICBtc2cuc2V0X2luZm8oJzEsZm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2luZm8oKSA9PSAnMSxmb289YmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1zZy5zZXRfaW5mbyhOb25lKSkKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworICAgIGRlZiB0ZXN0X2luZm9fYW5kX2ZsYWdzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW50ZXJhY3Rpb24gb2YgaW5mbyBhbmQgZmxhZyBtZXRob2RzCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJycpCisgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ1NGJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnRlMnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzIsRlMnKQorICAgICAgICBtc2cuc2V0X2luZm8oJzEsJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfaW5mbygpID09ICcxLCcpCisgICAgICAgIG1zZy5yZW1vdmVfZmxhZygnUlBUJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfaW5mbygpID09ICcxLCcpCisgICAgICAgIG1zZy5hZGRfZmxhZygnRCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0QnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzIsRCcpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKworY2xhc3MgX1Rlc3RNYm94TU1ERk1lc3NhZ2UoVGVzdE1lc3NhZ2UpOgorCisgICAgX2ZhY3RvcnkgPSBtYWlsYm94Ll9tYm94TU1ERk1lc3NhZ2UKKworICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZnJvbShtc2cpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplX3dpdGhfdW5peGZyb20oc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRoIGEgbWVzc2FnZSB0aGF0IGFscmVhZHkgaGFzIGEgX3VuaXhmcm9tIGF0dHJpYnV0ZQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2cuc2V0X3VuaXhmcm9tKCdGcm9tIGZvb0BiYXIgYmxhaCcpCisgICAgICAgIG1zZyA9IG1haWxib3gubWJveE1lc3NhZ2UobXNnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ2Zvb0BiYXIgYmxhaCcsIG1zZy5nZXRfZnJvbSgpKQorCisgICAgZGVmIHRlc3RfZnJvbShzZWxmKToKKyAgICAgICAgIyBHZXQgYW5kIHNldCAiRnJvbSAiIGxpbmUKKyAgICAgICAgbXNnID0gbWFpbGJveC5tYm94TWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuX2NoZWNrX2Zyb20obXNnKQorICAgICAgICBtc2cuc2V0X2Zyb20oJ2ZvbyBiYXInKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ2ZvbyBiYXInKQorICAgICAgICBtc2cuc2V0X2Zyb20oJ2Zvb0BiYXInLCBUcnVlKQorICAgICAgICBzZWxmLl9jaGVja19mcm9tKG1zZywgJ2Zvb0BiYXInKQorICAgICAgICBtc2cuc2V0X2Zyb20oJ2JsYWhAdGVtcCcsIHRpbWUubG9jYWx0aW1lKCkpCisgICAgICAgIHNlbGYuX2NoZWNrX2Zyb20obXNnLCAnYmxhaEB0ZW1wJykKKworICAgIGRlZiB0ZXN0X2ZsYWdzKHNlbGYpOgorICAgICAgICAjIFVzZSBnZXRfZmxhZ3MoKSwgc2V0X2ZsYWdzKCksIGFkZF9mbGFnKCksIHJlbW92ZV9mbGFnKCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5tYm94TWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJycpCisgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ0YnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICdGJykKKyAgICAgICAgbXNnLnNldF9mbGFncygnWE9EUicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPRFgnKQorICAgICAgICBtc2cuYWRkX2ZsYWcoJ0ZBJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnUk9ERkFYJykKKyAgICAgICAgbXNnLnJlbW92ZV9mbGFnKCdGRFhBJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnUk8nKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIF9jaGVja19mcm9tKHNlbGYsIG1zZywgc2VuZGVyPU5vbmUpOgorICAgICAgICAjIENoZWNrIGNvbnRlbnRzIG9mICJGcm9tICIgbGluZQorICAgICAgICBpZiBzZW5kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbmRlciA9ICJNQUlMRVItREFFTU9OIgorICAgICAgICBzZWxmLmFzc2VydF8ocmUubWF0Y2goc2VuZGVyICsgciIgXHd7M30gXHd7M30gW1xkIF1cZCBbXGQgXVxkOlxkezJ9OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXGR7Mn0gXGR7NH0iLCBtc2cuZ2V0X2Zyb20oKSkgaXMgbm90IE5vbmUpCisKKworY2xhc3MgVGVzdE1ib3hNZXNzYWdlKF9UZXN0TWJveE1NREZNZXNzYWdlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5tYm94TWVzc2FnZQorCisKK2NsYXNzIFRlc3RNSE1lc3NhZ2UoVGVzdE1lc3NhZ2UpOgorCisgICAgX2ZhY3RvcnkgPSBtYWlsYm94Lk1ITWVzc2FnZQorCisgICAgZGVmIF9wb3N0X2luaXRpYWxpemVfaG9vayhzZWxmLCBtc2cpOgorICAgICAgICBzZWxmLmFzc2VydF8obXNnLl9zZXF1ZW5jZXMgPT0gW10pCisKKyAgICBkZWYgdGVzdF9zZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICMgR2V0LCBzZXQsIGpvaW4sIGFuZCBsZWF2ZSBzZXF1ZW5jZXMKKyAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbXSkKKyAgICAgICAgbXNnLnNldF9zZXF1ZW5jZXMoWydmb29iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmb29iYXInXSkKKyAgICAgICAgbXNnLnNldF9zZXF1ZW5jZXMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3NlcXVlbmNlcygpID09IFtdKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbiddKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWyd1bnNlZW4nLCAnZmxhZ2dlZCddKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWyd1bnNlZW4nLCAnZmxhZ2dlZCddKQorICAgICAgICBtc2cucmVtb3ZlX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ2ZsYWdnZWQnXSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZm9vYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmbGFnZ2VkJywgJ2Zvb2JhciddKQorICAgICAgICBtc2cucmVtb3ZlX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmbGFnZ2VkJywgJ2Zvb2JhciddKQorICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbJ2Zvb2JhcicsICdyZXBsaWVkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZm9vYmFyJywgJ3JlcGxpZWQnXSkKKworCitjbGFzcyBUZXN0QmFieWxNZXNzYWdlKFRlc3RNZXNzYWdlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UKKworICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5fbGFiZWxzID09IFtdKQorCisgICAgZGVmIHRlc3RfbGFiZWxzKHNlbGYpOgorICAgICAgICAjIEdldCwgc2V0LCBqb2luLCBhbmQgbGVhdmUgbGFiZWxzCisgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gW10pCisgICAgICAgIG1zZy5zZXRfbGFiZWxzKFsnZm9vYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJ10pCisgICAgICAgIG1zZy5zZXRfbGFiZWxzKFtdKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbXSkKKyAgICAgICAgbXNnLmFkZF9sYWJlbCgnZmlsZWQnKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbJ2ZpbGVkJ10pCisgICAgICAgIG1zZy5hZGRfbGFiZWwoJ3Jlc2VudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIG1zZy5hZGRfbGFiZWwoJ3Jlc2VudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIG1zZy5yZW1vdmVfbGFiZWwoJ2ZpbGVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnXSkKKyAgICAgICAgbXNnLmFkZF9sYWJlbCgnZm9vYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnLCAnZm9vYmFyJ10pCisgICAgICAgIG1zZy5yZW1vdmVfbGFiZWwoJ3Vuc2VlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsncmVzZW50JywgJ2Zvb2JhciddKQorICAgICAgICBtc2cuc2V0X2xhYmVscyhbJ2Zvb2JhcicsICdhbnN3ZXJlZCddKQorICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbJ2Zvb2JhcicsICdhbnN3ZXJlZCddKQorCisgICAgZGVmIHRlc3RfdmlzaWJsZShzZWxmKToKKyAgICAgICAgIyBHZXQsIHNldCwgYW5kIHVwZGF0ZSB2aXNpYmxlIGhlYWRlcnMKKyAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICB2aXNpYmxlID0gbXNnLmdldF92aXNpYmxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHZpc2libGUua2V5cygpID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5nZXRfcGF5bG9hZCgpIGlzIE5vbmUpCisgICAgICAgIHZpc2libGVbJ1VzZXItQWdlbnQnXSA9ICdGb29CYXIgMS4wJworICAgICAgICB2aXNpYmxlWydYLVdoYXRldmVyJ10gPSAnQmxhaCcKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSA9PSBbXSkKKyAgICAgICAgbXNnLnNldF92aXNpYmxlKHZpc2libGUpCisgICAgICAgIHZpc2libGUgPSBtc2cuZ2V0X3Zpc2libGUoKQorICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5rZXlzKCkgPT0gWydVc2VyLUFnZW50JywgJ1gtV2hhdGV2ZXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHZpc2libGVbJ1VzZXItQWdlbnQnXSA9PSAnRm9vQmFyIDEuMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlWydYLVdoYXRldmVyJ10gPT0gJ0JsYWgnKQorICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5nZXRfcGF5bG9hZCgpIGlzIE5vbmUpCisgICAgICAgIG1zZy51cGRhdGVfdmlzaWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlLmtleXMoKSA9PSBbJ1VzZXItQWdlbnQnLCAnWC1XaGF0ZXZlciddKQorICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5nZXRfcGF5bG9hZCgpIGlzIE5vbmUpCisgICAgICAgIHZpc2libGUgPSBtc2cuZ2V0X3Zpc2libGUoKQorICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5rZXlzKCkgPT0gWydVc2VyLUFnZW50JywgJ0RhdGUnLCAnRnJvbScsICdUbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnXSkKKyAgICAgICAgZm9yIGhlYWRlciBpbiAoJ1VzZXItQWdlbnQnLCAnRGF0ZScsICdGcm9tJywgJ1RvJywgJ1N1YmplY3QnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlW2hlYWRlcl0gPT0gbXNnW2hlYWRlcl0pCisKKworY2xhc3MgVGVzdE1NREZNZXNzYWdlKF9UZXN0TWJveE1NREZNZXNzYWdlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5NTURGTWVzc2FnZQorCisKK2NsYXNzIFRlc3RNZXNzYWdlQ29udmVyc2lvbihUZXN0QmFzZSk6CisKKyAgICBkZWYgdGVzdF9wbGFpbl90b194KHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTWVzc2FnZSB0byBhbGwgZm9ybWF0cworICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lk1lc3NhZ2UsIG1haWxib3guTWFpbGRpck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTUhNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LkJhYnlsTWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2dfcGxhaW4gPSBtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnID0gY2xhc3NfKG1zZ19wbGFpbikKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKyAgICBkZWYgdGVzdF94X3RvX3BsYWluKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgYWxsIGZvcm1hdHMgdG8gTWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lk1lc3NhZ2UsIG1haWxib3guTWFpbGRpck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTUhNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LkJhYnlsTWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2cgPSBjbGFzc18oX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnX3BsYWluID0gbWFpbGJveC5NZXNzYWdlKG1zZykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2dfcGxhaW4pCisKKyAgICBkZWYgdGVzdF94X3RvX2ludmFsaWQoc2VsZik6CisgICAgICAgICMgQ29udmVydCBhbGwgZm9ybWF0cyB0byBhbiBpbnZhbGlkIGZvcm1hdAorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lk1lc3NhZ2UsIG1haWxib3guTWFpbGRpck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTUhNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LkJhYnlsTWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogY2xhc3NfKEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X21haWxkaXJfdG9fbWFpbGRpcihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIE1haWxkaXJNZXNzYWdlCisgICAgICAgIG1zZ19tYWlsZGlyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZ19tYWlsZGlyLnNldF9mbGFncygnREZQUlNUJykKKyAgICAgICAgbXNnX21haWxkaXIuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgZGF0ZSA9IG1zZ19tYWlsZGlyLmdldF9kYXRlKCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWFpbGRpcikKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnREZQUlNUJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2RhdGUoKSA9PSBkYXRlKQorCisgICAgZGVmIHRlc3RfbWFpbGRpcl90b19tYm94bW1kZihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIG1ib3htZXNzYWdlIGFuZCBNTURGTWVzc2FnZQorICAgICAgICBwYWlycyA9ICgoJ0QnLCAnJyksICgnRicsICdGJyksICgnUCcsICcnKSwgKCdSJywgJ0EnKSwgKCdTJywgJ1InKSwKKyAgICAgICAgICAgICAgICAgKCdUJywgJ0QnKSwgKCdERlBSU1QnLCAnUkRGQScpKQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZ19tYWlsZGlyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfZGF0ZSgwLjApCisgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgICAgIG1zZ19tYWlsZGlyLnNldF9mbGFncyhzZXR0aW5nKQorICAgICAgICAgICAgICAgIG1zZyA9IGNsYXNzXyhtc2dfbWFpbGRpcikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09IHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ01BSUxFUi1EQUVNT04gJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5hc2N0aW1lKHRpbWUuZ210aW1lKDAuMCkpKQorICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnX21haWxkaXIpLmdldF9mbGFncygpID09ICdST0RGQScpCisKKyAgICBkZWYgdGVzdF9tYWlsZGlyX3RvX21oKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTWFpbGRpck1lc3NhZ2UgdG8gTUhNZXNzYWdlCisgICAgICAgIG1zZ19tYWlsZGlyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHBhaXJzID0gKCgnRCcsIFsndW5zZWVuJ10pLCAoJ0YnLCBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pLAorICAgICAgICAgICAgICAgICAoJ1AnLCBbJ3Vuc2VlbiddKSwgKCdSJywgWyd1bnNlZW4nLCAncmVwbGllZCddKSwgKCdTJywgW10pLAorICAgICAgICAgICAgICAgICAoJ1QnLCBbJ3Vuc2VlbiddKSwgKCdERlBSU1QnLCBbJ3JlcGxpZWQnLCAnZmxhZ2dlZCddKSkKKyAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgIG1zZ19tYWlsZGlyLnNldF9mbGFncyhzZXR0aW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTUhNZXNzYWdlKG1zZ19tYWlsZGlyKS5nZXRfc2VxdWVuY2VzKCkgPT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X21haWxkaXJfdG9fYmFieWwoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNYWlsZGlyTWVzc2FnZSB0byBCYWJ5bAorICAgICAgICBtc2dfbWFpbGRpciA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBwYWlycyA9ICgoJ0QnLCBbJ3Vuc2VlbiddKSwgKCdGJywgWyd1bnNlZW4nXSksCisgICAgICAgICAgICAgICAgICgnUCcsIFsndW5zZWVuJywgJ2ZvcndhcmRlZCddKSwgKCdSJywgWyd1bnNlZW4nLCAnYW5zd2VyZWQnXSksCisgICAgICAgICAgICAgICAgICgnUycsIFtdKSwgKCdUJywgWyd1bnNlZW4nLCAnZGVsZXRlZCddKSwKKyAgICAgICAgICAgICAgICAgKCdERlBSU1QnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJ10pKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X2ZsYWdzKHNldHRpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnX21haWxkaXIpLmdldF9sYWJlbHMoKSA9PSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfbWJveG1tZGZfdG9fbWFpbGRpcihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBNYWlsZGlyTWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERiA9IGNsYXNzXyhfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2Zyb20oJ2Zvb0BiYXInLCB0aW1lLmdtdGltZSgwLjApKQorICAgICAgICAgICAgcGFpcnMgPSAoKCdSJywgJ1MnKSwgKCdPJywgJycpLCAoJ0QnLCAnVCcpLCAoJ0YnLCAnRicpLCAoJ0EnLCAnUicpLAorICAgICAgICAgICAgICAgICAgICAgKCdST0RGQScsICdGUlNUJykpCisgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZmxhZ3Moc2V0dGluZykKKyAgICAgICAgICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZ19tYm94TU1ERikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09IHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9kYXRlKCkgPT0gMC4wLCBtc2cuZ2V0X2RhdGUoKSkKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZmxhZ3MoJ08nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnX21ib3hNTURGKS5nZXRfc3ViZGlyKCkgPT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICdjdXInKQorCisgICAgZGVmIHRlc3RfbWJveG1tZGZfdG9fbWJveG1tZGYoc2VsZik6CisgICAgICAgICMgQ29udmVydCBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UgdG8gbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlCisgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgbXNnX21ib3hNTURGID0gY2xhc3NfKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZmxhZ3MoJ1JPREZBJykKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZnJvbSgnZm9vQGJhcicpCisgICAgICAgICAgICBmb3IgY2xhc3MyXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICAgICAgbXNnMiA9IGNsYXNzMl8obXNnX21ib3hNTURGKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cyLmdldF9mbGFncygpID09ICdST0RGQScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1zZzIuZ2V0X2Zyb20oKSA9PSAnZm9vQGJhcicpCisKKyAgICBkZWYgdGVzdF9tYm94bW1kZl90b19taChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBNSE1lc3NhZ2UKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2dfbWJveE1NREYgPSBjbGFzc18oX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgcGFpcnMgPSAoKCdSJywgW10pLCAoJ08nLCBbJ3Vuc2VlbiddKSwgKCdEJywgWyd1bnNlZW4nXSksCisgICAgICAgICAgICAgICAgICAgICAoJ0YnLCBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pLAorICAgICAgICAgICAgICAgICAgICAgKCdBJywgWyd1bnNlZW4nLCAncmVwbGllZCddKSwKKyAgICAgICAgICAgICAgICAgICAgICgnUk9ERkEnLCBbJ3JlcGxpZWQnLCAnZmxhZ2dlZCddKSkKKyAgICAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mbGFncyhzZXR0aW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zZXF1ZW5jZXMoKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X21ib3htbWRmX3RvX2JhYnlsKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlIHRvIEJhYnlsTWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZyA9IGNsYXNzXyhfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBwYWlycyA9ICgoJ1InLCBbXSksICgnTycsIFsndW5zZWVuJ10pLAorICAgICAgICAgICAgICAgICAgICAgKCdEJywgWyd1bnNlZW4nLCAnZGVsZXRlZCddKSwgKCdGJywgWyd1bnNlZW4nXSksCisgICAgICAgICAgICAgICAgICAgICAoJ0EnLCBbJ3Vuc2VlbicsICdhbnN3ZXJlZCddKSwKKyAgICAgICAgICAgICAgICAgICAgICgnUk9ERkEnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnXSkpCisgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgICAgIG1zZy5zZXRfZmxhZ3Moc2V0dGluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gcmVzdWx0KQorCisgICAgZGVmIHRlc3RfbWhfdG9fbWFpbGRpcihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1ITWVzc2FnZSB0byBNYWlsZGlyTWVzc2FnZQorICAgICAgICBwYWlycyA9ICgoJ3Vuc2VlbicsICcnKSwgKCdyZXBsaWVkJywgJ1JTJyksICgnZmxhZ2dlZCcsICdGUycpKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZShzZXR0aW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCkgPT0gJ0ZSJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCisKKyAgICBkZWYgdGVzdF9taF90b19tYm94bW1kZihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1ITWVzc2FnZSB0byBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKKyAgICAgICAgcGFpcnMgPSAoKCd1bnNlZW4nLCAnTycpLCAoJ3JlcGxpZWQnLCAnUk9BJyksICgnZmxhZ2dlZCcsICdST0YnKSkKKyAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2Uoc2V0dGluZykKKyAgICAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSA9PSAnT0ZBJykKKworICAgIGRlZiB0ZXN0X21oX3RvX21oKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTUhNZXNzYWdlIHRvIE1ITWVzc2FnZQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ3Vuc2VlbicpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ3JlcGxpZWQnKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTUhNZXNzYWdlKG1zZykuZ2V0X3NlcXVlbmNlcygpID09IFwKKyAgICAgICAgICAgICAgICAgICAgIFsndW5zZWVuJywgJ3JlcGxpZWQnLCAnZmxhZ2dlZCddKQorCisgICAgZGVmIHRlc3RfbWhfdG9fYmFieWwoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNSE1lc3NhZ2UgdG8gQmFieWxNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgWyd1bnNlZW4nXSksICgncmVwbGllZCcsIFsnYW5zd2VyZWQnXSksCisgICAgICAgICAgICAgICAgICgnZmxhZ2dlZCcsIFtdKSkKKyAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2Uoc2V0dGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpLmdldF9sYWJlbHMoKSA9PSByZXN1bHQpCisgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gXAorICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAnYW5zd2VyZWQnXSkKKworICAgIGRlZiB0ZXN0X2JhYnlsX3RvX21haWxkaXIoc2VsZik6CisgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gTWFpbGRpck1lc3NhZ2UKKyAgICAgICAgcGFpcnMgPSAoKCd1bnNlZW4nLCAnJyksICgnZGVsZXRlZCcsICdTVCcpLCAoJ2ZpbGVkJywgJ1MnKSwKKyAgICAgICAgICAgICAgICAgKCdhbnN3ZXJlZCcsICdSUycpLCAoJ2ZvcndhcmRlZCcsICdQUycpLCAoJ2VkaXRlZCcsICdTJyksCisgICAgICAgICAgICAgICAgICgncmVzZW50JywgJ1BTJykpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpID09ICdjdXInKQorICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIGZvciBsYWJlbCBpbiAoJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywgJ2Fuc3dlcmVkJywgJ2ZvcndhcmRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKKyAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCkgPT0gJ1BSVCcpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpID09ICdjdXInKQorCisgICAgZGVmIHRlc3RfYmFieWxfdG9fbWJveG1tZGYoc2VsZik6CisgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgJ08nKSwgKCdkZWxldGVkJywgJ1JPRCcpLCAoJ2ZpbGVkJywgJ1JPJyksCisgICAgICAgICAgICAgICAgICgnYW5zd2VyZWQnLCAnUk9BJyksICgnZm9yd2FyZGVkJywgJ1JPJyksICgnZWRpdGVkJywgJ1JPJyksCisgICAgICAgICAgICAgICAgICgncmVzZW50JywgJ1JPJykpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChzZXR0aW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgZm9yIGxhYmVsIGluICgndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAnZWRpdGVkJywgJ3Jlc2VudCcpOgorICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChsYWJlbCkKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oY2xhc3NfKG1zZykuZ2V0X2ZsYWdzKCkgPT0gJ09EQScpCisKKyAgICBkZWYgdGVzdF9iYWJ5bF90b19taChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IEJhYnlsTWVzc2FnZSB0byBNSE1lc3NhZ2UKKyAgICAgICAgcGFpcnMgPSAoKCd1bnNlZW4nLCBbJ3Vuc2VlbiddKSwgKCdkZWxldGVkJywgW10pLCAoJ2ZpbGVkJywgW10pLAorICAgICAgICAgICAgICAgICAoJ2Fuc3dlcmVkJywgWydyZXBsaWVkJ10pLCAoJ2ZvcndhcmRlZCcsIFtdKSwgKCdlZGl0ZWQnLCBbXSksCisgICAgICAgICAgICAgICAgICgncmVzZW50JywgW10pKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChzZXR0aW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTUhNZXNzYWdlKG1zZykuZ2V0X3NlcXVlbmNlcygpID09IHJlc3VsdCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAorICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CisgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQorICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCkgPT0gXAorICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAncmVwbGllZCddKQorCisgICAgZGVmIHRlc3RfYmFieWxfdG9fYmFieWwoc2VsZik6CisgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gQmFieWxNZXNzYWdlCisgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLnVwZGF0ZV92aXNpYmxlKCkKKyAgICAgICAgZm9yIGxhYmVsIGluICgndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAnZWRpdGVkJywgJ3Jlc2VudCcpOgorICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChsYWJlbCkKKyAgICAgICAgbXNnMiA9IG1haWxib3guQmFieWxNZXNzYWdlKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRfKG1zZzIuZ2V0X2xhYmVscygpID09IFsndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLCAnZWRpdGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzZW50J10pCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3Zpc2libGUoKS5rZXlzKCkgPT0gbXNnMi5nZXRfdmlzaWJsZSgpLmtleXMoKSkKKyAgICAgICAgZm9yIGtleSBpbiBtc2cuZ2V0X3Zpc2libGUoKS5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF92aXNpYmxlKClba2V5XSA9PSBtc2cyLmdldF92aXNpYmxlKClba2V5XSkKKworCitjbGFzcyBUZXN0UHJveHlGaWxlQmFzZShUZXN0QmFzZSk6CisKKyAgICBkZWYgX3Rlc3RfcmVhZChzZWxmLCBwcm94eSk6CisgICAgICAgICMgUmVhZCBieSBieXRlCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQoKSA9PSAnYmFyJykKKyAgICAgICAgcHJveHkuc2VlaygxKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgpID09ICdhcicpCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQoMikgPT0gJ2JhJykKKyAgICAgICAgcHJveHkuc2VlaygxKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgtMSkgPT0gJ2FyJykKKyAgICAgICAgcHJveHkuc2VlaygyKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgxMDAwKSA9PSAncicpCisKKyAgICBkZWYgX3Rlc3RfcmVhZGxpbmUoc2VsZiwgcHJveHkpOgorICAgICAgICAjIFJlYWQgYnkgbGluZQorICAgICAgICBwcm94eS5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkbGluZSgpID09ICdmb28nICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKCkgPT0gJ2JhcicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnYm9iJykKKyAgICAgICAgcHJveHkuc2VlaygyKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnbycgKyBvcy5saW5lc2VwKQorICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoMikgPT0gJ2ZyJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKC0xMCkgPT0gJ2VkJyArIG9zLmxpbmVzZXApCisKKyAgICBkZWYgX3Rlc3RfcmVhZGxpbmVzKHNlbGYsIHByb3h5KToKKyAgICAgICAgIyBSZWFkIG11bHRpcGxlIGxpbmVzCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lcygpID09IFsnZm9vJyArIG9zLmxpbmVzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhcicgKyBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVkJyArIG9zLmxpbmVzZXAsICdib2InXSkKKyAgICAgICAgcHJveHkuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmVzKDIpID09IFsnZm9vJyArIG9zLmxpbmVzZXBdKQorICAgICAgICBwcm94eS5zZWVrKDMgKyBsZW4ob3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkbGluZXMoNCArIGxlbihvcy5saW5lc2VwKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgIFsnYmFyJyArIG9zLmxpbmVzZXAsICdmcmVkJyArIG9zLmxpbmVzZXBdKQorICAgICAgICBwcm94eS5zZWVrKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkbGluZXMoMTAwMCkgPT0gW29zLmxpbmVzZXAsICdiYXInICsgb3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyZWQnICsgb3MubGluZXNlcCwgJ2JvYiddKQorCisgICAgZGVmIF90ZXN0X2l0ZXJhdGlvbihzZWxmLCBwcm94eSk6CisgICAgICAgICMgSXRlcmF0ZSBieSBsaW5lCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgaXRlcmF0b3IgPSBpdGVyKHByb3h5KQorICAgICAgICBzZWxmLmFzc2VydF8oaXRlcmF0b3IubmV4dCgpID09ICdmb28nICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGl0ZXJhdG9yLm5leHQoKSA9PSAnYmFyJyArIG9zLmxpbmVzZXApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhpdGVyYXRvci5uZXh0KCkgPT0gJ2ZyZWQnICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGl0ZXJhdG9yLm5leHQoKSA9PSAnYm9iJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbGFtYmRhOiBpdGVyYXRvci5uZXh0KCkpCisKKyAgICBkZWYgX3Rlc3Rfc2Vla19hbmRfdGVsbChzZWxmLCBwcm94eSk6CisgICAgICAgICMgU2VlayBhbmQgdXNlIHRlbGwgdG8gY2hlY2sgcG9zaXRpb24KKyAgICAgICAgcHJveHkuc2VlaygzKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkudGVsbCgpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkKGxlbihvcy5saW5lc2VwKSkgPT0gb3MubGluZXNlcCkKKyAgICAgICAgcHJveHkuc2VlaygyLCAxKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgxICsgbGVuKG9zLmxpbmVzZXApKSA9PSAncicgKyBvcy5saW5lc2VwKQorICAgICAgICBwcm94eS5zZWVrKC0zIC0gbGVuKG9zLmxpbmVzZXApLCAyKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgzKSA9PSAnYmFyJykKKyAgICAgICAgcHJveHkuc2VlaygyLCAwKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgpID09ICdvJyArIG9zLmxpbmVzZXAgKyAnYmFyJyArIG9zLmxpbmVzZXApCisgICAgICAgIHByb3h5LnNlZWsoMTAwKQorICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgpID09ICcnKQorCisgICAgZGVmIF90ZXN0X2Nsb3NlKHNlbGYsIHByb3h5KToKKyAgICAgICAgIyBDbG9zZSBhIGZpbGUKKyAgICAgICAgcHJveHkuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgbGFtYmRhOiBwcm94eS5jbG9zZSgpKQorCisKK2NsYXNzIFRlc3RQcm94eUZpbGUoVGVzdFByb3h5RmlsZUJhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9wYXRoID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLl9maWxlID0gb3BlbihzZWxmLl9wYXRoLCAnd2IrJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIGFuZCBjaGVjayBwb3NpdGlvbgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28nKQorICAgICAgICBwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBwcm94eTAgPSBtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5MC50ZWxsKCkgPT0gcG9zKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fZmlsZS50ZWxsKCkgPT0gcG9zKQorICAgICAgICBwcm94eTEgPSBtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5MS50ZWxsKCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2JhcicpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZChtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJXNiYXIlc2ZyZWQlc2JvYicgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmUobWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzZnJlZCVzYm9iJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZXMobWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisgICAgZGVmIHRlc3RfaXRlcmF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzZnJlZCVzYm9iJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9pdGVyYXRpb24obWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisgICAgZGVmIHRlc3Rfc2Vla19hbmRfdGVsbChzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJXNiYXIlcycgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3Rfc2Vla19hbmRfdGVsbChtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJXNiYXIlcycgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2UobWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisKK2NsYXNzIFRlc3RQYXJ0aWFsRmlsZShUZXN0UHJveHlGaWxlQmFzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKHNlbGYuX3BhdGgsICd3YisnKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYuX3BhdGgpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgYW5kIGNoZWNrIHBvc2l0aW9uCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2ZvbycgKyBvcy5saW5lc2VwICsgJ2JhcicpCisgICAgICAgIHBvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHByb3h5ID0gbWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgMiwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnRlbGwoKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fZmlsZS50ZWxsKCkgPT0gcG9zKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnKioqYmFyKioqJykKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkKG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDMsIDYpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyEhISEhZm9vJXNiYXIlc2ZyZWQlc2JvYiEhISEhJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKG9zLmxpbmVzZXAsIG9zLmxpbmVzZXAsIG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWRsaW5lKG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTggKyAzICogbGVuKG9zLmxpbmVzZXApKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJXNiYXIlc2ZyZWQlc2JvYj8/Pz8/JyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKG9zLmxpbmVzZXAsIG9zLmxpbmVzZXAsIG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWRsaW5lcyhtYWlsYm94Ll9QYXJ0aWFsRmlsZShzZWxmLl9maWxlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyArIDMgKiBsZW4ob3MubGluZXNlcCkpKQorCisgICAgZGVmIHRlc3RfaXRlcmF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdfX19fZm9vJXNiYXIlc2ZyZWQlc2JvYiMjIyMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAob3MubGluZXNlcCwgb3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfaXRlcmF0aW9uKG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ICsgMyAqIGxlbihvcy5saW5lc2VwKSkpCisKKyAgICBkZWYgdGVzdF9zZWVrX2FuZF90ZWxsKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcoKChmb28lc2JhciVzJCQkJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9zZWVrX2FuZF90ZWxsKG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5ICsgMiAqIGxlbihvcy5saW5lc2VwKSkpCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnJmZvbyVzYmFyJXNeJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZShtYWlsYm94Ll9QYXJ0aWFsRmlsZShzZWxmLl9maWxlLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgKyAzICogbGVuKG9zLmxpbmVzZXApKSkKKworCisjIyBTdGFydDogdGVzdHMgZnJvbSB0aGUgb3JpZ2luYWwgbW9kdWxlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCisKIEZST01fID0gIkZyb20gc29tZS5ib2R5QGR1bW15LmRvbWFpbiAgU2F0IEp1bCAyNCAxMzo0MzozNSAyMDA0XG4iCiBEVU1NWV9NRVNTQUdFID0gIiIiXAogRnJvbTogc29tZS5ib2R5QGR1bW15LmRvbWFpbgpAQCAtNjUsMTUgKzE2MjYsMTUgQEAKICAgICAgICAgIyBUZXN0IGZvciByZWdyZXNzaW9uIG9uIGJ1ZyAjMTE3NDkwOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgYm94ZXMgYXR0cmlidXRlIGFjdHVhbGx5IGdldHMgc2V0LgogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc2VsZi5tYm94LCAiYm94ZXMiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDApCisgICAgICAgICNzZWxmLmFzc2VydF8oaGFzYXR0cihzZWxmLm1ib3gsICJib3hlcyIpKQorICAgICAgICAjc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDApCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCiAKICAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX2N1cihzZWxmKToKICAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDEpCisgICAgICAgICNzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCkBAIC04MSw3ICsxNjQyLDcgQEAKICAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX25ldyhzZWxmKToKICAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJuZXciKQogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDEpCisgICAgICAgICNzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCkBAIC05MCw3ICsxNjUxLDcgQEAKICAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveC5ib3hlcykgPT0gMikKKyAgICAgICAgI3NlbGYuYXNzZXJ0XyhsZW4oc2VsZi5tYm94LmJveGVzKSA9PSAyKQogICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCkBAIC0xMDgsMTIgKzE2NjksOTkgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN0cihtc2cpKSwgbGVuKEZST01fKStsZW4oRFVNTVlfTUVTU0FHRSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgMSkKIAotICAgICMgWFhYIFdlIHN0aWxsIG5lZWQgbW9yZSB0ZXN0cyEKKyMjIEVuZDogY2xhc3NlcyBmcm9tIHRoZSBvcmlnaW5hbCBtb2R1bGUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KKworCitfc2FtcGxlX21lc3NhZ2UgPSAiIiJcCitSZXR1cm4tUGF0aDogPGdrakBncmVnb3J5a2pvaG5zb24uY29tPgorWC1PcmlnaW5hbC1UbzogZ2tqK3BlcnNvbkBsb2NhbGhvc3QKK0RlbGl2ZXJlZC1UbzogZ2tqK3BlcnNvbkBsb2NhbGhvc3QKK1JlY2VpdmVkOiBmcm9tIGxvY2FsaG9zdCAobG9jYWxob3N0IFsxMjcuMC4wLjFdKQorICAgICAgICBieSBhbmR5LmdyZWdvcnlram9obnNvbi5jb20gKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgMzU2RUQ5REQxNworICAgICAgICBmb3IgPGdraitwZXJzb25AbG9jYWxob3N0PjsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxNiAtMDQwMCAoRURUKQorRGVsaXZlcmVkLVRvOiBna2pAc3VuZGFuY2UuZ3JlZ29yeWtqb2huc29uLmNvbQorUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IFsxMjcuMC4wLjFdCisgICAgICAgIGJ5IGxvY2FsaG9zdCB3aXRoIFBPUDMgKGZldGNobWFpbC02LjIuNSkKKyAgICAgICAgZm9yIGdraitwZXJzb25AbG9jYWxob3N0IChzaW5nbGUtZHJvcCk7IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTYgLTA0MDAgKEVEVCkKK1JlY2VpdmVkOiBmcm9tIGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSAoYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIFs2NC4zMi4yMzUuMjI4XSkKKyAgICAgICAgYnkgc3VuZGFuY2UuZ3JlZ29yeWtqb2huc29uLmNvbSAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCA1QjA1NjMxNjc0NgorICAgICAgICBmb3IgPGdrakBncmVnb3J5a2pvaG5zb24uY29tPjsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxMSAtMDQwMCAoRURUKQorUmVjZWl2ZWQ6IGJ5IGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgMTAwMCkKKyAgICAgICAgaWQgNDkwQ0Q5REQxNzsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxMSAtMDQwMCAoRURUKQorRGF0ZTogV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxMSAtMDQwMAorRnJvbTogIkdyZWdvcnkgSy4gSm9obnNvbiIgPGdrakBncmVnb3J5a2pvaG5zb24uY29tPgorVG86IGdrakBncmVnb3J5a2pvaG5zb24uY29tCitTdWJqZWN0OiBTYW1wbGUgbWVzc2FnZQorTWVzc2FnZS1JRDogPDIwMDUwNzEzMjEyMzExLkdDNDcwMUBhbmR5LmdyZWdvcnlram9obnNvbi5jb20+CitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJOTXVNejludDA1dzgwZDQrIgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCitVc2VyLUFnZW50OiBNdXR0LzEuNS45aQorCisKKy0tTk11TXo5bnQwNXc4MGQ0KworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKKworVGhpcyBpcyBhIHNhbXBsZSBtZXNzYWdlLgorCistLQorR3JlZ29yeSBLLiBKb2huc29uCisKKy0tTk11TXo5bnQwNXc4MGQ0KworQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ0ZXh0Lmd6IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK0g0c0lDTTJEMVVJQUEzUmxlSFFBQzhuSUxGWUFva1NGa3RTS0VvVzB6SnhVUGE3d3pKSU1oWkx5ZklXY3pMelVZajB1QUhUcworM0ZZbEFBQUEKKworLS1OTXVNejludDA1dzgwZDQrLS0KKyIiIgorCitfc2FtcGxlX2hlYWRlcnMgPSB7CisgICAgIlJldHVybi1QYXRoIjoiPGdrakBncmVnb3J5a2pvaG5zb24uY29tPiIsCisgICAgIlgtT3JpZ2luYWwtVG8iOiJna2orcGVyc29uQGxvY2FsaG9zdCIsCisgICAgIkRlbGl2ZXJlZC1UbyI6ImdraitwZXJzb25AbG9jYWxob3N0IiwKKyAgICAiUmVjZWl2ZWQiOiIiImZyb20gbG9jYWxob3N0IChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pCisgICAgICAgIGJ5IGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCAzNTZFRDlERDE3CisgICAgICAgIGZvciA8Z2tqK3BlcnNvbkBsb2NhbGhvc3Q+OyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjE2IC0wNDAwIChFRFQpIiIiLAorICAgICJEZWxpdmVyZWQtVG8iOiJna2pAc3VuZGFuY2UuZ3JlZ29yeWtqb2huc29uLmNvbSIsCisgICAgIlJlY2VpdmVkIjoiIiJmcm9tIGxvY2FsaG9zdCBbMTI3LjAuMC4xXQorICAgICAgICBieSBsb2NhbGhvc3Qgd2l0aCBQT1AzIChmZXRjaG1haWwtNi4yLjUpCisgICAgICAgIGZvciBna2orcGVyc29uQGxvY2FsaG9zdCAoc2luZ2xlLWRyb3ApOyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjE2IC0wNDAwIChFRFQpIiIiLAorICAgICJSZWNlaXZlZCI6IiIiZnJvbSBhbmR5LmdyZWdvcnlram9obnNvbi5jb20gKGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSBbNjQuMzIuMjM1LjIyOF0pCisgICAgICAgIGJ5IHN1bmRhbmNlLmdyZWdvcnlram9obnNvbi5jb20gKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgNUIwNTYzMTY3NDYKKyAgICAgICAgZm9yIDxna2pAZ3JlZ29yeWtqb2huc29uLmNvbT47IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTEgLTA0MDAgKEVEVCkiIiIsCisgICAgIlJlY2VpdmVkIjoiIiJieSBhbmR5LmdyZWdvcnlram9obnNvbi5jb20gKFBvc3RmaXgsIGZyb20gdXNlcmlkIDEwMDApCisgICAgICAgIGlkIDQ5MENEOUREMTc7IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTEgLTA0MDAgKEVEVCkiIiIsCisgICAgIkRhdGUiOiJXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjExIC0wNDAwIiwKKyAgICAiRnJvbSI6IiIiIkdyZWdvcnkgSy4gSm9obnNvbiIgPGdrakBncmVnb3J5a2pvaG5zb24uY29tPiIiIiwKKyAgICAiVG8iOiJna2pAZ3JlZ29yeWtqb2huc29uLmNvbSIsCisgICAgIlN1YmplY3QiOiJTYW1wbGUgbWVzc2FnZSIsCisgICAgIk1pbWUtVmVyc2lvbiI6IjEuMCIsCisgICAgIkNvbnRlbnQtVHlwZSI6IiIibXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iTk11TXo5bnQwNXc4MGQ0K1wiIiIiLAorICAgICJDb250ZW50LURpc3Bvc2l0aW9uIjoiaW5saW5lIiwKKyAgICAiVXNlci1BZ2VudCI6ICJNdXR0LzEuNS45aSIgfQorCitfc2FtcGxlX3BheWxvYWRzID0gKCIiIlRoaXMgaXMgYSBzYW1wbGUgbWVzc2FnZS4KKworLS0KK0dyZWdvcnkgSy4gSm9obnNvbgorIiIiLAorIiIiSDRzSUNNMkQxVUlBQTNSbGVIUUFDOG5JTEZZQW9rU0ZrdFNLRW9XMHpKeFVQYTd3ekpJTWhaTHlmSVdjekx6VVlqMHVBSFRzCiszRllsQUFBQQorIiIiKQogCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE1haWxkaXJUZXN0Q2FzZSkKKyAgICB0ZXN0cyA9IChUZXN0TWFpbGJveFN1cGVyY2xhc3MsIFRlc3RNYWlsZGlyLCBUZXN0TWJveCwgVGVzdE1NREYsIFRlc3RNSCwKKyAgICAgICAgICAgICBUZXN0QmFieWwsIFRlc3RNZXNzYWdlLCBUZXN0TWFpbGRpck1lc3NhZ2UsIFRlc3RNYm94TWVzc2FnZSwKKyAgICAgICAgICAgICBUZXN0TUhNZXNzYWdlLCBUZXN0QmFieWxNZXNzYWdlLCBUZXN0TU1ERk1lc3NhZ2UsCisgICAgICAgICAgICAgVGVzdE1lc3NhZ2VDb252ZXJzaW9uLCBUZXN0UHJveHlGaWxlLCBUZXN0UGFydGlhbEZpbGUsCisgICAgICAgICAgICAgTWFpbGRpclRlc3RDYXNlKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQogCiAKLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCA0ZDAyZGVlLi4yNzZiOWFmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTMsNyArMyw2IEBACiAjIHRlc3RfbXVsdGlieXRlY29kZWMucHkKICMgICBVbml0IHRlc3QgZm9yIG11bHRpYnl0ZWNvZGVjIGl0c2VsZgogIwotIyAkQ0pLQ29kZWNzOiB0ZXN0X211bHRpYnl0ZWNvZGVjLnB5LHYgMS44IDIwMDQvMDYvMTkgMDY6MDk6NTUgcGVya3kgRXhwICQKIAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5IGIvTGliL3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2E2ODk3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weQpAQCAtMCwwICsxLDEyMCBAQAorIyBUaGlzIHNldCBvZiB0ZXN0cyBleGVyY2lzZXMgdGhlIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgY2xhc3MKKyMgaW4gbWFpbGJveC5weSAodGhlIG9uZXMgd2l0aG91dCB3cml0ZSBzdXBwb3J0KS4KKworaW1wb3J0IG1haWxib3gKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBjbGVhbnVwIGVhcmxpZXIgdGVzdHMKK3RyeToKKyAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKK2V4Y2VwdCBvcy5lcnJvcjoKKyAgICBwYXNzCisKK0ZST01fID0gIkZyb20gc29tZS5ib2R5QGR1bW15LmRvbWFpbiAgU2F0IEp1bCAyNCAxMzo0MzozNSAyMDA0XG4iCitEVU1NWV9NRVNTQUdFID0gIiIiXAorRnJvbTogc29tZS5ib2R5QGR1bW15LmRvbWFpbgorVG86IG1lQG15LmRvbWFpbgorU3ViamVjdDogU2ltcGxlIFRlc3QKKworVGhpcyBpcyBhIGR1bW15IG1lc3NhZ2UuCisiIiIKKworY2xhc3MgTWFpbGRpclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgYSBuZXcgbWFpbGRpciBtYWlsYm94IHRvIHdvcmsgd2l0aDoKKyAgICAgICAgc2VsZi5fZGlyID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBvcy5ta2RpcihzZWxmLl9kaXIpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJjdXIiKSkKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgInRtcCIpKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAibmV3IikpCisgICAgICAgIHNlbGYuX2NvdW50ZXIgPSAxCisgICAgICAgIHNlbGYuX21zZ2ZpbGVzID0gW10KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgbWFwKG9zLnVubGluaywgc2VsZi5fbXNnZmlsZXMpCisgICAgICAgIG9zLnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJjdXIiKSkKKyAgICAgICAgb3Mucm1kaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgInRtcCIpKQorICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAibmV3IikpCisgICAgICAgIG9zLnJtZGlyKHNlbGYuX2RpcikKKworICAgIGRlZiBjcmVhdGVNZXNzYWdlKHNlbGYsIGRpciwgbWJveD1GYWxzZSk6CisgICAgICAgIHQgPSBpbnQodGltZS50aW1lKCkgJSAxMDAwMDAwKQorICAgICAgICBwaWQgPSBzZWxmLl9jb3VudGVyCisgICAgICAgIHNlbGYuX2NvdW50ZXIgKz0gMQorICAgICAgICBmaWxlbmFtZSA9IG9zLmV4dHNlcC5qb2luKChzdHIodCksIHN0cihwaWQpLCAibXlob3N0bmFtZSIsICJteWRvbWFpbiIpKQorICAgICAgICB0bXBuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RpciwgInRtcCIsIGZpbGVuYW1lKQorICAgICAgICBuZXduYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RpciwgZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgZnAgPSBvcGVuKHRtcG5hbWUsICJ3IikKKyAgICAgICAgc2VsZi5fbXNnZmlsZXMuYXBwZW5kKHRtcG5hbWUpCisgICAgICAgIGlmIG1ib3g6CisgICAgICAgICAgICBmcC53cml0ZShGUk9NXykKKyAgICAgICAgZnAud3JpdGUoRFVNTVlfTUVTU0FHRSkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBpZiBoYXNhdHRyKG9zLCAibGluayIpOgorICAgICAgICAgICAgb3MubGluayh0bXBuYW1lLCBuZXduYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnAgPSBvcGVuKG5ld25hbWUsICJ3IikKKyAgICAgICAgICAgIGZwLndyaXRlKERVTU1ZX01FU1NBR0UpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuX21zZ2ZpbGVzLmFwcGVuZChuZXduYW1lKQorICAgICAgICByZXR1cm4gdG1wbmFtZQorCisgICAgZGVmIHRlc3RfZW1wdHlfbWFpbGRpcihzZWxmKToKKyAgICAgICAgIiIiVGVzdCBhbiBlbXB0eSBtYWlsZGlyIG1haWxib3giIiIKKyAgICAgICAgIyBUZXN0IGZvciByZWdyZXNzaW9uIG9uIGJ1ZyAjMTE3NDkwOgorICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3gpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX2N1cihzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQorICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3gpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorCisgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9uZXcoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKKyAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5tYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfYm90aChzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQorICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCisgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveCkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorCisgICAgZGVmIHRlc3RfdW5peF9tYm94KHNlbGYpOgorICAgICAgICAjIyMgc2hvdWxkIGJlIGJldHRlciEKKyAgICAgICAgaW1wb3J0IGVtYWlsLlBhcnNlcgorICAgICAgICBmbmFtZSA9IHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIiwgVHJ1ZSkKKyAgICAgICAgbiA9IDAKKyAgICAgICAgZm9yIG1zZyBpbiBtYWlsYm94LlBvcnRhYmxlVW5peE1haWxib3gob3BlbihmbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLlBhcnNlci5QYXJzZXIoKS5wYXJzZSk6CisgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWyJzdWJqZWN0Il0sICJTaW1wbGUgVGVzdCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdHIobXNnKSksIGxlbihGUk9NXykrbGVuKERVTU1ZX01FU1NBR0UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIDEpCisKKyAgICAjIFhYWCBXZSBzdGlsbCBuZWVkIG1vcmUgdGVzdHMhCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTWFpbGRpclRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CmluZGV4IGY2NTZiOWYuLjk5MWMwNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpAQCAtMTAsMTcgKzEwLDIyIEBACiAKIGltcG9ydCBzeXMKIGltcG9ydCBvcworaW1wb3J0IHJlCiBpbXBvcnQgY29weQoraW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCisKIGZyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uLCBPcHRpb24sIEluZGVudGVkSGVscEZvcm1hdHRlciwgXAogICAgICBUaXRsZWRIZWxwRm9ybWF0dGVyLCBPcHRpb25QYXJzZXIsIE9wdGlvbkNvbnRhaW5lciwgT3B0aW9uR3JvdXAsIFwKICAgICAgU1VQUFJFU1NfSEVMUCwgU1VQUFJFU1NfVVNBR0UsIE9wdGlvbkVycm9yLCBPcHRpb25Db25mbGljdEVycm9yLCBcCi0gICAgIEJhZE9wdGlvbkVycm9yLCBPcHRpb25WYWx1ZUVycm9yLCBWYWx1ZXMsIF9tYXRjaF9hYmJyZXYKKyAgICAgQmFkT3B0aW9uRXJyb3IsIE9wdGlvblZhbHVlRXJyb3IsIFZhbHVlcworZnJvbSBvcHRwYXJzZSBpbXBvcnQgX21hdGNoX2FiYnJldgorZnJvbSBvcHRwYXJzZSBpbXBvcnQgX3BhcnNlX251bQogCiAjIERvIHRoZSByaWdodCB0aGluZyB3aXRoIGJvb2xlYW4gdmFsdWVzIGZvciBhbGwga25vd24gUHl0aG9uIHZlcnNpb25zLgogdHJ5OgpAQCAtMjgsNiArMzMsNyBAQAogZXhjZXB0IE5hbWVFcnJvcjoKICAgICAoVHJ1ZSwgRmFsc2UpID0gKDEsIDApCiAKK3JldHlwZSA9IHR5cGUocmUuY29tcGlsZSgnJykpCiAKIGNsYXNzIEludGVyY2VwdGVkRXJyb3IoRXhjZXB0aW9uKToKICAgICBkZWYgX19pbml0X18oc2VsZiwKQEAgLTk2LDcgKzEwMiw4IEBACiAgICAgICAgICAgYXJncyAtLSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgZnVuY2AKICAgICAgICAgICBrd2FyZ3MgLS0ga2V5d29yZCBhcmd1bWVudHMgdG8gYGZ1bmNgCiAgICAgICAgICAgZXhwZWN0ZWRfZXhjZXB0aW9uIC0tIGV4Y2VwdGlvbiB0aGF0IHNob3VsZCBiZSByYWlzZWQKLSAgICAgICAgICBleHBlY3RlZF9vdXRwdXQgLS0gb3V0cHV0IHdlIGV4cGVjdCB0byBzZWUKKyAgICAgICAgICBleHBlY3RlZF9tZXNzYWdlIC0tIGV4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlIChvciBwYXR0ZXJuCisgICAgICAgICAgICBpZiBhIGNvbXBpbGVkIHJlZ2V4IG9iamVjdCkKIAogICAgICAgICBSZXR1cm5zIHRoZSBleGNlcHRpb24gcmFpc2VkIGZvciBmdXJ0aGVyIHRlc3RpbmcuCiAgICAgICAgICIiIgpAQCAtMTA5LDE0ICsxMTYsMjMgQEAKICAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICBleGNlcHQgZXhwZWN0ZWRfZXhjZXB0aW9uLCBlcnI6CiAgICAgICAgICAgICBhY3R1YWxfbWVzc2FnZSA9IHN0cihlcnIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbF9tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9tZXNzYWdlLAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZF9tZXNzYWdlLCByZXR5cGUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhleHBlY3RlZF9tZXNzYWdlLnNlYXJjaChhY3R1YWxfbWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIlwKLWV4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlOgotJycnJShleHBlY3RlZF9tZXNzYWdlKXMnJycKK2V4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlIHBhdHRlcm46CisvJXMvCiBhY3R1YWwgZXhjZXB0aW9uIG1lc3NhZ2U6Ci0nJyclKGFjdHVhbF9tZXNzYWdlKXMnJycKLSIiIiAlIGxvY2FscygpKQorJycnJXMnJycKKyIiIiAlIChleHBlY3RlZF9tZXNzYWdlLnBhdHRlcm4sIGFjdHVhbF9tZXNzYWdlKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWxfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJcCitleHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZToKKycnJyVzJycnCithY3R1YWwgZXhjZXB0aW9uIG1lc3NhZ2U6CisnJyclcycnJworIiIiICUgKGV4cGVjdGVkX21lc3NhZ2UsIGFjdHVhbF9tZXNzYWdlKSkKIAogICAgICAgICAgICAgcmV0dXJuIGVycgogICAgICAgICBlbHNlOgpAQCAtMTU3LDcgKzE3Myw5IEBACiAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CiAKICAgICAgICAgZXhjZXB0IEludGVyY2VwdGVkRXJyb3IsIGVycjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LCBleHBlY3RlZF9vdXRwdXQpCisgICAgICAgICAgICBpZiBvdXRwdXQgIT0gZXhwZWN0ZWRfb3V0cHV0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQ6IFxuJycnXG4iICsgZXhwZWN0ZWRfb3V0cHV0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicnJ1xuYnV0IGdvdCBcbicnJ1xuIiArIG91dHB1dCArICInJyciKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZXhpdF9zdGF0dXMsIGV4cGVjdGVkX3N0YXR1cykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmV4aXRfbWVzc2FnZSwgZXhwZWN0ZWRfZXJyb3IpCiAgICAgICAgIGVsc2U6CkBAIC0zNjYsNiArMzg0LDIzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYucGFyc2VyLnJlbW92ZV9vcHRpb24sICgnZm9vJywpLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUVycm9yLCAibm8gc3VjaCBvcHRpb24gJ2ZvbyciKQogCisgICAgZGVmIHRlc3RfcmVmbGVhayhzZWxmKToKKyAgICAgICAgIyBJZiBhbiBPcHRpb25QYXJzZXIgaXMgY2FycnlpbmcgYXJvdW5kIGEgcmVmZXJlbmNlIHRvIGEgbGFyZ2UKKyAgICAgICAgIyBvYmplY3QsIHZhcmlvdXMgY3ljbGVzIGNhbiBwcmV2ZW50IGl0IGZyb20gYmVpbmcgR0MnZCBpbgorICAgICAgICAjIGEgdGltZWx5IGZhc2hpb24uICBkZXN0cm95KCkgYnJlYWtzIHRoZSBjeWNsZXMgdG8gZW5zdXJlIHN0dWZmCisgICAgICAgICMgY2FuIGJlIGNsZWFuZWQgdXAuCisgICAgICAgIGJpZ190aGluZyA9IFs0Ml0KKyAgICAgICAgcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYmlnX3RoaW5nKQorICAgICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWEiLCAiLS1hYWFyZ2doIikKKyAgICAgICAgcGFyc2VyLmJpZ190aGluZyA9IGJpZ190aGluZworCisgICAgICAgIHBhcnNlci5kZXN0cm95KCkKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwocmVmY291bnQsIHN5cy5nZXRyZWZjb3VudChiaWdfdGhpbmcpKQorICAgICAgICBkZWwgcGFyc2VyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmY291bnQsIHN5cy5nZXRyZWZjb3VudChiaWdfdGhpbmcpKQorCisKIGNsYXNzIFRlc3RPcHRpb25WYWx1ZXMoQmFzZVRlc3QpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgcGFzcwpAQCAtMzkxLDEzICs0MjYsMjEgQEAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKIAotICAgIGRlZiB0ZXN0X3R5cGVfYWxpYXNlcyhzZWxmKToKLSAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXgiLCB0eXBlPWludCkKLSAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXMiLCB0eXBlPXN0cikKLSAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXQiLCB0eXBlPSJzdHIiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCIteCIpLnR5cGUsICJpbnQiKQorICAgIGRlZiB0ZXN0X3N0cl9hbGlhc2VzX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXMiLCB0eXBlPSJzdHIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItcyIpLnR5cGUsICJzdHJpbmciKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItdCIpLnR5cGUsICJzdHJpbmciKQorCisgICAgZGVmIHRlc3RfbmV3X3R5cGVfb2JqZWN0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcyIsIHR5cGU9c3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItcyIpLnR5cGUsICJzdHJpbmciKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCIteCIsIHR5cGU9aW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCIteCIpLnR5cGUsICJpbnQiKQorCisgICAgZGVmIHRlc3Rfb2xkX3R5cGVfb2JqZWN0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcyIsIHR5cGU9dHlwZXMuU3RyaW5nVHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXMiKS50eXBlLCAic3RyaW5nIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXgiLCB0eXBlPXR5cGVzLkludFR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi14IikudHlwZSwgImludCIpCiAKIAogIyBDdXN0b20gdHlwZSBmb3IgdGVzdGluZyBwcm9jZXNzaW5nIG9mIGRlZmF1bHQgdmFsdWVzLgpAQCAtNDg3LDEzICs1MzAsMTMgQEAKICAgICAgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3ZbOl0KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSBvcy5wYXRoLmpvaW4oImZvbyIsICJiYXIiLCAiYmF6LnB5IikKLSAgICAgICAgICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigidXNhZ2U6ICVwcm9nIC4uLiIsIHZlcnNpb249IiVwcm9nIDEuMiIpCi0gICAgICAgICAgICBleHBlY3RlZF91c2FnZSA9ICJ1c2FnZTogYmF6LnB5IC4uLlxuIgorICAgICAgICAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCIlcHJvZyAuLi4iLCB2ZXJzaW9uPSIlcHJvZyAxLjIiKQorICAgICAgICAgICAgZXhwZWN0ZWRfdXNhZ2UgPSAiVXNhZ2U6IGJhei5weSAuLi5cbiIKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VXNhZ2UocGFyc2VyLCBleHBlY3RlZF91c2FnZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VmVyc2lvbihwYXJzZXIsICJiYXoucHkgMS4yIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SGVscChwYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdXNhZ2UgKyAiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9uczpcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtLXZlcnNpb24gICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXRcbiIpCiAgICAgICAgIGZpbmFsbHk6CkBAIC01MDUsNyArNTQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPSIlcHJvZyBhcmcgYXJnIikKICAgICAgICAgcGFyc2VyLnJlbW92ZV9vcHRpb24oIi1oIikKICAgICAgICAgcGFyc2VyLnJlbW92ZV9vcHRpb24oIi0tdmVyc2lvbiIpCi0gICAgICAgIGV4cGVjdGVkX3VzYWdlID0gInVzYWdlOiB0aGluZ3kgYXJnIGFyZ1xuIgorICAgICAgICBleHBlY3RlZF91c2FnZSA9ICJVc2FnZTogdGhpbmd5IGFyZyBhcmdcbiIKICAgICAgICAgc2VsZi5hc3NlcnRVc2FnZShwYXJzZXIsIGV4cGVjdGVkX3VzYWdlKQogICAgICAgICBzZWxmLmFzc2VydFZlcnNpb24ocGFyc2VyLCAidGhpbmd5IDAuMSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0SGVscChwYXJzZXIsIGV4cGVjdGVkX3VzYWdlICsgIlxuIikKQEAgLTUxNSw5ICs1NTgsOSBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIocHJvZz0idGVzdCIpCiAgICAgICAgIHNlbGYuaGVscF9wcmVmaXggPSAiIiJcCi11c2FnZTogdGVzdCBbb3B0aW9uc10KK1VzYWdlOiB0ZXN0IFtvcHRpb25zXQogCi1vcHRpb25zOgorT3B0aW9uczoKICAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKICIiIgogICAgICAgICBzZWxmLmZpbGVfaGVscCA9ICJyZWFkIGZyb20gRklMRSBbZGVmYXVsdDogJWRlZmF1bHRdIgpAQCAtNjk5LDEzICs3NDIsMTYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiLS0iLCAiZm9vIiwgImJhciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogIi0tIiwgJ2Jvbyc6IE5vbmUsICdmb28nOiBOb25lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vIiwgImJhciJdKSwKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiLS0iLCAiLS1mb28iLCAiYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiLS0iLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IFsiYmFyIl19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pLAogCiAgICAgZGVmIHRlc3Rfc2hvcnRfb3B0aW9uX2pvaW5lZF9hbmRfc2VwYXJhdG9yKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYWIiLCAiLS0iLCAiLS1mb28iLCAiYmFyIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiYiIsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi0tZm9vIiwgImJhciJdKSwKIAotICAgIGRlZiB0ZXN0X2ludmFsaWRfb3B0aW9uX2JlY29tZXNfcG9zaXRpb25hbF9hcmcoc2VsZik6CisgICAgZGVmIHRlc3RfaHlwaGVuX2JlY29tZXNfcG9zaXRpb25hbF9hcmcoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hYiIsICItIiwgIi0tZm9vIiwgImJhciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogImIiLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IFsiYmFyIl19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyItIl0pCkBAIC04NzAsNiArOTE2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJmbG9hdCIsIGRlc3Q9InBvaW50IikKICAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1mb28iLCBhY3Rpb249ImFwcGVuZCIsIG5hcmdzPTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiwgZGVzdD0iZm9vIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXoiLCAiLS16ZXJvIiwgYWN0aW9uPSJhcHBlbmRfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImZvbyIsIGNvbnN0PSgwLCAwKSkKIAogICAgIGRlZiB0ZXN0X25hcmdzX2FwcGVuZChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWYiLCAiNCIsICItMyIsICJibGFoIiwgIi0tZm9vIiwgIjEiLCAiNjY2Il0sCkBAIC04ODUsNiArOTMzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3BvaW50JzogTm9uZSwgJ2Zvbyc6WygzLCA0KV19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCiAKKyAgICBkZWYgdGVzdF9uYXJnc19hcHBlbmRfY29uc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0temVybyIsICItLWZvbyIsICIzIiwgIjQiLCAiLXoiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncG9pbnQnOiBOb25lLCAnZm9vJzpbKDAsIDApLCAoMywgNCksICgwLCAwKV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKIGNsYXNzIFRlc3RWZXJzaW9uKEJhc2VUZXN0KToKICAgICBkZWYgdGVzdF92ZXJzaW9uKHNlbGYpOgogICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwKQEAgLTk2MCw4ICsxMDEzLDE0IEBACiAgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1hIiwgTm9uZSwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iYSIpCiAgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsIHR5cGU9ImZpbGUiLCBkZXN0PSJmaWxlIikKIAorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKwogICAgIGNsYXNzIE15T3B0aW9uIChPcHRpb24pOgotICAgICAgICBkZWYgY2hlY2tfZmlsZSAob3B0aW9uLCBvcHQsIHZhbHVlKToKKyAgICAgICAgZGVmIGNoZWNrX2ZpbGUob3B0aW9uLCBvcHQsIHZhbHVlKToKICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh2YWx1ZSk6CiAgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uVmFsdWVFcnJvcigiJXM6IGZpbGUgZG9lcyBub3QgZXhpc3QiICUgdmFsdWUpCiAgICAgICAgICAgICBlbGlmIG5vdCBvcy5wYXRoLmlzZmlsZSh2YWx1ZSk6CkBAIC05NzIsMjUgKzEwMzEsMjMgQEAKICAgICAgICAgVFlQRV9DSEVDS0VSID0gY29weS5jb3B5KE9wdGlvbi5UWVBFX0NIRUNLRVIpCiAgICAgICAgIFRZUEVfQ0hFQ0tFUlsiZmlsZSJdID0gY2hlY2tfZmlsZQogCi0gICAgZGVmIHRlc3RfZXh0ZW5kX2ZpbGUoc2VsZik6CisgICAgZGVmIHRlc3RfZmlsZXR5cGVfb2soc2VsZik6CiAgICAgICAgIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInciKS5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tZmlsZSIsIHRlc3Rfc3VwcG9ydC5URVNURk4sICItYWZvbyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeydmaWxlJzogdGVzdF9zdXBwb3J0LlRFU1RGTiwgJ2EnOiAnZm9vJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKIAotICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKLQotICAgIGRlZiB0ZXN0X2V4dGVuZF9maWxlX25vbmV4aXN0ZW50KHNlbGYpOgorICAgIGRlZiB0ZXN0X2ZpbGV0eXBlX25vZXhpc3Qoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1maWxlIiwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgIi1hZm9vIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogZmlsZSBkb2VzIG5vdCBleGlzdCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOKQogCi0gICAgZGVmIHRlc3RfZmlsZV9pcnJlZ3VsYXIoc2VsZik6CisgICAgZGVmIHRlc3RfZmlsZXR5cGVfbm90ZmlsZShzZWxmKToKICAgICAgICAgb3MubWtkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItLWZpbGUiLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiLWFmb28iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBub3QgYSByZWd1bGFyIGZpbGUiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKwogCiBjbGFzcyBUZXN0RXh0ZW5kQWRkQWN0aW9ucyhCYXNlVGVzdCk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTAwMyw3ICsxMDYwLDcgQEAKICAgICAgICAgU1RPUkVfQUNUSU9OUyA9IE9wdGlvbi5TVE9SRV9BQ1RJT05TICsgKCJleHRlbmQiLCkKICAgICAgICAgVFlQRURfQUNUSU9OUyA9IE9wdGlvbi5UWVBFRF9BQ1RJT05TICsgKCJleHRlbmQiLCkKIAotICAgICAgICBkZWYgdGFrZV9hY3Rpb24gKHNlbGYsIGFjdGlvbiwgZGVzdCwgb3B0LCB2YWx1ZSwgdmFsdWVzLCBwYXJzZXIpOgorICAgICAgICBkZWYgdGFrZV9hY3Rpb24oc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcik6CiAgICAgICAgICAgICBpZiBhY3Rpb24gPT0gImV4dGVuZCI6CiAgICAgICAgICAgICAgICAgbHZhbHVlID0gdmFsdWUuc3BsaXQoIiwiKQogICAgICAgICAgICAgICAgIHZhbHVlcy5lbnN1cmVfdmFsdWUoZGVzdCwgW10pLmV4dGVuZChsdmFsdWUpCkBAIC0xMDcyLDcgKzExMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1sYW1iZGE6IE5vbmUsIHR5cGU9InN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImZvbyIpCiAKLSAgICAgICAgZXhwZWN0ZWRfaGVscCA9ICgib3B0aW9uczpcbiIKKyAgICAgICAgZXhwZWN0ZWRfaGVscCA9ICgiT3B0aW9uczpcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtdCBURVNULCAtLXRlc3Q9VEVTVCAgZm9vXG4iKQogICAgICAgICBzZWxmLmFzc2VydEhlbHAocGFyc2VyLCBleHBlY3RlZF9oZWxwKQogCkBAIC0xMDg1LDcgKzExNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InBvaW50cyIsIGRlZmF1bHQ9W10pXQogICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25zKQogCi0gICAgZGVmIHByb2Nlc3NfdHVwbGUgKHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyXywgbGVuLCB0eXBlKToKKyAgICBkZWYgcHJvY2Vzc190dXBsZShzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcl8sIGxlbiwgdHlwZSk6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuLCAzKQogICAgICAgICBzZWxmLmFzc2VydF8odHlwZSBpcyBpbnQpCiAKQEAgLTExMTAsNyArMTE2Nyw3IEBACiAgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbnMpCiAKICAgICAjIENhbGxiYWNrIHRoYXQgbWVkZGxlcyBpbiByYXJncywgbGFyZ3MKLSAgICBkZWYgcHJvY2Vzc19uIChzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcl8pOgorICAgIGRlZiBwcm9jZXNzX24oc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXJfKToKICAgICAgICAgIyBvcHRpb24gaXMgLTMsIC01LCBldGMuCiAgICAgICAgIG5hcmdzID0gaW50KG9wdFsxOl0pCiAgICAgICAgIHJhcmdzID0gcGFyc2VyXy5yYXJncwpAQCAtMTEzOSw3ICsxMTk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1zZWxmLnByb2Nlc3NfbWFueSwgdHlwZT0iaW50IildCiAgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbnMpCiAKLSAgICBkZWYgcHJvY2Vzc19tYW55IChzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcl8pOgorICAgIGRlZiBwcm9jZXNzX21hbnkoc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXJfKToKICAgICAgICAgaWYgb3B0ID09ICItYSI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAoImZvbyIsICJiYXIiKSkKICAgICAgICAgZWxpZiBvcHQgPT0gIi0tYXBwbGUiOgpAQCAtMTE2Miw3ICsxMjE5LDcgQEAKICAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLS1mb28tYmFyIiwgYWN0aW9uPSJjYWxsYmFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s9c2VsZi5jaGVja19hYmJyZXYpCiAKLSAgICBkZWYgY2hlY2tfYWJicmV2IChzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CisgICAgZGVmIGNoZWNrX2FiYnJldihzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAiLS1mb28tYmFyIikKIAogICAgIGRlZiB0ZXN0X2FiYnJldl9jYWxsYmFja19leHBhbnNpb24oc2VsZik6CkBAIC0xMTc3LDcgKzEyMzQsNyBAQAogICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2xpc3Q9b3B0aW9ucykKIAotICAgIGRlZiB2YXJpYWJsZV9hcmdzIChzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CisgICAgZGVmIHZhcmlhYmxlX2FyZ3Moc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXIpOgogICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUgaXMgTm9uZSkKICAgICAgICAgZG9uZSA9IDAKICAgICAgICAgdmFsdWUgPSBbXQpAQCAtMTIyOSw3ICsxMjg2LDcgQEAKICAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9saXN0PW9wdGlvbnMpCiAKLSAgICBkZWYgc2hvd192ZXJzaW9uIChzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CisgICAgZGVmIHNob3dfdmVyc2lvbihzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CiAgICAgICAgIHBhcnNlci52YWx1ZXMuc2hvd192ZXJzaW9uID0gMQogCiBjbGFzcyBUZXN0Q29uZmxpY3QoQ29uZmxpY3RCYXNlKToKQEAgLTEyODAsNyArMTMzNyw3IEBACiAKICAgICBkZWYgdGVzdF9jb25mbGljdF9yZXNvbHZlX2hlbHAoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0T3V0cHV0KFsiLWgiXSwgIiIiXAotb3B0aW9uczoKK09wdGlvbnM6CiAgIC0tdmVyYm9zZSAgICAgIGluY3JlbWVudCB2ZXJib3NpdHkKICAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAogICAtdiwgLS12ZXJzaW9uICBzaG93IHZlcnNpb24KQEAgLTEzMTksNyArMTM3Niw3IEBACiAKICAgICBkZWYgdGVzdF9jb25mbGljdF9vdmVycmlkZV9oZWxwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydE91dHB1dChbIi1oIl0sICIiIlwKLW9wdGlvbnM6CitPcHRpb25zOgogICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CiAgIC1uLCAtLWRyeS1ydW4gIGRyeSBydW4gbW9kZQogIiIiKQpAQCAtMTMzMiw5ICsxMzg5LDkgQEAKICMgLS0gT3RoZXIgdGVzdGluZy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBfZXhwZWN0ZWRfaGVscF9iYXNpYyA9ICIiIlwKLXVzYWdlOiBiYXIucHkgW29wdGlvbnNdCitVc2FnZTogYmFyLnB5IFtvcHRpb25zXQogCi1vcHRpb25zOgorT3B0aW9uczoKICAgLWEgQVBQTEUgICAgICAgICAgIHRocm93IEFQUExFcyBhdCBiYXNrZXQKICAgLWIgTlVNLCAtLWJvbz1OVU0gIHNob3V0ICJib28hIiBOVU0gdGltZXMgKGluIG9yZGVyIHRvIGZyaWdodGVuIGF3YXkgYWxsIHRoZQogICAgICAgICAgICAgICAgICAgICAgZXZpbCBzcGlyaXRzIHRoYXQgY2F1c2UgdHJvdWJsZSBhbmQgbWF5aGVtKQpAQCAtMTM0Myw5ICsxNDAwLDkgQEAKICIiIgogCiBfZXhwZWN0ZWRfaGVscF9sb25nX29wdHNfZmlyc3QgPSAiIiJcCi11c2FnZTogYmFyLnB5IFtvcHRpb25zXQorVXNhZ2U6IGJhci5weSBbb3B0aW9uc10KIAotb3B0aW9uczoKK09wdGlvbnM6CiAgIC1hIEFQUExFICAgICAgICAgICB0aHJvdyBBUFBMRXMgYXQgYmFza2V0CiAgIC0tYm9vPU5VTSwgLWIgTlVNICBzaG91dCAiYm9vISIgTlVNIHRpbWVzIChpbiBvcmRlciB0byBmcmlnaHRlbiBhd2F5IGFsbCB0aGUKICAgICAgICAgICAgICAgICAgICAgIGV2aWwgc3Bpcml0cyB0aGF0IGNhdXNlIHRyb3VibGUgYW5kIG1heWhlbSkKQEAgLTEzNTgsNyArMTQxNSw3IEBACiA9PT09PQogICBiYXIucHkgW29wdGlvbnNdCiAKLW9wdGlvbnMKK09wdGlvbnMKID09PT09PT0KIC1hIEFQUExFICAgICAgICAgICB0aHJvdyBBUFBMRXMgYXQgYmFza2V0CiAtLWJvbz1OVU0sIC1iIE5VTSAgc2hvdXQgImJvbyEiIE5VTSB0aW1lcyAoaW4gb3JkZXIgdG8gZnJpZ2h0ZW4gYXdheSBhbGwgdGhlCkBAIC0xMzY4LDkgKzE0MjUsOSBAQAogIiIiCiAKIF9leHBlY3RlZF9oZWxwX3Nob3J0X2xpbmVzID0gIiIiXAotdXNhZ2U6IGJhci5weSBbb3B0aW9uc10KK1VzYWdlOiBiYXIucHkgW29wdGlvbnNdCiAKLW9wdGlvbnM6CitPcHRpb25zOgogICAtYSBBUFBMRSAgICAgICAgICAgdGhyb3cgQVBQTEVzIGF0IGJhc2tldAogICAtYiBOVU0sIC0tYm9vPU5VTSAgc2hvdXQgImJvbyEiIE5VTSB0aW1lcyAoaW4gb3JkZXIgdG8KICAgICAgICAgICAgICAgICAgICAgIGZyaWdodGVuIGF3YXkgYWxsIHRoZSBldmlsIHNwaXJpdHMKQEAgLTEzODIsMTUgKzE0MzksOCBAQAogCiBjbGFzcyBUZXN0SGVscChCYXNlVGVzdCk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLm9yaWdfY29sdW1ucyA9IG9zLmVudmlyb24uZ2V0KCdDT0xVTU5TJykKICAgICAgICAgc2VsZi5wYXJzZXIgPSBzZWxmLm1ha2VfcGFyc2VyKDgwKQogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBpZiBzZWxmLm9yaWdfY29sdW1ucyBpcyBOb25lOgotICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ0NPTFVNTlMnXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgb3MuZW52aXJvblsnQ09MVU1OUyddID0gc2VsZi5vcmlnX2NvbHVtbnMKLQogICAgIGRlZiBtYWtlX3BhcnNlcihzZWxmLCBjb2x1bW5zKToKICAgICAgICAgb3B0aW9ucyA9IFsKICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItYSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9J2EnLApAQCAtMTQxOSw3ICsxNDY5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF9oZWxwX2Jhc2ljKQogCiAgICAgZGVmIHRlc3RfaGVscF9vbGRfdXNhZ2Uoc2VsZik6Ci0gICAgICAgIHNlbGYucGFyc2VyLnNldF91c2FnZSgidXNhZ2U6ICVwcm9nIFtvcHRpb25zXSIpCisgICAgICAgIHNlbGYucGFyc2VyLnNldF91c2FnZSgiVXNhZ2U6ICVwcm9nIFtvcHRpb25zXSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhfZXhwZWN0ZWRfaGVscF9iYXNpYykKIAogICAgIGRlZiB0ZXN0X2hlbHBfbG9uZ19vcHRzX2ZpcnN0KHNlbGYpOgpAQCAtMTQ0OSwxMyArMTQ5OSwxMyBAQAogICAgICAgICBncm91cC5hZGRfb3B0aW9uKCItZyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9Ikdyb3VwIG9wdGlvbi4iKQogICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKGdyb3VwKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscygiIiJcCi11c2FnZTogYmFyLnB5IFtvcHRpb25zXQorICAgICAgICBleHBlY3QgPSAiIiJcCitVc2FnZTogYmFyLnB5IFtvcHRpb25zXQogCiBUaGlzIGlzIHRoZSBwcm9ncmFtIGRlc2NyaXB0aW9uIGZvciBiYXIucHkuICBiYXIucHkgaGFzIGFuIG9wdGlvbiBncm91cCBhcwogd2VsbCBhcyBzaW5nbGUgb3B0aW9ucy4KIAotb3B0aW9uczoKK09wdGlvbnM6CiAgIC1hIEFQUExFICAgICAgICAgICB0aHJvdyBBUFBMRXMgYXQgYmFza2V0CiAgIC1iIE5VTSwgLS1ib289TlVNICBzaG91dCAiYm9vISIgTlVNIHRpbWVzIChpbiBvcmRlciB0byBmcmlnaHRlbiBhd2F5IGFsbCB0aGUKICAgICAgICAgICAgICAgICAgICAgIGV2aWwgc3Bpcml0cyB0aGF0IGNhdXNlIHRyb3VibGUgYW5kIG1heWhlbSkKQEAgLTE0NjcsOSArMTUxNywxMiBAQAogICAgIHRoYXQgc29tZSBvZiB0aGVtIGJpdGUuCiAKICAgICAtZyAgICAgICAgICAgICAgIEdyb3VwIG9wdGlvbi4KLSIiIikKKyIiIgogCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhleHBlY3QpCiAKKyAgICAgICAgc2VsZi5wYXJzZXIuZXBpbG9nID0gIlBsZWFzZSByZXBvcnQgYnVncyB0byAvZGV2L251bGwuIgorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoZXhwZWN0ICsgIlxuUGxlYXNlIHJlcG9ydCBidWdzIHRvIC9kZXYvbnVsbC5cbiIpCiAKIAogY2xhc3MgVGVzdE1hdGNoQWJicmV2KEJhc2VUZXN0KToKQEAgLTE0OTAsNiArMTU0Myw0MyBAQAogICAgICAgICAgICAgQmFkT3B0aW9uRXJyb3IsICJhbWJpZ3VvdXMgb3B0aW9uOiAtLWYgKCVzPykiICUgcG9zc2liaWxpdGllcykKIAogCitjbGFzcyBUZXN0UGFyc2VOdW1iZXIoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIoKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItbiIsIHR5cGU9aW50KQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItbCIsIHR5cGU9bG9uZykKKworICAgIGRlZiB0ZXN0X3BhcnNlX251bV9mYWlsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIF9wYXJzZV9udW0sICgiIiwgaW50KSwge30sCisgICAgICAgICAgICBWYWx1ZUVycm9yLAorICAgICAgICAgICAgcmUuY29tcGlsZShyImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkuKjogJz8nPyIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIF9wYXJzZV9udW0sICgiMHhPb29wcyIsIGxvbmcpLCB7fSwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsCisgICAgICAgICAgICByZS5jb21waWxlKHIiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkuKjogJz8weE9vb3BzJz8iKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX251bV9vayhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIwIiwgaW50KSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIweDEwIiwgaW50KSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3BhcnNlX251bSgiMFhBIiwgbG9uZyksIDEwTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIwMTAiLCBsb25nKSwgOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3BhcnNlX251bSgiMGIxMSIsIGludCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3BhcnNlX251bSgiMGIiLCBsb25nKSwgMEwpCisKKyAgICBkZWYgdGVzdF9udW1lcmljX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1uIiwgIjQyIiwgIi1sIiwgIjB4MjAiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIm4iOiA0MiwgImwiOiAweDIwIH0sIFtdKQorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItbiIsICIwYjAxMDEiLCAiLWwwMTAiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIm4iOiA1LCAibCI6IDggfSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLW4wMDgiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtbjogaW52YWxpZCBpbnRlZ2VyIHZhbHVlOiAnMDA4JyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLWwwYjAxMjMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtbDogaW52YWxpZCBsb25nIGludGVnZXIgdmFsdWU6ICcwYjAxMjMnIikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItbCIsICIweDEyeCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1sOiBpbnZhbGlkIGxvbmcgaW50ZWdlciB2YWx1ZTogJzB4MTJ4JyIpCisKKwogZGVmIF90ZXN0Y2xhc3NlcygpOgogICAgIG1vZCA9IHN5cy5tb2R1bGVzW19fbmFtZV9fXQogICAgIHJldHVybiBbZ2V0YXR0cihtb2QsIG5hbWUpIGZvciBuYW1lIGluIGRpcihtb2QpIGlmIG5hbWUuc3RhcnRzd2l0aCgnVGVzdCcpXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKaW5kZXggMmJjNWZjMC4uZmZjOTQyMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zLnB5CkBAIC01LDYgKzUsNyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncworaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0ZW1wbmFtIiwgUnVudGltZVdhcm5pbmcsIF9fbmFtZV9fKQpAQCAtMzY0LDYgKzM2NSwzMiBAQAogICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAorY2xhc3MgV2luMzJFcnJvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgb3MucmVuYW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKyIuYmFrIikKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy5yZW1vdmUsIHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9jaGRpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy5jaGRpciwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X21rZGlyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIG9zLmNoZGlyLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfdXRpbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgb3MudXRpbWUsIHRlc3Rfc3VwcG9ydC5URVNURk4sIE5vbmUpCisKKyAgICBkZWYgdGVzdF9hY2Nlc3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgb3MudXRpbWUsIHRlc3Rfc3VwcG9ydC5URVNURk4sIDApCisKKyAgICBkZWYgdGVzdF9jaG1vZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy51dGltZSwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgMCkKKworaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisgICAgY2xhc3MgV2luMzJFcnJvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgcGFzcworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKICAgICAgICAgVGVtcG9yYXJ5RmlsZVRlc3RzLApAQCAtMzcyLDcgKzM5OSw4IEBACiAgICAgICAgIFdhbGtUZXN0cywKICAgICAgICAgTWFrZWRpclRlc3RzLAogICAgICAgICBEZXZOdWxsVGVzdHMsCi0gICAgICAgIFVSYW5kb21UZXN0cworICAgICAgICBVUmFuZG9tVGVzdHMsCisgICAgICAgIFdpbjMyRXJyb3JUZXN0cwogICAgICkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHR5LnB5IGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKaW5kZXggOTllMDFiNi4uNTllNTE2MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKQEAgLTQsMTMgKzQsNiBAQAogVEVTVF9TVFJJTkdfMSA9ICJJIHdpc2ggdG8gYnV5IGEgZmlzaCBsaWNlbnNlLlxuIgogVEVTVF9TVFJJTkdfMiA9ICJGb3IgbXkgcGV0IGZpc2gsIEVyaWMuXG4iCiAKLSMgU29sYXJpcyAoYXQgbGVhc3QgMi45IGFuZCAyLjEwKSBzZWVtIHRvIGhhdmUgYSBmaWNrbGUgaXNhdHR5KCkuIFRoZSBmaXJzdAotIyB0ZXN0IGJlbG93LCB0ZXN0aW5nIHRoZSByZXN1bHQgb2Ygb3Mub3BlbnB0eSgpIGZvciB0dHktbmVzcywgc29tZXRpbWVzCi0jIChidXQgbm90IGFsd2F5cykgZmFpbHMuIFRoZSBzZWNvbmQgaXNhdHR5IHRlc3QsIGluIHRoZSBzdWItcHJvY2VzcywgYWx3YXlzCi0jIHdvcmtzLiBBbGxvdyB0aGF0IGZpY2tsZSBmaXJzdCB0ZXN0IHRvIGZhaWwgb24gdGhlc2UgcGxhdGZvcm1zLCBzaW5jZSBpdAotIyBkb2Vzbid0IGFjdHVhbGx5IGFmZmVjdCBmdW5jdGlvbmFsaXR5LgotZmlja2xlX2lzYXR0eSA9IFsic3Vub3M1Il0KLQogaWYgdmVyYm9zZToKICAgICBkZWYgZGVidWcobXNnKToKICAgICAgICAgcHJpbnQgbXNnCkBAIC0zMSwxMSArMjQsMTEgQEAKIAogICAgICMgT1NGLzEgKFRydTY0KSBhcHBhcmVudGx5IHR1cm5zIFxuIGludG8gXHJcclxuLgogICAgIGlmIGRhdGEuZW5kc3dpdGgoJ1xyXHJcbicpOgotICAgICAgICByZXR1cm4gZGF0YVs6LTNdICsgJ1xuJworICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKCdcclxyXG4nLCAnXG4nKQogCiAgICAgIyBJUklYIGFwcGFyZW50bHkgdHVybnMgXG4gaW50byBcclxuLgogICAgIGlmIGRhdGEuZW5kc3dpdGgoJ1xyXG4nKToKLSAgICAgICAgcmV0dXJuIGRhdGFbOi0yXSArICdcbicKKyAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgnXHJcbicsICdcbicpCiAKICAgICByZXR1cm4gZGF0YQogCkBAIC01NCw3ICs0Nyw3IEBACiAgICAgICAgICMgIiBBbiBvcHRpb25hbCBmZWF0dXJlIGNvdWxkIG5vdCBiZSBpbXBvcnRlZCAiIC4uLiA/CiAgICAgICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAiUHNldWRvLXRlcm1pbmFscyAoc2VlbWluZ2x5KSBub3QgZnVuY3Rpb25hbC4iCiAKLSAgICBpZiBub3Qgb3MuaXNhdHR5KHNsYXZlX2ZkKSBhbmQgc3lzLnBsYXRmb3JtIG5vdCBpbiBmaWNrbGVfaXNhdHR5OgorICAgIGlmIG5vdCBvcy5pc2F0dHkoc2xhdmVfZmQpOgogICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAic2xhdmVfZmQgaXMgbm90IGEgdHR5IgogCiAgICAgZGVidWcoIldyaXRpbmcgdG8gc2xhdmVfZmQiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkgYi9MaWIvdGVzdC90ZXN0X3JmYzgyMi5weQppbmRleCAwZDlmMjhhLi42ZDIyODI1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JmYzgyMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JmYzgyMi5weQpAQCAtNDUsNiArNDUsMTAgQEAKICAgICAgICAgICAgICAgICBwcmludCAnZXh0cmEgcGFyc2VkIGFkZHJlc3M6JywgcmVwcihuKSwgcmVwcihhKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW4sIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbi1leHBlY3RlZCBuYW1lOiAlcyAhPSAlcyIgJSAoYG1uYCwgYG5gKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWEsIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbi1leHBlY3RlZCBhZGRyZXNzOiAlcyAhPSAlcyIgJSAoYG1hYCwgYGFgKSkKICAgICAgICAgICAgIGlmIG1uID09IG4gYW5kIG1hID09IGE6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgZWxzZToKQEAgLTEyOSw2ICsxMzMsMTIgQEAKICAgICAgICAgICAgICdUbzogcGVyc29uQGRvbS5haW4gKFVzZXIgSi4gUGVyc29uKVxuXG4nLAogICAgICAgICAgICAgWygnVXNlciBKLiBQZXJzb24nLCAncGVyc29uQGRvbS5haW4nKV0pCiAKKyAgICBkZWYgdGVzdF9kb3VibGVjb21tZW50KHNlbGYpOgorICAgICAgICAjIFRoZSBSRkMgYWxsb3dzIGNvbW1lbnRzIHdpdGhpbiBjb21tZW50cyBpbiBhbiBlbWFpbCBhZGRyCisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnVG86IHBlcnNvbkBkb20uYWluICgoVXNlciBKLiBQZXJzb24pKSwgSm9obiBEb2UgPGZvb0BiYXIuY29tPlxuXG4nLAorICAgICAgICAgICAgWygnVXNlciBKLiBQZXJzb24nLCAncGVyc29uQGRvbS5haW4nKSwgKCdKb2huIERvZScsICdmb29AYmFyLmNvbScpXSkKKwogICAgIGRlZiB0ZXN0X3R3aXN0ZWQoc2VsZik6CiAgICAgICAgICMgVGhpcyBvbmUgaXMganVzdCB0d2lzdGVkLiAgSSBkb24ndCBrbm93IHdoYXQgdGhlIHByb3BlcgogICAgICAgICAjIHJlc3VsdCBzaG91bGQgYmUsIGJ1dCBpdCBzaG91bGRuJ3QgYmUgdG8gaW5mbG9vcCwgd2hpY2ggaXMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2V0dXB0b29scy5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0dXB0b29scy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ODMwMy4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldHVwdG9vbHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0iIiJUZXN0cyBmb3Igc2V0dXB0b29scy4KLQotVGhlIHRlc3RzIGZvciBzZXR1cHRvb2xzIGFyZSBkZWZpbmVkIGluIHRoZSBzZXR1cHRvb2xzLnRlc3RzIHBhY2thZ2U7Ci10aGlzIHJ1bnMgdGhlbSBmcm9tIHRoZXJlLgotIiIiCi0KLWltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAotZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQudGVzdCBpbXBvcnQgU2Nhbm5pbmdMb2FkZXIKLQotZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl9zdWl0ZSgKLSAgICAgICAgU2Nhbm5pbmdMb2FkZXIoKS5sb2FkVGVzdHNGcm9tTmFtZSgnc2V0dXB0b29scy50ZXN0cycpCi0gICAgKQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NodXRpbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CmluZGV4IDdjMjg2MDIuLjZhYjVhMzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2h1dGlsLnB5CkBAIC00OCwxMiArNDgsMTIgQEAKICAgICAgICAgaWYgc2VsZi5lcnJvclN0YXRlID09IDA6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMsIG9zLnJlbW92ZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJnLCBzZWxmLmNoaWxkcGF0aCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjWzBdLCBPU0Vycm9yKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoZXhjWzBdLCBPU0Vycm9yKSkKICAgICAgICAgICAgIHNlbGYuZXJyb3JTdGF0ZSA9IDEKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYywgb3Mucm1kaXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZywgVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNbMF0sIE9TRXJyb3IpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhleGNbMF0sIE9TRXJyb3IpKQogICAgICAgICAgICAgc2VsZi5lcnJvclN0YXRlID0gMgogCiAgICAgZGVmIHRlc3Rfcm10cmVlX2RvbnRfZGVsZXRlX2ZpbGUoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IDY5NDMwODAuLjIyNDZmYjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC05LDYgKzksNyBAQAogaW1wb3J0IHRocmVhZCwgdGhyZWFkaW5nCiBpbXBvcnQgUXVldWUKIGltcG9ydCBzeXMKK2ltcG9ydCBhcnJheQogZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQogCiBQT1JUID0gNTAwMDcKQEAgLTg1Miw4ICs4NTMsMzggQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzLmJpbmQsIGFkZHJlc3MpCiAKIAorY2xhc3MgQnVmZmVySU9UZXN0KFNvY2tldENvbm5lY3RlZFRlc3QpOgorICAgICIiIgorICAgIFRlc3QgdGhlIGJ1ZmZlciB2ZXJzaW9ucyBvZiBzb2NrZXQucmVjdigpIGFuZCBzb2NrZXQuc2VuZCgpLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIFNvY2tldENvbm5lY3RlZFRlc3QuX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT1tZXRob2ROYW1lKQorCisgICAgZGVmIHRlc3RSZWN2QnVmKHNlbGYpOgorICAgICAgICBidWYgPSBhcnJheS5hcnJheSgnYycsICcgJyoxMDI0KQorICAgICAgICBuYnl0ZXMgPSBzZWxmLmNsaV9jb25uLnJlY3ZfYnVmKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihNU0cpKQorICAgICAgICBtc2cgPSBidWYudG9zdHJpbmcoKVs6bGVuKE1TRyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWN2QnVmKHNlbGYpOgorICAgICAgICBidWYgPSBidWZmZXIoTVNHKQorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKGJ1ZikKKworICAgIGRlZiB0ZXN0UmVjdkZyb21CdWYoc2VsZik6CisgICAgICAgIGJ1ZiA9IGFycmF5LmFycmF5KCdjJywgJyAnKjEwMjQpCisgICAgICAgIG5ieXRlcywgYWRkciA9IHNlbGYuY2xpX2Nvbm4ucmVjdmZyb21fYnVmKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihNU0cpKQorICAgICAgICBtc2cgPSBidWYudG9zdHJpbmcoKVs6bGVuKE1TRyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWN2RnJvbUJ1ZihzZWxmKToKKyAgICAgICAgYnVmID0gYnVmZmVyKE1TRykKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChidWYpCisKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0cyA9IFtHZW5lcmFsTW9kdWxlVGVzdHMsIEJhc2ljVENQVGVzdCwgVENQVGltZW91dFRlc3QsIFRlc3RFeGNlcHRpb25zXQorICAgIHRlc3RzID0gW0dlbmVyYWxNb2R1bGVUZXN0cywgQmFzaWNUQ1BUZXN0LCBUQ1BUaW1lb3V0VGVzdCwgVGVzdEV4Y2VwdGlvbnMsCisgICAgICAgICAgICAgQnVmZmVySU9UZXN0XQogICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnbWFjJzoKICAgICAgICAgdGVzdHMuZXh0ZW5kKFsgQmFzaWNVRFBUZXN0LCBVRFBUaW1lb3V0VGVzdCBdKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5CmluZGV4IDFiMWQwZTUuLmYwMzM3NzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5CkBAIC02LDExICs2LDEyIEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgcmFpc2UgVGVzdFNraXBwZWQoJ25vIHNxbGl0ZSBhdmFpbGFibGUnKQogZnJvbSBzcWxpdGUzLnRlc3QgaW1wb3J0IChkYmFwaSwgdHlwZXMsIHVzZXJmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnksIHRyYW5zYWN0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSwgdHJhbnNhY3Rpb25zLCBob29rcywgcmVncmVzc2lvbikKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChkYmFwaS5zdWl0ZSgpLCB0eXBlcy5zdWl0ZSgpLCB1c2VyZnVuY3Rpb25zLnN1aXRlKCksCi0gICAgICAgICAgICAgICAgIGZhY3Rvcnkuc3VpdGUoKSwgdHJhbnNhY3Rpb25zLnN1aXRlKCkpCisgICAgICAgICAgICAgICAgIGZhY3Rvcnkuc3VpdGUoKSwgdHJhbnNhY3Rpb25zLnN1aXRlKCksIGhvb2tzLnN1aXRlKCksCisgICAgICAgICAgICAgICAgIHJlZ3Jlc3Npb24uc3VpdGUoKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5CmluZGV4IDQ0NTk2ODkuLjJiYWY0YTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkKQEAgLTIsNyArMiw2IEBACiAjIFNpbmNlIHdlIGRvbid0IGhhdmUgdGhlbSwgdGhpcyB0ZXN0IGNoZWNrcyBvbmx5IGEgZmV3IGNvZGVwb2ludHMuCiAKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmlmeSwgdmVyZXEKLWltcG9ydCBzaGEKIAogaW1wb3J0IHN0cmluZ3ByZXAKIGZyb20gc3RyaW5ncHJlcCBpbXBvcnQgKgpAQCAtNzMsNiArNzIsNyBAQAogIyB1bmljb2RlIGRhdGFiYXNlLiBJbnN0ZWFkLCBzdHJpbmdwcmVwLnB5IGFzc2VydHMgdGhlIHZlcnNpb24gb2YKICMgdGhlIGRhdGFiYXNlLgogCisjIGltcG9ydCBoYXNobGliCiAjIHByZWRpY2F0ZXMgPSBbayBmb3IgayBpbiBkaXIoc3RyaW5ncHJlcCkgaWYgay5zdGFydHN3aXRoKCJpbl90YWJsZSIpXQogIyBwcmVkaWNhdGVzLnNvcnQoKQogIyBmb3IgcCBpbiBwcmVkaWNhdGVzOgpAQCAtODMsNiArODMsNiBAQAogIyAgICAgICAgIGlmIGYodW5pY2hyKGkpKToKICMgICAgICAgICAgICAgZGF0YVtpXSA9ICIxIgogIyAgICAgZGF0YSA9ICIiLmpvaW4oZGF0YSkKLSMgICAgIGggPSBzaGEuc2hhKCkKKyMgICAgIGggPSBoYXNobGliLnNoYTEoKQogIyAgICAgaC51cGRhdGUoZGF0YSkKLSMgICAgIHByaW50IHAsaC5oZXhkaWdlc3QoKQorIyAgICAgcHJpbnQgcCwgaC5oZXhkaWdlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQppbmRleCA5MzMyNDY2Li43OTgxYTUyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQpAQCAtMSw1ICsxLDggQEAKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQsIHZlcmJvc2UsIHZlcmlmeQoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CiBpbXBvcnQgc3RydWN0CitpbXBvcnQgYXJyYXkKK2ltcG9ydCB1bml0dGVzdAogCiBpbXBvcnQgc3lzCiBJU0JJR0VORElBTiA9IHN5cy5ieXRlb3JkZXIgPT0gImJpZyIKQEAgLTcsNiArMTAsOCBAQAogdmVyaWZ5KChzdHJ1Y3QucGFjaygnPWknLCAxKVswXSA9PSBjaHIoMCkpID09IElTQklHRU5ESUFOLAogICAgICAgICJiaWdlbmRpYW4gZGV0ZXJtaW5hdGlvbiBhcHBlYXJzIHdyb25nIikKIAorUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HID0gMQorCiBkZWYgc3RyaW5nX3JldmVyc2Uocyk6CiAgICAgY2hhcnMgPSBsaXN0KHMpCiAgICAgY2hhcnMucmV2ZXJzZSgpCkBAIC0yNjMsNyArMjY4LDcgQEAKIAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyB4IGlzIG91dCBvZiByYW5nZSAtLSB2ZXJpZnkgcGFjayByZWFsaXplcyB0aGF0LgotICAgICAgICAgICAgaWYgY29kZSBpbiBzZWxmLkJVR0dZX1JBTkdFX0NIRUNLOgorICAgICAgICAgICAgaWYgbm90IFBZX1NUUlVDVF9SQU5HRV9DSEVDS0lORyBhbmQgY29kZSBpbiBzZWxmLkJVR0dZX1JBTkdFX0NIRUNLOgogICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgIHByaW50ICJTa2lwcGluZyBidWdneSByYW5nZSBjaGVjayBmb3IgY29kZSIsIGNvZGUKICAgICAgICAgICAgIGVsc2U6CkBAIC0zMTgsNyArMzIzLDcgQEAKIAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyB4IGlzIG91dCBvZiByYW5nZSAtLSB2ZXJpZnkgcGFjayByZWFsaXplcyB0aGF0LgotICAgICAgICAgICAgaWYgY29kZSBpbiBzZWxmLkJVR0dZX1JBTkdFX0NIRUNLOgorICAgICAgICAgICAgaWYgbm90IFBZX1NUUlVDVF9SQU5HRV9DSEVDS0lORyBhbmQgY29kZSBpbiBzZWxmLkJVR0dZX1JBTkdFX0NIRUNLOgogICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgIHByaW50ICJTa2lwcGluZyBidWdneSByYW5nZSBjaGVjayBmb3IgY29kZSIsIGNvZGUKICAgICAgICAgICAgIGVsc2U6CkBAIC00MzcsMyArNDQyLDk3IEBACiAgICAgICAgIFRlc3RGYWlsZWQoImV4cGVjdGVkIE92ZXJmbG93RXJyb3IiKQogCiB0ZXN0XzcwNTgzNigpCisKK2RlZiB0ZXN0XzEyMjkzODAoKToKKyAgICBpbXBvcnQgc3lzCisgICAgZm9yIGVuZGlhbiBpbiAoJycsICc+JywgJzwnKToKKyAgICAgICAgZm9yIGNscyBpbiAoaW50LCBsb25nKToKKyAgICAgICAgICAgIGZvciBmbXQgaW4gKCdCJywgJ0gnLCAnSScsICdMJyk6CisgICAgICAgICAgICAgICAgYW55X2VycihzdHJ1Y3QucGFjaywgZW5kaWFuICsgZm10LCBjbHMoLTEpKQorCisgICAgICAgICAgICBhbnlfZXJyKHN0cnVjdC5wYWNrLCBlbmRpYW4gKyAnQicsIGNscygzMDApKQorICAgICAgICAgICAgYW55X2VycihzdHJ1Y3QucGFjaywgZW5kaWFuICsgJ0gnLCBjbHMoNzAwMDApKQorCisgICAgICAgIGFueV9lcnIoc3RydWN0LnBhY2ssIGVuZGlhbiArICdJJywgc3lzLm1heGludCAqIDRMKQorICAgICAgICBhbnlfZXJyKHN0cnVjdC5wYWNrLCBlbmRpYW4gKyAnTCcsIHN5cy5tYXhpbnQgKiA0TCkKKworaWYgUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HOgorICAgIHRlc3RfMTIyOTM4MCgpCisKK2NsYXNzIFBhY2tCdWZmZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgcGFja2luZyBtZXRob2RzIHRoYXQgd29yayBvbiBidWZmZXJzLgorICAgICIiIgorCisgICAgZGVmIHRlc3RfdW5wYWNrX2Zyb20oIHNlbGYgKToKKyAgICAgICAgdGVzdF9zdHJpbmcgPSAnYWJjZDAxMjM0JworICAgICAgICBmbXQgPSAnNHMnCisgICAgICAgIHMgPSBzdHJ1Y3QuU3RydWN0KGZtdCkKKyAgICAgICAgZm9yIGNscyBpbiAoc3RyLCBidWZmZXIpOgorICAgICAgICAgICAgZGF0YSA9IGNscyh0ZXN0X3N0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMudW5wYWNrX2Zyb20oZGF0YSksICgnYWJjZCcsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMudW5wYWNrX2Zyb20oZGF0YSwgMiksICgnY2QwMScsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMudW5wYWNrX2Zyb20oZGF0YSwgNCksICgnMDEyMycsKSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSg2KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnVucGFja19mcm9tKGRhdGEsIGkpLCAoZGF0YVtpOmkrNF0sKSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSg2LCBsZW4odGVzdF9zdHJpbmcpICsgMSk6CisgICAgICAgICAgICAgICAgc2ltcGxlX2VycihzLnVucGFja19mcm9tLCBkYXRhLCBpKQorICAgICAgICBmb3IgY2xzIGluIChzdHIsIGJ1ZmZlcik6CisgICAgICAgICAgICBkYXRhID0gY2xzKHRlc3Rfc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3RydWN0LnVucGFja19mcm9tKGZtdCwgZGF0YSksICgnYWJjZCcsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0cnVjdC51bnBhY2tfZnJvbShmbXQsIGRhdGEsIDIpLCAoJ2NkMDEnLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzdHJ1Y3QudW5wYWNrX2Zyb20oZm10LCBkYXRhLCA0KSwgKCcwMTIzJywpKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDYpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0cnVjdC51bnBhY2tfZnJvbShmbXQsIGRhdGEsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2k6aSs0XSwpKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDYsIGxlbih0ZXN0X3N0cmluZykgKyAxKToKKyAgICAgICAgICAgICAgICBzaW1wbGVfZXJyKHN0cnVjdC51bnBhY2tfZnJvbSwgZm10LCBkYXRhLCBpKQorCisgICAgZGVmIHRlc3RfcGFja190byggc2VsZiApOgorICAgICAgICB0ZXN0X3N0cmluZyA9ICdSZXlramF2aWsgcm9ja3MsIGVvdyEnCisgICAgICAgIHdyaXRhYmxlX2J1ZiA9IGFycmF5LmFycmF5KCdjJywgJyAnKjEwMCkKKyAgICAgICAgZm10ID0gJzIxcycKKyAgICAgICAgcyA9IHN0cnVjdC5TdHJ1Y3QoZm10KQorCisgICAgICAgICMgVGVzdCB3aXRob3V0IG9mZnNldAorICAgICAgICBzLnBhY2tfdG8od3JpdGFibGVfYnVmLCAwLCB0ZXN0X3N0cmluZykKKyAgICAgICAgZnJvbV9idWYgPSB3cml0YWJsZV9idWYudG9zdHJpbmcoKVs6bGVuKHRlc3Rfc3RyaW5nKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZnJvbV9idWYsIHRlc3Rfc3RyaW5nKQorCisgICAgICAgICMgVGVzdCB3aXRoIG9mZnNldC4KKyAgICAgICAgcy5wYWNrX3RvKHdyaXRhYmxlX2J1ZiwgMTAsIHRlc3Rfc3RyaW5nKQorICAgICAgICBmcm9tX2J1ZiA9IHdyaXRhYmxlX2J1Zi50b3N0cmluZygpWzpsZW4odGVzdF9zdHJpbmcpKzEwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmcm9tX2J1ZiwgKHRlc3Rfc3RyaW5nWzoxMF0gKyB0ZXN0X3N0cmluZykpCisKKyAgICAgICAgIyBHbyBiZXlvbmQgYm91bmRhcmllcy4KKyAgICAgICAgc21hbGxfYnVmID0gYXJyYXkuYXJyYXkoJ2MnLCAnICcqMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgcy5wYWNrX3RvLCBzbWFsbF9idWYsIDAsIHRlc3Rfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHMucGFja190bywgc21hbGxfYnVmLCAyLCB0ZXN0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X3BhY2tfdG9fZm4oIHNlbGYgKToKKyAgICAgICAgdGVzdF9zdHJpbmcgPSAnUmV5a2phdmlrIHJvY2tzLCBlb3chJworICAgICAgICB3cml0YWJsZV9idWYgPSBhcnJheS5hcnJheSgnYycsICcgJyoxMDApCisgICAgICAgIGZtdCA9ICcyMXMnCisgICAgICAgIHBhY2tfdG8gPSBsYW1iZGEgKmFyZ3M6IHN0cnVjdC5wYWNrX3RvKGZtdCwgKmFyZ3MpCisKKyAgICAgICAgIyBUZXN0IHdpdGhvdXQgb2Zmc2V0CisgICAgICAgIHBhY2tfdG8od3JpdGFibGVfYnVmLCAwLCB0ZXN0X3N0cmluZykKKyAgICAgICAgZnJvbV9idWYgPSB3cml0YWJsZV9idWYudG9zdHJpbmcoKVs6bGVuKHRlc3Rfc3RyaW5nKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZnJvbV9idWYsIHRlc3Rfc3RyaW5nKQorCisgICAgICAgICMgVGVzdCB3aXRoIG9mZnNldC4KKyAgICAgICAgcGFja190byh3cml0YWJsZV9idWYsIDEwLCB0ZXN0X3N0cmluZykKKyAgICAgICAgZnJvbV9idWYgPSB3cml0YWJsZV9idWYudG9zdHJpbmcoKVs6bGVuKHRlc3Rfc3RyaW5nKSsxMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZnJvbV9idWYsICh0ZXN0X3N0cmluZ1s6MTBdICsgdGVzdF9zdHJpbmcpKQorCisgICAgICAgICMgR28gYmV5b25kIGJvdW5kYXJpZXMuCisgICAgICAgIHNtYWxsX2J1ZiA9IGFycmF5LmFycmF5KCdjJywgJyAnKjEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHBhY2tfdG8sIHNtYWxsX2J1ZiwgMCwgdGVzdF9zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgcGFja190bywgc21hbGxfYnVmLCAyLCB0ZXN0X3N0cmluZykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBhY2tCdWZmZXJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IGMzNTFlZTkuLmVkZjViZDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPTEpCiAgICAgICAgIHN0ZG91dCA9IHAuc3Rkb3V0LnJlYWQoKQotICAgICAgICBpZiBoYXNhdHRyKG9wZW4sICduZXdsaW5lcycpOgorICAgICAgICBpZiBoYXNhdHRyKGZpbGUsICduZXdsaW5lcycpOgogICAgICAgICAgICAgIyBJbnRlcnByZXRlciB3aXRoIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTFcbmxpbmUyXG5saW5lM1xubGluZTRcbmxpbmU1XG5saW5lNiIpCkBAIC0zNzQsNyArMzc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz0xKQogICAgICAgICAoc3Rkb3V0LCBzdGRlcnIpID0gcC5jb21tdW5pY2F0ZSgpCi0gICAgICAgIGlmIGhhc2F0dHIob3BlbiwgJ25ld2xpbmVzJyk6CisgICAgICAgIGlmIGhhc2F0dHIoZmlsZSwgJ25ld2xpbmVzJyk6CiAgICAgICAgICAgICAjIEludGVycHJldGVyIHdpdGggdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lMVxubGluZTJcbmxpbmUzXG5saW5lNFxubGluZTVcbmxpbmU2IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VuZHJ5LnB5IGIvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKaW5kZXggYWYxMzY4NC4uZjE5NDY3YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKQEAgLTUwLDExICs1MCw3IEBACiBpbXBvcnQgcHlfY29tcGlsZQogaW1wb3J0IHB5ZG9jCiBpbXBvcnQgcmV4ZWMKLXRyeToKLSAgICBpbXBvcnQgcmxjb21wbGV0ZXIgICAjIG5vdCBhdmFpbGFibGUgb24gV2luZG93cwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHByaW50ICJza2lwcGluZyBybGNvbXBsZXRlciIKK2ltcG9ydCBybGNvbXBsZXRlcgogaW1wb3J0IHNjaGVkCiBpbXBvcnQgc210cGxpYgogaW1wb3J0IHNuZGhkcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IGNjNzEzNjYuLjJkMDhmNGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTMwLDcgKzMwLDkgQEAKICAgICAiIiIKIAogdmVyYm9zZSA9IDEgICAgICAgICAgICAgICMgRmxhZyBzZXQgdG8gMCBieSByZWdydGVzdC5weQotdXNlX3Jlc291cmNlcyA9IE5vbmUgICAgICAgIyBGbGFnIHNldCB0byBbXSBieSByZWdydGVzdC5weQordXNlX3Jlc291cmNlcyA9IE5vbmUgICAgICMgRmxhZyBzZXQgdG8gW10gYnkgcmVncnRlc3QucHkKK21heF9tZW11c2UgPSAwICAgICAgICAgICAjIERpc2FibGUgYmlnbWVtIHRlc3RzICh0aGV5IHdpbGwgc3RpbGwgYmUgcnVuIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAjIHNtYWxsIHNpemVzLCB0byBtYWtlIHN1cmUgdGhleSB3b3JrLikKIAogIyBfb3JpZ2luYWxfc3Rkb3V0IGlzIG1lYW50IHRvIGhvbGQgc3Rkb3V0IGF0IHRoZSB0aW1lIHJlZ3J0ZXN0IGJlZ2FuLgogIyBUaGlzIG1heSBiZSAidGhlIHJlYWwiIHN0ZG91dCwgb3IgSURMRSdzIGVtdWxhdGlvbiBvZiBzdGRvdXQsIG9yIHdoYXRldmVyLgpAQCAtMjUwLDYgKzI1MiwxMDggQEAKICAgICByZXR1cm4gb3BlbihmbikKIAogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERlY29yYXRvciBmb3IgcnVubmluZyBhIGZ1bmN0aW9uIGluIGEgZGlmZmVyZW50IGxvY2FsZSwgY29ycmVjdGx5IHJlc2V0dGluZworIyBpdCBhZnRlcndhcmRzLgorCitkZWYgcnVuX3dpdGhfbG9jYWxlKGNhdHN0ciwgKmxvY2FsZXMpOgorICAgIGRlZiBkZWNvcmF0b3IoZnVuYyk6CisgICAgICAgIGRlZiBpbm5lcigqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSBnZXRhdHRyKGxvY2FsZSwgY2F0c3RyKQorICAgICAgICAgICAgICAgIG9yaWdfbG9jYWxlID0gbG9jYWxlLnNldGxvY2FsZShjYXRlZ29yeSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGlmIHRoZSB0ZXN0IGF1dGhvciBnaXZlcyB1cyBhbiBpbnZhbGlkIGNhdGVnb3J5IHN0cmluZworICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBjYW5ub3QgcmV0cmlldmUgb3JpZ2luYWwgbG9jYWxlLCBzbyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgbG9jYWxlID0gb3JpZ19sb2NhbGUgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBsb2MgaW4gbG9jYWxlczoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShjYXRlZ29yeSwgbG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAjIG5vdyBydW4gdGhlIGZ1bmN0aW9uLCByZXNldHRpbmcgdGhlIGxvY2FsZSBvbiBleGNlcHRpb25zCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dkcykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgbG9jYWxlIGFuZCBvcmlnX2xvY2FsZToKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShjYXRlZ29yeSwgb3JpZ19sb2NhbGUpCisgICAgICAgIGlubmVyLmZ1bmNfbmFtZSA9IGZ1bmMuZnVuY19uYW1lCisgICAgICAgIGlubmVyLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KKyAgICAgICAgcmV0dXJuIGlubmVyCisgICAgcmV0dXJuIGRlY29yYXRvcgorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQmlnLW1lbW9yeS10ZXN0IHN1cHBvcnQuIFNlcGFyYXRlIGZyb20gJ3Jlc291cmNlcycgYmVjYXVzZSBtZW1vcnkgdXNlIHNob3VsZCBiZSBjb25maWd1cmFibGUuCisKKyMgU29tZSBoYW5keSBzaG9ydGhhbmRzLiBOb3RlIHRoYXQgdGhlc2UgYXJlIHVzZWQgZm9yIGJ5dGUtbGltaXRzIGFzIHdlbGwKKyMgYXMgc2l6ZS1saW1pdHMsIGluIHRoZSB2YXJpb3VzIGJpZ21lbSB0ZXN0cworXzFNID0gMTAyNCoxMDI0CitfMUcgPSAxMDI0ICogXzFNCitfMkcgPSAyICogXzFHCisKK2RlZiBzZXRfbWVtbGltaXQobGltaXQpOgorICAgIGltcG9ydCByZQorICAgIGdsb2JhbCBtYXhfbWVtdXNlCisgICAgc2l6ZXMgPSB7CisgICAgICAgICdrJzogMTAyNCwKKyAgICAgICAgJ20nOiBfMU0sCisgICAgICAgICdnJzogXzFHLAorICAgICAgICAndCc6IDEwMjQqXzFHLAorICAgIH0KKyAgICBtID0gcmUubWF0Y2gocicoXGQrKFwuXGQrKT8pIChLfE18R3xUKWI/JCcsIGxpbWl0LAorICAgICAgICAgICAgICAgICByZS5JR05PUkVDQVNFIHwgcmUuVkVSQk9TRSkKKyAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgbWVtb3J5IGxpbWl0ICVyJyAlIChsaW1pdCwpKQorICAgIG1lbWxpbWl0ID0gaW50KGZsb2F0KG0uZ3JvdXAoMSkpICogc2l6ZXNbbS5ncm91cCgzKS5sb3dlcigpXSkKKyAgICBpZiBtZW1saW1pdCA8IDIuNSpfMUc6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01lbW9yeSBsaW1pdCAlciB0b28gbG93IHRvIGJlIHVzZWZ1bCcgJSAobGltaXQsKSkKKyAgICBtYXhfbWVtdXNlID0gbWVtbGltaXQKKworZGVmIGJpZ21lbXRlc3QobWluc2l6ZSwgbWVtdXNlLCBvdmVyaGVhZD01Kl8xTSk6CisgICAgIiIiRGVjb3JhdG9yIGZvciBiaWdtZW0gdGVzdHMuCisKKyAgICAnbWluc2l6ZScgaXMgdGhlIG1pbmltdW0gdXNlZnVsIHNpemUgZm9yIHRoZSB0ZXN0IChpbiBhcmJpdHJhcnksCisgICAgdGVzdC1pbnRlcnByZXRlZCB1bml0cy4pICdtZW11c2UnIGlzIHRoZSBudW1iZXIgb2YgJ2J5dGVzIHBlciBzaXplJyBmb3IKKyAgICB0aGUgdGVzdCwgb3IgYSBnb29kIGVzdGltYXRlIG9mIGl0LiAnb3ZlcmhlYWQnIHNwZWNpZmllcyBmaXhlZCBvdmVyaGVhZCwKKyAgICBpbmRlcGVuZGFudCBvZiB0aGUgdGVzdHNpemUsIGFuZCBkZWZhdWx0cyB0byA1TWIuCisKKyAgICBUaGUgZGVjb3JhdG9yIHRyaWVzIHRvIGd1ZXNzIGEgZ29vZCB2YWx1ZSBmb3IgJ3NpemUnIGFuZCBwYXNzZXMgaXQgdG8KKyAgICB0aGUgZGVjb3JhdGVkIHRlc3QgZnVuY3Rpb24uIElmIG1pbnNpemUgKiBtZW11c2UgaXMgbW9yZSB0aGFuIHRoZQorICAgIGFsbG93ZWQgbWVtb3J5IHVzZSAoYXMgZGVmaW5lZCBieSBtYXhfbWVtdXNlKSwgdGhlIHRlc3QgaXMgc2tpcHBlZC4KKyAgICBPdGhlcndpc2UsIG1pbnNpemUgaXMgYWRqdXN0ZWQgdXB3YXJkIHRvIHVzZSB1cCB0byBtYXhfbWVtdXNlLgorICAgICIiIgorICAgIGRlZiBkZWNvcmF0b3IoZik6CisgICAgICAgIGRlZiB3cmFwcGVyKHNlbGYpOgorICAgICAgICAgICAgaWYgbm90IG1heF9tZW11c2U6CisgICAgICAgICAgICAgICAgIyBJZiBtYXhfbWVtdXNlIGlzIDAgKHRoZSBkZWZhdWx0KSwKKyAgICAgICAgICAgICAgICAjIHdlIHN0aWxsIHdhbnQgdG8gcnVuIHRoZSB0ZXN0cyB3aXRoIHNpemUgc2V0IHRvIGEgZmV3IGtiLAorICAgICAgICAgICAgICAgICMgdG8gbWFrZSBzdXJlIHRoZXkgd29yay4gV2Ugc3RpbGwgd2FudCB0byBhdm9pZCB1c2luZworICAgICAgICAgICAgICAgICMgdG9vIG11Y2ggbWVtb3J5LCB0aG91Z2gsIGJ1dCB3ZSBkbyB0aGF0IG5vaXNpbHkuCisgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IDUxNDcKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihtYXhzaXplICogbWVtdXNlICsgb3ZlcmhlYWQgPiAyMCAqIF8xTSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IGludCgobWF4X21lbXVzZSAtIG92ZXJoZWFkKSAvIG1lbXVzZSkKKyAgICAgICAgICAgICAgICBpZiBtYXhzaXplIDwgbWluc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgIyBSZWFsbHkgb3VnaHQgdG8gcHJpbnQgJ3Rlc3Qgc2tpcHBlZCcgb3Igc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJTa2lwcGluZyAlcyBiZWNhdXNlIG9mIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdHJhaW50XG4iICUgKGYuX19uYW1lX18sKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgIyBUcnkgdG8ga2VlcCBzb21lIGJyZWF0aGluZyByb29tIGluIG1lbW9yeSB1c2UKKyAgICAgICAgICAgICAgICBtYXhzaXplID0gbWF4KG1heHNpemUgLSA1MCAqIF8xTSwgbWluc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBmKHNlbGYsIG1heHNpemUpCisgICAgICAgIHdyYXBwZXIubWluc2l6ZSA9IG1pbnNpemUKKyAgICAgICAgd3JhcHBlci5tZW11c2UgPSBtZW11c2UKKyAgICAgICAgd3JhcHBlci5vdmVyaGVhZCA9IG92ZXJoZWFkCisgICAgICAgIHJldHVybiB3cmFwcGVyCisgICAgcmV0dXJuIGRlY29yYXRvcgorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMgUHJlbGltaW5hcnkgUHlVTklUIGludGVncmF0aW9uLgogCiBpbXBvcnQgdW5pdHRlc3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKaW5kZXggYjYxZGViZi4uZGM3YTE2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTg2LDEzICs4NiwxNiBAQAogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBvcGVyYXRvciAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxMl0+LCBsaW5lIDEpCiAKKz4+PiBhIGlmIDEgZWxzZSBiID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBjb25kaXRpb25hbCBleHByZXNzaW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzEzXT4sIGxpbmUgMSkKIAogRnJvbSBjb21waWxlcl9jb21wbGV4X2FyZ3MoKToKIAogPj4+IGRlZiBmKE5vbmU9MSk6CiAuLi4gICAgIHBhc3MKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVN5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIE5vbmUgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTNdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6IGFzc2lnbm1lbnQgdG8gTm9uZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxNF0+LCBsaW5lIDEpCiAKIAogRnJvbSBhc3RfZm9yX2FyZ3VtZW50cygpOgpAQCAtMTAwLDIyICsxMDMsMjIgQEAKID4+PiBkZWYgZih4LCB5PTEsIHopOgogLi4uICAgICBwYXNzCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci1TeW50YXhFcnJvcjogbm9uLWRlZmF1bHQgYXJndW1lbnQgZm9sbG93cyBkZWZhdWx0IGFyZ3VtZW50ICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzE0XT4sIGxpbmUgMSkKK1N5bnRheEVycm9yOiBub24tZGVmYXVsdCBhcmd1bWVudCBmb2xsb3dzIGRlZmF1bHQgYXJndW1lbnQgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTVdPiwgbGluZSAxKQogCiA+Pj4gZGVmIGYoeCwgTm9uZSk6CiAuLi4gICAgIHBhc3MKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVN5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIE5vbmUgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTVdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6IGFzc2lnbm1lbnQgdG8gTm9uZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxNl0+LCBsaW5lIDEpCiAKID4+PiBkZWYgZigqTm9uZSk6CiAuLi4gICAgIHBhc3MKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVN5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIE5vbmUgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTZdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6IGFzc2lnbm1lbnQgdG8gTm9uZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxN10+LCBsaW5lIDEpCiAKID4+PiBkZWYgZigqKk5vbmUpOgogLi4uICAgICBwYXNzCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci1TeW50YXhFcnJvcjogYXNzaWdubWVudCB0byBOb25lICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzE3XT4sIGxpbmUgMSkKK1N5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIE5vbmUgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMThdPiwgbGluZSAxKQogCiAKIEZyb20gYXN0X2Zvcl9mdW5jZGVmKCk6CkBAIC0xMjMsNyArMTI2LDcgQEAKID4+PiBkZWYgTm9uZSh4KToKIC4uLiAgICAgcGFzcwogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGFzc2lnbm1lbnQgdG8gTm9uZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxOF0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjogYXNzaWdubWVudCB0byBOb25lICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzE5XT4sIGxpbmUgMSkKIAogCiBGcm9tIGFzdF9mb3JfY2FsbCgpOgpAQCAtMTM1LDcgKzEzOCw3IEBACiBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KID4+PiBmKHggZm9yIHggaW4gTCwgMSkKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVN5bnRheEVycm9yOiBHZW5lcmF0b3IgZXhwcmVzc2lvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQgaWYgbm90IHNvbGUgYXJndW1lbnQgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjJdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6IEdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZCBpZiBub3Qgc29sZSBhcmd1bWVudCAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyM10+LCBsaW5lIDEpCiA+Pj4gZigoeCBmb3IgeCBpbiBMKSwgMSkKIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQogCkBAIC0xNjcsNyArMTcwLDcgQEAKIC4uLiAgIGkyNDQsICBpMjQ1LCAgaTI0NiwgIGkyNDcsICBpMjQ4LCAgaTI0OSwgIGkyNTAsICBpMjUxLCAgaTI1MiwKIC4uLiAgIGkyNTMsICBpMjU0LCAgaTI1NSkKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVN5bnRheEVycm9yOiBtb3JlIHRoYW4gMjU1IGFyZ3VtZW50cyAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyNF0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjogbW9yZSB0aGFuIDI1NSBhcmd1bWVudHMgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjVdPiwgbGluZSAxKQogCiBUaGUgYWN0dWFsIGVycm9yIGNhc2VzIGNvdW50cyBwb3NpdGlvbmFsIGFyZ3VtZW50cywga2V5d29yZCBhcmd1bWVudHMsCiBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gYXJndW1lbnRzIHNlcGFyYXRlbHkuICBUaGlzIHRlc3QgY29tYmluZXMgdGhlCkBAIC0yMDEsMzcgKzIwNCwzNyBAQAogLi4uICAgKHggZm9yIHggaW4gaTI0NCksICBpMjQ1LCAgaTI0NiwgIGkyNDcsICBpMjQ4LCAgaTI0OSwgIGkyNTAsICBpMjUxLAogLi4uICAgIGkyNTI9MSwgaTI1Mz0xLCAgaTI1ND0xLCAgaTI1NT0xKQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IG1vcmUgdGhhbiAyNTUgYXJndW1lbnRzICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI1XT4sIGxpbmUgMSkKK1N5bnRheEVycm9yOiBtb3JlIHRoYW4gMjU1IGFyZ3VtZW50cyAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyNl0+LCBsaW5lIDEpCiAKID4+PiBmKGxhbWJkYSB4OiB4WzBdID0gMykKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVN5bnRheEVycm9yOiBsYW1iZGEgY2Fubm90IGNvbnRhaW4gYXNzaWdubWVudCAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyNl0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjogbGFtYmRhIGNhbm5vdCBjb250YWluIGFzc2lnbm1lbnQgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjddPiwgbGluZSAxKQogCiBUaGUgZ3JhbW1hciBhY2NlcHRzIGFueSB0ZXN0IChiYXNpY2FsbHksIGFueSBleHByZXNzaW9uKSBpbiB0aGUKIGtleXdvcmQgc2xvdCBvZiBhIGNhbGwgc2l0ZS4gIFRlc3QgYSBmZXcgZGlmZmVyZW50IG9wdGlvbnMuCiAKID4+PiBmKHgoKT0yKQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGtleXdvcmQgY2FuJ3QgYmUgYW4gZXhwcmVzc2lvbiAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyN10+LCBsaW5lIDEpCitTeW50YXhFcnJvcjoga2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI4XT4sIGxpbmUgMSkKID4+PiBmKGEgb3IgYj0xKQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGtleXdvcmQgY2FuJ3QgYmUgYW4gZXhwcmVzc2lvbiAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyOF0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjoga2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI5XT4sIGxpbmUgMSkKID4+PiBmKHgueT0xKQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGtleXdvcmQgY2FuJ3QgYmUgYW4gZXhwcmVzc2lvbiAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyOV0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjoga2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzMwXT4sIGxpbmUgMSkKIAogCiBGcm9tIGFzdF9mb3JfZXhwcl9zdG10KCk6CiAKID4+PiAoeCBmb3IgeCBpbiB4KSArPSAxCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci1TeW50YXhFcnJvcjogYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8gZ2VuZXJhdG9yIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzMwXT4sIGxpbmUgMSkKK1N5bnRheEVycm9yOiBhdWdtZW50ZWQgYXNzaWdubWVudCB0byBnZW5lcmF0b3IgZXhwcmVzc2lvbiBub3QgcG9zc2libGUgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzFdPiwgbGluZSAxKQogPj4+IE5vbmUgKz0gMQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGFzc2lnbm1lbnQgdG8gTm9uZSAoPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszMV0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjogYXNzaWdubWVudCB0byBOb25lICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzMyXT4sIGxpbmUgMSkKID4+PiBmKCkgKz0gMQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGlsbGVnYWwgZXhwcmVzc2lvbiBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnQgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzJdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6IGlsbGVnYWwgZXhwcmVzc2lvbiBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnQgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzNdPiwgbGluZSAxKQogIiIiCiAKIGltcG9ydCByZQpAQCAtMjQzLDE1ICsyNDYsMTggQEAKIGNsYXNzIFN5bnRheFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBfY2hlY2tfZXJyb3Ioc2VsZiwgY29kZSwgZXJydGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSI8dGVzdGNhc2U+IiwgbW9kZT0iZXhlYyIpOgorICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9Ijx0ZXN0Y2FzZT4iLCBtb2RlPSJleGVjIiwgc3ViY2xhc3M9Tm9uZSk6CiAgICAgICAgICIiIkNoZWNrIHRoYXQgY29tcGlsaW5nIGNvZGUgcmFpc2VzIFN5bnRheEVycm9yIHdpdGggZXJydGV4dC4KIAogICAgICAgICBlcnJ0ZXN0IGlzIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHRoZQotICAgICAgICB0ZXN0IG9mIHRoZSBleGNlcHRpb24gcmFpc2VkLgorICAgICAgICB0ZXN0IG9mIHRoZSBleGNlcHRpb24gcmFpc2VkLiAgSWYgc3ViY2xhc3MgaXMgc3BlY2lmaWVkIGl0CisgICAgICAgIGlzIHRoZSBleHBlY3RlZCBzdWJjbGFzcyBvZiBTeW50YXhFcnJvciAoZS5nLiBJbmRlbnRhdGlvbkVycm9yKS4KICAgICAgICAgIiIiCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGNvbXBpbGUoY29kZSwgZmlsZW5hbWUsIG1vZGUpCiAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgZXJyOgorICAgICAgICAgICAgaWYgc3ViY2xhc3MgYW5kIG5vdCBpc2luc3RhbmNlKGVyciwgc3ViY2xhc3MpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU3ludGF4RXJyb3IgaXMgbm90IGEgJXMiICUgc3ViY2xhc3MuX19uYW1lX18pCiAgICAgICAgICAgICBtbyA9IHJlLnNlYXJjaChlcnJ0ZXh0LCBzdHIoZXJyKSkKICAgICAgICAgICAgIGlmIG1vIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTeW50YXhFcnJvciBkaWQgbm90IGNvbnRhaW4gJyVyJyIgJSAoZXJydGV4dCwpKQpAQCAtMjkwLDYgKzI5NiwyMiBAQAogICAgICAgICAgICAgOiIiIikKICAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3Ioc291cmNlLCAibmVzdGVkIHNjb3BlIikKIAorICAgIGRlZiB0ZXN0X3VuZXhwZWN0ZWRfaW5kZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19lcnJvcigiZm9vKClcbiBiYXIoKVxuIiwgInVuZXhwZWN0ZWQgaW5kZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3M9SW5kZW50YXRpb25FcnJvcikKKworICAgIGRlZiB0ZXN0X25vX2luZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3IoImlmIDE6XG5mb28oKSIsICJleHBlY3RlZCBhbiBpbmRlbnRlZCBibG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzPUluZGVudGF0aW9uRXJyb3IpCisKKyAgICBkZWYgdGVzdF9iYWRfb3V0ZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3IoImlmIDE6XG4gIGZvbygpXG4gYmFyKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggLiogbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjbGFzcz1JbmRlbnRhdGlvbkVycm9yKQorCisgICAgZGVmIHRlc3Rfa3dhcmdzX2xhc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKCJpbnQoYmFzZT0xMCwgJzInKSIsICJub24ta2V5d29yZCBhcmciKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTeW50YXhUZXN0Q2FzZSkKICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3ludGF4CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKaW5kZXggOTgzNDljNC4uOGVlMGY0MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQpAQCAtMiw2ICsyLDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHNodXRpbAogaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgU3RyaW5nSU8KIAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGFyZmlsZQpAQCAtMjUsNyArMjYsNyBAQAogdGVzdHRhciA9IHBhdGgoInRlc3R0YXIudGFyIikKIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAidGVzdHRhciIgKyBvcy5leHRzZXAgKyAiZGlyIikKIHRlbXBuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgotbWVtYmVyY291bnQgPSAxMAorbWVtYmVyY291bnQgPSAxMgogCiBkZWYgdGFybmFtZShjb21wPSIiKToKICAgICBpZiBub3QgY29tcDoKQEAgLTg2LDcgKzg3LDkgQEAKICAgICAgICAgaWYgc2VsZi5zZXAgIT0gInwiOgogICAgICAgICAgICAgZmlsZW5hbWUgPSAiMC1SRUdUWVBFLVRFWFQiCiAgICAgICAgICAgICBzZWxmLnRhci5leHRyYWN0KGZpbGVuYW1lLCBkaXJuYW1lKCkpCi0gICAgICAgICAgICBsaW5lczEgPSBmaWxlKG9zLnBhdGguam9pbihkaXJuYW1lKCksIGZpbGVuYW1lKSwgInJVIikucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihkaXJuYW1lKCksIGZpbGVuYW1lKSwgInJVIikKKyAgICAgICAgICAgIGxpbmVzMSA9IGYucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgbGluZXMyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUoZmlsZW5hbWUpLnJlYWRsaW5lcygpCiAgICAgICAgICAgICBzZWxmLmFzc2VydF8obGluZXMxID09IGxpbmVzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiX0ZpbGVPYmplY3QucmVhZGxpbmUoKSBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSIpCkBAIC05Niw3ICs5OSw5IEBACiAgICAgICAgIGlmIHNlbGYuc2VwICE9ICJ8IjoKICAgICAgICAgICAgIGZpbGVuYW1lID0gIjAtUkVHVFlQRS1URVhUIgogICAgICAgICAgICAgc2VsZi50YXIuZXh0cmFjdChmaWxlbmFtZSwgZGlybmFtZSgpKQotICAgICAgICAgICAgbGluZXMxID0gZmlsZShvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCBmaWxlbmFtZSksICJyVSIpLnJlYWRsaW5lcygpCisgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCBmaWxlbmFtZSksICJyVSIpCisgICAgICAgICAgICBsaW5lczEgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIHNlbGYudGFyLmV4dHJhY3RmaWxlKGZpbGVuYW1lKV0KICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsaW5lczEgPT0gbGluZXMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICJFeEZpbGVPYmplY3QgaXRlcmF0aW9uIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IikKQEAgLTEwNyw3ICsxMTIsOSBAQAogICAgICAgICBpZiBzZWxmLnNlcCAhPSAifCI6CiAgICAgICAgICAgICBmaWxlbmFtZSA9ICIwLVJFR1RZUEUiCiAgICAgICAgICAgICBzZWxmLnRhci5leHRyYWN0KGZpbGVuYW1lLCBkaXJuYW1lKCkpCi0gICAgICAgICAgICBkYXRhID0gZmlsZShvcy5wYXRoLmpvaW4oZGlybmFtZSgpLCBmaWxlbmFtZSksICJyYiIpLnJlYWQoKQorICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUoKSwgZmlsZW5hbWUpLCAicmIiKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKIAogICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihmaWxlbmFtZSkKICAgICAgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQpAQCAtMTU1LDcgKzE2Miw3IEBACiAgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImRpcmVjdG9yeS8iKQogICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLlJFR1RZUEUKIAotICAgICAgICBmb2JqID0gZmlsZShmaWxlbmFtZSwgInciKQorICAgICAgICBmb2JqID0gb3BlbihmaWxlbmFtZSwgInciKQogICAgICAgICBmb2JqLndyaXRlKHRhcmluZm8udG9idWYoKSkKICAgICAgICAgZm9iai5jbG9zZSgpCiAKQEAgLTIwOSw4ICsyMTYsMjEgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odjEucmVhZCgpID09IHYyLnJlYWQoKSwgInN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCIpCiAKKyAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICAgc3RyZWFtLmNsb3NlKCkKIAorY2xhc3MgUmVhZERldGVjdFRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lKHNlbGYuY29tcCksIHNlbGYubW9kZSkKKworY2xhc3MgUmVhZERldGVjdEZpbGVvYmpUZXN0KFJlYWRUZXN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgbmFtZSA9IHRhcm5hbWUoc2VsZi5jb21wKQorICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3BlbihuYW1lLCBtb2RlPXNlbGYubW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9iaj1vcGVuKG5hbWUsICJyYiIpKQorCiBjbGFzcyBSZWFkQXN0ZXJpc2tUZXN0KFJlYWRUZXN0KToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTI1NCw3ICsyNzQsNyBAQAogICAgICAgICAgICAgaWYgbm90IHRhcmluZm8uaXNyZWcoKToKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgZiA9IHNlbGYuc3JjLmV4dHJhY3RmaWxlKHRhcmluZm8pCi0gICAgICAgICAgICBpZiBzZWxmLmRzdC5wb3NpeCBhbmQgbGVuKHRhcmluZm8ubmFtZSkgPiB0YXJmaWxlLkxFTkdUSF9OQU1FOgorICAgICAgICAgICAgaWYgc2VsZi5kc3QucG9zaXggYW5kIGxlbih0YXJpbmZvLm5hbWUpID4gdGFyZmlsZS5MRU5HVEhfTkFNRSBhbmQgIi8iIG5vdCBpbiB0YXJpbmZvLm5hbWU6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kc3QuYWRkZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8sIGYpCiAgICAgICAgICAgICBlbHNlOgpAQCAtMjczLDE1ICsyOTMsMjIgQEAKIAogICAgIGRlZiB0ZXN0X2ZpbGUoc2VsZik6CiAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBkaXIsICJmaWxlIikKLSAgICAgICAgZmlsZShwYXRoLCAidyIpCisgICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKKyAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHRhcmluZm8gPSBzZWxmLmRzdC5nZXR0YXJpbmZvKHBhdGgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQotICAgICAgICBmaWxlKHBhdGgsICJ3Iikud3JpdGUoImFhYSIpCisgICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKKyAgICAgICAgZi53cml0ZSgiYWFhIikKKyAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHRhcmluZm8gPSBzZWxmLmRzdC5nZXR0YXJpbmZvKHBhdGgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAzKQogCiAgICAgZGVmIHRlc3RfZGlyZWN0b3J5KHNlbGYpOgogICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudG1wZGlyLCAiZGlyZWN0b3J5IikKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAjIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IGlzIDx3aW5rPiBpZiBhIHByZXZpb3VzCisgICAgICAgICAgICAjIHJ1biB3YXMga2lsbGVkIGluIG1pZC1zdHJlYW0uCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHBhdGgpCiAgICAgICAgIG9zLm1rZGlyKHBhdGgpCiAgICAgICAgIHRhcmluZm8gPSBzZWxmLmRzdC5nZXR0YXJpbmZvKHBhdGgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQpAQCAtMzg1LDYgKzQxMiw1MiBAQAogICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZV8iLAogICAgICAgICAgICAgICAgICAgICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGlua18iKQogCitjbGFzcyBSZWFkR05VTG9uZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lKCkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0XzE0NzE0Mjcoc2VsZik6CisgICAgICAgICIiIlRlc3QgcmVhZGluZyBvZiBsb25nbmFtZSAoYnVnICMxNDcxNDI3KS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAidGVzdC8iICogMjAgKyAiMC1SRUdUWVBFIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKG5hbWUpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHRhcmluZm8gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvIGlzIG5vdCBOb25lLCAibG9uZ25hbWUgbm90IGZvdW5kIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSAhPSB0YXJmaWxlLkRJUlRZUEUsICJyZWFkIGxvbmduYW1lIGFzIGRpcnR5cGUiKQorCisgICAgZGVmIHRlc3RfcmVhZF9uYW1lKHNlbGYpOgorICAgICAgICBuYW1lID0gKCIwLUxPTkdOQU1FLSIgKiAxMClbOjEwMV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihuYW1lKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICB0YXJpbmZvID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mbyBpcyBub3QgTm9uZSwgImxvbmduYW1lIG5vdCBmb3VuZCIpCisKKyAgICBkZWYgdGVzdF9yZWFkX2xpbmsoc2VsZik6CisgICAgICAgIGxpbmsgPSAoIjEtTE9OR0xJTkstIiAqIDEwKVs6MTAxXQorICAgICAgICBuYW1lID0gKCIwLUxPTkdOQU1FLSIgKiAxMClbOjEwMV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsaW5rKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICB0YXJpbmZvID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mbyBpcyBub3QgTm9uZSwgImxvbmdsaW5rIG5vdCBmb3VuZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLmxpbmtuYW1lID09IG5hbWUsICJsaW5rbmFtZSB3cm9uZyIpCisKKyAgICBkZWYgdGVzdF90cnVuY2F0ZWRfbG9uZ25hbWUoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRhcm5hbWUoKSkKKyAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKGYucmVhZCgxMDI0KSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihuYW1lPSJmb28udGFyIiwgZmlsZW9iaj1mb2JqKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKHRhci5nZXRtZW1iZXJzKCkpID09IDAsICIiKQorICAgICAgICB0YXIuY2xvc2UoKQorCisKIGNsYXNzIEV4dHJhY3RIYXJkbGlua1Rlc3QoQmFzZVRlc3QpOgogCiAgICAgZGVmIHRlc3RfaGFyZGxpbmsoc2VsZik6CkBAIC00MjAsNyArNDkzLDkgQEAKICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5iYXIpOgogICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuYmFyKQogCi0gICAgICAgIGZpbGUoc2VsZi5mb28sICJ3Iikud3JpdGUoImZvbyIpCisgICAgICAgIGYgPSBvcGVuKHNlbGYuZm9vLCAidyIpCisgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBzZWxmLnRhci5hZGQoc2VsZi5mb28pCiAKICAgICBkZWYgdGVzdF9hZGRfdHdpY2Uoc2VsZik6CkBAIC00NTksNiArNTM0LDEwIEBACiAgICAgY29tcCA9ICJneiIKIGNsYXNzIFdyaXRlU3RyZWFtVGVzdEd6aXAoV3JpdGVTdHJlYW1UZXN0KToKICAgICBjb21wID0gImd6IgorY2xhc3MgUmVhZERldGVjdFRlc3RHemlwKFJlYWREZXRlY3RUZXN0KToKKyAgICBjb21wID0gImd6IgorY2xhc3MgUmVhZERldGVjdEZpbGVvYmpUZXN0R3ppcChSZWFkRGV0ZWN0RmlsZW9ialRlc3QpOgorICAgIGNvbXAgPSAiZ3oiCiBjbGFzcyBSZWFkQXN0ZXJpc2tUZXN0R3ppcChSZWFkQXN0ZXJpc2tUZXN0KToKICAgICBjb21wID0gImd6IgogY2xhc3MgUmVhZFN0cmVhbUFzdGVyaXNrVGVzdEd6aXAoUmVhZFN0cmVhbUFzdGVyaXNrVGVzdCk6CkBAIC00ODIsNiArNTYxLDEwIEBACiAgICAgICAgIGNvbXAgPSAiYnoyIgogICAgIGNsYXNzIFdyaXRlU3RyZWFtVGVzdEJ6aXAyKFdyaXRlU3RyZWFtVGVzdEd6aXApOgogICAgICAgICBjb21wID0gImJ6MiIKKyAgICBjbGFzcyBSZWFkRGV0ZWN0VGVzdEJ6aXAyKFJlYWREZXRlY3RUZXN0KToKKyAgICAgICAgY29tcCA9ICJiejIiCisgICAgY2xhc3MgUmVhZERldGVjdEZpbGVvYmpUZXN0QnppcDIoUmVhZERldGVjdEZpbGVvYmpUZXN0KToKKyAgICAgICAgY29tcCA9ICJiejIiCiAgICAgY2xhc3MgUmVhZEFzdGVyaXNrVGVzdEJ6aXAyKFJlYWRBc3Rlcmlza1Rlc3QpOgogICAgICAgICBjb21wID0gImJ6MiIKICAgICBjbGFzcyBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0QnppcDIoUmVhZFN0cmVhbUFzdGVyaXNrVGVzdCk6CkBAIC00OTUsMjMgKzU3OCwzNCBAQAogICAgIGRlbCBXcml0ZVN0cmVhbVRlc3RHemlwCiAKIGRlZiB0ZXN0X21haW4oKToKKyAgICAjIENyZWF0ZSBhcmNoaXZlLgorICAgIGYgPSBvcGVuKHRhcm5hbWUoKSwgInJiIikKKyAgICBmZ3V0cyA9IGYucmVhZCgpCisgICAgZi5jbG9zZSgpCiAgICAgaWYgZ3ppcDoKICAgICAgICAgIyBjcmVhdGUgdGVzdHRhci50YXIuZ3oKLSAgICAgICAgZ3ppcC5vcGVuKHRhcm5hbWUoImd6IiksICJ3YiIpLndyaXRlKGZpbGUodGFybmFtZSgpLCAicmIiKS5yZWFkKCkpCisgICAgICAgIHRhciA9IGd6aXAub3Blbih0YXJuYW1lKCJneiIpLCAid2IiKQorICAgICAgICB0YXIud3JpdGUoZmd1dHMpCisgICAgICAgIHRhci5jbG9zZSgpCiAgICAgaWYgYnoyOgogICAgICAgICAjIGNyZWF0ZSB0ZXN0dGFyLnRhci5iejIKLSAgICAgICAgYnoyLkJaMkZpbGUodGFybmFtZSgiYnoyIiksICJ3YiIpLndyaXRlKGZpbGUodGFybmFtZSgpLCAicmIiKS5yZWFkKCkpCisgICAgICAgIHRhciA9IGJ6Mi5CWjJGaWxlKHRhcm5hbWUoImJ6MiIpLCAid2IiKQorICAgICAgICB0YXIud3JpdGUoZmd1dHMpCisgICAgICAgIHRhci5jbG9zZSgpCiAKICAgICB0ZXN0cyA9IFsKICAgICAgICAgRmlsZU1vZGVUZXN0LAogICAgICAgICBSZWFkVGVzdCwKICAgICAgICAgUmVhZFN0cmVhbVRlc3QsCisgICAgICAgIFJlYWREZXRlY3RUZXN0LAorICAgICAgICBSZWFkRGV0ZWN0RmlsZW9ialRlc3QsCiAgICAgICAgIFJlYWRBc3Rlcmlza1Rlc3QsCiAgICAgICAgIFJlYWRTdHJlYW1Bc3Rlcmlza1Rlc3QsCiAgICAgICAgIFdyaXRlVGVzdCwKICAgICAgICAgV3JpdGVTaXplMFRlc3QsCiAgICAgICAgIFdyaXRlU3RyZWFtVGVzdCwKICAgICAgICAgV3JpdGVHTlVMb25nVGVzdCwKKyAgICAgICAgUmVhZEdOVUxvbmdUZXN0LAogICAgIF0KIAogICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6CkBAIC01MjIsNiArNjE2LDcgQEAKICAgICAgICAgdGVzdHMuZXh0ZW5kKFsKICAgICAgICAgICAgIFJlYWRUZXN0R3ppcCwgUmVhZFN0cmVhbVRlc3RHemlwLAogICAgICAgICAgICAgV3JpdGVUZXN0R3ppcCwgV3JpdGVTdHJlYW1UZXN0R3ppcCwKKyAgICAgICAgICAgIFJlYWREZXRlY3RUZXN0R3ppcCwgUmVhZERldGVjdEZpbGVvYmpUZXN0R3ppcCwKICAgICAgICAgICAgIFJlYWRBc3Rlcmlza1Rlc3RHemlwLCBSZWFkU3RyZWFtQXN0ZXJpc2tUZXN0R3ppcAogICAgICAgICBdKQogCkBAIC01MjksNiArNjI0LDcgQEAKICAgICAgICAgdGVzdHMuZXh0ZW5kKFsKICAgICAgICAgICAgIFJlYWRUZXN0QnppcDIsIFJlYWRTdHJlYW1UZXN0QnppcDIsCiAgICAgICAgICAgICBXcml0ZVRlc3RCemlwMiwgV3JpdGVTdHJlYW1UZXN0QnppcDIsCisgICAgICAgICAgICBSZWFkRGV0ZWN0VGVzdEJ6aXAyLCBSZWFkRGV0ZWN0RmlsZW9ialRlc3RCemlwMiwKICAgICAgICAgICAgIFJlYWRBc3Rlcmlza1Rlc3RCemlwMiwgUmVhZFN0cmVhbUFzdGVyaXNrVGVzdEJ6aXAyCiAgICAgICAgIF0pCiAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90Y2wucHkgYi9MaWIvdGVzdC90ZXN0X3RjbC5weQppbmRleCAyZWVhYmMxLi5lM2ZiZjk4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RjbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RjbC5weQpAQCAtMTI0LDYgKzEyNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLHRjbC53aW5mb19nZW9tZXRyeSkKICAgICAgICAgdGNsLmxvYWR0aygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzF4MSswKzAnLCB0Y2wud2luZm9fZ2VvbWV0cnkoKSkKKyAgICAgICAgdGNsLmRlc3Ryb3koKQogCiAgICAgZGVmIHRlc3RMb2FkVGtGYWlsdXJlKHNlbGYpOgogICAgICAgICBpbXBvcnQgb3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkZWRfaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKaW5kZXggZGMyN2Q0ZS4uMDY0MmQyNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKQEAgLTYsNyArNiw3IEBACiAjIHJhbmRyYW5nZSwgYW5kIHRoZW4gUHl0aG9uIGhhbmdzLgogCiBpbXBvcnQgdGhyZWFkCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBUZXN0U2tpcHBlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVGVzdFNraXBwZWQsIFRlc3RGYWlsZWQKIAogY3JpdGljYWxfc2VjdGlvbiA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKIGRvbmUgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCkBAIC0yNSw2ICsyNSwyMyBAQAogICAgIGlmIGZpbmlzaGVkOgogICAgICAgICBkb25lLnJlbGVhc2UoKQogCitkZWYgdGVzdF9pbXBvcnRfaGFuZ2VycygpOgorICAgIGltcG9ydCBzeXMKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAidGVzdGluZyBpbXBvcnQgaGFuZ2VycyAuLi4iLAorCisgICAgZnJvbSB0ZXN0IGltcG9ydCB0aHJlYWRlZF9pbXBvcnRfaGFuZ2VycworCisgICAgdHJ5OgorICAgICAgICBpZiB0aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5lcnJvcnM6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKHRocmVhZGVkX2ltcG9ydF9oYW5nZXJzLmVycm9ycykKKyAgICAgICAgZWxpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIk9LLiIKKyAgICBmaW5hbGx5OgorICAgICAgICAjIEluIGNhc2UgdGhpcyB0ZXN0IGlzIHJ1biBhZ2FpbiwgbWFrZSBzdXJlIHRoZSBoZWxwZXIgbW9kdWxlCisgICAgICAgICMgZ2V0cyBsb2FkZWQgZnJvbSBzY3JhdGNoIGFnYWluLgorICAgICAgICBkZWwgc3lzLm1vZHVsZXNbJ3Rlc3QudGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMnXQorCiAjIFRyaWNreTogIFdoZW4gcmVncnRlc3QgaW1wb3J0cyB0aGlzIG1vZHVsZSwgdGhlIHRocmVhZCBydW5uaW5nIHJlZ3J0ZXN0CiAjIGdyYWJzIHRoZSBpbXBvcnQgbG9jayBhbmQgd29uJ3QgbGV0IGdvIG9mIGl0IHVudGlsIHRoaXMgbW9kdWxlIHJldHVybnMuCiAjIEFsbCBvdGhlciB0aHJlYWRzIGF0dGVtcHRpbmcgYW4gaW1wb3J0IGhhbmcgZm9yIHRoZSBkdXJhdGlvbi4gIFNpbmNlCkBAIC01Myw1ICs3MCw3IEBACiAgICAgICAgICAgICBwcmludCAiT0suIgogICAgIGRvbmUucmVsZWFzZSgpCiAKKyAgICB0ZXN0X2ltcG9ydF9oYW5nZXJzKCkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQppbmRleCAyMmMwNDU2Li4xYjU5Zjk4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtMTAzLDYgKzEwMywxMiBAQAogICAgICAgICAgICAgaW1wb3J0IHN5cwogICAgICAgICAgICAgc3lzLmV4Y190cmFjZWJhY2suX19tZW1iZXJzX18KIAorICAgIGRlZiB0ZXN0X2Jhc2VfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBleGNlcHRpb25zIGRlcml2ZWQgZnJvbSBCYXNlRXhjZXB0aW9uIGFyZSBmb3JtYXR0ZWQgcmlnaHQKKyAgICAgICAgZSA9IEtleWJvYXJkSW50ZXJydXB0KCkKKyAgICAgICAgbHN0ID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShlLl9fY2xhc3NfXywgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFsnS2V5Ym9hcmRJbnRlcnJ1cHRcbiddKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KFRyYWNlYmFja0Nhc2VzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKaW5kZXggYzcxMTNiNS4uMzRmOTM3MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtNDExLDE5ICs0MTEsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdSdcdTEyMzQnCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVzJyAlIFdyYXBwZXIoKSwgdSdcdTEyMzQnKQogCisgICAgQHRlc3Rfc3VwcG9ydC5ydW5fd2l0aF9sb2NhbGUoJ0xDX0FMTCcsICdkZV9ERScsICdmcl9GUicpCiAgICAgZGVmIHRlc3RfZm9ybWF0X2Zsb2F0KHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgbG9jYWxlCi0gICAgICAgICAgICBvcmlnX2xvY2FsZSA9IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCkKLSAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCwgJ2RlX0RFJykKLSAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgbG9jYWxlLkVycm9yKToKLSAgICAgICAgICAgIHJldHVybiAjIHNraXAgaWYgd2UgY2FuJ3Qgc2V0IGxvY2FsZQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgICMgc2hvdWxkIG5vdCBmb3JtYXQgd2l0aCBhIGNvbW1hLCBidXQgYWx3YXlzIHdpdGggQyBsb2NhbGUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScxLjAnLCB1JyUuMWYnICUgMS4wKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCBvcmlnX2xvY2FsZSkKKyAgICAgICAgIyBzaG91bGQgbm90IGZvcm1hdCB3aXRoIGEgY29tbWEsIGJ1dCBhbHdheXMgd2l0aCBDIGxvY2FsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnMS4wJywgdSclLjFmJyAlIDEuMCkKIAogICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgogICAgICAgICAjIHVuaWNvZGUob2JqKSB0ZXN0cyAodGhpcyBtYXBzIHRvIFB5T2JqZWN0X1VuaWNvZGUoKSBhdCBDIGxldmVsKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHkKaW5kZXggZjg0Y2FhZC4uMDAyM2JmNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5CkBAIC02LDcgKzYsNyBAQAogCiAiIiIjIgogaW1wb3J0IHVuaXR0ZXN0LCB0ZXN0LnRlc3Rfc3VwcG9ydAotaW1wb3J0IHNoYQoraW1wb3J0IGhhc2hsaWIKIAogZW5jb2RpbmcgPSAndXRmLTgnCiAKQEAgLTE2LDEwICsxNiwxMCBAQAogY2xhc3MgVW5pY29kZU1ldGhvZHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgICMgdXBkYXRlIHRoaXMsIGlmIHRoZSBkYXRhYmFzZSBjaGFuZ2VzCi0gICAgZXhwZWN0ZWRjaGVja3N1bSA9ICdhNjU1NWNkMjA5ZDk2MGRjZmExN2JmZGNlMGM5NmQ5MWNmYTlhOWJhJworICAgIGV4cGVjdGVkY2hlY2tzdW0gPSAnYzE5OGVkMjY0NDk3ZjEwODQzNGIzZjU3NmQ0MTA3MjM3MjIxY2M4YScKIAogICAgIGRlZiB0ZXN0X21ldGhvZF9jaGVja3N1bShzZWxmKToKLSAgICAgICAgaCA9IHNoYS5zaGEoKQorICAgICAgICBoID0gaGFzaGxpYi5zaGExKCkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNjU1MzYpOgogICAgICAgICAgICAgY2hhciA9IHVuaWNocihpKQogICAgICAgICAgICAgZGF0YSA9IFsKQEAgLTc1LDExICs3NSwxMSBAQAogY2xhc3MgVW5pY29kZUZ1bmN0aW9uc1Rlc3QoVW5pY29kZURhdGFiYXNlVGVzdCk6CiAKICAgICAjIHVwZGF0ZSB0aGlzLCBpZiB0aGUgZGF0YWJhc2UgY2hhbmdlcwotICAgIGV4cGVjdGVkY2hlY2tzdW0gPSAnYjQ1Yjc5ZjMyMDNlZTFhODk2ZDliNTY1NTQ4NGFkYWZmNWQ0OTY0YicKKyAgICBleHBlY3RlZGNoZWNrc3VtID0gJzRlMzg5Zjk3ZTlmODhiOGI3YWI3NDMxMjFmZDY0MzA4OTExNmY5ZjInCiAKICAgICBkZWYgdGVzdF9mdW5jdGlvbl9jaGVja3N1bShzZWxmKToKICAgICAgICAgZGF0YSA9IFtdCi0gICAgICAgIGggPSBzaGEuc2hhKCkKKyAgICAgICAgaCA9IGhhc2hsaWIuc2hhMSgpCiAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMHgxMDAwMCk6CiAgICAgICAgICAgICBjaGFyID0gdW5pY2hyKGkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKaW5kZXggNjRhMmVlOS4uYzhmMTliYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQpAQCAtMTAsMTAgKzEwLDcgQEAKICMgWFhYCiAjIFJlcXVlc3QKICMgQ2FjaGVGVFBIYW5kbGVyIChoYXJkIHRvIHdyaXRlKQotIyBwYXJzZV9rZXF2X2xpc3QsIHBhcnNlX2h0dHBfbGlzdCAoSSdtIGxlYXZpbmcgdGhpcyBmb3IgQW50aG9ueSBCYXh0ZXIKLSMgIGFuZCBHcmVnIFN0ZWluLCBzaW5jZSB0aGV5J3JlIGRvaW5nIERpZ2VzdCBBdXRoZW50aWNhdGlvbikKLSMgQXV0aGVudGljYXRpb24gc3R1ZmYgKGRpdHRvKQotIyBDdXN0b21Qcm94eSwgQ3VzdG9tUHJveHlIYW5kbGVyCisjIHBhcnNlX2tlcXZfbGlzdCwgcGFyc2VfaHR0cF9saXN0LCBIVFRQRGlnZXN0QXV0aEhhbmRsZXIKIAogY2xhc3MgVHJpdmlhbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF90cml2aWFsKHNlbGYpOgpAQCAtNDksNiArNDYsNzAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVybGxpYjIucGFyc2VfaHR0cF9saXN0KHN0cmluZyksIGxpc3QpCiAKIAorZGVmIHRlc3RfcGFzc3dvcmRfbWFuYWdlcihzZWxmKToKKyAgICAiIiIKKyAgICA+Pj4gbWdyID0gdXJsbGliMi5IVFRQUGFzc3dvcmRNZ3IoKQorICAgID4+PiBhZGQgPSBtZ3IuYWRkX3Bhc3N3b3JkCisgICAgPj4+IGFkZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vIiwgImpvZSIsICJwYXNzd29yZCIpCisgICAgPj4+IGFkZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vbmkiLCAibmkiLCAibmkiKQorICAgID4+PiBhZGQoImMiLCAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIsICJmb28iLCAibmkiKQorICAgID4+PiBhZGQoImMiLCAiaHR0cDovL2V4YW1wbGUuY29tL2JhciIsICJiYXIiLCAibmluaSIpCisgICAgPj4+IGFkZCgiYiIsICJodHRwOi8vZXhhbXBsZS5jb20vIiwgImZpcnN0IiwgImJsYWgiKQorICAgID4+PiBhZGQoImIiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIsICJzZWNvbmQiLCAic3BhbSIpCisgICAgPj4+IGFkZCgiYSIsICJodHRwOi8vZXhhbXBsZS5jb20iLCAiMSIsICJhIikKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9jLmV4YW1wbGUuY29tOjMxMjgiLCAiMyIsICJjIikKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImQuZXhhbXBsZS5jb20iLCAiNCIsICJkIikKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImUuZXhhbXBsZS5jb206MzEyOCIsICI1IiwgImUiKQorCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiZXhhbXBsZS5jb20iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAoJ2pvZScsICdwYXNzd29yZCcpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiaHR0cDovL2V4YW1wbGUuY29tL3NwYW0iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vc3BhbS9zcGFtIikKKyAgICAoJ2pvZScsICdwYXNzd29yZCcpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImMiLCAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIpCisgICAgKCdmb28nLCAnbmknKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJjIiwgImh0dHA6Ly9leGFtcGxlLmNvbS9iYXIiKQorICAgICgnYmFyJywgJ25pbmknKQorCisgICAgQ3VycmVudGx5LCB3ZSB1c2UgdGhlIGhpZ2hlc3QtbGV2ZWwgcGF0aCB3aGVyZSBtb3JlIHRoYW4gb25lIG1hdGNoOgorCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiaHR0cDovL2V4YW1wbGUuY29tL25pIikKKyAgICAoJ2pvZScsICdwYXNzd29yZCcpCisKKyAgICBVc2UgbGF0ZXN0IGFkZF9wYXNzd29yZCgpIGluIGNhc2Ugb2YgY29uZmxpY3Q6CisKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiYiIsICJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAoJ3NlY29uZCcsICdzcGFtJykKKworICAgIE5vIHNwZWNpYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gYS5leGFtcGxlLmNvbSBhbmQgZXhhbXBsZS5jb206CisKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiYSIsICJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAoJzEnLCAnYScpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImEiLCAiaHR0cDovL2EuZXhhbXBsZS5jb20vIikKKyAgICAoTm9uZSwgTm9uZSkKKworICAgIFBvcnRzOgorCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiYy5leGFtcGxlLmNvbSIpCisgICAgKE5vbmUsIE5vbmUpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiYy5leGFtcGxlLmNvbTozMTI4IikKKyAgICAoJzMnLCAnYycpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiaHR0cDovL2MuZXhhbXBsZS5jb206MzEyOCIpCisgICAgKCczJywgJ2MnKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImQuZXhhbXBsZS5jb20iKQorICAgICgnNCcsICdkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJlLmV4YW1wbGUuY29tOjMxMjgiKQorICAgICgnNScsICdlJykKKworICAgICIiIgorICAgIHBhc3MKKworCiBjbGFzcyBNb2NrT3BlbmVyOgogICAgIGFkZGhlYWRlcnMgPSBbXQogICAgIGRlZiBvcGVuKHNlbGYsIHJlcSwgZGF0YT1Ob25lKToKQEAgLTg5LDYgKzE1MCw4IEBACiAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZShzZWxmLm1ldGhfbmFtZSwgc2VsZi5hY3Rpb24sICphcmdzKQogCiBjbGFzcyBNb2NrSGFuZGxlcjoKKyAgICAjIHVzZWZ1bCBmb3IgdGVzdGluZyBoYW5kbGVyIG1hY2hpbmVyeQorICAgICMgc2VlIGFkZF9vcmRlcmVkX21vY2tfaGFuZGxlcnMoKSBkb2NzdHJpbmcKICAgICBoYW5kbGVyX29yZGVyID0gNTAwCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZHMpOgogICAgICAgICBzZWxmLl9kZWZpbmVfbWV0aG9kcyhtZXRob2RzKQpAQCAtMTYxLDYgKzIyNCw1MCBAQAogICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaCkKICAgICByZXR1cm4gaGFuZGxlcnMKIAorZGVmIGJ1aWxkX3Rlc3Rfb3BlbmVyKCpoYW5kbGVyX2luc3RhbmNlcyk6CisgICAgb3BlbmVyID0gT3BlbmVyRGlyZWN0b3IoKQorICAgIGZvciBoIGluIGhhbmRsZXJfaW5zdGFuY2VzOgorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaCkKKyAgICByZXR1cm4gb3BlbmVyCisKK2NsYXNzIE1vY2tIVFRQSGFuZGxlcih1cmxsaWIyLkJhc2VIYW5kbGVyKToKKyAgICAjIHVzZWZ1bCBmb3IgdGVzdGluZyByZWRpcmVjdGlvbnMgYW5kIGF1dGgKKyAgICAjIHNlbmRzIHN1cHBsaWVkIGhlYWRlcnMgYW5kIGNvZGUgYXMgZmlyc3QgcmVzcG9uc2UKKyAgICAjIHNlbmRzIDIwMCBPSyBhcyBzZWNvbmQgcmVzcG9uc2UKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSwgaGVhZGVycyk6CisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycworICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuX2NvdW50ID0gMAorICAgICAgICBzZWxmLnJlcXVlc3RzID0gW10KKyAgICBkZWYgaHR0cF9vcGVuKHNlbGYsIHJlcSk6CisgICAgICAgIGltcG9ydCBtaW1ldG9vbHMsIGh0dHBsaWIsIGNvcHkKKyAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgc2VsZi5yZXF1ZXN0cy5hcHBlbmQoY29weS5kZWVwY29weShyZXEpKQorICAgICAgICBpZiBzZWxmLl9jb3VudCA9PSAwOgorICAgICAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDEKKyAgICAgICAgICAgIG5hbWUgPSBodHRwbGliLnJlc3BvbnNlc1tzZWxmLmNvZGVdCisgICAgICAgICAgICBtc2cgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTyhzZWxmLmhlYWRlcnMpKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50LmVycm9yKAorICAgICAgICAgICAgICAgICJodHRwIiwgcmVxLCBNb2NrRmlsZSgpLCBzZWxmLmNvZGUsIG5hbWUsIG1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVxID0gcmVxCisgICAgICAgICAgICBtc2cgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTygiXHJcblxyXG4iKSkKKyAgICAgICAgICAgIHJldHVybiBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCBtc2csICIiLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCisKK2NsYXNzIE1vY2tQYXNzd29yZE1hbmFnZXI6CisgICAgZGVmIGFkZF9wYXNzd29yZChzZWxmLCByZWFsbSwgdXJpLCB1c2VyLCBwYXNzd29yZCk6CisgICAgICAgIHNlbGYucmVhbG0gPSByZWFsbQorICAgICAgICBzZWxmLnVybCA9IHVyaQorICAgICAgICBzZWxmLnVzZXIgPSB1c2VyCisgICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAorICAgIGRlZiBmaW5kX3VzZXJfcGFzc3dvcmQoc2VsZiwgcmVhbG0sIGF1dGh1cmkpOgorICAgICAgICBzZWxmLnRhcmdldF9yZWFsbSA9IHJlYWxtCisgICAgICAgIHNlbGYudGFyZ2V0X3VybCA9IGF1dGh1cmkKKyAgICAgICAgcmV0dXJuIHNlbGYudXNlciwgc2VsZi5wYXNzd29yZAorCisKIGNsYXNzIE9wZW5lckRpcmVjdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfaGFuZGxlZChzZWxmKToKQEAgLTYxMiwzMyArNzE5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIuSFRUUFJlZGlyZWN0SGFuZGxlci5tYXhfcmVkaXJlY3Rpb25zKQogCiAgICAgZGVmIHRlc3RfY29va2llX3JlZGlyZWN0KHNlbGYpOgotICAgICAgICBjbGFzcyBNb2NrSFRUUEhhbmRsZXIodXJsbGliMi5IVFRQSGFuZGxlcik6Ci0gICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuX2NvdW50ID0gMAotICAgICAgICAgICAgZGVmIGh0dHBfb3BlbihzZWxmLCByZXEpOgotICAgICAgICAgICAgICAgIGltcG9ydCBtaW1ldG9vbHMKLSAgICAgICAgICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NvdW50ID09IDA6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgKyAxCi0gICAgICAgICAgICAgICAgICAgIG1zZyA9IG1pbWV0b29scy5NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nSU8oIkxvY2F0aW9uOiBodHRwOi8vd3d3LmNyYWNrZXIuY29tL1xyXG5cclxuIikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5lcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIiwgcmVxLCBNb2NrRmlsZSgpLCAzMDIsICJGb3VuZCIsIG1zZykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcSA9IHJlcQotICAgICAgICAgICAgICAgICAgICBtc2cgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTygiXHJcblxyXG4iKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIG1zZywgIiIsIHJlcS5nZXRfZnVsbF91cmwoKSkKICAgICAgICAgIyBjb29raWVzIHNob3VsZG4ndCBsZWFrIGludG8gcmVkaXJlY3RlZCByZXF1ZXN0cwogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCi0gICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgYnVpbGRfb3BlbmVyLCBIVFRQSGFuZGxlciwgSFRUUEVycm9yLCBcCi0gICAgICAgICAgICAgSFRUUENvb2tpZVByb2Nlc3NvcgogCiAgICAgICAgIGZyb20gdGVzdC50ZXN0X2Nvb2tpZWxpYiBpbXBvcnQgaW50ZXJhY3RfbmV0c2NhcGUKIAogICAgICAgICBjaiA9IENvb2tpZUphcigpCiAgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGNqLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLCAic3BhbT1lZ2dzIikKLSAgICAgICAgaGggPSBNb2NrSFRUUEhhbmRsZXIoKQotICAgICAgICBjcCA9IEhUVFBDb29raWVQcm9jZXNzb3IoY2opCi0gICAgICAgIG8gPSBidWlsZF9vcGVuZXIoaGgsIGNwKQorICAgICAgICBoaCA9IE1vY2tIVFRQSGFuZGxlcigzMDIsICJMb2NhdGlvbjogaHR0cDovL3d3dy5jcmFja2VyLmNvbS9cclxuXHJcbiIpCisgICAgICAgIGhkZWggPSB1cmxsaWIyLkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaHJoID0gdXJsbGliMi5IVFRQUmVkaXJlY3RIYW5kbGVyKCkKKyAgICAgICAgY3AgPSB1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opCisgICAgICAgIG8gPSBidWlsZF90ZXN0X29wZW5lcihoaCwgaGRlaCwgaHJoLCBjcCkKICAgICAgICAgby5vcGVuKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGgucmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQogCkBAIC02NTksNiArNzUxLDkyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhoYW5kbGVyc1swXSwgImh0dHBfb3BlbiIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVwWzA6Ml0gZm9yIHR1cCBpbiBvLmNhbGxzXSkKIAorICAgIGRlZiB0ZXN0X2Jhc2ljX2F1dGgoc2VsZik6CisgICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGFzc3dvcmRfbWFuYWdlciA9IE1vY2tQYXNzd29yZE1hbmFnZXIoKQorICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLkhUVFBCYXNpY0F1dGhIYW5kbGVyKHBhc3N3b3JkX21hbmFnZXIpCisgICAgICAgIHJlYWxtID0gIkFDTUUgV2lkZ2V0IFN0b3JlIgorICAgICAgICBodHRwX2hhbmRsZXIgPSBNb2NrSFRUUEhhbmRsZXIoCisgICAgICAgICAgICA0MDEsICdXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0iJXMiXHJcblxyXG4nICUgcmVhbG0pCisgICAgICAgIHNlbGYuX3Rlc3RfYmFzaWNfYXV0aChvcGVuZXIsIGF1dGhfaGFuZGxlciwgIkF1dGhvcml6YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tL3Byb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9wcm94eV9iYXNpY19hdXRoKHNlbGYpOgorICAgICAgICBvcGVuZXIgPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBoID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoZGljdChodHRwPSJwcm94eS5leGFtcGxlLmNvbTozMTI4IikpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihwaCkKKyAgICAgICAgcGFzc3dvcmRfbWFuYWdlciA9IE1vY2tQYXNzd29yZE1hbmFnZXIoKQorICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLlByb3h5QmFzaWNBdXRoSGFuZGxlcihwYXNzd29yZF9tYW5hZ2VyKQorICAgICAgICByZWFsbSA9ICJBQ01FIE5ldHdvcmtzIgorICAgICAgICBodHRwX2hhbmRsZXIgPSBNb2NrSFRUUEhhbmRsZXIoCisgICAgICAgICAgICA0MDcsICdQcm94eS1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPSIlcyJcclxuXHJcbicgJSByZWFsbSkKKyAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYXV0aF9oYW5kbGVyLCAiUHJveHktYXV0aG9yaXphdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbSwgaHR0cF9oYW5kbGVyLCBwYXNzd29yZF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tOjMxMjgvcHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm94eS5leGFtcGxlLmNvbTozMTI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2FuZF9kaWdlc3RfYXV0aF9oYW5kbGVycyhzZWxmKToKKyAgICAgICAgIyBIVFRQRGlnZXN0QXV0aEhhbmRsZXIgdGhyZXcgYW4gZXhjZXB0aW9uIGlmIGl0IGNvdWxkbid0IGhhbmRsZSBhIDQwKgorICAgICAgICAjIHJlc3BvbnNlIChodHRwOi8vcHl0aG9uLm9yZy9zZi8xNDc5MzAyKSwgd2hlcmUgaXQgc2hvdWxkIGluc3RlYWQKKyAgICAgICAgIyByZXR1cm4gTm9uZSB0byBhbGxvdyBhbm90aGVyIGhhbmRsZXIgKGVzcGVjaWFsbHkKKyAgICAgICAgIyBIVFRQQmFzaWNBdXRoSGFuZGxlcikgdG8gaGFuZGxlIHRoZSByZXNwb25zZS4KKyAgICAgICAgY2xhc3MgVGVzdERpZ2VzdEF1dGhIYW5kbGVyKHVybGxpYjIuSFRUUERpZ2VzdEF1dGhIYW5kbGVyKToKKyAgICAgICAgICAgIGhhbmRsZXJfb3JkZXIgPSA0MDAgICMgc3RyaWN0bHkgYmVmb3JlIEhUVFBCYXNpY0F1dGhIYW5kbGVyCisgICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGFzc3dvcmRfbWFuYWdlciA9IE1vY2tQYXNzd29yZE1hbmFnZXIoKQorICAgICAgICBkaWdlc3RfaGFuZGxlciA9IFRlc3REaWdlc3RBdXRoSGFuZGxlcihwYXNzd29yZF9tYW5hZ2VyKQorICAgICAgICBiYXNpY19oYW5kbGVyID0gdXJsbGliMi5IVFRQQmFzaWNBdXRoSGFuZGxlcihwYXNzd29yZF9tYW5hZ2VyKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoZGlnZXN0X2hhbmRsZXIpCisgICAgICAgIHJlYWxtID0gIkFDTUUgTmV0d29ya3MiCisgICAgICAgIGh0dHBfaGFuZGxlciA9IE1vY2tIVFRQSGFuZGxlcigKKyAgICAgICAgICAgIDQwMSwgJ1dXVy1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPSIlcyJcclxuXHJcbicgJSByZWFsbSkKKyAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYmFzaWNfaGFuZGxlciwgIkF1dGhvcml6YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tL3Byb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgX3Rlc3RfYmFzaWNfYXV0aChzZWxmLCBvcGVuZXIsIGF1dGhfaGFuZGxlciwgYXV0aF9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3VybCwgcHJvdGVjdGVkX3VybCk6CisgICAgICAgIGltcG9ydCBiYXNlNjQsIGh0dHBsaWIKKyAgICAgICAgdXNlciwgcGFzc3dvcmQgPSAid2lsZSIsICJjb3lvdGUiCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihhdXRoX2hhbmRsZXIpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihodHRwX2hhbmRsZXIpCisKKyAgICAgICAgIyAuYWRkX3Bhc3N3b3JkKCkgZmVkIHRocm91Z2ggdG8gcGFzc3dvcmQgbWFuYWdlcgorICAgICAgICBhdXRoX2hhbmRsZXIuYWRkX3Bhc3N3b3JkKHJlYWxtLCByZXF1ZXN0X3VybCwgdXNlciwgcGFzc3dvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbG0sIHBhc3N3b3JkX21hbmFnZXIucmVhbG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF91cmwsIHBhc3N3b3JkX21hbmFnZXIudXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVzZXIsIHBhc3N3b3JkX21hbmFnZXIudXNlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzd29yZCwgcGFzc3dvcmRfbWFuYWdlci5wYXNzd29yZCkKKworICAgICAgICByID0gb3BlbmVyLm9wZW4ocmVxdWVzdF91cmwpCisKKyAgICAgICAgIyBzaG91bGQgaGF2ZSBhc2tlZCB0aGUgcGFzc3dvcmQgbWFuYWdlciBmb3IgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc3dvcmRfbWFuYWdlci50YXJnZXRfcmVhbG0sIHJlYWxtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3N3b3JkX21hbmFnZXIudGFyZ2V0X3VybCwgcHJvdGVjdGVkX3VybCkKKworICAgICAgICAjIGV4cGVjdCBvbmUgcmVxdWVzdCB3aXRob3V0IGF1dGhvcml6YXRpb24sIHRoZW4gb25lIHdpdGgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaHR0cF9oYW5kbGVyLnJlcXVlc3RzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShodHRwX2hhbmRsZXIucmVxdWVzdHNbMF0uaGFzX2hlYWRlcihhdXRoX2hlYWRlcikpCisgICAgICAgIHVzZXJwYXNzID0gJyVzOiVzJyAlICh1c2VyLCBwYXNzd29yZCkKKyAgICAgICAgYXV0aF9oZHJfdmFsdWUgPSAnQmFzaWMgJytiYXNlNjQuZW5jb2Rlc3RyaW5nKHVzZXJwYXNzKS5zdHJpcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHR0cF9oYW5kbGVyLnJlcXVlc3RzWzFdLmdldF9oZWFkZXIoYXV0aF9oZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfaGRyX3ZhbHVlKQorCisgICAgICAgICMgaWYgdGhlIHBhc3N3b3JkIG1hbmFnZXIgY2FuJ3QgZmluZCBhIHBhc3N3b3JkLCB0aGUgaGFuZGxlciB3b24ndAorICAgICAgICAjIGhhbmRsZSB0aGUgSFRUUCBhdXRoIGVycm9yCisgICAgICAgIHBhc3N3b3JkX21hbmFnZXIudXNlciA9IHBhc3N3b3JkX21hbmFnZXIucGFzc3dvcmQgPSBOb25lCisgICAgICAgIGh0dHBfaGFuZGxlci5yZXNldCgpCisgICAgICAgIHIgPSBvcGVuZXIub3BlbihyZXF1ZXN0X3VybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaHR0cF9oYW5kbGVyLnJlcXVlc3RzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShodHRwX2hhbmRsZXIucmVxdWVzdHNbMF0uaGFzX2hlYWRlcihhdXRoX2hlYWRlcikpCisKIAogY2xhc3MgTWlzY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNzAwLDE1NyArODc4LDE1IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmFzc2VydF8oRmFsc2UpCiAKLWNsYXNzIE5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBpZiAwOiAgIyBmb3IgZGVidWdnaW5nCi0gICAgICAgICAgICBpbXBvcnQgbG9nZ2luZwotICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInRlc3RfdXJsbGliMiIpCi0gICAgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKSkKLQotICAgIGRlZiB0ZXN0X3JhbmdlIChzZWxmKToKLSAgICAgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KCJodHRwOi8vd3d3LnB5dGhvbi5vcmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17J1JhbmdlJzogJ2J5dGVzPTIwLTM5J30pCi0gICAgICAgIHJlc3VsdCA9IHVybGxpYjIudXJsb3BlbihyZXEpCi0gICAgICAgIGRhdGEgPSByZXN1bHQucmVhZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEpLCAyMCkKLQotICAgICMgWFhYIFRoZSByZXN0IG9mIHRoZXNlIHRlc3RzIGFyZW4ndCB2ZXJ5IGdvb2QgLS0gdGhleSBkb24ndCBjaGVjayBtdWNoLgotICAgICMgVGhleSBkbyBzb21ldGltZXMgY2F0Y2ggc29tZSBtYWpvciBkaXNhc3RlcnMsIHRob3VnaC4KLQotICAgIGRlZiB0ZXN0X2Z0cChzZWxmKToKLSAgICAgICAgdXJscyA9IFsKLSAgICAgICAgICAgICdmdHA6Ly93d3cucHl0aG9uLm9yZy9wdWIvcHl0aG9uL21pc2Mvc291c2EuYXUnLAotICAgICAgICAgICAgJ2Z0cDovL3d3dy5weXRob24ub3JnL3B1Yi90bXAvYmxhdCcsCi0gICAgICAgICAgICAnZnRwOi8vZ2F0ZWtlZXBlci5yZXNlYXJjaC5jb21wYXEuY29tL3B1Yi9ERUMvU1JDJwotICAgICAgICAgICAgICAgICcvcmVzZWFyY2gtcmVwb3J0cy8wMFJFQURNRS1MZWdhbC1SdWxlcy1SZWdzJywKLSAgICAgICAgICAgIF0KLSAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkpCi0KLSAgICBkZWYgdGVzdF9nb3BoZXIoc2VsZik6Ci0gICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBnb3BoZXJsaWIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmxsaWIyJCIpCi0gICAgICAgIHVybHMgPSBbCi0gICAgICAgICAgICAjIFRoYW5rcyB0byBGcmVkIGZvciBmaW5kaW5nIHRoZXNlIQotICAgICAgICAgICAgJ2dvcGhlcjovL2dvcGhlci5saWIubmNzdS5lZHUvMTEvbGlicmFyeS9zdGFja3MvQWxleCcsCi0gICAgICAgICAgICAnZ29waGVyOi8vZ29waGVyLnZ0LmVkdToxMDAxMC8xMC8zMycsCi0gICAgICAgICAgICBdCi0gICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpKQotCi0gICAgZGVmIHRlc3RfZmlsZShzZWxmKToKLSAgICAgICAgVEVTVEZOID0gdGVzdF9zdXBwb3J0LlRFU1RGTgotICAgICAgICBmID0gb3BlbihURVNURk4sICd3JykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi53cml0ZSgnaGkgdGhlcmVcbicpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHVybHMgPSBbCi0gICAgICAgICAgICAgICAgJ2ZpbGU6JytzYW5lcGF0aG5hbWUydXJsKG9zLnBhdGguYWJzcGF0aChURVNURk4pKSwKLQotICAgICAgICAgICAgICAgICMgWFhYIGJ1Zywgc2hvdWxkIHJhaXNlIFVSTEVycm9yCi0gICAgICAgICAgICAgICAgIygnZmlsZTovL25vbnNlbnNlbmFtZS9ldGMvcGFzc3dkJywgTm9uZSwgdXJsbGliMi5VUkxFcnJvcikKLSAgICAgICAgICAgICAgICAoJ2ZpbGU6Ly9ub25zZW5zZW5hbWUvZXRjL3Bhc3N3ZCcsIE5vbmUsIChPU0Vycm9yLCBzb2NrZXQuZXJyb3IpKQotICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKLQotICAgIGRlZiB0ZXN0X2h0dHAoc2VsZik6Ci0gICAgICAgIHVybHMgPSBbCi0gICAgICAgICAgICAnaHR0cDovL3d3dy5lc3BuLmNvbS8nLCAjIHJlZGlyZWN0Ci0gICAgICAgICAgICAnaHR0cDovL3d3dy5weXRob24ub3JnL1NwYW5pc2gvSW5xdWlzdGlvbi8nLAotICAgICAgICAgICAgKCdodHRwOi8vd3d3LnB5dGhvbi5vcmcvY2dpLWJpbi9mYXF3LnB5JywKLSAgICAgICAgICAgICAncXVlcnk9cHl0aG9uaXN0YXMmcXVlcnl0eXBlPXNpbXBsZSZjYXNlZm9sZD15ZXMmcmVxPXNlYXJjaCcsIE5vbmUpLAotICAgICAgICAgICAgJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nLAotICAgICAgICAgICAgXQotICAgICAgICBzZWxmLl90ZXN0X3VybHModXJscywgc2VsZi5fZXh0cmFfaGFuZGxlcnMoKSkKLQotICAgICMgWFhYIEZvbGxvd2luZyB0ZXN0IGRlcGVuZHMgb24gbWFjaGluZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBpbnRlcm5hbAotICAgICMgdG8gQ05SSS4gIE5lZWQgdG8gc2V0IHVwIGEgcHVibGljIHNlcnZlciB3aXRoIHRoZSByaWdodCBhdXRoZW50aWNhdGlvbgotICAgICMgY29uZmlndXJhdGlvbiBmb3IgdGVzdCBwdXJwb3Nlcy4KLQotIyMgICAgIGRlZiB0ZXN0X2Nucmkoc2VsZik6Ci0jIyAgICAgICAgIGlmIHNvY2tldC5nZXRob3N0bmFtZSgpID09ICdiaXRkaWRkbGUnOgotIyMgICAgICAgICAgICAgbG9jYWxob3N0ID0gJ2JpdGRpZGRsZS5jbnJpLnJlc3Rvbi52YS51cycKLSMjICAgICAgICAgZWxpZiBzb2NrZXQuZ2V0aG9zdG5hbWUoKSA9PSAnYml0ZGlkZGxlLmNvbmNlbnRyaWMubmV0JzoKLSMjICAgICAgICAgICAgIGxvY2FsaG9zdCA9ICdsb2NhbGhvc3QnCi0jIyAgICAgICAgIGVsc2U6Ci0jIyAgICAgICAgICAgICBsb2NhbGhvc3QgPSBOb25lCi0jIyAgICAgICAgIGlmIGxvY2FsaG9zdCBpcyBub3QgTm9uZToKLSMjICAgICAgICAgICAgIHVybHMgPSBbCi0jIyAgICAgICAgICAgICAgICAgJ2ZpbGU6Ly8lcy9ldGMvcGFzc3dkJyAlIGxvY2FsaG9zdCwKLSMjICAgICAgICAgICAgICAgICAnaHR0cDovLyVzL3NpbXBsZS8nICUgbG9jYWxob3N0LAotIyMgICAgICAgICAgICAgICAgICdodHRwOi8vJXMvZGlnZXN0LycgJSBsb2NhbGhvc3QsCi0jIyAgICAgICAgICAgICAgICAgJ2h0dHA6Ly8lcy9ub3QvZm91bmQuaCcgJSBsb2NhbGhvc3QsCi0jIyAgICAgICAgICAgICAgICAgXQotCi0jIyAgICAgICAgICAgICBiYXV0aCA9IEhUVFBCYXNpY0F1dGhIYW5kbGVyKCkKLSMjICAgICAgICAgICAgIGJhdXRoLmFkZF9wYXNzd29yZCgnYmFzaWNfdGVzdF9yZWFsbScsIGxvY2FsaG9zdCwgJ2poeWx0b24nLAotIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzd29yZCcpCi0jIyAgICAgICAgICAgICBkYXV0aCA9IEhUVFBEaWdlc3RBdXRoSGFuZGxlcigpCi0jIyAgICAgICAgICAgICBkYXV0aC5hZGRfcGFzc3dvcmQoJ2RpZ2VzdF90ZXN0X3JlYWxtJywgbG9jYWxob3N0LCAnamh5bHRvbicsCi0jIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJykKLQotIyMgICAgICAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkrW2JhdXRoLCBkYXV0aF0pCi0KLSAgICBkZWYgX3Rlc3RfdXJscyhzZWxmLCB1cmxzLCBoYW5kbGVycyk6Ci0gICAgICAgIGltcG9ydCBzb2NrZXQKLSAgICAgICAgaW1wb3J0IHRpbWUKLSAgICAgICAgaW1wb3J0IGxvZ2dpbmcKLSAgICAgICAgZGVidWcgPSBsb2dnaW5nLmdldExvZ2dlcigidGVzdF91cmxsaWIyIikuZGVidWcKLQotICAgICAgICB1cmxsaWIyLmluc3RhbGxfb3BlbmVyKHVybGxpYjIuYnVpbGRfb3BlbmVyKCpoYW5kbGVycykpCi0KLSAgICAgICAgZm9yIHVybCBpbiB1cmxzOgotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIHR1cGxlKToKLSAgICAgICAgICAgICAgICB1cmwsIHJlcSwgZXhwZWN0ZWRfZXJyID0gdXJsCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJlcSA9IGV4cGVjdGVkX2VyciA9IE5vbmUKLSAgICAgICAgICAgIGRlYnVnKHVybCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBmID0gdXJsbGliMi51cmxvcGVuKHVybCwgcmVxKQotICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBzb2NrZXQuZXJyb3IsIE9TRXJyb3IpLCBlcnI6Ci0gICAgICAgICAgICAgICAgZGVidWcoZXJyKQotICAgICAgICAgICAgICAgIGlmIGV4cGVjdGVkX2VycjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBidWYgPSBmLnJlYWQoKQotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIGRlYnVnKCJyZWFkICVkIGJ5dGVzIiAlIGxlbihidWYpKQotICAgICAgICAgICAgZGVidWcoIioqKioqKioqIG5leHQgdXJsIGNvbWluZyB1cC4uLiIpCi0gICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKLQotICAgIGRlZiBfZXh0cmFfaGFuZGxlcnMoc2VsZik6Ci0gICAgICAgIGhhbmRsZXJzID0gW10KLQotICAgICAgICBoYW5kbGVycy5hcHBlbmQodXJsbGliMi5Hb3BoZXJIYW5kbGVyKQotCi0gICAgICAgIGNmaCA9IHVybGxpYjIuQ2FjaGVGVFBIYW5kbGVyKCkKLSAgICAgICAgY2ZoLnNldFRpbWVvdXQoMSkKLSAgICAgICAgaGFuZGxlcnMuYXBwZW5kKGNmaCkKLQotIyMgICAgICAgICAjIFhYWCB0cnkgb3V0IHNvbWUgY3VzdG9tIHByb3h5IG9iamVjdHMgdG9vIQotIyMgICAgICAgICBkZWYgYXRfY25yaShyZXEpOgotIyMgICAgICAgICAgICAgaG9zdCA9IHJlcS5nZXRfaG9zdCgpCi0jIyAgICAgICAgICAgICBkZWJ1Zyhob3N0KQotIyMgICAgICAgICAgICAgaWYgaG9zdFstMTg6XSA9PSAnLmNucmkucmVzdG9uLnZhLnVzJzoKLSMjICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQotIyMgICAgICAgICBwID0gQ3VzdG9tUHJveHkoJ2h0dHAnLCBhdF9jbnJpLCAncHJveHkuY25yaS5yZXN0b24udmEudXMnKQotIyMgICAgICAgICBwaCA9IEN1c3RvbVByb3h5SGFuZGxlcihwKQotIyMgICAgICAgICBoYW5kbGVycy5hcHBlbmQocGgpCi0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzCi0KIAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF91cmxsaWIyCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdXJsbGliMiwgdmVyYm9zZSkKICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodXJsbGliMiwgdmVyYm9zZSkKICAgICB0ZXN0cyA9IChUcml2aWFsVGVzdHMsCiAgICAgICAgICAgICAgT3BlbmVyRGlyZWN0b3JUZXN0cywKICAgICAgICAgICAgICBIYW5kbGVyVGVzdHMsCiAgICAgICAgICAgICAgTWlzY1Rlc3RzKQotICAgIGlmIHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJyk6Ci0gICAgICAgIHRlc3RzICs9IChOZXR3b3JrVGVzdHMsKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CmluZGV4IDNjMjMyNDYuLmRjM2QzNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKQEAgLTIsNiArMiw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3VybGxpYjIgaW1wb3J0IHNhbmVwYXRobmFtZTJ1cmwKIAogaW1wb3J0IHNvY2tldAogaW1wb3J0IHVybGxpYjIKQEAgLTIzLDYgKzI0LDQ2IEBACiAgICAgICAgIGYgPSB1cmxsaWIyLnVybG9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQogICAgICAgICB4ID0gZi5yZWFkKCkKIAorCitjbGFzcyBBdXRoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHVybGxpYjIgYXV0aGVudGljYXRpb24gZmVhdHVyZXMuIiIiCisKKyMjIERpc2FibGVkIGF0IHRoZSBtb21lbnQgc2luY2UgdGhlcmUgaXMgbm8gcGFnZSB1bmRlciBweXRob24ub3JnIHdoaWNoCisjIyBjb3VsZCBiZSB1c2VkIHRvIEhUVFAgYXV0aGVudGljYXRpb24uCisjCisjICAgIGRlZiB0ZXN0X2Jhc2ljX2F1dGgoc2VsZik6CisjICAgICAgICBpbXBvcnQgaHR0cGxpYgorIworIyAgICAgICAgdGVzdF91cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL3Rlc3QvdGVzdF91cmxsaWIyL2Jhc2ljX2F1dGgiCisjICAgICAgICB0ZXN0X2hvc3Rwb3J0ID0gInd3dy5weXRob24ub3JnIgorIyAgICAgICAgdGVzdF9yZWFsbSA9ICdUZXN0IFJlYWxtJworIyAgICAgICAgdGVzdF91c2VyID0gJ3Rlc3QudGVzdF91cmxsaWIybmV0JworIyAgICAgICAgdGVzdF9wYXNzd29yZCA9ICdibGFoJworIworIyAgICAgICAgIyBmYWlsdXJlCisjICAgICAgICB0cnk6CisjICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuKHRlc3RfdXJsKQorIyAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBleGM6CisjICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMuY29kZSwgNDAxKQorIyAgICAgICAgZWxzZToKKyMgICAgICAgICAgICBzZWxmLmZhaWwoInVybG9wZW4oKSBzaG91bGQgaGF2ZSBmYWlsZWQgd2l0aCA0MDEiKQorIworIyAgICAgICAgIyBzdWNjZXNzCisjICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLkhUVFBCYXNpY0F1dGhIYW5kbGVyKCkKKyMgICAgICAgIGF1dGhfaGFuZGxlci5hZGRfcGFzc3dvcmQodGVzdF9yZWFsbSwgdGVzdF9ob3N0cG9ydCwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF91c2VyLCB0ZXN0X3Bhc3N3b3JkKQorIyAgICAgICAgb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIoYXV0aF9oYW5kbGVyKQorIyAgICAgICAgZiA9IG9wZW5lci5vcGVuKCdodHRwOi8vbG9jYWxob3N0LycpCisjICAgICAgICByZXNwb25zZSA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisjCisjICAgICAgICAjIFRoZSAndXNlcmluZm8nIFVSTCBjb21wb25lbnQgaXMgZGVwcmVjYXRlZCBieSBSRkMgMzk4NiBmb3Igc2VjdXJpdHkKKyMgICAgICAgICMgcmVhc29ucywgbGV0J3Mgbm90IGltcGxlbWVudCBpdCEgIChpdCdzIGFscmVhZHkgaW1wbGVtZW50ZWQgZm9yIHByb3h5CisjICAgICAgICAjIHNwZWNpZmljYXRpb24gc3RyaW5ncyAodGhhdCBpcywgVVJMcyBvciBhdXRob3JpdGllcyBzcGVjaWZ5aW5nIGEKKyMgICAgICAgICMgcHJveHkpLCBzbyB3ZSBtdXN0IGtlZXAgdGhhdCkKKyMgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGh0dHBsaWIuSW52YWxpZFVSTCwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly9ldmlsOnRoaW5nQGV4YW1wbGUuY29tIikKKworCiBjbGFzcyB1cmxvcGVuTmV0d29ya1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0cyB1cmxsaWIyLnVybG9wZW4gdXNpbmcgdGhlIG5ldHdvcmsuCiAKQEAgLTg0LDkgKzEyNSwxNDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIyLnVybG9wZW4sICJodHRwOi8vd3d3LnNhZGZsa2pzYXNhZGYuY29tLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly93d3cucHl0aG9uLmludmFsaWQvIikKIAorCitjbGFzcyBPdGhlck5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiAwOiAgIyBmb3IgZGVidWdnaW5nCisgICAgICAgICAgICBpbXBvcnQgbG9nZ2luZworICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInRlc3RfdXJsbGliMm5ldCIpCisgICAgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKSkKKworICAgIGRlZiB0ZXN0X3JhbmdlIChzZWxmKToKKyAgICAgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KCJodHRwOi8vd3d3LnB5dGhvbi5vcmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17J1JhbmdlJzogJ2J5dGVzPTIwLTM5J30pCisgICAgICAgIHJlc3VsdCA9IHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgICAgIGRhdGEgPSByZXN1bHQucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEpLCAyMCkKKworICAgICMgWFhYIFRoZSByZXN0IG9mIHRoZXNlIHRlc3RzIGFyZW4ndCB2ZXJ5IGdvb2QgLS0gdGhleSBkb24ndCBjaGVjayBtdWNoLgorICAgICMgVGhleSBkbyBzb21ldGltZXMgY2F0Y2ggc29tZSBtYWpvciBkaXNhc3RlcnMsIHRob3VnaC4KKworICAgIGRlZiB0ZXN0X2Z0cChzZWxmKToKKyAgICAgICAgdXJscyA9IFsKKyAgICAgICAgICAgICdmdHA6Ly93d3cucHl0aG9uLm9yZy9wdWIvcHl0aG9uL21pc2Mvc291c2EuYXUnLAorICAgICAgICAgICAgJ2Z0cDovL3d3dy5weXRob24ub3JnL3B1Yi90bXAvYmxhdCcsCisgICAgICAgICAgICAnZnRwOi8vZ2F0ZWtlZXBlci5yZXNlYXJjaC5jb21wYXEuY29tL3B1Yi9ERUMvU1JDJworICAgICAgICAgICAgICAgICcvcmVzZWFyY2gtcmVwb3J0cy8wMFJFQURNRS1MZWdhbC1SdWxlcy1SZWdzJywKKyAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkpCisKKyAgICBkZWYgdGVzdF9nb3BoZXIoc2VsZik6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBnb3BoZXJsaWIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmxsaWIyJCIpCisgICAgICAgIHVybHMgPSBbCisgICAgICAgICAgICAjIFRoYW5rcyB0byBGcmVkIGZvciBmaW5kaW5nIHRoZXNlIQorICAgICAgICAgICAgJ2dvcGhlcjovL2dvcGhlci5saWIubmNzdS5lZHUvMTEvbGlicmFyeS9zdGFja3MvQWxleCcsCisgICAgICAgICAgICAnZ29waGVyOi8vZ29waGVyLnZ0LmVkdToxMDAxMC8xMC8zMycsCisgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpKQorCisgICAgZGVmIHRlc3RfZmlsZShzZWxmKToKKyAgICAgICAgVEVTVEZOID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBmID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgnaGkgdGhlcmVcbicpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHVybHMgPSBbCisgICAgICAgICAgICAgICAgJ2ZpbGU6JytzYW5lcGF0aG5hbWUydXJsKG9zLnBhdGguYWJzcGF0aChURVNURk4pKSwKKworICAgICAgICAgICAgICAgICMgWFhYIGJ1Zywgc2hvdWxkIHJhaXNlIFVSTEVycm9yCisgICAgICAgICAgICAgICAgIygnZmlsZTovL25vbnNlbnNlbmFtZS9ldGMvcGFzc3dkJywgTm9uZSwgdXJsbGliMi5VUkxFcnJvcikKKyAgICAgICAgICAgICAgICAoJ2ZpbGU6Ly9ub25zZW5zZW5hbWUvZXRjL3Bhc3N3ZCcsIE5vbmUsIChPU0Vycm9yLCBzb2NrZXQuZXJyb3IpKQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2h0dHAoc2VsZik6CisgICAgICAgIHVybHMgPSBbCisgICAgICAgICAgICAnaHR0cDovL3d3dy5lc3BuLmNvbS8nLCAjIHJlZGlyZWN0CisgICAgICAgICAgICAnaHR0cDovL3d3dy5weXRob24ub3JnL1NwYW5pc2gvSW5xdWlzdGlvbi8nLAorICAgICAgICAgICAgKCdodHRwOi8vd3d3LnB5dGhvbi5vcmcvY2dpLWJpbi9mYXF3LnB5JywKKyAgICAgICAgICAgICAncXVlcnk9cHl0aG9uaXN0YXMmcXVlcnl0eXBlPXNpbXBsZSZjYXNlZm9sZD15ZXMmcmVxPXNlYXJjaCcsIE5vbmUpLAorICAgICAgICAgICAgJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nLAorICAgICAgICAgICAgXQorICAgICAgICBzZWxmLl90ZXN0X3VybHModXJscywgc2VsZi5fZXh0cmFfaGFuZGxlcnMoKSkKKworICAgICMgWFhYIEZvbGxvd2luZyB0ZXN0IGRlcGVuZHMgb24gbWFjaGluZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBpbnRlcm5hbAorICAgICMgdG8gQ05SSS4gIE5lZWQgdG8gc2V0IHVwIGEgcHVibGljIHNlcnZlciB3aXRoIHRoZSByaWdodCBhdXRoZW50aWNhdGlvbgorICAgICMgY29uZmlndXJhdGlvbiBmb3IgdGVzdCBwdXJwb3Nlcy4KKworIyMgICAgIGRlZiB0ZXN0X2Nucmkoc2VsZik6CisjIyAgICAgICAgIGlmIHNvY2tldC5nZXRob3N0bmFtZSgpID09ICdiaXRkaWRkbGUnOgorIyMgICAgICAgICAgICAgbG9jYWxob3N0ID0gJ2JpdGRpZGRsZS5jbnJpLnJlc3Rvbi52YS51cycKKyMjICAgICAgICAgZWxpZiBzb2NrZXQuZ2V0aG9zdG5hbWUoKSA9PSAnYml0ZGlkZGxlLmNvbmNlbnRyaWMubmV0JzoKKyMjICAgICAgICAgICAgIGxvY2FsaG9zdCA9ICdsb2NhbGhvc3QnCisjIyAgICAgICAgIGVsc2U6CisjIyAgICAgICAgICAgICBsb2NhbGhvc3QgPSBOb25lCisjIyAgICAgICAgIGlmIGxvY2FsaG9zdCBpcyBub3QgTm9uZToKKyMjICAgICAgICAgICAgIHVybHMgPSBbCisjIyAgICAgICAgICAgICAgICAgJ2ZpbGU6Ly8lcy9ldGMvcGFzc3dkJyAlIGxvY2FsaG9zdCwKKyMjICAgICAgICAgICAgICAgICAnaHR0cDovLyVzL3NpbXBsZS8nICUgbG9jYWxob3N0LAorIyMgICAgICAgICAgICAgICAgICdodHRwOi8vJXMvZGlnZXN0LycgJSBsb2NhbGhvc3QsCisjIyAgICAgICAgICAgICAgICAgJ2h0dHA6Ly8lcy9ub3QvZm91bmQuaCcgJSBsb2NhbGhvc3QsCisjIyAgICAgICAgICAgICAgICAgXQorCisjIyAgICAgICAgICAgICBiYXV0aCA9IEhUVFBCYXNpY0F1dGhIYW5kbGVyKCkKKyMjICAgICAgICAgICAgIGJhdXRoLmFkZF9wYXNzd29yZCgnYmFzaWNfdGVzdF9yZWFsbScsIGxvY2FsaG9zdCwgJ2poeWx0b24nLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzd29yZCcpCisjIyAgICAgICAgICAgICBkYXV0aCA9IEhUVFBEaWdlc3RBdXRoSGFuZGxlcigpCisjIyAgICAgICAgICAgICBkYXV0aC5hZGRfcGFzc3dvcmQoJ2RpZ2VzdF90ZXN0X3JlYWxtJywgbG9jYWxob3N0LCAnamh5bHRvbicsCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJykKKworIyMgICAgICAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkrW2JhdXRoLCBkYXV0aF0pCisKKyAgICBkZWYgX3Rlc3RfdXJscyhzZWxmLCB1cmxzLCBoYW5kbGVycyk6CisgICAgICAgIGltcG9ydCBzb2NrZXQKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgaW1wb3J0IGxvZ2dpbmcKKyAgICAgICAgZGVidWcgPSBsb2dnaW5nLmdldExvZ2dlcigidGVzdF91cmxsaWIyIikuZGVidWcKKworICAgICAgICB1cmxsaWIyLmluc3RhbGxfb3BlbmVyKHVybGxpYjIuYnVpbGRfb3BlbmVyKCpoYW5kbGVycykpCisKKyAgICAgICAgZm9yIHVybCBpbiB1cmxzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIHR1cGxlKToKKyAgICAgICAgICAgICAgICB1cmwsIHJlcSwgZXhwZWN0ZWRfZXJyID0gdXJsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlcSA9IGV4cGVjdGVkX2VyciA9IE5vbmUKKyAgICAgICAgICAgIGRlYnVnKHVybCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gdXJsbGliMi51cmxvcGVuKHVybCwgcmVxKQorICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBzb2NrZXQuZXJyb3IsIE9TRXJyb3IpLCBlcnI6CisgICAgICAgICAgICAgICAgZGVidWcoZXJyKQorICAgICAgICAgICAgICAgIGlmIGV4cGVjdGVkX2VycjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBidWYgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGRlYnVnKCJyZWFkICVkIGJ5dGVzIiAlIGxlbihidWYpKQorICAgICAgICAgICAgZGVidWcoIioqKioqKioqIG5leHQgdXJsIGNvbWluZyB1cC4uLiIpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgIGRlZiBfZXh0cmFfaGFuZGxlcnMoc2VsZik6CisgICAgICAgIGhhbmRsZXJzID0gW10KKworICAgICAgICBoYW5kbGVycy5hcHBlbmQodXJsbGliMi5Hb3BoZXJIYW5kbGVyKQorCisgICAgICAgIGNmaCA9IHVybGxpYjIuQ2FjaGVGVFBIYW5kbGVyKCkKKyAgICAgICAgY2ZoLnNldFRpbWVvdXQoMSkKKyAgICAgICAgaGFuZGxlcnMuYXBwZW5kKGNmaCkKKworICAgICAgICByZXR1cm4gaGFuZGxlcnMKKworCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoIm5ldHdvcmsiKQotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVVJMVGltZW91dFRlc3QsIHVybG9wZW5OZXR3b3JrVGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVUkxUaW1lb3V0VGVzdCwgdXJsb3Blbk5ldHdvcmtUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhUZXN0cywgT3RoZXJOZXR3b3JrVGVzdHMpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weSBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQppbmRleCA5NjM0ZWYyLi4zOTJlNWZhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CkBAIC03NjksMTAgKzc2OSw1NCBAQAogICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfa2V5ZWRfZGljdCgpCiAgICAgICAgIHNlbGYuY2hlY2tfaXRlcnMoZGljdCkKIAorICAgICAgICAjIFRlc3Qga2V5cmVmcygpCisgICAgICAgIHJlZnMgPSBkaWN0LmtleXJlZnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWZzKSwgbGVuKG9iamVjdHMpKQorICAgICAgICBvYmplY3RzMiA9IGxpc3Qob2JqZWN0cykKKyAgICAgICAgZm9yIHdyIGluIHJlZnM6CisgICAgICAgICAgICBvYiA9IHdyKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkaWN0Lmhhc19rZXkob2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9iIGluIGRpY3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLmFyZywgZGljdFtvYl0pCisgICAgICAgICAgICBvYmplY3RzMi5yZW1vdmUob2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9iamVjdHMyKSwgMCkKKworICAgICAgICAjIFRlc3QgaXRlcmtleXJlZnMoKQorICAgICAgICBvYmplY3RzMiA9IGxpc3Qob2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChkaWN0Lml0ZXJrZXlyZWZzKCkpKSwgbGVuKG9iamVjdHMpKQorICAgICAgICBmb3Igd3IgaW4gZGljdC5pdGVya2V5cmVmcygpOgorICAgICAgICAgICAgb2IgPSB3cigpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oZGljdC5oYXNfa2V5KG9iKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvYiBpbiBkaWN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYi5hcmcsIGRpY3Rbb2JdKQorICAgICAgICAgICAgb2JqZWN0czIucmVtb3ZlKG9iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvYmplY3RzMiksIDApCisKICAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9pdGVycyhzZWxmKToKICAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX3ZhbHVlZF9kaWN0KCkKICAgICAgICAgc2VsZi5jaGVja19pdGVycyhkaWN0KQogCisgICAgICAgICMgVGVzdCB2YWx1ZXJlZnMoKQorICAgICAgICByZWZzID0gZGljdC52YWx1ZXJlZnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWZzKSwgbGVuKG9iamVjdHMpKQorICAgICAgICBvYmplY3RzMiA9IGxpc3Qob2JqZWN0cykKKyAgICAgICAgZm9yIHdyIGluIHJlZnM6CisgICAgICAgICAgICBvYiA9IHdyKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IsIGRpY3Rbb2IuYXJnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iLmFyZ10uYXJnKQorICAgICAgICAgICAgb2JqZWN0czIucmVtb3ZlKG9iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvYmplY3RzMiksIDApCisKKyAgICAgICAgIyBUZXN0IGl0ZXJ2YWx1ZXJlZnMoKQorICAgICAgICBvYmplY3RzMiA9IGxpc3Qob2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChkaWN0Lml0ZXJ2YWx1ZXJlZnMoKSkpLCBsZW4ob2JqZWN0cykpCisgICAgICAgIGZvciB3ciBpbiBkaWN0Lml0ZXJ2YWx1ZXJlZnMoKToKKyAgICAgICAgICAgIG9iID0gd3IoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYiwgZGljdFtvYi5hcmddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYi5hcmcsIGRpY3Rbb2IuYXJnXS5hcmcpCisgICAgICAgICAgICBvYmplY3RzMi5yZW1vdmUob2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9iamVjdHMyKSwgMCkKKwogICAgIGRlZiBjaGVja19pdGVycyhzZWxmLCBkaWN0KToKICAgICAgICAgIyBpdGVtIGl0ZXJhdG9yOgogICAgICAgICBpdGVtcyA9IGRpY3QuaXRlbXMoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aXRoLnB5IGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CmluZGV4IDQ4ZTAwZjQuLjU3NTA1MDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpdGgucHkKQEAgLTE3LDE1ICsxNywxMCBAQAogY2xhc3MgTW9ja0NvbnRleHRNYW5hZ2VyKEdlbmVyYXRvckNvbnRleHRNYW5hZ2VyKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgZ2VuKToKICAgICAgICAgR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIuX19pbml0X18oc2VsZiwgZ2VuKQotICAgICAgICBzZWxmLmNvbnRleHRfY2FsbGVkID0gRmFsc2UKICAgICAgICAgc2VsZi5lbnRlcl9jYWxsZWQgPSBGYWxzZQogICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gRmFsc2UKICAgICAgICAgc2VsZi5leGl0X2FyZ3MgPSBOb25lCiAKLSAgICBkZWYgX19jb250ZXh0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuY29udGV4dF9jYWxsZWQgPSBUcnVlCi0gICAgICAgIHJldHVybiBHZW5lcmF0b3JDb250ZXh0TWFuYWdlci5fX2NvbnRleHRfXyhzZWxmKQotCiAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgc2VsZi5lbnRlcl9jYWxsZWQgPSBUcnVlCiAgICAgICAgIHJldHVybiBHZW5lcmF0b3JDb250ZXh0TWFuYWdlci5fX2VudGVyX18oc2VsZikKQEAgLTMzLDcgKzI4LDggQEAKICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgIHNlbGYuZXhpdF9jYWxsZWQgPSBUcnVlCiAgICAgICAgIHNlbGYuZXhpdF9hcmdzID0gKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spCi0gICAgICAgIHJldHVybiBHZW5lcmF0b3JDb250ZXh0TWFuYWdlci5fX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKQorICAgICAgICByZXR1cm4gR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIuX19leGl0X18oc2VsZiwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCB0cmFjZWJhY2spCiAKIAogZGVmIG1vY2tfY29udGV4dG1hbmFnZXIoZnVuYyk6CkBAIC02MCwyMSArNTYsMTcgQEAKIAogY2xhc3MgTmVzdGVkKG9iamVjdCk6CiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgKmNvbnRleHRzKToKLSAgICAgICAgc2VsZi5jb250ZXh0cyA9IGNvbnRleHRzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICptYW5hZ2Vycyk6CisgICAgICAgIHNlbGYubWFuYWdlcnMgPSBtYW5hZ2VycwogICAgICAgICBzZWxmLmVudGVyZWQgPSBOb25lCiAKLSAgICBkZWYgX19jb250ZXh0X18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmVudGVyZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNvbnRleHQgaXMgbm90IHJlZW50cmFudCIpCiAgICAgICAgIHNlbGYuZW50ZXJlZCA9IGRlcXVlKCkKICAgICAgICAgdmFycyA9IFtdCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGZvciBjb250ZXh0IGluIHNlbGYuY29udGV4dHM6Ci0gICAgICAgICAgICAgICAgbWdyID0gY29udGV4dC5fX2NvbnRleHRfXygpCisgICAgICAgICAgICBmb3IgbWdyIGluIHNlbGYubWFuYWdlcnM6CiAgICAgICAgICAgICAgICAgdmFycy5hcHBlbmQobWdyLl9fZW50ZXJfXygpKQogICAgICAgICAgICAgICAgIHNlbGYuZW50ZXJlZC5hcHBlbmRsZWZ0KG1ncikKICAgICAgICAgZXhjZXB0OgpAQCAtOTksMTcgKzkxLDEyIEBACiAKIAogY2xhc3MgTW9ja05lc3RlZChOZXN0ZWQpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqY29udGV4dHMpOgotICAgICAgICBOZXN0ZWQuX19pbml0X18oc2VsZiwgKmNvbnRleHRzKQotICAgICAgICBzZWxmLmNvbnRleHRfY2FsbGVkID0gRmFsc2UKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKm1hbmFnZXJzKToKKyAgICAgICAgTmVzdGVkLl9faW5pdF9fKHNlbGYsICptYW5hZ2VycykKICAgICAgICAgc2VsZi5lbnRlcl9jYWxsZWQgPSBGYWxzZQogICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gRmFsc2UKICAgICAgICAgc2VsZi5leGl0X2FyZ3MgPSBOb25lCiAKLSAgICBkZWYgX19jb250ZXh0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuY29udGV4dF9jYWxsZWQgPSBUcnVlCi0gICAgICAgIHJldHVybiBOZXN0ZWQuX19jb250ZXh0X18oc2VsZikKLQogICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIHNlbGYuZW50ZXJfY2FsbGVkID0gVHJ1ZQogICAgICAgICByZXR1cm4gTmVzdGVkLl9fZW50ZXJfXyhzZWxmKQpAQCAtMTI2LDI0ICsxMTMsOCBAQAogICAgICAgICAgICAgd2l0aCBmb286IHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yLCBmb29Ob3REZWNsYXJlZCkKIAotICAgIGRlZiB0ZXN0Q29udGV4dEF0dHJpYnV0ZUVycm9yKHNlbGYpOgotICAgICAgICBjbGFzcyBMYWNrc0NvbnRleHQob2JqZWN0KToKLSAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6Ci0gICAgICAgICAgICAgICAgcGFzcwotCi0gICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6Ci0gICAgICAgICAgICAgICAgcGFzcwotCi0gICAgICAgIGRlZiBmb29MYWNrc0NvbnRleHQoKToKLSAgICAgICAgICAgIGZvbyA9IExhY2tzQ29udGV4dCgpCi0gICAgICAgICAgICB3aXRoIGZvbzogcGFzcwotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZm9vTGFja3NDb250ZXh0KQotCiAgICAgZGVmIHRlc3RFbnRlckF0dHJpYnV0ZUVycm9yKHNlbGYpOgogICAgICAgICBjbGFzcyBMYWNrc0VudGVyKG9iamVjdCk6Ci0gICAgICAgICAgICBkZWYgX19jb250ZXh0X18oc2VsZik6Ci0gICAgICAgICAgICAgICAgcGFzcwotCiAgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgICAgICAgICAgcGFzcwogCkBAIC0xNTQsOSArMTI1LDYgQEAKIAogICAgIGRlZiB0ZXN0RXhpdEF0dHJpYnV0ZUVycm9yKHNlbGYpOgogICAgICAgICBjbGFzcyBMYWNrc0V4aXQob2JqZWN0KToKLSAgICAgICAgICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKLSAgICAgICAgICAgICAgICBwYXNzCi0KICAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcGFzcwogCkBAIC0xOTIsMjcgKzE2MCwxMCBAQAogICAgICAgICAgICAgJ3dpdGggbW9jayBhcyAoZm9vLCBOb25lLCBiYXIpOlxuJwogICAgICAgICAgICAgJyAgcGFzcycpCiAKLSAgICBkZWYgdGVzdENvbnRleHRUaHJvd3Moc2VsZik6Ci0gICAgICAgIGNsYXNzIENvbnRleHRUaHJvd3Mob2JqZWN0KToKLSAgICAgICAgICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKLSAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNvbnRleHQgdGhyZXciKQotCi0gICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgotICAgICAgICAgICAgY3QgPSBDb250ZXh0VGhyb3dzKCkKLSAgICAgICAgICAgIHNlbGYuZm9vID0gTm9uZQotICAgICAgICAgICAgd2l0aCBjdCBhcyBzZWxmLmZvbzoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2hvdWxkVGhyb3cpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mb28sIE5vbmUpCi0KICAgICBkZWYgdGVzdEVudGVyVGhyb3dzKHNlbGYpOgogICAgICAgICBjbGFzcyBFbnRlclRocm93cyhvYmplY3QpOgotICAgICAgICAgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0KICAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6Ci0gICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDb250ZXh0IHRocmV3IikKLQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiRW50ZXIgdGhyZXciKQogICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAgICAgICAgICBwYXNzCiAKQEAgLTIyNiw4ICsxNzcsNiBAQAogCiAgICAgZGVmIHRlc3RFeGl0VGhyb3dzKHNlbGYpOgogICAgICAgICBjbGFzcyBFeGl0VGhyb3dzKG9iamVjdCk6Ci0gICAgICAgICAgICBkZWYgX19jb250ZXh0X18oc2VsZik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgpAQCAtMjQxLDEzICsxOTAsMTEgQEAKICAgICBURVNUX0VYQ0VQVElPTiA9IFJ1bnRpbWVFcnJvcigidGVzdCBleGNlcHRpb24iKQogCiAgICAgZGVmIGFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKHNlbGYsIG1vY2tfbWFuYWdlcik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX21hbmFnZXIuY29udGV4dF9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX21hbmFnZXIuZW50ZXJfY2FsbGVkKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1vY2tfbWFuYWdlci5leGl0X2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21hbmFnZXIuZXhpdF9hcmdzLCBOb25lKQogCiAgICAgZGVmIGFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzKHNlbGYsIG1vY2tfbWFuYWdlciwgZXhpdF9hcmdzKToKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfbWFuYWdlci5jb250ZXh0X2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfbWFuYWdlci5lbnRlcl9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX21hbmFnZXIuZXhpdF9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tYW5hZ2VyLmV4aXRfYXJncywgZXhpdF9hcmdzKQpAQCAtMjY4LDcgKzIxNSw2IEBACiAgICAgICAgIHJhaXNlIHNlbGYuVEVTVF9FWENFUFRJT04KIAogICAgIGRlZiBhc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLCBtb2NrX21hbmFnZXIpOgotICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19tYW5hZ2VyLmNvbnRleHRfY2FsbGVkKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19tYW5hZ2VyLmVudGVyX2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfbWFuYWdlci5leGl0X2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21hbmFnZXIuZXhpdF9hcmdzWzBdLCBSdW50aW1lRXJyb3IpCkBAIC00NzIsNyArNDE4LDYgQEAKIAogICAgICAgICAjIFRoZSBpbm5lciBzdGF0ZW1lbnQgc3R1ZmYgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiB0b3VjaGVkCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iYXIsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobW9ja19iLmNvbnRleHRfY2FsbGVkKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1vY2tfYi5lbnRlcl9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobW9ja19iLmV4aXRfY2FsbGVkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfYi5leGl0X2FyZ3MsIE5vbmUpCkBAIC01MDYsMTMgKzQ1MSw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQogCiAgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMihzZWxmKToKLSAgICAgICAgY2xhc3MgY20gKG9iamVjdCk6Ci0gICAgICAgICAgICBkZWYgX19jb250ZXh0X18oc2VsZik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKLQorICAgICAgICBjbGFzcyBjbShvYmplY3QpOgogICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAgICAgICAgICBwYXNzCi0KICAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICAgICAgICAgICBwYXNzCiAKQEAgLTUzNSwxMiArNDc2LDggQEAKIAogICAgIGRlZiB0ZXN0UmFpc2VkR2VuZXJhdG9yRXhpdDIoc2VsZik6CiAgICAgICAgIGNsYXNzIGNtIChvYmplY3QpOgotICAgICAgICAgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0KICAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcGFzcwotCiAgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgICAgICAgICAgcGFzcwogCkBAIC02MjksNyArNTY2LDYgQEAKIAogICAgIGRlZiB0ZXN0TXVsdGlwbGVDb21wbGV4VGFyZ2V0cyhzZWxmKToKICAgICAgICAgY2xhc3MgQzoKLSAgICAgICAgICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKTogcmV0dXJuIHNlbGYKICAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6IHJldHVybiAxLCAyLCAzCiAgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdCwgdiwgdGIpOiBwYXNzCiAgICAgICAgIHRhcmdldHMgPSB7MTogWzAsIDEsIDJdfQpAQCAtNjUxLDcgKzU4Nyw2IEBACiAKICAgICBkZWYgdGVzdEV4aXRUcnVlU3dhbGxvd3NFeGNlcHRpb24oc2VsZik6CiAgICAgICAgIGNsYXNzIEFmcmljYW5Td2FsbG93OgotICAgICAgICAgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOiByZXR1cm4gc2VsZgogICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKTogcGFzcwogICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHQsIHYsIHRiKTogcmV0dXJuIFRydWUKICAgICAgICAgdHJ5OgpAQCAtNjYyLDcgKzU5Nyw2IEBACiAKICAgICBkZWYgdGVzdEV4aXRGYWxzZURvZXNudFN3YWxsb3dFeGNlcHRpb24oc2VsZik6CiAgICAgICAgIGNsYXNzIEV1cm9wZWFuU3dhbGxvdzoKLSAgICAgICAgICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKTogcmV0dXJuIHNlbGYKICAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6IHBhc3MKICAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0LCB2LCB0Yik6IHJldHVybiBGYWxzZQogICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3psaWIucHkgYi9MaWIvdGVzdC90ZXN0X3psaWIucHkKaW5kZXggNzYzNDY4MC4uY2NiYzhmZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQpAQCAtMzAyLDYgKzMwMiw2MyBAQAogICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby5mbHVzaCgpLCAiIikgIyBSZXR1cm5zIG5vdGhpbmcKIAorICAgIGRlZiB0ZXN0X2NvbXByZXNzY29weShzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QKKyAgICAgICAgZGF0YTAgPSBIQU1MRVRfU0NFTkUKKyAgICAgICAgZGF0YTEgPSBIQU1MRVRfU0NFTkUuc3dhcGNhc2UoKQorICAgICAgICBjMCA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCisgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKKworICAgICAgICBjMSA9IGMwLmNvcHkoKQorICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCisKKyAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKKyAgICAgICAgYnVmczAuYXBwZW5kKGMwLmZsdXNoKCkpCisgICAgICAgIHMwID0gJycuam9pbihidWZzMCkKKworICAgICAgICBidWZzMS5hcHBlbmQoYzEuY29tcHJlc3MoZGF0YTEpKQorICAgICAgICBidWZzMS5hcHBlbmQoYzEuZmx1c2goKSkKKyAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHMwKSxkYXRhMCtkYXRhMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczEpLGRhdGEwK2RhdGExKQorCisgICAgZGVmIHRlc3RfYmFkY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKKyAgICAgICAgYyA9IHpsaWIuY29tcHJlc3NvYmooKQorICAgICAgICBjLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgYy5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGMuY29weSkKKworICAgIGRlZiB0ZXN0X2RlY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAjIFRlc3QgY29weWluZyBhIGRlY29tcHJlc3Npb24gb2JqZWN0CisgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUKKyAgICAgICAgY29tcCA9IHpsaWIuY29tcHJlc3MoZGF0YSkKKworICAgICAgICBkMCA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgYnVmczAuYXBwZW5kKGQwLmRlY29tcHJlc3MoY29tcFs6MzJdKSkKKworICAgICAgICBkMSA9IGQwLmNvcHkoKQorICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCisKKyAgICAgICAgYnVmczAuYXBwZW5kKGQwLmRlY29tcHJlc3MoY29tcFszMjpdKSkKKyAgICAgICAgczAgPSAnJy5qb2luKGJ1ZnMwKQorCisgICAgICAgIGJ1ZnMxLmFwcGVuZChkMS5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCisgICAgICAgIHMxID0gJycuam9pbihidWZzMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLGRhdGEpCisKKyAgICBkZWYgdGVzdF9iYWRkZWNvbXByZXNzY29weShzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlCisgICAgICAgIGRhdGEgPSB6bGliLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIGQuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICBkLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZC5jb3B5KQogCiBkZWYgZ2VuYmxvY2soc2VlZCwgbGVuZ3RoLCBzdGVwPTEwMjQsIGdlbmVyYXRvcj1yYW5kb20pOgogICAgICIiImxlbmd0aC1ieXRlIHN0cmVhbSBvZiByYW5kb20gZGF0YSBmcm9tIGEgc2VlZCAoaW4gc3RlcC1ieXRlIGJsb2NrcykuIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0dGFyLnRhciBiL0xpYi90ZXN0L3Rlc3R0YXIudGFyCmluZGV4IDhmZDBjNTAuLjFmNDQ5M2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3R0YXIudGFyCisrKyBiL0xpYi90ZXN0L3Rlc3R0YXIudGFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3RocmVhZGVkX2ltcG9ydF9oYW5nZXJzLnB5IGIvTGliL3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxYzUyZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3RocmVhZGVkX2ltcG9ydF9oYW5nZXJzLnB5CkBAIC0wLDAgKzEsNDIgQEAKKyMgVGhpcyBpcyBhIGhlbHBlciBtb2R1bGUgZm9yIHRlc3RfdGhyZWFkZWRfaW1wb3J0LiAgVGhlIHRlc3QgaW1wb3J0cyB0aGlzCisjIG1vZHVsZSwgYW5kIHRoaXMgbW9kdWxlIHRyaWVzIHRvIHJ1biB2YXJpb3VzIFB5dGhvbiBsaWJyYXJ5IGZ1bmN0aW9ucyBpbgorIyB0aGVpciBvd24gdGhyZWFkLCBhcyBhIHNpZGUgZWZmZWN0IG9mIGJlaW5nIGltcG9ydGVkLiAgSWYgdGhlIHNwYXduZWQKKyMgdGhyZWFkIGRvZXNuJ3QgY29tcGxldGUgaW4gVElNRU9VVCBzZWNvbmRzLCBhbiAiYXBwZWFyZWQgdG8gaGFuZyIgbWVzc2FnZQorIyBpcyBhcHBlbmRlZCB0byB0aGUgbW9kdWxlLWdsb2JhbCBgZXJyb3JzYCBsaXN0LiAgVGhhdCBsaXN0IHJlbWFpbnMgZW1wdHkKKyMgaWYgKGFuZCBvbmx5IGlmKSBhbGwgZnVuY3Rpb25zIHRlc3RlZCBjb21wbGV0ZS4KKworVElNRU9VVCA9IDEwCisKK2ltcG9ydCB0aHJlYWRpbmcKKworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgb3MucGF0aAorCitlcnJvcnMgPSBbXQorCisjIFRoaXMgY2xhc3MgbWVyZWx5IHJ1bnMgYSBmdW5jdGlvbiBpbiBpdHMgb3duIHRocmVhZCBULiAgVGhlIHRocmVhZCBpbXBvcnRpbmcKKyMgdGhpcyBtb2R1bGUgaG9sZHMgdGhlIGltcG9ydCBsb2NrLCBzbyBpZiB0aGUgZnVuY3Rpb24gY2FsbGVkIGJ5IFQgdHJpZXMKKyMgdG8gZG8gaXRzIG93biBpbXBvcnRzIGl0IHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgdGhpcyBtb2R1bGUncyBpbXBvcnQKKyMgdG8gY29tcGxldGUuCitjbGFzcyBXb3JrZXIodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmN0aW9uLCBhcmdzKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gZnVuY3Rpb24KKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5mdW5jdGlvbigqc2VsZi5hcmdzKQorCitmb3IgbmFtZSwgZnVuYywgYXJncyBpbiBbCisgICAgICAgICMgQnVnIDE0NzM3NjogIFRlbXBvcmFyeUZpbGUgaHVuZyBvbiBXaW5kb3dzLCBzdGFydGluZyBpbiBQeXRob24gMi40LgorICAgICAgICAoInRlbXBmaWxlLlRlbXBvcmFyeUZpbGUiLCB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlLCAoKSksCisKKyAgICAgICAgIyBUaGUgcmVhbCBjYXVzZSBmb3IgYnVnIDE0NzM3NjogIG50cGF0aC5hYnNwYXRoKCkgY2F1c2VkIHRoZSBoYW5nLgorICAgICAgICAoIm9zLnBhdGguYWJzcGF0aCIsIG9zLnBhdGguYWJzcGF0aCwgKCcuJywpKSwKKyAgICAgICAgXToKKworICAgIHQgPSBXb3JrZXIoZnVuYywgYXJncykKKyAgICB0LnN0YXJ0KCkKKyAgICB0LmpvaW4oVElNRU9VVCkKKyAgICBpZiB0LmlzQWxpdmUoKToKKyAgICAgICAgZXJyb3JzLmFwcGVuZCgiJXMgYXBwZWFyZWQgdG8gaGFuZyIgJSBuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3RocmVhZGluZy5weSBiL0xpYi90aHJlYWRpbmcucHkKaW5kZXggY2MxYWRjZS4uYzI3MTQwZCAxMDA2NDQKLS0tIGEvTGliL3RocmVhZGluZy5weQorKysgYi9MaWIvdGhyZWFkaW5nLnB5CkBAIC05MCw5ICs5MCw2IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fX293bmVyIGFuZCBzZWxmLl9fb3duZXIuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgIHNlbGYuX19jb3VudCkKIAotICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQogICAgIGRlZiBhY3F1aXJlKHNlbGYsIGJsb2NraW5nPTEpOgogICAgICAgICBtZSA9IGN1cnJlbnRUaHJlYWQoKQogICAgICAgICBpZiBzZWxmLl9fb3duZXIgaXMgbWU6CkBAIC0xNjQsNyArMTYxLDYgQEAKICAgICAgICAgc2VsZi5fX2xvY2sgPSBsb2NrCiAgICAgICAgICMgRXhwb3J0IHRoZSBsb2NrJ3MgYWNxdWlyZSgpIGFuZCByZWxlYXNlKCkgbWV0aG9kcwogICAgICAgICBzZWxmLmFjcXVpcmUgPSBsb2NrLmFjcXVpcmUKLSAgICAgICAgc2VsZi5fX2VudGVyX18gPSBzZWxmLmFjcXVpcmUKICAgICAgICAgc2VsZi5yZWxlYXNlID0gbG9jay5yZWxlYXNlCiAgICAgICAgICMgSWYgdGhlIGxvY2sgZGVmaW5lcyBfcmVsZWFzZV9zYXZlKCkgYW5kL29yIF9hY3F1aXJlX3Jlc3RvcmUoKSwKICAgICAgICAgIyB0aGVzZSBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgKHdoaWNoIGp1c3QgY2FsbApAQCAtMTgzLDExICsxNzksMTEgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgc2VsZi5fX3dhaXRlcnMgPSBbXQogCi0gICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fbG9jay5fX2VudGVyX18oKQogCi0gICAgZGVmIF9fZXhpdF9fKHNlbGYsIHQsIHYsIHRiKToKLSAgICAgICAgc2VsZi5yZWxlYXNlKCkKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2xvY2suX19leGl0X18oKmFyZ3MpCiAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiPENvbmRpdGlvbiglcywgJWQpPiIgJSAoc2VsZi5fX2xvY2ssIGxlbihzZWxmLl9fd2FpdGVycykpCkBAIC0yODIsOSArMjc4LDYgQEAKICAgICAgICAgc2VsZi5fX2NvbmQgPSBDb25kaXRpb24oTG9jaygpKQogICAgICAgICBzZWxmLl9fdmFsdWUgPSB2YWx1ZQogCi0gICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgotCiAgICAgZGVmIGFjcXVpcmUoc2VsZiwgYmxvY2tpbmc9MSk6CiAgICAgICAgIHJjID0gRmFsc2UKICAgICAgICAgc2VsZi5fX2NvbmQuYWNxdWlyZSgpCmRpZmYgLS1naXQgYS9MaWIvdHJhY2UucHkgYi9MaWIvdHJhY2UucHkKaW5kZXggNzk5YzMwMi4uY2E2Mjk0ZSAxMDA2NDQKLS0tIGEvTGliL3RyYWNlLnB5CisrKyBiL0xpYi90cmFjZS5weQpAQCAtMzUsMTUgKzM1LDE3IEBACiAgIHRyYWNlLnB5IC0tdHJhY2tjYWxscyBzcGFtLnB5IGVnZ3MKIAogU2FtcGxlIHVzZSwgcHJvZ3JhbW1hdGljYWxseQotICAgIyBjcmVhdGUgYSBUcmFjZSBvYmplY3QsIHRlbGxpbmcgaXQgd2hhdCB0byBpZ25vcmUsIGFuZCB3aGV0aGVyIHRvCi0gICAjIGRvIHRyYWNpbmcgb3IgbGluZS1jb3VudGluZyBvciBib3RoLgotICAgdHJhY2UgPSB0cmFjZS5UcmFjZShpZ25vcmVkaXJzPVtzeXMucHJlZml4LCBzeXMuZXhlY19wcmVmaXgsXSwgdHJhY2U9MCwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnQ9MSkKLSAgICMgcnVuIHRoZSBuZXcgY29tbWFuZCB1c2luZyB0aGUgZ2l2ZW4gdHJhY2UKLSAgIHRyYWNlLnJ1bignbWFpbigpJykKLSAgICMgbWFrZSBhIHJlcG9ydCwgdGVsbGluZyBpdCB3aGVyZSB5b3Ugd2FudCBvdXRwdXQKLSAgIHIgPSB0cmFjZS5yZXN1bHRzKCkKLSAgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSkKKyAgaW1wb3J0IHN5cworCisgICMgY3JlYXRlIGEgVHJhY2Ugb2JqZWN0LCB0ZWxsaW5nIGl0IHdoYXQgdG8gaWdub3JlLCBhbmQgd2hldGhlciB0bworICAjIGRvIHRyYWNpbmcgb3IgbGluZS1jb3VudGluZyBvciBib3RoLgorICB0cmFjZXIgPSB0cmFjZS5UcmFjZShpZ25vcmVkaXJzPVtzeXMucHJlZml4LCBzeXMuZXhlY19wcmVmaXgsXSwgdHJhY2U9MCwKKyAgICAgICAgICAgICAgICAgICAgY291bnQ9MSkKKyAgIyBydW4gdGhlIG5ldyBjb21tYW5kIHVzaW5nIHRoZSBnaXZlbiB0cmFjZXIKKyAgdHJhY2VyLnJ1bignbWFpbigpJykKKyAgIyBtYWtlIGEgcmVwb3J0LCBwbGFjaW5nIG91dHB1dCBpbiAvdG1wCisgIHIgPSB0cmFjZXIucmVzdWx0cygpCisgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSwgY292ZXJkaXI9Ii90bXAiKQogIiIiCiAKIGltcG9ydCBsaW5lY2FjaGUKZGlmZiAtLWdpdCBhL0xpYi90cmFjZWJhY2sucHkgYi9MaWIvdHJhY2ViYWNrLnB5CmluZGV4IGFiZGE0MjIuLmY1YzRiMjkgMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZWJhY2sucHkKKysrIGIvTGliL3RyYWNlYmFjay5weQpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgIiIiCiAgICAgbGlzdCA9IFtdCiAgICAgaWYgKHR5cGUoZXR5cGUpID09IHR5cGVzLkNsYXNzVHlwZQotICAgICAgICBvciAoaXNpbnN0YW5jZShldHlwZSwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXR5cGUsIEV4Y2VwdGlvbikpKToKKyAgICAgICAgb3IgKGlzaW5zdGFuY2UoZXR5cGUsIHR5cGUpIGFuZCBpc3N1YmNsYXNzKGV0eXBlLCBCYXNlRXhjZXB0aW9uKSkpOgogICAgICAgICBzdHlwZSA9IGV0eXBlLl9fbmFtZV9fCiAgICAgZWxzZToKICAgICAgICAgc3R5cGUgPSBldHlwZQpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi5weSBiL0xpYi91cmxsaWIucHkKaW5kZXggZDY1YzBiMC4uZjBhZTUzYSAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi5weQorKysgYi9MaWIvdXJsbGliLnB5CkBAIC04NTcsMTMgKzg1Nyw2IEBACiAgICAgICAgICAgICBzZWxmLmZ0cC52b2lkY21kKGNtZCkKICAgICAgICAgY29ubiA9IE5vbmUKICAgICAgICAgaWYgZmlsZSBhbmQgbm90IGlzZGlyOgotICAgICAgICAgICAgIyBVc2UgbmxzdCB0byBzZWUgaWYgdGhlIGZpbGUgZXhpc3RzIGF0IGFsbAotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuZnRwLm5sc3QoZmlsZSkKLSAgICAgICAgICAgIGV4Y2VwdCBmdHBsaWIuZXJyb3JfcGVybSwgcmVhc29uOgotICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnZnRwIGVycm9yJywgcmVhc29uKSwgc3lzLmV4Y19pbmZvKClbMl0KLSAgICAgICAgICAgICMgUmVzdG9yZSB0aGUgdHJhbnNmZXIgbW9kZSEKLSAgICAgICAgICAgIHNlbGYuZnRwLnZvaWRjbWQoY21kKQogICAgICAgICAgICAgIyBUcnkgdG8gcmV0cmlldmUgYXMgYSBmaWxlCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgY21kID0gJ1JFVFIgJyArIGZpbGUKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIyLnB5IGIvTGliL3VybGxpYjIucHkKaW5kZXggZWMwMWM4Zi4uY2RiM2EyMiAxMDA2NDQKLS0tIGEvTGliL3VybGxpYjIucHkKKysrIGIvTGliL3VybGxpYjIucHkKQEAgLTg1LDIzICs4NSwxOCBAQAogIyBhYnN0cmFjdCBmYWN0b3J5IGZvciBvcGVuZXIKIAogaW1wb3J0IGJhc2U2NAotaW1wb3J0IGZ0cGxpYgoraW1wb3J0IGhhc2hsaWIKIGltcG9ydCBodHRwbGliCi1pbXBvcnQgaW5zcGVjdAotaW1wb3J0IG1kNQotaW1wb3J0IG1pbWV0eXBlcwogaW1wb3J0IG1pbWV0b29scwogaW1wb3J0IG9zCiBpbXBvcnQgcG9zaXhwYXRoCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgcmUKLWltcG9ydCBzaGEKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgdXJscGFyc2UKIGltcG9ydCBiaXNlY3QKLWltcG9ydCBjb29raWVsaWIKIAogdHJ5OgogICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpAQCAtMTY5LDYgKzE2NCwyMyBAQAogY2xhc3MgR29waGVyRXJyb3IoVVJMRXJyb3IpOgogICAgIHBhc3MKIAorIyBjb3BpZWQgZnJvbSBjb29raWVsaWIucHkKK19jdXRfcG9ydF9yZSA9IHJlLmNvbXBpbGUociI6XGQrJCIpCitkZWYgcmVxdWVzdF9ob3N0KHJlcXVlc3QpOgorICAgICIiIlJldHVybiByZXF1ZXN0LWhvc3QsIGFzIGRlZmluZWQgYnkgUkZDIDI5NjUuCisKKyAgICBWYXJpYXRpb24gZnJvbSBSRkM6IHJldHVybmVkIHZhbHVlIGlzIGxvd2VyY2FzZWQsIGZvciBjb252ZW5pZW50CisgICAgY29tcGFyaXNvbi4KKworICAgICIiIgorICAgIHVybCA9IHJlcXVlc3QuZ2V0X2Z1bGxfdXJsKCkKKyAgICBob3N0ID0gdXJscGFyc2UudXJscGFyc2UodXJsKVsxXQorICAgIGlmIGhvc3QgPT0gIiI6CisgICAgICAgIGhvc3QgPSByZXF1ZXN0LmdldF9oZWFkZXIoIkhvc3QiLCAiIikKKworICAgICMgcmVtb3ZlIHBvcnQsIGlmIHByZXNlbnQKKyAgICBob3N0ID0gX2N1dF9wb3J0X3JlLnN1YigiIiwgaG9zdCwgMSkKKyAgICByZXR1cm4gaG9zdC5sb3dlcigpCiAKIGNsYXNzIFJlcXVlc3Q6CiAKQEAgLTE4Niw3ICsxOTgsNyBAQAogICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKGtleSwgdmFsdWUpCiAgICAgICAgIHNlbGYudW5yZWRpcmVjdGVkX2hkcnMgPSB7fQogICAgICAgICBpZiBvcmlnaW5fcmVxX2hvc3QgaXMgTm9uZToKLSAgICAgICAgICAgIG9yaWdpbl9yZXFfaG9zdCA9IGNvb2tpZWxpYi5yZXF1ZXN0X2hvc3Qoc2VsZikKKyAgICAgICAgICAgIG9yaWdpbl9yZXFfaG9zdCA9IHJlcXVlc3RfaG9zdChzZWxmKQogICAgICAgICBzZWxmLm9yaWdpbl9yZXFfaG9zdCA9IG9yaWdpbl9yZXFfaG9zdAogICAgICAgICBzZWxmLnVudmVyaWZpYWJsZSA9IHVudmVyaWZpYWJsZQogCkBAIC00MTQsNiArNDI2LDkgQEAKICAgICBJZiBhbnkgb2YgdGhlIGhhbmRsZXJzIHBhc3NlZCBhcyBhcmd1bWVudHMgYXJlIHN1YmNsYXNzZXMgb2YgdGhlCiAgICAgZGVmYXVsdCBoYW5kbGVycywgdGhlIGRlZmF1bHQgaGFuZGxlcnMgd2lsbCBub3QgYmUgdXNlZC4KICAgICAiIiIKKyAgICBpbXBvcnQgdHlwZXMKKyAgICBkZWYgaXNjbGFzcyhvYmopOgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmosIHR5cGVzLkNsYXNzVHlwZSkgb3IgaGFzYXR0cihvYmosICJfX2Jhc2VzX18iKQogCiAgICAgb3BlbmVyID0gT3BlbmVyRGlyZWN0b3IoKQogICAgIGRlZmF1bHRfY2xhc3NlcyA9IFtQcm94eUhhbmRsZXIsIFVua25vd25IYW5kbGVyLCBIVFRQSGFuZGxlciwKQEAgLTQyNCw3ICs0MzksNyBAQAogICAgIHNraXAgPSBbXQogICAgIGZvciBrbGFzcyBpbiBkZWZhdWx0X2NsYXNzZXM6CiAgICAgICAgIGZvciBjaGVjayBpbiBoYW5kbGVyczoKLSAgICAgICAgICAgIGlmIGluc3BlY3QuaXNjbGFzcyhjaGVjayk6CisgICAgICAgICAgICBpZiBpc2NsYXNzKGNoZWNrKToKICAgICAgICAgICAgICAgICBpZiBpc3N1YmNsYXNzKGNoZWNrLCBrbGFzcyk6CiAgICAgICAgICAgICAgICAgICAgIHNraXAuYXBwZW5kKGtsYXNzKQogICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNoZWNrLCBrbGFzcyk6CkBAIC00MzYsNyArNDUxLDcgQEAKICAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGtsYXNzKCkpCiAKICAgICBmb3IgaCBpbiBoYW5kbGVyczoKLSAgICAgICAgaWYgaW5zcGVjdC5pc2NsYXNzKGgpOgorICAgICAgICBpZiBpc2NsYXNzKGgpOgogICAgICAgICAgICAgaCA9IGgoKQogICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaCkKICAgICByZXR1cm4gb3BlbmVyCkBAIC02MTIsNyArNjI3LDYgQEAKICAgICAoJ2h0dHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tJykKIAogICAgICIiIgotICAgIGZyb20gdXJscGFyc2UgaW1wb3J0IF9zcGxpdG5ldGxvYwogICAgIHNjaGVtZSwgcl9zY2hlbWUgPSBzcGxpdHR5cGUocHJveHkpCiAgICAgaWYgbm90IHJfc2NoZW1lLnN0YXJ0c3dpdGgoIi8iKToKICAgICAgICAgIyBhdXRob3JpdHkKQEAgLTY3Myw2ICs2ODcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4ocmVxKQogCiBjbGFzcyBIVFRQUGFzc3dvcmRNZ3I6CisKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYucGFzc3dkID0ge30KIApAQCAtNjk2LDEwICs3MTEsMTUgQEAKIAogICAgIGRlZiByZWR1Y2VfdXJpKHNlbGYsIHVyaSk6CiAgICAgICAgICIiIkFjY2VwdCBuZXRsb2Mgb3IgVVJJIGFuZCBleHRyYWN0IG9ubHkgdGhlIG5ldGxvYyBhbmQgcGF0aCIiIgotICAgICAgICBwYXJ0cyA9IHVybHBhcnNlLnVybHBhcnNlKHVyaSkKKyAgICAgICAgcGFydHMgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmkpCiAgICAgICAgIGlmIHBhcnRzWzFdOgorICAgICAgICAgICAgIyBVUkkKICAgICAgICAgICAgIHJldHVybiBwYXJ0c1sxXSwgcGFydHNbMl0gb3IgJy8nCisgICAgICAgIGVsaWYgcGFydHNbMF06CisgICAgICAgICAgICAjIGhvc3Q6cG9ydAorICAgICAgICAgICAgcmV0dXJuIHVyaSwgJy8nCiAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGhvc3QKICAgICAgICAgICAgIHJldHVybiBwYXJ0c1syXSwgJy8nCiAKICAgICBkZWYgaXNfc3VidXJpKHNlbGYsIGJhc2UsIHRlc3QpOgpAQCAtNzQyLDYgKzc2Miw4IEBACiAgICAgICAgIHNlbGYuYWRkX3Bhc3N3b3JkID0gc2VsZi5wYXNzd2QuYWRkX3Bhc3N3b3JkCiAKICAgICBkZWYgaHR0cF9lcnJvcl9hdXRoX3JlcWVkKHNlbGYsIGF1dGhyZXEsIGhvc3QsIHJlcSwgaGVhZGVycyk6CisgICAgICAgICMgaG9zdCBtYXkgYmUgYW4gYXV0aG9yaXR5ICh3aXRob3V0IHVzZXJpbmZvKSBvciBhIFVSTCB3aXRoIGFuCisgICAgICAgICMgYXV0aG9yaXR5CiAgICAgICAgICMgWFhYIGNvdWxkIGJlIG11bHRpcGxlIGhlYWRlcnMKICAgICAgICAgYXV0aHJlcSA9IGhlYWRlcnMuZ2V0KGF1dGhyZXEsIE5vbmUpCiAgICAgICAgIGlmIGF1dGhyZXE6CkBAIC03NTIsMTAgKzc3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHJ5X2h0dHBfYmFzaWNfYXV0aChob3N0LCByZXEsIHJlYWxtKQogCiAgICAgZGVmIHJldHJ5X2h0dHBfYmFzaWNfYXV0aChzZWxmLCBob3N0LCByZXEsIHJlYWxtKToKLSAgICAgICAgIyBUT0RPKGpoeWx0b24pOiBSZW1vdmUgdGhlIGhvc3QgYXJndW1lbnQ/IEl0IGRlcGVuZHMgb24gd2hldGhlcgotICAgICAgICAjIHJldHJ5X2h0dHBfYmFzaWNfYXV0aCgpIGlzIGNvbnNpZGVyIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuCi0gICAgICAgICMgSXQgcHJvYmFibHkgaXMuCi0gICAgICAgIHVzZXIsIHB3ID0gc2VsZi5wYXNzd2QuZmluZF91c2VyX3Bhc3N3b3JkKHJlYWxtLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCisgICAgICAgIHVzZXIsIHB3ID0gc2VsZi5wYXNzd2QuZmluZF91c2VyX3Bhc3N3b3JkKHJlYWxtLCBob3N0KQogICAgICAgICBpZiBwdyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHJhdyA9ICIlczolcyIgJSAodXNlciwgcHcpCiAgICAgICAgICAgICBhdXRoID0gJ0Jhc2ljICVzJyAlIGJhc2U2NC5lbmNvZGVzdHJpbmcocmF3KS5zdHJpcCgpCkBAIC03NjYsMTQgKzc4NSwxNSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAorCiBjbGFzcyBIVFRQQmFzaWNBdXRoSGFuZGxlcihBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIsIEJhc2VIYW5kbGVyKToKIAogICAgIGF1dGhfaGVhZGVyID0gJ0F1dGhvcml6YXRpb24nCiAKICAgICBkZWYgaHR0cF9lcnJvcl80MDEoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKLSAgICAgICAgaG9zdCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS5nZXRfZnVsbF91cmwoKSlbMV0KKyAgICAgICAgdXJsID0gcmVxLmdldF9mdWxsX3VybCgpCiAgICAgICAgIHJldHVybiBzZWxmLmh0dHBfZXJyb3JfYXV0aF9yZXFlZCgnd3d3LWF1dGhlbnRpY2F0ZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LCByZXEsIGhlYWRlcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwsIHJlcSwgaGVhZGVycykKIAogCiBjbGFzcyBQcm94eUJhc2ljQXV0aEhhbmRsZXIoQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyLCBCYXNlSGFuZGxlcik6CkBAIC03ODEsOSArODAxLDEzIEBACiAgICAgYXV0aF9oZWFkZXIgPSAnUHJveHktYXV0aG9yaXphdGlvbicKIAogICAgIGRlZiBodHRwX2Vycm9yXzQwNyhzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgotICAgICAgICBob3N0ID0gcmVxLmdldF9ob3N0KCkKKyAgICAgICAgIyBodHRwX2Vycm9yX2F1dGhfcmVxZWQgcmVxdWlyZXMgdGhhdCB0aGVyZSBpcyBubyB1c2VyaW5mbyBjb21wb25lbnQgaW4KKyAgICAgICAgIyBhdXRob3JpdHkuICBBc3N1bWUgdGhlcmUgaXNuJ3Qgb25lLCBzaW5jZSB1cmxsaWIyIGRvZXMgbm90IChhbmQKKyAgICAgICAgIyBzaG91bGQgbm90LCBSRkMgMzk4NiBzLiAzLjIuMSkgc3VwcG9ydCByZXF1ZXN0cyBmb3IgVVJMcyBjb250YWluaW5nCisgICAgICAgICMgdXNlcmluZm8uCisgICAgICAgIGF1dGhvcml0eSA9IHJlcS5nZXRfaG9zdCgpCiAgICAgICAgIHJldHVybiBzZWxmLmh0dHBfZXJyb3JfYXV0aF9yZXFlZCgncHJveHktYXV0aGVudGljYXRlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHJlcSwgaGVhZGVycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eSwgcmVxLCBoZWFkZXJzKQogCiAKIGRlZiByYW5kb21ieXRlcyhuKToKQEAgLTgzOCw5ICs4NjIsNiBAQAogICAgICAgICAgICAgc2NoZW1lID0gYXV0aHJlcS5zcGxpdCgpWzBdCiAgICAgICAgICAgICBpZiBzY2hlbWUubG93ZXIoKSA9PSAnZGlnZXN0JzoKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXRyeV9odHRwX2RpZ2VzdF9hdXRoKHJlcSwgYXV0aHJlcSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciBkb2Vzbid0IGtub3cgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFib3V0ICVzIiUoc2NoZW1lKSkKIAogICAgIGRlZiByZXRyeV9odHRwX2RpZ2VzdF9hdXRoKHNlbGYsIHJlcSwgYXV0aCk6CiAgICAgICAgIHRva2VuLCBjaGFsbGVuZ2UgPSBhdXRoLnNwbGl0KCcgJywgMSkKQEAgLTg1MCw3ICs4NzEsNyBAQAogICAgICAgICAgICAgYXV0aF92YWwgPSAnRGlnZXN0ICVzJyAlIGF1dGgKICAgICAgICAgICAgIGlmIHJlcS5oZWFkZXJzLmdldChzZWxmLmF1dGhfaGVhZGVyLCBOb25lKSA9PSBhdXRoX3ZhbDoKICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoc2VsZi5hdXRoX2hlYWRlciwgYXV0aF92YWwpCisgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoc2VsZi5hdXRoX2hlYWRlciwgYXV0aF92YWwpCiAgICAgICAgICAgICByZXNwID0gc2VsZi5wYXJlbnQub3BlbihyZXEpCiAgICAgICAgICAgICByZXR1cm4gcmVzcAogCkBAIC04NjAsOCArODgxLDggQEAKICAgICAgICAgIyBhbmQgc2VydmVyIHRvIGF2b2lkIGNob3NlbiBwbGFpbnRleHQgYXR0YWNrcywgdG8gcHJvdmlkZSBtdXR1YWwKICAgICAgICAgIyBhdXRoZW50aWNhdGlvbiwgYW5kIHRvIHByb3ZpZGUgc29tZSBtZXNzYWdlIGludGVncml0eSBwcm90ZWN0aW9uLgogICAgICAgICAjIFRoaXMgaXNuJ3QgYSBmYWJ1bG91cyBlZmZvcnQsIGJ1dCBpdCdzIHByb2JhYmx5IEdvb2QgRW5vdWdoLgotICAgICAgICBkaWcgPSBzaGEubmV3KCIlczolczolczolcyIgJSAoc2VsZi5ub25jZV9jb3VudCwgbm9uY2UsIHRpbWUuY3RpbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbWJ5dGVzKDgpKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgZGlnID0gaGFzaGxpYi5zaGExKCIlczolczolczolcyIgJSAoc2VsZi5ub25jZV9jb3VudCwgbm9uY2UsIHRpbWUuY3RpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tYnl0ZXMoOCkpKS5oZXhkaWdlc3QoKQogICAgICAgICByZXR1cm4gZGlnWzoxNl0KIAogICAgIGRlZiBnZXRfYXV0aG9yaXphdGlvbihzZWxmLCByZXEsIGNoYWwpOgpAQCAtOTIzLDkgKzk0NCw5IEBACiAgICAgZGVmIGdldF9hbGdvcml0aG1faW1wbHMoc2VsZiwgYWxnb3JpdGhtKToKICAgICAgICAgIyBsYW1iZGFzIGFzc3VtZSBkaWdlc3QgbW9kdWxlcyBhcmUgaW1wb3J0ZWQgYXQgdGhlIHRvcCBsZXZlbAogICAgICAgICBpZiBhbGdvcml0aG0gPT0gJ01ENSc6Ci0gICAgICAgICAgICBIID0gbGFtYmRhIHg6IG1kNS5uZXcoeCkuaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIEggPSBsYW1iZGEgeDogaGFzaGxpYi5tZDUoeCkuaGV4ZGlnZXN0KCkKICAgICAgICAgZWxpZiBhbGdvcml0aG0gPT0gJ1NIQSc6Ci0gICAgICAgICAgICBIID0gbGFtYmRhIHg6IHNoYS5uZXcoeCkuaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIEggPSBsYW1iZGEgeDogaGFzaGxpYi5zaGExKHgpLmhleGRpZ2VzdCgpCiAgICAgICAgICMgWFhYIE1ENS1zZXNzCiAgICAgICAgIEtEID0gbGFtYmRhIHMsIGQ6IEgoIiVzOiVzIiAlIChzLCBkKSkKICAgICAgICAgcmV0dXJuIEgsIEtECkBAIC0xMDY2LDYgKzEwODcsNyBAQAogCiBjbGFzcyBIVFRQQ29va2llUHJvY2Vzc29yKEJhc2VIYW5kbGVyKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgY29va2llamFyPU5vbmUpOgorICAgICAgICBpbXBvcnQgY29va2llbGliCiAgICAgICAgIGlmIGNvb2tpZWphciBpcyBOb25lOgogICAgICAgICAgICAgY29va2llamFyID0gY29va2llbGliLkNvb2tpZUphcigpCiAgICAgICAgIHNlbGYuY29va2llamFyID0gY29va2llamFyCkBAIC0xMTYzLDYgKzExODUsNyBAQAogICAgICMgbm90IGVudGlyZWx5IHN1cmUgd2hhdCB0aGUgcnVsZXMgYXJlIGhlcmUKICAgICBkZWYgb3Blbl9sb2NhbF9maWxlKHNlbGYsIHJlcSk6CiAgICAgICAgIGltcG9ydCBlbWFpbC5VdGlscworICAgICAgICBpbXBvcnQgbWltZXR5cGVzCiAgICAgICAgIGhvc3QgPSByZXEuZ2V0X2hvc3QoKQogICAgICAgICBmaWxlID0gcmVxLmdldF9zZWxlY3RvcigpCiAgICAgICAgIGxvY2FsZmlsZSA9IHVybDJwYXRobmFtZShmaWxlKQpAQCAtMTE4Myw2ICsxMjA2LDggQEAKIAogY2xhc3MgRlRQSGFuZGxlcihCYXNlSGFuZGxlcik6CiAgICAgZGVmIGZ0cF9vcGVuKHNlbGYsIHJlcSk6CisgICAgICAgIGltcG9ydCBmdHBsaWIKKyAgICAgICAgaW1wb3J0IG1pbWV0eXBlcwogICAgICAgICBob3N0ID0gcmVxLmdldF9ob3N0KCkKICAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2Z0cCBlcnJvcicsICdubyBob3N0IGdpdmVuJykKZGlmZiAtLWdpdCBhL0xpYi93YXJuaW5ncy5weSBiL0xpYi93YXJuaW5ncy5weQppbmRleCBiYzBiODE4Li5iNWQ3NWU0IDEwMDY0NAotLS0gYS9MaWIvd2FybmluZ3MucHkKKysrIGIvTGliL3dhcm5pbmdzLnB5CkBAIC0yNjEsNiArMjYxLDQgQEAKIAogIyBNb2R1bGUgaW5pdGlhbGl6YXRpb24KIF9wcm9jZXNzb3B0aW9ucyhzeXMud2Fybm9wdGlvbnMpCi0jIFhYWCBPdmVyZmxvd1dhcm5pbmcgc2hvdWxkIGdvIGF3YXkgZm9yIFB5dGhvbiAyLjUuCi1zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIGNhdGVnb3J5PU92ZXJmbG93V2FybmluZywgYXBwZW5kPTEpCiBzaW1wbGVmaWx0ZXIoImlnbm9yZSIsIGNhdGVnb3J5PVBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIGFwcGVuZD0xKQpkaWZmIC0tZ2l0IGEvTGliL3dlYWtyZWYucHkgYi9MaWIvd2Vha3JlZi5weQppbmRleCAwOWJkMGJlLi40ZjZkNzU3IDEwMDY0NAotLS0gYS9MaWIvd2Vha3JlZi5weQorKysgYi9MaWIvd2Vha3JlZi5weQpAQCAtMTE4LDYgKzExOCwxOCBAQAogICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCiAKKyAgICBkZWYgaXRlcnZhbHVlcmVmcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcy4KKworICAgICAgICBUaGUgcmVmZXJlbmNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgJ2xpdmUnIGF0IHRoZSB0aW1lCisgICAgICAgIHRoZXkgYXJlIHVzZWQsIHNvIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgcmVmZXJlbmNlcyBuZWVkcworICAgICAgICB0byBiZSBjaGVja2VkIGJlZm9yZSBiZWluZyB1c2VkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZAorICAgICAgICBjcmVhdGluZyByZWZlcmVuY2VzIHRoYXQgd2lsbCBjYXVzZSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8KKyAgICAgICAga2VlcCB0aGUgdmFsdWVzIGFyb3VuZCBsb25nZXIgdGhhbiBuZWVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpCisKICAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICAgZm9yIHdyIGluIHNlbGYuZGF0YS5pdGVydmFsdWVzKCk6CiAgICAgICAgICAgICBvYmogPSB3cigpCkBAIC0xNjIsNiArMTc0LDE4IEBACiAgICAgICAgIGlmIGxlbihrd2FyZ3MpOgogICAgICAgICAgICAgc2VsZi51cGRhdGUoa3dhcmdzKQogCisgICAgZGVmIHZhbHVlcmVmcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcy4KKworICAgICAgICBUaGUgcmVmZXJlbmNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgJ2xpdmUnIGF0IHRoZSB0aW1lCisgICAgICAgIHRoZXkgYXJlIHVzZWQsIHNvIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgcmVmZXJlbmNlcyBuZWVkcworICAgICAgICB0byBiZSBjaGVja2VkIGJlZm9yZSBiZWluZyB1c2VkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZAorICAgICAgICBjcmVhdGluZyByZWZlcmVuY2VzIHRoYXQgd2lsbCBjYXVzZSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8KKyAgICAgICAga2VlcCB0aGUgdmFsdWVzIGFyb3VuZCBsb25nZXIgdGhhbiBuZWVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEudmFsdWVzKCkKKwogICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgIEwgPSBbXQogICAgICAgICBmb3Igd3IgaW4gc2VsZi5kYXRhLnZhbHVlcygpOgpAQCAtMjYzLDYgKzI4NywxOCBAQAogICAgICAgICAgICAgaWYga2V5IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHlpZWxkIGtleSwgdmFsdWUKIAorICAgIGRlZiBpdGVya2V5cmVmcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIGtleXMuCisKKyAgICAgICAgVGhlIHJlZmVyZW5jZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlICdsaXZlJyBhdCB0aGUgdGltZQorICAgICAgICB0aGV5IGFyZSB1c2VkLCBzbyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIHJlZmVyZW5jZXMgbmVlZHMKKyAgICAgICAgdG8gYmUgY2hlY2tlZCBiZWZvcmUgYmVpbmcgdXNlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQKKyAgICAgICAgY3JlYXRpbmcgcmVmZXJlbmNlcyB0aGF0IHdpbGwgY2F1c2UgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvCisgICAgICAgIGtlZXAgdGhlIGtleXMgYXJvdW5kIGxvbmdlciB0aGFuIG5lZWRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCisKICAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEuaXRlcmtleXMoKToKICAgICAgICAgICAgIG9iaiA9IHdyKCkKQEAgLTI3NSw2ICszMTEsMTggQEAKICAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVydmFsdWVzKCkKIAorICAgIGRlZiBrZXlyZWZzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUga2V5cy4KKworICAgICAgICBUaGUgcmVmZXJlbmNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgJ2xpdmUnIGF0IHRoZSB0aW1lCisgICAgICAgIHRoZXkgYXJlIHVzZWQsIHNvIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgcmVmZXJlbmNlcyBuZWVkcworICAgICAgICB0byBiZSBjaGVja2VkIGJlZm9yZSBiZWluZyB1c2VkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZAorICAgICAgICBjcmVhdGluZyByZWZlcmVuY2VzIHRoYXQgd2lsbCBjYXVzZSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8KKyAgICAgICAga2VlcCB0aGUga2V5cyBhcm91bmQgbG9uZ2VyIHRoYW4gbmVlZGVkLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmtleXMoKQorCiAgICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgIEwgPSBbXQogICAgICAgICBmb3Igd3IgaW4gc2VsZi5kYXRhLmtleXMoKToKZGlmZiAtLWdpdCBhL0xpYi93ZWJicm93c2VyLnB5IGIvTGliL3dlYmJyb3dzZXIucHkKaW5kZXggYWQyYzEzMi4uNDY5M2ZlNyAxMDA2NDQKLS0tIGEvTGliL3dlYmJyb3dzZXIucHkKKysrIGIvTGliL3dlYmJyb3dzZXIucHkKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogICAgICMgRmlyc3QsIHRoZSBNb3ppbGxhL05ldHNjYXBlIGJyb3dzZXJzCiAgICAgZm9yIGJyb3dzZXIgaW4gKCJtb3ppbGxhLWZpcmVmb3giLCAiZmlyZWZveCIsCiAgICAgICAgICAgICAgICAgICAgICJtb3ppbGxhLWZpcmViaXJkIiwgImZpcmViaXJkIiwKLSAgICAgICAgICAgICAgICAgICAgIm1vemlsbGEiLCAibmV0c2NhcGUiKToKKyAgICAgICAgICAgICAgICAgICAgInNlYW1vbmtleSIsICJtb3ppbGxhIiwgIm5ldHNjYXBlIik6CiAgICAgICAgIGlmIF9pc2NvbW1hbmQoYnJvd3Nlcik6CiAgICAgICAgICAgICByZWdpc3Rlcihicm93c2VyLCBOb25lLCBNb3ppbGxhKGJyb3dzZXIpKQogCkBAIC01MDksNyArNTA5LDggQEAKICAgICBfdHJ5b3JkZXIgPSBbXQogICAgIF9icm93c2VycyA9IHt9CiAgICAgIyBQcmVmZXIgbW96aWxsYS9uZXRzY2FwZS9vcGVyYSBpZiBwcmVzZW50Ci0gICAgZm9yIGJyb3dzZXIgaW4gKCJmaXJlZm94IiwgImZpcmViaXJkIiwgIm1vemlsbGEiLCAibmV0c2NhcGUiLCAib3BlcmEiKToKKyAgICBmb3IgYnJvd3NlciBpbiAoImZpcmVmb3giLCAiZmlyZWJpcmQiLCAic2VhbW9ua2V5IiwgIm1vemlsbGEiLAorICAgICAgICAgICAgICAgICAgICAibmV0c2NhcGUiLCAib3BlcmEiKToKICAgICAgICAgaWYgX2lzY29tbWFuZChicm93c2VyKToKICAgICAgICAgICAgIHJlZ2lzdGVyKGJyb3dzZXIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKGJyb3dzZXIpKQogICAgIHJlZ2lzdGVyKCJ3aW5kb3dzLWRlZmF1bHQiLCBXaW5kb3dzRGVmYXVsdCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKaW5kZXggNWY5MzRjMi4uM2Y0ZDRmMiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKQEAgLTUyNCw3ICs1MjQsNyBAQAogCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwogCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwogCX0KLQlzZWxmLT5vYl90eXBlLT50cF9iYXNlLT50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9DRkFycmF5Q3JlYXRlQ29weShDRkFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQpAQCAtNzM1LDcgKzczNSw3IEBACiAJCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CiAJCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CiAJfQotCXNlbGYtPm9iX3R5cGUtPnRwX2Jhc2UtPnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisJQ0ZBcnJheVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKQEAgLTk3NSw3ICs5NzUsNyBAQAogCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwogCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwogCX0KLQlzZWxmLT5vYl90eXBlLT50cF9iYXNlLT50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeUNyZWF0ZUNvcHkoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQpAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIAkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKIAkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKIAl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfYmFzZS0+dHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKwlDRkRpY3Rpb25hcnlSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwogCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwogCX0KLQlzZWxmLT5vYl90eXBlLT50cF9iYXNlLT50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHkoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQpAQCAtMTU3Niw3ICsxNTc2LDcgQEAKIAkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKIAkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKIAl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfYmFzZS0+dHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKwlDRkRhdGFSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCkBAIC0xODU2LDcgKzE4NTYsNyBAQAogCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwogCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwogCX0KLQlzZWxmLT5vYl90eXBlLT50cF9iYXNlLT50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVXaXRoU3Vic3RyaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQpAQCAtMjU4Myw3ICsyNTgzLDcgQEAKIAkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKIAkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKIAl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfYmFzZS0+dHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKwlDRlN0cmluZ1JlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKQEAgLTI5NzEsNyArMjk3MSw3IEBACiAJCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CiAJCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CiAJfQotCXNlbGYtPm9iX3R5cGUtPnRwX2Jhc2UtPnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisJQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZURhdGEoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9maWxlL19GaWxlbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9maWxlL19GaWxlbW9kdWxlLmMKaW5kZXggODFmMGMwMi4uYzIxMWRlMSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZmlsZS9fRmlsZW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYwpAQCAtMTA1LDEzICsxMDUsMTQgQEAKIAkJRlNTcGVjIGZzczI7CiAJCWludCB0b2NvcHk7CiAKLQkJZXJyID0gRlNNYWtlRlNTcGVjKGZzcy0+dlJlZk51bSwgZnNzLT5wYXJJRCwgIiIsICZmc3MyKTsKKwkJZXJyID0gRlNNYWtlRlNTcGVjKGZzcy0+dlJlZk51bSwgZnNzLT5wYXJJRCwKKwkJCQkgICAodW5zaWduZWQgY2hhciopIiIsICZmc3MyKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJCWVyciA9IEZTcE1ha2VGU1JlZigmZnNzMiwgJmZzcik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQllcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCBwYXRoLCBsZW4tMSk7CisJCWVyciA9IChPU0VycilGU1JlZk1ha2VQYXRoKCZmc3IsICh1bnNpZ25lZCBjaGFyKilwYXRoLCBsZW4tMSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCQkvKiBUaGlzIHBhcnQgaXMgbm90IDEwMCUgc2FmZTogd2UgYXBwZW5kIHRoZSBmaWxlbmFtZSBwYXJ0LCBidXQKQEAgLTEyMywxMiArMTI0LDEyIEBACiAJCWlmICgoc3RybGVuKHBhdGgpICsgdG9jb3B5KSA+PSBsZW4pCiAJCQl0b2NvcHkgPSBsZW4gLSBzdHJsZW4ocGF0aCkgLSAxOwogCQlpZiAodG9jb3B5ID4gMCkKLQkJCXN0cm5jYXQocGF0aCwgZnNzLT5uYW1lKzEsIHRvY29weSk7CisJCQlzdHJuY2F0KHBhdGgsIChjaGFyKilmc3MtPm5hbWUrMSwgdG9jb3B5KTsKIAl9CiAJZWxzZSB7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQllcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCBwYXRoLCBsZW4pOworCQllcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCAodW5zaWduZWQgY2hhciopcGF0aCwgbGVuKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jCmluZGV4IDY0Y2VhZjYuLmE3OWIyNTcgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21sdGUvX01sdGVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9tbHRlL19NbHRlbW9kdWxlLmMKQEAgLTQ5LDIzICs0OSw2IEBACiB9CiAKIC8qCi0qKiBQYXJzZSBhbiBvcHRpb25hbCByZWN0Ci0qLwotc3RhdGljIGludAotT3B0UmVjdFB0cl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBSZWN0ICoqcF9pdHNlbGYpCi17Ci0gICAgICAgIHN0YXRpYyBSZWN0IHI7Ci0KLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgKnBfaXRzZWxmID0gJnI7Ci0gICAgICAgIHJldHVybiBQeU1hY19HZXRSZWN0KHYsICpwX2l0c2VsZik7Ci19Ci0KLS8qCiAqKiBQYXJzZSBhbiBvcHRpb25hbCBHV29ybGQKICovCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9NYWMvT1NYL0J1aWxkU2NyaXB0L1JFQURNRS50eHQgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1NmRlODMKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L1JFQURNRS50eHQKQEAgLTAsMCArMSwzNSBAQAorQnVpbGRpbmcgYSBNYWNQeXRob24gZGlzdHJpYnV0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGBgYnVpbGQtaW5zdGFsbC5weWBgIHNjcmlwdCBjcmVhdGVzIE1hY1B5dGhvbiBkaXN0cmlidXRpb25zLCBpbmNsdWRpbmcKK3NsZWVweWNhdCBkYjQsIHNxbGl0ZTMgYW5kIHJlYWRsaW5lIHN1cHBvcnQuICBJdCBidWlsZHMgYSBjb21wbGV0ZSAKK2ZyYW1ld29yay1iYXNlZCBQeXRob24gb3V0LW9mLXRyZWUsIGluc3RhbGxzIGl0IGluIGEgZnVubnkgcGxhY2Ugd2l0aCAKKyRERVNUUk9PVCwgbWFzc2FnZXMgdGhhdCBpbnN0YWxsYXRpb24gdG8gcmVtb3ZlIC5weWMgZmlsZXMgYW5kIHN1Y2gsIGNyZWF0ZXMgCithbiBJbnN0YWxsZXIgcGFja2FnZSBmcm9tIHRoZSBpbnN0YWxsYXRpb24gcGx1cyBvdGhlciBmaWxlcyBpbiBgYHJlc291cmNlc2BgIAorYW5kIGBgc2NyaXB0c2BgIGFuZCBwbGFjZWQgdGhhdCBvbiBhIGBgLmRtZ2BgIGRpc2sgaW1hZ2UuCisKK0hlcmUgYXJlIHRoZSBzdGVwcyB5b3UgbmVkIHRvIGZvbGxvdyB0byBidWlsZCBhIE1hY1B5dGhvbiBpbnN0YWxsZXI6CisKKy0gUnVuIGBgLi9idWlsZC1pbnN0YWxsZXIucHlgYC4gT3B0aW9uYWxseSB5b3UgY2FuIHBhc3MgYSBudW1iZXIgb2YgYXJndW1lbnRzCisgIHRvIHNwZWNpZnkgbG9jYXRpb25zIG9mIHZhcmlvdXMgZmlsZXMuIFBsZWFzZSBzZWUgdGhlIHRvcCBvZgorICBgYGJ1aWxkLWluc3RhbGxlci5weWBgIGZvciBpdHMgdXNhZ2UuCistIFdoZW4gZG9uZSB0aGUgc2NyaXB0IHdpbGwgdGVsbCB5b3Ugd2hlcmUgdGhlIERNRyBpbWFnZSBpcy4KKworVGhlIHNjcmlwdCBuZWVkcyB0byBiZSBydW4gb24gTWFjIE9TIFggMTAuNCB3aXRoIFhjb2RlIDIuMiBvciBsYXRlciBhbmQKK3RoZSAxMC40dSBTREsuCisKK1doZW4gYWxsIGlzIGRvbmUsIGFubm91bmNlbWVudHMgY2FuIGJlIHBvc3RlZCB0byBhdCBsZWFzdCB0aGUgZm9sbG93aW5nCitwbGFjZXM6CistICAgcHl0aG9ubWFjLXNpZ0BweXRob24ub3JnCistICAgcHl0aG9uLWRldkBweXRob24ub3JnCistICAgcHl0aG9uLWFubm91bmNlQHB5dGhvbi5vcmcKKy0gICBhcmNoaXZpc3RAaW5mby1tYWMub3JnCistICAgYWRjbmV3c0BhcHBsZS5jb20KKy0gICBuZXdzQG1hY25uLmNvbQorLSAgIGh0dHA6Ly93d3cubWFjdXBkYXRlLmNvbQorLSAgIGh0dHA6Ly9ndWlkZS5hcHBsZS5jb20vdXNpbmRleC5sYXNzbworLSAgIGh0dHA6Ly93d3cuYXBwbGUuY29tL2Rvd25sb2Fkcy9tYWNvc3gvc3VibWl0CistICAgaHR0cDovL3d3dy52ZXJzaW9udHJhY2tlci5jb20vICh1c2VyaWQgSmFjay5KYW5zZW5Ab3JhdHJpeC5jb20pCistICAgaHR0cDovL3d3dy5tYWNzaGFyZXdhcmUubmV0ICh1c2VyaWQgamFja2phbnNlbikKKworQWxzbywgY2hlY2sgb3V0IFN0ZXBoYW4gRGVpYmVscyBodHRwOi8vcHl0aG9ub2xvZ3kub3JnL21hcmtldCBjb250YWN0IGxpc3QKZGlmZiAtLWdpdCBhL01hYy9PU1gvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5IGIvTWFjL09TWC9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjI0ZjVkYwotLS0gL2Rldi9udWxsCisrKyBiL01hYy9PU1gvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5CkBAIC0wLDAgKzEsMTAxNCBAQAorIyEvdXNyL2Jpbi9weXRob24yLjMKKyIiIgorVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBidWlsZCB0aGUgIm9mZmljaWFsIHVub2ZmaWNpYWwiIHVuaXZlcnNhbCBidWlsZCBvbgorTWFjIE9TIFguIEl0IHJlcXVpcmVzIE1hYyBPUyBYIDEwLjQsIFhjb2RlIDIuMiBhbmQgdGhlIDEwLjR1IFNESyB0byBkbyBpdHMKK3dvcmsuCisKK1BsZWFzZSBlbnN1cmUgdGhhdCB0aGlzIHNjcmlwdCBrZWVwcyB3b3JraW5nIHdpdGggUHl0aG9uIDIuMywgdG8gYXZvaWQKK2Jvb3RzdHJhcCBpc3N1ZXMgKC91c3IvYmluL3B5dGhvbiBpcyBQeXRob24gMi4zIG9uIE9TWCAxMC40KQorCitVc2FnZTogc2VlIFVTQUdFIHZhcmlhYmxlIGluIHRoZSBzY3JpcHQuCisiIiIKK2ltcG9ydCBwbGF0Zm9ybSwgb3MsIHN5cywgZ2V0b3B0LCB0ZXh0d3JhcCwgc2h1dGlsLCB1cmxsaWIyLCBzdGF0LCB0aW1lLCBwd2QKKworSU5DTFVERV9USU1FU1RBTVA9MQorVkVSQk9TRT0xCisKK2Zyb20gcGxpc3RsaWIgaW1wb3J0IFBsaXN0CisKK2ltcG9ydCBNYWNPUworaW1wb3J0IENhcmJvbi5GaWxlCitpbXBvcnQgQ2FyYm9uLkljbgoraW1wb3J0IENhcmJvbi5SZXMKK2Zyb20gQ2FyYm9uLkZpbGVzIGltcG9ydCBrQ3VzdG9tSWNvblJlc291cmNlLCBmc1JkV3JQZXJtLCBrSGFzQ3VzdG9tSWNvbgorZnJvbSBDYXJib24uRmlsZXMgaW1wb3J0IGtGU0NhdEluZm9GaW5kZXJJbmZvCisKK3RyeToKKyAgICBmcm9tIHBsaXN0bGliIGltcG9ydCB3cml0ZVBsaXN0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBXZSdyZSBydW4gdXNpbmcgcHl0aG9uMi4zCisgICAgZGVmIHdyaXRlUGxpc3QocGxpc3QsIHBhdGgpOgorICAgICAgICBwbGlzdC53cml0ZShwYXRoKQorCitkZWYgc2hlbGxRdW90ZSh2YWx1ZSk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgaW4gYSBmb3JtIHRoYXQgY2FuIHNhdmVseSBiZSBpbnNlcnRlZCBpbnRvCisgICAgYSBzaGVsbCBjb21tYW5kLgorICAgICIiIgorICAgIHJldHVybiAiJyVzJyIlKHZhbHVlLnJlcGxhY2UoIiciLCAiJ1wiJ1wiJyIpKQorCitkZWYgZ3JlcFZhbHVlKGZuLCB2YXJpYWJsZSk6CisgICAgdmFyaWFibGUgPSB2YXJpYWJsZSArICc9JworICAgIGZvciBsbiBpbiBvcGVuKGZuLCAncicpOgorICAgICAgICBpZiBsbi5zdGFydHN3aXRoKHZhcmlhYmxlKToKKyAgICAgICAgICAgIHZhbHVlID0gbG5bbGVuKHZhcmlhYmxlKTpdLnN0cmlwKCkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZVsxOi0xXQorCitkZWYgZ2V0VmVyc2lvbigpOgorICAgIHJldHVybiBncmVwVmFsdWUob3MucGF0aC5qb2luKFNSQ0RJUiwgJ2NvbmZpZ3VyZScpLCAnUEFDS0FHRV9WRVJTSU9OJykKKworZGVmIGdldEZ1bGxWZXJzaW9uKCk6CisgICAgZm4gPSBvcy5wYXRoLmpvaW4oU1JDRElSLCAnSW5jbHVkZScsICdwYXRjaGxldmVsLmgnKQorICAgIGZvciBsbiBpbiBvcGVuKGZuKToKKyAgICAgICAgaWYgJ1BZX1ZFUlNJT04nIGluIGxuOgorICAgICAgICAgICAgcmV0dXJuIGxuLnNwbGl0KClbLTFdWzE6LTFdCisKKyAgICByYWlzZSBSdW50aW1lRXJyb3IsICJDYW5ub3QgZmluZCBmdWxsIHZlcnNpb24/PyIKKworIyBUaGUgZGlyZWN0b3J5IHdlJ2xsIHVzZSB0byBjcmVhdGUgdGhlIGJ1aWxkLCB3aWxsIGJlIGVyYXNlZCBhbmQgcmVjcmVhdGVkCitXT1JLRElSPSIvdG1wL19weSIKKworIyBUaGUgZGlyZWN0b3J5IHdlJ2xsIHVzZSB0byBzdG9yZSB0aGlyZC1wYXJ0eSBzb3VyY2VzLCBzZXQgdGhpcyB0byBzb21ldGhpbmcKKyMgZWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byByZS1mZXRjaCByZXF1aXJlZCBsaWJyYXJpZXMgZXZlcnkgdGltZS4KK0RFUFNSQz1vcy5wYXRoLmpvaW4oV09SS0RJUiwgJ3RoaXJkLXBhcnR5JykKK0RFUFNSQz1vcy5wYXRoLmV4cGFuZHVzZXIoJ34vVW5pdmVyc2FsL290aGVyLXNvdXJjZXMnKQorCisjIExvY2F0aW9uIG9mIHRoZSBwcmVmZXJyZWQgU0RLCitTREtQQVRIPSIvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIgorI1NES1BBVEg9Ii8iCisKKyMgU291cmNlIGRpcmVjdG9yeSAoYXN1bWUgd2UncmUgaW4gTWFjL09TWC9EaXN0KQorU1JDRElSPW9zLnBhdGguZGlybmFtZSgKKyAgICAgICAgb3MucGF0aC5kaXJuYW1lKAorICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKAorICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZSgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fCisgICAgICAgICkpKSkpCisKK1VTQUdFPXRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgVXNhZ2U6IGJ1aWxkX3B5dGhvbiBbb3B0aW9uc10KKworICAgIE9wdGlvbnM6CisgICAgLT8gb3IgLWg6ICAgICAgICAgICAgU2hvdyB0aGlzIG1lc3NhZ2UKKyAgICAtYiBESVIKKyAgICAtLWJ1aWxkLWRpcj1ESVI6ICAgICBDcmVhdGUgYnVpbGQgaGVyZSAoZGVmYXVsdDogJShXT1JLRElSKXIpCisgICAgLS10aGlyZC1wYXJ0eT1ESVI6ICAgU3RvcmUgdGhpcmQtcGFydHkgc291cmNlcyBoZXJlIChkZWZhdWx0OiAlKERFUFNSQylyKQorICAgIC0tc2RrLXBhdGg9RElSOiAgICAgIExvY2F0aW9uIG9mIHRoZSBTREsgKGRlZmF1bHQ6ICUoU0RLUEFUSClyKQorICAgIC0tc3JjLWRpcj1ESVI6ICAgICAgIExvY2F0aW9uIG9mIHRoZSBQeXRob24gc291cmNlcyAoZGVmYXVsdDogJShTUkNESVIpcikKKyIiIiklIGdsb2JhbHMoKQorCisKKyMgSW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyBsaWJyYXJpZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IGZvciBidWlsZGluZyBhCisjIGJhdHRlcmllcyBpbmNsdWRlZCBweXRob24uCitMSUJSQVJZX1JFQ0lQRVM9WworICAgIGRpY3QoCisgICAgICAgICMgTm90ZSB0aGF0IEdOVSByZWFkbGluZSBpcyBHUEwnZCBzb2Z0d2FyZQorICAgICAgICBuYW1lPSJHTlUgUmVhZGxpbmUgNS4xLjQiLAorICAgICAgICB1cmw9Imh0dHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3JlYWRsaW5lL3JlYWRsaW5lLTUuMS50YXIuZ3oiICwKKyAgICAgICAgcGF0Y2hsZXZlbD0nMCcsCisgICAgICAgIHBhdGNoZXM9WworICAgICAgICAgICAgIyBUaGUgcmVhZGxpbmUgbWFpbnRhaW5lcnMgZG9uJ3QgZG8gYWN0dWFsIG1pY3JvIHJlbGVhc2VzLCBidXQKKyAgICAgICAgICAgICMganVzdCBzaGlwIGEgc2V0IG9mIHBhdGNoZXMuCisgICAgICAgICAgICAnaHR0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvcmVhZGxpbmUvcmVhZGxpbmUtNS4xLXBhdGNoZXMvcmVhZGxpbmU1MS0wMDEnLAorICAgICAgICAgICAgJ2h0dHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3JlYWRsaW5lL3JlYWRsaW5lLTUuMS1wYXRjaGVzL3JlYWRsaW5lNTEtMDAyJywKKyAgICAgICAgICAgICdodHRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9yZWFkbGluZS9yZWFkbGluZS01LjEtcGF0Y2hlcy9yZWFkbGluZTUxLTAwMycsCisgICAgICAgICAgICAnaHR0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvcmVhZGxpbmUvcmVhZGxpbmUtNS4xLXBhdGNoZXMvcmVhZGxpbmU1MS0wMDQnLAorICAgICAgICBdCisgICAgKSwKKworICAgIGRpY3QoCisgICAgICAgIG5hbWU9IlNRTGl0ZSAzLjMuNSIsCisgICAgICAgIHVybD0iaHR0cDovL3d3dy5zcWxpdGUub3JnL3NxbGl0ZS0zLjMuNS50YXIuZ3oiLAorICAgICAgICBjaGVja3N1bT0nOTNmNzQyOTg2ZThiYzJkZmEzNDc5MmUxNmRmMDE3YTZmZWNjZjNhMicsCisgICAgICAgIGNvbmZpZ3VyZV9wcmU9WworICAgICAgICAgICAgJy0tZW5hYmxlLXRocmVhZHNhZmUnLAorICAgICAgICAgICAgJy0tZW5hYmxlLXRlbXBzdG9yZScsCisgICAgICAgICAgICAnLS1lbmFibGUtc2hhcmVkPW5vJywKKyAgICAgICAgICAgICctLWVuYWJsZS1zdGF0aWM9eWVzJywKKyAgICAgICAgICAgICctLWRpc2FibGUtdGNsJywKKyAgICAgICAgXQorICAgICksCisKKyAgICBkaWN0KAorICAgICAgICBuYW1lPSJOQ3Vyc2VzIDUuNSIsCisgICAgICAgIHVybD0iaHR0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvbmN1cnNlcy9uY3Vyc2VzLTUuNS50YXIuZ3oiLAorICAgICAgICBjb25maWd1cmVfcHJlPVsKKyAgICAgICAgICAgICItLXdpdGhvdXQtY3h4IiwKKyAgICAgICAgICAgICItLXdpdGhvdXQtYWRhIiwKKyAgICAgICAgICAgICItLXdpdGhvdXQtcHJvZ3MiLAorICAgICAgICAgICAgIi0td2l0aG91dC1jdXJzZXMtaCIsCisgICAgICAgICAgICAiLS1lbmFibGUtc2hhcmVkIiwKKyAgICAgICAgICAgICItLXdpdGgtc2hhcmVkIiwKKyAgICAgICAgICAgICItLWRhdGFkaXI9L3Vzci9zaGFyZSIsCisgICAgICAgICAgICAiLS1zeXNjb25mZGlyPS9ldGMiLAorICAgICAgICAgICAgIi0tc2hhcmVkc3RhdGVkaXI9L3Vzci9jb20iLAorICAgICAgICAgICAgIi0td2l0aC10ZXJtaW5mby1kaXJzPS91c3Ivc2hhcmUvdGVybWluZm8iLAorICAgICAgICAgICAgIi0td2l0aC1kZWZhdWx0LXRlcm1pbmZvLWRpcj0vdXNyL3NoYXJlL3Rlcm1pbmZvIiwKKyAgICAgICAgICAgICItLWxpYmRpcj0vTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJXMvbGliIiUoZ2V0VmVyc2lvbigpLCksCisgICAgICAgICAgICAiLS1lbmFibGUtdGVybWNhcCIsCisgICAgICAgIF0sCisgICAgICAgIHBhdGNoZXM9WworICAgICAgICAgICAgIm5jdXJzZXMtNS41LnBhdGNoIiwKKyAgICAgICAgXSwKKyAgICAgICAgdXNlTERGbGFncz1GYWxzZSwKKyAgICAgICAgaW5zdGFsbD0nbWFrZSAmJiBtYWtlIGluc3RhbGwgREVTVERJUj0lcyAmJiBjZCAlcy91c3IvbG9jYWwvbGliICYmIGxuIC1mcyAuLi8uLi8uLi9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8lcy9saWIvbGliKiAuJyUoCisgICAgICAgICAgICBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnbGlicmFyaWVzJykpLAorICAgICAgICAgICAgc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ2xpYnJhcmllcycpKSwKKyAgICAgICAgICAgIGdldFZlcnNpb24oKSwKKyAgICAgICAgICAgICksCisgICAgKSwKKyAgICBkaWN0KAorICAgICAgICBuYW1lPSJTbGVlcHljYXQgREIgNC40IiwKKyAgICAgICAgdXJsPSJodHRwOi8vZG93bmxvYWRzLnNsZWVweWNhdC5jb20vZGItNC40LjIwLnRhci5neiIsCisgICAgICAgICNuYW1lPSJTbGVlcHljYXQgREIgNC4zLjI5IiwKKyAgICAgICAgI3VybD0iaHR0cDovL2Rvd25sb2Fkcy5zbGVlcHljYXQuY29tL2RiLTQuMy4yOS50YXIuZ3oiLAorICAgICAgICBidWlsZERpcj0iYnVpbGRfdW5peCIsCisgICAgICAgIGNvbmZpZ3VyZT0iLi4vZGlzdC9jb25maWd1cmUiLAorICAgICAgICBjb25maWd1cmVfcHJlPVsKKyAgICAgICAgICAgICctLWluY2x1ZGVkaXI9L3Vzci9sb2NhbC9pbmNsdWRlL2RiNCcsCisgICAgICAgIF0KKyAgICApLAorXQorCisKKyMgSW5zdHJ1Y3Rpb25zIGZvciBidWlsZGluZyBwYWNrYWdlcyBpbnNpZGUgdGhlIC5tcGtnLgorUEtHX1JFQ0lQRVM9WworICAgIGRpY3QoCisgICAgICAgIG5hbWU9IlB5dGhvbkZyYW1ld29yayIsCisgICAgICAgIGxvbmdfbmFtZT0iUHl0aG9uIEZyYW1ld29yayIsCisgICAgICAgIHNvdXJjZT0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrIiwKKyAgICAgICAgcmVhZG1lPSIiIlwKKyAgICAgICAgICAgIFRoaXMgcGFja2FnZSBpbnN0YWxscyBQeXRob24uZnJhbWV3b3JrLCB0aGF0IGlzIHRoZSBweXRob24KKyAgICAgICAgICAgIGludGVycHJldGVyIGFuZCB0aGUgc3RhbmRhcmQgbGlicmFyeS4gVGhpcyBhbHNvIGluY2x1ZGVzIFB5dGhvbgorICAgICAgICAgICAgd3JhcHBlcnMgZm9yIGxvdHMgb2YgTWFjIE9TIFggQVBJJ3MuCisgICAgICAgICIiIiwKKyAgICAgICAgcG9zdGZsaWdodD0ic2NyaXB0cy9wb3N0ZmxpZ2h0LmZyYW1ld29yayIsCisgICAgKSwKKyAgICBkaWN0KAorICAgICAgICBuYW1lPSJQeXRob25BcHBsaWNhdGlvbnMiLAorICAgICAgICBsb25nX25hbWU9IkdVSSBBcHBsaWNhdGlvbnMiLAorICAgICAgICBzb3VyY2U9Ii9BcHBsaWNhdGlvbnMvTWFjUHl0aG9uICUoVkVSKXMiLAorICAgICAgICByZWFkbWU9IiIiXAorICAgICAgICAgICAgVGhpcyBwYWNrYWdlIGluc3RhbGxzIFB5dGhvbi5mcmFtZXdvcmssIHRoYXQgaXMgdGhlIHB5dGhvbgorICAgICAgICAgICAgaW50ZXJwcmV0ZXIgYW5kIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiBUaGlzIGFsc28gaW5jbHVkZXMgUHl0aG9uCisgICAgICAgICAgICB3cmFwcGVycyBmb3IgbG90cyBvZiBNYWMgT1MgWCBBUEkncy4KKyAgICAgICAgICAgICIiIiwKKyAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgKSwKKyAgICBkaWN0KAorICAgICAgICBuYW1lPSJQeXRob25Vbml4VG9vbHMiLAorICAgICAgICBsb25nX25hbWU9IlVOSVggY29tbWFuZC1saW5lIHRvb2xzIiwKKyAgICAgICAgc291cmNlPSIvdXNyL2xvY2FsL2JpbiIsCisgICAgICAgIHJlYWRtZT0iIiJcCisgICAgICAgICAgICBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIHVuaXggdG9vbHMgaW4gL3Vzci9sb2NhbC9iaW4gZm9yCisgICAgICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgcmVsZWFzZXMgb2YgTWFjUHl0aG9uLiBUaGlzIHBhY2thZ2UKKyAgICAgICAgICAgIGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIE1hY1B5dGhvbi4KKyAgICAgICAgICAgICIiIiwKKyAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgKSwKKyAgICBkaWN0KAorICAgICAgICBuYW1lPSJQeXRob25Eb2N1bWVudGF0aW9uIiwKKyAgICAgICAgbG9uZ19uYW1lPSJQeXRob24gRG9jdW1lbnRhdGlvbiIsCisgICAgICAgIHRvcGRpcj0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyUoVkVSKXMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbiIsCisgICAgICAgIHNvdXJjZT0iL3B5ZG9jcyIsCisgICAgICAgIHJlYWRtZT0iIiJcCisgICAgICAgICAgICBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIHB5dGhvbiBkb2N1bWVudGF0aW9uIGF0IGEgbG9jYXRpb24KKyAgICAgICAgICAgIHRoYXQgaXMgdXNlYWJsZSBmb3IgcHlkb2MgYW5kIElETEUuIElmIHlvdSBoYXZlIGluc3RhbGxlZCBYY29kZQorICAgICAgICAgICAgaXQgd2lsbCBhbHNvIGluc3RhbGwgYSBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uIGluCisgICAgICAgICAgICAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vUHl0aG9uCisgICAgICAgICAgICAiIiIsCisgICAgICAgIHBvc3RmbGlnaHQ9InNjcmlwdHMvcG9zdGZsaWdodC5kb2N1bWVudGF0aW9uIiwKKyAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgKSwKKyAgICBkaWN0KAorICAgICAgICBuYW1lPSJQeXRob25Qcm9maWxlQ2hhbmdlcyIsCisgICAgICAgIGxvbmdfbmFtZT0iU2hlbGwgcHJvZmlsZSB1cGRhdGVyIiwKKyAgICAgICAgcmVhZG1lPSIiIlwKKyAgICAgICAgICAgIFRoaXMgcGFja2FnZXMgdXBkYXRlcyB5b3VyIHNoZWxsIHByb2ZpbGUgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgICAgIHRoZSBNYWNQeXRob24gdG9vbHMgYXJlIGZvdW5kIGJ5IHlvdXIgc2hlbGwgaW4gcHJlZmVyZW5jZSBvZgorICAgICAgICAgICAgdGhlIHN5c3RlbSBwcm92aWRlZCBQeXRob24gdG9vbHMuCisKKyAgICAgICAgICAgIElmIHlvdSBkb24ndCBpbnN0YWxsIHRoaXMgcGFja2FnZSB5b3UnbGwgaGF2ZSB0byBhZGQKKyAgICAgICAgICAgICIvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJShWRVIpcy9iaW4iCisgICAgICAgICAgICB0byB5b3VyIFBBVEggYnkgaGFuZC4KKyAgICAgICAgICAgICIiIiwKKyAgICAgICAgcG9zdGZsaWdodD0ic2NyaXB0cy9wb3N0ZmxpZ2h0LnBhdGNoLXByb2ZpbGUiLAorICAgICAgICB0b3BkaXI9Ii9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yayIsCisgICAgICAgIHNvdXJjZT0iL2VtcHR5LWRpciIsCisgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAgICksCitdCisKKworZGVmIGZhdGFsKG1zZyk6CisgICAgIiIiCisgICAgQSBmYXRhbCBlcnJvciwgYmFpbCBvdXQuCisgICAgIiIiCisgICAgc3lzLnN0ZGVyci53cml0ZSgnRkFUQUw6ICcpCisgICAgc3lzLnN0ZGVyci53cml0ZShtc2cpCisgICAgc3lzLnN0ZGVyci53cml0ZSgnXG4nKQorICAgIHN5cy5leGl0KDEpCisKK2RlZiBmaWxlQ29udGVudHMoZm4pOgorICAgICIiIgorICAgIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGZpbGUKKyAgICAiIiIKKyAgICByZXR1cm4gb3BlbihmbiwgJ3JiJykucmVhZCgpCisKK2RlZiBydW5Db21tYW5kKGNvbW1hbmRsaW5lKToKKyAgICAiIiIKKyAgICBSdW4gYSBjb21tYW5kIGFuZCByYWlzZSBSdW50aW1lRXJyb3IgaWYgaXQgZmFpbHMuIE91dHB1dCBpcyBzdXJwcmVzc2VkCisgICAgdW5sZXNzIHRoZSBjb21tYW5kIGZhaWxzLgorICAgICIiIgorICAgIGZkID0gb3MucG9wZW4oY29tbWFuZGxpbmUsICdyJykKKyAgICBkYXRhID0gZmQucmVhZCgpCisgICAgeGl0ID0gZmQuY2xvc2UoKQorICAgIGlmIHhpdCAhPSBOb25lOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGEpCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImNvbW1hbmQgZmFpbGVkOiAlcyIlKGNvbW1hbmRsaW5lLCkKKworICAgIGlmIFZFUkJPU0U6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZGF0YSk7IHN5cy5zdGRvdXQuZmx1c2goKQorCitkZWYgY2FwdHVyZUNvbW1hbmQoY29tbWFuZGxpbmUpOgorICAgIGZkID0gb3MucG9wZW4oY29tbWFuZGxpbmUsICdyJykKKyAgICBkYXRhID0gZmQucmVhZCgpCisgICAgeGl0ID0gZmQuY2xvc2UoKQorICAgIGlmIHhpdCAhPSBOb25lOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGEpCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImNvbW1hbmQgZmFpbGVkOiAlcyIlKGNvbW1hbmRsaW5lLCkKKworICAgIHJldHVybiBkYXRhCisKK2RlZiBjaGVja0Vudmlyb25tZW50KCk6CisgICAgIiIiCisgICAgQ2hlY2sgdGhhdCB3ZSdyZSBydW5uaW5nIG9uIGEgc3VwcG9ydGVkIHN5c3RlbS4KKyAgICAiIiIKKworICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdEYXJ3aW4nOgorICAgICAgICBmYXRhbCgiVGhpcyBzY3JpcHQgc2hvdWxkIGJlIHJ1biBvbiBhIE1hYyBPUyBYIDEwLjQgc3lzdGVtIikKKworICAgIGlmIHBsYXRmb3JtLnJlbGVhc2UoKSA8PSAnOC4nOgorICAgICAgICBmYXRhbCgiVGhpcyBzY3JpcHQgc2hvdWxkIGJlIHJ1biBvbiBhIE1hYyBPUyBYIDEwLjQgc3lzdGVtIikKKworICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhTREtQQVRIKToKKyAgICAgICAgZmF0YWwoIlBsZWFzZSBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYY29kZSBhbmQgdGhlICVzIFNESyIlKAorICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShTREtQQVRIWzotNF0pKSkKKworCisKK2RlZiBwYXJzZU9wdGlvbnMoYXJncyA9IE5vbmUpOgorICAgICIiIgorICAgIFBhcnNlIGFyZ3VtZW50cyBhbmQgdXBkYXRlIGdsb2JhbCBzZXR0aW5ncy4KKyAgICAiIiIKKyAgICBnbG9iYWwgV09SS0RJUiwgREVQU1JDLCBTREtQQVRILCBTUkNESVIKKworICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorCisgICAgdHJ5OgorICAgICAgICBvcHRpb25zLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAnP2hiJywKKyAgICAgICAgICAgICAgICBbICdidWlsZC1kaXI9JywgJ3RoaXJkLXBhcnR5PScsICdzZGstcGF0aD0nICwgJ3NyYy1kaXI9J10pCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgorICAgICAgICBwcmludCBtc2cKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGlmIGFyZ3M6CisgICAgICAgIHByaW50ICJBZGRpdGlvbmFsIGFyZ3VtZW50cyIKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGZvciBrLCB2IGluIG9wdGlvbnM6CisgICAgICAgIGlmIGsgaW4gKCctaCcsICctPycpOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgZWxpZiBrIGluICgnLWQnLCAnLS1idWlsZC1kaXInKToKKyAgICAgICAgICAgIFdPUktESVI9dgorCisgICAgICAgIGVsaWYgayBpbiAoJy0tdGhpcmQtcGFydHknLCk6CisgICAgICAgICAgICBERVBTUkM9dgorCisgICAgICAgIGVsaWYgayBpbiAoJy0tc2RrLXBhdGgnLCk6CisgICAgICAgICAgICBTREtQQVRIPXYKKworICAgICAgICBlbGlmIGsgaW4gKCctLXNyYy1kaXInLCk6CisgICAgICAgICAgICBTUkNESVI9dgorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCBrCisKKyAgICBTUkNESVI9b3MucGF0aC5hYnNwYXRoKFNSQ0RJUikKKyAgICBXT1JLRElSPW9zLnBhdGguYWJzcGF0aChXT1JLRElSKQorICAgIFNES1BBVEg9b3MucGF0aC5hYnNwYXRoKFNES1BBVEgpCisgICAgREVQU1JDPW9zLnBhdGguYWJzcGF0aChERVBTUkMpCisKKyAgICBwcmludCAiU2V0dGluZ3M6IgorICAgIHByaW50ICIgKiBTb3VyY2UgZGlyZWN0b3J5OiIsIFNSQ0RJUgorICAgIHByaW50ICIgKiBCdWlsZCBkaXJlY3Rvcnk6ICIsIFdPUktESVIKKyAgICBwcmludCAiICogU0RLIGxvY2F0aW9uOiAgICAiLCBTREtQQVRICisgICAgcHJpbnQgIiAqIHRoaXJkLXBhcnR5IHNvdXJjZToiLCBERVBTUkMKKyAgICBwcmludCAiIgorCisKKworCitkZWYgZXh0cmFjdEFyY2hpdmUoYnVpbGRkaXIsIGFyY2hpdmVOYW1lKToKKyAgICAiIiIKKyAgICBFeHRyYWN0IGEgc291cmNlIGFyY2hpdmUgaW50byAnYnVpbGRkaXInLiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZQorICAgIGV4dHJhY3RlZCBhcmNoaXZlLgorCisgICAgWFhYOiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhcmNoaXZlcyBjb250YWluIGEgdG9wbGV2ZWwgZGlyZWN0b3J5CisgICAgdGhhdCBpcyBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgYmFzZW5hbWUgb2YgdGhlIGFyY2hpdmUuIFRoaXMgaXMKKyAgICBzYXZlIGVub3VnaCBmb3IgYW55dGhpbmcgd2UgdXNlLgorICAgICIiIgorICAgIGN1cmRpciA9IG9zLmdldGN3ZCgpCisgICAgdHJ5OgorICAgICAgICBvcy5jaGRpcihidWlsZGRpcikKKyAgICAgICAgaWYgYXJjaGl2ZU5hbWUuZW5kc3dpdGgoJy50YXIuZ3onKToKKyAgICAgICAgICAgIHJldHZhbCA9IG9zLnBhdGguYmFzZW5hbWUoYXJjaGl2ZU5hbWVbOi03XSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJldHZhbCk6CisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShyZXR2YWwpCisgICAgICAgICAgICBmcCA9IG9zLnBvcGVuKCJ0YXIgenhmICVzIDI+JjEiJShzaGVsbFF1b3RlKGFyY2hpdmVOYW1lKSwpLCAncicpCisKKyAgICAgICAgZWxpZiBhcmNoaXZlTmFtZS5lbmRzd2l0aCgnLnRhci5iejInKToKKyAgICAgICAgICAgIHJldHZhbCA9IG9zLnBhdGguYmFzZW5hbWUoYXJjaGl2ZU5hbWVbOi04XSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJldHZhbCk6CisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShyZXR2YWwpCisgICAgICAgICAgICBmcCA9IG9zLnBvcGVuKCJ0YXIganhmICVzIDI+JjEiJShzaGVsbFF1b3RlKGFyY2hpdmVOYW1lKSwpLCAncicpCisKKyAgICAgICAgZWxpZiBhcmNoaXZlTmFtZS5lbmRzd2l0aCgnLnRhcicpOgorICAgICAgICAgICAgcmV0dmFsID0gb3MucGF0aC5iYXNlbmFtZShhcmNoaXZlTmFtZVs6LTRdKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmV0dmFsKToKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHJldHZhbCkKKyAgICAgICAgICAgIGZwID0gb3MucG9wZW4oInRhciB4ZiAlcyAyPiYxIiUoc2hlbGxRdW90ZShhcmNoaXZlTmFtZSksKSwgJ3InKQorCisgICAgICAgIGVsaWYgYXJjaGl2ZU5hbWUuZW5kc3dpdGgoJy56aXAnKToKKyAgICAgICAgICAgIHJldHZhbCA9IG9zLnBhdGguYmFzZW5hbWUoYXJjaGl2ZU5hbWVbOi00XSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJldHZhbCk6CisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShyZXR2YWwpCisgICAgICAgICAgICBmcCA9IG9zLnBvcGVuKCJ1bnppcCAlcyAyPiYxIiUoc2hlbGxRdW90ZShhcmNoaXZlTmFtZSksKSwgJ3InKQorCisgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgeGl0ID0gZnAuY2xvc2UoKQorICAgICAgICBpZiB4aXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGEpCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJDYW5ub3QgZXh0cmFjdCAlcyIlKGFyY2hpdmVOYW1lLCkKKworICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJ1aWxkZGlyLCByZXR2YWwpCisKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihjdXJkaXIpCisKK0tOT1dOU0laRVMgPSB7CisgICAgImh0dHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3JlYWRsaW5lL3JlYWRsaW5lLTUuMS50YXIuZ3oiOiA3OTUyNzQyLAorICAgICJodHRwOi8vZG93bmxvYWRzLnNsZWVweWNhdC5jb20vZGItNC40LjIwLnRhci5neiI6IDIwMzAyNzYsCit9CisKK2RlZiBkb3dubG9hZFVSTCh1cmwsIGZuYW1lKToKKyAgICAiIiIKKyAgICBEb3dubG9hZCB0aGUgY29udGVudHMgb2YgdGhlIHVybCBpbnRvIHRoZSBmaWxlLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgc2l6ZSA9IG9zLnBhdGguZ2V0c2l6ZShmbmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGlmIEtOT1dOU0laRVMuZ2V0KHVybCkgPT0gc2l6ZToKKyAgICAgICAgICAgIHByaW50ICJVc2luZyBleGlzdGluZyBmaWxlIGZvciIsIHVybAorICAgICAgICAgICAgcmV0dXJuCisgICAgZnBJbiA9IHVybGxpYjIudXJsb3Blbih1cmwpCisgICAgZnBPdXQgPSBvcGVuKGZuYW1lLCAnd2InKQorICAgIGJsb2NrID0gZnBJbi5yZWFkKDEwMjQwKQorICAgIHRyeToKKyAgICAgICAgd2hpbGUgYmxvY2s6CisgICAgICAgICAgICBmcE91dC53cml0ZShibG9jaykKKyAgICAgICAgICAgIGJsb2NrID0gZnBJbi5yZWFkKDEwMjQwKQorICAgICAgICBmcEluLmNsb3NlKCkKKyAgICAgICAgZnBPdXQuY2xvc2UoKQorICAgIGV4Y2VwdDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKGZuYW1lKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKK2RlZiBidWlsZFJlY2lwZShyZWNpcGUsIGJhc2VkaXIsIGFyY2hMaXN0KToKKyAgICAiIiIKKyAgICBCdWlsZCBzb2Z0d2FyZSB1c2luZyBhIHJlY2lwZS4gVGhpcyBmdW5jdGlvbiBkb2VzIHRoZQorICAgICdjb25maWd1cmU7bWFrZTttYWtlIGluc3RhbGwnIGRhbmNlIGZvciBDIHNvZnR3YXJlLCB3aXRoIGEgcG9zc2liaWxpdHkKKyAgICB0byBjdXN0b21pemUgdGhpcyBwcm9jZXNzLCBiYXNpY2FsbHkgYSBwb29yLW1hbnMgRGFyd2luUG9ydHMuCisgICAgIiIiCisgICAgY3VyZGlyID0gb3MuZ2V0Y3dkKCkKKworICAgIG5hbWUgPSByZWNpcGVbJ25hbWUnXQorICAgIHVybCA9IHJlY2lwZVsndXJsJ10KKyAgICBjb25maWd1cmUgPSByZWNpcGUuZ2V0KCdjb25maWd1cmUnLCAnLi9jb25maWd1cmUnKQorICAgIGluc3RhbGwgPSByZWNpcGUuZ2V0KCdpbnN0YWxsJywgJ21ha2UgJiYgbWFrZSBpbnN0YWxsIERFU1RESVI9JXMnJSgKKyAgICAgICAgc2hlbGxRdW90ZShiYXNlZGlyKSkpCisKKyAgICBhcmNoaXZlTmFtZSA9IG9zLnBhdGguc3BsaXQodXJsKVstMV0KKyAgICBzb3VyY2VBcmNoaXZlID0gb3MucGF0aC5qb2luKERFUFNSQywgYXJjaGl2ZU5hbWUpCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoREVQU1JDKToKKyAgICAgICAgb3MubWtkaXIoREVQU1JDKQorCisKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhzb3VyY2VBcmNoaXZlKToKKyAgICAgICAgcHJpbnQgIlVzaW5nIGxvY2FsIGNvcHkgb2YgJXMiJShuYW1lLCkKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ICJEb3dubG9hZGluZyAlcyIlKG5hbWUsKQorICAgICAgICBkb3dubG9hZFVSTCh1cmwsIHNvdXJjZUFyY2hpdmUpCisgICAgICAgIHByaW50ICJBcmNoaXZlIGZvciAlcyBzdG9yZWQgYXMgJXMiJShuYW1lLCBzb3VyY2VBcmNoaXZlKQorCisgICAgcHJpbnQgIkV4dHJhY3RpbmcgYXJjaGl2ZSBmb3IgJXMiJShuYW1lLCkKKyAgICBidWlsZERpcj1vcy5wYXRoLmpvaW4oV09SS0RJUiwgJ19ibGQnKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhidWlsZERpcik6CisgICAgICAgIG9zLm1rZGlyKGJ1aWxkRGlyKQorCisgICAgd29ya0RpciA9IGV4dHJhY3RBcmNoaXZlKGJ1aWxkRGlyLCBzb3VyY2VBcmNoaXZlKQorICAgIG9zLmNoZGlyKHdvcmtEaXIpCisgICAgaWYgJ2J1aWxkRGlyJyBpbiByZWNpcGU6CisgICAgICAgIG9zLmNoZGlyKHJlY2lwZVsnYnVpbGREaXInXSkKKworCisgICAgZm9yIGZuIGluIHJlY2lwZS5nZXQoJ3BhdGNoZXMnLCAoKSk6CisgICAgICAgIGlmIGZuLnN0YXJ0c3dpdGgoJ2h0dHA6Ly8nKToKKyAgICAgICAgICAgICMgRG93bmxvYWQgdGhlIHBhdGNoIGJlZm9yZSBhcHBseWluZyBpdC4KKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oREVQU1JDLCBvcy5wYXRoLmJhc2VuYW1lKGZuKSkKKyAgICAgICAgICAgIGRvd25sb2FkVVJMKGZuLCBwYXRoKQorICAgICAgICAgICAgZm4gPSBwYXRoCisKKyAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oY3VyZGlyLCBmbikKKyAgICAgICAgcnVuQ29tbWFuZCgncGF0Y2ggLXAlcyA8ICVzJyUocmVjaXBlLmdldCgncGF0Y2hsZXZlbCcsIDEpLAorICAgICAgICAgICAgc2hlbGxRdW90ZShmbiksKSkKKworICAgIGNvbmZpZ3VyZV9hcmdzID0gWworICAgICAgICAiLS1wcmVmaXg9L3Vzci9sb2NhbCIsCisgICAgICAgICItLWVuYWJsZS1zdGF0aWMiLAorICAgICAgICAiLS1kaXNhYmxlLXNoYXJlZCIsCisgICAgICAgICMiQ1BQPWdjYyAtYXJjaCAlcyAtRSIlKCcgLWFyY2ggJy5qb2luKGFyY2hMaXN0LCksKSwKKyAgICBdCisKKyAgICBpZiAnY29uZmlndXJlX3ByZScgaW4gcmVjaXBlOgorICAgICAgICBhcmdzID0gbGlzdChyZWNpcGVbJ2NvbmZpZ3VyZV9wcmUnXSkKKyAgICAgICAgaWYgJy0tZGlzYWJsZS1zdGF0aWMnIGluIGFyZ3M6CisgICAgICAgICAgICBjb25maWd1cmVfYXJncy5yZW1vdmUoJy0tZW5hYmxlLXN0YXRpYycpCisgICAgICAgIGlmICctLWVuYWJsZS1zaGFyZWQnIGluIGFyZ3M6CisgICAgICAgICAgICBjb25maWd1cmVfYXJncy5yZW1vdmUoJy0tZGlzYWJsZS1zaGFyZWQnKQorICAgICAgICBjb25maWd1cmVfYXJncy5leHRlbmQoYXJncykKKworICAgIGlmIHJlY2lwZS5nZXQoJ3VzZUxERmxhZ3MnLCAxKToKKyAgICAgICAgY29uZmlndXJlX2FyZ3MuZXh0ZW5kKFsKKyAgICAgICAgICAgICJDRkxBR1M9LWFyY2ggJXMgLWlzeXNyb290ICVzIC1JJXMvdXNyL2xvY2FsL2luY2x1ZGUiJSgKKyAgICAgICAgICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oYXJjaExpc3QpLAorICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKFNES1BBVEgpWzE6LTFdLAorICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKGJhc2VkaXIpWzE6LTFdLCksCisgICAgICAgICAgICAiTERGTEFHUz0tc3lzbGlicm9vdCwlcyAtTCVzL3Vzci9sb2NhbC9saWIgLWFyY2ggJXMiJSgKKyAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKFNES1BBVEgpWzE6LTFdLAorICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoYmFzZWRpcilbMTotMV0sCisgICAgICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oYXJjaExpc3QpKSwKKyAgICAgICAgXSkKKyAgICBlbHNlOgorICAgICAgICBjb25maWd1cmVfYXJncy5leHRlbmQoWworICAgICAgICAgICAgIkNGTEFHUz0tYXJjaCAlcyAtaXN5c3Jvb3QgJXMgLUklcy91c3IvbG9jYWwvaW5jbHVkZSIlKAorICAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCksCisgICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoU0RLUEFUSClbMTotMV0sCisgICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoYmFzZWRpcilbMTotMV0sKSwKKyAgICAgICAgXSkKKworICAgIGlmICdjb25maWd1cmVfcG9zdCcgaW4gcmVjaXBlOgorICAgICAgICBjb25maWd1cmVfYXJncyA9IGNvbmZpZ3VyZV9hcmdzID0gbGlzdChyZWNpcGVbJ2NvbmZpZ3VyZV9wb3N0J10pCisKKyAgICBjb25maWd1cmVfYXJncy5pbnNlcnQoMCwgY29uZmlndXJlKQorICAgIGNvbmZpZ3VyZV9hcmdzID0gWyBzaGVsbFF1b3RlKGEpIGZvciBhIGluIGNvbmZpZ3VyZV9hcmdzIF0KKworICAgIHByaW50ICJSdW5uaW5nIGNvbmZpZ3VyZSBmb3IgJXMiJShuYW1lLCkKKyAgICBydW5Db21tYW5kKCcgJy5qb2luKGNvbmZpZ3VyZV9hcmdzKSArICcgMj4mMScpCisKKyAgICBwcmludCAiUnVubmluZyBpbnN0YWxsIGZvciAlcyIlKG5hbWUsKQorICAgIHJ1bkNvbW1hbmQoJ3sgJyArIGluc3RhbGwgKyAnIDt9IDI+JjEnKQorCisgICAgcHJpbnQgIkRvbmUgJXMiJShuYW1lLCkKKyAgICBwcmludCAiIgorCisgICAgb3MuY2hkaXIoY3VyZGlyKQorCitkZWYgYnVpbGRMaWJyYXJpZXMoKToKKyAgICAiIiIKKyAgICBCdWlsZCBvdXIgZGVwZW5kZW5jaWVzIGludG8gJFdPUktESVIvbGlicmFyaWVzL3Vzci9sb2NhbAorICAgICIiIgorICAgIHByaW50ICIiCisgICAgcHJpbnQgIkJ1aWxkaW5nIHJlcXVpcmVkIGxpYnJhcmllcyIKKyAgICBwcmludCAiIgorICAgIHVuaXZlcnNhbCA9IG9zLnBhdGguam9pbihXT1JLRElSLCAnbGlicmFyaWVzJykKKyAgICBvcy5ta2Rpcih1bml2ZXJzYWwpCisgICAgb3MubWFrZWRpcnMob3MucGF0aC5qb2luKHVuaXZlcnNhbCwgJ3VzcicsICdsb2NhbCcsICdsaWInKSkKKyAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmpvaW4odW5pdmVyc2FsLCAndXNyJywgJ2xvY2FsJywgJ2luY2x1ZGUnKSkKKworICAgIGZvciByZWNpcGUgaW4gTElCUkFSWV9SRUNJUEVTOgorICAgICAgICBidWlsZFJlY2lwZShyZWNpcGUsIHVuaXZlcnNhbCwgKCdpMzg2JywgJ3BwYycsKSkKKworCisKK2RlZiBidWlsZFB5dGhvbkRvY3MoKToKKyAgICAjIFRoaXMgc3RvcmVzIHRoZSBkb2N1bWVudGF0aW9uIGFzIFJlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VlbnRhdGlvbgorICAgICMgaW5zaWRlIHRoZSBmcmFtd29yay4gcHlkb2MgYW5kIElETEUgd2lsbCBwaWNrIGl0IHVwIHRoZXJlLgorICAgIHByaW50ICJJbnN0YWxsIHB5dGhvbiBkb2N1bWVudGF0aW9uIgorICAgIHJvb3REaXIgPSBvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ19yb290JykKKyAgICB2ZXJzaW9uID0gZ2V0VmVyc2lvbigpCisgICAgZG9jZGlyID0gb3MucGF0aC5qb2luKHJvb3REaXIsICdweWRvY3MnKQorCisgICAgbmFtZSA9ICdodG1sLSVzLnRhci5iejInJShnZXRGdWxsVmVyc2lvbigpLCkKKyAgICBzb3VyY2VBcmNoaXZlID0gb3MucGF0aC5qb2luKERFUFNSQywgbmFtZSkKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhzb3VyY2VBcmNoaXZlKToKKyAgICAgICAgcHJpbnQgIlVzaW5nIGxvY2FsIGNvcHkgb2YgJXMiJShuYW1lLCkKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ICJEb3dubG9hZGluZyAlcyIlKG5hbWUsKQorICAgICAgICBkb3dubG9hZFVSTCgnaHR0cDovL3d3dy5weXRob24ub3JnL2Z0cC9weXRob24vZG9jLyVzLyVzJyUoCisgICAgICAgICAgICBnZXRGdWxsVmVyc2lvbigpLCBuYW1lKSwgc291cmNlQXJjaGl2ZSkKKyAgICAgICAgcHJpbnQgIkFyY2hpdmUgZm9yICVzIHN0b3JlZCBhcyAlcyIlKG5hbWUsIHNvdXJjZUFyY2hpdmUpCisKKyAgICBleHRyYWN0QXJjaGl2ZShvcy5wYXRoLmRpcm5hbWUoZG9jZGlyKSwgc291cmNlQXJjaGl2ZSkKKyAgICBvcy5yZW5hbWUoCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRvY2RpciksICdQeXRob24tRG9jcy0lcyclKGdldEZ1bGxWZXJzaW9uKCksKSksCisgICAgICAgICAgICBkb2NkaXIpCisKKworZGVmIGJ1aWxkUHl0aG9uKCk6CisgICAgcHJpbnQgIkJ1aWxkaW5nIGEgdW5pdmVyc2FsIHB5dGhvbiIKKworICAgIGJ1aWxkRGlyID0gb3MucGF0aC5qb2luKFdPUktESVIsICdfYmxkJywgJ3B5dGhvbicpCisgICAgcm9vdERpciA9IG9zLnBhdGguam9pbihXT1JLRElSLCAnX3Jvb3QnKQorCisgICAgaWYgb3MucGF0aC5leGlzdHMoYnVpbGREaXIpOgorICAgICAgICBzaHV0aWwucm10cmVlKGJ1aWxkRGlyKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKHJvb3REaXIpOgorICAgICAgICBzaHV0aWwucm10cmVlKHJvb3REaXIpCisgICAgb3MubWtkaXIoYnVpbGREaXIpCisgICAgb3MubWtkaXIocm9vdERpcikKKyAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4ocm9vdERpciwgJ2VtcHR5LWRpcicpKQorICAgIGN1cmRpciA9IG9zLmdldGN3ZCgpCisgICAgb3MuY2hkaXIoYnVpbGREaXIpCisKKyAgICAjIE5vdCBzdXJlIGlmIHRoaXMgaXMgc3RpbGwgbmVlZGVkLCB0aGUgb3JpZ2luYWwgYnVpbGQgc2NyaXB0CisgICAgIyBjbGFpbXMgdGhhdCBwYXJ0cyBvZiB0aGUgaW5zdGFsbCBhc3N1bWUgcHl0aG9uLmV4ZSBleGlzdHMuCisgICAgb3Muc3ltbGluaygncHl0aG9uJywgb3MucGF0aC5qb2luKGJ1aWxkRGlyLCAncHl0aG9uLmV4ZScpKQorCisgICAgIyBFeHRyYWN0IHRoZSB2ZXJzaW9uIGZyb20gdGhlIGNvbmZpZ3VyZSBmaWxlLCBuZWVkZWQgdG8gY2FsY3VsYXRlCisgICAgIyBzZXZlcmFsIHBhdGhzLgorICAgIHZlcnNpb24gPSBnZXRWZXJzaW9uKCkKKworICAgIHByaW50ICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKKyAgICBydW5Db21tYW5kKCIlcyAtQyAtLWVuYWJsZS1mcmFtZXdvcmsgLS1lbmFibGUtdW5pdmVyc2Fsc2RrPSVzIExERkxBR1M9Jy1nIC1MJXMvbGlicmFyaWVzL3Vzci9sb2NhbC9saWInIE9QVD0nLWcgLU8zIC1JJXMvbGlicmFyaWVzL3Vzci9sb2NhbC9pbmNsdWRlJyAyPiYxIiUoCisgICAgICAgIHNoZWxsUXVvdGUob3MucGF0aC5qb2luKFNSQ0RJUiwgJ2NvbmZpZ3VyZScpKSwKKyAgICAgICAgc2hlbGxRdW90ZShTREtQQVRIKSwgc2hlbGxRdW90ZShXT1JLRElSKVsxOi0xXSwKKyAgICAgICAgc2hlbGxRdW90ZShXT1JLRElSKVsxOi0xXSkpCisKKyAgICBwcmludCAiUnVubmluZyBtYWtlIgorICAgIHJ1bkNvbW1hbmQoIm1ha2UiKQorCisgICAgcHJpbnQgIlJ1bmluZyBtYWtlIGZyYW1ld29ya2luc3RhbGwiCisgICAgcnVuQ29tbWFuZCgibWFrZSBmcmFtZXdvcmtpbnN0YWxsIERFU1RESVI9JXMiJSgKKyAgICAgICAgc2hlbGxRdW90ZShyb290RGlyKSkpCisKKyAgICBwcmludCAiUnVuaW5nIG1ha2UgZnJhbWV3b3JraW5zdGFsbGV4dHJhcyIKKyAgICBydW5Db21tYW5kKCJtYWtlIGZyYW1ld29ya2luc3RhbGxleHRyYXMgREVTVERJUj0lcyIlKAorICAgICAgICBzaGVsbFF1b3RlKHJvb3REaXIpKSkKKworICAgIHByaW50ICJDb3B5IHJlcXVpcmVkIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnLCAnTGlicmFyeScpKToKKyAgICAgICAgcnVuQ29tbWFuZCgibXYgJXMvKiAlcyIlKAorICAgICAgICAgICAgc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgV09SS0RJUiwgJ2xpYnJhcmllcycsICdMaWJyYXJ5JywgJ0ZyYW1ld29ya3MnLAorICAgICAgICAgICAgICAgICdQeXRob24uZnJhbWV3b3JrJywgJ1ZlcnNpb25zJywgZ2V0VmVyc2lvbigpLAorICAgICAgICAgICAgICAgICdsaWInKSksCisgICAgICAgICAgICBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnX3Jvb3QnLCAnTGlicmFyeScsICdGcmFtZXdvcmtzJywKKyAgICAgICAgICAgICAgICAnUHl0aG9uLmZyYW1ld29yaycsICdWZXJzaW9ucycsIGdldFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAnbGliJykpKSkKKworICAgIHByaW50ICJGaXggZmlsZSBtb2RlcyIKKyAgICBmcm1EaXIgPSBvcy5wYXRoLmpvaW4ocm9vdERpciwgJ0xpYnJhcnknLCAnRnJhbWV3b3JrcycsICdQeXRob24uZnJhbWV3b3JrJykKKyAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGZybURpcik6CisgICAgICAgIGZvciBkbiBpbiBkaXJuYW1lczoKKyAgICAgICAgICAgIG9zLmNobW9kKG9zLnBhdGguam9pbihkaXJwYXRoLCBkbiksIDA3NzUpCisKKyAgICAgICAgZm9yIGZuIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKGZuKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjICJjaG1vZCBnK3cgJGZuIgorICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmbikKKyAgICAgICAgICAgIHN0ID0gb3Muc3RhdChwKQorICAgICAgICAgICAgb3MuY2htb2QocCwgc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpIHwgc3RhdC5TX0lYR1JQKQorCisgICAgIyBXZSBhZGRlZCBzb21lIGRpcmVjdG9yaWVzIHRvIHRoZSBzZWFyY2ggcGF0aCBkdXJpbmcgdGhlIGNvbmZpZ3VyZQorICAgICMgcGhhc2UuIFJlbW92ZSB0aG9zZSBiZWNhdXNlIHRob3NlIGRpcmVjdG9yaWVzIHdvbid0IGJlIHRoZXJlIG9uCisgICAgIyB0aGUgZW5kLXVzZXJzIHN5c3RlbS4KKyAgICBwYXRoID1vcy5wYXRoLmpvaW4ocm9vdERpciwgJ0xpYnJhcnknLCAnRnJhbWV3b3JrcycsICdQeXRob24uZnJhbWV3b3JrJywKKyAgICAgICAgICAgICAgICAnVmVyc2lvbnMnLCB2ZXJzaW9uLCAnbGliJywgJ3B5dGhvbiVzJyUodmVyc2lvbiwpLAorICAgICAgICAgICAgICAgICdjb25maWcnLCAnTWFrZWZpbGUnKQorICAgIGZwID0gb3BlbihwYXRoLCAncicpCisgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgIGZwLmNsb3NlKCkKKworICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJy1MJXMvbGlicmFyaWVzL3Vzci9sb2NhbC9saWInJShXT1JLRElSLCksICcnKQorICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJy1JJXMvbGlicmFyaWVzL3Vzci9sb2NhbC9pbmNsdWRlJyUoV09SS0RJUiwpLCAnJykKKyAgICBmcCA9IG9wZW4ocGF0aCwgJ3cnKQorICAgIGZwLndyaXRlKGRhdGEpCisgICAgZnAuY2xvc2UoKQorCisgICAgIyBBZGQgc3ltbGlua3MgaW4gL3Vzci9sb2NhbC9iaW4sIHVzaW5nIHJlbGF0aXZlIGxpbmtzCisgICAgdXNyX2xvY2FsX2JpbiA9IG9zLnBhdGguam9pbihyb290RGlyLCAndXNyJywgJ2xvY2FsJywgJ2JpbicpCisgICAgdG9fZnJhbWV3b3JrID0gb3MucGF0aC5qb2luKCcuLicsICcuLicsICcuLicsICdMaWJyYXJ5JywgJ0ZyYW1ld29ya3MnLAorICAgICAgICAgICAgJ1B5dGhvbi5mcmFtZXdvcmsnLCAnVmVyc2lvbnMnLCB2ZXJzaW9uLCAnYmluJykKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyh1c3JfbG9jYWxfYmluKToKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh1c3JfbG9jYWxfYmluKQorICAgIG9zLm1ha2VkaXJzKHVzcl9sb2NhbF9iaW4pCisgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIoCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGZybURpciwgJ1ZlcnNpb25zJywgdmVyc2lvbiwgJ2JpbicpKToKKyAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLmpvaW4odG9fZnJhbWV3b3JrLCBmbiksCisgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHVzcl9sb2NhbF9iaW4sIGZuKSkKKworICAgIG9zLmNoZGlyKGN1cmRpcikKKworCisKK2RlZiBwYXRjaEZpbGUoaW5QYXRoLCBvdXRQYXRoKToKKyAgICBkYXRhID0gZmlsZUNvbnRlbnRzKGluUGF0aCkKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCckRlVMTF9WRVJTSU9OJywgZ2V0RnVsbFZlcnNpb24oKSkKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCckVkVSU0lPTicsIGdldFZlcnNpb24oKSkKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCckTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJywgJzEwLjMgb3IgbGF0ZXInKQorICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJyRBUkNISVRFQ1RVUkVTJywgImkzODYsIHBwYyIpCisgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgnJElOU1RBTExfU0laRScsIGluc3RhbGxTaXplKCkpCisgICAgZnAgPSBvcGVuKG91dFBhdGgsICd3YicpCisgICAgZnAud3JpdGUoZGF0YSkKKyAgICBmcC5jbG9zZSgpCisKK2RlZiBwYXRjaFNjcmlwdChpblBhdGgsIG91dFBhdGgpOgorICAgIGRhdGEgPSBmaWxlQ29udGVudHMoaW5QYXRoKQorICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJ0BQWVZFUkAnLCBnZXRWZXJzaW9uKCkpCisgICAgZnAgPSBvcGVuKG91dFBhdGgsICd3YicpCisgICAgZnAud3JpdGUoZGF0YSkKKyAgICBmcC5jbG9zZSgpCisgICAgb3MuY2htb2Qob3V0UGF0aCwgMDc1NSkKKworCisKK2RlZiBwYWNrYWdlRnJvbVJlY2lwZSh0YXJnZXREaXIsIHJlY2lwZSk6CisgICAgY3VyZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICB0cnk6CisgICAgICAgIHBrZ25hbWUgPSByZWNpcGVbJ25hbWUnXQorICAgICAgICBzcmNkaXIgID0gcmVjaXBlLmdldCgnc291cmNlJykKKyAgICAgICAgcGtncm9vdCA9IHJlY2lwZS5nZXQoJ3RvcGRpcicsIHNyY2RpcikKKyAgICAgICAgcG9zdGZsaWdodCA9IHJlY2lwZS5nZXQoJ3Bvc3RmbGlnaHQnKQorICAgICAgICByZWFkbWUgPSB0ZXh0d3JhcC5kZWRlbnQocmVjaXBlWydyZWFkbWUnXSkKKyAgICAgICAgaXNSZXF1aXJlZCA9IHJlY2lwZS5nZXQoJ3JlcXVpcmVkJywgVHJ1ZSkKKworICAgICAgICBwcmludCAiLSBidWlsZGluZyBwYWNrYWdlICVzIiUocGtnbmFtZSwpCisKKyAgICAgICAgIyBTdWJzdGl0dXRlIHNvbWUgdmFyaWFibGVzCisgICAgICAgIHRleHR2YXJzID0gZGljdCgKKyAgICAgICAgICAgIFZFUj1nZXRWZXJzaW9uKCksCisgICAgICAgICAgICBGVUxMVkVSPWdldEZ1bGxWZXJzaW9uKCksCisgICAgICAgICkKKyAgICAgICAgcmVhZG1lID0gcmVhZG1lICUgdGV4dHZhcnMKKworICAgICAgICBpZiBwa2dyb290IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGtncm9vdCA9IHBrZ3Jvb3QgJSB0ZXh0dmFycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGtncm9vdCA9ICcvJworCisgICAgICAgIGlmIHNyY2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNyY2RpciA9IG9zLnBhdGguam9pbihXT1JLRElSLCAnX3Jvb3QnLCBzcmNkaXJbMTpdKQorICAgICAgICAgICAgc3JjZGlyID0gc3JjZGlyICUgdGV4dHZhcnMKKworICAgICAgICBpZiBwb3N0ZmxpZ2h0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcG9zdGZsaWdodCA9IG9zLnBhdGguYWJzcGF0aChwb3N0ZmxpZ2h0KQorCisgICAgICAgIHBhY2thZ2VDb250ZW50cyA9IG9zLnBhdGguam9pbih0YXJnZXREaXIsIHBrZ25hbWUgKyAnLnBrZycsICdDb250ZW50cycpCisgICAgICAgIG9zLm1ha2VkaXJzKHBhY2thZ2VDb250ZW50cykKKworICAgICAgICBpZiBzcmNkaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcy5jaGRpcihzcmNkaXIpCisgICAgICAgICAgICBydW5Db21tYW5kKCJwYXggLXdmICVzIC4gMj4mMSIlKHNoZWxsUXVvdGUob3MucGF0aC5qb2luKHBhY2thZ2VDb250ZW50cywgJ0FyY2hpdmUucGF4JykpLCkpCisgICAgICAgICAgICBydW5Db21tYW5kKCJnemlwIC05ICVzIDI+JjEiJShzaGVsbFF1b3RlKG9zLnBhdGguam9pbihwYWNrYWdlQ29udGVudHMsICdBcmNoaXZlLnBheCcpKSwpKQorICAgICAgICAgICAgcnVuQ29tbWFuZCgibWtib20gLiAlcyAyPiYxIiUoc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4ocGFja2FnZUNvbnRlbnRzLCAnQXJjaGl2ZS5ib20nKSksKSkKKworICAgICAgICBmbiA9IG9zLnBhdGguam9pbihwYWNrYWdlQ29udGVudHMsICdQa2dJbmZvJykKKyAgICAgICAgZnAgPSBvcGVuKGZuLCAndycpCisgICAgICAgIGZwLndyaXRlKCdwbWtycGtnMScpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICByc3JjRGlyID0gb3MucGF0aC5qb2luKHBhY2thZ2VDb250ZW50cywgIlJlc291cmNlcyIpCisgICAgICAgIG9zLm1rZGlyKHJzcmNEaXIpCisgICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4ocnNyY0RpciwgJ1JlYWRNZS50eHQnKSwgJ3cnKQorICAgICAgICBmcC53cml0ZShyZWFkbWUpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICBpZiBwb3N0ZmxpZ2h0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGF0Y2hTY3JpcHQocG9zdGZsaWdodCwgb3MucGF0aC5qb2luKHJzcmNEaXIsICdwb3N0ZmxpZ2h0JykpCisKKyAgICAgICAgdmVycyA9IGdldEZ1bGxWZXJzaW9uKCkKKyAgICAgICAgbWFqb3IsIG1pbm9yID0gbWFwKGludCwgZ2V0VmVyc2lvbigpLnNwbGl0KCcuJywgMikpCisgICAgICAgIHBsID0gUGxpc3QoCisgICAgICAgICAgICAgICAgQ0ZCdW5kbGVHZXRJbmZvU3RyaW5nPSJNYWNQeXRob24uJXMgJXMiJShwa2duYW1lLCB2ZXJzLCksCisgICAgICAgICAgICAgICAgQ0ZCdW5kbGVJZGVudGlmaWVyPSdvcmcucHl0aG9uLk1hY1B5dGhvbi4lcyclKHBrZ25hbWUsKSwKKyAgICAgICAgICAgICAgICBDRkJ1bmRsZU5hbWU9J01hY1B5dGhvbi4lcyclKHBrZ25hbWUsKSwKKyAgICAgICAgICAgICAgICBDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZz12ZXJzLAorICAgICAgICAgICAgICAgIElGTWFqb3JWZXJzaW9uPW1ham9yLAorICAgICAgICAgICAgICAgIElGTWlub3JWZXJzaW9uPW1pbm9yLAorICAgICAgICAgICAgICAgIElGUGtnRm9ybWF0VmVyc2lvbj0wLjEwMDAwMDAwMTQ5MDExNjEyLAorICAgICAgICAgICAgICAgIElGUGtnRmxhZ0FsbG93QmFja1Jldj1GYWxzZSwKKyAgICAgICAgICAgICAgICBJRlBrZ0ZsYWdBdXRob3JpemF0aW9uQWN0aW9uPSJSb290QXV0aG9yaXphdGlvbiIsCisgICAgICAgICAgICAgICAgSUZQa2dGbGFnRGVmYXVsdExvY2F0aW9uPXBrZ3Jvb3QsCisgICAgICAgICAgICAgICAgSUZQa2dGbGFnRm9sbG93TGlua3M9VHJ1ZSwKKyAgICAgICAgICAgICAgICBJRlBrZ0ZsYWdJbnN0YWxsRmF0PVRydWUsCisgICAgICAgICAgICAgICAgSUZQa2dGbGFnSXNSZXF1aXJlZD1pc1JlcXVpcmVkLAorICAgICAgICAgICAgICAgIElGUGtnRmxhZ092ZXJ3cml0ZVBlcm1pc3Npb25zPUZhbHNlLAorICAgICAgICAgICAgICAgIElGUGtnRmxhZ1JlbG9jYXRhYmxlPUZhbHNlLAorICAgICAgICAgICAgICAgIElGUGtnRmxhZ1Jlc3RhcnRBY3Rpb249Ik5vUmVzdGFydCIsCisgICAgICAgICAgICAgICAgSUZQa2dGbGFnUm9vdFZvbHVtZU9ubHk9VHJ1ZSwKKyAgICAgICAgICAgICAgICBJRlBrZ0ZsYWdVcGRhdGVJbnN0YWxsZWRMYW5nYXVnZXM9RmFsc2UsCisgICAgICAgICAgICApCisgICAgICAgIHdyaXRlUGxpc3QocGwsIG9zLnBhdGguam9pbihwYWNrYWdlQ29udGVudHMsICdJbmZvLnBsaXN0JykpCisKKyAgICAgICAgcGwgPSBQbGlzdCgKKyAgICAgICAgICAgICAgICAgICAgSUZQa2dEZXNjcmlwdGlvbkRlc2NyaXB0aW9uPXJlYWRtZSwKKyAgICAgICAgICAgICAgICAgICAgSUZQa2dEZXNjcmlwdGlvblRpdGxlPXJlY2lwZS5nZXQoJ2xvbmdfbmFtZScsICJNYWNQeXRob24uJXMiJShwa2duYW1lLCkpLAorICAgICAgICAgICAgICAgICAgICBJRlBrZ0Rlc2NyaXB0aW9uVmVyc2lvbj12ZXJzLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgd3JpdGVQbGlzdChwbCwgb3MucGF0aC5qb2luKHBhY2thZ2VDb250ZW50cywgJ1Jlc291cmNlcycsICdEZXNjcmlwdGlvbi5wbGlzdCcpKQorCisgICAgZmluYWxseToKKyAgICAgICAgb3MuY2hkaXIoY3VyZGlyKQorCisKK2RlZiBtYWtlTXBrZ1BsaXN0KHBhdGgpOgorCisgICAgdmVycyA9IGdldEZ1bGxWZXJzaW9uKCkKKyAgICBtYWpvciwgbWlub3IgPSBtYXAoaW50LCBnZXRWZXJzaW9uKCkuc3BsaXQoJy4nLCAyKSkKKworICAgIHBsID0gUGxpc3QoCisgICAgICAgICAgICBDRkJ1bmRsZUdldEluZm9TdHJpbmc9Ik1hY1B5dGhvbiAlcyIlKHZlcnMsKSwKKyAgICAgICAgICAgIENGQnVuZGxlSWRlbnRpZmllcj0nb3JnLnB5dGhvbi5NYWNQeXRob24nLAorICAgICAgICAgICAgQ0ZCdW5kbGVOYW1lPSdNYWNQeXRob24nLAorICAgICAgICAgICAgQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmc9dmVycywKKyAgICAgICAgICAgIElGTWFqb3JWZXJzaW9uPW1ham9yLAorICAgICAgICAgICAgSUZNaW5vclZlcnNpb249bWlub3IsCisgICAgICAgICAgICBJRlBrZ0ZsYWdDb21wb25lbnREaXJlY3Rvcnk9IkNvbnRlbnRzL1BhY2thZ2VzIiwKKyAgICAgICAgICAgIElGUGtnRmxhZ1BhY2thZ2VMaXN0PVsKKyAgICAgICAgICAgICAgICBkaWN0KAorICAgICAgICAgICAgICAgICAgICBJRlBrZ0ZsYWdQYWNrYWdlTG9jYXRpb249JyVzLnBrZyclKGl0ZW1bJ25hbWUnXSksCisgICAgICAgICAgICAgICAgICAgIElGUGtnRmxhZ1BhY2thZ2VTZWxlY3Rpb249J3NlbGVjdGVkJworICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBQS0dfUkVDSVBFUworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIElGUGtnRm9ybWF0VmVyc2lvbj0wLjEwMDAwMDAwMTQ5MDExNjEyLAorICAgICAgICAgICAgSUZQa2dGbGFnQmFja2dyb3VuZFNjYWxpbmc9InByb3BvcnRpb25hbCIsCisgICAgICAgICAgICBJRlBrZ0ZsYWdCYWNrZ3JvdW5kQWxpZ25tZW50PSJsZWZ0IiwKKyAgICAgICAgKQorCisgICAgd3JpdGVQbGlzdChwbCwgcGF0aCkKKworCitkZWYgYnVpbGRJbnN0YWxsZXIoKToKKworICAgICMgWmFwIGFsbCBjb21waWxlZCBmaWxlcworICAgIGZvciBkaXJwYXRoLCBfLCBmaWxlbmFtZXMgaW4gb3Mud2Fsayhvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ19yb290JykpOgorICAgICAgICBmb3IgZm4gaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy5weWMnKSBvciBmbi5lbmRzd2l0aCgnLnB5bycpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oZGlycGF0aCwgZm4pKQorCisgICAgb3V0ZGlyID0gb3MucGF0aC5qb2luKFdPUktESVIsICdpbnN0YWxsZXInKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKG91dGRpcik6CisgICAgICAgIHNodXRpbC5ybXRyZWUob3V0ZGlyKQorICAgIG9zLm1rZGlyKG91dGRpcikKKworICAgIHBrZ3Jvb3QgPSBvcy5wYXRoLmpvaW4ob3V0ZGlyLCAnTWFjUHl0aG9uLm1wa2cnLCAnQ29udGVudHMnKQorICAgIHBrZ2NvbnRlbnRzID0gb3MucGF0aC5qb2luKHBrZ3Jvb3QsICdQYWNrYWdlcycpCisgICAgb3MubWFrZWRpcnMocGtnY29udGVudHMpCisgICAgZm9yIHJlY2lwZSBpbiBQS0dfUkVDSVBFUzoKKyAgICAgICAgcGFja2FnZUZyb21SZWNpcGUocGtnY29udGVudHMsIHJlY2lwZSkKKworICAgIHJzcmNEaXIgPSBvcy5wYXRoLmpvaW4ocGtncm9vdCwgJ1Jlc291cmNlcycpCisKKyAgICBmbiA9IG9zLnBhdGguam9pbihwa2dyb290LCAnUGtnSW5mbycpCisgICAgZnAgPSBvcGVuKGZuLCAndycpCisgICAgZnAud3JpdGUoJ3Bta3Jwa2cxJykKKyAgICBmcC5jbG9zZSgpCisKKyAgICBvcy5ta2Rpcihyc3JjRGlyKQorCisgICAgbWFrZU1wa2dQbGlzdChvcy5wYXRoLmpvaW4ocGtncm9vdCwgJ0luZm8ucGxpc3QnKSkKKyAgICBwbCA9IFBsaXN0KAorICAgICAgICAgICAgICAgIElGUGtnRGVzY3JpcHRpb25UaXRsZT0iVW5pdmVyc2FsIE1hY1B5dGhvbiIsCisgICAgICAgICAgICAgICAgSUZQa2dEZXNjcmlwdGlvblZlcnNpb249Z2V0VmVyc2lvbigpLAorICAgICAgICAgICAgKQorCisgICAgd3JpdGVQbGlzdChwbCwgb3MucGF0aC5qb2luKHBrZ3Jvb3QsICdSZXNvdXJjZXMnLCAnRGVzY3JpcHRpb24ucGxpc3QnKSkKKyAgICBmb3IgZm4gaW4gb3MubGlzdGRpcigncmVzb3VyY2VzJyk6CisgICAgICAgIGlmIGZuID09ICcuc3ZuJzogY29udGludWUKKyAgICAgICAgaWYgZm4uZW5kc3dpdGgoJy5qcGcnKToKKyAgICAgICAgICAgIHNodXRpbC5jb3B5KG9zLnBhdGguam9pbigncmVzb3VyY2VzJywgZm4pLCBvcy5wYXRoLmpvaW4ocnNyY0RpciwgZm4pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0Y2hGaWxlKG9zLnBhdGguam9pbigncmVzb3VyY2VzJywgZm4pLCBvcy5wYXRoLmpvaW4ocnNyY0RpciwgZm4pKQorCisgICAgc2h1dGlsLmNvcHkoIi4uLy4uLy4uL0xJQ0VOU0UiLCBvcy5wYXRoLmpvaW4ocnNyY0RpciwgJ0xpY2Vuc2UudHh0JykpCisKKworZGVmIGluc3RhbGxTaXplKGNsZWFyPUZhbHNlLCBfc2F2ZWQ9W10pOgorICAgIGlmIGNsZWFyOgorICAgICAgICBkZWwgX3NhdmVkWzpdCisgICAgaWYgbm90IF9zYXZlZDoKKyAgICAgICAgZGF0YSA9IGNhcHR1cmVDb21tYW5kKCJkdSAta3MgJXMiJSgKKyAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ19yb290JykpKSkKKyAgICAgICAgX3NhdmVkLmFwcGVuZCgiJWQiJSgoMC41ICsgKGludChkYXRhLnNwbGl0KClbMF0pIC8gMTAyNC4wKSksKSkKKyAgICByZXR1cm4gX3NhdmVkWzBdCisKKworZGVmIGJ1aWxkRE1HKCk6CisgICAgIiIiCisgICAgQ3JlYXRlIERNRyBjb250YWluaW5nIHRoZSByb290RGlyCisgICAgIiIiCisgICAgb3V0ZGlyID0gb3MucGF0aC5qb2luKFdPUktESVIsICdkaXNraW1hZ2UnKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKG91dGRpcik6CisgICAgICAgIHNodXRpbC5ybXRyZWUob3V0ZGlyKQorCisgICAgaW1hZ2VwYXRoID0gb3MucGF0aC5qb2luKG91dGRpciwKKyAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbi0lcy1tYWNvc3gnJShnZXRGdWxsVmVyc2lvbigpLCkpCisgICAgaWYgSU5DTFVERV9USU1FU1RBTVA6CisgICAgICAgIGltYWdlcGF0aCA9IGltYWdlcGF0aCArICclMDRkLSUwMmQtJTAyZCclKHRpbWUubG9jYWx0aW1lKClbOjNdKQorICAgIGltYWdlcGF0aCA9IGltYWdlcGF0aCArICcuZG1nJworCisgICAgb3MubWtkaXIob3V0ZGlyKQorICAgIHJ1bkNvbW1hbmQoImhkaXV0aWwgY3JlYXRlIC12b2xuYW1lICdVbml2ZXJhbCBNYWNQeXRob24gJXMnIC1zcmNmb2xkZXIgJXMgJXMiJSgKKyAgICAgICAgICAgIGdldEZ1bGxWZXJzaW9uKCksCisgICAgICAgICAgICBzaGVsbFF1b3RlKG9zLnBhdGguam9pbihXT1JLRElSLCAnaW5zdGFsbGVyJykpLAorICAgICAgICAgICAgc2hlbGxRdW90ZShpbWFnZXBhdGgpKSkKKworICAgIHJldHVybiBpbWFnZXBhdGgKKworCitkZWYgc2V0SWNvbihmaWxlUGF0aCwgaWNuc1BhdGgpOgorICAgICIiIgorICAgIFNldCB0aGUgY3VzdG9tIGljb24gZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkuCisKKyAgICBGb3IgYSBkaXJlY3RvcnkgdGhlIGljb24gZGF0YSBpcyB3cml0dGVuIGluIGEgZmlsZSBuYW1lZCAnSWNvblxyJyBpbnNpZGUKKyAgICB0aGUgZGlyZWN0b3J5LiBGb3IgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd3JpdGUgdGhlIGljb24gYXMgYW4gJ2ljbnMnCisgICAgcmVzb3VyY2UuIEZ1cnRoZXJtb3JlIHNldCBrSGFzQ3VzdG9tSWNvbiBpbiB0aGUgZmluZGVyIGZsYWdzIGZvciBmaWxlUGF0aC4KKyAgICAiIiIKKyAgICByZWYsIGlzRGlyZWN0b3J5ID0gQ2FyYm9uLkZpbGUuRlNQYXRoTWFrZVJlZihpY25zUGF0aCkKKyAgICBpY29uID0gQ2FyYm9uLkljbi5SZWFkSWNvbkZpbGUocmVmKQorICAgIGRlbCByZWYKKworICAgICMKKyAgICAjIE9wZW4gdGhlIHJlc291cmNlIGZvcmsgb2YgdGhlIHRhcmdldCwgdG8gYWRkIHRoZSBpY29uIGxhdGVyIG9uLgorICAgICMgRm9yIGRpcmVjdG9yaWVzIHdlIHVzZSB0aGUgZmlsZSAnSWNvblxyJyBpbnNpZGUgdGhlIGRpcmVjdG9yeS4KKyAgICAjCisKKyAgICByZWYsIGlzRGlyZWN0b3J5ID0gQ2FyYm9uLkZpbGUuRlNQYXRoTWFrZVJlZihmaWxlUGF0aCkKKworICAgIGlmIGlzRGlyZWN0b3J5OgorICAgICAgICB0bXBQYXRoID0gb3MucGF0aC5qb2luKGZpbGVQYXRoLCAiSWNvblxyIikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRtcFBhdGgpOgorICAgICAgICAgICAgZnAgPSBvcGVuKHRtcFBhdGgsICd3JykKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICB0bXBSZWYsIF8gPSBDYXJib24uRmlsZS5GU1BhdGhNYWtlUmVmKHRtcFBhdGgpCisgICAgICAgIHNwZWMgPSBDYXJib24uRmlsZS5GU1NwZWModG1wUmVmKQorCisgICAgZWxzZToKKyAgICAgICAgc3BlYyA9IENhcmJvbi5GaWxlLkZTU3BlYyhyZWYpCisKKyAgICB0cnk6CisgICAgICAgIENhcmJvbi5SZXMuSENyZWF0ZVJlc0ZpbGUoKnNwZWMuYXNfdHVwbGUoKSkKKyAgICBleGNlcHQgTWFjT1MuRXJyb3I6CisgICAgICAgIHBhc3MKKworICAgICMgVHJ5IHRvIGNyZWF0ZSB0aGUgcmVzb3VyY2UgZm9yayBhZ2FpbiwgdGhpcyB3aWxsIGF2b2lkIHByb2JsZW1zCisgICAgIyB3aGVuIGFkZGluZyBhbiBpY29uIHRvIGEgZGlyZWN0b3J5LiBJIGhhdmUgbm8gaWRlYSB3aHkgdGhpcyBoZWxwcywKKyAgICAjIGJ1dCB3aXRob3V0IHRoaXMgYWRkaW5nIHRoZSBpY29uIHRvIGEgZGlyZWN0b3J5IHdpbGwgZmFpbCBzb21ldGltZXMuCisgICAgdHJ5OgorICAgICAgICBDYXJib24uUmVzLkhDcmVhdGVSZXNGaWxlKCpzcGVjLmFzX3R1cGxlKCkpCisgICAgZXhjZXB0IE1hY09TLkVycm9yOgorICAgICAgICBwYXNzCisKKyAgICByZWZOdW0gPSBDYXJib24uUmVzLkZTcE9wZW5SZXNGaWxlKHNwZWMsIGZzUmRXclBlcm0pCisKKyAgICBDYXJib24uUmVzLlVzZVJlc0ZpbGUocmVmTnVtKQorCisgICAgIyBDaGVjayBpZiB0aGVyZSBhbHJlYWR5IGlzIGFuIGljb24sIHJlbW92ZSBpdCBpZiB0aGVyZSBpcy4KKyAgICB0cnk6CisgICAgICAgIGggPSBDYXJib24uUmVzLkdldDFSZXNvdXJjZSgnaWNucycsIGtDdXN0b21JY29uUmVzb3VyY2UpCisgICAgZXhjZXB0IE1hY09TLkVycm9yOgorICAgICAgICBwYXNzCisKKyAgICBlbHNlOgorICAgICAgICBoLlJlbW92ZVJlc291cmNlKCkKKyAgICAgICAgZGVsIGgKKworICAgICMgQWRkIHRoZSBpY29uIHRvIHRoZSByZXNvdXJjZSBmb3Igb2YgdGhlIHRhcmdldAorICAgIHJlcyA9IENhcmJvbi5SZXMuUmVzb3VyY2UoaWNvbikKKyAgICByZXMuQWRkUmVzb3VyY2UoJ2ljbnMnLCBrQ3VzdG9tSWNvblJlc291cmNlLCAnJykKKyAgICByZXMuV3JpdGVSZXNvdXJjZSgpCisgICAgcmVzLkRldGFjaFJlc291cmNlKCkKKyAgICBDYXJib24uUmVzLkNsb3NlUmVzRmlsZShyZWZOdW0pCisKKyAgICAjIEFuZCBub3cgc2V0IHRoZSBrSGFzQ3VzdG9tSWNvbiBwcm9wZXJ0eSBmb3IgdGhlIHRhcmdldC4gQW5ub3lpbmdseSwKKyAgICAjIHB5dGhvbiBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBiaW5kaW5ncyBmb3IgdGhlIEFQSSB0aGF0IGlzIG5lZWRlZCBmb3IKKyAgICAjIHRoaXMuIENvcCBvdXQgYW5kIGNhbGwgU2V0RmlsZQorICAgIG9zLnN5c3RlbSgiL0RldmVsb3Blci9Ub29scy9TZXRGaWxlIC1hIEMgJXMiJSgKKyAgICAgICAgICAgIHNoZWxsUXVvdGUoZmlsZVBhdGgpLCkpCisKKyAgICBpZiBpc0RpcmVjdG9yeToKKyAgICAgICAgb3Muc3lzdGVtKCcvRGV2ZWxvcGVyL1Rvb2xzL1NldEZpbGUgLWEgViAlcyclKAorICAgICAgICAgICAgc2hlbGxRdW90ZSh0bXBQYXRoKSwKKyAgICAgICAgKSkKKworZGVmIG1haW4oKToKKyAgICAjIEZpcnN0IHBhcnNlIG9wdGlvbnMgYW5kIGNoZWNrIGlmIHdlIGNhbiBwZXJmb3JtIG91ciB3b3JrCisgICAgcGFyc2VPcHRpb25zKCkKKyAgICBjaGVja0Vudmlyb25tZW50KCkKKworICAgIG9zLmVudmlyb25bJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddID0gJzEwLjMnCisKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhXT1JLRElSKToKKyAgICAgICAgc2h1dGlsLnJtdHJlZShXT1JLRElSKQorICAgIG9zLm1rZGlyKFdPUktESVIpCisKKyAgICAjIFRoZW4gYnVpbGQgdGhpcmQtcGFydHkgbGlicmFyaWVzIHN1Y2ggYXMgc2xlZXB5Y2F0IERCNC4KKyAgICBidWlsZExpYnJhcmllcygpCisKKyAgICAjIE5vdyBidWlsZCBweXRob24gaXRzZWxmCisgICAgYnVpbGRQeXRob24oKQorICAgIGJ1aWxkUHl0aG9uRG9jcygpCisgICAgZm4gPSBvcy5wYXRoLmpvaW4oV09SS0RJUiwgIl9yb290IiwgIkFwcGxpY2F0aW9ucyIsCisgICAgICAgICAgICAgICAgIk1hY1B5dGhvbiAlcyIlKGdldFZlcnNpb24oKSwpLCAiVXBkYXRlIFNoZWxsIFByb2ZpbGUuY29tbWFuZCIpCisgICAgc2h1dGlsLmNvcHkoInNjcmlwdHMvcG9zdGZsaWdodC5wYXRjaC1wcm9maWxlIiwgIGZuKQorICAgIG9zLmNobW9kKGZuLCAwNzU1KQorCisgICAgZm9sZGVyID0gb3MucGF0aC5qb2luKFdPUktESVIsICJfcm9vdCIsICJBcHBsaWNhdGlvbnMiLCAiTWFjUHl0aG9uICVzIiUoCisgICAgICAgIGdldFZlcnNpb24oKSwpKQorICAgIG9zLmNobW9kKGZvbGRlciwgMDc1NSkKKyAgICBzZXRJY29uKGZvbGRlciwgIi4uL0ljb25zL1B5dGhvbiBGb2xkZXIuaWNucyIpCisKKyAgICAjIENyZWF0ZSB0aGUgaW5zdGFsbGVyCisgICAgYnVpbGRJbnN0YWxsZXIoKQorCisgICAgIyBBbmQgY29weSB0aGUgcmVhZG1lIGludG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBpbnN0YWxsZXIKKyAgICBwYXRjaEZpbGUoJ3Jlc291cmNlcy9SZWFkTWUudHh0Jywgb3MucGF0aC5qb2luKFdPUktESVIsICdpbnN0YWxsZXInLCAnUmVhZE1lLnR4dCcpKQorCisgICAgIyBEaXR0byBmb3IgdGhlIGxpY2Vuc2UgZmlsZS4KKyAgICBzaHV0aWwuY29weSgnLi4vLi4vLi4vTElDRU5TRScsIG9zLnBhdGguam9pbihXT1JLRElSLCAnaW5zdGFsbGVyJywgJ0xpY2Vuc2UudHh0JykpCisKKyAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKFdPUktESVIsICdpbnN0YWxsZXInLCAnQnVpbGQudHh0JyksICd3JykKKyAgICBwcmludCA+PiBmcCwgIiMgQlVJTEQgSU5GTyIKKyAgICBwcmludCA+PiBmcCwgIiMgRGF0ZToiLCB0aW1lLmN0aW1lKCkKKyAgICBwcmludCA+PiBmcCwgIiMgQnk6IiwgcHdkLmdldHB3dWlkKG9zLmdldHVpZCgpKS5wd19nZWNvcworICAgIGZwLmNsb3NlKCkKKworICAgICMgQ3VzdG9tIGljb24gZm9yIHRoZSBETUcsIHNob3duIHdoZW4gdGhlIERNRyBpcyBtb3VudGVkLgorICAgIHNodXRpbC5jb3B5KCIuLi9JY29ucy9EaXNrIEltYWdlLmljbnMiLAorICAgICAgICAgICAgb3MucGF0aC5qb2luKFdPUktESVIsICJpbnN0YWxsZXIiLCAiLlZvbHVtZUljb24uaWNucyIpKQorICAgIG9zLnN5c3RlbSgiL0RldmVsb3Blci9Ub29scy9TZXRGaWxlIC1hIEMgJXMiJSgKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihXT1JLRElSLCAiaW5zdGFsbGVyIiwgIi5Wb2x1bWVJY29uLmljbnMiKSkpCisKKworICAgICMgQW5kIGNvcHkgaXQgdG8gYSBETUcKKyAgICBidWlsZERNRygpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9PU1gvQnVpbGRTY3JpcHQvbmN1cnNlcy01LjUucGF0Y2ggYi9NYWMvT1NYL0J1aWxkU2NyaXB0L25jdXJzZXMtNS41LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYWIzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L25jdXJzZXMtNS41LnBhdGNoCkBAIC0wLDAgKzEsMzYgQEAKK2RpZmYgLXIgLXUgbmN1cnNlcy01LjUtb3JpZy90ZXN0L01ha2VmaWxlLmluIG5jdXJzZXMtNS41L3Rlc3QvTWFrZWZpbGUuaW4KKy0tLSBuY3Vyc2VzLTUuNS1vcmlnL3Rlc3QvTWFrZWZpbGUuaW4JMjAwNi0wMy0yNCAxMjo0Nzo0MC4wMDAwMDAwMDAgKzAxMDAKKysrKyBuY3Vyc2VzLTUuNS90ZXN0L01ha2VmaWxlLmluCTIwMDYtMDMtMjQgMTI6NDc6NTAuMDAwMDAwMDAwICswMTAwCitAQCAtNzUsNyArNzUsNyBAQAorIE1BVEhfTElCCT0gQE1BVEhfTElCQAorIAorIExECQk9IEBMREAKKy1MSU5LCQk9IEBMSU5LX1RFU1RTQCAkKExJQlRPT0xfTElOSykgJChDQykgJChDRkxBR1MpCisrTElOSwkJPSBATElOS19URVNUU0AgJChMSUJUT09MX0xJTkspICQoQ0MpIAorIAorIHVzRkxBR1MJCT0gQExEX01PREVMQCBATE9DQUxfTERGTEFHU0AgQExERkxBR1NACisgCitkaWZmIC1ydSBuY3Vyc2VzLTUuNS1vcmlnL25jdXJzZXMvdGluZm8vcmVhZF9lbnRyeS5jIG5jdXJzZXMtNS41L25jdXJzZXMvdGluZm8vcmVhZF9lbnRyeS5jCistLS0gbmN1cnNlcy01LjUtb3JpZy9uY3Vyc2VzL3RpbmZvL3JlYWRfZW50cnkuYyAyMDA0LTAxLTExIDAyOjU3OjA1LjAwMDAwMDAwMCArMDEwMAorKysrIG5jdXJzZXMtNS41L25jdXJzZXMvdGluZm8vcmVhZF9lbnRyeS5jICAgICAgMjAwNi0wMy0yNSAyMjo0OTozOS4wMDAwMDAwMDAgKzAxMDAKK0BAIC00NzQsNyArNDc0LDcgQEAKKyAgICAgfQorIAorICAgICAvKiB0cnVuY2F0ZSB0aGUgdGVybWluYWwgbmFtZSB0byBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyAqLworLSAgICAodm9pZCkgc3ByaW50Zih0dG4sICIlYy8lLipzIiwgKnRuLCAoaW50KSBzaXplb2YodHRuKSAtIDMsIHRuKTsKKysgICAgKHZvaWQpIHNwcmludGYodHRuLCAiJXgvJS4qcyIsICp0biwgKGludCkgc2l6ZW9mKHR0bikgLSAzLCB0bik7CisgCisgICAgIC8qIFRoaXMgaXMgU3lzdGVtIFYgYmVoYXZpb3IsIGluIGNvbmp1bmN0aW9uIHdpdGggb3VyIHJlcXVpcmVtZW50cyBmb3IKKyAgICAgICogd3JpdGluZyB0ZXJtaW5mbyBlbnRyaWVzLgorZGlmZiAtcnUgbmN1cnNlcy01LjUtb3JpZy9jb25maWd1cmUgbmN1cnNlcy01LjUvY29uZmlndXJlCistLS0gbmN1cnNlcy01LjUtb3JpZy9jb25maWd1cmUJMjAwNS0wOS0yNCAyMzo1MDo1MC4wMDAwMDAwMDAgKzAyMDAKKysrKyBuY3Vyc2VzLTUuNS9jb25maWd1cmUJMjAwNi0wMy0yNiAyMjoyNDo1OS4wMDAwMDAwMDAgKzAyMDAKK0BAIC01MDI3LDcgKzUwMjcsNyBAQAorIAlkYXJ3aW4qKQorIAkJRVhUUkFfQ0ZMQUdTPSItbm8tY3BwLXByZWNvbXAiCisgCQlDQ19TSEFSRURfT1BUUz0iLWR5bmFtaWMiCistCQlNS19TSEFSRURfTElCPSckKENDKSAtZHluYW1pY2xpYiAtaW5zdGFsbF9uYW1lICQoREVTVERJUikkKGxpYmRpcikvYGJhc2VuYW1lICRAYCAtY29tcGF0aWJpbGl0eV92ZXJzaW9uICQoQUJJX1ZFUlNJT04pIC1jdXJyZW50X3ZlcnNpb24gJChBQklfVkVSU0lPTikgLW8gJEAnCisrCQlNS19TSEFSRURfTElCPSckKENDKSAkKENGTEFHUykgLWR5bmFtaWNsaWIgLWluc3RhbGxfbmFtZSAkKERFU1RESVIpJChsaWJkaXIpL2BiYXNlbmFtZSAkQGAgLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkKEFCSV9WRVJTSU9OKSAtY3VycmVudF92ZXJzaW9uICQoQUJJX1ZFUlNJT04pIC1vICRAJworIAkJdGVzdCAiJGNmX2N2X3NobGliX3ZlcnNpb24iID0gYXV0byAmJiBjZl9jdl9zaGxpYl92ZXJzaW9uPWFiaQorIAkJY2ZfY3Zfc2hsaWJfdmVyc2lvbl9pbmZpeD15ZXMKKyAJCTs7CmRpZmYgLS1naXQgYS9NYWMvT1NYL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUudHh0IGIvTWFjL09TWC9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZlNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnR4dApAQCAtMCwwICsxLDMxIEBACitUaGlzIHBhY2thZ2Ugd2lsbCBpbnN0YWxsIE1hY1B5dGhvbiAkRlVMTF9WRVJTSU9OIGZvciBNYWMgT1MgWAorJE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBmb3IgdGhlIGZvbGxvd2luZyAKK2FyY2hpdGVjdHVyZShzKTogJEFSQ0hJVEVDVFVSRVMuCisKK1NlcGFyYXRlIGluc3RhbGxlcnMgYXJlIGF2YWlsYWJsZSBmb3Igb2xkZXIgdmVyc2lvbnMKK29mIE1hYyBPUyBYLCBzZWUgdGhlIGhvbWVwYWdlLCBiZWxvdy4KKworSW5zdGFsbGF0aW9uIHJlcXVpcmVzIGFwcHJveGltYXRlbHkgJElOU1RBTExfU0laRSBNQiBvZiBkaXNrCitzcGFjZSwgaWdub3JlIHRoZSBtZXNzYWdlIHRoYXQgaXQgd2lsbCB0YWtlIHplcm8gYnl0ZXMuCisKK1lvdSBtdXN0IGluc3RhbGwgb250byB5b3VyIGN1cnJlbnQgYm9vdCBkaXNrLCBldmVuCit0aG91Z2ggdGhlIGluc3RhbGxlciBkb2VzIG5vdCBlbmZvcmNlIHRoaXMsIG90aGVyd2lzZQordGhpbmdzIHdpbGwgbm90IHdvcmsuCisKK01hY1B5dGhvbiBjb25zaXN0cyBvZiB0aGUgUHl0aG9uIHByb2dyYW1taW5nIGxhbmd1YWdlCitpbnRlcnByZXRlciwgcGx1cyBhIHNldCBvZiBwcm9ncmFtcyB0byBhbGxvdyBlYXN5CithY2Nlc3MgdG8gaXQgZm9yIE1hYyB1c2VycyAoYW4gaW50ZWdyYXRlZCBkZXZlbG9wbWVudAorZW52aXJvbm1lbnQsIGFuIGFwcGxldCBidWlsZGVyKSwgcGx1cyBhIHNldCBvZiBwcmUtYnVpbHQgCitleHRlbnNpb24gbW9kdWxlcyB0aGF0IG9wZW4gdXAgc3BlY2lmaWMgTWFjaW50b3NoIHRlY2hub2xvZ2llcyAKK3RvIFB5dGhvbiBwcm9ncmFtcyAoQ2FyYm9uLCBBcHBsZVNjcmlwdCwgUXVpY2t0aW1lLCBtb3JlKS4KKworVGhlIGluc3RhbGxlciBwdXRzIHRoZSBhcHBsaWNhdGlvbnMgaW4gIk1hY1B5dGhvbiAkVkVSU0lPTiIgCitpbiB5b3VyIEFwcGxpY2F0aW9ucyBmb2xkZXIsIGNvbW1hbmQtbGluZSB0b29scyBpbgorL3Vzci9sb2NhbC9iaW4gYW5kIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmVyeSBpbgorJFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIuCisKK01vcmUgaW5mb3JtYXRpb24gb24gTWFjUHl0aG9uIGNhbiBiZSBmb3VuZCBhdAoraHR0cDovL3d3dy5jd2kubmwvfmphY2svbWFjcHl0aG9uIGFuZAoraHR0cDovL3B5dGhvbm1hYy5vcmcvLiAgTW9yZSBpbmZvcm1hdGlvbiBvbgorUHl0aG9uIGluIGdlbmVyYWwgY2FuIGJlIGZvdW5kIGF0CitodHRwOi8vd3d3LnB5dGhvbi5vcmcuCmRpZmYgLS1naXQgYS9NYWMvT1NYL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9XZWxjb21lLnJ0ZiBiL01hYy9PU1gvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1dlbGNvbWUucnRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjVmMDkKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9XZWxjb21lLnJ0ZgpAQCAtMCwwICsxLDE1IEBACit7XHJ0ZjFcbWFjXGFuc2ljcGcxMDAwMFxjb2NvYXJ0ZjgyNFxjb2NvYXN1YnJ0ZjMzMAore1xmb250dGJsXGYwXGZzd2lzc1xmY2hhcnNldDc3IEhlbHZldGljYTtcZjFcZnN3aXNzXGZjaGFyc2V0NzcgSGVsdmV0aWNhLUJvbGQ7fQore1xjb2xvcnRibDtccmVkMjU1XGdyZWVuMjU1XGJsdWUyNTU7fQorXHBhcGVydzExOTAwXHBhcGVyaDE2ODQwXG1hcmdsMTQ0MFxtYXJncjE0NDBcdmlld3c5OTIwXHZpZXdoMTA2NjBcdmlld2tpbmQwCitccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHFsXHFuYXR1cmFsCisKK1xmMFxmczI0IFxjZjAgVGhpcyBwYWNrYWdlIHdpbGwgaW5zdGFsbCAKK1xmMVxiIE1hY1B5dGhvbiAkRlVMTF9WRVJTSU9OCitcZjBcYjAgIGZvciAKK1xmMVxiIE1hYyBPUyBYICRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQKK1xmMFxiMCAuXAorXAorTWFjUHl0aG9uIGNvbnNpc3RzIG9mIHRoZSBQeXRob24gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaW50ZXJwcmV0ZXIsIHBsdXMgYSBzZXQgb2YgcHJvZ3JhbXMgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gaXQgZm9yIE1hYyB1c2VycyAoYW4gaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW4gYXBwbGV0IGJ1aWxkZXIpLCBwbHVzIGEgc2V0IG9mIHByZS1idWlsdCBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG9wZW4gdXAgc3BlY2lmaWMgTWFjaW50b3NoIHRlY2hub2xvZ2llcyB0byBQeXRob24gcHJvZ3JhbXMgKENhcmJvbiwgQXBwbGVTY3JpcHQsIFF1aWNrdGltZSwgbW9yZSkuXAorXAorU2VlIHRoZSBSZWFkTWUgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi59ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTWFjL09TWC9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvYmFja2dyb3VuZC5qcGcgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9iYWNrZ3JvdW5kLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2M3NjQwCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvYmFja2dyb3VuZC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZG9jdW1lbnRhdGlvbiBiL01hYy9PU1gvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LmRvY3VtZW50YXRpb24KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODVkNDAwZgotLS0gL2Rldi9udWxsCisrKyBiL01hYy9PU1gvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LmRvY3VtZW50YXRpb24KQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL3NoCisKKyMgRklYTUUKK1BZVkVSPSJAUFlWRVJAIgorCitpZiBbIC1kIC9EZXZlbG9wZXIvRG9jdW1lbnRhdGlvbiBdOyB0aGVuCisJaWYgWyAhIC1kIC9EZXZlbG9wZXIvRG9jdW1lbnRhdGlvbi9QeXRob24gXTsgdGhlbgorCQlta2RpciAtcCAvRGV2ZWxvcGVyL0RvY3VtZW50YXRpb24vUHl0aG9uCisJZmkKKworCWxuIC1maHMgL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyR7UFlWRVJ9L1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24gIi9EZXZlbG9wZXIvRG9jdW1lbnRhdGlvbi9QeXRob24vUmVmZXJlbmNlIERvY3VtZW50YXRpb24iCitmaQpkaWZmIC0tZ2l0IGEvTWFjL09TWC9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZnJhbWV3b3JrIGIvTWFjL09TWC9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZnJhbWV3b3JrCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzMmU3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5mcmFtZXdvcmsKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisjCisjIFJlY29tcGlsZSB0aGUgLnB5IGZpbGVzLgorIworCitQWVZFUj0iQFBZVkVSQCIKK0ZXSz0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zL0BQWVZFUkAvIgorCisiJHtGV0t9L2Jpbi9weXRob24iIC1XaSAtdHQgXAorICAgICIke0ZXS30vbGliL3B5dGhvbiR7UFlWRVJ9L2NvbXBpbGVhbGwucHkiIFwKKyAgICAteCBiYWRzeW50YXggLXggc2l0ZS1wYWNrYWdlcyBcCisgICAgIiR7RldLfS9saWIvcHl0aG9uJHtQWVZFUn0iCisKKyIke0ZXS30vYmluL3B5dGhvbiIgLVdpIC10dCAtTyBcCisgICAgIiR7RldLfS9saWIvcHl0aG9uJHtQWVZFUn0vY29tcGlsZWFsbC5weSIgXAorICAgIC14IGJhZHN5bnRheCAteCBzaXRlLXBhY2thZ2VzIFwKKyAgICAiJHtGV0t9L2xpYi9weXRob24ke1BZVkVSfSIKKworIiR7RldLfS9iaW4vcHl0aG9uIiAtV2kgLXR0IFwKKyAgICAiJHtGV0t9L2xpYi9weXRob24ke1BZVkVSfS9jb21waWxlYWxsLnB5IiBcCisgICAgLXggYmFkc3ludGF4IC14IHNpdGUtcGFja2FnZXMgXAorICAgICIke0ZXS30vTWFjL1Rvb2xzIgorCisiJHtGV0t9L2Jpbi9weXRob24iIC1XaSAtdHQgLU8gXAorICAgICIke0ZXS30vbGliL3B5dGhvbiR7UFlWRVJ9L2NvbXBpbGVhbGwucHkiIFwKKyAgICAteCBiYWRzeW50YXggLXggc2l0ZS1wYWNrYWdlcyBcCisgICAgIiR7RldLfS9NYWMvVG9vbHMiCisKKworY2hvd24gLVIgYWRtaW4gIiR7RldLfSIKK2NobW9kIC1SIGcrdyAiJHtGV0t9IgorCitleGl0IDAKZGlmZiAtLWdpdCBhL01hYy9PU1gvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LnBhdGNoLXByb2ZpbGUgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5wYXRjaC1wcm9maWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4YmY3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5wYXRjaC1wcm9maWxlCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9zaAorCitlY2hvICJUaGlzIHNjcmlwdCB3aWxsIHVwZGF0ZSB5b3VyIHNoZWxsIHByb2ZpbGUgd2hlbiB0aGUgJ2JpbicgZGlyZWN0b3J5IgorZWNobyAib2YgcHl0aG9uIGlzIG5vdCBlYXJseSBlbm91Z2ggb2YgdGhlIFBBVEggb2YgeW91ciBzaGVsbC4iCitlY2hvICJUaGVzZSBjaGFuZ2VzIHdpbGwgYmUgZWZmZWN0aXZlIG9ubHkgaW4gc2hlbGwgd2luZG93cyB0aGF0IHlvdSBvcGVuIgorZWNobyAiYWZ0ZXIgcnVubmluZyB0aGlzIHNjcmlwdC4iCisKK1BZVkVSPUBQWVZFUkAKK1BZVEhPTl9ST09UPSIvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvQ3VycmVudCIKKworIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSAke1BZVEhPTl9ST09UfS9iaW4gaXMgb24gdGhlIHVzZXJzIFBBVEguCitCU0g9ImBiYXNlbmFtZSAiJHtTSEVMTH0iYCIKK2Nhc2UgIiR7QlNIfSIgaW4KK2Jhc2h8a3NofHNofCpjc2gpCisJUD0iYCR7U0hFTEx9IC1jICdlY2hvICRQQVRIJ2AiCisJOzsKKyopCisJZWNobyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcGF0Y2ggJEJTSCBzaGVsbHMiCisJZXhpdCAwCisJOzsKK2VzYWMKKworIyBOb3cgZW5zdXJlIHRoYXQgb3VyIGJpbiBkaXJlY3RvcnkgaXMgb24gJFAgYW5kIGJlZm9yZSAvdXNyL2JpbiBhdCB0aGF0Citmb3IgZWxlbSBpbiBgZWNobyAkUCB8IHRyICc6JyAnICdgCitkbworCWlmIFsgIiR7ZWxlbX0iID09ICIke1BZVEhPTl9ST09UfS9iaW4iIF07IHRoZW4KKwkJZWNobyAiQWxsIHJpZ2h0LCB5b3UncmUgYSBweXRob24gbG92ZXIgYWxyZWFkeSIKKwkJZXhpdCAwCisJZWxpZiBbICIke2VsZW19IiA9PSAiL3Vzci9iaW4iIF07IHRoZW4KKwkJYnJlYWsKKwlmaQorZG9uZQorCitlY2hvICIke1BZVEhPTl9ST09UfS9iaW4gaXMgbm90IG9uIHlvdXIgUEFUSCBvciBhdCBsZWFzdCBub3QgZWFybHkgZW5vdWdoIgorY2FzZSAiJHtCU0h9IiBpbgorKmNzaCkKKwkjIENyZWF0ZSBiYWNrdXAgY29weSBiZWZvcmUgcGF0Y2hpbmcKKwlpZiBbIC1mICIke0hPTUV9Ly5jc2hyYyIgXTsgdGhlbgorCQljcCAtZnAgIiR7SE9NRX0vLmNzaHJjIiAiJHtIT01FfS8uY3NocmMucHlzYXZlIgorCWZpCisJZWNobyAiIiA+PiAiJHtIT01FfS8uY3NocmMiCisJZWNobyAiIyBTZXR0aW5nIFBBVEggZm9yIE1hY1B5dGhvbiAke1BZVkVSfSIgPj4gIiR7SE9NRX0vLmNzaHJjIgorCWVjaG8gIiMgVGhlIG9yZ2luYWwgdmVyc2lvbiBpcyBzYXZlZCBpbiAuY3NocmMucHlzYXZlIiA+PiAiJHtIT01FfS8uY3NocmMiCisJZWNobyAic2V0IHBhdGg9KCR7UFlUSE9OX1JPT1R9L2JpbiAiJyRwYXRoJyIpIiA+PiAiJHtIT01FfS8uY3NocmMiCisJZXhpdCAwCisJOzsKK2Jhc2gpCisJaWYgWyAtZSAiJHtIT01FfS8ucHJvZmlsZSIgXTsgdGhlbgorCQlQUj0iJHtIT01FfS8ucHJvZmlsZSIKKwllbHNlCisJCVBSPSIke0hPTUV9Ly5iYXNoX3Byb2ZpbGUiCisJZmkKKwk7OworKnNoKQorCVBSPSIke0hPTUV9Ly5wcm9maWxlIgorCTs7Citlc2FjCisKKyMgQ3JlYXRlIGJhY2t1cCBjb3B5IGJlZm9yZSBwYXRjaGluZworaWYgWyAtZiAiJHtQUn0iIF07IHRoZW4KKwljcCAtZnAgIiR7UFJ9IiAiJHtQUn0ucHlzYXZlIgorZmkKK2VjaG8gIiIgPj4gIiR7UFJ9IgorZWNobyAiIyBTZXR0aW5nIFBBVEggZm9yIE1hY1B5dGhvbiAke1BZVkVSfSIgPj4gIiR7UFJ9IgorZWNobyAiIyBUaGUgb3JnaW5hbCB2ZXJzaW9uIGlzIHNhdmVkIGluIGBiYXNlbmFtZSAke1BSfWAucHlzYXZlIiA+PiAiJHtQUn0iCitlY2hvICdQQVRIPSInIiR7UFlUSE9OX1JPT1R9L2JpbiInOiR7UEFUSH0iJyA+PiAiJHtQUn0iCitlY2hvICdleHBvcnQgUEFUSCcgPj4gIiR7UFJ9IgoraWYgWyBgaWQgLXVyYCA9IDAgXTsgdGhlbgorCWNob3duICIke0xPR05BTUV9IiAiJHtQUn0iCitmaQorZXhpdCAwCmRpZmYgLS1naXQgYS9NYWMvT1NYL0Rpc3QvUkVBRE1FLnR4dCBiL01hYy9PU1gvRGlzdC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzFjM2ZlLi4wMDAwMDAwCi0tLSBhL01hYy9PU1gvRGlzdC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotQnVpbGRpbmcgYSBNYWNQeXRob24gZGlzdHJpYnV0aW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIGBgYnVpbGRgYCBzaGVsbCBzY3JpcHQgaGVyZSBjcmVhdGVzIE1hY1B5dGhvbiBkaXN0cmlidXRpb25zLgotSXQgYnVpbGRzIGEgY29tcGxldGUgZnJhbWV3b3JrLWJhc2VkIFB5dGhvbiBvdXQtb2YtdHJlZSwgaW5zdGFsbHMKLWl0IGluIGEgZnVubnkgcGxhY2Ugd2l0aCAkREVTVFJPT1QsIG1hc3NhZ2VzIHRoYXQgaW5zdGFsbGF0aW9uIHRvIHJlbW92ZQotLnB5YyBmaWxlcyBhbmQgc3VjaCwgY3JlYXRlcyBhbiBJbnN0YWxsZXIgcGFja2FnZSBmcm9tIHRoZSBpbnN0YWxsYXRpb24KLXBsdXMgdGhlIHN0dWZmIGluIGBgcmVzb3VyY2VzYGAgYW5kIGNvbXByZXNzZXMgdGhhdCBpbnN0YWxsZXIgYXMgYQotYGAuZG1nYGAgZGlzayBpbWFnZS4KLQotSGVyZSBhcmUgdGhlIHN0ZXBzIHlvdSBuZWQgdG8gZm9sbG93IHRvIGJ1aWxkIGEgTWFjUHl0aG9uIGluc3RhbGxlcjoKLQotLSBUaGVyZSBhcmUgdmFyaW91cyB2ZXJzaW9uIG51bWJlcnMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQuIFdlZWQgdGhyb3VnaAotICBgYE1hYy9PU1hSZXNvdXJjZXNgYCwgYGBNYWMvc2NyaXB0c2BgIGFuZCBgYE1hYy9Ub29sc2BgIGFuZCBpbnNwZWN0IHRoZQotICB2YXJpb3VzIGBgLnBsaXN0YGAgYW5kIGBgLnN0cmluZ3NgYCBmaWxlcy4gTm90ZSB0aGF0IHRoZSBsYXR0ZXIgYXJlCi0gIFVURi0xNiBmaWxlcy4KLS0gRWRpdCBgYHJlc291cmNlL1JlYWRNZS50eHRgYCBhbmQgYGByZXNvdXJjZXMvV2VsY29tZS5ydGZgYCB0byByZWZsZWN0Ci0gIHZlcnNpb24gbnVtYmVyIGFuZCBzdWNoLgotLSBFZGl0IGBgYnVpbGRgYCB0byBjaGFuZ2UgYGBQWVZFUlNJT05gYCwgYGBQWVZFUmBgIGFuZCBgYEJVSUxETlVNYGAuCi0tIEVkaXQgYGByZXNvdXJjZXMvcG9zdGZsaWdodGBgIGFuZCBjaGFuZ2UgdmVyc2lvbiBudW1iZXIuCi0tIFJ1biBgYC4vYnVpbGRgYC4gT3B0aW9uYWxseSB5b3UgY2FuIHBhc3MgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeQotICB3aGVyZSBQeXRob24gd2lsbCBiZSBidWlsdCwgc28geW91IGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGNvbXBsZXRlCi0gIGJ1aWxkIHdoZW4geW91J3JlIGRlYnVnZ2luZyB0aGUgcHJvY2Vzcy4gRm9yIHRoZSBmaW5hbCBkaXN0cmlidXRpb24gdXNlCi0gIGEgY2xlYW4gYnVpbGQuCi0tIFdoZW4gZG9uZSB0aGUgc2NyaXB0IHdpbGwgdGVsbCB5b3Ugd2hlcmUgdGhlIERNRyBpbWFnZSBpcy4KLQotQ3VycmVudGx5IChOb3ZlbWJlciAyMDAzKSB0aGVyZSBpcyBzdGlsbCBhIGJ1ZyBpbiB0aGUgYnVpbGQgcHJvY2VkdXJlCi1mb3IgJERFU1RST09UIGJ1aWxkczogYnVpbGRpbmcgc29tZSBvZiB0aGUgYXBwbGV0cyB3aWxsIGZhaWwgKGluCi1gYE1hYy9PU1gvTWFrZWZpbGVgYCkgaWYgeW91IGRvbid0IGhhdmUgdGhlIHNhbWUgdmVyc2lvbiBvZiBQeXRob24gaW5zdGFsbGVkCi1ub3JtYWxseS4gU28gYmVmb3JlIGRvaW5nIHRoZSBkaXN0cmlidXRpb24geW91IHNob3VsZCBidWlsZCBhbmQgaW5zdGFsbAotYSBmcmFtZXdvcmsgUHl0aG9uIGluIHRoZSBub3JtYWwgd2F5LgotCi1XaGVuIGFsbCBpcyBkb25lLCBhbm5vdW5jZW1lbnRzIGNhbiBiZSBwb3N0ZWQgdG8gYXQgbGVhc3QgdGhlIGZvbGxvd2luZwotcGxhY2VzOgotLSAgIHB5dGhvbm1hYy1zaWdAcHl0aG9uLm9yZwotLSAgIHB5dGhvbi1kZXZAcHl0aG9uLm9yZwotLSAgIHB5dGhvbi1hbm5vdW5jZUBweXRob24ub3JnCi0tICAgYXJjaGl2aXN0QGluZm8tbWFjLm9yZwotLSAgIGFkY25ld3NAYXBwbGUuY29tCi0tICAgbmV3c0BtYWNubi5jb20KLS0gICBodHRwOi8vd3d3Lm1hY3VwZGF0ZS5jb20KLS0gICBodHRwOi8vZ3VpZGUuYXBwbGUuY29tL3VzaW5kZXgubGFzc28KLS0gICBodHRwOi8vd3d3LmFwcGxlLmNvbS9kb3dubG9hZHMvbWFjb3N4L3N1Ym1pdAotLSAgIGh0dHA6Ly93d3cudmVyc2lvbnRyYWNrZXIuY29tLyAodXNlcmlkIEphY2suSmFuc2VuQG9yYXRyaXguY29tKQotLSAgIGh0dHA6Ly93d3cubWFjc2hhcmV3YXJlLm5ldCAodXNlcmlkIGphY2tqYW5zZW4pCi0KLUFsc28sIGNoZWNrIG91dCBTdGVwaGFuIERlaWJlbHMgaHR0cDovL3B5dGhvbm9sb2d5Lm9yZy9tYXJrZXQgY29udGFjdCBsaXN0Ci0KLUFmdGVyIGFsbCB0aGlzIGlzIGRvbmUgeW91IG1heSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBQYWNrYWdlIE1hbmFnZXIKLWRhdGFiYXNlIGZvciB0aGUgbmV3IGRpc3RyaWJ1dGlvbi4gQSBkZXNjcmlwdGlvbiBvZiB0aGlzIHJlbWFpbnMgVEJELgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9EaXN0L2J1aWxkIGIvTWFjL09TWC9EaXN0L2J1aWxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNWViZTNlLi4wMDAwMDAwCi0tLSBhL01hYy9PU1gvRGlzdC9idWlsZAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0jIS9iaW4vc2ggLWUKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEJ1aWxkIE1hY1B5dGhvbiAyLjUgYW5kIG1ha2UgYW4gSW5zdGFsbGVyIHBhY2thZ2Ugb2YgaXQKLQotIyBUT0RPOiAgUGFyYW1ldGVyaXplIHRoZSB2ZXJzaW9ucywgYnVpbGRkaXJzLCBldGMuLi4KLQotIyBTY3JpcHQgY29uZmlncwotUFlWRVJTSU9OPTIuNWEwCi1QWVZFUj0yLjUKLUJVSUxETlVNPTEKLURPQ0xFQU5VUD1ubwotCi1QUk9HRElSPSJgZGlybmFtZSBcIiQwXCJgIgotY2FzZSB4JFBST0dESVIgaW4KLXh8eC4pIFBST0dESVI9YHB3ZGAgOzsKLXgvKikgOzsKLSopIGVjaG8gIlBsZWFzZSBydW4gd2l0aCBhIGZ1bGwgcGF0aG5hbWUiCi0gICBleGl0IDEKLSAgIDs7Ci1lc2FjCi0KLVRNUERJUj0vdG1wL19weQotI1RNUERJUj0vcHJvamVjdHMvX3B5Ci0KLUlOU1RBTExST09UPSRUTVBESVIvaW5zdGFsbAotRE1HRElSPSRUTVBESVIvZG1nCi1SRVNPVVJDRURJUj0kUFJPR0RJUi9yZXNvdXJjZXMKLURFU1RESVI9JFRNUERJUi9kaXN0Ci1QWVRIT05TUkM9JFBST0dESVIvLi4vLi4vLi4KLVdBU1RFRElSPSRQWVRIT05TUkMvLi4vd2FzdGUKLQotY2FzZSB4JDEgaW4KLXgpCi0JQlVJTERST09UPSRUTVBESVIvYnVpbGQKLQk7OwotKikKLQlCVUlMRFJPT1Q9JDEKLQk7OwotZXNhYwotCi0jIFNldHVwCi1pZiBbIC1lICRCVUlMRFJPT1QgXTsgdGhlbgotCWVjaG8gVXNpbmcgZXhpc3RpbmcgYnVpbGQgZGlyZWN0b3J5ICRCVUlMRFJPT1QKLQlDTEVBTkJVSUxEPW5vCi1lbHNlCi0JZWNobyBDcmVhdGluZyBjbGVhbiBidWlsZCBkaXJlY3RvcnkgJEJVSUxEUk9PVAotCUNMRUFOQlVJTEQ9eWVzCi0JbWtkaXIgLXAgJEJVSUxEUk9PVAotZmkKLXJtIC1yZiAkRE1HRElSCi1pZiBbICEgLWUgJFRNUERJUiBdOyB0aGVuCi0JbWtkaXIgJFRNUERJUgotZmkKLWNoZ3JwIGFkbWluICRUTVBESVIKLW1rZGlyIC1wICRETUdESVIvcm9vdAotCi0KLSMgQ29uZmlndXJlIGFuZCBidWlsZCBQeXRob24KLXB1c2hkICRCVUlMRFJPT1QKLQotIyBBc2sgdGhlIHVzZXIgd2hldGhlciBzL2hlIGhhcyBlZGl0ZWQgV2VsY29tZS50eHQKLXJlYWQgLXAgIkhhdmUgeW91IHVwZGF0ZWQgJFJFU09VUkNFRElSL1dlbGNvbWUudHh0IChZL24pPyAiIHdlbGNvbWUKLQotaWYgWyAiJHdlbGNvbWUiID0gIm4iIC1vICIkd2VsY29tZSIgPSAiTiIgXTsgdGhlbgotCWVjaG8gIlBsZWFzZSBkbyBzbyBhbmQgcmV0cnkiCi0JZXhpdAotZmkKLQotIyBDaGVjayBpZiB3ZSBzaG91bGQgYnVpbGQgYW5kIGluc3RhbGwgdGhlIGRvY3MsIGJ1dCBvbmx5IGlmIGl0Ci0jIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGRvbmUgYWxyZWFkeS4gIFRPRE86IGZpeCB0aGlzIHBhdGggdG8gYmUgdmVyc2lvbiBpbmRlcGVuZGVudAotaWYgWyAhIC1lICJidWlsZC90ZW1wLmRhcndpbi02LjMtUG93ZXIgTWFjaW50b3NoLTIuMy9idWlsZC1odG1sL2J1aWxkLWh0bWwgaWR4IiBdOyB0aGVuCi0gICAgcmVhZCAtcCAiQnVpbGQgdGhlIFB5dGhvbiBkb2NzPyAoeS9OKT8gIiBidWlsZGRvY3MKLWZpCi0KLSMgSWYgdGhlIGZpbGVzeXN0ZW0gaXMgY2FzZS1zZW5zaXRpdmUgdGhlbiAicHl0aG9uIiB3aWxsIGJlIGJ1aWx0LCBidXQKLSMgc29tZSBwYXJ0cyBvZiB0aGUgaW5zdGFsbCBleHBlY3QgInB5dGhvbi5leGUgd2hpY2ggaXMgd2hhdCBpcyBidWlsdAotIyBvbiBhIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbS4gIE1ha2UgYSBsaW5rIGp1c3QgaW4gY2FzZSBpdCBpcwotIyBuZWVkZWQuCi1pZiBbICEgLWUgcHl0aG9uLmV4ZSBdOyB0aGVuCi0gICAgbG4gLXMgcHl0aG9uIHB5dGhvbi5leGUKLWZpCi0KLSMgTWFrZSBhIGxpbmsgdG8gdGhlIHdhc3RlIGRpciBzbyB0aGF0IGxpYiBjYW4gYmUgZm91bmQuICBUaGlzIGFsbG93cwotIyB0aGUgUHl0aG9uSURFIHRvIGJlIGJ1aWx0Ci1pZiBbICEgLWUgd2FzdGUgXTsgdGhlbgotICAgIGxuIC1zICRXQVNURURJUiB3YXN0ZQotZmkKLQotIyRQWVRIT05TUkMvY29uZmlndXJlIC1DIC0tZW5hYmxlLWZyYW1ld29yayBMREZMQUdTPS1XbCwteAotJFBZVEhPTlNSQy9jb25maWd1cmUgLUMgLS1lbmFibGUtZnJhbWV3b3JrCi1tYWtlCi1tYWtlIERJUk1PREU9Nzc1IEVYRU1PREU9Nzc1IEZJTEVNT0RFPTY2NCBERVNURElSPSRJTlNUQUxMUk9PVCBmcmFtZXdvcmtpbnN0YWxsCi1tYWtlIERJUk1PREU9Nzc1IEVYRU1PREU9Nzc1IEZJTEVNT0RFPTY2NCBERVNURElSPSRJTlNUQUxMUk9PVCBmcmFtZXdvcmtpbnN0YWxsZXh0cmFzCi0KLSMgVW5mb3J0dW5hdGVseSBhbGwgdGhlIC4uLk1PREUgYXJndW1lbnRzIGFib3ZlIHN0aWxsIGRvbid0IGRvIHRoZSB0cmljay4KLSMgQ29wIG91dCwgYW5kIHJlY3Vyc2l2ZWx5IHNldCBldmVyeXRoaW5nIGdyb3VwLXdyaXRlYWJsZS4KLWNobW9kIC1SIHVnK3cgJElOU1RBTExST09UCi0KLWlmIFsgIiRidWlsZGRvY3MiID0gInkiIC1vICIkYnVpbGRkb2NzIiA9ICJZIiBdOyB0aGVuCi0gICAgLi9weXRob24uZXhlICRQWVRIT05TUkMvTWFjL09TWC9zZXR1cERvY3MucHkgYnVpbGQKLSAgICBlY2hvICIiCi0gICAgcmVhZCAtcCAiV2hlbiB0aGUgaGVscCBpbmRleGVyIGlzIGRvbmUgcHJlc3MgRW50ZXIuLi4iIGFucwotICAgIC4vcHl0aG9uLmV4ZSAkUFlUSE9OU1JDL01hYy9PU1gvc2V0dXBEb2NzLnB5IGluc3RhbGwgXAotCS0tcHJlZml4PSRJTlNUQUxMUk9PVC9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8kUFlWRVIKLWZpCi0KLXBvcGQKLQotCi0KLSMgTWFrZSB0aGUgSW5zdGFsbGVyIHBhY2thZ2U6Ci0jIEZpcnN0LCByZW1vdmUgdGhlIHVuaXggdG9vbHMgYXMgdGhlaXIgcGF0aHMgd2lsbCBiZSB3cm9uZy4gIFdlJ2xsIHJlY3JlYXRlCi0jIHRoZW0gaW4gdGhlIHBvc3RpbnN0YWxsLgotcm0gLXJmICRJTlNUQUxMUk9PVC91c3IKLQotIyBOZXh0LCByZW1vdmUgdGhlIC5weWMvLnB5byBmaWxlcwotcHl0aG9uICRQWVRIT05TUkMvTWFjL3NjcmlwdHMvemFwcHljZmlsZXMucHkgJElOU1RBTExST09UL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyRQWVZFUi9saWIvcHl0aG9uJFBZVkVSCi1weXRob24gJFBZVEhPTlNSQy9NYWMvc2NyaXB0cy96YXBweWNmaWxlcy5weSAkSU5TVEFMTFJPT1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL01hYy9Ub29scwotCi0jIEZpbmFsbHksIGJ1aWxkIHRoZSBwYWNrYWdlLi4uCi1ybSAtcmYgTWFjUHl0aG9uLU9TWC5wa2cKLXB5dGhvbiAkUFlUSE9OU1JDL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5IFwKLSAgICAtLVRpdGxlPU1hY1B5dGhvbi1PU1ggXAotICAgIC0tVmVyc2lvbj0kUFlWRVJTSU9OLSRCVUlMRE5VTSBcCi0gICAgLS1EZXNjcmlwdGlvbj0iUHl0aG9uICRQWVZFUlNJT04gZm9yIE1hYyBPUyBYLCBmcmFtZXdvcmsgYmFzZWQiIFwKLSAgICAtLU5lZWRzQXV0aG9yaXphdGlvbj0iWUVTIiBcCi0gICAgLS1SZWxvY2F0YWJsZT0iTk8iIFwKLSAgICAtLUluc3RhbGxPbmx5PSJZRVMiIFwKLSAgICAtLVVzZVVzZXJNYXNrPSJOTyIgXAotICAgICRJTlNUQUxMUk9PVCBcCi0gICAgJFJFU09VUkNFRElSCi0KLSMgICAgLS1Sb290Vm9sdW1lT25seT0iWUVTIiBcCi0KLSMgLi4uYW5kIHRoZW4gbWFrZSBhIGRpc2sgaW1hZ2UgY29udGFpbmluZyB0aGUgcGFja2FnZS4KLW12IE1hY1B5dGhvbi1PU1gucGtnICRETUdESVIvcm9vdAotY3AgJFJFU09VUkNFRElSL1JlYWRNZS50eHQgJERNR0RJUi9yb290L1JlYWRNZS50eHQKLSRQUk9HRElSL21ha2VkbWcgJERNR0RJUi9yb290ICRETUdESVIgTWFjUHl0aG9uLU9TWC0kUFlWRVJTSU9OLSRCVUlMRE5VTQotCi1lY2hvIE1vdmluZyAkRE1HRElSL01hY1B5dGhvbi1PU1gtJFBZVkVSU0lPTi0kQlVJTEROVU0gdG8gJERFU1RESVIKLWlmIFsgISAtZSAkREVTVERJUiBdOyB0aGVuCi0gICAgbWtkaXIgJERFU1RESVIKLWZpCi1tdiAkRE1HRElSL01hY1B5dGhvbi1PU1gtJFBZVkVSU0lPTi0kQlVJTEROVU0uZG1nICRERVNURElSCi0KLQotIyBDbGVhbnVwIGJ1aWxkL2luc3RhbGwgZGlycwotaWYgWyAkRE9DTEVBTlVQID0geWVzIF07IHRoZW4KLSAgICBlY2hvICJDbGVhbmluZyB1cC4uLiIKLSAgICBpZiBbICRDTEVBTkJVSUxEID0geWVzIF07IHRoZW4KLSAgICAJcm0gLXJmICRCVUlMRFJPT1QKLSAgICBmaQotICAgIHJtIC1yZiAkSU5TVEFMTFJPT1QKLSAgICBybSAtcmYgJERNR0RJUgotZWxzZQotICAgIGVjaG8gIkNsZWFudXAgaXMgZGlzYWJsZWQuICBZb3Ugc2hvdWxkIHJlbW92ZSB0aGVzZSBkaXJzIHdoZW4gZG9uZToiCi0gICAgaWYgWyAkQ0xFQU5CVUlMRCA9IHllcyBdOyB0aGVuCi0gICAgCWVjaG8gIiAgICAgICAgICAkQlVJTERST09UIgotICAgIGZpCi0gICAgZWNobyAiICAgICAgICAgICRJTlNUQUxMUk9PVCIKLSAgICBlY2hvICIgICAgICAgICAgJERNR0RJUiIKLWZpCi1lY2hvICJZb3VyIGluc3RhbGxlciBjYW4gYmUgZm91bmQgaW4gJERFU1RESVIiCi0KZGlmZiAtLWdpdCBhL01hYy9PU1gvRGlzdC9leGFtcGxlLXBpbXAtZGF0YWJhc2UucGxpc3QgYi9NYWMvT1NYL0Rpc3QvZXhhbXBsZS1waW1wLWRhdGFiYXNlLnBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGM1MmFiLi4wMDAwMDAwCi0tLSBhL01hYy9PU1gvRGlzdC9leGFtcGxlLXBpbXAtZGF0YWJhc2UucGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Ci08cGxpc3QgdmVyc2lvbj0iMS4wIj4KLTxkaWN0PgotCTxrZXk+RGVzY3JpcHRpb248L2tleT4KLQk8c3RyaW5nPkVudGVyIGRhdGFiYXNlIGRlc2NyaXB0aW9uPC9zdHJpbmc+Ci0JPGtleT5NYWludGFpbmVyPC9rZXk+Ci0JPHN0cmluZz5FbnRlciB5b3VyIGVtYWlsIGFkZHJlc3M8L3N0cmluZz4KLQk8a2V5PlBhY2thZ2VzPC9rZXk+Ci0JPGFycmF5PgotCQk8ZGljdD4KLQkJCTxrZXk+RGVzY3JpcHRpb248L2tleT4KLQkJCTxzdHJpbmc+RW50ZXIgcGFja2FnZSBkZXNjcmlwdGlvbjwvc3RyaW5nPgotCQkJPGtleT5Eb3dubG9hZC1VUkw8L2tleT4KLQkJCTxzdHJpbmc+RW50ZXIgVVJMIGZvciBhcmNoaXZlIGRvd25sb2FkLCBkZWxldGUgZm9yIHBzZXVkby1wa2dzPC9zdHJpbmc+Ci0JCQk8a2V5PkZsYXZvcjwva2V5PgotCQkJPHN0cmluZz5FbnRlciBiaW5hcnkgb3Igc291cmNlPC9zdHJpbmc+Ci0JCQk8a2V5PkhvbWUtcGFnZTwva2V5PgotCQkJPHN0cmluZz5FbnRlciBVUkwgb2YgaHVtYW4tcmVhZGFibGUgd2VicGFnZTwvc3RyaW5nPgotCQkJPGtleT5JbnN0YWxsLWNvbW1hbmQ8L2tleT4KLQkJCTxzdHJpbmc+RW50ZXIgc2hlbGwgY29tbWFuZHMgdG8gcnVuIGZvciBpbnN0YWxsYXRpb248L3N0cmluZz4KLQkJCTxrZXk+SW5zdGFsbC10ZXN0PC9rZXk+Ci0JCQk8c3RyaW5nPkVudGVyIFB5dGhvbiBjb2RlIHRvIHRlc3QgZm9yIGFscmVhZHkgaW5zdGFsbGVkPC9zdHJpbmc+Ci0JCQk8a2V5Pk1ENVN1bTwva2V5PgotCQkJPHN0cmluZz5FbnRlciBjaGVja3N1bSBvZiBwYWNrYWdlIGFyY2hpdmU8L3N0cmluZz4KLQkJCTxrZXk+TmFtZTwva2V5PgotCQkJPHN0cmluZz5FbnRlciBuYW1lIG9mIHBhY2thZ2U8L3N0cmluZz4KLQkJCTxrZXk+UG9zdC1pbnN0YWxsLWNvbW1hbmQ8L2tleT4KLQkJCTxzdHJpbmc+RW50ZXIgc2hlbGwgY29tbWFuZCB0byBydW4gYWZ0ZXIgaW5zdGFsbDwvc3RyaW5nPgotCQkJPGtleT5QcmUtaW5zdGFsbC1jb21tYW5kPC9rZXk+Ci0JCQk8c3RyaW5nPkVudGVyIHNoZWxsIGNvbW1hbmQgdG8gcnVuIGJlZm9yZSBpbnN0YWxsPC9zdHJpbmc+Ci0JCQk8a2V5PlByZXJlcXVpc2l0ZXM8L2tleT4KLQkJCTxhcnJheT4KLQkJCQk8c3RyaW5nPkVudGVyIGh1bWFuLXJlYWRhYmxlIHJlY2lweSBmb3IgcHNldWRvLWRlcGVuZGVuY2llczwvc3RyaW5nPgotCQkJCTxkaWN0PgotCQkJCQk8a2V5PkZsYXZvcjwva2V5PgotCQkJCQk8c3RyaW5nPkVudGVyIG9wdGlvbmFsIGZsYXZvciBmb3IgcmVhbCBkZXBlbmRlbmN5PC9zdHJpbmc+Ci0JCQkJCTxrZXk+TmFtZTwva2V5PgotCQkJCQk8c3RyaW5nPkVudGVyIG5hbWUgZm9yIHJlYWwgZGVwZW5kZW5jeTwvc3RyaW5nPgotCQkJCQk8a2V5PlZlcnNpb248L2tleT4KLQkJCQkJPHN0cmluZz48L3N0cmluZz4KLQkJCQk8L2RpY3Q+Ci0JCQk8L2FycmF5PgotCQkJPGtleT5WZXJzaW9uPC9rZXk+Ci0JCQk8c3RyaW5nPkVudGVyIHZlcnNpb24gc3RyaW5nIGZvciBwYWNrYWdlPC9zdHJpbmc+Ci0JCTwvZGljdD4KLQk8L2FycmF5PgotCTxrZXk+VmVyc2lvbjwva2V5PgotCTxzdHJpbmc+MC4xPC9zdHJpbmc+Ci08L2RpY3Q+Ci08L3BsaXN0PgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9EaXN0L21ha2VkbWcgYi9NYWMvT1NYL0Rpc3QvbWFrZWRtZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGUxM2VmOS4uMDAwMDAwMAotLS0gYS9NYWMvT1NYL0Rpc3QvbWFrZWRtZworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybCAtdwotIwotIyBtYWtlIGRpc2sgaW1hZ2UgZnJvbSBmb2xkZXIKLSMKLSMgdXNhZ2U6IG1ha2VkbWcgc3JjIGRzdCBuYW1lCi0jCi0jIERvbmF0ZWQgYnkgRnJhbmsgVmVyY3J1ZXNzZQotCi0KLSRoZGlVdGlsRXhlYyA9ICIvdXNyL2Jpbi9oZGl1dGlsIjsKLSRoZGlEcnZFeGVjID0gIi91c3IvYmluL2hkaWQiOwotJG5ld2ZzRXhlYyA9ICIvc2Jpbi9uZXdmc19oZnMiOwotJGR1RXhlYyA9ICIvdXNyL2Jpbi9kdSI7Ci0kZGl0dG9FeGVjID0gIi91c3IvYmluL2RpdHRvIjsKLQotaWYgKCAkI0FSR1YgIT0gMiApIHsKLQlkaWUgIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMuXG5Vc2FnZTogbWFrZWRtZyBzcmMgZHN0IG5hbWVcbiI7Ci19Ci0KLSZtYWtlX2RtZyggJEFSR1ZbMF0sICRBUkdWWzFdLCAkQVJHVlsyXSk7Ci0KLQotc3ViIG1ha2VfZG1nCi17Ci0JbXkgJHNyYyA9ICRfWzBdOwotCW15ICRkc3QgPSAkX1sxXTsKLQlteSAkbmFtZSA9ICRfWzJdOwotCi0JIyBjaGVjayBkaXJzCi0JaWYoIG5vdCAtZCAkZHN0ICYmIC1kICRzcmMgKSB7Ci0JCWRpZSAic3JjIGFuZCBkc3QgbXVzdCBiZSBkaXJlY3Rvcmllc1xuIjsKLQl9Ci0KLQkjIGNhbGMgZGlzayBpbWFnZSBzaXplCi0JaWYoIG5vdCBvcGVuKCBNWVBJUEUsICIkZHVFeGVjIC1zayBcIiR7c3JjfVwiIHwiKSApIHsKLQkJZGllICJjb3VsZG4ndCBvcGVuIHBpcGVcbiI7Ci0JfQotCShteSAkZG1nc2l6ZSkgPSBzcGxpdCggL1xzKy8sIDxNWVBJUEU+KTsKLQljbG9zZSggTVlQSVBFKTsKLQkkZG1nc2l6ZSAvPSAxMDI0OwotCSRkbWdzaXplID0gaW50KCRkbWdzaXplICsgNCk7Ci0JaWYoICRkbWdzaXplIDwgNSApIHsKLQkJJGRtZ3NpemUgPSA1Ci0JfQotCi0JIyBjcmVhdGUgZGlzayBpbWFnZQotCXN5c3RlbSAiY2QgXCIkZHN0XCI7ICRoZGlVdGlsRXhlYyBjcmVhdGUgLW1lZ2FieXRlcyAkZG1nc2l6ZSAtb3YgXCJfJHtuYW1lfVwiIjsKLQlpZiggJD8gKSB7IGRpZSAiY291bGRuJ3QgY3JlYXRlIGRpc2sgaW1hZ2VcbiI7IH0KLQotCSMgZm9ybWF0IGRpc2sgaW1hZ2UKLQlpZiggbm90IG9wZW4oIE1ZUElQRSwgImNkIFwiJGRzdFwiOyAkaGRpRHJ2RXhlYyAtbm9tb3VudCBcIl8ke25hbWV9LmRtZ1wiIHwiKSApIHsKLQkJZGllICJjb3VsZG4ndCBvcGVuIHBpcGVcbiI7Ci0JfQotCShteSAkZGV2KSA9IHNwbGl0KCAvXHQvLCA8TVlQSVBFPik7Ci0JJGRldiA9fiBzL14oLipcUylccyokLyQxLzsKLQlteSggJHBhcnQsICRyYXcsICRwbmFtZSk7Ci0Jd2hpbGUoIDxNWVBJUEU+ICkgewotCQkoJHBhcnQsJHBuYW1lKSA9IHNwbGl0IC9cdC87Ci0JCWlmKCAkcG5hbWUgPX4gbS9eQXBwbGVfSEZTLyApIHsKLQkJCSRwYXJ0ID1+IHMvXlxzKiguKlxTKVxzKiQvJDEvOwotCQkJJHJhdyA9ICRwYXJ0OwotCQkJJHJhdyA9fiBzL14oXC9kZXZcLykoLispLyQxciQyLzsKLQkJCWxhc3Q7Ci0JCX0KLQl9Ci0JY2xvc2UoIE1ZUElQRSk7Ci0Jc3lzdGVtICJjZCBcIiRkc3RcIiA7ICRuZXdmc0V4ZWMgLXYgXCIkbmFtZVwiICRyYXciOwotCWlmKCAkPyApIHsgc3lzdGVtICIkaGRpVXRpbEV4ZWMgZWplY3QgJGRldiI7IGRpZSAiY291bGRuJ3QgZm9ybWF0IGRpc2sgaW1hZ2VcbiI7IH0KLQlzeXN0ZW0gIiRoZGlVdGlsRXhlYyBlamVjdCAkZGV2IjsKLQlpZiggJD8gKSB7IGRpZSAiY291bGRuJ3QgZWplY3QgZGlzayBpbWFnZVxuIjsgfQotCi0JIyBjb3B5IGZpbGVzCi0JaWYoIG5vdCBvcGVuKCBNWVBJUEUsICJjZCBcIiRkc3RcIjsgJGhkaURydkV4ZWMgXCJfJHtuYW1lfS5kbWdcIiB8IikgKSB7Ci0JCWRpZSAiY291bGRuJ3Qgb3BlbiBwaXBlXG4iOwotCX0KLQkoJGRldikgPSBzcGxpdCggL1x0LywgPE1ZUElQRT4pOwotCSRkZXYgPX4gcy9eKC4qXFMpXHMqJC8kMS87Ci0JbXkgJHZuYW1lOwotCXdoaWxlKCA8TVlQSVBFPiApIHsKLQkJKCRwYXJ0LCRwbmFtZSwkdm5hbWUpID0gc3BsaXQgL1x0LzsKLQkJaWYoICRwbmFtZSA9fiBtL15BcHBsZV9IRlMvICkgewotCQkJJHZuYW1lID1+IHMvXiguKlxTKVxzKiQvJDEvOwotCQkJbGFzdDsKLQkJfQotCX0KLQljbG9zZSggTVlQSVBFKTsKLQlzeXN0ZW0gIiRkaXR0b0V4ZWMgXCIke3NyY31cIiBcIiR7dm5hbWV9XCIiOwotCWlmKCAkPyApIHsgc3lzdGVtICIkaGRpVXRpbEV4ZWMgZWplY3QgJGRldiI7IGRpZSAiY291bGRuJ3QgY29weSBmaWxlc1xuIjsgfQotCXN5c3RlbSAiJGhkaVV0aWxFeGVjIGVqZWN0ICRkZXYiOwotCWlmKCAkPyApIHsgZGllICJjb3VsZG4ndCBlamVjdCBkaXNrIGltYWdlXG4iOyB9Ci0KLQkjIGNvbnZlcnQgZGlzayBpbWFnZQotCXN5c3RlbSAiY2QgXCIkZHN0XCI7ICRoZGlVdGlsRXhlYyBjb252ZXJ0IFwiXyR7bmFtZX0uZG1nXCIgLWZvcm1hdCBVRENPIC1vIFwiJHtuYW1lfVwiIjsKLQlpZiggJD8gKSB7IGRpZSAiY291bGRuJ3QgY29udmVydCBkaXNrIGltYWdlXG4iOyB9Ci19CmRpZmYgLS1naXQgYS9NYWMvT1NYL0Rpc3QvcmVzb3VyY2VzL1JlYWRNZS50eHQgYi9NYWMvT1NYL0Rpc3QvcmVzb3VyY2VzL1JlYWRNZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTdiODIuLjAwMDAwMDAKLS0tIGEvTWFjL09TWC9EaXN0L3Jlc291cmNlcy9SZWFkTWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotVGhpcyBwYWNrYWdlIHdpbGwgaW5zdGFsbCBNYWNQeXRob24gMi41YTAgZm9yIE1hYyBPUyBYCi0xMC4zLgotCi1JbnN0YWxsYXRpb24gcmVxdWlyZXMgYXBwcm94aW1hdGVseSAyMCBNQiBvZiBkaXNrCi1zcGFjZSwgaWdub3JlIHRoZSBtZXNzYWdlIHRoYXQgaXQgd2lsbCB0YWtlIHplcm8gYnl0ZXMuCi0KLVlvdSBtdXN0IGluc3RhbGwgb250byB5b3VyIGN1cnJlbnQgYm9vdCBkaXNrLCBldmVuCi10aG91Z2ggdGhlIGluc3RhbGxlciBkb2VzIG5vdCBlbmZvcmNlIHRoaXMsIG90aGVyd2lzZQotdGhpbmdzIHdpbGwgbm90IHdvcmsuCi0KLU1hY1B5dGhvbiBjb25zaXN0cyBvZiB0aGUgUHl0aG9uIHByb2dyYW1taW5nIGxhbmd1YWdlCi1pbnRlcnByZXRlciwgcGx1cyBhIHNldCBvZiBwcm9ncmFtcyB0byBhbGxvdyBlYXN5Ci1hY2Nlc3MgdG8gaXQgZm9yIE1hYyB1c2VycyAoYW4gaW50ZWdyYXRlZCBkZXZlbG9wbWVudAotZW52aXJvbm1lbnQsIGEgUHl0aG9uIGV4dGVuc2lvbiBwYWNrYWdlIG1hbmFnZXIpLCBwbHVzCi1hIHNldCBvZiBwcmUtYnVpbHQgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBvcGVuIHVwCi1zcGVjaWZpYyBNYWNpbnRvc2ggdGVjaG5vbG9naWVzIHRvIFB5dGhvbiBwcm9ncmFtcwotKENhcmJvbiwgQXBwbGVTY3JpcHQsIFF1aWNrdGltZSwgbW9yZSkuCi0KLVRoZSBpbnN0YWxsZXIgcHV0cyB0aGUgYXBwbGljYXRpb25zIGluIE1hY1B5dGhvbi0yLjUgaW4KLXlvdXIgQXBwbGljYXRpb25zIGZvbGRlciwgY29tbWFuZC1saW5lIHRvb2xzIGluCi0vdXNyL2xvY2FsL2JpbiBhbmQgdGhlIHVuZGVybHlpbmcgbWFjaGluZXJ5IGluCi0vTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsuCi0KLVRoZSBQeXRob25JREUgYXBwbGljYXRpb24gaGFzIGEgSGVscCBjb21tYW5kIHRoYXQgZ2V0cwoteW91IHN0YXJ0ZWQgcXVpY2tseSB3aXRoIE1hY1B5dGhvbiBhbmQgY29udGFpbnMKLXJlZmVyZW5jZXMgdG8gb3RoZXIgZG9jdW1lbnRhdGlvbi4KLQotTW9yZSBpbmZvcm1hdGlvbiBvbiBNYWNQeXRob24gY2FuIGJlIGZvdW5kIGF0Ci1odHRwOi8vd3d3LmN3aS5ubC9+amFjay9tYWNweXRob24sIG1vcmUKLWluZm9ybWF0aW9uIG9uIFB5dGhvbiBpbiBnZW5lcmFsIGF0Ci1odHRwOi8vd3d3LnB5dGhvbi5vcmcuCmRpZmYgLS1naXQgYS9NYWMvT1NYL0Rpc3QvcmVzb3VyY2VzL1dlbGNvbWUucnRmIGIvTWFjL09TWC9EaXN0L3Jlc291cmNlcy9XZWxjb21lLnJ0ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2YmIxYS4uMDAwMDAwMAotLS0gYS9NYWMvT1NYL0Rpc3QvcmVzb3VyY2VzL1dlbGNvbWUucnRmCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAote1xydGYxXG1hY1xhbnNpY3BnMTAwMDBcY29jb2FydGYxMDIKLXtcZm9udHRibFxmMFxmc3dpc3NcZmNoYXJzZXQ3NyBIZWx2ZXRpY2E7XGYxXGZzd2lzc1xmY2hhcnNldDc3IEhlbHZldGljYS1Cb2xkO30KLXtcY29sb3J0Ymw7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O30KLVxwYXBlcncxMTkwMFxwYXBlcmgxNjg0MFxtYXJnbDE0NDBcbWFyZ3IxNDQwXHZpZXd3OTkyMFx2aWV3aDEwNjYwXHZpZXdraW5kMAotXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxxbFxxbmF0dXJhbAotCi1cZjBcZnMyNCBcY2YwIFRoaXMgcGFja2FnZSB3aWxsIGluc3RhbGwgCi1cZjFcYiBNYWNQeXRob24gMi41YTAKLVxmMFxiMCAgZm9yIAotXGYxXGIgTWFjIE9TIFggMTAuMwotXGYwXGIwIC4gSW5zdGFsbGF0aW9uIG9uIDEwLjIgb3IgZWFybGllciB3aWxsIG5vdCB3b3JrLlwKLVwKLU1hY1B5dGhvbiBjb25zaXN0cyBvZiB0aGUgUHl0aG9uIHByb2dyYW1taW5nIGxhbmd1YWdlIGludGVycHJldGVyLCBwbHVzIGEgc2V0IG9mIHByb2dyYW1zIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIGl0IGZvciBNYWMgdXNlcnMgKGFuIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGEgUHl0aG9uIGV4dGVuc2lvbiBwYWNrYWdlIG1hbmFnZXIpLCBwbHVzIGEgc2V0IG9mIHByZS1idWlsdCBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG9wZW4gdXAgc3BlY2lmaWMgTWFjaW50b3NoIHRlY2hub2xvZ2llcyB0byBQeXRob24gcHJvZ3JhbXMgKENhcmJvbiwgQXBwbGVTY3JpcHQsIFF1aWNrdGltZSwgbW9yZSkuXAotXAotU2VlIHRoZSBSZWFkTWUgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi59ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTWFjL09TWC9EaXN0L3Jlc291cmNlcy9wb3N0ZmxpZ2h0IGIvTWFjL09TWC9EaXN0L3Jlc291cmNlcy9wb3N0ZmxpZ2h0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzhiNmQ0Li4wMDAwMDAwCi0tLSBhL01hYy9PU1gvRGlzdC9yZXNvdXJjZXMvcG9zdGZsaWdodAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSMhL2Jpbi9zaAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ3JlYXRlIHRoZSB1bml4IHRvb2xzIGFuZCBjb21waWxlIHRoZSAucHkgZmlsZXMgYWZ0ZXIgUHl0aG9uIGhhcyBiZWVuCi0jIGluc3RhbGxlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBZVkVSPTIuNQotCi1QS0c9JDEKLURFU1Q9JDIKLQotIyBNYWtlIHN1cmUgdGhpbmdzIGFyZSBncm91cC13cml0ZWFibGUKLXVtYXNrIDIKLQotIyBpZiBkZXN0aW5hdGlvbiBpcyAvIHRoZW4gdXNlIHVzci9sb2NhbC9iaW4sIG90aGVyd2lzZSBqdXN0IGJpbgotaWYgWyAiJERFU1QiID0gIi8iIF07IHRoZW4KLSAgICBUT09MRElSPS91c3IvbG9jYWwvYmluCi0gICAgREVTVD0KLWVsc2UKLSAgICBUT09MRElSPSRERVNUL2JpbgotZmkKLQotIyBNYWtlIHN1cmUgdGhlIGRpciBleGlzdHMKLW1rZGlyIC1wICRUT09MRElSCi0KLSMgTWFrZSBzb21lIGxpbmtzIHRvIHRoZSBweXRob24gZXhlY3V0YWJsZQotbG4gLWZzaCAkREVTVC9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8kUFlWRVIvYmluL3B5dGhvbiAkVE9PTERJUi9weXRob24kUFlWRVIKLWxuIC1mc2ggcHl0aG9uJFBZVkVSICRUT09MRElSL3B5dGhvbgotCi0KLSMgbWFrZSB0aGUgcHl0aG9udyBzY3JpcHQKLXJtIC1mICRUT09MRElSL3B5dGhvbnckUFlWRVIKLWNhdCA+ICRUT09MRElSL3B5dGhvbnckUFlWRVIgPDxFT0YKLSMhL2Jpbi9zaAotZXhlYyAiJERFU1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL01hY09TL1B5dGhvbiIgIlwkQCIKLUVPRgotY2htb2QgK3ggJFRPT0xESVIvcHl0aG9udyRQWVZFUgotbG4gLWZzaCBweXRob253JFBZVkVSICRUT09MRElSL3B5dGhvbncKLQotCi0jIENvbXBpbGUgdGhlIC5weSBmaWxlcyBpbiB0aGUgUHl0aG9uIGxpYnJhcnkgdG8gLnB5YydzIGFuZCB0aGVuIC5weW8ncwotJFRPT0xESVIvcHl0aG9uIC1XaSAtdHQgXAotICAgICRERVNUL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyRQWVZFUi9saWIvcHl0aG9uJFBZVkVSL2NvbXBpbGVhbGwucHkgXAotICAgIC14IGJhZHN5bnRheCAteCBzaXRlLXBhY2thZ2VzICRERVNUL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyRQWVZFUi9saWIvcHl0aG9uJFBZVkVSCi0KLSRUT09MRElSL3B5dGhvbiAtV2kgLXR0IC1PIFwKLSAgICAkREVTVC9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8kUFlWRVIvbGliL3B5dGhvbiRQWVZFUi9jb21waWxlYWxsLnB5IFwKLSAgICAteCBiYWRzeW50YXggLXggc2l0ZS1wYWNrYWdlcyAkREVTVC9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy8kUFlWRVIvbGliL3B5dGhvbiRQWVZFUgotCi0kVE9PTERJUi9weXRob24gLVdpIC10dCBcCi0gICAgJERFU1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL2xpYi9weXRob24kUFlWRVIvY29tcGlsZWFsbC5weSBcCi0gICAgJERFU1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL01hYy9Ub29scwotCi0kVE9PTERJUi9weXRob24gLVdpIC10dCAtTyBcCi0gICAgJERFU1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL2xpYi9weXRob24kUFlWRVIvY29tcGlsZWFsbC5weSBcCi0gICAgJERFU1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL01hYy9Ub29scwotCi0KLSMgTWFrZSB0aGUgc2l0ZS1wYWNrYWdlcyBhbmQgb3RoZXIgZGlycyB3cml0YWJsZSBieSB0aGUgYWRtaW4gaWYgZGVzdGluYXRpb24gaXMgLwotCi1pZiBbICIkREVTVCIgPSAiLyIgXTsgdGhlbgotCWZvciBkIGluICRERVNUL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyRQWVZFUi9saWIvcHl0aG9uJFBZVkVSL3NpdGUtcGFja2FnZXMgXAotCQkJICRERVNUL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyRQWVZFUi9iaW4gXAotCQkJICRERVNUL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyRQWVZFUi9SZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9SZXNvdXJjZXMgXAotCQkJICRERVNUL0FwcGxpY2F0aW9ucy9NYWNQeXRob24tJFBZVkVSOyBkbwotCQljaGdycCAtUiBhZG1pbiAkZAotCQljaG1vZCAtUiBnK3cgICAkZAotCWRvbmUKLWZpCi0KLWlmIFsgIiRERVNUIiAhPSAiLyIgXTsgdGhlbgotCSMgVGhlIGxpbmsgaW4gdGhlIGFwcCBidW5kbGVzIGFuZCBpbiBweWRvYyBuZWVkIHVwZGF0aW5nLgotCWluc3RhbGxlZF9weXRob249JERFU1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL01hY09TL3B5dGhvbgotCWZvciBhcHAgaW4gQnVpbGRBcHBsZXQgSURMRSBQYWNrYWdlTWFuYWdlciBQeXRob25JREU7IGRvCi0JCWxuIC1mc2ggICRpbnN0YWxsZWRfcHl0aG9uIFwKLQkJCSAgJERFU1QvQXBwbGljYXRpb25zL01hY1B5dGhvbi0kUFlWRVIvJGFwcC5hcHAvQ29udGVudHMvTWFjT1MKLQkJZWQgLXMgJERFU1QvQXBwbGljYXRpb25zL01hY1B5dGhvbi0kUFlWRVIvJGFwcC5hcHAvQ29udGVudHMvTWFjT1MvJGFwcCA8PCB4eXp6eQotMWMKLSMhJGluc3RhbGxlZF9weXRob24KLS4KLXcKLXEKLXh5enp5Ci0JZWQgLXMgJERFU1QvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJFBZVkVSL2Jpbi9weWRvYyA8PCB4eXp6eQotMWMKLSMhJGluc3RhbGxlZF9weXRob24KLS4KLXcKLXEKLXh5enp5Ci0JZG9uZQotZmkKZGlmZiAtLWdpdCBhL01hYy9PU1gvRXh0cmFzLlJlYWRNZS50eHQgYi9NYWMvT1NYL0V4dHJhcy5SZWFkTWUudHh0CmluZGV4IDNhYjQ1NjguLjJkN2ZkNDIgMTAwNjQ0Ci0tLSBhL01hYy9PU1gvRXh0cmFzLlJlYWRNZS50eHQKKysrIGIvTWFjL09TWC9FeHRyYXMuUmVhZE1lLnR4dApAQCAtMywxMiArMywzIEBACiBZb3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhlc2UgYXJlIG5vdCBNYWNpbnRvc2gtc3BlY2lmaWMgYnV0IGFyZSBzaGFyZWQKIGFtb25nIFB5dGhvbiBvbiBhbGwgcGxhdGZvcm1zLCBzbyB0aGVyZSBhcmUgc29tZSB0aGF0IG9ubHkgcnVuIG9uIFdpbmRvd3MKIG9yIFVuaXggb3IgYW5vdGhlciBwbGF0Zm9ybSwgYW5kL29yIG1ha2UgbGl0dGxlIHNlbnNlIG9uIGEgTWFjaW50b3NoLgotCi1Tb21lIGV4YW1wbGVzIGNhbiBiZSBydW4gZnJvbSB3aXRoaW4gdGhlIFB5dGhvbklERSwgYnV0IG1hbnkgd2lsbCByZXF1aXJlCi10aGF0IHlvdSBzdGFydCB0aGVtIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciB3aXRoIFB5dGhvbkxhdW5jaGVyLiBJbiB0aGUKLWxhdHRlciBjYXNlLCB5b3UgY2FuIHN1cHBseSBhbnkgbmVlZGVkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYnkgaG9sZGluZwotdGhlICJhbHQiIGtleSB3aGlsZSBkcmFnZ2luZyB0aGUgc2NyaXB0IHRvIFB5dGhvbkxhdW5jaGVyLCBvciB3aGlsZQotZG91YmxlLWNsaWNraW5nIHRoZSBzY3JpcHQgaWYgUHl0aG9uTGF1bmNoZXIgaXMgc2V0IGFzIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uCi10byBvcGVuIFB5dGhvbiBzY3JpcHRzIHdpdGguIFNlZSAiQ2hhbmdpbmcgdGhlIGFwcGxpY2F0aW9uIHRoYXQgb3BlbnMgYSBmaWxlIgotaW4gTWFjIEhlbHAgZm9yIGluZm9ybWF0aW9uIG9uIG1ha2luZyBQeXRob25MYXVuY2hlciB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbi4KLQpkaWZmIC0tZ2l0IGEvTWFjL09TWC9FeHRyYXMuaW5zdGFsbC5weSBiL01hYy9PU1gvRXh0cmFzLmluc3RhbGwucHkKaW5kZXggMjUyMWYwNi4uY2UwMGFmMyAxMDA2NDQKLS0tIGEvTWFjL09TWC9FeHRyYXMuaW5zdGFsbC5weQorKysgYi9NYWMvT1NYL0V4dHJhcy5pbnN0YWxsLnB5CkBAIC0xMiw2ICsxMiw3IEBACiAgICAgaWYgbmFtZSA9PSAnQ1ZTJzogcmV0dXJuIDAKICAgICBpZiBuYW1lID09ICcuY3ZzaWdub3JlJzogcmV0dXJuIDAKICAgICBpZiBuYW1lID09ICcuRFNfc3RvcmUnOiByZXR1cm4gMAorICAgIGlmIG5hbWUgPT0gJy5zdm4nOiByZXR1cm4gMAogICAgIGlmIG5hbWUuZW5kc3dpdGgoJ34nKTogcmV0dXJuIDAKICAgICBpZiBuYW1lLmVuZHN3aXRoKCcuQkFLJyk6IHJldHVybiAwCiAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5YycpOiByZXR1cm4gMApkaWZmIC0tZ2l0IGEvTWFjL09TWC9JRExFL0luZm8ucGxpc3QgYi9NYWMvT1NYL0lETEUvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmUyZWExCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9JRExFL0luZm8ucGxpc3QKQEAgLTAsMCArMSw1NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KKwk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlRG9jdW1lbnRUeXBlczwva2V5PgorCTxhcnJheT4KKwkJPGRpY3Q+CisJCQk8a2V5PkNGQnVuZGxlVHlwZUV4dGVuc2lvbnM8L2tleT4KKwkJCTxhcnJheT4KKwkJCQk8c3RyaW5nPnB5PC9zdHJpbmc+CisJCQkJPHN0cmluZz5weXc8L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PkNGQnVuZGxlVHlwZUljb25GaWxlPC9rZXk+CisJCQk8c3RyaW5nPlB5dGhvblNvdXJjZS5pY25zPC9zdHJpbmc+CisJCQk8a2V5PkNGQnVuZGxlVHlwZU5hbWU8L2tleT4KKwkJCTxzdHJpbmc+UHl0aG9uIFNjcmlwdDwvc3RyaW5nPgorCQkJPGtleT5DRkJ1bmRsZVR5cGVSb2xlPC9rZXk+CisJCQk8c3RyaW5nPkVkaXRvcjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJCTxkaWN0PgorCQkJPGtleT5DRkJ1bmRsZVR5cGVFeHRlbnNpb25zPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5weWM8L3N0cmluZz4KKwkJCQk8c3RyaW5nPnB5bzwvc3RyaW5nPgorCQkJPC9hcnJheT4KKwkJCTxrZXk+Q0ZCdW5kbGVUeXBlSWNvbkZpbGU8L2tleT4KKwkJCTxzdHJpbmc+UHl0aG9uQ29tcGlsZWQuaWNuczwvc3RyaW5nPgorCQkJPGtleT5DRkJ1bmRsZVR5cGVOYW1lPC9rZXk+CisJCQk8c3RyaW5nPlB5dGhvbiBCeXRlY29kZSBEb2N1bWVudDwvc3RyaW5nPgorCQkJPGtleT5DRkJ1bmRsZVR5cGVSb2xlPC9rZXk+CisJCQk8c3RyaW5nPkVkaXRvcjwvc3RyaW5nPgorCQk8L2RpY3Q+CisJPC9hcnJheT4KKwk8a2V5PkNGQnVuZGxlRXhlY3V0YWJsZTwva2V5PgorCTxzdHJpbmc+SURMRTwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVHZXRJbmZvU3RyaW5nPC9rZXk+CisJPHN0cmluZz4yLjUsIMKpIDAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+CisJPHN0cmluZz5JRExFLmljbnM8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+b3JnLnB5dGhvbi5JRExFPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Ni4wPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZU5hbWU8L2tleT4KKwk8c3RyaW5nPklETEU8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4yLjU8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+Mi41PC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9JRExFL01ha2VmaWxlLmluIGIvTWFjL09TWC9JRExFL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmU3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL0lETEUvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MiBAQAorcHJlZml4PUBwcmVmaXhACitDQz1AQ0NACitMRD1AQ0NACitCQVNFQ0ZMQUdTPUBCQVNFQ0ZMQUdTQAorT1BUPUBPUFRACitDRkxBR1M9JChCQVNFQ0ZMQUdTKSAkKE9QVCkKK0xERkxBR1M9QExERkxBR1NACitzcmNkaXI9ICAgICAgICAgQHNyY2RpckAKK1ZFUlNJT049CUBWRVJTSU9OQAorVU5JVkVSU0FMU0RLPUBVTklWRVJTQUxTREtACitidWlsZGRpcj0JLi4vLi4vLi4KKworUlVOU0hBUkVEPSAgICAgIEBSVU5TSEFSRURACitCVUlMREVYRT0gICAgICAgQEJVSUxERVhFRVhUQAorQlVJTERQWVRIT049ICAgIC4uLy4uLy4uL3B5dGhvbiQoQlVJTERFWEUpCisKKyMgRGVwbG95bWVudCB0YXJnZXQgc2VsZWN0ZWQgZHVyaW5nIGNvbmZpZ3VyZSwgdG8gYmUgY2hlY2tlZAorIyBieSBkaXN0dXRpbHMgIAorTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPUBDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUQAorQEVYUE9SVF9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVRAZXhwb3J0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAorCitCVU5ETEVCVUxERVI9JChzcmNkaXIpLy4uLy4uLy4uL0xpYi9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5CisKK1BZVEhPTkFQUFNESVI9L0FwcGxpY2F0aW9ucy9NYWNQeXRob24gJChWRVJTSU9OKQorCithbGw6IElETEUuYXBwCisKK2luc3RhbGw6IElETEUuYXBwCisJdGVzdCAtZCAiJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikiIHx8IG1rZGlyIC1wICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKSIKKwktdGVzdCAtZCAiJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvSURMRS5hcHAiICYmIHJtIC1yICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9JRExFLmFwcCIKKwljcCAtUFIgSURMRS5hcHAgIiQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpIgorCXRvdWNoICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9JRExFLmFwcCIKKworY2xlYW46CisJcm0gLXJmIElETEUuYXBwCisKK0lETEUuYXBwOiAgXAorCQkkKHNyY2RpcikvLi4vSWNvbnMvSURMRS5pY25zICQoc3JjZGlyKS9pZGxlbWFpbi5weSBcCisJCSQoc3JjZGlyKS8uLi9JY29ucy9QeXRob25Tb3VyY2UuaWNucyBcCisJCSQoc3JjZGlyKS8uLi9JY29ucy9QeXRob25Db21waWxlZC5pY25zCisJcm0gLWZyIElETEUuYXBwCisJJChSVU5TSEFSRUQpICQoQlVJTERQWVRIT04pICQoQlVORExFQlVMREVSKSBcCisJCS0tYnVpbGRkaXI9LiBcCisJCS0tbmFtZT1JRExFIFwKKwkJLS1saW5rLWV4ZWMgXAorCQktLXBsaXN0PSQoc3JjZGlyKS9JbmZvLnBsaXN0IFwKKwkJLS1tYWlucHJvZ3JhbT0kKHNyY2RpcikvaWRsZW1haW4ucHkgXAorCQktLWljb25maWxlPSQoc3JjZGlyKS8uLi9JY29ucy9JRExFLmljbnMgXAorCQktLXJlc291cmNlPSQoc3JjZGlyKS8uLi9JY29ucy9QeXRob25Tb3VyY2UuaWNucyBcCisJCS0tcmVzb3VyY2U9JChzcmNkaXIpLy4uL0ljb25zL1B5dGhvbkNvbXBpbGVkLmljbnMgXAorCQktLXB5dGhvbj0kKHByZWZpeCkvUmVzb3VyY2VzL1B5dGhvbi5hcHAvQ29udGVudHMvTWFjT1MvUHl0aG9uIFwKKwkJYnVpbGQKZGlmZiAtLWdpdCBhL01hYy9PU1gvSURMRS9pZGxlbWFpbi5weSBiL01hYy9PU1gvSURMRS9pZGxlbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc1ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9JRExFL2lkbGVtYWluLnB5CkBAIC0wLDAgKzEsMjcgQEAKKyIiIgorQm9vdHN0cmFwIHNjcmlwdCBmb3IgSURMRSBhcyBhbiBhcHBsaWNhdGlvbiBidW5kbGUuCisiIiIKK2ltcG9ydCBzeXMsIG9zCisKK2Zyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBtYWluCisKKyMgQ2hhbmdlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LCB0aGF0IHdheSB3ZSdsbCBnZXQKKyMgYSBtb3JlIHVzZWZ1bCBkZWZhdWx0IGxvY2F0aW9uIGluIHRoZSBvcGVuL3NhdmUgZGlhbG9ncy4KK29zLmNoZGlyKG9zLnBhdGguZXhwYW5kdXNlcignfi9Eb2N1bWVudHMnKSkKKworCisjIE1ha2Ugc3VyZSBzeXMuZXhlY3V0YWJsZSBwb2ludHMgdG8gdGhlIHB5dGhvbiBpbnRlcnByZXRlciBpbnNpZGUgdGhlCisjIGZyYW1ld29yaywgaW5zdGVhZCBvZiBhdCB0aGUgaGVscGVyIGV4ZWN1dGFibGUgaW5zaWRlIHRoZSBhcHBsaWNhdGlvbgorIyBidW5kbGUgKHRoZSBsYXR0ZXIgd29ya3MsIGJ1dCBkb2Vzbid0IGFsbG93IGFjY2VzcyB0byB0aGUgd2luZG93IHNlcnZlcikKK3N5cy5leGVjdXRhYmxlID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdiaW4nLCAncHl0aG9uJykKKworIyBMb29rIGZvciB0aGUgLXBzbiBhcmd1bWVudCB0aGF0IHRoZSBsYXVuY2hlciBhZGRzIGFuZCByZW1vdmUgaXQsIGl0IHdpbGwKKyMgb25seSBjb25mdXNlIHRoZSBJRExFIHN0YXJ0dXAgY29kZS4KK2ZvciBpZHgsIHZhbHVlIGluIGVudW1lcmF0ZShzeXMuYXJndik6CisgICAgaWYgdmFsdWUuc3RhcnRzd2l0aCgnLXBzbl8nKToKKyAgICAgICAgZGVsIHN5cy5hcmd2W2lkeF0KKyAgICAgICAgYnJlYWsKKworI2FyZ3ZlbXVsYXRvci5Bcmd2Q29sbGVjdG9yKCkubWFpbmxvb3AoKQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9PU1gvSWNvbnMvRGlzayBJbWFnZS5pY25zIGIvTWFjL09TWC9JY29ucy9EaXNrIEltYWdlLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmMTZiZgotLS0gL2Rldi9udWxsCisrKyBiL01hYy9PU1gvSWNvbnMvRGlzayBJbWFnZS5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvSWNvbnMvSURMRS5pY25zIGIvTWFjL09TWC9JY29ucy9JRExFLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyYzlkYQotLS0gL2Rldi9udWxsCisrKyBiL01hYy9PU1gvSWNvbnMvSURMRS5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvSWNvbnMvUHl0aG9uIEZvbGRlci5pY25zIGIvTWFjL09TWC9JY29ucy9QeXRob24gRm9sZGVyLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3NjZlZQotLS0gL2Rldi9udWxsCisrKyBiL01hYy9PU1gvSWNvbnMvUHl0aG9uIEZvbGRlci5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvSWNvbnMvUHl0aG9uQ29tcGlsZWQuaWNucyBiL01hYy9PU1gvSWNvbnMvUHl0aG9uQ29tcGlsZWQuaWNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDlmMzIwCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9JY29ucy9QeXRob25Db21waWxlZC5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvSWNvbnMvUHl0aG9uTGF1bmNoZXIuaWNucyBiL01hYy9PU1gvSWNvbnMvUHl0aG9uTGF1bmNoZXIuaWNucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDlmZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9JY29ucy9QeXRob25MYXVuY2hlci5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvSWNvbnMvUHl0aG9uU291cmNlLmljbnMgYi9NYWMvT1NYL0ljb25zL1B5dGhvblNvdXJjZS5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzVjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL0ljb25zL1B5dGhvblNvdXJjZS5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvSWNvbnMvUmVhZE1lLnR4dCBiL01hYy9PU1gvSWNvbnMvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY4MzZhCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9JY29ucy9SZWFkTWUudHh0CkBAIC0wLDAgKzEsMyBAQAorVGhlIGljb25zIGZvciB1c2Ugb24gTWFjT1MgWCB3ZXJlIGNyZWF0ZWQgYnkgSmFjb2IgUnVzIDxqcnVzQGZhcy5oYXJ2YXJkLmVkdT4KK3dpdGggc29tZSBmZWVkYmFjayBmcm9tIHRoZSBmb2xrcyBvbiBweXRob25tYWMtc2lnQHB5dGhvbi5vcmcuCisKZGlmZiAtLWdpdCBhL01hYy9PU1gvTWFrZWZpbGUgYi9NYWMvT1NYL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIwZjVkLi4wMDAwMDAwCi0tLSBhL01hYy9PU1gvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotIyBUaGlzIGZpbGUgY2FuIGJlIGludm9rZWQgZnJvbSB0aGUgdmFyaW91cyBmcmFtZXdvcmtpbnN0YWxsLi4uIHRhcmdldHMgaW4gdGhlIAotIyBtYWluIE1ha2VmaWxlLiBUaGUgbmV4dCBjb3VwbGUgb2YgdmFyaWFibGVzIGFyZSBvdmVycmlkZGVuIG9uIHRoZSAKLSMgY29tbWFuZGxpbmUgaW4gdGhhdCBjYXNlLgotCi1WRVJTSU9OPTIuNQotYnVpbGRkaXIgPSAuLi8uLgotc3JjZGlyID0gLi4vLi4KLXByZWZpeD0vTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJChWRVJTSU9OKQotTElCREVTVD0kKHByZWZpeCkvbGliL3B5dGhvbiQoVkVSU0lPTikKLUJVSUxEUFlUSE9OPSQoYnVpbGRkaXIpL3B5dGhvbi5leGUKLURFU1RESVI9Ci0jIFRlc3Qgd2hldGhlciB0byB1c2UgeGNvZGVidWlsZCAocHJlZmVycmVkKSBvciBwYnhidWlsZDoKLWlmZXEgKCQoc2hlbGwgbHMgL3Vzci9iaW4veGNvZGVidWlsZCksL3Vzci9iaW4veGNvZGVidWlsZCkKLVBCWEJVSUxEPXhjb2RlYnVpbGQKLWVsc2UKLVBCWEJVSUxEPXBieGJ1aWxkCi1lbmRpZgotCi0jIFRoZXNlIGFyZSBub3JtYWxseSBnbGltcHNlZCBmcm9tIHRoZSBwcmV2aW91cyBzZXQKLWJpbmRpcj0vdXNyL2xvY2FsL2JpbgotUFlUSE9OQVBQU1BBVEg9L0FwcGxpY2F0aW9ucy9NYWNQeXRob24tJChWRVJTSU9OKQotUFlUSE9OQVBQU0RJUj0kKFBZVEhPTkFQUFNQQVRIKQotQVBQSU5TVEFMTERJUj0kKHByZWZpeCkvUmVzb3VyY2VzL1B5dGhvbi5hcHAKLQotIyBWYXJpYWJsZXMgZm9yIGluc3RhbGxpbmcgdGhlICJub3JtYWwiIHVuaXggYmluYXJpZXMKLUlOU1RBTExFRF9QWVRIT049JChwcmVmaXgpL2Jpbi9weXRob24KLUlOU1RBTExFRF9QWVRIT05XPSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvTWFjT1MvUHl0aG9uCi0KLSMgSXRlbXMgbW9yZS1vci1sZXNzIGNvcGllZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlCi1ESVJNT0RFPTc1NQotRklMRU1PREU9NjQ0Ci1JTlNUQUxMPS91c3IvYmluL2luc3RhbGwgLWMKLUlOU1RBTExfU1lNTElOSz1sbiAtZnNuCi1JTlNUQUxMX1BST0dSQU09JHtJTlNUQUxMfQotSU5TVEFMTF9TQ1JJUFQ9ICR7SU5TVEFMTF9QUk9HUkFNfQotSU5TVEFMTF9EQVRBPQkke0lOU1RBTEx9IC1tICR7RklMRU1PREV9Ci1MTj1sbgotU1RSSVBGTEFHPS1zCi0jI09QVD0tZyAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLWxvbmctZG91YmxlIC1uby1jcHAtcHJlY29tcCBcCi0jIwktZm5vLWNvbW1vbiAtZHluYW1pYwotIyNJTkNMVURFUz0tSSQoYnVpbGRkaXIpIC1JJChzcmNkaXIpL0luY2x1ZGUgLUkkKHNyY2RpcikvTWFjL0luY2x1ZGUKLSMjREVGSU5FUz0KLSMjCi0jI0NGTEFHUz0kKE9QVCkgJChERUZJTkVTKSAkKElOQ0xVREVTKQotIyNMREZMQUdTPS1GJChidWlsZGRpcikgLWZyYW1ld29yayBTeXN0ZW0gLWZyYW1ld29yayBQeXRob24gLWZyYW1ld29yayBDYXJib24gXAotIyMJLWZyYW1ld29yayBGb3VuZGF0aW9uCi0jI0NDPWNjCi0jI0xEPWNjCi1DUE1BQz0vRGV2ZWxvcGVyL1Rvb2xzL0NwTWFjCi0KLUFQUFRFTVBMQVRFPSQoc3JjZGlyKS9NYWMvT1NYUmVzb3VyY2VzL2FwcAotQVBQU1VCRElSUz1NYWNPUyBSZXNvdXJjZXMgUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ogXAotCVJlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24gXAotCVJlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24vZG9jIFwKLQlSZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uL2lkZQotRE9DRElSPSQoc3JjZGlyKS9NYWMvT1NYUmVzb3VyY2VzL2FwcC9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uCi1ET0NJTkRFWD0kKERPQ0RJUikvIkRvY3VtZW50YXRpb24gaWR4IgotQ0FDSEVSU1JDPSQoc3JjZGlyKS9NYWMvc2NyaXB0cy9jYWNoZXJzcmMucHkKLWNvbXBpbGVhbGw9JChzcmNkaXIpL0xpYi9jb21waWxlYWxsLnB5Ci1idW5kbGVidWlsZGVyPSQoc3JjZGlyKS9MaWIvcGxhdC1tYWMvYnVuZGxlYnVpbGRlci5weQotCi1pbnN0YWxsYXBwczogaW5zdGFsbF9QeXRob25MYXVuY2hlciBpbnN0YWxsX1B5dGhvbiBpbnN0YWxsX0J1aWxkQXBwbGV0IGluc3RhbGxfSURFIFwKLQlpbnN0YWxsX0lETEUgaW5zdGFsbF9QYWNrYWdlTWFuYWdlciBjaGVja2FwcGxlcHl0aG9uCi0KLWluc3RhbGxfUHl0aG9uTGF1bmNoZXI6Ci0JY2QgJChzcmNkaXIpL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uTGF1bmNoZXIucGJwcm9qIDsgXAotCSQoUEJYQlVJTEQpIC10YXJnZXQgUHl0aG9uTGF1bmNoZXIgLWJ1aWxkc3R5bGUgRGVwbG95bWVudCBpbnN0YWxsIFwKLQkJRFNUUk9PVD0kKERFU1RESVIpLyBJTlNUQUxMX1BBVEg9JChQWVRIT05BUFBTUEFUSCkKLQotaW5zdGFsbF9QeXRob246Ci0JQGlmIHRlc3QgISAtZiAkKERPQ0lOREVYKTsgdGhlbiBcCi0JCWVjaG8gV0FSTklORzogeW91IHNob3VsZCBydW4gQXBwbGUgSGVscCBJbmRleGluZyBUb29sIG9uICQoRE9DRElSKTsgXAotCWZpCi0JQGZvciBpIGluICQoUFlUSE9OQVBQU0RJUikgJChBUFBJTlNUQUxMRElSKSAkKEFQUElOU1RBTExESVIpL0NvbnRlbnRzOyBkbyBcCi0JCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKLQkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkKERFU1RESVIpJCRpIjsgXAotCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkJGk7IFwKLQkJZmk7XAotCWRvbmUKLQlAZm9yIGkgaW4gJChBUFBTVUJESVJTKTsgZG8gXAotCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvJCRpOyB0aGVuIFwKLQkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkKERFU1RESVIpJChBUFBJTlNUQUxMRElSKS9Db250ZW50cy8kJGkiOyBcCi0JCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvJCRpOyBcCi0JCWVsc2UJdHJ1ZTsgXAotCQlmaTsgXAotCWRvbmUKLQlAZm9yIGQgaW4gLiAkKEFQUFNVQkRJUlMpOyBcCi0JZG8gXAotCQlhPSQoQVBQVEVNUExBVEUpLyQkZDsgXAotCQlpZiB0ZXN0ICEgLWQgJCRhOyB0aGVuIGNvbnRpbnVlOyBlbHNlIHRydWU7IGZpOyBcCi0JCWI9JChERVNURElSKSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvJCRkOyBcCi0JCWZvciBpIGluICQkYS8qOyBcCi0JCWRvIFwKLQkJCWNhc2UgJCRpIGluIFwKLQkJCSpDVlMpIDs7IFwKLQkJCSoucHlbY29dKSA7OyBcCi0JCQkqLm9yaWcpIDs7IFwKLQkJCSp+KSA7OyBcCi0JCQkqaWR4KSBcCi0JCQkJZWNobyAkKENQTUFDKSAiJCRpIiAkJGI7IFwKLQkJCQkkKENQTUFDKSAiJCRpIiAkJGI7IFwKLQkJCQk7OyBcCi0JCQkqKSBcCi0JCQkJaWYgdGVzdCAtZCAkJGk7IHRoZW4gY29udGludWU7IGZpOyBcCi0JCQkJaWYgdGVzdCAteCAkJGk7IHRoZW4gXAotCQkJCSAgICBlY2hvICQoSU5TVEFMTF9TQ1JJUFQpICQkaSAkJGI7IFwKLQkJCQkgICAgJChJTlNUQUxMX1NDUklQVCkgJCRpICQkYjsgXAotCQkJCWVsc2UgXAotCQkJCSAgICBlY2hvICQoSU5TVEFMTF9EQVRBKSAkJGkgJCRiOyBcCi0JCQkJICAgICQoSU5TVEFMTF9EQVRBKSAkJGkgJCRiOyBcCi0JCQkJZmk7OyBcCi0JCQllc2FjOyBcCi0JCWRvbmU7IFwKLQlkb25lCi0JJChJTlNUQUxMX1BST0dSQU0pICQoU1RSSVBGTEFHKSAkKEJVSUxEUFlUSE9OKSAkKERFU1RESVIpJChBUFBJTlNUQUxMRElSKS9Db250ZW50cy9NYWNPUy9QeXRob24KLQotaW5zdGFsbF9JREU6Ci0JQGlmICEgJChCVUlMRFBZVEhPTikgLWMgImltcG9ydCB3YXN0ZSI7IHRoZW4gIFwKLQkJZWNobyBQeXRob25JREUgbmVlZHMgdGhlIFwid2FzdGVcIiBleHRlbnNpb24gbW9kdWxlOyBcCi0JCWVjaG8gU2VlIE1hYy9PU1gvUkVBRE1FIGZvciBkZXRhaWxzOyBcCi0JZWxzZSBcCi0JCWVjaG8gJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL01hYy9zY3JpcHRzL0J1aWxkQXBwbGV0LnB5IFwKLQkJICAgIC0tZGVzdHJvb3QgIiQoREVTVERJUikiIFwKLQkJCS0tcHl0aG9uICQoSU5TVEFMTEVEX1BZVEhPTlcpIFwKLQkJCS0tb3V0cHV0ICQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpL1B5dGhvbklERS5hcHAgLS1ub2FyZ3YgXAotCQkJJChzcmNkaXIpL01hYy9Ub29scy9JREUvUHl0aG9uSURFLnB5IDsgXAotCQkkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvTWFjL3NjcmlwdHMvQnVpbGRBcHBsZXQucHkgXAotCQkgICAgLS1kZXN0cm9vdCAiJChERVNURElSKSIgXAotCQkJLS1weXRob24gJChJTlNUQUxMRURfUFlUSE9OVykgXAotCQkJLS1vdXRwdXQgJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvUHl0aG9uSURFLmFwcCAtLW5vYXJndiBcCi0JCQkkKHNyY2RpcikvTWFjL1Rvb2xzL0lERS9QeXRob25JREUucHk7IFwKLQlmaQotCi1pbnN0YWxsX1BhY2thZ2VNYW5hZ2VyOgotCUBpZiAhICQoQlVJTERQWVRIT04pIC1jICJpbXBvcnQgd2FzdGUiOyB0aGVuICBcCi0JCWVjaG8gUGFja2FnZU1hbmFnZXIgbmVlZHMgdGhlIFwid2FzdGVcIiBleHRlbnNpb24gbW9kdWxlOyBcCi0JCWVjaG8gU2VlIE1hYy9PU1gvUkVBRE1FIGZvciBkZXRhaWxzOyBcCi0JZWxzZSBcCi0JCWVjaG8gJChCVUlMRFBZVEhPTikgJChidW5kbGVidWlsZGVyKSBcCi0JCQktLWJ1aWxkZGlyICQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpLyBcCi0JCSAgICAtLWRlc3Ryb290ICIkKERFU1RESVIpIiBcCi0JCQktLXB5dGhvbiAkKElOU1RBTExFRF9QWVRIT05XKSBcCi0JCQktLXJlc291cmNlICQoc3JjZGlyKS9NYWMvVG9vbHMvSURFL1B5dGhvbklERS5yc3JjIFwKLQkJCS0tbWFpbnByb2dyYW0gJChzcmNkaXIpL01hYy9Ub29scy9JREUvUGFja2FnZU1hbmFnZXIucHkgXAotCQkJLS1pY29uZmlsZSAkKHNyY2RpcikvTWFjL1Rvb2xzL0lERS9QYWNrYWdlTWFuYWdlci5pY25zIFwKLQkJCS0tY3JlYXRvciBQaW1wIGJ1aWxkOyBcCi0JCSQoQlVJTERQWVRIT04pICQoYnVuZGxlYnVpbGRlcikgXAotCQkJLS1idWlsZGRpciAkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS8gXAotCQkgICAgLS1kZXN0cm9vdCAiJChERVNURElSKSIgXAotCQkJLS1weXRob24gJChJTlNUQUxMRURfUFlUSE9OVykgXAotCQkJLS1yZXNvdXJjZSAkKHNyY2RpcikvTWFjL1Rvb2xzL0lERS9QeXRob25JREUucnNyYyBcCi0JCQktLW1haW5wcm9ncmFtICQoc3JjZGlyKS9NYWMvVG9vbHMvSURFL1BhY2thZ2VNYW5hZ2VyLnB5IFwKLQkJCS0taWNvbmZpbGUgJChzcmNkaXIpL01hYy9Ub29scy9JREUvUGFja2FnZU1hbmFnZXIuaWNucyBcCi0JCQktLWNyZWF0b3IgUGltcCBidWlsZDsgXAotCWZpCi0KLWluc3RhbGxfSURMRToKLQlAaWYgISAkKEJVSUxEUFlUSE9OKSAtYyAiaW1wb3J0IF90a2ludGVyIjsgdGhlbiBcCi0JCWVjaG8gSURMRSBuZWVkcyB0aGUgXCJUa2ludGVyXCIgZXh0ZW5zaW9uIG1vZHVsZTsgXAotCQllY2hvIFNlZSBNYWMvT1NYL1JFQURNRSBmb3IgZGV0YWlsczsgXAotCWVsc2UgXAotCQllY2hvICQoQlVJTERQWVRIT04pICQoc3JjZGlyKS9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weSBcCi0JCQktLXB5dGhvbiAkKElOU1RBTExFRF9QWVRIT05XKSBcCi0JCSAgICAtLWRlc3Ryb290ICIkKERFU1RESVIpIiBcCi0JCQktLW91dHB1dCAkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9JRExFLmFwcCBcCi0JCQktLWV4dHJhICQoc3JjZGlyKS9MaWIvaWRsZWxpYiBcCi0JCQkkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9pZGxlIDsgXAotCQkkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvTWFjL3NjcmlwdHMvQnVpbGRBcHBsZXQucHkgXAotCQkJLS1weXRob24gJChJTlNUQUxMRURfUFlUSE9OVykgXAotCQkgICAgLS1kZXN0cm9vdCAiJChERVNURElSKSIgXAotCQkJLS1vdXRwdXQgJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvSURMRS5hcHAgXAotCQkJLS1leHRyYSAkKHNyY2RpcikvTGliL2lkbGVsaWI6Q29udGVudHMvUmVzb3VyY2VzL2lkbGVsaWIgXAotCQkJJChzcmNkaXIpL1Rvb2xzL3NjcmlwdHMvaWRsZSA7IFwKLQlmaQotCi0KLWluc3RhbGxfQnVpbGRBcHBsZXQ6Ci0JJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL01hYy9zY3JpcHRzL0J1aWxkQXBwbGV0LnB5IFwKLQkJLS1kZXN0cm9vdCAiJChERVNURElSKSIgXAotCQktLXB5dGhvbiAkKElOU1RBTExFRF9QWVRIT05XKSBcCi0JCS0tb3V0cHV0ICQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpL0J1aWxkQXBwbGV0LmFwcCBcCi0JCSQoc3JjZGlyKS9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weQotCi1NQUNMSUJERVNUPSQoTElCREVTVCkvcGxhdC1tYWMKLU1BQ1RPT0xTREVTVD0kKHByZWZpeCkvTWFjL1Rvb2xzCi1NQUNUT09MU1NSQz0kKHNyY2RpcikvTWFjL1Rvb2xzCi1NQUNUT09MU1NVQkRJUlM9SURFCi1pbnN0YWxsbWFjc3VidHJlZToKLQlAZm9yIGkgaW4gJChNQUNUT09MU0RFU1QpOyBcCi0JZG8gXAotCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCi0JCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJChERVNURElSKSQkaSI7IFwKLQkJCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAkKERFU1RESVIpJCRpOyBcCi0JCWVsc2UJdHJ1ZTsgXAotCQlmaTsgXAotCWRvbmUKLQlAZm9yIGQgaW4gJChNQUNUT09MU1NVQkRJUlMpOyBcCi0JZG8gXAotCQlhPSQoTUFDVE9PTFNTUkMpLyQkZDsgXAotCQlpZiB0ZXN0ICEgLWQgJCRhOyB0aGVuIGNvbnRpbnVlOyBlbHNlIHRydWU7IGZpOyBcCi0JCWI9JChERVNURElSKSQoTUFDVE9PTFNERVNUKS8kJGQ7IFwKLQkJaWYgdGVzdCAhIC1kICQkYjsgdGhlbiBcCi0JCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJCRiIjsgXAotCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQkYjsgXAotCQllbHNlCXRydWU7IFwKLQkJZmk7IFwKLQlkb25lCi0JQGZvciBkIGluICQoTUFDVE9PTFNTVUJESVJTKTsgXAotCWRvIFwKLQkJYT0kKE1BQ1RPT0xTU1JDKS8kJGQ7IFwKLQkJaWYgdGVzdCAhIC1kICQkYTsgdGhlbiBjb250aW51ZTsgZWxzZSB0cnVlOyBmaTsgXAotCQliPSQoREVTVERJUikkKE1BQ1RPT0xTREVTVCkvJCRkOyBcCi0JCWZvciBpIGluICQkYS8qOyBcCi0JCWRvIFwKLQkJCWNhc2UgJCRpIGluIFwKLQkJCSpDVlMpIDs7IFwKLQkJCSoucHlbY29dKSA7OyBcCi0JCQkqLm9yaWcpIDs7IFwKLQkJCSp+KSA7OyBcCi0JCQkqLnJzcmMpIFwKLQkJCQllY2hvICQoQ1BNQUMpICQkaSAkJGIgOyBcCi0JCQkJJChDUE1BQykgJCRpICQkYiA7IFwKLQkJCQk7OyBcCi0JCQkqKSBcCi0JCQkJaWYgdGVzdCAtZCAkJGk7IHRoZW4gY29udGludWU7IGZpOyBcCi0JCQkJaWYgdGVzdCAteCAkJGk7IHRoZW4gXAotCQkJCSAgICBlY2hvICQoSU5TVEFMTF9TQ1JJUFQpICQkaSAkJGI7IFwKLQkJCQkgICAgJChJTlNUQUxMX1NDUklQVCkgJCRpICQkYjsgXAotCQkJCWVsc2UgXAotCQkJCSAgICBlY2hvICQoSU5TVEFMTF9EQVRBKSAkJGkgJCRiOyBcCi0JCQkJICAgICQoSU5TVEFMTF9EQVRBKSAkJGkgJCRiOyBcCi0JCQkJZmk7OyBcCi0JCQllc2FjOyBcCi0JCWRvbmU7IFwKLQlkb25lCi0KLQotCSQoQlVJTERQWVRIT04pICQoQ0FDSEVSU1JDKSAtdiAkKERFU1RESVIpJChNQUNMSUJERVNUKSAkKERFU1RESVIpJChNQUNUT09MU0RFU1QpCi0JJChCVUlMRFBZVEhPTikgLVdpIC10dCAkKGNvbXBpbGVhbGwpIC1kICQoTUFDVE9PTFNERVNUKSAteCBiYWRzeW50YXggJChERVNURElSKSQoTUFDVE9PTFNERVNUKQotCSQoQlVJTERQWVRIT04pIC1PIC1XaSAtdHQgJChjb21waWxlYWxsKSAtZCAkKE1BQ1RPT0xTREVTVCkgLXggYmFkc3ludGF4ICQoREVTVERJUikkKE1BQ1RPT0xTREVTVCkKLQotIwotIyBXZSB1c2UgdGhlIGZ1bGwgbmFtZSBoZXJlIGluIHN0ZWFkIG9mICQoSU5TVEFMTEVEX1BZVEhPTlcpLCBiZWNhdXNlCi0jIHRoZSBsYXR0ZXIgbWF5IGJlIG92ZXJyaWRkZW4gYnkgTWFrZWZpbGUuamFndWFyIHdoZW4gYnVpbGRpbmcgZm9yIGEgcHJlLWluc3RhbGxlZAotIyAvdXNyL2Jpbi9weXRob24KLSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvTWFjT1MvUHl0aG9uOiBpbnN0YWxsX1B5dGhvbgotCi0jICQoSU5TVEFMTEVEX1BZVEhPTikgaGFzIHRvIGJlIGRvbmUgYnkgdGhlIG1haW4gTWFrZWZpbGUsIHdlIGNhbm5vdCBkbyB0aGF0IGhlcmUuCi0jIEF0IGxlYXN0IHRoaXMgcnVsZSB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4KLQotaW5zdGFsbHVuaXh0b29sczoKLQkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKGJpbmRpcikKLQkkKElOU1RBTExfU1lNTElOSykgJChJTlNUQUxMRURfUFlUSE9OKSAkKERFU1RESVIpJChiaW5kaXIpL3B5dGhvbiQoVkVSU0lPTikKLQkkKElOU1RBTExfU1lNTElOSykgcHl0aG9uJChWRVJTSU9OKSAkKERFU1RESVIpJChiaW5kaXIpL3B5dGhvbgotCWVjaG8gIiMhL2Jpbi9zaCIgPiBweXRob253LnNoCi0JZWNobyAiZXhlYyBcIiQoSU5TVEFMTEVEX1BZVEhPTlcpXCIgXCJcJCRAXCIiID4+IHB5dGhvbncuc2gKLQkkKElOU1RBTEwpIHB5dGhvbncuc2ggJChERVNURElSKSQoYmluZGlyKS9weXRob253JChWRVJTSU9OKQotCSQoSU5TVEFMTF9TWU1MSU5LKSBweXRob253JChWRVJTSU9OKSAkKERFU1RESVIpJChiaW5kaXIpL3B5dGhvbncKLQotaW5zdGFsbGV4dHJhczoKLQkkKElOU1RBTEwpIC1kICQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpL0V4dHJhcwotCSQoSU5TVEFMTCkgJChzcmNkaXIpL01hYy9PU1gvRXh0cmFzLlJlYWRNZS50eHQgJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvRXh0cmFzL1JlYWRNZQotCSQoQlVJTERQWVRIT04pICQoc3JjZGlyKS9NYWMvT1NYL0V4dHJhcy5pbnN0YWxsLnB5ICQoc3JjZGlyKS9EZW1vIFwKLQkJJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvRXh0cmFzL0RlbW8KLQkkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvTWFjL09TWC9FeHRyYXMuaW5zdGFsbC5weSAkKHNyY2RpcikvVG9vbHMgXAotCQkkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9FeHRyYXMvVG9vbHMKLQotY2hlY2thcHBsZXB5dGhvbjoKLQlAaWYgISAkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvTWFjL09TWC9maXhhcHBsZXB5dGhvbjIzLnB5IC1uOyB0aGVuIFwKLQkJZWNobyAiKiBXQVJOSU5HOiBBcHBsZS1pbnN0YWxsZWQgUHl0aG9uIDIuMyB3aWxsIGhhdmUgdHJvdWJsZSBidWlsZGluZyBleHRlbnNpb25zIGZyb20gbm93IG9uLiI7IFwKLQkJZWNobyAiKiBXQVJOSU5HOiBSdW4gJChzcmNkaXIpL01hYy9PU1gvZml4YXBwbGVweXRob24yMy5weSB3aXRoIFwic3Vkb1wiIHRvIGZpeCB0aGlzLiI7IFwKLQlmaQotICAgIApkaWZmIC0tZ2l0IGEvTWFjL09TWC9NYWtlZmlsZS5pbiBiL01hYy9PU1gvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MTkxZAotLS0gL2Rldi9udWxsCisrKyBiL01hYy9PU1gvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNDEgQEAKKyMgVGhpcyBmaWxlIGNhbiBiZSBpbnZva2VkIGZyb20gdGhlIHZhcmlvdXMgZnJhbWV3b3JraW5zdGFsbC4uLiB0YXJnZXRzIGluIHRoZSAKKyMgbWFpbiBNYWtlZmlsZS4gVGhlIG5leHQgY291cGxlIG9mIHZhcmlhYmxlcyBhcmUgb3ZlcnJpZGRlbiBvbiB0aGUgCisjIGNvbW1hbmRsaW5lIGluIHRoYXQgY2FzZS4KKworVkVSU0lPTj1AVkVSU0lPTkAKK2J1aWxkZGlyID0gLi4vLi4KK3NyY2RpciA9IEBzcmNkaXJACitwcmVmaXg9L0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLyQoVkVSU0lPTikKK0xJQkRFU1Q9JChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pCitCVUlMRFBZVEhPTj0kKGJ1aWxkZGlyKS9weXRob24uZXhlCitERVNURElSPQorCisjIFRoZXNlIGFyZSBub3JtYWxseSBnbGltcHNlZCBmcm9tIHRoZSBwcmV2aW91cyBzZXQKK2JpbmRpcj1AZXhlY19wcmVmaXhAL2JpbgorUFlUSE9OQVBQU0RJUj0vQXBwbGljYXRpb25zL01hY1B5dGhvbiAkKFZFUlNJT04pCitBUFBJTlNUQUxMRElSPSQocHJlZml4KS9SZXNvdXJjZXMvUHl0aG9uLmFwcAorCisjIFZhcmlhYmxlcyBmb3IgaW5zdGFsbGluZyB0aGUgIm5vcm1hbCIgdW5peCBiaW5hcmllcworSU5TVEFMTEVEX1BZRE9DPSQocHJlZml4KS9iaW4vcHlkb2MKK0lOU1RBTExFRF9JRExFPSQocHJlZml4KS9iaW4vaWRsZQorSU5TVEFMTEVEX1BZVEhPTj0kKHByZWZpeCkvYmluL3B5dGhvbgorSU5TVEFMTEVEX1BZVEhPTlc9JChwcmVmaXgpL2Jpbi9weXRob253CitJTlNUQUxMRURfUFlUSE9OQVBQPSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvTWFjT1MvUHl0aG9uCisKKyMgSXRlbXMgbW9yZS1vci1sZXNzIGNvcGllZCBmcm9tIHRoZSBtYWluIE1ha2VmaWxlCitESVJNT0RFPTc1NQorRklMRU1PREU9NjQ0CitJTlNUQUxMPUBJTlNUQUxMQAorSU5TVEFMTF9TWU1MSU5LPWxuIC1mc24KK0lOU1RBTExfUFJPR1JBTT1ASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQ9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfREFUQT1ASU5TVEFMTF9EQVRBQAorTE49QExOQAorU1RSSVBGTEFHPS1zCitDUE1BQz0vRGV2ZWxvcGVyL1Rvb2xzL0NwTWFjCisKK0FQUFRFTVBMQVRFPSQoc3JjZGlyKS8uLi9PU1hSZXNvdXJjZXMvYXBwCitBUFBTVUJESVJTPU1hY09TIFJlc291cmNlcyBSZXNvdXJjZXMvRW5nbGlzaC5scHJvaiBcCisJUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbiBcCisJUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbi9kb2MgXAorCVJlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24vaWRlCitET0NESVI9JChzcmNkaXIpLy4uL09TWFJlc291cmNlcy9hcHAvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbgorRE9DSU5ERVg9JChET0NESVIpLyJEb2N1bWVudGF0aW9uIGlkeCIKK0NBQ0hFUlNSQz0kKHNyY2RpcikvLi4vc2NyaXB0cy9jYWNoZXJzcmMucHkKK2NvbXBpbGVhbGw9JChzcmNkaXIpLy4uLy4uL0xpYi9jb21waWxlYWxsLnB5CisKK2luc3RhbGxhcHBzOiBpbnN0YWxsX1B5dGhvbiBpbnN0YWxsX0J1aWxkQXBwbGV0IGluc3RhbGxfUHl0aG9uTGF1bmNoZXIgXAorCWluc3RhbGxfSURMRSBjaGVja2FwcGxlcHl0aG9uIGluc3RhbGxfcHl0aG9udyBpbnN0YWxsX3ZlcnNpb25lZHRvb2xzCisKK2luc3RhbGxfcHl0aG9udzogcHl0aG9udworCSQoSU5TVEFMTF9QUk9HUkFNKSAkKFNUUklQRkxBRykgcHl0aG9udyAiJChERVNURElSKSQocHJlZml4KS9iaW4vcHl0aG9udyQoVkVSU0lPTikiCisJJChJTlNUQUxMX1BST0dSQU0pICQoU1RSSVBGTEFHKSBweXRob253ICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9weXRob24kKFZFUlNJT04pIgorCWxuIC1zZiBweXRob24kKFZFUlNJT04pICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9weXRob24iCisJbG4gLXNmIHB5dGhvbnckKFZFUlNJT04pICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9weXRob253IgorCisjCisjIEluc3RhbGwgdW5peCB0b29scyBpbiAvdXNyL2xvY2FsL2Jpbi4gVGhlc2UgYXJlIGp1c3QgYWxpYXNlcyBmb3IgdGhlIAorIyBhY3R1YWwgaW5zdGFsbGF0aW9uIGluc2lkZSB0aGUgZnJhbWV3b3JrLgorIworaW5zdGFsbHVuaXh0b29sczoKKwlpZiBbICEgLWQgIiQoREVTVERJUikvdXNyL2xvY2FsL2JpbiIgXTsgdGhlbiAgXAorCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgIiQoREVTVERJUikvdXNyL2xvY2FsL2JpbiIgO1wKKwlmaQorCWZvciBmbiBpbiBgbHMgIiQoREVTVERJUikkKHByZWZpeCkvYmluLyJgIDsgXAorCWRvIFwKKwkJbG4gLWZzICIkKHByZWZpeCkvYmluLyQke2ZufSIgIiQoREVTVERJUikvdXNyL2xvY2FsL2Jpbi8kJHtmbn0iIDtcCisJZG9uZQorCisjIEJ5IGRlZmF1bHQgbW9zdCB0b29scyBhcmUgaW5zdGFsbGVkIHdpdGhvdXQgYSB2ZXJzaW9uIGluIHRoZWlyIGJhc2VuYW1lLCB0bworIyBtYWtlIGl0IGVhc2llciB0byBpbnN0YWxsIChhbmQgdXNlKSBzZXZlcmFsIHB5dGhvbiB2ZXJzaW9ucyBzaWRlLWJ5LXNpZGUgbW92ZQorIyB0aGUgdG9vbHMgdG8gYSB2ZXJzaW9uLXNwZWNpZmljIG5hbWUgYW5kIGFkZCB0aGUgbm9uLXZlcnNpb25lZCBuYW1lIGFzIGFuCisjIGFsaWFzLgoraW5zdGFsbF92ZXJzaW9uZWR0b29sczoKKwlmb3IgZm4gaW4gaWRsZSBweWRvYyBweXRob24tY29uZmlnIDtcCisJZG8gXAorCQlpZiBbIC1oICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi8kJHtmbn0iIF07IHRoZW4gXAorCQkJY29udGludWUgO1wKKwkJZmkgO1wKKwkJbXYgIiQoREVTVERJUikkKHByZWZpeCkvYmluLyQke2ZufSIgIiQoREVTVERJUikkKHByZWZpeCkvYmluLyQke2ZufSQoVkVSU0lPTikiICA7XAorCQlsbiAtc2YgIiQke2ZufSQoVkVSU0lPTikiICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi8kJHtmbn0iIDtcCisJZG9uZQorCWlmIFsgISAtaCAiJChERVNURElSKSQocHJlZml4KS9iaW4vc210cGQucHkiIF07IHRoZW4gXAorCQltdiAiJChERVNURElSKSQocHJlZml4KS9iaW4vc210cGQucHkiICIkKERFU1RESVIpJChwcmVmaXgpL2Jpbi9zbXRwZCQoVkVSU0lPTikucHkiICA7XAorCQlsbiAtc2YgInNtdHBkJChWRVJTSU9OKS5weSIgIiQoREVTVERJUikkKHByZWZpeCkvYmluL3NtdHBkLnB5IiA7XAorCWZpCisKKworcHl0aG9udzogJChzcmNkaXIpL1Rvb2xzL3B5dGhvbncuYworCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJChzcmNkaXIpL1Rvb2xzL3B5dGhvbncuYyBcCisJCS1EUFlUSE9OV0VYRUNVVEFCTEU9JyIkKEFQUElOU1RBTExESVIpL0NvbnRlbnRzL01hY09TL1B5dGhvbiInCisKKworaW5zdGFsbF9QeXRob25MYXVuY2hlcjoKKwljZCBQeXRob25MYXVuY2hlciAmJiBtYWtlIGluc3RhbGwgREVTVERJUj0kKERFU1RESVIpCisKK2luc3RhbGxfUHl0aG9uOgorCUBpZiB0ZXN0ICEgLWYgJChET0NJTkRFWCk7IHRoZW4gXAorCQllY2hvIFdBUk5JTkc6IHlvdSBzaG91bGQgcnVuIEFwcGxlIEhlbHAgSW5kZXhpbmcgVG9vbCBvbiAkKERPQ0RJUik7IFwKKwlmaQorCUBmb3IgaSBpbiAiJChQWVRIT05BUFBTRElSKSIgIiQoQVBQSU5TVEFMTERJUikiICIkKEFQUElOU1RBTExESVIpL0NvbnRlbnRzIjsgZG8gXAorCQlpZiB0ZXN0ICEgLWQgIiQoREVTVERJUikkJGkiOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkKERFU1RESVIpJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICIkKERFU1RESVIpJCRpIjsgXAorCQlmaTtcCisJZG9uZQorCUBmb3IgaSBpbiAkKEFQUFNVQkRJUlMpOyBkbyBcCisJCWlmIHRlc3QgISAtZCAiJChERVNURElSKSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvJCRpIjsgdGhlbiBcCisJCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJChERVNURElSKSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICIkKERFU1RESVIpJChBUFBJTlNUQUxMRElSKS9Db250ZW50cy8kJGkiOyBcCisJCWVsc2UJdHJ1ZTsgXAorCQlmaTsgXAorCWRvbmUKKwlAZm9yIGQgaW4gLiAkKEFQUFNVQkRJUlMpOyBcCisJZG8gXAorCQlhPSQoQVBQVEVNUExBVEUpLyQkZDsgXAorCQlpZiB0ZXN0ICEgLWQgJCRhOyB0aGVuIGNvbnRpbnVlOyBlbHNlIHRydWU7IGZpOyBcCisJCWI9IiQoREVTVERJUikkKEFQUElOU1RBTExESVIpL0NvbnRlbnRzLyQkZCI7IFwKKwkJZm9yIGkgaW4gJCRhLyo7IFwKKwkJZG8gXAorCQkJY2FzZSAkJGkgaW4gXAorCQkJKkNWUykgOzsgXAorCQkJKi5zdm4pIDs7IFwKKwkJCSoucHlbY29dKSA7OyBcCisJCQkqLm9yaWcpIDs7IFwKKwkJCSp+KSA7OyBcCisJCQkqaWR4KSBcCisJCQkJZWNobyAkKENQTUFDKSAiJCRpIiAkJGI7IFwKKwkJCQkkKENQTUFDKSAiJCRpIiAiJCRiIjsgXAorCQkJCTs7IFwKKwkJCSopIFwKKwkJCQlpZiB0ZXN0IC1kICQkaTsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJCQlpZiB0ZXN0IC14ICQkaTsgdGhlbiBcCisJCQkJICAgIGVjaG8gJChJTlNUQUxMX1NDUklQVCkgIiQkaSIgIiQkYiI7IFwKKwkJCQkgICAgJChJTlNUQUxMX1NDUklQVCkgIiQkaSIgIiQkYiI7IFwKKwkJCQllbHNlIFwKKwkJCQkgICAgZWNobyAkKElOU1RBTExfREFUQSkgIiQkaSIgIiQkYiI7IFwKKwkJCQkgICAgJChJTlNUQUxMX0RBVEEpICIkJGkiICIkJGIiOyBcCisJCQkJZmk7OyBcCisJCQllc2FjOyBcCisJCWRvbmU7IFwKKwlkb25lCisJJChJTlNUQUxMX1BST0dSQU0pICQoU1RSSVBGTEFHKSAkKEJVSUxEUFlUSE9OKSAiJChERVNURElSKSQoQVBQSU5TVEFMTERJUikvQ29udGVudHMvTWFjT1MvUHl0aG9uIgorCitpbnN0YWxsX0lETEU6CisJY2QgSURMRSAmJiBtYWtlIGluc3RhbGwKKworaW5zdGFsbF9CdWlsZEFwcGxldDoKKwkkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvLi4vc2NyaXB0cy9CdWlsZEFwcGxldC5weSBcCisJCS0tZGVzdHJvb3QgIiQoREVTVERJUikiIFwKKwkJLS1weXRob24gJChJTlNUQUxMRURfUFlUSE9OQVBQKSBcCisJCS0tb3V0cHV0ICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9CdWlsZCBBcHBsZXQuYXBwIiBcCisJCSQoc3JjZGlyKS8uLi9zY3JpcHRzL0J1aWxkQXBwbGV0LnB5CisKK01BQ0xJQkRFU1Q9JChMSUJERVNUKS9wbGF0LW1hYworTUFDVE9PTFNERVNUPSQocHJlZml4KS9NYWMvVG9vbHMKK01BQ1RPT0xTU1JDPSQoc3JjZGlyKS9NYWMvVG9vbHMKK01BQ1RPT0xTU1VCRElSUz1JREUKKworaW5zdGFsbG1hY3N1YnRyZWU6CisJQGZvciBpIGluICQoTUFDVE9PTFNERVNUKTsgXAorCWRvIFwKKwkJaWYgdGVzdCAhIC1kICQoREVTVERJUikkJGk7IHRoZW4gXAorCQkJZWNobyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICQoREVTVERJUikkJGkiOyBcCisJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkaTsgXAorCQllbHNlCXRydWU7IFwKKwkJZmk7IFwKKwlkb25lCisJQGZvciBkIGluICQoTUFDVE9PTFNTVUJESVJTKTsgXAorCWRvIFwKKwkJYT0kKE1BQ1RPT0xTU1JDKS8kJGQ7IFwKKwkJaWYgdGVzdCAhIC1kICQkYTsgdGhlbiBjb250aW51ZTsgZWxzZSB0cnVlOyBmaTsgXAorCQliPSQoREVTVERJUikkKE1BQ1RPT0xTREVTVCkvJCRkOyBcCisJCWlmIHRlc3QgISAtZCAkJGI7IHRoZW4gXAorCQkJZWNobyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICQkYiI7IFwKKwkJCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAkJGI7IFwKKwkJZWxzZQl0cnVlOyBcCisJCWZpOyBcCisJZG9uZQorCUBmb3IgZCBpbiAkKE1BQ1RPT0xTU1VCRElSUyk7IFwKKwlkbyBcCisJCWE9JChNQUNUT09MU1NSQykvJCRkOyBcCisJCWlmIHRlc3QgISAtZCAkJGE7IHRoZW4gY29udGludWU7IGVsc2UgdHJ1ZTsgZmk7IFwKKwkJYj0kKERFU1RESVIpJChNQUNUT09MU0RFU1QpLyQkZDsgXAorCQlmb3IgaSBpbiAkJGEvKjsgXAorCQlkbyBcCisJCQljYXNlICQkaSBpbiBcCisJCQkqQ1ZTKSA7OyBcCisJCQkqLnN2bikgOzsgXAorCQkJKi5weVtjb10pIDs7IFwKKwkJCSoub3JpZykgOzsgXAorCQkJKn4pIDs7IFwKKwkJCSoucnNyYykgXAorCQkJCWVjaG8gJChDUE1BQykgJCRpICQkYiA7IFwKKwkJCQkkKENQTUFDKSAkJGkgJCRiIDsgXAorCQkJCTs7IFwKKwkJCSopIFwKKwkJCQlpZiB0ZXN0IC1kICQkaTsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJCQlpZiB0ZXN0IC14ICQkaTsgdGhlbiBcCisJCQkJICAgIGVjaG8gJChJTlNUQUxMX1NDUklQVCkgJCRpICQkYjsgXAorCQkJCSAgICAkKElOU1RBTExfU0NSSVBUKSAkJGkgJCRiOyBcCisJCQkJZWxzZSBcCisJCQkJICAgIGVjaG8gJChJTlNUQUxMX0RBVEEpICQkaSAkJGI7IFwKKwkJCQkgICAgJChJTlNUQUxMX0RBVEEpICQkaSAkJGI7IFwKKwkJCQlmaTs7IFwKKwkJCWVzYWM7IFwKKwkJZG9uZTsgXAorCWRvbmUKKworCisJJChCVUlMRFBZVEhPTikgJChDQUNIRVJTUkMpIC12ICQoREVTVERJUikkKE1BQ0xJQkRFU1QpICQoREVTVERJUikkKE1BQ1RPT0xTREVTVCkKKwkkKEJVSUxEUFlUSE9OKSAtV2kgLXR0ICQoY29tcGlsZWFsbCkgLWQgJChNQUNUT09MU0RFU1QpIC14IGJhZHN5bnRheCAkKERFU1RESVIpJChNQUNUT09MU0RFU1QpCisJJChCVUlMRFBZVEhPTikgLU8gLVdpIC10dCAkKGNvbXBpbGVhbGwpIC1kICQoTUFDVE9PTFNERVNUKSAteCBiYWRzeW50YXggJChERVNURElSKSQoTUFDVE9PTFNERVNUKQorCisjCisjIFdlIHVzZSB0aGUgZnVsbCBuYW1lIGhlcmUgaW4gc3RlYWQgb2YgJChJTlNUQUxMRURfUFlUSE9OQVBQKSwgYmVjYXVzZQorIyB0aGUgbGF0dGVyIG1heSBiZSBvdmVycmlkZGVuIGJ5IE1ha2VmaWxlLmphZ3VhciB3aGVuIGJ1aWxkaW5nIGZvciBhIHByZS1pbnN0YWxsZWQKKyQoSU5TVEFMTEVEX1BZVEhPTkFQUCkvQ29udGVudHMvTWFjT1MvUHl0aG9uOiBpbnN0YWxsX1B5dGhvbgorCisjICQoSU5TVEFMTEVEX1BZVEhPTikgaGFzIHRvIGJlIGRvbmUgYnkgdGhlIG1haW4gTWFrZWZpbGUsIHdlIGNhbm5vdCBkbyB0aGF0IGhlcmUuCisjIEF0IGxlYXN0IHRoaXMgcnVsZSB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4KKworaW5zdGFsbGV4dHJhczoKKwkkKElOU1RBTEwpIC1kICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9FeHRyYXMiCisJJChJTlNUQUxMKSAkKHNyY2RpcikvTWFjL09TWC9FeHRyYXMuUmVhZE1lLnR4dCAiJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvRXh0cmFzL1JlYWRNZS50eHQiCisJJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL01hYy9PU1gvRXh0cmFzLmluc3RhbGwucHkgJChzcmNkaXIpL0RlbW8gXAorCQkiJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvRXh0cmFzL0RlbW8iCisKKworY2hlY2thcHBsZXB5dGhvbjoKKwlAaWYgISAkKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvZml4YXBwbGVweXRob24yMy5weSAtbjsgdGhlbiBcCisJCWVjaG8gIiogV0FSTklORzogQXBwbGUtaW5zdGFsbGVkIFB5dGhvbiAyLjMgd2lsbCBoYXZlIHRyb3VibGUgYnVpbGRpbmcgZXh0ZW5zaW9ucyBmcm9tIG5vdyBvbi4iOyBcCisJCWVjaG8gIiogV0FSTklORzogUnVuICQoc3JjZGlyKS9maXhhcHBsZXB5dGhvbjIzLnB5IHdpdGggXCJzdWRvXCIgdG8gZml4IHRoaXMuIjsgXAorCWZpCisKKworY2xlYW46CisJcm0gcHl0aG9udworCWNkIFB5dGhvbkxhdW5jaGVyICYmIG1ha2UgY2xlYW4KKwljZCBJRExFICYmIG1ha2UgY2xlYW4KKworCmRpZmYgLS1naXQgYS9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MgYi9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjYxODUuLjAwMDAwMDAKLS0tIGEvTWFjL09TWC9QeXRob25MYXVuY2hlci9FbmdsaXNoLmxwcm9qL0luZm9QbGlzdC5zdHJpbmdzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9QeXRob25MYXVuY2hlci9FbmdsaXNoLmxwcm9qL1ByZWZlcmVuY2VXaW5kb3cubmliL2NsYXNzZXMubmliIGIvTWFjL09TWC9QeXRob25MYXVuY2hlci9FbmdsaXNoLmxwcm9qL1ByZWZlcmVuY2VXaW5kb3cubmliL2NsYXNzZXMubmliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2FhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL0VuZ2xpc2gubHByb2ovUHJlZmVyZW5jZVdpbmRvdy5uaWIvY2xhc3Nlcy5uaWIKQEAgLTAsMCArMSwyNiBAQAoreworICAgIElCQ2xhc3NlcyA9ICgKKyAgICAgICAge0NMQVNTID0gRmlyc3RSZXNwb25kZXI7IExBTkdVQUdFID0gT2JqQzsgU1VQRVJDTEFTUyA9IE5TT2JqZWN0OyB9LCAKKyAgICAgICAgeworICAgICAgICAgICAgQUNUSU9OUyA9IHsiZG9fYXBwbHkiID0gaWQ7ICJkb19maWxldHlwZSIgPSBpZDsgImRvX3Jlc2V0IiA9IGlkOyB9OyAKKyAgICAgICAgICAgIENMQVNTID0gUHJlZmVyZW5jZXNXaW5kb3dDb250cm9sbGVyOyAKKyAgICAgICAgICAgIExBTkdVQUdFID0gT2JqQzsgCisgICAgICAgICAgICBPVVRMRVRTID0geworICAgICAgICAgICAgICAgIGNvbW1hbmRsaW5lID0gTlNUZXh0RmllbGQ7IAorICAgICAgICAgICAgICAgIGRlYnVnID0gTlNCdXR0b247IAorICAgICAgICAgICAgICAgIGZpbGV0eXBlID0gTlNQb3BVcEJ1dHRvbjsgCisgICAgICAgICAgICAgICAgaG9ub3VyaGFzaGJhbmcgPSBOU0J1dHRvbjsgCisgICAgICAgICAgICAgICAgaW5zcGVjdCA9IE5TQnV0dG9uOyAKKyAgICAgICAgICAgICAgICBpbnRlcnByZXRlciA9IE5TVGV4dEZpZWxkOyAKKyAgICAgICAgICAgICAgICBub3NpdGUgPSBOU0J1dHRvbjsgCisgICAgICAgICAgICAgICAgb3B0aW1pemUgPSBOU0J1dHRvbjsgCisgICAgICAgICAgICAgICAgb3RoZXJzID0gTlNUZXh0RmllbGQ7IAorICAgICAgICAgICAgICAgIHRhYnMgPSBOU0J1dHRvbjsgCisgICAgICAgICAgICAgICAgdmVyYm9zZSA9IE5TQnV0dG9uOyAKKyAgICAgICAgICAgICAgICAid2l0aF90ZXJtaW5hbCIgPSBOU0J1dHRvbjsgCisgICAgICAgICAgICB9OyAKKyAgICAgICAgICAgIFNVUEVSQ0xBU1MgPSBOU1dpbmRvd0NvbnRyb2xsZXI7IAorICAgICAgICB9CisgICAgKTsgCisgICAgSUJWZXJzaW9uID0gMTsgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTWFjL09TWC9QeXRob25MYXVuY2hlci9FbmdsaXNoLmxwcm9qL1ByZWZlcmVuY2VXaW5kb3cubmliL2luZm8ubmliIGIvTWFjL09TWC9QeXRob25MYXVuY2hlci9FbmdsaXNoLmxwcm9qL1ByZWZlcmVuY2VXaW5kb3cubmliL2luZm8ubmliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTU4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL0VuZ2xpc2gubHByb2ovUHJlZmVyZW5jZVdpbmRvdy5uaWIvaW5mby5uaWIKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PklCRG9jdW1lbnRMb2NhdGlvbjwva2V5PgorCTxzdHJpbmc+NTY1IDIzNSA1MTkgNTM0IDAgMCAxMjgwIDEwMDIgPC9zdHJpbmc+CisJPGtleT5JQkZyYW1ld29yayBWZXJzaW9uPC9rZXk+CisJPHN0cmluZz4zNjQuMDwvc3RyaW5nPgorCTxrZXk+SUJPcGVuT2JqZWN0czwva2V5PgorCTxhcnJheT4KKwkJPGludGVnZXI+NTwvaW50ZWdlcj4KKwk8L2FycmF5PgorCTxrZXk+SUJTeXN0ZW0gVmVyc2lvbjwva2V5PgorCTxzdHJpbmc+N0g2Mzwvc3RyaW5nPgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvRW5nbGlzaC5scHJvai9QcmVmZXJlbmNlV2luZG93Lm5pYi9vYmplY3RzLm5pYiBiL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvRW5nbGlzaC5scHJvai9QcmVmZXJlbmNlV2luZG93Lm5pYi9vYmplY3RzLm5pYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZlZDMzCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9QeXRob25MYXVuY2hlci9FbmdsaXNoLmxwcm9qL1ByZWZlcmVuY2VXaW5kb3cubmliL29iamVjdHMubmliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvSW5mby5wbGlzdCBiL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvSW5mby5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGQ3OTVmCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9QeXRob25MYXVuY2hlci9JbmZvLnBsaXN0CkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKzxwbGlzdCB2ZXJzaW9uPSIxLjAiPgorPGRpY3Q+CisJPGtleT5DRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uPC9rZXk+CisJPHN0cmluZz5FbmdsaXNoPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZURvY3VtZW50VHlwZXM8L2tleT4KKwk8YXJyYXk+CisJCTxkaWN0PgorCQkJPGtleT5DRkJ1bmRsZVR5cGVFeHRlbnNpb25zPC9rZXk+CisJCQk8YXJyYXk+CisJCQkJPHN0cmluZz5weTwvc3RyaW5nPgorCQkJCTxzdHJpbmc+cHl3PC9zdHJpbmc+CisJCQk8L2FycmF5PgorCQkJPGtleT5DRkJ1bmRsZVR5cGVJY29uRmlsZTwva2V5PgorCQkJPHN0cmluZz5QeXRob25Tb3VyY2UuaWNuczwvc3RyaW5nPgorCQkJPGtleT5DRkJ1bmRsZVR5cGVOYW1lPC9rZXk+CisJCQk8c3RyaW5nPlB5dGhvbiBTY3JpcHQ8L3N0cmluZz4KKwkJCTxrZXk+Q0ZCdW5kbGVUeXBlUm9sZTwva2V5PgorCQkJPHN0cmluZz5WaWV3ZXI8L3N0cmluZz4KKwkJCTxrZXk+TlNEb2N1bWVudENsYXNzPC9rZXk+CisJCQk8c3RyaW5nPk15RG9jdW1lbnQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCQk8ZGljdD4KKwkJCTxrZXk+Q0ZCdW5kbGVUeXBlRXh0ZW5zaW9uczwva2V5PgorCQkJPGFycmF5PgorCQkJCTxzdHJpbmc+cHljPC9zdHJpbmc+CisJCQkJPHN0cmluZz5weW88L3N0cmluZz4KKwkJCTwvYXJyYXk+CisJCQk8a2V5PkNGQnVuZGxlVHlwZUljb25GaWxlPC9rZXk+CisJCQk8c3RyaW5nPlB5dGhvbkNvbXBpbGVkLmljbnM8L3N0cmluZz4KKwkJCTxrZXk+Q0ZCdW5kbGVUeXBlTmFtZTwva2V5PgorCQkJPHN0cmluZz5QeXRob24gQnl0ZWNvZGUgRG9jdW1lbnQ8L3N0cmluZz4KKwkJCTxrZXk+Q0ZCdW5kbGVUeXBlUm9sZTwva2V5PgorCQkJPHN0cmluZz5WaWV3ZXI8L3N0cmluZz4KKwkJCTxrZXk+TlNEb2N1bWVudENsYXNzPC9rZXk+CisJCQk8c3RyaW5nPk15RG9jdW1lbnQ8L3N0cmluZz4KKwkJPC9kaWN0PgorCTwvYXJyYXk+CisJPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KKwk8c3RyaW5nPlB5dGhvbkxhdW5jaGVyPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KKwk8c3RyaW5nPjIuNSwgwqkgMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb248L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4KKwk8c3RyaW5nPlB5dGhvbkxhdW5jaGVyLmljbnM8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgorCTxzdHJpbmc+b3JnLnB5dGhvbi5QeXRob25MYXVuY2hlcjwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjYuMDwvc3RyaW5nPgorCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+CisJPHN0cmluZz5QeXRob24gTGF1bmNoZXI8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KKwk8c3RyaW5nPkFQUEw8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+CisJPHN0cmluZz4yLjU8L3N0cmluZz4KKwk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+CisJPHN0cmluZz5QeXRMPC9zdHJpbmc+CisJPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KKwk8c3RyaW5nPjIuNTwvc3RyaW5nPgorCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgorCTxzdHJpbmc+TWFpbk1lbnU8L3N0cmluZz4KKwk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KKwk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CmRpZmYgLS1naXQgYS9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL01ha2VmaWxlLmluIGIvTWFjL09TWC9QeXRob25MYXVuY2hlci9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmRhY2IzCi0tLSAvZGV2L251bGwKKysrIGIvTWFjL09TWC9QeXRob25MYXVuY2hlci9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDc4IEBACitDQz1AQ0NACitMRD1AQ0NACitCQVNFQ0ZMQUdTPUBCQVNFQ0ZMQUdTQAorT1BUPUBPUFRACitDRkxBR1M9JChCQVNFQ0ZMQUdTKSAkKE9QVCkKK0xERkxBR1M9QExERkxBR1NACitzcmNkaXI9ICAgICAgICAgQHNyY2RpckAKK1ZFUlNJT049CUBWRVJTSU9OQAorVU5JVkVSU0FMU0RLPUBVTklWRVJTQUxTREtACitidWlsZGRpcj0JLi4vLi4vLi4KKworUlVOU0hBUkVEPSAgICAgIEBSVU5TSEFSRURACitCVUlMREVYRT0gICAgICAgQEJVSUxERVhFRVhUQAorQlVJTERQWVRIT049ICAgIC4uLy4uLy4uL3B5dGhvbiQoQlVJTERFWEUpCisKKyMgRGVwbG95bWVudCB0YXJnZXQgc2VsZWN0ZWQgZHVyaW5nIGNvbmZpZ3VyZSwgdG8gYmUgY2hlY2tlZAorIyBieSBkaXN0dXRpbHMgIAorTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPUBDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUQAorQEVYUE9SVF9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVRAZXhwb3J0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAorCitCVU5ETEVCVUxERVI9JChzcmNkaXIpLy4uLy4uLy4uL0xpYi9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5CisKK1BZVEhPTkFQUFNESVI9L0FwcGxpY2F0aW9ucy9NYWNQeXRob24gJChWRVJTSU9OKQorT0JKRUNUUz1GaWxlU2V0dGluZ3MubyBNeUFwcERlbGVnYXRlLm8gTXlEb2N1bWVudC5vIFByZWZlcmVuY2VzV2luZG93Q29udHJvbGxlci5vIGRvc2NyaXB0Lm8gbWFpbi5vCisKK2FsbDogUHl0aG9uXCBMYXVuY2hlci5hcHAKKworaW5zdGFsbDogUHl0aG9uXCBMYXVuY2hlci5hcHAKKwl0ZXN0IC1kICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKSIgfHwgbWtkaXIgLXAgIiQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpIgorCS10ZXN0IC1kICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9QeXRob24gTGF1bmNoZXIuYXBwIiAmJiBybSAtciAiJChERVNURElSKSQoUFlUSE9OQVBQU0RJUikvUHl0aG9uIExhdW5jaGVyLmFwcCIKKwljcCAtciAiUHl0aG9uIExhdW5jaGVyLmFwcCIgIiQoREVTVERJUikkKFBZVEhPTkFQUFNESVIpIgorCXRvdWNoICIkKERFU1RESVIpJChQWVRIT05BUFBTRElSKS9QeXRob24gTGF1bmNoZXIuYXBwIgorCitjbGVhbjoKKwlybSAtZiAqLm8gIlB5dGhvbiBMYXVuY2hlciIKKwlybSAtcmYgIlB5dGhvbiBMYXVuY2hlci5hcHAiCisKK1B5dGhvblwgTGF1bmNoZXIuYXBwOiAgXAorCQlQeXRob25cIExhdW5jaGVyICQoc3JjZGlyKS8uLi9JY29ucy9QeXRob25MYXVuY2hlci5pY25zIFwKKwkJJChzcmNkaXIpLy4uL0ljb25zL1B5dGhvblNvdXJjZS5pY25zIFwKKwkJJChzcmNkaXIpLy4uL0ljb25zL1B5dGhvbkNvbXBpbGVkLmljbnMgXAorCQkkKHNyY2RpcikvZmFjdG9yeVNldHRpbmdzLnBsaXN0CisJcm0gLWZyICJQeXRob24gTGF1bmNoZXIuYXBwIgorCSQoUlVOU0hBUkVEKSAkKEJVSUxEUFlUSE9OKSAkKEJVTkRMRUJVTERFUikgXAorCQktLWJ1aWxkZGlyPS4gXAorCQktLW5hbWU9IlB5dGhvbiBMYXVuY2hlciIgXAorCQktLWV4ZWN1dGFibGU9IlB5dGhvbiBMYXVuY2hlciIgXAorCQktLWljb25maWxlPSQoc3JjZGlyKS8uLi9JY29ucy9QeXRob25MYXVuY2hlci5pY25zIFwKKwkJLS1idW5kbGUtaWQ9b3JnLnB5dGhvbi5QeXRob25MYXVuY2hlciBcCisJCS0tcmVzb3VyY2U9JChzcmNkaXIpLy4uL0ljb25zL1B5dGhvblNvdXJjZS5pY25zIFwKKwkJLS1yZXNvdXJjZT0kKHNyY2RpcikvLi4vSWNvbnMvUHl0aG9uQ29tcGlsZWQuaWNucyBcCisJCS0tcmVzb3VyY2U9JChzcmNkaXIpL0VuZ2xpc2gubHByb2ogXAorCQktLXJlc291cmNlPSQoc3JjZGlyKS9mYWN0b3J5U2V0dGluZ3MucGxpc3QgXAorCQktLXBsaXN0PSQoc3JjZGlyKS9JbmZvLnBsaXN0IFwKKwkJYnVpbGQKKwlmaW5kICJQeXRob24gTGF1bmNoZXIuYXBwIiAtbmFtZSAnLnN2bicgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yCisJCQorCitGaWxlU2V0dGluZ3MubzogJChzcmNkaXIpL0ZpbGVTZXR0aW5ncy5tCisJJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9GaWxlU2V0dGluZ3MubQorCitNeUFwcERlbGVnYXRlLm86ICQoc3JjZGlyKS9NeUFwcERlbGVnYXRlLm0KKwkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL015QXBwRGVsZWdhdGUubQorCitNeURvY3VtZW50Lm86ICQoc3JjZGlyKS9NeURvY3VtZW50Lm0KKwkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL015RG9jdW1lbnQubQorCitQcmVmZXJlbmNlc1dpbmRvd0NvbnRyb2xsZXIubzogJChzcmNkaXIpL1ByZWZlcmVuY2VzV2luZG93Q29udHJvbGxlci5tCisJJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9QcmVmZXJlbmNlc1dpbmRvd0NvbnRyb2xsZXIubQorCitkb3NjcmlwdC5vOiAkKHNyY2RpcikvZG9zY3JpcHQubQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvZG9zY3JpcHQubQorCittYWluLm86ICQoc3JjZGlyKS9tYWluLm0KKwkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21haW4ubQorCitQeXRob25cIExhdW5jaGVyOiAkKE9CSkVDVFMpCisJJChDQykgJChMREZMQUdTKSAtbyAiUHl0aG9uIExhdW5jaGVyIiAkKE9CSkVDVFMpIC1mcmFtZXdvcmsgQXBwS2l0IC1mcmFtZXdvcmsgQ2FyYm9uCmRpZmYgLS1naXQgYS9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL1B5dGhvbkNvbXBpbGVkLmljbnMgYi9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL1B5dGhvbkNvbXBpbGVkLmljbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWFkM2UuLjAwMDAwMDAKLS0tIGEvTWFjL09TWC9QeXRob25MYXVuY2hlci9QeXRob25Db21waWxlZC5pY25zCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9QeXRob25MYXVuY2hlci9QeXRob25JbnRlcnByZXRlci5pY25zIGIvTWFjL09TWC9QeXRob25MYXVuY2hlci9QeXRob25JbnRlcnByZXRlci5pY25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRkMTJmLi4wMDAwMDAwCi0tLSBhL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uSW50ZXJwcmV0ZXIuaWNucworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uTGF1bmNoZXIucGJwcm9qL3Byb2plY3QucGJ4cHJvaiBiL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uTGF1bmNoZXIucGJwcm9qL3Byb2plY3QucGJ4cHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZlNDVkYy4uMDAwMDAwMAotLS0gYS9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL1B5dGhvbkxhdW5jaGVyLnBicHJvai9wcm9qZWN0LnBieHByb2oKKysrIC9kZXYvbnVsbApAQCAtMSw2ODEgKzAsMCBAQAotLy8gISQqVVRGOCokIQotewotCWFyY2hpdmVWZXJzaW9uID0gMTsKLQljbGFzc2VzID0gewotCX07Ci0Jb2JqZWN0VmVyc2lvbiA9IDM4OwotCW9iamVjdHMgPSB7Ci0JCTA4MEU5NkQ5RkUyMDFDREI3RjAwMDAwMSA9IHsKLQkJCWZpbGVSZWYgPSAyQTM3RjRCOUZEQ0ZBNzMwMTFDQTJDRUE7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0JCTA4MEU5NkRBRkUyMDFDREI3RjAwMDAwMSA9IHsKLQkJCWZpbGVSZWYgPSAyQTM3RjRCNkZEQ0ZBNzMwMTFDQTJDRUE7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0JCTA4MEU5NkRCRkUyMDFDREI3RjAwMDAwMSA9IHsKLQkJCWZpbGVSZWYgPSAyQTM3RjRCNEZEQ0ZBNzMwMTFDQTJDRUE7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0JCTA4OUMxNjVGRkU4NDBFQUNDMDJBQUMwNyA9IHsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTA4OUMxNjYwRkU4NDBFQUNDMDJBQUMwNywKLQkJCSk7Ci0JCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7Ci0JCQluYW1lID0gSW5mb1BsaXN0LnN0cmluZ3M7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJMDg5QzE2NjBGRTg0MEVBQ0MwMkFBQzA3ID0gewotCQkJZmlsZUVuY29kaW5nID0gMTA7Ci0JCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOwotCQkJbmFtZSA9IEVuZ2xpc2g7Ci0JCQlwYXRoID0gRW5nbGlzaC5scHJvai9JbmZvUGxpc3Quc3RyaW5nczsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQkwODlDMTY2MUZFODQwRUFDQzAyQUFDMDcgPSB7Ci0JCQlmaWxlUmVmID0gMDg5QzE2NUZGRTg0MEVBQ0MwMkFBQzA3OwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotLy8wODAKLS8vMDgxCi0vLzA4MgotLy8wODMKLS8vMDg0Ci0vLzEwMAotLy8xMDEKLS8vMTAyCi0vLzEwMwotLy8xMDQKLQkJMTA1OEM3QTZGRUE1NEY1MzExQ0EyQ0JCID0gewotCQkJY2hpbGRyZW4gPSAoCi0JCQkJMTA1OEM3QTdGRUE1NEY1MzExQ0EyQ0JCLAotCQkJCUY1QUE5RDAxMDJGODA3RUUwMTEwQzQ0NywKLQkJCSk7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCW5hbWUgPSAiTGlua2VkIEZyYW1ld29ya3MiOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCTEwNThDN0E3RkVBNTRGNTMxMUNBMkNCQiA9IHsKLQkJCWlzYSA9IFBCWEZyYW1ld29ya1JlZmVyZW5jZTsKLQkJCW5hbWUgPSBDb2NvYS5mcmFtZXdvcms7Ci0JCQlwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29jb2EuZnJhbWV3b3JrOwotCQkJcmVmVHlwZSA9IDA7Ci0JCX07Ci0JCTEwNThDN0E4RkVBNTRGNTMxMUNBMkNCQiA9IHsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTJBMzdGNEM1RkRDRkE3MzAxMUNBMkNFQSwKLQkJCQkyQTM3RjRDNEZEQ0ZBNzMwMTFDQTJDRUEsCi0JCQkpOwotCQkJaXNhID0gUEJYR3JvdXA7Ci0JCQluYW1lID0gIk90aGVyIEZyYW1ld29ya3MiOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCTEwNThDN0E5RkVBNTRGNTMxMUNBMkNCQiA9IHsKLQkJCWZpbGVSZWYgPSAxMDU4QzdBN0ZFQTU0RjUzMTFDQTJDQkI7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0vLzEwMAotLy8xMDEKLS8vMTAyCi0vLzEwMwotLy8xMDQKLS8vMTcwCi0vLzE3MQotLy8xNzIKLS8vMTczCi0vLzE3NAotCQkxNzU4NzMyQUZGMzc5REExMTFDQTJDQkIgPSB7Ci0JCQlpc2EgPSBQQlhBcHBsaWNhdGlvblJlZmVyZW5jZTsKLQkJCXBhdGggPSBQeXRob25MYXVuY2hlci5hcHA7Ci0JCQlyZWZUeXBlID0gMzsKLQkJfTsKLS8vMTcwCi0vLzE3MQotLy8xNzIKLS8vMTczCi0vLzE3NAotLy8xOTAKLS8vMTkxCi0vLzE5MgotLy8xOTMKLS8vMTk0Ci0JCTE5QzI4RkIwRkU5RDUyNEYxMUNBMkNCQiA9IHsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTE3NTg3MzJBRkYzNzlEQTExMUNBMkNCQiwKLQkJCSk7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCW5hbWUgPSBQcm9kdWN0czsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotLy8xOTAKLS8vMTkxCi0vLzE5MgotLy8xOTMKLS8vMTk0Ci0vLzJBMAotLy8yQTEKLS8vMkEyCi0vLzJBMwotLy8yQTQKLQkJMkEzN0Y0QTlGRENGQTczMDExQ0EyQ0VBID0gewotCQkJYnVpbGRTdHlsZXMgPSAoCi0JCQkJNEE5NTA0RDBGRkU2QTRDQjExQ0EwQ0JBLAotCQkJCTRBOTUwNEQxRkZFNkE0Q0IxMUNBMENCQSwKLQkJCSk7Ci0JCQlpc2EgPSBQQlhQcm9qZWN0OwotCQkJbWFpbkdyb3VwID0gMkEzN0Y0QUFGRENGQTczMDExQ0EyQ0VBOwotCQkJcHJvamVjdERpclBhdGggPSAiIjsKLQkJCXRhcmdldHMgPSAoCi0JCQkJMkEzN0Y0QzZGRENGQTczMDExQ0EyQ0VBLAotCQkJKTsKLQkJfTsKLQkJMkEzN0Y0QUFGRENGQTczMDExQ0EyQ0VBID0gewotCQkJY2hpbGRyZW4gPSAoCi0JCQkJMkEzN0Y0QUJGRENGQTczMDExQ0EyQ0VBLAotCQkJCTJBMzdGNEFGRkRDRkE3MzAxMUNBMkNFQSwKLQkJCQkyQTM3RjRCOEZEQ0ZBNzMwMTFDQTJDRUEsCi0JCQkJMkEzN0Y0QzNGRENGQTczMDExQ0EyQ0VBLAotCQkJCTE5QzI4RkIwRkU5RDUyNEYxMUNBMkNCQiwKLQkJCSk7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCW5hbWUgPSBQeXRob25MYXVuY2hlcjsKLQkJCXBhdGggPSAiIjsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQkyQTM3RjRBQkZEQ0ZBNzMwMTFDQTJDRUEgPSB7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQkyQTM3RjRBRUZEQ0ZBNzMwMTFDQTJDRUEsCi0JCQkJMkEzN0Y0QUNGRENGQTczMDExQ0EyQ0VBLAotCQkJCUY1MkE5MENEMDJFQjVDNkEwMTAwMDEwMiwKLQkJCQlGNTJBOTBDRTAyRUI1QzZBMDEwMDAxMDIsCi0JCQkJRjVBNEMxNDAwMkYyMDU1QzAxMDAwMTAyLAotCQkJCUY1QTRDMTQxMDJGMjA1NUMwMTAwMDEwMiwKLQkJCQlGNUE0QzE0NDAyRjIwNzBEMDEwMDAxMDIsCi0JCQkJRjVBNEMxNDUwMkYyMDcwRDAxMDAwMTAyLAotCQkJKTsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJbmFtZSA9IENsYXNzZXM7Ci0JCQlwYXRoID0gIiI7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJMkEzN0Y0QUNGRENGQTczMDExQ0EyQ0VBID0gewotCQkJZmlsZUVuY29kaW5nID0gMzA7Ci0JCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOwotCQkJcGF0aCA9IE15RG9jdW1lbnQubTsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQkyQTM3RjRBRUZEQ0ZBNzMwMTFDQTJDRUEgPSB7Ci0JCQlmaWxlRW5jb2RpbmcgPSAzMDsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gTXlEb2N1bWVudC5oOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCTJBMzdGNEFGRkRDRkE3MzAxMUNBMkNFQSA9IHsKLQkJCWNoaWxkcmVuID0gKAotCQkJCUY1QUE5QzZBMDJGODA0MkQwMTEwQzQ0NywKLQkJCQkyQTM3RjRCMEZEQ0ZBNzMwMTFDQTJDRUEsCi0JCQkJRjVBQUEyMUQwMkY4MTE1RDAxMTBDNDQ3LAotCQkJKTsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJbmFtZSA9ICJPdGhlciBTb3VyY2VzIjsKLQkJCXBhdGggPSAiIjsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQkyQTM3RjRCMEZEQ0ZBNzMwMTFDQTJDRUEgPSB7Ci0JCQlmaWxlRW5jb2RpbmcgPSAzMDsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gbWFpbi5tOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCTJBMzdGNEI0RkRDRkE3MzAxMUNBMkNFQSA9IHsKLQkJCWNoaWxkcmVuID0gKAotCQkJCTJBMzdGNEI1RkRDRkE3MzAxMUNBMkNFQSwKLQkJCSk7Ci0JCQlpc2EgPSBQQlhWYXJpYW50R3JvdXA7Ci0JCQluYW1lID0gTXlEb2N1bWVudC5uaWI7Ci0JCQlwYXRoID0gIiI7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJMkEzN0Y0QjVGRENGQTczMDExQ0EyQ0VBID0gewotCQkJaXNhID0gUEJYRmlsZVJlZmVyZW5jZTsKLQkJCW5hbWUgPSBFbmdsaXNoOwotCQkJcGF0aCA9IEVuZ2xpc2gubHByb2ovTXlEb2N1bWVudC5uaWI7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJMkEzN0Y0QjZGRENGQTczMDExQ0EyQ0VBID0gewotCQkJY2hpbGRyZW4gPSAoCi0JCQkJMkEzN0Y0QjdGRENGQTczMDExQ0EyQ0VBLAotCQkJKTsKLQkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKLQkJCW5hbWUgPSBNYWluTWVudS5uaWI7Ci0JCQlwYXRoID0gIiI7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJMkEzN0Y0QjdGRENGQTczMDExQ0EyQ0VBID0gewotCQkJaXNhID0gUEJYRmlsZVJlZmVyZW5jZTsKLQkJCW5hbWUgPSBFbmdsaXNoOwotCQkJcGF0aCA9IEVuZ2xpc2gubHByb2ovTWFpbk1lbnUubmliOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCTJBMzdGNEI4RkRDRkE3MzAxMUNBMkNFQSA9IHsKLQkJCWNoaWxkcmVuID0gKAotCQkJCUY1OEQ0QTNBMDJGMUY5NEIwMTAwMDEwMiwKLQkJCQlGNThENEEzQjAyRjFGOTRCMDEwMDAxMDIsCi0JCQkJRjU4RDRBM0MwMkYxRjk0QjAxMDAwMTAyLAotCQkJCUY1NDQ5QjRCMDJGQjNGN0UwMTAwMDEwMiwKLQkJCQkyQTM3RjRCOUZEQ0ZBNzMwMTFDQTJDRUEsCi0JCQkJMkEzN0Y0QjZGRENGQTczMDExQ0EyQ0VBLAotCQkJCTJBMzdGNEI0RkRDRkE3MzAxMUNBMkNFQSwKLQkJCQlGNUE0QzEzRTAyRjIwM0Y2MDEwMDAxMDIsCi0JCQkJMDg5QzE2NUZGRTg0MEVBQ0MwMkFBQzA3LAotCQkJCUY1QTQyMTY3MDM4QkREOEUwMTEwQzQ0NywKLQkJCSk7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCW5hbWUgPSBSZXNvdXJjZXM7Ci0JCQlwYXRoID0gIiI7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJMkEzN0Y0QjlGRENGQTczMDExQ0EyQ0VBID0gewotCQkJY2hpbGRyZW4gPSAoCi0JCQkJMkEzN0Y0QkFGRENGQTczMDExQ0EyQ0VBLAotCQkJKTsKLQkJCWlzYSA9IFBCWFZhcmlhbnRHcm91cDsKLQkJCW5hbWUgPSBDcmVkaXRzLnJ0ZjsKLQkJCXBhdGggPSAiIjsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQkyQTM3RjRCQUZEQ0ZBNzMwMTFDQTJDRUEgPSB7Ci0JCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOwotCQkJbmFtZSA9IEVuZ2xpc2g7Ci0JCQlwYXRoID0gRW5nbGlzaC5scHJvai9DcmVkaXRzLnJ0ZjsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQkyQTM3RjRDM0ZEQ0ZBNzMwMTFDQTJDRUEgPSB7Ci0JCQljaGlsZHJlbiA9ICgKLQkJCQkxMDU4QzdBNkZFQTU0RjUzMTFDQTJDQkIsCi0JCQkJMTA1OEM3QThGRUE1NEY1MzExQ0EyQ0JCLAotCQkJKTsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJbmFtZSA9IEZyYW1ld29ya3M7Ci0JCQlwYXRoID0gIiI7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJMkEzN0Y0QzRGRENGQTczMDExQ0EyQ0VBID0gewotCQkJaXNhID0gUEJYRnJhbWV3b3JrUmVmZXJlbmNlOwotCQkJbmFtZSA9IEFwcEtpdC5mcmFtZXdvcms7Ci0JCQlwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQXBwS2l0LmZyYW1ld29yazsKLQkJCXJlZlR5cGUgPSAwOwotCQl9OwotCQkyQTM3RjRDNUZEQ0ZBNzMwMTFDQTJDRUEgPSB7Ci0JCQlpc2EgPSBQQlhGcmFtZXdvcmtSZWZlcmVuY2U7Ci0JCQluYW1lID0gRm91bmRhdGlvbi5mcmFtZXdvcms7Ci0JCQlwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvRm91bmRhdGlvbi5mcmFtZXdvcms7Ci0JCQlyZWZUeXBlID0gMDsKLQkJfTsKLQkJMkEzN0Y0QzZGRENGQTczMDExQ0EyQ0VBID0gewotCQkJYnVpbGRQaGFzZXMgPSAoCi0JCQkJMkEzN0Y0QzdGRENGQTczMDExQ0EyQ0VBLAotCQkJCTJBMzdGNEM5RkRDRkE3MzAxMUNBMkNFQSwKLQkJCQkyQTM3RjRDRUZEQ0ZBNzMwMTFDQTJDRUEsCi0JCQkJMkEzN0Y0RDFGRENGQTczMDExQ0EyQ0VBLAotCQkJKTsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJRlJBTUVXT1JLX1NFQVJDSF9QQVRIUyA9ICIiOwotCQkJCUhFQURFUl9TRUFSQ0hfUEFUSFMgPSAiIjsKLQkJCQlJTlNUQUxMX01PREVfRkxBRyA9ICJhK3JYIjsKLQkJCQlJTlNUQUxMX1BBVEggPSAvQXBwbGljYXRpb25zL1B5dGhvbjsKLQkJCQlMSUJSQVJZX1NFQVJDSF9QQVRIUyA9ICIiOwotCQkJCU9QVElNSVpBVElPTl9DRkxBR1MgPSAiLU8wIjsKLQkJCQlPVEhFUl9MREZMQUdTID0gIiI7Ci0JCQkJUFJPRFVDVF9OQU1FID0gUHl0aG9uTGF1bmNoZXI7Ci0JCQkJU0VDVE9SREVSX0ZMQUdTID0gIiI7Ci0JCQkJV0FSTklOR19DRkxBR1MgPSAiLVdtb3N0IC1Xbm8tZm91ci1jaGFyLWNvbnN0YW50cyAtV25vLXVua25vd24tcHJhZ21hcyI7Ci0JCQkJV1JBUFBFUl9FWFRFTlNJT04gPSBhcHA7Ci0JCQl9OwotCQkJZGVwZW5kZW5jaWVzID0gKAotCQkJKTsKLQkJCWlzYSA9IFBCWEFwcGxpY2F0aW9uVGFyZ2V0OwotCQkJbmFtZSA9IFB5dGhvbkxhdW5jaGVyOwotCQkJcHJvZHVjdEluc3RhbGxQYXRoID0gL0FwcGxpY2F0aW9ucy9QeXRob247Ci0JCQlwcm9kdWN0TmFtZSA9IFB5dGhvbkxhdW5jaGVyOwotCQkJcHJvZHVjdFJlZmVyZW5jZSA9IDE3NTg3MzJBRkYzNzlEQTExMUNBMkNCQjsKLQkJCXByb2R1Y3RTZXR0aW5nc1hNTCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4KLTwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgXCItLy9BcHBsZSBDb21wdXRlci8vRFREIFBMSVNUIDEuMC8vRU5cIiBcImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGRcIj4KLTxwbGlzdCB2ZXJzaW9uPVwiMS4wXCI+Ci08ZGljdD4KLQk8a2V5PkNGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb248L2tleT4KLQk8c3RyaW5nPkVuZ2xpc2g8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlRG9jdW1lbnRUeXBlczwva2V5PgotCTxhcnJheT4KLQkJPGRpY3Q+Ci0JCQk8a2V5PkNGQnVuZGxlVHlwZUV4dGVuc2lvbnM8L2tleT4KLQkJCTxhcnJheT4KLQkJCQk8c3RyaW5nPnB5PC9zdHJpbmc+Ci0JCQk8L2FycmF5PgotCQkJPGtleT5DRkJ1bmRsZVR5cGVJY29uRmlsZTwva2V5PgotCQkJPHN0cmluZz5QeXRob25Tb3VyY2UuaWNuczwvc3RyaW5nPgotCQkJPGtleT5DRkJ1bmRsZVR5cGVOYW1lPC9rZXk+Ci0JCQk8c3RyaW5nPlB5dGhvbiBTY3JpcHQ8L3N0cmluZz4KLQkJCTxrZXk+Q0ZCdW5kbGVUeXBlUm9sZTwva2V5PgotCQkJPHN0cmluZz5WaWV3ZXI8L3N0cmluZz4KLQkJCTxrZXk+TlNEb2N1bWVudENsYXNzPC9rZXk+Ci0JCQk8c3RyaW5nPk15RG9jdW1lbnQ8L3N0cmluZz4KLQkJPC9kaWN0PgotCQk8ZGljdD4KLQkJCTxrZXk+Q0ZCdW5kbGVUeXBlRXh0ZW5zaW9uczwva2V5PgotCQkJPGFycmF5PgotCQkJCTxzdHJpbmc+cHl3PC9zdHJpbmc+Ci0JCQk8L2FycmF5PgotCQkJPGtleT5DRkJ1bmRsZVR5cGVJY29uRmlsZTwva2V5PgotCQkJPHN0cmluZz5QeXRob25XU291cmNlLmljbnM8L3N0cmluZz4KLQkJCTxrZXk+Q0ZCdW5kbGVUeXBlTmFtZTwva2V5PgotCQkJPHN0cmluZz5QeXRob24gR1VJIFNjcmlwdDwvc3RyaW5nPgotCQkJPGtleT5DRkJ1bmRsZVR5cGVSb2xlPC9rZXk+Ci0JCQk8c3RyaW5nPlZpZXdlcjwvc3RyaW5nPgotCQkJPGtleT5OU0RvY3VtZW50Q2xhc3M8L2tleT4KLQkJCTxzdHJpbmc+TXlEb2N1bWVudDwvc3RyaW5nPgotCQk8L2RpY3Q+Ci0JCTxkaWN0PgotCQkJPGtleT5DRkJ1bmRsZVR5cGVFeHRlbnNpb25zPC9rZXk+Ci0JCQk8YXJyYXk+Ci0JCQkJPHN0cmluZz5weWM8L3N0cmluZz4KLQkJCTwvYXJyYXk+Ci0JCQk8a2V5PkNGQnVuZGxlVHlwZUljb25GaWxlPC9rZXk+Ci0JCQk8c3RyaW5nPlB5dGhvbkNvbXBpbGVkLmljbnM8L3N0cmluZz4KLQkJCTxrZXk+Q0ZCdW5kbGVUeXBlTmFtZTwva2V5PgotCQkJPHN0cmluZz5QeXRob24gQnl0ZWNvZGUgRG9jdW1lbnQ8L3N0cmluZz4KLQkJCTxrZXk+Q0ZCdW5kbGVUeXBlUm9sZTwva2V5PgotCQkJPHN0cmluZz5WaWV3ZXI8L3N0cmluZz4KLQkJCTxrZXk+TlNEb2N1bWVudENsYXNzPC9rZXk+Ci0JCQk8c3RyaW5nPk15RG9jdW1lbnQ8L3N0cmluZz4KLQkJPC9kaWN0PgotCTwvYXJyYXk+Ci0JPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KLQk8c3RyaW5nPlB5dGhvbkxhdW5jaGVyPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUdldEluZm9TdHJpbmc8L2tleT4KLQk8c3RyaW5nPjIuMywgwqkgMjAwMS0yMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUljb25GaWxlPC9rZXk+Ci0JPHN0cmluZz5QeXRob25JbnRlcnByZXRlci5pY25zPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZUlkZW50aWZpZXI8L2tleT4KLQk8c3RyaW5nPm9yZy5weXRob24uUHl0aG9uTGF1bmNoZXI8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uPC9rZXk+Ci0JPHN0cmluZz42LjA8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlTmFtZTwva2V5PgotCTxzdHJpbmc+UHl0aG9uTGF1bmNoZXI8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KLQk8c3RyaW5nPkFQUEw8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+Ci0JPHN0cmluZz4yLjM8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+Ci0JPHN0cmluZz5QeXRMPC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KLQk8c3RyaW5nPjIuMzwvc3RyaW5nPgotCTxrZXk+TlNNYWluTmliRmlsZTwva2V5PgotCTxzdHJpbmc+TWFpbk1lbnU8L3N0cmluZz4KLQk8a2V5Pk5TUHJpbmNpcGFsQ2xhc3M8L2tleT4KLQk8c3RyaW5nPk5TQXBwbGljYXRpb248L3N0cmluZz4KLTwvZGljdD4KLTwvcGxpc3Q+Ci0iOwotCQkJc2hvdWxkVXNlSGVhZGVybWFwID0gMDsKLQkJfTsKLQkJMkEzN0Y0QzdGRENGQTczMDExQ0EyQ0VBID0gewotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTJBMzdGNEM4RkRDRkE3MzAxMUNBMkNFQSwKLQkJCQlGNTJBOTBEMDAyRUI1QzZBMDEwMDAxMDIsCi0JCQkJRjVBNEMxNDIwMkYyMDU1RDAxMDAwMTAyLAotCQkJCUY1QTRDMTQ3MDJGMjA3MEQwMTAwMDEwMiwKLQkJCQlGNUFBOUM2QzAyRjgwNDJEMDExMEM0NDcsCi0JCQkpOwotCQkJaXNhID0gUEJYSGVhZGVyc0J1aWxkUGhhc2U7Ci0JCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKLQkJfTsKLQkJMkEzN0Y0QzhGRENGQTczMDExQ0EyQ0VBID0gewotCQkJZmlsZVJlZiA9IDJBMzdGNEFFRkRDRkE3MzAxMUNBMkNFQTsKLQkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKLQkJCXNldHRpbmdzID0gewotCQkJfTsKLQkJfTsKLQkJMkEzN0Y0QzlGRENGQTczMDExQ0EyQ0VBID0gewotCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKLQkJCWZpbGVzID0gKAotCQkJCTA4MEU5NkQ5RkUyMDFDREI3RjAwMDAwMSwKLQkJCQkwODBFOTZEQUZFMjAxQ0RCN0YwMDAwMDEsCi0JCQkJMDgwRTk2REJGRTIwMUNEQjdGMDAwMDAxLAotCQkJCTA4OUMxNjYxRkU4NDBFQUNDMDJBQUMwNywKLQkJCQlGNThENEEzRDAyRjFGOTRCMDEwMDAxMDIsCi0JCQkJRjU4RDRBM0UwMkYxRjk0QjAxMDAwMTAyLAotCQkJCUY1OEQ0QTNGMDJGMUY5NEIwMTAwMDEwMiwKLQkJCQlGNUE0QzEzRjAyRjIwM0Y3MDEwMDAxMDIsCi0JCQkJRjU0NDlCNEMwMkZCM0Y3RTAxMDAwMTAyLAotCQkJCUY1QTQyMTY4MDM4QkREOEUwMTEwQzQ0NywKLQkJCSk7Ci0JCQlpc2EgPSBQQlhSZXNvdXJjZXNCdWlsZFBoYXNlOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0JCTJBMzdGNENFRkRDRkE3MzAxMUNBMkNFQSA9IHsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQkyQTM3RjRDRkZEQ0ZBNzMwMTFDQTJDRUEsCi0JCQkJMkEzN0Y0RDBGRENGQTczMDExQ0EyQ0VBLAotCQkJCUY1MkE5MENGMDJFQjVDNkEwMTAwMDEwMiwKLQkJCQlGNUE0QzE0MzAyRjIwNTVEMDEwMDAxMDIsCi0JCQkJRjVBNEMxNDYwMkYyMDcwRDAxMDAwMTAyLAotCQkJCUY1QUFBMjFFMDJGODExNUQwMTEwQzQ0NywKLQkJCSk7Ci0JCQlpc2EgPSBQQlhTb3VyY2VzQnVpbGRQaGFzZTsKLQkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwotCQl9OwotCQkyQTM3RjRDRkZEQ0ZBNzMwMTFDQTJDRUEgPSB7Ci0JCQlmaWxlUmVmID0gMkEzN0Y0QUNGRENGQTczMDExQ0EyQ0VBOwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQkJQVRUUklCVVRFUyA9ICgKLQkJCQkpOwotCQkJfTsKLQkJfTsKLQkJMkEzN0Y0RDBGRENGQTczMDExQ0EyQ0VBID0gewotCQkJZmlsZVJlZiA9IDJBMzdGNEIwRkRDRkE3MzAxMUNBMkNFQTsKLQkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKLQkJCXNldHRpbmdzID0gewotCQkJCUFUVFJJQlVURVMgPSAoCi0JCQkJKTsKLQkJCX07Ci0JCX07Ci0JCTJBMzdGNEQxRkRDRkE3MzAxMUNBMkNFQSA9IHsKLQkJCWJ1aWxkQWN0aW9uTWFzayA9IDIxNDc0ODM2NDc7Ci0JCQlmaWxlcyA9ICgKLQkJCQkxMDU4QzdBOUZFQTU0RjUzMTFDQTJDQkIsCi0JCQkJRjVBQTlEOUIwMkY4MDdFRjAxMTBDNDQ3LAotCQkJKTsKLQkJCWlzYSA9IFBCWEZyYW1ld29ya3NCdWlsZFBoYXNlOwotCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7Ci0JCX07Ci0vLzJBMAotLy8yQTEKLS8vMkEyCi0vLzJBMwotLy8yQTQKLS8vNEEwCi0vLzRBMQotLy80QTIKLS8vNEEzCi0vLzRBNAotCQk0QTk1MDREMEZGRTZBNENCMTFDQTBDQkEgPSB7Ci0JCQlidWlsZFJ1bGVzID0gKAotCQkJKTsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQ09QWV9QSEFTRV9TVFJJUCA9IE5POwotCQkJCU9QVElNSVpBVElPTl9DRkxBR1MgPSAiLU8wIjsKLQkJCX07Ci0JCQlpc2EgPSBQQlhCdWlsZFN0eWxlOwotCQkJbmFtZSA9IERldmVsb3BtZW50OwotCQl9OwotCQk0QTk1MDREMUZGRTZBNENCMTFDQTBDQkEgPSB7Ci0JCQlidWlsZFJ1bGVzID0gKAotCQkJKTsKLQkJCWJ1aWxkU2V0dGluZ3MgPSB7Ci0JCQkJQ09QWV9QSEFTRV9TVFJJUCA9IFlFUzsKLQkJCX07Ci0JCQlpc2EgPSBQQlhCdWlsZFN0eWxlOwotCQkJbmFtZSA9IERlcGxveW1lbnQ7Ci0JCX07Ci0vLzRBMAotLy80QTEKLS8vNEEyCi0vLzRBMwotLy80QTQKLS8vRjUwCi0vL0Y1MQotLy9GNTIKLS8vRjUzCi0vL0Y1NAotCQlGNTJBOTBDRDAyRUI1QzZBMDEwMDAxMDIgPSB7Ci0JCQlmaWxlRW5jb2RpbmcgPSAzMDsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gRmlsZVNldHRpbmdzLm07Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJRjUyQTkwQ0UwMkVCNUM2QTAxMDAwMTAyID0gewotCQkJZmlsZUVuY29kaW5nID0gMzA7Ci0JCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOwotCQkJcGF0aCA9IEZpbGVTZXR0aW5ncy5oOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCUY1MkE5MENGMDJFQjVDNkEwMTAwMDEwMiA9IHsKLQkJCWZpbGVSZWYgPSBGNTJBOTBDRDAyRUI1QzZBMDEwMDAxMDI7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0JCUY1MkE5MEQwMDJFQjVDNkEwMTAwMDEwMiA9IHsKLQkJCWZpbGVSZWYgPSBGNTJBOTBDRTAyRUI1QzZBMDEwMDAxMDI7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0JCUY1NDQ5QjRCMDJGQjNGN0UwMTAwMDEwMiA9IHsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gUHl0aG9uV1NvdXJjZS5pY25zOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCUY1NDQ5QjRDMDJGQjNGN0UwMTAwMDEwMiA9IHsKLQkJCWZpbGVSZWYgPSBGNTQ0OUI0QjAyRkIzRjdFMDEwMDAxMDI7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0JCUY1OEQ0QTNBMDJGMUY5NEIwMTAwMDEwMiA9IHsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gUHl0aG9uQ29tcGlsZWQuaWNuczsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQlGNThENEEzQjAyRjFGOTRCMDEwMDAxMDIgPSB7Ci0JCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOwotCQkJcGF0aCA9IFB5dGhvbkludGVycHJldGVyLmljbnM7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJRjU4RDRBM0MwMkYxRjk0QjAxMDAwMTAyID0gewotCQkJaXNhID0gUEJYRmlsZVJlZmVyZW5jZTsKLQkJCXBhdGggPSBQeXRob25Tb3VyY2UuaWNuczsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQlGNThENEEzRDAyRjFGOTRCMDEwMDAxMDIgPSB7Ci0JCQlmaWxlUmVmID0gRjU4RDRBM0EwMkYxRjk0QjAxMDAwMTAyOwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotCQlGNThENEEzRTAyRjFGOTRCMDEwMDAxMDIgPSB7Ci0JCQlmaWxlUmVmID0gRjU4RDRBM0IwMkYxRjk0QjAxMDAwMTAyOwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotCQlGNThENEEzRjAyRjFGOTRCMDEwMDAxMDIgPSB7Ci0JCQlmaWxlUmVmID0gRjU4RDRBM0MwMkYxRjk0QjAxMDAwMTAyOwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotCQlGNUE0MjE2NzAzOEJERDhFMDExMEM0NDcgPSB7Ci0JCQlmaWxlRW5jb2RpbmcgPSAzMDsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gZmFjdG9yeVNldHRpbmdzLnBsaXN0OwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCUY1QTQyMTY4MDM4QkREOEUwMTEwQzQ0NyA9IHsKLQkJCWZpbGVSZWYgPSBGNUE0MjE2NzAzOEJERDhFMDExMEM0NDc7Ci0JCQlpc2EgPSBQQlhCdWlsZEZpbGU7Ci0JCQlzZXR0aW5ncyA9IHsKLQkJCX07Ci0JCX07Ci0JCUY1QTRDMTNFMDJGMjAzRjYwMTAwMDEwMiA9IHsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gUHJlZmVyZW5jZVdpbmRvdy5uaWI7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJRjVBNEMxM0YwMkYyMDNGNzAxMDAwMTAyID0gewotCQkJZmlsZVJlZiA9IEY1QTRDMTNFMDJGMjAzRjYwMTAwMDEwMjsKLQkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKLQkJCXNldHRpbmdzID0gewotCQkJfTsKLQkJfTsKLQkJRjVBNEMxNDAwMkYyMDU1QzAxMDAwMTAyID0gewotCQkJZmlsZUVuY29kaW5nID0gMzA7Ci0JCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOwotCQkJcGF0aCA9IFByZWZlcmVuY2VzV2luZG93Q29udHJvbGxlci5oOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCUY1QTRDMTQxMDJGMjA1NUMwMTAwMDEwMiA9IHsKLQkJCWZpbGVFbmNvZGluZyA9IDMwOwotCQkJaXNhID0gUEJYRmlsZVJlZmVyZW5jZTsKLQkJCXBhdGggPSBQcmVmZXJlbmNlc1dpbmRvd0NvbnRyb2xsZXIubTsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQlGNUE0QzE0MjAyRjIwNTVEMDEwMDAxMDIgPSB7Ci0JCQlmaWxlUmVmID0gRjVBNEMxNDAwMkYyMDU1QzAxMDAwMTAyOwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotCQlGNUE0QzE0MzAyRjIwNTVEMDEwMDAxMDIgPSB7Ci0JCQlmaWxlUmVmID0gRjVBNEMxNDEwMkYyMDU1QzAxMDAwMTAyOwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotCQlGNUE0QzE0NDAyRjIwNzBEMDEwMDAxMDIgPSB7Ci0JCQlmaWxlRW5jb2RpbmcgPSAzMDsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gTXlBcHBEZWxlZ2F0ZS5tOwotCQkJcmVmVHlwZSA9IDQ7Ci0JCX07Ci0JCUY1QTRDMTQ1MDJGMjA3MEQwMTAwMDEwMiA9IHsKLQkJCWZpbGVFbmNvZGluZyA9IDMwOwotCQkJaXNhID0gUEJYRmlsZVJlZmVyZW5jZTsKLQkJCXBhdGggPSBNeUFwcERlbGVnYXRlLmg7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJRjVBNEMxNDYwMkYyMDcwRDAxMDAwMTAyID0gewotCQkJZmlsZVJlZiA9IEY1QTRDMTQ0MDJGMjA3MEQwMTAwMDEwMjsKLQkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKLQkJCXNldHRpbmdzID0gewotCQkJfTsKLQkJfTsKLQkJRjVBNEMxNDcwMkYyMDcwRDAxMDAwMTAyID0gewotCQkJZmlsZVJlZiA9IEY1QTRDMTQ1MDJGMjA3MEQwMTAwMDEwMjsKLQkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKLQkJCXNldHRpbmdzID0gewotCQkJfTsKLQkJfTsKLQkJRjVBQTlDNkEwMkY4MDQyRDAxMTBDNDQ3ID0gewotCQkJZmlsZUVuY29kaW5nID0gMzA7Ci0JCQlpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOwotCQkJcGF0aCA9IGRvc2NyaXB0Lmg7Ci0JCQlyZWZUeXBlID0gNDsKLQkJfTsKLQkJRjVBQTlDNkMwMkY4MDQyRDAxMTBDNDQ3ID0gewotCQkJZmlsZVJlZiA9IEY1QUE5QzZBMDJGODA0MkQwMTEwQzQ0NzsKLQkJCWlzYSA9IFBCWEJ1aWxkRmlsZTsKLQkJCXNldHRpbmdzID0gewotCQkJfTsKLQkJfTsKLQkJRjVBQTlEMDEwMkY4MDdFRTAxMTBDNDQ3ID0gewotCQkJaXNhID0gUEJYRnJhbWV3b3JrUmVmZXJlbmNlOwotCQkJbmFtZSA9IENhcmJvbi5mcmFtZXdvcms7Ci0JCQlwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ2FyYm9uLmZyYW1ld29yazsKLQkJCXJlZlR5cGUgPSAwOwotCQl9OwotCQlGNUFBOUQ5QjAyRjgwN0VGMDExMEM0NDcgPSB7Ci0JCQlmaWxlUmVmID0gRjVBQTlEMDEwMkY4MDdFRTAxMTBDNDQ3OwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotCQlGNUFBQTIxRDAyRjgxMTVEMDExMEM0NDcgPSB7Ci0JCQlmaWxlRW5jb2RpbmcgPSAzMDsKLQkJCWlzYSA9IFBCWEZpbGVSZWZlcmVuY2U7Ci0JCQlwYXRoID0gZG9zY3JpcHQubTsKLQkJCXJlZlR5cGUgPSA0OwotCQl9OwotCQlGNUFBQTIxRTAyRjgxMTVEMDExMEM0NDcgPSB7Ci0JCQlmaWxlUmVmID0gRjVBQUEyMUQwMkY4MTE1RDAxMTBDNDQ3OwotCQkJaXNhID0gUEJYQnVpbGRGaWxlOwotCQkJc2V0dGluZ3MgPSB7Ci0JCQl9OwotCQl9OwotCX07Ci0Jcm9vdE9iamVjdCA9IDJBMzdGNEE5RkRDRkE3MzAxMUNBMkNFQTsKLX0KZGlmZiAtLWdpdCBhL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uU291cmNlLmljbnMgYi9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL1B5dGhvblNvdXJjZS5pY25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM3YTk2Li4wMDAwMDAwCi0tLSBhL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uU291cmNlLmljbnMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9NYWMvT1NYL1B5dGhvbkxhdW5jaGVyL1B5dGhvbldTb3VyY2UuaWNucyBiL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uV1NvdXJjZS5pY25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGE4NTkzLi4wMDAwMDAwCi0tLSBhL01hYy9PU1gvUHl0aG9uTGF1bmNoZXIvUHl0aG9uV1NvdXJjZS5pY25zCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWFjL09TWC9SRUFETUUgYi9NYWMvT1NYL1JFQURNRQppbmRleCAyNmM2NDZkYi4uMWU1OGIwMiAxMDA2NDQKLS0tIGEvTWFjL09TWC9SRUFETUUKKysrIGIvTWFjL09TWC9SRUFETUUKQEAgLTEsMjkgKzEsNTcgQEAKLUJ1aWxkaW5nIGFuZCB1c2luZyBhIGZyYW1ld29yay1iYXNlZCBQeXRob24gb24gTWFjIE9TIFguCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PT09PT09PT09CitNYWNPU1ggTm90ZXMKKz09PT09PT09PT09PQogCi1UaGlzIGRvY3VtZW50IHByb3ZpZGVzIGEgcXVpY2sgaW50cm9kdWN0aW9uIHRvIGZyYW1ld29yay1iYXNlZCBQeXRob24sIGl0cwotYWR2YW50YWdlcywgYW5kIGhvdyB0byBidWlsZCBpdC4KK1RoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYSBxdWljayBvdmVydmlldyBvZiBzb21lIE1hYyBPUyBYIHNwZWNpZmljIGZlYXR1cmVzIGluCit0aGUgUHl0aG9uIGRpc3RyaWJ1dGlvbi4KKworCitCdWlsZGluZyBhbmQgdXNpbmcgYSB1bml2ZXJzYWwgYmluYXJ5IG9mIFB5dGhvbiBvbiBNYWMgT1MgWAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMS4gV2hhdCBpcyBhIHVuaXZlcnNhbCBiaW5hcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgdW5pdmVyc2FsIGJpbmFyeSBidWlsZCBvZiBQeXRob24gY29udGFpbnMgb2JqZWN0IGNvZGUgZm9yIGJvdGggUFBDIGFuZCBpMzg2CithbmQgY2FuIHRoZXJlZm9yZSBydW4gYXQgbmF0aXZlIHNwZWVkIG9uIGJvdGggY2xhc3NpYyBwb3dlcnBjIGJhc2VkIG1hY3MgYW5kCit0aGUgbmV3ZXIgaW50ZWwgYmFzZWQgbWFjcy4KKworMi4gSG93IGRvIEkgYnVpbGQgYSB1bml2ZXJzYWwgYmluYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBlbmFibGUgdW5pdmVyc2FsIGJpbmFyaWVzIGJ5IHNwZWNpZnlpbmcgdGhlICItLWVuYWJsZS11bml2ZXJzYWxzZGsiCitmbGFnIHRvIGNvbmZpZ3VyZTo6CisKKyAgJCAuL2NvbmZpZ3VyZSAtLWVuYWJsZS11bml2ZXJzYWxzZGsKKyAgJCBtYWtlCisgICQgbWFrZSBpbnN0YWxsCisKK1RoaXMgZmxhZyBjYW4gYmUgdXNlZCBhIGZyYW1ld29yayBidWlsZCBvZiBweXRob24sIGJ1dCBhbHNvIHdpdGggYSBjbGFzc2ljCit1bml4IGJ1aWxkLiBFaXRoZXIgd2F5IHlvdSB3aWxsIGhhdmUgdG8gYnVpbGQgcHl0aG9uIG9uIE1hYyBPUyBYIDEwLjQgKG9yIGxhdGVyKQord2l0aCBYY29kZSAyLjEgKG9yIGxhdGVyKS4gWW91IGFsc28gaGF2ZSB0byBpbnN0YWxsIHRoZSAxMC40dSBTREsgd2hlbiAKK2luc3RhbGxpbmcgWGNvZGUuCisKKworQnVpbGRpbmcgYW5kIHVzaW5nIGEgZnJhbWV3b3JrLWJhc2VkIFB5dGhvbiBvbiBNYWMgT1MgWC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIAogMS4gV2h5IHdvdWxkIEkgd2FudCBhIGZyYW1ld29yayBQeXRob24gaW5zdGVhZCBvZiBhIG5vcm1hbCBzdGF0aWMgUHl0aG9uPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIG1haW4gcmVhc29uIGlzIGJlY2F1c2UgeW91IHdhbnQgdG8gY3JlYXRlIEdVSSBwcm9ncmFtcyBpbiBQeXRob24uIFdpdGggdGhlCi1leGNlcHRpb24gb2YgWDExL1hEYXJ3aW4tYmFzZWQgR1VJIHRvb2xraXRzIGl0IGFwcGVhcnMgdGhhdCBhbGwgR1VJIHByb2dyYW1zCi1uZWVkIHRvIGJlIHJ1biBmcm9tIGEgZnVsbGJsb3duIE1hY09TWCBhcHBsaWNhdGlvbiAoYSAiLmFwcCIgYnVuZGxlKS4KK2V4Y2VwdGlvbiBvZiBYMTEvWERhcndpbi1iYXNlZCBHVUkgdG9vbGtpdHMgYWxsIEdVSSBwcm9ncmFtcyBuZWVkIHRvIGJlIHJ1biAKK2Zyb20gYSBmdWxsYmxvd24gTWFjT1NYIGFwcGxpY2F0aW9uIChhICIuYXBwIiBidW5kbGUpLgogCiBXaGlsZSBpdCBpcyB0ZWNobmljYWxseSBwb3NzaWJsZSB0byBjcmVhdGUgYSAuYXBwIHdpdGhvdXQgdXNpbmcgZnJhbWV3b3JrcyB5b3UKIHdpbGwgaGF2ZSB0byBkbyB0aGUgd29yayB5b3Vyc2VsZiBpZiB5b3UgcmVhbGx5IHdhbnQgdGhpcy4KIAogQSBzZWNvbmQgcmVhc29uIGZvciB1c2luZyBmcmFtZXdvcmtzIGlzIHRoYXQgdGhleSBwdXQgUHl0aG9uLXJlbGF0ZWQgaXRlbXMgaW4KLW9ubHkgdHdvIHBsYWNlczogL0xpYnJhcnkvRnJhbWV3b3JrL1B5dGhvbi5mcmFtZXdvcmsgYW5kIC9BcHBsaWNhdGlvbnMvTWFjUHl0aG9uLTIuMy4KLVRoaXMgc2ltcGxpZmllcyBtYXR0ZXJzIGZvciB1c2VycyBpbnN0YWxsaW5nIFB5dGhvbiBmcm9tIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbgotaWYgdGhleSB3YW50IHRvIGdldCByaWQgb2YgaXQgYWdhaW4uIE1vcmVvdmVyLCBkdWUgdG8gdGhlIHdheSBmcmFtZXdvcmtzIHdvcmsKLWEgdXNlciB3aXRob3V0IGFkbWluIHByaXZpbGVnZXMgY2FuIGluc3RhbGwgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGluIGhpcyBvcgotaGVyIGhvbWUgZGlyZWN0b3J5IHdpdGhvdXQgcmVjb21waWxhdGlvbi4KLQotSW5jaWRlbnRhbGx5LCB0aGUgcHJvY2VkdXJlIGRlc2NyaWJlZCBoZXJlIGlzIGFsc28gdGhlIHByb2NlZHVyZSB0aGF0IGlzCi11c2VkIHRvIGNyZWF0ZSB0aGUgTWFjUHl0aG9uIGJpbmFyeSBpbnN0YWxsZXIsIHNvIHRoZSBpbmZvcm1hdGlvbiBoZXJlCi1zaG91bGQgdGhlb3JldGljYWxseSBhbGxvdyB5b3UgdG8gcmVidWlsZCB0aGF0Lgorb25seSB0d28gcGxhY2VzOiAiL0xpYnJhcnkvRnJhbWV3b3JrL1B5dGhvbi5mcmFtZXdvcmsiIGFuZCAKKyIvQXBwbGljYXRpb25zL01hY1B5dGhvbiAyLjUiLiAgVGhpcyBzaW1wbGlmaWVzIG1hdHRlcnMgZm9yIHVzZXJzIGluc3RhbGxpbmcgCitQeXRob24gZnJvbSBhIGJpbmFyeSBkaXN0cmlidXRpb24gaWYgdGhleSB3YW50IHRvIGdldCByaWQgb2YgaXQgYWdhaW4uIE1vcmVvdmVyLAorZHVlIHRvIHRoZSB3YXkgZnJhbWV3b3JrcyB3b3JrIGEgdXNlciB3aXRob3V0IGFkbWluIHByaXZpbGVnZXMgY2FuIGluc3RhbGwgYSAKK2JpbmFyeSBkaXN0cmlidXRpb24gaW4gaGlzIG9yIGhlciBob21lIGRpcmVjdG9yeSB3aXRob3V0IHJlY29tcGlsYXRpb24uCiAKIDIuIEhvdyBkb2VzIGEgZnJhbWV3b3JrIFB5dGhvbiBkaWZmZXIgZnJvbSBhIG5vcm1hbCBzdGF0aWMgUHl0aG9uPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNyw0NCArNjUsNDAgQEAKIDMuIERvIEkgbmVlZCBleHRyYSBwYWNrYWdlcz8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotWWVzLCBwcm9iYWJseS4gSWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlIFB5dGhvbklERSB5b3Ugd2lsbCBuZWVkIHRvCi1nZXQgV2FzdGUsIGFuIGFsbC1zaW5naW5nLWFsbC1kYW5jaW5nIFRleHRFZGl0IHJlcGxhY2VtZW50LCBmcm9tCi13d3cubWVyendhcmVuLmNvbS4gSXQgd2lsbCB1bnBhY2sgaW50byBhIGZvbGRlciBuYW1lZCBzb21ldGhpbmcgbGlrZSAiV2FzdGUKLTIuMSBEaXN0cmlidXRpb24iLiBNYWtlIGEgc3ltbGluayBjYWxsZWQgIndhc3RlIiB0byB0aGlzIGZvbGRlciwgc29tZXdoZXJlCi1iZXNpZGUgeW91ciBQeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbiAoaXQgY2FuIGJlICIuLi93YXN0ZSIsICIuLi8uLi93YXN0ZSIsCi1ldGMpLgotCi1JZiB5b3Ugd2FudCBUa2ludGVyIHN1cHBvcnQgeW91IG5lZWQgdG8gZ2V0IHRoZSBPU1ggQXF1YVRrIGRpc3RyaWJ1dGlvbi4gSWYKK1llcywgcHJvYmFibHkuICBJZiB5b3Ugd2FudCBUa2ludGVyIHN1cHBvcnQgeW91IG5lZWQgdG8gZ2V0IHRoZSBPU1ggQXF1YVRrIAorZGlzdHJpYnV0aW9uLCB0aGlzIGlzIGluc3RhbGxlZCBieSBkZWZhdWx0IG9uIE1hYyBPUyBYIDEwLjQgb3IgbGF0ZXIuIElmCiB5b3Ugd2FudCB3eFB5dGhvbiB5b3UgbmVlZCB0byBnZXQgdGhhdC4gSWYgeW91IHdhbnQgQ29jb2EgeW91IG5lZWQgdG8gZ2V0Ci1weW9iamMuIEJlY2F1c2UgYWxsIHRoZXNlIGFyZSBjdXJyZW50bHkgaW4gYSBzdGF0ZSBvZiBmbHV4IHBsZWFzZSByZWZlciB0bwotaHR0cDovL3d3dy5jd2kubmwvfmphY2svbWFjcHl0aG9uLmh0bWwsIHdoaWNoIHNob3VsZCBjb250YWluIHBvaW50ZXJzIHRvIG1vcmUKLWluZm9ybWF0aW9uLgorUHlPYmpDLiAKIAogNC4gSG93IGRvIEkgYnVpbGQgYSBmcmFtZXdvcmsgUHl0aG9uPwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyBhIE1ha2VmaWxlIHRoYXQgd2lsbCBjcmVhdGUgYSBjb3VwbGUgb2YgcHl0aG9uLXJlbGF0ZWQKIGFwcGxpY2F0aW9ucyAoZnVsbGJsb3duIE9TWCAuYXBwIGFwcGxpY2F0aW9ucywgdGhhdCBpcykgaW4KLS9BcHBsaWNhdGlvbnMvTWFjUHl0aG9uLTIuMywgYW5kIGEgaGlkZGVuIGhlbHBlciBhcHBsaWNhdGlvbiBQeXRob24uYXBwIGluc2lkZSB0aGUKLVB5dGhvbi5mcmFtZXdvcmssIGFuZCB1bml4IHRvb2xzICJweXRob24iIGFuZCAicHl0aG9udyIgaW50byAvdXNyL2xvY2FsL2Jpbi4KLUluIGFkZGl0aW9uIGl0IGhhcyBhIHRhcmdldCAiaW5zdGFsbG1hY3N1YnRyZWUiIHRoYXQgaW5zdGFsbHMgdGhlIHJlbGV2YW50Ci1wb3J0aW9ucyBvZiB0aGUgTWFjIHN1YnRyZWUgaW50byB0aGUgUHl0aG9uLmZyYW1ld29yay4KKyIvQXBwbGljYXRpb25zL01hY1B5dGhvbiAyLjMiLCBhbmQgYSBoaWRkZW4gaGVscGVyIGFwcGxpY2F0aW9uIFB5dGhvbi5hcHAgCitpbnNpZGUgdGhlIFB5dGhvbi5mcmFtZXdvcmssIGFuZCB1bml4IHRvb2xzICJweXRob24iIGFuZCAicHl0aG9udyIgaW50byAKKy91c3IvbG9jYWwvYmluLiAgSW4gYWRkaXRpb24gaXQgaGFzIGEgdGFyZ2V0ICJpbnN0YWxsbWFjc3VidHJlZSIgdGhhdCBpbnN0YWxscyAKK3RoZSByZWxldmFudCBwb3J0aW9ucyBvZiB0aGUgTWFjIHN1YnRyZWUgaW50byB0aGUgUHl0aG9uLmZyYW1ld29yay4KIAogSXQgaXMgbm9ybWFsbHkgaW52b2tlZCBpbmRpcmVjdGx5IHRocm91Z2ggdGhlIG1haW4gTWFrZWZpbGUsIGFzIHRoZSBsYXN0IHN0ZXAKIGluIHRoZSBzZXF1ZW5jZQotMS4gLi9jb25maWd1cmUgLS1lbmFibGUtZnJhbWV3b3JrCi0yLiBtYWtlCi0zLiBtYWtlIGZyYW1ld29ya2luc3RhbGwKKworIDEuIC4vY29uZmlndXJlIC0tZW5hYmxlLWZyYW1ld29yaworCisgMi4gbWFrZQorIAorIDMuIG1ha2UgaW5zdGFsbAogCiBUaGlzIHNlcXVlbmNlIHdpbGwgcHV0IHRoZSBmcmFtZXdvcmsgaW4gL0xpYnJhcnkvRnJhbWV3b3JrL1B5dGhvbi5mcmFtZXdvcmssCi10aGUgYXBwbGljYXRpb25zIGluIC9BcHBsaWNhdGlvbnMvUHl0aG9uIGFuZCB0aGUgdW5peCB0b29scyBpbiAvdXNyL2xvY2FsL2Jpbi4KK3RoZSBhcHBsaWNhdGlvbnMgaW4gL0FwcGxpY2F0aW9ucy9NYWNQeXRob24gMi41IGFuZCB0aGUgdW5peCB0b29scyBpbiAKKy91c3IvbG9jYWwvYmluLgogCiBJbnN0YWxsaW5nIGluIGFub3RoZXIgcGxhY2UsIGZvciBpbnN0YW5jZSAkSE9NRS9MaWJyYXJ5L0ZyYW1ld29ya3MgaWYgeW91IGhhdmUKIG5vIGFkbWluIHByaXZpbGVnZXMgb24geW91ciBtYWNoaW5lLCBoYXMgb25seSBiZWVuIHRlc3RlZCB2ZXJ5IGxpZ2h0bHkuIFRoaXMKIGNhbiBiZSBkb25lIGJ5IGNvbmZpZ3VyaW5nIHdpdGggLS1lbmFibGUtZnJhbWV3b3JrPSRIT01FL0xpYnJhcnkvRnJhbWV3b3Jrcy4KLVRoZSBvdGhlciB0d28gZGlyZWN0b3JpZXMsIC9BcHBsaWNhdGlvbnMvTWFjUHl0aG9uLTIuMyBhbmQgL3Vzci9sb2NhbC9iaW4sIHdpbGwgdGhlbgotYWxzbyBiZSBkZXBvc2l0ZWQgaW4gJEhPTUUuIFRoaXMgaXMgc3ViLW9wdGltYWwgZm9yIHRoZSB1bml4IHRvb2xzLCB3aGljaCB5b3UKLXdvdWxkIHdhbnQgaW4gJEhPTUUvYmluLCBidXQgdGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gZml4IHRoaXMgcmlnaHQgbm93LgorVGhlIG90aGVyIHR3byBkaXJlY3RvcmllcywgL0FwcGxpY2F0aW9ucy9NYWNQeXRob24tMi4zIGFuZCAvdXNyL2xvY2FsL2Jpbiwgd2lsbCAKK3RoZW4gYWxzbyBiZSBkZXBvc2l0ZWQgaW4gJEhPTUUuIFRoaXMgaXMgc3ViLW9wdGltYWwgZm9yIHRoZSB1bml4IHRvb2xzLCB3aGljaCAKK3lvdSB3b3VsZCB3YW50IGluICRIT01FL2JpbiwgYnV0IHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGZpeCB0aGlzIHJpZ2h0IG5vdy4KIAogTm90ZSB0aGF0IHRoZXJlIGFyZSBubyByZWZlcmVuY2VzIHRvIHRoZSBhY3R1YWwgbG9jYXRpb25zIGluIHRoZSBjb2RlIG9yCiByZXNvdXJjZSBmaWxlcywgc28geW91IGFyZSBmcmVlIHRvIG1vdmUgdGhpbmdzIGFyb3VuZCBhZnRlcndhcmRzLiBGb3IgZXhhbXBsZSwKQEAgLTg5LDE4ICsxMTMsMTMgQEAKIG5vcm1hbCBmcmFtZXdvcmtpbnN0YWxsIHdoaWNoIGluc3RhbGxzIHRoZSBEZW1vIGFuZCBUb29scyBkaXJlY3RvcmllcwogaW50byAvQXBwbGljYXRpb25zL01hY1B5dGhvbi0yLjMsIHRoaXMgaXMgdXNlZnVsIGZvciBiaW5hcnkgZGlzdHJpYnV0aW9ucy4KIAotSWYgeW91IHdhbnQgdG8gcnVuIHRoZSBNYWtlZmlsZSBoZXJlIGRpcmVjdGx5LCBpbiBzdGVhZCBvZiB0aHJvdWdoIHRoZSBtYWluCi1NYWtlZmlsZSwgeW91IHdpbGwgaGF2ZSB0byBwYXNzIHZhcmlvdXMgdmFyaWFibGUtYXNzaWdubWVudHMuIFJlYWQgdGhlCi1iZWdpbm5pbmcgb2YgdGhlIE1ha2VmaWxlIGZvciBkZXRhaWxzLgorV2hhdCBkbyBhbGwgdGhlc2UgcHJvZ3JhbXMgZG8/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQotNS4gV2hhdCBkbyBhbGwgdGhlc2UgcHJvZ3JhbXMgZG8/Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUHl0aG9uSURFLmFwcCBpcyBhbiBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBQeXRob246IGVkaXRvciwKKyJJRExFLmFwcCIgaXMgYW4gaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgUHl0aG9uOiBlZGl0b3IsCiBkZWJ1Z2dlciwgZXRjLgogCi1QeXRob25MYXVuY2hlci5hcHAgaXMgYSBoZWxwZXIgYXBwbGljYXRpb24gdGhhdCB3aWxsIGhhbmRsZSB0aGluZ3Mgd2hlbiB5b3UKKyJQeXRob25MYXVuY2hlci5hcHAiIGlzIGEgaGVscGVyIGFwcGxpY2F0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdGhpbmdzIHdoZW4geW91CiBkb3VibGUtY2xpY2sgYSAucHksIC5weWMgb3IgLnB5dyBmaWxlLiBGb3IgdGhlIGZpcnN0IHR3byBpdCBjcmVhdGVzIGEgVGVybWluYWwKIHdpbmRvdyBhbmQgcnVucyB0aGUgc2NyaXB0cyB3aXRoIHRoZSBub3JtYWwgY29tbWFuZC1saW5lIFB5dGhvbi4gRm9yIHRoZQogbGF0dGVyIGl0IHJ1bnMgdGhlIHNjcmlwdCBpbiB0aGUgUHl0aG9uLmFwcCBpbnRlcnByZXRlciBzbyB0aGUgc2NyaXB0IGNhbiBkbwpAQCAtMTA4LDcgKzEyNyw3IEBACiBzY3JpcHQgdG8gc2V0IHJ1bnRpbWUgb3B0aW9ucy4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgc2V0IG9uY2UgYW5kIGZvciBhbGwKIHRocm91Z2ggUHl0aG9uTGF1bmNoZXIncyBwcmVmZXJlbmNlcyBkaWFsb2cuCiAKLUJ1aWxkQXBwbGV0LmFwcCBjcmVhdGVzIGFuIGFwcGxldCBmcm9tIGEgUHl0aG9uIHNjcmlwdC4gRHJvcCB0aGUgc2NyaXB0IG9uIGl0CisiQnVpbGRBcHBsZXQuYXBwIiBjcmVhdGVzIGFuIGFwcGxldCBmcm9tIGEgUHl0aG9uIHNjcmlwdC4gRHJvcCB0aGUgc2NyaXB0IG9uIGl0CiBhbmQgb3V0IGNvbWVzIGEgZnVsbC1mZWF0dXJlZCBNYWNPUyBhcHBsaWNhdGlvbi4gVGhlcmUgaXMgbXVjaCBtb3JlIHRvIHRoaXMsCiB0byBiZSBzdXBwbGllZCBsYXRlci4gU29tZSB1c2VmdWwgKGJ1dCBvdXRkYXRlZCkgaW5mbyBjYW4gYmUgZm91bmQgaW4KIE1hYy9EZW1vLgpAQCAtMTE2LDQzICsxMzUsMjcgQEAKIFRoZSBjb21tYW5kbGluZSBzY3JpcHRzIC91c3IvbG9jYWwvYmluL3B5dGhvbiBhbmQgcHl0aG9udyBjYW4gYmUgdXNlZCB0byBydW4KIG5vbi1HVUkgYW5kIEdVSSBweXRob24gc2NyaXB0cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHJlc3BlY3RpdmVseS4KIAotNi4gSG93IGRvIEkgY3JlYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbj8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitIb3cgZG8gSSBjcmVhdGUgYSBiaW5hcnkgZGlzdHJpYnV0aW9uPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotRmlyc3QgZ28gdG8gTWFjL09TWCBhbmQgcnVuICJweXRob24gZml4dmVyc2lvbnMucHkgLWEiIHdpdGggdGhlIFB5dGhvbgoteW91IGFyZSBnb2luZyB0byBkaXN0cmlidXRlLiBUaGlzIHdpbGwgZml4IHRoZSB2ZXJzaW9uIG51bWJlcnMgYW5kIGNvcHlyaWdodAotc3RyaW5ncyBpbiB0aGUgdmFyaW91cyBJbmZvLnBsaXN0IGZpbGVzLgorR28gdG8gdGhlIGRpcmVjdG9yeSAiTWFjL09TWC9CdWlsZFNjcmlwdCIuIFRoZXJlIHlvdSdsbCBmaW5kIGEgc2NyaXB0IAorImJ1aWxkLWluc3RhbGxlci5weSIgdGhhdCBkb2VzIGFsbCB0aGUgd29yay4gVGhpcyB3aWxsIGRvd25sb2FkIGFuZCBidWlsZAorYSBudW1iZXIgb2YgM3RoLXBhcnR5IGxpYmFyaWVzLCBjb25maWd1cmVzIGFuZCBidWlsZHMgYSBmcmFtZXdvcmsgUHl0aG9uLAoraW5zdGFsbHMgaXQsIGNyZWF0ZXMgdGhlIGluc3RhbGxlciBwYWNha2dlIGZpbGVzIGFuZCB0aGVuIHBhY2tzIHRoaXMgaW4gYSAKK0RNRyBpbWFnZS4KIAotR28gdG8gdGhlIE1hYy9PU1gvRGlzdCBkaXJlY3RvcnkuIFRoZXJlIHlvdSBmaW5kIGEgc2NyaXB0ICJidWlsZCIgdGhhdAotZG9lcyBhbGwgdGhlIHdvcms6IGl0IGNvbmZpZ3VyZXMgYW5kIGJ1aWxkcyBhIGZyYW1ld29yayBQeXRob24sIGluc3RhbGxzCi1pdCwgY3JlYXRlcyB0aGUgaW5zdGFsbGVyIHBhY2thZ2UgZmlsZSBhbmQgcGFja3MgdGhpcyBpbiBhIERNRyBpbWFnZS4KK1RoZSBzY3JpcHQgd2lsbCBidWlsZCBhIHVuaXZlcnNhbCBiaW5hcnksIHlvdSdsbCB0aGVyZWZvcmUgaGF2ZSB0byBydW4gdGhpcworc2NyaXB0IG9uIE1hYyBPUyBYIDEwLjQgb3IgbGF0ZXIgYW5kIHdpdGggWGNvZGUgMi4xIG9yIGxhdGVyIGluc3RhbGxlZC4KIAogQWxsIG9mIHRoaXMgaXMgbm9ybWFsbHkgZG9uZSBjb21wbGV0ZWx5IGlzb2xhdGVkIGluIC90bXAvX3B5LCBzbyBpdCBkb2VzIG5vdAogdXNlIHlvdXIgbm9ybWFsIGJ1aWxkIGRpcmVjdG9yeSBub3IgZG9lcyBpdCBpbnN0YWxsIGludG8gLy4KIAotQmVjYXVzZSB0aGUgYnVpbGQgc2NyaXB0IGxvY2F0ZXMgdGhlIFB5dGhvbiBzb3VyY2UgdHJlZSByZWxhdGl2ZSB0byBpdHMgb3duCi1wYXRobmFtZSB5b3UgbWF5IGhhdmUgdG8gcnVuIGl0IHdpdGggYSBmdWxsIHBhdGhuYW1lLiBJZiB5b3UgYXJlIGRlYnVnZ2luZyB5b3VyCi1pbnN0YWxsIHlvdSBjYW4gcGFzcyBvbmUgYXJndW1lbnQ6IHRoZSBwYXRobmFtZSB3aGVyZSB0aGUgYnVpbGQgZGlyZWN0b3J5Ci1pcyBsb2NhdGVkIChpLmUuIHdoZXJlIGNvbmZpZ3VyZSBhbmQgbWFrZSB3aWxsIGJlIHJ1biksIHRoZW4gdGhpcyBkaXJlY3RvcnkKLXdpbGwgYmUgc2F2ZWQgYmV0d2VlbiBydW5zIG9mIHRoZSBidWlsZCBzY3JpcHQuIERvICpub3QqIHNwZWNpZnkgeW91ciBub3JtYWwKLWJ1aWxkIGRpcmVjdG9yeSBoZXJlLgorQmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBzY3JpcHQgbG9jYXRlcyB0aGUgZmlsZXMgaXQgbmVlZHMgeW91IGhhdmUgdG8gcnVuIGl0Citmcm9tIHdpdGhpbiB0aGUgQnVpbGRTY3JpcHQgZGlyZWN0b3J5LiBUaGUgc2NyaXB0IGFjY2VwdHMgYSBudW1iZXIgb2YgCitjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBydW4gaXQgd2l0aCAtLWhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKLWJ1aWxkIHdpbGwgYXNrIHlvdSB3aGV0aGVyIHlvdSBoYXZlIHVwZGF0ZWQgdGhlIHJlYWRtZSBmaWxlLCBhbmQgaXQgd2lsbCBvZmZlcgotdG8gaW5jbHVkZSB0aGUgZnVsbCBkb2N1bWVudGF0aW9uIGluIHRoZSBpbnN0YWxsZXIuIFRoYXQgb3B0aW9uIGhhcyBub3QKLWJlZW4gdXNlZCBmb3IgYSB3aGlsZSwgYW5kIGl0IG1heSBub3Qgd29yay4KLQotSWYgeW91IG5lZWQgdG8gZXhlY3V0ZSBjb2RlIG9uIHRoZSBjbGllbnQgbWFjaGluZSBhZnRlciBpbnN0YWxsaW5nIFB5dGhvbgoteW91IGNhbiBhZGQgdGhpcyB0byByZXNvdXJjZXMvcG9zdGZsaWdodC4gSWYgeW91IG5lZWQgdG8gZG8gZXZlbiBzdHJhbmdlciB0aGluZ3MKLXlvdSBoYXZlIHRvIHJlYWQgQXBwbGUncyBkb2N1bWVudGF0aW9uIG9uIFBhY2thZ2VNYWtlciBhbmQgcmVhZCB0aGUgc291cmNlCi1vZiBNYWMvc2NyaXB0cy9idWlsZHBrZy5weS4KLQotNy4gT2RkcyBhbmQgZW5kcy4KLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBQeXRob25MYXVuY2hlciBpcyBhY3R1YWxseSBhbiBPYmplY3RpdmUgQyBDb2NvYSBhcHAgYnVpbHQgd2l0aCBQcm9qZWN0Ci1CdWlsZGVyLiBJdCBjb3VsZCBiZSBhIFB5dGhvbiBwcm9ncmFtLCBleGNlcHQgZm9yIHRoZSBmYWN0IHRoYXQgcHlvYmpjIGlzIG5vdAotYSBwYXJ0IG9mIHRoZSBjb3JlIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIG5vdCBjb21wbGV0ZWx5IGZpbmlzaGVkIHlldCBhcyBvZiB0aGlzCi13cml0aW5nLgorT2RkcyBhbmQgZW5kcworPT09PT09PT09PT09PQogCiBTb21ldGhpbmcgdG8gdGFrZSBub3RlIG9mIGlzIHRoYXQgdGhlICIucnNyYyIgZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiBhcmUKIG5vdCBhY3R1YWxseSByZXNvdXJjZSBmaWxlcywgdGhleSdyZSBBcHBsZVNpbmdsZSBlbmNvZGVkIHJlc291cmNlIGZpbGVzLiBUaGUKQEAgLTE2MSwzICsxNjQsNCBAQAogZmlsZXMuCiAKIAlKYWNrIEphbnNlbiwgSmFjay5KYW5zZW5AY3dpLm5sLCAxNS1KdWwtMjAwNC4KKwlSb25hbGQgT3Vzc29yZW4sIFJvbmFsZE91c3NvcmVuQG1hYy5jb20sIDI2LU1heS0yMDA2CmRpZmYgLS1naXQgYS9NYWMvT1NYL1Rvb2xzL3B5dGhvbncuYyBiL01hYy9PU1gvVG9vbHMvcHl0aG9udy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MGE3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9NYWMvT1NYL1Rvb2xzL3B5dGhvbncuYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogVGhpcyB3cmFwcGVyIHByb2dyYW0gZXhlY3V0ZXMgYSBweXRob24gZXhlY3V0YWJsZSBoaWRkZW4gaW5zaWRlIGFuCisgKiBhcHBsaWNhdGlvbiBidW5kbGUgaW5zaWRlIHRoZSBQeXRob24gZnJhbWV3b3JrLiBUaGlzIGlzIG5lZWRlZCB0byBydW4KKyAqIEdVSSBjb2RlOiBzb21lIEdVSSBBUEkncyBkb24ndCB3b3JrIHVubGVzcyB0aGUgcHJvZ3JhbSBpcyBpbnNpZGUgYW4KKyAqIGFwcGxpY2F0aW9uIGJ1bmRsZS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVyci5oPgorCitzdGF0aWMgY2hhciBQeXRob25bXSA9IFBZVEhPTldFWEVDVVRBQkxFOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKwlhcmd2WzBdID0gUHl0aG9uOworCWV4ZWN2KFB5dGhvbiwgYXJndik7CisJZXJyKDEsICJleGVjdjogJXMiLCBQeXRob24pOworCS8qIE5PVFJFQUNIRUQgKi8KK30KZGlmZiAtLWdpdCBhL01hYy9PU1gvZml4dmVyc2lvbnMucHkgYi9NYWMvT1NYL2ZpeHZlcnNpb25zLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc3Yzc5Li4wMDAwMDAwCi0tLSBhL01hYy9PU1gvZml4dmVyc2lvbnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0iIiJmaXh2ZXJzaW9ucyAtIEZpeCB2ZXJzaW9uIG51bWJlcnMgaW4gLnBsaXN0IGZpbGVzIHRvIG1hdGNoIGN1cnJlbnQKLXB5dGhvbiB2ZXJzaW9uIGFuZCBkYXRlIiIiCi0KLWltcG9ydCBzeXMKLWltcG9ydCBvcwotaW1wb3J0IHRpbWUKLWltcG9ydCBwbGlzdGxpYgotCi1TSE9SVFZFUlNJT04gPSAiJWQuJWQiICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pCi1pZiBzeXMudmVyc2lvbl9pbmZvWzJdOgotICAgIFNIT1JUVkVSU0lPTiA9IFNIT1JUVkVSU0lPTiArICIuJWQiICUgc3lzLnZlcnNpb25faW5mb1syXQotaWYgc3lzLnZlcnNpb25faW5mb1szXSAhPSAnZmluYWwnOgotICAgIFNIT1JUVkVSU0lPTiA9IFNIT1JUVkVSU0lPTiArICIlcyVkIiAlIChzeXMudmVyc2lvbl9pbmZvWzNdLCBzeXMudmVyc2lvbl9pbmZvWzRdKQotCi1DT1BZUklHSFQgPSAiKGMpICVkIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiIgJSB0aW1lLmdtdGltZSgpWzBdCi0KLUxPTkdWRVJTSU9OID0gU0hPUlRWRVJTSU9OICsgIiwgIiArIENPUFlSSUdIVAotCi1kZWYgZml4KGZpbGUpOgotICAgIHBsaXN0ID0gcGxpc3RsaWIuUGxpc3QuZnJvbUZpbGUoZmlsZSkKLSAgICBjaGFuZ2VkID0gRmFsc2UKLSAgICBpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZUdldEluZm9TdHJpbmciKSBhbmQgXAotICAgICAgICAgICAgICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVHZXRJbmZvU3RyaW5nIl0gIT0gTE9OR1ZFUlNJT046Ci0gICAgICAgIHBsaXN0WyJDRkJ1bmRsZUdldEluZm9TdHJpbmciXSA9IExPTkdWRVJTSU9OCi0gICAgICAgIGNoYW5nZWQgPSBUcnVlCi0gICAgaWYgcGxpc3QuaGFzX2tleSgiQ0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZyIpIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgIHBsaXN0WyJDRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nIl0gIT0gTE9OR1ZFUlNJT046Ci0gICAgICAgIHBsaXN0WyJDRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nIl0gPSBMT05HVkVSU0lPTgotICAgICAgICBjaGFuZ2VkID0gVHJ1ZQotICAgIGlmIHBsaXN0Lmhhc19rZXkoIk5TSHVtYW5SZWFkYWJsZUNvcHlyaWdodCIpIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgIHBsaXN0WyJOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQiXSAhPSBDT1BZUklHSFQ6Ci0gICAgICAgIHBsaXN0WyJOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQiXSA9IENPUFlSSUdIVAotICAgICAgICBjaGFuZ2VkID0gVHJ1ZQotICAgIGlmIHBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlVmVyc2lvbiIpIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgIHBsaXN0WyJDRkJ1bmRsZVZlcnNpb24iXSAhPSBTSE9SVFZFUlNJT046Ci0gICAgICAgIHBsaXN0WyJDRkJ1bmRsZVZlcnNpb24iXSA9IFNIT1JUVkVSU0lPTgotICAgICAgICBjaGFuZ2VkID0gVHJ1ZQotICAgIGlmIHBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIikgYW5kIFwKLSAgICAgICAgICAgICAgICAgICAgcGxpc3RbIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIl0gIT0gU0hPUlRWRVJTSU9OOgotICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciXSA9IFNIT1JUVkVSU0lPTgotICAgICAgICBjaGFuZ2VkID0gVHJ1ZQotICAgIGlmIGNoYW5nZWQ6Ci0gICAgICAgIG9zLnJlbmFtZShmaWxlLCBmaWxlICsgJ34nKQotICAgICAgICBwbGlzdC53cml0ZShmaWxlKQotCi1kZWYgbWFpbigpOgotICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgotICAgICAgICBwcmludCAiVXNhZ2U6ICVzIHBsaXN0ZmlsZSAuLi4iICUgc3lzLmFyZ3ZbMF0KLSAgICAgICAgcHJpbnQgIm9yOiAlcyAtYSAgICAgIGZpeCBzdGFuZGFyZCBQeXRob24gcGxpc3QgZmlsZXMiCi0gICAgICAgIHN5cy5leGl0KDEpCi0gICAgaWYgc3lzLmFyZ3ZbMV0gPT0gIi1hIjoKLSAgICAgICAgZmlsZXMgPSBbCi0gICAgICAgICAgICAgICAgIi4uL09TWFJlc291cmNlcy9hcHAvSW5mby5wbGlzdCIsCi0gICAgICAgICAgICAgICAgIi4uL09TWFJlc291cmNlcy9mcmFtZXdvcmsvdmVyc2lvbi5wbGlzdCIsCi0gICAgICAgICAgICAgICAgIi4uL1Rvb2xzL0lERS9QYWNrYWdlTWFuYWdlci5wbGlzdCIsCi0gICAgICAgICAgICAgICAgIi4uL1Rvb2xzL0lERS9QeXRob25JREUucGxpc3QiLAotICAgICAgICAgICAgICAgICIuLi9zY3JpcHRzL0J1aWxkQXBwbGV0LnBsaXN0IgotICAgICAgICBdCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlc1swXSk6Ci0gICAgICAgICAgICBwcmludCAiJXMgLWEgbXVzdCBiZSBydW4gZnJvbSBNYWMvT1NYIGRpcmVjdG9yeSIKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCi0gICAgZWxzZToKLSAgICAgICAgZmlsZXMgPSBzeXMuYXJndlsxOl0KLSAgICBmb3IgZmlsZSBpbiBmaWxlczoKLSAgICAgICAgZml4KGZpbGUpCi0gICAgc3lzLmV4aXQoMCkKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9PU1gvc2FtcGxlX3NpdGVjdXN0b21pemUucHkgYi9NYWMvT1NYL3NhbXBsZV9zaXRlY3VzdG9taXplLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JiYjEyLi4wMDAwMDAwCi0tLSBhL01hYy9PU1gvc2FtcGxlX3NpdGVjdXN0b21pemUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWltcG9ydCBzeXMKLWltcG9ydCBvcwotX21hY2xpYiA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnTWFjJywgJ0xpYicpCi1fc2NyaXB0bGliID0gb3MucGF0aC5qb2luKF9tYWNsaWIsICdsaWItc2NyaXB0cGFja2FnZXMnKQotc3lzLnBhdGguYXBwZW5kKF9tYWNsaWIpCi1zeXMucGF0aC5hcHBlbmQoX3NjcmlwdGxpYikKZGlmZiAtLWdpdCBhL01hYy9PU1hSZXNvdXJjZXMvYXBwL1Jlc291cmNlcy9QeXRob25BcHBsZXQuaWNucyBiL01hYy9PU1hSZXNvdXJjZXMvYXBwL1Jlc291cmNlcy9QeXRob25BcHBsZXQuaWNucwppbmRleCBmZmU3ZWYwLi5jOGFhZDlmIDEwMDY0NAotLS0gYS9NYWMvT1NYUmVzb3VyY2VzL2FwcC9SZXNvdXJjZXMvUHl0aG9uQXBwbGV0LmljbnMKKysrIGIvTWFjL09TWFJlc291cmNlcy9hcHAvUmVzb3VyY2VzL1B5dGhvbkFwcGxldC5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL01hYy9PU1hSZXNvdXJjZXMvYXBwL1Jlc291cmNlcy9QeXRob25JbnRlcnByZXRlci5pY25zIGIvTWFjL09TWFJlc291cmNlcy9hcHAvUmVzb3VyY2VzL1B5dGhvbkludGVycHJldGVyLmljbnMKaW5kZXggZDVkZDEyZi4uZTA5ZmQzOCAxMDA2NDQKLS0tIGEvTWFjL09TWFJlc291cmNlcy9hcHAvUmVzb3VyY2VzL1B5dGhvbkludGVycHJldGVyLmljbnMKKysrIGIvTWFjL09TWFJlc291cmNlcy9hcHAvUmVzb3VyY2VzL1B5dGhvbkludGVycHJldGVyLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWFjL09TWFJlc291cmNlcy9mcmFtZXdvcmsvSW5mby5wbGlzdCBiL01hYy9PU1hSZXNvdXJjZXMvZnJhbWV3b3JrL0luZm8ucGxpc3QKaW5kZXggMzRlYWNkNS4uMzAyZmY0OCAxMDA2NDQKLS0tIGEvTWFjL09TWFJlc291cmNlcy9mcmFtZXdvcmsvSW5mby5wbGlzdAorKysgYi9NYWMvT1NYUmVzb3VyY2VzL2ZyYW1ld29yay9JbmZvLnBsaXN0CkBAIC0xNywxMCArMTcsMTAgQEAKIAk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KIAk8c3RyaW5nPkZNV0s8L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+Ci0JPHN0cmluZz4yLjI8L3N0cmluZz4KKwk8c3RyaW5nPjIuNTwvc3RyaW5nPgogCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KIAk8c3RyaW5nPj8/Pz88L3N0cmluZz4KIAk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgotCTxzdHJpbmc+Mi4yPC9zdHJpbmc+CisJPHN0cmluZz4yLjU8L3N0cmluZz4KIDwvZGljdD4KIDwvcGxpc3Q+CmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5pY25zIGIvTWFjL3NjcmlwdHMvQnVpbGRBcHBsZXQuaWNucwppbmRleCAyNmVlMWMwLi5lYTAyMTRjIDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5pY25zCisrKyBiL01hYy9zY3JpcHRzL0J1aWxkQXBwbGV0LmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUucHJlLmluIGIvTWFrZWZpbGUucHJlLmluCmluZGV4IGMzYWY5NGMuLmEzMzAzNGQgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLnByZS5pbgorKysgYi9NYWtlZmlsZS5wcmUuaW4KQEAgLTEwOCwxMyArMTA4LDE3IEBACiBCVUlMREVYRT0JQEJVSUxERVhFRVhUQAogCiAjIFNob3J0IG5hbWUgYW5kIGxvY2F0aW9uIGZvciBNYWMgT1MgWCBQeXRob24gZnJhbWV3b3JrCitVTklWRVJTQUxTREs9QFVOSVZFUlNBTFNES0AKIFBZVEhPTkZSQU1FV09SSz0JQFBZVEhPTkZSQU1FV09SS0AKIFBZVEhPTkZSQU1FV09SS0RJUj0JQFBZVEhPTkZSQU1FV09SS0RJUkAKIFBZVEhPTkZSQU1FV09SS1BSRUZJWD0JQFBZVEhPTkZSQU1FV09SS1BSRUZJWEAKIFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVI9IEBQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSQAogIyBEZXBsb3ltZW50IHRhcmdldCBzZWxlY3RlZCBkdXJpbmcgY29uZmlndXJlLCB0byBiZSBjaGVja2VkCi0jIGJ5IGRpc3R1dGlscwotQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD1AQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVEAKKyMgYnkgZGlzdHV0aWxzLiBUaGUgZXhwb3J0IHN0YXRlbWVudCBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisjIGRlcGxveW1lbnQgdGFyZ2V0IGlzIGFjdGl2ZSBkdXJpbmcgYnVpbGQuCitNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9QENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVRACitARVhQT1JUX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVEBleHBvcnQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUCisKICMgT3B0aW9ucyB0byBlbmFibGUgcHJlYmluZGluZyAoZm9yIGZhc3Qgc3RhcnR1cCBwcmlvciB0byBNYWMgT1MgWCAxMC4zKQogT1RIRVJfTElCVE9PTF9PUFQ9QE9USEVSX0xJQlRPT0xfT1BUQAogCkBAIC0yMzYsNyArMjQwLDYgQEAKIAkJUHl0aG9uL2FzZGwubyBcCiAJCVB5dGhvbi9hc3QubyBcCiAJCVB5dGhvbi9ibHRpbm1vZHVsZS5vIFwKLQkJUHl0aG9uL2V4Y2VwdGlvbnMubyBcCiAJCVB5dGhvbi9jZXZhbC5vIFwKIAkJUHl0aG9uL2NvbXBpbGUubyBcCiAJCVB5dGhvbi9jb2RlY3MubyBcCkBAIC0yODYsNiArMjg5LDcgQEAKIAkJT2JqZWN0cy9jb21wbGV4b2JqZWN0Lm8gXAogCQlPYmplY3RzL2Rlc2Nyb2JqZWN0Lm8gXAogCQlPYmplY3RzL2VudW1vYmplY3QubyBcCisJCU9iamVjdHMvZXhjZXB0aW9ucy5vIFwKIAkJT2JqZWN0cy9nZW5vYmplY3QubyBcCiAJCU9iamVjdHMvZmlsZW9iamVjdC5vIFwKIAkJT2JqZWN0cy9mbG9hdG9iamVjdC5vIFwKQEAgLTM3OCw4ICszODIsMTcgQEAKICAgICAgICAgICAgICAgICAkKFJFU1NSQ0RJUikvdmVyc2lvbi5wbGlzdCBcCiAgICAgICAgICAgICAgICAgJChSRVNTUkNESVIpL0VuZ2xpc2gubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKIAkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChQWVRIT05GUkFNRVdPUktESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikKLQlsaWJ0b29sIC1vICQoTERMSUJSQVJZKSAtZHluYW1pYyAkKE9USEVSX0xJQlRPT0xfT1BUKSAkKExJQlJBUlkpIFwKLQkJQExJQlRPT0xfQ1JVRlRACisJaWYgdGVzdCAiJHtVTklWRVJTQUxTREt9IjsgdGhlbiBcCisJCSQoQ0MpIC1vICQoTERMSUJSQVJZKSAtYXJjaCBpMzg2IC1hcmNoIHBwYyAtZHluYW1pY2xpYiBcCisJCQktaXN5c3Jvb3QgIiR7VU5JVkVSU0FMU0RLfSIgXAorCQkJLWFsbF9sb2FkICQoTElCUkFSWSkgLVdsLC1zaW5nbGVfbW9kdWxlIFwKKwkJCS1pbnN0YWxsX25hbWUgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvVmVyc2lvbnMvJChWRVJTSU9OKS9QeXRob24gXAorCQkJLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkKFZFUlNJT04pIFwKKwkJCS1jdXJyZW50X3ZlcnNpb24gJChWRVJTSU9OKTsgXAorICAgICAgICBlbHNlIFwKKwkJbGlidG9vbCAtbyAkKExETElCUkFSWSkgLWR5bmFtaWMgJChPVEhFUl9MSUJUT09MX09QVCkgJChMSUJSQVJZKSBcCisJCQlATElCVE9PTF9DUlVGVEAgO1wKKwlmaQogCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAgXAogCQkkKFBZVEhPTkZSQU1FV09SS0RJUikvVmVyc2lvbnMvJChWRVJTSU9OKS9SZXNvdXJjZXMvRW5nbGlzaC5scHJvagogCSQoSU5TVEFMTF9EQVRBKSAkKFJFU1NSQ0RJUikvSW5mby5wbGlzdCBcCkBAIC01NzAsNiArNTgzLDE5IEBACiAJCS0kKFRFU1RQWVRIT04pICQoVEVTVFBST0cpICQoVEVTVE9QVFMpIC11YWxsCiAJCSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgJChURVNUT1BUUykgLXVhbGwKIAorIyAgUnVuIHRoZSB1bml0ZXN0cyBmb3IgYm90aCBhcmNoaXRlY3R1cmVzIGluIGEgVW5pdmVyc2FsIGJ1aWxkIG9uIE9TWAorIyAgTXVzdCBiZSBydW4gb24gYW4gSW50ZWwgYm94LgordGVzdHVuaXZlcnNhbDoJYWxsIHBsYXRmb3JtCisJCWlmIFsgYGFyY2hgICE9ICdpMzg2JyBdO3RoZW4gXAorCQkJZWNobyAiVGhpcyBjYW4gb25seSBiZSB1c2VkIG9uIE9TWC9pMzg2IiA7XAorCQkJZXhpdCAxIDtcCisJCWZpCisJCS1maW5kICQoc3JjZGlyKS9MaWIgLW5hbWUgJyoucHlbY29dJyAtcHJpbnQgfCB4YXJncyBybSAtZgorCQktJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAkKFRFU1RPUFRTKSAtdWFsbAorCQkkKFRFU1RQWVRIT04pICQoVEVTVFBST0cpICQoVEVTVE9QVFMpIC11YWxsCisJCSQoUlVOU0hBUkVEKSAvdXNyL2xpYmV4ZWMvb2FoL3RyYW5zbGF0ZSAuLyQoQlVJTERQWVRIT04pIC1FIC10dCAkKFRFU1RQUk9HKSAkKFRFU1RPUFRTKSAtdWFsbAorCisKICMgTGlrZSB0ZXN0YWxsLCBidXQgd2l0aCBhIHNpbmdsZSBwYXNzIG9ubHkKIGJ1aWxkYm90dGVzdDoJYWxsIHBsYXRmb3JtCiAJCSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgJChURVNUT1BUUykgLXVhbGwgLXJ3CkBAIC01OTAsNyArNjE2LDcgQEAKIAkJJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAkKE1FTVRFU1RPUFRTKQogCiAjIEluc3RhbGwgZXZlcnl0aGluZwotaW5zdGFsbDoJYWx0aW5zdGFsbCBiaW5pbnN0YWxsIG1hbmluc3RhbGwKK2luc3RhbGw6CUBGUkFNRVdPUktJTlNUQUxMRklSU1RAIGFsdGluc3RhbGwgYmluaW5zdGFsbCBtYW5pbnN0YWxsIEBGUkFNRVdPUktJTlNUQUxMTEFTVEAKIAogIyBJbnN0YWxsIGFsbW9zdCBldmVyeXRoaW5nIHdpdGhvdXQgZGlzdHVyYmluZyBwcmV2aW91cyB2ZXJzaW9ucwogYWx0aW5zdGFsbDoJYWx0YmluaW5zdGFsbCBsaWJpbnN0YWxsIGluY2xpbnN0YWxsIGxpYmFpbnN0YWxsIFwKQEAgLTgzMiw3ICs4NTgsNyBAQAogCSMgU3Vic3RpdHV0aW9uIGhhcHBlbnMgaGVyZSwgYXMgdGhlIGNvbXBsZXRlbHktZXhwYW5kZWQgQklORElSCiAJIyBpcyBub3QgYXZhaWxhYmxlIGluIGNvbmZpZ3VyZQogCXNlZCAtZSAicyxAQklORElSQCwkKEJJTkRJUiksIiA8ICQoc3JjZGlyKS9NaXNjL3B5dGhvbi1jb25maWcuaW4gPnB5dGhvbi1jb25maWcKLQkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnICQoQklORElSKS9weXRob24tY29uZmlnCisJJChJTlNUQUxMX1NDUklQVCkgcHl0aG9uLWNvbmZpZyAkKERFU1RESVIpJChCSU5ESVIpL3B5dGhvbi1jb25maWcKIAlybSBweXRob24tY29uZmlnCiAJQGlmIFsgLXMgTW9kdWxlcy9weXRob24uZXhwIC1hIFwKIAkJImBlY2hvICQoTUFDSERFUCkgfCBzZWQgJ3MvXlwoLi4uXCkuKi9cMS8nYCIgPSAiYWl4IiBdOyB0aGVuIFwKQEAgLTg3NSw4ICs5MDEsMTAgQEAKICMgc3VidGFyZ2V0cyBpbnN0YWxsIHNwZWNpZmljIHBhcnRzLiBNdWNoIG9mIHRoZSBhY3R1YWwgd29yayBpcyBvZmZsb2FkZWQgdG8KICMgdGhlIE1ha2VmaWxlIGluIE1hYy9PU1gKICMKLWZyYW1ld29ya2luc3RhbGw6IGZyYW1ld29ya2luc3RhbGxmcmFtZXdvcmsgXAotCWZyYW1ld29ya2luc3RhbGxhcHBzIGZyYW1ld29ya2luc3RhbGx1bml4dG9vbHMKKyMKKyMgVGhpcyB0YXJnZXQgaXMgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJsaXR5LCBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24KKyMgaGFkbid0IGludGVncmF0ZWQgZnJhbWV3b3JrIGluc3RhbGxhdGlvbiBpbiB0aGUgbm9ybWFsIGluc3RhbGwgcHJvY2Vzcy4KK2ZyYW1ld29ya2luc3RhbGw6IGluc3RhbGwKIAogIyBPbiBpbnN0YWxsLCB3ZSByZS1tYWtlIHRoZSBmcmFtZXdvcmsKICMgc3RydWN0dXJlIGluIHRoZSBpbnN0YWxsIGxvY2F0aW9uLCAvTGlicmFyeS9GcmFtZXdvcmtzLyBvciB0aGUgYXJndW1lbnQgdG8KQEAgLTkxMiwyNyArOTQwLDIwIEBACiAKICMgVGhpcyBpbnN0YWxscyBNYWMvTGliIGludG8gdGhlIGZyYW1ld29yawogZnJhbWV3b3JraW5zdGFsbG1hY2xpYjoKLQkkKE1BS0UpIC1mICQoc3JjZGlyKS9NYWMvT1NYL01ha2VmaWxlIGluc3RhbGxtYWNzdWJ0cmVlIFwKLQkJJChSVU5TSEFSRUQpIEJVSUxEUFlUSE9OPS4vJChCVUlMRFBZVEhPTikgRElSTU9ERT0kKERJUk1PREUpIEZJTEVNT0RFPSQoRklMRU1PREUpIFwKLQkJc3JjZGlyPSQoc3JjZGlyKSBidWlsZGRpcj0uIHByZWZpeD0kKHByZWZpeCkgTElCREVTVD0kKExJQkRFU1QpIFwKLQkJREVTVERJUj0kKERFU1RESVIpCisJY2QgTWFjL09TWCAmJiAkKE1BS0UpIGluc3RhbGxtYWNzdWJ0cmVlIERFU1RESVI9IiQoREVTVERJUikiCiAKICMgVGhpcyBpbnN0YWxscyB0aGUgSURFLCB0aGUgTGF1bmNoZXIgYW5kIG90aGVyIGFwcHMgaW50byAvQXBwbGljYXRpb25zCiBmcmFtZXdvcmtpbnN0YWxsYXBwczoKLQkkKE1BS0UpIC1mICQoc3JjZGlyKS9NYWMvT1NYL01ha2VmaWxlIGluc3RhbGxhcHBzIFwKLQkJJChSVU5TSEFSRUQpIEJVSUxEUFlUSE9OPS4vJChCVUlMRFBZVEhPTikgRElSTU9ERT0kKERJUk1PREUpIEZJTEVNT0RFPSQoRklMRU1PREUpIFwKLQkJc3JjZGlyPSQoc3JjZGlyKSBidWlsZGRpcj0uIERFU1RESVI9JChERVNURElSKSBwcmVmaXg9JChwcmVmaXgpCisJY2QgTWFjL09TWCAmJiAkKE1BS0UpIGluc3RhbGxhcHBzIERFU1RESVI9IiQoREVTVERJUikiCiAKICMgVGhpcyBpbnN0YWxsIHRoZSB1bml4IHB5dGhvbiBhbmQgcHl0aG9udyB0b29scyBpbiAvdXNyL2xvY2FsL2JpbgogZnJhbWV3b3JraW5zdGFsbHVuaXh0b29sczoKLQkkKE1BS0UpIC1mICQoc3JjZGlyKS9NYWMvT1NYL01ha2VmaWxlIGluc3RhbGx1bml4dG9vbHMgXAotCQlESVJNT0RFPSQoRElSTU9ERSkgRklMRU1PREU9JChGSUxFTU9ERSkgXAotCQlzcmNkaXI9JChzcmNkaXIpIGJ1aWxkZGlyPS4gREVTVERJUj0kKERFU1RESVIpIHByZWZpeD0kKHByZWZpeCkKKwljZCBNYWMvT1NYICYmICQoTUFLRSkgaW5zdGFsbHVuaXh0b29scyBERVNURElSPSIkKERFU1RESVIpIgogCiAjIFRoaXMgaW5zdGFsbHMgdGhlIERlbW9zIGFuZCBUb29scyBpbnRvIHRoZSBhcHBsaWNhdGlvbnMgZGlyZWN0b3J5LgogIyBJdCBpcyBub3QgcGFydCBvZiBhIG5vcm1hbCBmcmFtZXdvcmtpbnN0YWxsCiBmcmFtZXdvcmtpbnN0YWxsZXh0cmFzOgotCSQoTUFLRSkgLWYgJChzcmNkaXIpL01hYy9PU1gvTWFrZWZpbGUgaW5zdGFsbGV4dHJhcyBcCisJJChNQUtFKSAtZiBNYWMvT1NYL01ha2VmaWxlIGluc3RhbGxleHRyYXMgXAogCQkkKFJVTlNIQVJFRCkgQlVJTERQWVRIT049Li8kKEJVSUxEUFlUSE9OKSBESVJNT0RFPSQoRElSTU9ERSkgRklMRU1PREU9JChGSUxFTU9ERSkgXAogCQlzcmNkaXI9JChzcmNkaXIpIGJ1aWxkZGlyPS4gREVTVERJUj0kKERFU1RESVIpCiAKZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCBhODI0YTg2Li5lMzBjYzYxIDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0zMyw2ICszMyw3IEBACiBMdWlnaSBCYWxsYWJpbwogTWljaGFlbCBKLiBCYXJiZXIKIENocmlzIEJhcmtlcgorUXVlbnRpbiBCYXJuZXMKIENlc2FyIEVkdWFyZG8gQmFycm9zCiBEZXMgQmFycnkKIFVsZiBCYXJ0ZWx0CkBAIC0xNjYsNiArMTY3LDcgQEAKIFBhdWwgRHVib2lzCiBRdWlubiBEdW5rYW4KIFJvYmluIER1bm4KK0x1a2UgRHVuc3RhbgogQW5keSBEdXN0bWFuCiBHYXJ5IER1emFuCiBFdWdlbmUgRHZ1cmVjaGVuc2tpCkBAIC0xODgsNiArMTkwLDcgQEAKIFN0ZXBoZW4gRCBFdmFucwogVGltIEV2ZXJldHQKIFBhdWwgRXZlcml0dAorRGF2aWQgRXZlcmx5CiBHcmVnIEV3aW5nCiBNYXJ0aWpuIEZhYXNzZW4KIEFuZHJlYXMgRmFlcmJlcgpAQCAtMzEzLDYgKzMxNiw3IEBACiBGbGVtbWluZyBLauZyIEplbnNlbgogSmliYQogT3JqYW4gSm9oYW5zZW4KK0dyZWdvcnkgSy4gSm9obnNvbgogU2ltb24gSm9obnN0b24KIEV2YW4gSm9uZXMKIFJpY2hhcmQgSm9uZXMKQEAgLTM4Niw2ICszOTAsNyBAQAogTWFyayBMdXR6CiBKaW0gTHluY2gKIE1pa2FlbCBMeW5ndmlnCitBbGFuIE1jSW50eXJlCiBBbmRyZXcgSSBNYWNJbnR5cmUKIFRpbSBNYWNLZW56aWUKIE5pY2sgTWFjbGFyZW4KQEAgLTQ1Myw2ICs0NTgsNyBAQAogUnVzc2VsIE93ZW4KIE1pa2UgUGFsbAogVG9kZCBSLiBQYWxtZXIKK0phbiBQYWx1cwogQWxleGFuZHJlIFBhcmVudGVhdQogRGFuIFBhcmlzaWVuCiBIYXJyaSBQYXNhbmVuCkBAIC01NDUsNiArNTUxLDcgQEAKIEJhcnJ5IFNjb3R0CiBTdGV2ZW4gU2NvdHQKIE5pY2sgU2VpZGVubWFuCivFvWlnYSBTZWlsbmFjaAogRnJlZCBTZWxscwogSml3b24gU2VvCiBEZW5pcyBTZXZlcnNvbgpAQCAtNjU2LDYgKzY2Myw3IEBACiBGcmFuayBXaWxsaXNvbgogR3JlZyBWLiBXaWxzb24KIEpvZHkgV2luc3RvbgorQ29sbGluIFdpbnRlcgogRGlrIFdpbnRlcgogQmxha2UgV2ludG9uCiBKZWFuLUNsYXVkZSBXaXBwbGVyCmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggM2UxNDdmYi4uN2ExNDM2MyAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtNiw2NSArNiw2IEBACiAKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMwMDA/CiA9PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qUmVsZWFzZSBkYXRlOiBYWC1YWFgtMjAwWCoKLQotVE8gRE8KLS0tLS0tCi0KLS0gU2VlIFBFUCAzMDAwLgotCi0tIFRlc3QgbWVyZ2luZyBjZXJ0YWluIGNoYW5nZXMgZnJvbSB0aGUgMi41IEhFQUQgY29kZS4KLQotLSBXZWVkIHJlYWxseSBvbGQvd2VpcmQgc3R1ZmYgZnJvbSB0aGUgbGlicmFyeS4KLQotLSBVbmlmeSByYW5nZSgpIGFuZCB4cmFuZ2UoKS4KLQotLSBSZXZhbXAgdGhlIGRpY3QgQVBJOiBrZXlzKCksIHZhbHVlcygpLCBpdGVtcygpIHJldHVybiBpdGVyYXRvcnMsIGV0Yy4KLQotLSBBZGQgdGhlIGJ5dGVzIHR5cGUuCi0KLS0gUmV3b3JrIHRoZSBzdGFuZGFyZCBJL08gbGlicmFyeSB0byB1c2UgYnl0ZXMgZm9yIGJpbmFyeSBmaWxlcy4KLQotLSBNYWtlIHN0cmluZ3MgYWxsIFVuaWNvZGUuCi0KLS0gR2V0IHJpZCBvZiBjbGFzc2ljIGNsYXNzIGltcGxlbWVudGF0aW9uLgotCi0tIEdldCByaWQgb2YgdmFyaW91cyBjb21wYXRpYmlsaXR5LXJlbGF0ZWQgZmxhZ3MgKGUuZy4gZGl2aXNpb24gZmxhZ3MpLgotCi1Db3JlIGFuZCBCdWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBfX2NvZXJjZV9fIGhhcyBiZWVuIHJlbW92ZWQuCi0KLS0gQ2xhc3NpYyBjbGFzc2VzIGFyZSBhIHRoaW5nIG9mIHRoZSBwYXN0LiAgQWxsIGNsYXNzZXMgYXJlIG5ldyBzdHlsZS4KLQotLSBFeGNlcHRpb25zICptdXN0KiBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uLgotCi0tIEludGVnZXIgZGl2aXNpb24gYWx3YXlzIHJldHVybnMgYSBmbG9hdC4gIFRoZSAtUSBvcHRpb24gaXMgbm8gbW9yZS4KLSAgQWxsIHRoZSBmb2xsb3dpbmcgYXJlIGdvbmU6Ci0gICAqIFB5TnVtYmVyX0RpdmlkZSBhbmQgUHlOdW1iZXJfSW5QbGFjZURpdmlkZQotICAgKiBfX2Rpdl9fLCBfX3JkaXZfXywgYW5kIF9faWRpdl9fCi0gICAqIG5iX2RpdmlkZSwgbmJfaW5wbGFjZV9kaXZpZGUKLSAgICogb3BlcmF0b3IuZGl2LCBvcGVyYXRvci5pZGl2LCBvcGVyYXRvci5fX2Rpdl9fLCBvcGVyYXRvci5fX2lkaXZfXwotICAoT25seSBfX3RydWVkaXZfXyBhbmQgX19mbG9vcmRpdl9fIHJlbWFpbiwgbm90IHN1cmUgaG93IHRvIGhhbmRsZSB0aGVtCi0gICBpZiB3ZSB3YW50IHRvIHJlLXVzZSBfX2Rpdl9fIGFuZCBmcmllbmRzLiAgSWYgd2UgZG8sIGl0IHdpbGwgbWFrZQotICAgaXQgaGFyZGVyIHRvIHdyaXRlIGNvZGUgZm9yIGJvdGggMi54IGFuZCAzLnguKQotCi0tICdhcycgYW5kICd3aXRoJyBhcmUga2V5d29yZHMuCi0KLS0gQWJzb2x1dGUgaW1wb3J0IGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciAnaW1wb3J0IGZvbycgZXRjLgotCi0tIGlucHV0KCksIHJhd19pbnB1dCgpIGFuZCBhcHBseSgpIGFyZSBnb25lLgotCi0tIFJlbW92ZWQgc3RhdGljZm9yd2FyZCBhbmQgc3RhdGljaGVyZSBtYWNyb3MuCi0KLUV4dGVuc2lvbiBNb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0tLQotCi1MaWJyYXJ5Ci0tLS0tLS0tCi0KIEJ1aWxkCiAtLS0tLQogCmRpZmYgLS1naXQgYS9NaXNjL1JQTS9weXRob24tMi41LnNwZWMgYi9NaXNjL1JQTS9weXRob24tMi41LnNwZWMKaW5kZXggMzUxNTg1Ni4uZTA1MDQ1NCAxMDA2NDQKLS0tIGEvTWlzYy9SUE0vcHl0aG9uLTIuNS5zcGVjCisrKyBiL01pc2MvUlBNL3B5dGhvbi0yLjUuc3BlYwpAQCAtMzMsNyArMzMsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICVkZWZpbmUgbmFtZSBweXRob24KLSVkZWZpbmUgdmVyc2lvbiAyLjVhMQorJWRlZmluZSB2ZXJzaW9uIDIuNWEyCiAlZGVmaW5lIGxpYnZlcnMgMi41CiAlZGVmaW5lIHJlbGVhc2UgMXB5ZG90b3JnCiAlZGVmaW5lIF9fcHJlZml4IC91c3IKZGlmZiAtLWdpdCBhL01pc2MvVmltL3B5dGhvbi52aW0gYi9NaXNjL1ZpbS9weXRob24udmltCmluZGV4IGEzMWZhMzAuLjk3MTEwNzYgMTAwNjQ0Ci0tLSBhL01pc2MvVmltL3B5dGhvbi52aW0KKysrIGIvTWlzYy9WaW0vcHl0aG9uLnZpbQpAQCAtODYsOSArODYsOSBAQAogICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgVW5pY29kZUVycm9yIFVuaWNvZGVFbmNvZGVFcnJvcgogICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgRmxvYXRpbmdQb2ludEVycm9yIFJlZmVyZW5jZUVycm9yIE5hbWVFcnJvcgogICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgT3ZlcmZsb3dXYXJuaW5nIElPRXJyb3IgU3ludGF4RXJyb3IKLSAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIEZ1dHVyZVdhcm5pbmcgU3lzdGVtRXhpdCBFeGNlcHRpb24gRU9GRXJyb3IKLSAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIFN0YW5kYXJkRXJyb3IgVmFsdWVFcnJvciBUYWJFcnJvciBLZXlFcnJvcgotICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgWmVyb0RpdmlzaW9uRXJyb3IgU3lzdGVtRXJyb3IKKyAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIEZ1dHVyZVdhcm5pbmcgSW1wb3J0V2FybmluZyBTeXN0ZW1FeGl0CisgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBFeGNlcHRpb24gRU9GRXJyb3IgU3RhbmRhcmRFcnJvciBWYWx1ZUVycm9yCisgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBUYWJFcnJvciBLZXlFcnJvciBaZXJvRGl2aXNpb25FcnJvciBTeXN0ZW1FcnJvcgogICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgVW5pY29kZURlY29kZUVycm9yIEluZGVudGF0aW9uRXJyb3IKICAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIEFzc2VydGlvbkVycm9yIFR5cGVFcnJvciBJbmRleEVycm9yCiAgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBSdW50aW1lV2FybmluZyBLZXlib2FyZEludGVycnVwdCBVc2VyV2FybmluZwpkaWZmIC0tZ2l0IGEvTWlzYy9WaW0vc3ludGF4X3Rlc3QucHkgYi9NaXNjL1ZpbS9zeW50YXhfdGVzdC5weQppbmRleCBhNTMwYTI1Li5jY2M3ZjMwIDEwMDY0NAotLS0gYS9NaXNjL1ZpbS9zeW50YXhfdGVzdC5weQorKysgYi9NaXNjL1ZpbS9zeW50YXhfdGVzdC5weQpAQCAtMTksOCArMTksNiBAQAogZGVmIGZvbygpOiAgIyBmdW5jdGlvbiBkZWZpbml0aW9uCiAgICAgcmV0dXJuIFtdCiBjbGFzcyBCYXIob2JqZWN0KTogICMgQ2xhc3MgZGVmaW5pdGlvbgotICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICBwYXNzCiAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKZGlmZiAtLWdpdCBhL01pc2MvVmltL3ZpbXJjIGIvTWlzYy9WaW0vdmltcmMKaW5kZXggMmQ3MDY5OS4uMmI1YmY2NiAxMDA2NDQKLS0tIGEvTWlzYy9WaW0vdmltcmMKKysrIGIvTWlzYy9WaW0vdmltcmMKQEAgLTE5LDggKzE5LDkgQEAKICIgTnVtYmVyIG9mIHNwYWNlcyB0byB1c2UgZm9yIGFuIGluZGVudC4KICIgVGhpcyB3aWxsIGFmZmVjdCBDdHJsLVQgYW5kICdhdXRvaW5kZW50Jy4KICIgUHl0aG9uOiA0IHNwYWNlcwotIiBDOiA0IHNwYWNlcwotYXUgQnVmUmVhZCxCdWZOZXdGaWxlICoucHksKnB5dywqLmMsKi5oIHNldCBzaGlmdHdpZHRoPTQKKyIgQzogdGFiICg4IHNwYWNlcykKK2F1IEJ1ZlJlYWQsQnVmTmV3RmlsZSAqLnB5LCpweXcgc2V0IHNoaWZ0d2lkdGg9NAorYXUgQnVmUmVhZCxCdWZOZXdGaWxlICouYywqLmggc2V0IHNoaWZ0d2lkdGg9NAogCiAiIE51bWJlciBvZiBzcGFjZXMgdGhhdCBhIHByZS1leGlzdGluZyB0YWIgaXMgZXF1YWwgdG8uCiAiIEZvciB0aGUgYW1vdW50IG9mIHNwYWNlIHVzZWQgZm9yIGEgbmV3IHRhYiB1c2Ugc2hpZnR3aWR0aC4KZGlmZiAtLWdpdCBhL01pc2MvZGV2ZWxvcGVycy50eHQgYi9NaXNjL2RldmVsb3BlcnMudHh0CmluZGV4IGZmODQ3MGUuLmMyYzIyNzUgMTAwNjQ0Ci0tLSBhL01pc2MvZGV2ZWxvcGVycy50eHQKKysrIGIvTWlzYy9kZXZlbG9wZXJzLnR4dApAQCAtMTcsNiArMTcsMzYgQEAKIFBlcm1pc3Npb25zIEhpc3RvcnkKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLSAyMDA2IFN1bW1lciBvZiBDb2RlIGVudHJpZXM6IE1hdHQgRmxlbWluZyB3YXMgYWRkZWQgb24gMjUgTWF5IDIwMDYKKyAgYnkgQU1LOyBoZSdsbCBiZSB3b3JraW5nIG9uIGVuaGFuY2luZyB0aGUgUHl0aG9uIGRlYnVnZ2VyLiAgSmFja2lseW4KKyAgSG94d29ydGggd2FzIGFkZGVkIG9uIDI1IE1heSAyMDA1IGJ5IEFNSzsgc2hlJ2xsIGJlIGFkZGluZyBsb2dnaW5nCisgIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiAgU29DIGRldmVsb3BlcnMgYXJlIGV4cGVjdGVkIHRvIHdvcmsKKyAgcHJpbWFyaWx5IGluIG5vbmRpc3Qvc2FuZGJveCBvciBvbiBhIGJyYW5jaCBvZiB0aGVpciBvd24sIGFuZCB3aWxsCisgIGhhdmUgdGhlaXIgd29yayByZXZpZXdlZCBiZWZvcmUgY2hhbmdlcyBhcmUgYWNjZXB0ZWQgaW50byB0aGUgdHJ1bmsuCisKKy0gU1ZOIGFjY2VzcyBncmFudGVkIHRvIHRoZSAiTmVlZCBmb3IgU3BlZWQiIEljZWxhbmQgc3ByaW50IGF0dGVuZGVlcywKKyAgYmV0d2VlbiBNYXkgMTcgYW5kIDIxLCAyMDA2LCBieSBUaW0gUGV0ZXJzLiAgQWxsIHdvcmsgaXMgdG8gYmUgZG9uZQorICBpbiBuZXcgc2FuZGJveCBwcm9qZWN0cyBvciBvbiBuZXcgYnJhbmNoZXMsIHdpdGggbWVyZ2luZyB0byB0aGUKKyAgdHJ1bmsgYXMgYXBwcm92ZWQ6CisKKyAgQW5kcmV3IERhbGtlCisgIENocmlzdGlhbiBUaXNtZXIKKyAgSmFjayBEaWVkZXJpY2gKKyAgSm9obiBCZW5lZGlrdHNzb24KKyAgS3Jpc3Rq4W4gVi4gSvNuc3NvbgorICBNYXJ0aW4gQmxhaXMKKyAgUmljaGFyZCBFbXNsaWUKKyAgUmljaGFyZCBKb25lcworICBSdW5hciBQZXR1cnNzb24KKyAgU3RldmUgSG9sZGVuCisgIFJpY2hhcmQgTS4gVGV3CisKKy0gU3RldmVuIEJldGhhcmQgd2FzIGdpdmVuIFNWTiBhY2Nlc3Mgb24gMjcgQXByIDIwMDYgYnkgREpHLCBmb3IgUEVQCisgIHVwZGF0ZSBhY2Nlc3MuCisKKy0gVGFsaW4gd2FzIGdpdmVuIFNWTiBhY2Nlc3Mgb24gMjcgQXByIDIwMDYgYnkgREpHLCBmb3IgUEVQIHVwZGF0ZQorICBhY2Nlc3MuCisKIC0gR2VvcmdlIFlvc2hpZGEgKFNGIG5hbWUgInF1aXZlciIpIGFkZGVkIHRvIHRoZSBTb3VyY2VGb3JnZSBQeXRob24KICAgcHJvamVjdCAxNCBBcHIgMjAwNiwgYnkgVGltIFBldGVycywgYXMgYSB0cmFja2VyIGFkbWluLiAgU2VlCiAgIGNvbnRlbXBvcmFuZW91cyBweXRob24tY2hlY2tpbnMgdGhyZWFkIHdpdGggdGhlIHVubGlrZWx5IFN1YmplY3Q6CkBAIC0zNCw3ICs2NCw3IEBACiAKIC0gQWRkZWQgdHdvIG5ldyBkZXZlbG9wZXJzIGZvciB0aGUgU3VtbWVyIG9mIENvZGUgcHJvamVjdC4gOCBKdWx5IDIwMDUKICAgYnkgUkRILiAgQW5kcmV3IEt1Y2hsaW5nIHdpbGwgYmUgbWVudG9yaW5nIEdyZWdvcnkgSyBKb2huc29uIGZvciBhCi0gIHByb2plY3QgdG8gZW5jaGFuY2UgbWFpbGJveC4gIEJyZXR0IENhbm5vbiByZXF1ZXN0ZWQgYWNjZXNzIGZvciBGbG92aXMKKyAgcHJvamVjdCB0byBlbmhhbmNlIG1haWxib3guICBCcmV0dCBDYW5ub24gcmVxdWVzdGVkIGFjY2VzcyBmb3IgRmxvdmlzCiAgIEJydXlub29naGUgKHNpcm9sZikgdG8gd29yayBvbiBwc3RhdHMsIHByb2ZpbGUsIGFuZCBob3RzaG90LiAgQm90aCB1c2VycwogICBhcmUgZXhwZWN0ZWQgdG8gd29yayBwcmltYXJpbHkgaW4gbm9uZGlzdC9zYW5kYm94IGFuZCBoYXZlIHRoZWlyIHdvcmsKICAgcmV2aWV3ZWQgYmVmb3JlIG1ha2luZyB1cGRhdGVzIHRvIGFjdGl2ZSBjb2RlLgpAQCAtMTAyLDMgKzEzMiw0IEBACiBOQ046ICBOZWFsIE5vcndpdHoKIFJESDogIFJheW1vbmQgSGV0dGluZ2VyCiBUR1A6ICBUaW0gUGV0ZXJzCitESkc6ICBEYXZpZCBHb29kZ2VyCmRpZmYgLS1naXQgYS9Nb2R1bGVzL1NldHVwLmRpc3QgYi9Nb2R1bGVzL1NldHVwLmRpc3QKaW5kZXggNDljODQyNS4uMWIyNTAyZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9TZXR1cC5kaXN0CisrKyBiL01vZHVsZXMvU2V0dXAuZGlzdApAQCAtMTY3LDcgKzE2Nyw3IEBACiAjYXJyYXkgYXJyYXltb2R1bGUuYwkjIGFycmF5IG9iamVjdHMKICNjbWF0aCBjbWF0aG1vZHVsZS5jICMgLWxtICMgY29tcGxleCBtYXRoIGxpYnJhcnkgZnVuY3Rpb25zCiAjbWF0aCBtYXRobW9kdWxlLmMgIyAtbG0gIyBtYXRoIGxpYnJhcnkgZnVuY3Rpb25zLCBlLmcuIHNpbigpCi0jc3RydWN0IHN0cnVjdG1vZHVsZS5jCSMgYmluYXJ5IHN0cnVjdHVyZSBwYWNraW5nL3VucGFja2luZworI19zdHJ1Y3QgX3N0cnVjdC5jCSMgYmluYXJ5IHN0cnVjdHVyZSBwYWNraW5nL3VucGFja2luZwogI3RpbWUgdGltZW1vZHVsZS5jICMgLWxtICMgdGltZSBvcGVyYXRpb25zIGFuZCB2YXJpYWJsZXMKICNvcGVyYXRvciBvcGVyYXRvci5jCSMgb3BlcmF0b3IuYWRkKCkgYW5kIHNpbWlsYXIgZ29vZGllcwogI193ZWFrcmVmIF93ZWFrcmVmLmMJIyBiYXNpYyB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYyBiL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCmluZGV4IDM5YjQ0M2IuLmQ4ZDIzYzQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAogc3RhdGljCiBQeU9iamVjdCAqY29kZWNfdHVwbGUoUHlPYmplY3QgKnVuaWNvZGUsCi0JCSAgICAgIGludCBsZW4pCisJCSAgICAgIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5T2JqZWN0ICp2LCp3OwogCkBAIC0xODEsNyArMTgxLDcgQEAKIAlyZXR1cm4gTlVMTDsKICAgICB9CiAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LDAsdW5pY29kZSk7Ci0gICAgdyA9IFB5SW50X0Zyb21Mb25nKGxlbik7CisgICAgdyA9IFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CiAgICAgaWYgKHcgPT0gTlVMTCkgewogCVB5X0RFQ1JFRih2KTsKIAlyZXR1cm4gTlVMTDsKQEAgLTIxMyw3ICsyMTMsNyBAQAogCVB5T2JqZWN0ICpzdHI7CiAJY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAljaGFyICpidWY7Ci0JaW50IGxlbjsKKwlQeV9zc2l6ZV90IGxlbjsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8ejplc2NhcGVfZW5jb2RlIiwKIAkJCSAgICAgICZQeVN0cmluZ19UeXBlLCAmc3RyLCAmZXJyb3JzKSkKQEAgLTMxOSwxMiArMzE5LDExIEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3x6aTp1dGZfMTZfZGVjb2RlIiwKIAkJCSAgJmRhdGEsICZzaXplLCAmZXJyb3JzLCAmZmluYWwpKQogCXJldHVybiBOVUxMOwotICAgIC8qIFhYWCBXaHkgaXMgY29uc3VtZWQgaW5pdGlhbGl6ZWQgdG8gc2l6ZT8gbXZsICovCiAgICAgaWYgKHNpemUgPCAwKSB7CiAJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgYXJndW1lbnQiKTsKIAkgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGNvbnN1bWVkID0gc2l6ZTsKKyAgICBjb25zdW1lZCA9IHNpemU7IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKGRhdGEsIHNpemUsIGVycm9ycywgJmJ5dGVvcmRlciwKIAkJCQkJICAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKQEAgLTM0OCwxMiArMzQ3LDExIEBACiAJCQkgICZkYXRhLCAmc2l6ZSwgJmVycm9ycywgJmZpbmFsKSkKIAlyZXR1cm4gTlVMTDsKIAotICAgIC8qIFhYWCBXaHkgaXMgY29uc3VtZWQgaW5pdGlhbGl6ZWQgdG8gc2l6ZT8gbXZsICovCiAgICAgaWYgKHNpemUgPCAwKSB7CiAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBhcmd1bWVudCIpOwogICAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBjb25zdW1lZCA9IHNpemU7CisgICAgY29uc3VtZWQgPSBzaXplOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bChkYXRhLCBzaXplLCBlcnJvcnMsCiAJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQpAQCAtMzc3LDEyICszNzUsMTEgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjfHppOnV0Zl8xNl9iZV9kZWNvZGUiLAogCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMsICZmaW5hbCkpCiAJcmV0dXJuIE5VTEw7Ci0gICAgLyogWFhYIFdoeSBpcyBjb25zdW1lZCBpbml0aWFsaXplZCB0byBzaXplPyBtdmwgKi8KICAgICBpZiAoc2l6ZSA8IDApIHsKICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIGFyZ3VtZW50Iik7CiAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGNvbnN1bWVkID0gc2l6ZTsKKyAgICBjb25zdW1lZCA9IHNpemU7IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKGRhdGEsIHNpemUsIGVycm9ycywKIAkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCkBAIC00MTMsMTIgKzQxMCwxMSBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN8emlpOnV0Zl8xNl9leF9kZWNvZGUiLAogCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpCiAJcmV0dXJuIE5VTEw7Ci0gICAgLyogWFhYIFdoeSBpcyBjb25zdW1lZCBpbml0aWFsaXplZCB0byBzaXplPyBtdmwgKi8KICAgICBpZiAoc2l6ZSA8IDApIHsKIAkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBhcmd1bWVudCIpOwogCSAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgY29uc3VtZWQgPSBzaXplOworICAgIGNvbnN1bWVkID0gc2l6ZTsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoZGF0YSwgc2l6ZSwgZXJyb3JzLCAmYnl0ZW9yZGVyLAogCQkJCQkgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKICAgICBpZiAodW5pY29kZSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3N2LmMgYi9Nb2R1bGVzL19jc3YuYwppbmRleCA0NzA0YzE2Li5hMzQxZWI0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jc3YuYworKysgYi9Nb2R1bGVzL19jc3YuYwpAQCAtMTEwNCw2ICsxMTA0LDggQEAKIAljaGFyICp0ZXJtaW5hdG9yOwogCiAJdGVybWluYXRvcl9sZW4gPSBQeVN0cmluZ19TaXplKHNlbGYtPmRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsKKwlpZiAodGVybWluYXRvcl9sZW4gPT0gLTEpCisJCXJldHVybiAwOwogCiAJLyogZ3JvdyByZWNvcmQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwogCWlmICgham9pbl9jaGVja19yZWNfc2l6ZShzZWxmLCBzZWxmLT5yZWNfbGVuICsgdGVybWluYXRvcl9sZW4pKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKaW5kZXggZTZkNmFhNC4uZWFhM2NlZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCkBAIC0xMjIzLDYgKzEyMjMsMTkgQEAKIAkJCXJldHVybiB2YWx1ZTsKIAkJfQogCX0KKy8qIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKwlpZiAoQ0Z1bmNQdHJPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisJCVB5Q0FyZ09iamVjdCAqcGFyZzsKKwkJQ0Z1bmNQdHJPYmplY3QgKmZ1bmM7CisJCWZ1bmMgPSAoQ0Z1bmNQdHJPYmplY3QgKil2YWx1ZTsKKwkJcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisJCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworCQlwYXJnLT50YWcgPSAnUCc7CisJCVB5X0lOQ1JFRih2YWx1ZSk7CisJCXBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopZnVuYy0+Yl9wdHI7CisJCXBhcmctPm9iaiA9IHZhbHVlOworCQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKKwl9CiAvKiBjX2NoYXJfcCwgY193Y2hhcl9wICovCiAJc3RnZCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwogCWlmIChzdGdkICYmIENEYXRhT2JqZWN0X0NoZWNrKHZhbHVlKSAmJiBzdGdkLT5wcm90byAmJiBQeVN0cmluZ19DaGVjayhzdGdkLT5wcm90bykpIHsKQEAgLTIxNzIsNyArMjE4NSw3IEBACiAJCSAgb25seSBpdCdzIG9iamVjdCBsaXN0LiAgU28gd2UgY3JlYXRlIGEgdHVwbGUsIGNvbnRhaW5pbmcKIAkJICBiX29iamVjdHMgbGlzdCBQTFVTIHRoZSBhcnJheSBpdHNlbGYsIGFuZCByZXR1cm4gdGhhdCEKIAkJKi8KLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTykiLCBrZWVwLCB2YWx1ZSk7CisJCXJldHVybiBQeVR1cGxlX1BhY2soMiwga2VlcCwgdmFsdWUpOwogCX0KIAlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogCQkgICAgICJpbmNvbXBhdGlibGUgdHlwZXMsICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLApAQCAtNDQwNSw2ICs0NDE4LDggQEAKIAogCWlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQogCQlyZXR1cm4gMTsKKwlpZiAoQ0Z1bmNQdHJUeXBlT2JqZWN0X0NoZWNrKGFyZykpCisJCXJldHVybiAxOwogCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwogCWlmIChkaWN0KSB7CiAJCWlmIChQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKQEAgLTQ1NjQsNyArNDU3OSw3IEBACiAjZW5kaWYKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0NERUNMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfQ0RFQ0wpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1BZVEhPTkFQSSIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1BZVEhPTkFQSSkpOwotCVB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX3ZlcnNpb25fXyIsICIwLjkuOS40Iik7CisJUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjAuOS45LjYiKTsKIAogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX21lbW1vdmVfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1tb3ZlKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtc2V0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIobWVtc2V0KSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKaW5kZXggYWQzYjA0Ny4uYjEwZDZmZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYwpAQCAtOTYsNiArOTYsMTEgQEAKIAlyZXR1cm4gZHN0OwogfQogCitFWFBPUlQodm9pZClteV9mcmVlKHZvaWQgKnB0cikKK3sKKwlmcmVlKHB0cik7Cit9CisKICNpZmRlZiBIQVZFX1dDSEFSX0gKIEVYUE9SVCh3Y2hhcl90ICopIG15X3djc2R1cCh3Y2hhcl90ICpzcmMpCiB7CkBAIC0xOTksMTEgKzIwNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVCh2b2lkKSBteV9mcmVlKHZvaWQgKnApCi17Ci0JcHJpbnRmKCJteV9mcmVlIGdvdCAlcFxuIiwgcCk7Ci19Ci0KIHR5cGVkZWYgc3RydWN0IHsKIAljaGFyICpuYW1lOwogCWNoYXIgKnZhbHVlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQppbmRleCBjMWU1Y2Q0Li45ZmRkNjU0IDEwMDc1NQotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQpAQCAtMzEwLDcgKzMxMCw3IEBACiAjIGluY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmIgogCi1hY19zdWJzdF92YXJzPSdTSEVMTCBQQVRIX1NFUEFSQVRPUiBQQUNLQUdFX05BTUUgUEFDS0FHRV9UQVJOQU1FIFBBQ0tBR0VfVkVSU0lPTiBQQUNLQUdFX1NUUklORyBQQUNLQUdFX0JVR1JFUE9SVCBleGVjX3ByZWZpeCBwcmVmaXggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIgYnVpbGRfYWxpYXMgaG9zdF9hbGlhcyB0YXJnZXRfYWxpYXMgREVGUyBFQ0hPX0MgRUNIT19OIEVDSE9fVCBMSUJTIGJ1aWxkIGJ1aWxkX2NwdSBidWlsZF92ZW5kb3IgYnVpbGRfb3MgaG9zdCBob3N0X2NwdSBob3N0X3ZlbmRvciBob3N0X29zIHRhcmdldCB0YXJnZXRfY3B1IHRhcmdldF92ZW5kb3IgdGFyZ2V0X29zIENDIGFjX2N0X0NDIEVYRUVYVCBPQkpFWFQgQ0ZMQUdTIENQUCBDUFBGTEFHUyBFR1JFUCBBTExPQ0EgSEFWRV9MT05HX0RPVUJMRSBUQVJHRVQgVEFSR0VURElSIExJQk9CSlMgTFRMSUJPQkpTJworYWNfc3Vic3RfdmFycz0nU0hFTEwgUEFUSF9TRVBBUkFUT1IgUEFDS0FHRV9OQU1FIFBBQ0tBR0VfVEFSTkFNRSBQQUNLQUdFX1ZFUlNJT04gUEFDS0FHRV9TVFJJTkcgUEFDS0FHRV9CVUdSRVBPUlQgZXhlY19wcmVmaXggcHJlZml4IHByb2dyYW1fdHJhbnNmb3JtX25hbWUgYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyIGJ1aWxkX2FsaWFzIGhvc3RfYWxpYXMgdGFyZ2V0X2FsaWFzIERFRlMgRUNIT19DIEVDSE9fTiBFQ0hPX1QgTElCUyBidWlsZCBidWlsZF9jcHUgYnVpbGRfdmVuZG9yIGJ1aWxkX29zIGhvc3QgaG9zdF9jcHUgaG9zdF92ZW5kb3IgaG9zdF9vcyB0YXJnZXQgdGFyZ2V0X2NwdSB0YXJnZXRfdmVuZG9yIHRhcmdldF9vcyBDQyBhY19jdF9DQyBFWEVFWFQgT0JKRVhUIENGTEFHUyBDUFAgQ1BQRkxBR1MgRUdSRVAgQUxMT0NBIEhBVkVfTE9OR19ET1VCTEUgVEFSR0VUIFRBUkdFVERJUiBNS1RBUkdFVCBMSUJPQkpTIExUTElCT0JKUycKIGFjX3N1YnN0X2ZpbGVzPScnCiAKICMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KQEAgLTM0ODMsNiArMzQ4Myw3IEBACiAKIFRBUkdFVERJUj0idW5rbm93biIKIGNhc2UgIiRob3N0IiBpbgoraSo4Ni0qLWRhcndpbiopIFRBUkdFVD1YODZfREFSV0lOOyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1saW51eCopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWdudSopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLXNvbGFyaXMyLjFbMC05XSopIFRBUkdFVD1YODZfNjQ7IFRBUkdFVERJUj14ODY7OwpAQCAtMzUzNCw2ICszNTM1LDggQEAKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZmkKIAorTUtUQVJHRVQ9JFRBUkdFVAorCiBjYXNlIHgkVEFSR0VUIGluCiAgIHhNSVBTKikgVEFSR0VUPU1JUFMgOzsKICAgKikgOzsKQEAgLTUyNDEsNiArNTI0NCw5IEBACiBlc2FjCiAKIAorCisKKwogaWYgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQzsgdGhlbgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBhc3NlbWJsZXIgYW5kIGxpbmtlciBzdXBwb3J0IHVuYWxpZ25lZCBwYyByZWxhdGVkIHJlbG9jcyIgPiY1CiBlY2hvICRFQ0hPX04gImNoZWNraW5nIGFzc2VtYmxlciBhbmQgbGlua2VyIHN1cHBvcnQgdW5hbGlnbmVkIHBjIHJlbGF0ZWQgcmVsb2NzLi4uICRFQ0hPX0MiID4mNgpAQCAtNTQ1Nyw2ICs1NDYzLDcgQEAKIAogCiAKKwogY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgRkZJX05PX1JBV19BUEkgMQogX0FDRU9GCkBAIC01NDY3LDcgKzU0NzQsMTUgQEAKICAgICAgICAgICBhY19jb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMgc3JjIgogCiAKLSAgICAgICAgICBhY19jb25maWdfbGlua3M9IiRhY19jb25maWdfbGlua3MgaW5jbHVkZS9mZml0YXJnZXQuaDpzcmMvJFRBUkdFVERJUi9mZml0YXJnZXQuaCIKK1RBUkdFVElOQ0RJUj0kVEFSR0VURElSCitjYXNlICRob3N0IGluCisqLSotZGFyd2luKikKKyAgIFRBUkdFVElOQ0RJUj0iZGFyd2luIgorICAgOzsKK2VzYWMKKworCisgICAgICAgICAgYWNfY29uZmlnX2xpbmtzPSIkYWNfY29uZmlnX2xpbmtzIGluY2x1ZGUvZmZpdGFyZ2V0Lmg6c3JjLyRUQVJHRVRJTkNESVIvZmZpdGFyZ2V0LmgiCiAKICAgICAgICAgICBhY19jb25maWdfbGlua3M9IiRhY19jb25maWdfbGlua3MgaW5jbHVkZS9mZmlfY29tbW9uLmg6aW5jbHVkZS9mZmlfY29tbW9uLmgiCiAKQEAgLTYwMTQsNyArNjAyOSw3IEBACiAgICMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgogICAiaW5jbHVkZS9mZmkuaCIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW5jbHVkZS9mZmkuaCIgOzsKICAgImZmaWNvbmZpZy5weSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZmZpY29uZmlnLnB5IiA7OwotICAiaW5jbHVkZS9mZml0YXJnZXQuaCIgKSBDT05GSUdfTElOS1M9IiRDT05GSUdfTElOS1MgaW5jbHVkZS9mZml0YXJnZXQuaDpzcmMvJFRBUkdFVERJUi9mZml0YXJnZXQuaCIgOzsKKyAgImluY2x1ZGUvZmZpdGFyZ2V0LmgiICkgQ09ORklHX0xJTktTPSIkQ09ORklHX0xJTktTIGluY2x1ZGUvZmZpdGFyZ2V0Lmg6c3JjLyRUQVJHRVRJTkNESVIvZmZpdGFyZ2V0LmgiIDs7CiAgICJpbmNsdWRlL2ZmaV9jb21tb24uaCIgKSBDT05GSUdfTElOS1M9IiRDT05GSUdfTElOS1MgaW5jbHVkZS9mZmlfY29tbW9uLmg6aW5jbHVkZS9mZmlfY29tbW9uLmgiIDs7CiAgICJpbmNsdWRlIiApIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBpbmNsdWRlIiA7OwogICAic3JjIiApIENPTkZJR19DT01NQU5EUz0iJENPTkZJR19DT01NQU5EUyBzcmMiIDs7CkBAIC02MTI5LDYgKzYxNDQsNyBAQAogcyxASEFWRV9MT05HX0RPVUJMRUAsJEhBVkVfTE9OR19ET1VCTEUsO3QgdAogcyxAVEFSR0VUQCwkVEFSR0VULDt0IHQKIHMsQFRBUkdFVERJUkAsJFRBUkdFVERJUiw7dCB0CitzLEBNS1RBUkdFVEAsJE1LVEFSR0VULDt0IHQKIHMsQExJQk9CSlNALCRMSUJPQkpTLDt0IHQKIHMsQExUTElCT0JKU0AsJExUTElCT0JKUyw7dCB0CiBDRU9GCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZS5hYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCmluZGV4IGM3ZjA1ZDYuLmEwZDc1MTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjCkBAIC0yMSw2ICsyMSw3IEBACiAKIFRBUkdFVERJUj0idW5rbm93biIKIGNhc2UgIiRob3N0IiBpbgoraSo4Ni0qLWRhcndpbiopIFRBUkdFVD1YODZfREFSV0lOOyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1saW51eCopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWdudSopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLXNvbGFyaXMyLjFbWzAtOV1dKikgVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4Njs7CkBAIC03MCw2ICs3MSwxMiBAQAogICBBQ19NU0dfRVJST1IoWyJsaWJmZmkgaGFzIG5vdCBiZWVuIHBvcnRlZCB0byAkaG9zdC4iXSkKIGZpCiAKK2RubCAgbGliZmZpIGNoYW5nZXMgVEFSR0VUIGZvciBNSVBTIHRvIGRlZmluZSBhIHN1Y2ggbWFjcm8gaW4gdGhlIGhlYWRlcgorZG5sICB3aGlsZSBNSVBTX0lSSVggb3IgTUlQU19MSU5VWCBpcyBzZXBhcmF0ZWRseSB1c2VkIHRvIGRlY2lkZSB3aGljaAorZG5sICBmaWxlcyB3aWxsIGJlIGNvbXBpbGVkLiAgU28sIHdlIG5lZWQgdG8ga2VlcCB0aGUgb3JpZ2luYWwgZGVjaXNpb24KK2RubCAgb2YgVEFSR0VUIHRvIHVzZSBpbiBmZmljb25maWcucHkuaW4uCitNS1RBUkdFVD0kVEFSR0VUCisKIGNhc2UgeCRUQVJHRVQgaW4KICAgeE1JUFMqKSBUQVJHRVQ9TUlQUyA7OwogICAqKSA7OwpAQCAtOTMsNiArMTAwLDI0IEBACiBBQ19TVUJTVChIQVZFX0xPTkdfRE9VQkxFKQogCiBBQ19DX0JJR0VORElBTgorQUhfVkVSQkFUSU0oW1dPUkRTX0JJR0VORElBTl0sCitbCisvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlCisgICBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gCisKKyAgIFRoZSBibG9jayBiZWxvdyBkb2VzIGNvbXBpbGUtdGltZSBjaGVja2luZyBmb3IgZW5kaWFubmVzcyBvbiBwbGF0Zm9ybXMKKyAgIHRoYXQgdXNlIEdDQyBhbmQgdGhlcmVmb3JlIGFsbG93cyBjb21waWxpbmcgZmF0IGJpbmFyaWVzIG9uIE9TWCBieSB1c2luZworICAgJy1hcmNoIHBwYyAtYXJjaCBpMzg2JyBhcyB0aGUgY29tcGlsZSBmbGFncy4gVGhlIHBocmFzaW5nIHdhcyBjaG9vc2VuCisgICBzdWNoIHRoYXQgdGhlIGNvbmZpZ3VyZS1yZXN1bHQgaXMgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgdXNlIEdDQy4KKyovCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyNlbHNlCisjaWZuZGVmIF9fTElUVExFX0VORElBTl9fCisjdW5kZWYgV09SRFNfQklHRU5ESUFOCisjZW5kaWYKKyNlbmRpZl0pCisKIAogaWYgdGVzdCB4JFRBUkdFVCA9IHhTUEFSQzsgdGhlbgogICAgIEFDX0NBQ0hFX0NIRUNLKFthc3NlbWJsZXIgYW5kIGxpbmtlciBzdXBwb3J0IHVuYWxpZ25lZCBwYyByZWxhdGVkIHJlbG9jc10sCkBAIC0xODMsNiArMjA4LDcgQEAKIAogQUNfU1VCU1QoVEFSR0VUKQogQUNfU1VCU1QoVEFSR0VURElSKQorQUNfU1VCU1QoTUtUQVJHRVQpCiAKIEFDX1NVQlNUKFNIRUxMKQogCkBAIC0xOTQsNyArMjIwLDE1IEBACiB0ZXN0IC1kIHNyYy8kVEFSR0VURElSIHx8IG1rZGlyIHNyYy8kVEFSR0VURElSCiBdLCBbVEFSR0VURElSPSIkVEFSR0VURElSIl0pCiAKLUFDX0NPTkZJR19MSU5LUyhpbmNsdWRlL2ZmaXRhcmdldC5oOnNyYy8kVEFSR0VURElSL2ZmaXRhcmdldC5oKQorVEFSR0VUSU5DRElSPSRUQVJHRVRESVIKK2Nhc2UgJGhvc3QgaW4KKyotKi1kYXJ3aW4qKQorICAgVEFSR0VUSU5DRElSPSJkYXJ3aW4iCisgICA7OworZXNhYworCisKK0FDX0NPTkZJR19MSU5LUyhpbmNsdWRlL2ZmaXRhcmdldC5oOnNyYy8kVEFSR0VUSU5DRElSL2ZmaXRhcmdldC5oKQogQUNfQ09ORklHX0xJTktTKGluY2x1ZGUvZmZpX2NvbW1vbi5oOmluY2x1ZGUvZmZpX2NvbW1vbi5oKQogCiBBQ19DT05GSUdfRklMRVMoaW5jbHVkZS9mZmkuaCBmZmljb25maWcucHkpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5oLmluIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcuaC5pbgppbmRleCAwZmQyZGI1Li5iY2M1YTU4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5oLmluCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZmZpY29uZmlnLmguaW4KQEAgLTExNCw5ICsxMTQsMjIgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwogI3VuZGVmIFNURENfSEVBREVSUwogCisKIC8qIERlZmluZSB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUKLSAgIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsIGFuZCBWQVgpLiAqLworICAgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuIAorCisgICBUaGUgYmxvY2sgYmVsb3cgZG9lcyBjb21waWxlLXRpbWUgY2hlY2tpbmcgZm9yIGVuZGlhbm5lc3Mgb24gcGxhdGZvcm1zCisgICB0aGF0IHVzZSBHQ0MgYW5kIHRoZXJlZm9yZSBhbGxvd3MgY29tcGlsaW5nIGZhdCBiaW5hcmllcyBvbiBPU1ggYnkgdXNpbmcKKyAgICctYXJjaCBwcGMgLWFyY2ggaTM4NicgYXMgdGhlIGNvbXBpbGUgZmxhZ3MuIFRoZSBwaHJhc2luZyB3YXMgY2hvb3NlbgorICAgc3VjaCB0aGF0IHRoZSBjb25maWd1cmUtcmVzdWx0IGlzIHVzZWQgb24gc3lzdGVtcyB0aGF0IGRvbid0IHVzZSBHQ0MuCisqLworI2lmZGVmIF9fQklHX0VORElBTl9fCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjZWxzZQorI2lmbmRlZiBfX0xJVFRMRV9FTkRJQU5fXwogI3VuZGVmIFdPUkRTX0JJR0VORElBTgorI2VuZGlmCisjZW5kaWYKIAogCiAjaWZkZWYgSEFWRV9ISURERU5fVklTSUJJTElUWV9BVFRSSUJVVEUKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZmZpY29uZmlnLnB5LmluIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcucHkuaW4KaW5kZXggMmVkMjM0Ny4uMzM2NDA0OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcucHkuaW4KKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcucHkuaW4KQEAgLTYsNiArNiw3IEBACiAgICAgJ01JUFNfSVJJWCc6IFsnc3JjL21pcHMvZmZpLmMnLCAnc3JjL21pcHMvbzMyLlMnLCAnc3JjL21pcHMvbjMyLlMnXSwKICAgICAnTUlQU19MSU5VWCc6IFsnc3JjL21pcHMvZmZpLmMnLCAnc3JjL21pcHMvbzMyLlMnXSwKICAgICAnWDg2JzogWydzcmMveDg2L2ZmaS5jJywgJ3NyYy94ODYvc3lzdi5TJ10sCisgICAgJ1g4Nl9EQVJXSU4nOiBbJ3NyYy94ODYvZmZpX2Rhcndpbi5jJywgJ3NyYy94ODYvZGFyd2luLlMnXSwKICAgICAnWDg2X1dJTjMyJzogWydzcmMveDg2L2ZmaS5jJywgJ3NyYy94ODYvd2luMzIuUyddLAogICAgICdTUEFSQyc6IFsnc3JjL3NwYXJjL2ZmaS5jJywgJ3NyYy9zcGFyYy92OC5TJywgJ3NyYy9zcGFyYy92OS5TJ10sCiAgICAgJ0FMUEhBJzogWydzcmMvYWxwaGEvZmZpLmMnLCAnc3JjL2FscGhhL29zZi5TJ10sCkBAIC0yNiwxMCArMjcsMjIgQEAKICAgICAnUEEnOiBbJ3NyYy9wYS9saW51eC5TJywgJ3NyYy9wYS9mZmkuYyddLAogfQogCisjIEJ1aWxkIGFsbCBkYXJ3aW4gcmVsYXRlZCBmaWxlcyBvbiBhbGwgc3VwcG9ydGVkIGRhcndpbiBhcmNoaXRlY3R1cmVzLCB0aGlzCisjIG1ha2VzIGl0IGVhc2llciB0byBidWlsZCB1bml2ZXJzYWwgYmluYXJpZXMuCitpZiAxOgorICAgIGFsbF9kYXJ3aW4gPSAoJ1g4Nl9EQVJXSU4nLCAnUE9XRVJQQ19EQVJXSU4nKQorICAgIGFsbF9kYXJ3aW5fZmlsZXMgPSBbXQorICAgIGZvciBwbiBpbiBhbGxfZGFyd2luOgorICAgICAgICBhbGxfZGFyd2luX2ZpbGVzLmV4dGVuZChmZmlfcGxhdGZvcm1zW3BuXSkKKyAgICBmb3IgcG4gaW4gYWxsX2RhcndpbjoKKyAgICAgICAgZmZpX3BsYXRmb3Jtc1twbl0gPSBhbGxfZGFyd2luX2ZpbGVzCisgICAgZGVsIGFsbF9kYXJ3aW4sIGFsbF9kYXJ3aW5fZmlsZXMsIHBuCisKIGZmaV9zcmNkaXIgPSAnQHNyY2RpckAnCi1mZmlfc291cmNlcyArPSBmZmlfcGxhdGZvcm1zWydAVEFSR0VUQCddCitmZmlfc291cmNlcyArPSBmZmlfcGxhdGZvcm1zWydATUtUQVJHRVRAJ10KIGZmaV9zb3VyY2VzID0gW29zLnBhdGguam9pbignQHNyY2RpckAnLCBmKSBmb3IgZiBpbiBmZmlfc291cmNlc10KIAogZmZpX2NmbGFncyA9ICdAQ0ZMQUdTQCcKKyMgSSB0aGluayB0aGlzIG1heSBubyBsb25nZXIgYmUgbmVlZGVkOgogaWYgc3lzLnBsYXRmb3JtID09ICJvcGVuYnNkMyI6CiAgICAgZmZpX2NmbGFncyArPSAiIC1mbm8tc3RhY2stcHJvdGVjdG9yIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvZGFyd2luL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvZGFyd2luL2ZmaXRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzMwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9kYXJ3aW4vZmZpdGFyZ2V0LmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBmb3IgTWFjT1NYIG9ubHkuIERpc3BhdGNoIHRvIHRoZSByaWdodCBhcmNoaXRlY3R1cmUgaW5jbHVkZQorICogZmlsZSBiYXNlZCBvbiB0aGUgY3VycmVudCBhcmNoaWN0ZWN0dXJlIChpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSBzeW1saW5rCisgKiBjcmVhdGVkIGJ5IGNvbmZpZ3VyZSkuIFRoaXMgbWFrZXMgaXMgcG9zc2libGUgdG8gYnVpbGQgYSB1bml2ZXJhbCBiaW5hcnkKKyAqIG9mIGN0eXBlcyBpbiBvbmUgZ28uCisgKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCisjaWZuZGVmIFg4Nl9EQVJXSU4KKyNkZWZpbmUgWDg2X0RBUldJTgorI2VuZGlmCisjdW5kZWYgUE9XRVJQQ19EQVJXSU4KKworI2luY2x1ZGUgIi4uL3NyYy94ODYvZmZpdGFyZ2V0LmgiCisKKyNlbGlmIGRlZmluZWQoX19wcGNfXykKKworI2lmbmRlZiBQT1dFUlBDX0RBUldJTgorI2RlZmluZSBQT1dFUlBDX0RBUldJTgorI2VuZGlmCisjdW5kZWYgWDg2X0RBUldJTgorCisjaW5jbHVkZSAiLi4vc3JjL3Bvd2VycGMvZmZpdGFyZ2V0LmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW4uUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luLlMKaW5kZXggZDhhMWRmNS4uOTE3ZGM5MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW4uUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbi5TCkBAIC0xLDMgKzEsNCBAQAorI2lmZGVmIF9fcHBjX18KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkYXJ3aW4uUyAtIENvcHlyaWdodCAoYykgMjAwMCBKb2huIEhvcm5rdmlzdAogCSAgICAgIENvcHlyaWdodCAoYykgMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KQEAgLTI0MywzICsyNDQsNCBAQAogCS5hbGlnbiBMT0cyX0dQUl9CWVRFUwogTExGQjAkbm9uX2xhenlfcHRyOgogCS5nX2xvbmcgTEZCMAorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKaW5kZXggNmQ5YTM2NC4uNzEwNTRmNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUwpAQCAtMSwzICsxLDQgQEAKKyNpZmRlZiBfX3BwY19fCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZGFyd2luX2Nsb3N1cmUuUyAtIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogICAgSW5jLiBiYXNlZCBvbiBwcGNfY2xvc3VyZS5TCkBAIC0zMTUsMyArMzE2LDQgQEAKIAkuYWxpZ24gTE9HMl9HUFJfQllURVMKIExMRkIxJG5vbl9sYXp5X3B0cjoKIAkuZ19sb25nIExGQjEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9mZmlfZGFyd2luLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYwppbmRleCBkNzU4ZjhmLi4xNTk1YjAwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYwpAQCAtMSwzICsxLDQgQEAKKyNpZmRlZiBfX3BwY19fCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDE5OTggR2VvZmZyZXkgS2VhdGluZwogCkBAIC0zODAsMTggKzM4MSwxOCBAQAogZXh0ZXJuIHZvaWQgZmZpX2NhbGxfQUlYKC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwKIAkJCSB1bnNpZ25lZCwgdW5zaWduZWQsCiAJCQkgLypAb3V0QCovIHVuc2lnbmVkICosCi0JCQkgdm9pZCAoKmZuKSgpLAotCQkJIHZvaWQgKCpmbjIpKCkpOworCQkJIHZvaWQgKCpmbikodm9pZCksCisJCQkgdm9pZCAoKmZuMikoZXh0ZW5kZWRfY2lmICosIHVuc2lnbmVkICpjb25zdCkpOwogZXh0ZXJuIHZvaWQgZmZpX2NhbGxfREFSV0lOKC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwKIAkJCSAgICB1bnNpZ25lZCwgdW5zaWduZWQsCiAJCQkgICAgLypAb3V0QCovIHVuc2lnbmVkICosCi0JCQkgICAgdm9pZCAoKmZuKSgpLAotCQkJICAgIHZvaWQgKCpmbjIpKCkpOworCQkJICAgIHZvaWQgKCpmbikodm9pZCksCisJCQkgICAgdm9pZCAoKmZuMikoZXh0ZW5kZWRfY2lmICosIHVuc2lnbmVkICpjb25zdCkpOwogLypAPWRlY2x1bmRlZkAqLwogLypAPWV4cG9ydGhlYWRlckAqLwogCiB2b2lkIGZmaV9jYWxsKC8qQGRlcGVuZGVudEAqLyBmZmlfY2lmICpjaWYsCi0JICAgICAgdm9pZCAoKmZuKSgpLAorCSAgICAgIHZvaWQgKCpmbikodm9pZCksCiAJICAgICAgLypAb3V0QCovIHZvaWQgKnJ2YWx1ZSwKIAkgICAgICAvKkBkZXBlbmRlbnRAKi8gdm9pZCAqKmF2YWx1ZSkKIHsKQEAgLTc2NywzICs3NjgsNCBAQAogICAvKiBUZWxsIGZmaV9jbG9zdXJlX0FTTSB0byBwZXJmb3JtIHJldHVybiB0eXBlIHByb21vdGlvbnMuICAqLwogICByZXR1cm4gY2lmLT5ydHlwZS0+dHlwZTsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcHJlcF9jaWYuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3ByZXBfY2lmLmMKaW5kZXggMGZhYTVkZC4uMmRiNjVjZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcHJlcF9jaWYuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wcmVwX2NpZi5jCkBAIC01NSwxMSArNTUsMjkgQEAKICAgICAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIGFyZ3VtZW50IHR5cGUgKi8KICAgICAgIEZGSV9BU1NFUlRfVkFMSURfVFlQRSgqcHRyKTsKIAorI2lmZGVmIFBPV0VSUENfREFSV0lOCisgICAgICB7CisJICAgICAgaW50IGN1cmFsaWduOworCisJICAgICAgY3VyYWxpZ24gPSAoKnB0ciktPmFsaWdubWVudDsKKwkgICAgICBpZiAocHRyICE9ICYoYXJnLT5lbGVtZW50c1swXSkpIHsKKwkJICAgICAgaWYgKGN1cmFsaWduID4gNCAmJiBjdXJhbGlnbiAhPSAxNikgeworCQkJICAgICAgY3VyYWxpZ24gPSA0OworCQkgICAgICB9CisJICAgICAgfQorICAgICAgYXJnLT5zaXplID0gQUxJR04oYXJnLT5zaXplLCBjdXJhbGlnbik7CisgICAgICBhcmctPnNpemUgKz0gKCpwdHIpLT5zaXplOworCisgICAgICBhcmctPmFsaWdubWVudCA9IChhcmctPmFsaWdubWVudCA+IGN1cmFsaWduKSA/IAorCSAgICAgIGFyZy0+YWxpZ25tZW50IDogY3VyYWxpZ247CisgICAgICB9CisjZWxzZQogICAgICAgYXJnLT5zaXplID0gQUxJR04oYXJnLT5zaXplLCAoKnB0ciktPmFsaWdubWVudCk7CiAgICAgICBhcmctPnNpemUgKz0gKCpwdHIpLT5zaXplOwogCiAgICAgICBhcmctPmFsaWdubWVudCA9IChhcmctPmFsaWdubWVudCA+ICgqcHRyKS0+YWxpZ25tZW50KSA/IAogCWFyZy0+YWxpZ25tZW50IDogKCpwdHIpLT5hbGlnbm1lbnQ7CisjZW5kaWYKIAogICAgICAgcHRyKys7CiAgICAgfQpAQCAtODksNiArMTA3LDE5IEBACiAvKiBQZXJmb3JtIG1hY2hpbmUgaW5kZXBlbmRlbnQgZmZpX2NpZiBwcmVwYXJhdGlvbiwgdGhlbiBjYWxsCiAgICBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lLiAqLwogCisjaWZkZWYgWDg2X0RBUldJTgorc3RhdGljIGlubGluZSBpbnQgc3RydWN0X29uX3N0YWNrKGludCBzaXplKQoreworCWlmIChzaXplID4gOCkgcmV0dXJuIDE7CisJLyogVGhpcyBpcyBub3Qgd2hhdCB0aGUgQUJJIHNheXMsIGJ1dCBpcyB3aGF0IGlzIHJlYWxseSBpbXBsZW1lbnRlZCAqLworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMTogY2FzZSAyOiBjYXNlIDQ6IGNhc2UgODogcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKKwogZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYoLypAb3V0QCovIC8qQHBhcnRpYWxAKi8gZmZpX2NpZiAqY2lmLCAKIAkJCWZmaV9hYmkgYWJpLCB1bnNpZ25lZCBpbnQgbmFyZ3MsIAogCQkJLypAZGVwZW5kZW50QCovIC8qQG91dEAqLyAvKkBwYXJ0aWFsQCovIGZmaV90eXBlICpydHlwZSwgCkBAIC0xMjQsNiArMTU1LDEwIEBACiAjaWZkZWYgU1BBUkMKICAgICAgICYmIChjaWYtPmFiaSAhPSBGRklfVjkgfHwgY2lmLT5ydHlwZS0+c2l6ZSA+IDMyKQogI2VuZGlmCisjaWZkZWYgWDg2X0RBUldJTgorCisgICAgICAmJiAoc3RydWN0X29uX3N0YWNrKGNpZi0+cnR5cGUtPnNpemUpKQorI2VuZGlmCiAgICAgICApCiAgICAgYnl0ZXMgPSBTVEFDS19BUkdfU0laRShzaXplb2Yodm9pZCopKTsKICNlbmRpZgpAQCAtMTM5LDcgKzE3NCwxNiBAQAogCSBjaGVjayBhZnRlciB0aGUgaW5pdGlhbGl6YXRpb24uICAqLwogICAgICAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFKCpwdHIpOwogCi0jaWYgIWRlZmluZWQgX194ODZfNjRfXyAmJiAhZGVmaW5lZCBTMzkwICYmICFkZWZpbmVkIFBBCisjaWYgZGVmaW5lZChYODZfREFSV0lOKQorICAgICAgeworCSAgICAgIGludCBhbGlnbiA9ICgqcHRyKS0+YWxpZ25tZW50OworCSAgICAgIGlmIChhbGlnbiA+IDQpIGFsaWduID0gNDsKKwkgICAgICBpZiAoKGFsaWduIC0gMSkgJiBieXRlcykKKwkJIGJ5dGVzID0gQUxJR04oYnl0ZXMsIGFsaWduKTsKKwkgICAgICBieXRlcyArPSBTVEFDS19BUkdfU0laRSgoKnB0ciktPnNpemUpOworICAgICAgfQorCisjZWxpZiAhZGVmaW5lZCBfX3g4Nl82NF9fICYmICFkZWZpbmVkIFMzOTAgJiYgIWRlZmluZWQgUEEKICNpZmRlZiBTUEFSQwogICAgICAgaWYgKCgoKnB0ciktPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCiAJICAgJiYgKCgqcHRyKS0+c2l6ZSA+IDE2IHx8IGNpZi0+YWJpICE9IEZGSV9WOSkpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZGFyd2luLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZGFyd2luLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlNTViNQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9kYXJ3aW4uUwpAQCAtMCwwICsxLDE5NSBAQAorI2lmZGVmIF9faTM4Nl9fCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZGFyd2luLlMgLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTgsIDIwMDEsIDIwMDIsIDIwMDMgIFJlZCBIYXQsIEluYy4KKyAgIAorICAgWDg2IEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlIAorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgYGBTb2Z0d2FyZScnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgICB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAgIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIENZR05VUyBTT0xVVElPTlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gc3lzdi5TIGFuZCB0aGVuIGhhY2tlZCB1cCBieSBSb25hbGQgd2hvIGhhc24ndCBkb25lCisgKiBhc3NlbWJseSBwcm9ncmFtbWluZyBpbiA4IHllYXJzLgorICovCisKKyNpZm5kZWYgX194ODZfNjRfXworCisjZGVmaW5lIExJQkZGSV9BU00JCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisKKy50ZXh0CisKKy5nbG9ibCBfZmZpX3ByZXBfYXJncworCisuYWxpZ24gNAorLmdsb2JsIF9mZmlfY2FsbF9TWVNWCisKK19mZmlfY2FsbF9TWVNWOgorLkxGQjE6CisgICAgICAgIHB1c2hsICVlYnAKKy5MQ0ZJMDoKKyAgICAgICAgbW92bCAgJWVzcCwlZWJwCisuTENGSTE6CisJLyogTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLiAgKi8KKwltb3ZsICAxNiglZWJwKSwlZWN4CisJc3VibCAgJWVjeCwlZXNwCisKKwltb3ZsICAlZXNwLCVlYXgKKworCS8qIFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbiAgKi8KKwlwdXNobCAxMiglZWJwKQorCXB1c2hsICVlYXgKKwljYWxsICAqOCglZWJwKQorCisJLyogUmV0dXJuIHN0YWNrIHRvIHByZXZpb3VzIHN0YXRlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbiAgKi8KKwlhZGRsICAkOCwlZXNwCQorCisJY2FsbCAgKjI4KCVlYnApCisKKwkvKiBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MgICovCisJbW92bCAgMTYoJWVicCksJWVjeAorCWFkZGwgICVlY3gsJWVzcAorCisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUgICovCisJbW92bCAgMjAoJWVicCksJWVjeAkKKworCS8qIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLiAgKi8KKwljbXBsICAkMCwyNCglZWJwKQorCWpuZSAgIHJldGludAorCisJLyogRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlIAorCSAgIG9ibGlnZWQgdG8gaGFuZGxlIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4gICovCisJY21wbCAgJEZGSV9UWVBFX0ZMT0FULCVlY3gKKwlqbmUgICBub3JldHZhbAorCWZzdHAgICVzdCgwKQorCisgICAgICAgIGptcCAgIGVwaWxvZ3VlCisKK3JldGludDoKKwljbXBsICAkRkZJX1RZUEVfSU5ULCVlY3gKKwlqbmUgICByZXRmbG9hdAorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAkKKwltb3ZsICAlZWF4LDAoJWVjeCkKKwlqbXAgICBlcGlsb2d1ZQorCityZXRmbG9hdDoKKwljbXBsICAkRkZJX1RZUEVfRkxPQVQsJWVjeAorCWpuZSAgIHJldGRvdWJsZQorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAkKKwlmc3RwcyAoJWVjeCkKKwlqbXAgICBlcGlsb2d1ZQorCityZXRkb3VibGU6CisJY21wbCAgJEZGSV9UWVBFX0RPVUJMRSwlZWN4CisJam5lICAgcmV0bG9uZ2RvdWJsZQorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAkKKwlmc3RwbCAoJWVjeCkKKwlqbXAgICBlcGlsb2d1ZQorCityZXRsb25nZG91YmxlOgorCWNtcGwgICRGRklfVFlQRV9MT05HRE9VQkxFLCVlY3gKKwlqbmUgICByZXRpbnQ2NAorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAkKKwlmc3RwdCAoJWVjeCkKKwlqbXAgICBlcGlsb2d1ZQorCQorcmV0aW50NjQ6CQorCWNtcGwgICRGRklfVFlQRV9TSU5UNjQsJWVjeAorICAgICAgICBqbmUgICByZXRzdHJ1Y3QKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLworCW1vdmwgIDI0KCVlYnApLCVlY3gJCisJbW92bCAgJWVheCwwKCVlY3gpCisJbW92bCAgJWVkeCw0KCVlY3gpCisJCityZXRzdHJ1Y3Q6CisJLyogTm90aGluZyB0byBkbyEgICovCisKK25vcmV0dmFsOgorZXBpbG9ndWU6CisgICAgICAgIG1vdmwgJWVicCwlZXNwCisgICAgICAgIHBvcGwgJWVicAorICAgICAgICByZXQKKy5MRkUxOgorLmZmaV9jYWxsX1NZU1ZfZW5kOgorI2lmIDAKKyAgICAgICAgLnNpemUgICAgZmZpX2NhbGxfU1lTViwuZmZpX2NhbGxfU1lTVl9lbmQtZmZpX2NhbGxfU1lTVgorI2VuZGlmCisKKyNpZiAwCisJLnNlY3Rpb24JLmVoX2ZyYW1lLEVIX0ZSQU1FX0ZMQUdTLEBwcm9nYml0cworLkxmcmFtZTE6CisJLmxvbmcJLkxFQ0lFMS0uTFNDSUUxCS8qIExlbmd0aCBvZiBDb21tb24gSW5mb3JtYXRpb24gRW50cnkgKi8KKy5MU0NJRTE6CisJLmxvbmcJMHgwCS8qIENJRSBJZGVudGlmaWVyIFRhZyAqLworCS5ieXRlCTB4MQkvKiBDSUUgVmVyc2lvbiAqLworI2lmZGVmIF9fUElDX18KKwkuYXNjaWkgInpSXDAiCS8qIENJRSBBdWdtZW50YXRpb24gKi8KKyNlbHNlCisJLmFzY2lpICJcMCIJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2VuZGlmCisJLmJ5dGUJMHgxCS8qIC51bGViMTI4IDB4MTsgQ0lFIENvZGUgQWxpZ25tZW50IEZhY3RvciAqLworCS5ieXRlCTB4N2MJLyogLnNsZWIxMjggLTQ7IENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IgKi8KKwkuYnl0ZQkweDgJLyogQ0lFIFJBIENvbHVtbiAqLworI2lmZGVmIF9fUElDX18KKwkuYnl0ZQkweDEJLyogLnVsZWIxMjggMHgxOyBBdWdtZW50YXRpb24gc2l6ZSAqLworCS5ieXRlCTB4MWIJLyogRkRFIEVuY29kaW5nIChwY3JlbCBzZGF0YTQpICovCisjZW5kaWYKKwkuYnl0ZQkweGMJLyogRFdfQ0ZBX2RlZl9jZmEgKi8KKwkuYnl0ZQkweDQJLyogLnVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg0CS8qIC51bGViMTI4IDB4NCAqLworCS5ieXRlCTB4ODgJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4OCAqLworCS5ieXRlCTB4MQkvKiAudWxlYjEyOCAweDEgKi8KKwkuYWxpZ24gNAorLkxFQ0lFMToKKy5MU0ZERTE6CisJLmxvbmcJLkxFRkRFMS0uTEFTRkRFMQkvKiBGREUgTGVuZ3RoICovCisuTEFTRkRFMToKKwkubG9uZwkuTEFTRkRFMS0uTGZyYW1lMQkvKiBGREUgQ0lFIG9mZnNldCAqLworI2lmZGVmIF9fUElDX18KKwkubG9uZwkuTEZCMS0uCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZWxzZQorCS5sb25nCS5MRkIxCS8qIEZERSBpbml0aWFsIGxvY2F0aW9uICovCisjZW5kaWYKKwkubG9uZwkuTEZFMS0uTEZCMQkvKiBGREUgYWRkcmVzcyByYW5nZSAqLworI2lmZGVmIF9fUElDX18KKwkuYnl0ZQkweDAJLyogLnVsZWIxMjggMHgwOyBBdWdtZW50YXRpb24gc2l6ZSAqLworI2VuZGlmCisJLmJ5dGUJMHg0CS8qIERXX0NGQV9hZHZhbmNlX2xvYzQgKi8KKwkubG9uZwkuTENGSTAtLkxGQjEKKwkuYnl0ZQkweGUJLyogRFdfQ0ZBX2RlZl9jZmFfb2Zmc2V0ICovCisJLmJ5dGUJMHg4CS8qIC51bGViMTI4IDB4OCAqLworCS5ieXRlCTB4ODUJLyogRFdfQ0ZBX29mZnNldCwgY29sdW1uIDB4NSAqLworCS5ieXRlCTB4MgkvKiAudWxlYjEyOCAweDIgKi8KKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMS0uTENGSTAKKwkuYnl0ZQkweGQJLyogRFdfQ0ZBX2RlZl9jZmFfcmVnaXN0ZXIgKi8KKwkuYnl0ZQkweDUJLyogLnVsZWIxMjggMHg1ICovCisJLmFsaWduIDQKKy5MRUZERTE6CisjZW5kaWYKKworI2VuZGlmIC8qIGlmbmRlZiBfX3g4Nl82NF9fICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIF9faTM4Nl9fICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpX2Rhcndpbi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaV9kYXJ3aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjgyYjNhCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaV9kYXJ3aW4uYwpAQCAtMCwwICsxLDYxMCBAQAorIyBpZmRlZiBfX2kzODZfXworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIGZmaS5jIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAxOTk5LCAyMDAxICBSZWQgSGF0LCBJbmMuCisgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiAgUmFuaml0IE1hdGhldworICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgIEJvIFRob3JzZW4KKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyICBSb2dlciBTYXlsZQorICAgCisgICB4ODYgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgQ1lHTlVTIFNPTFVUSU9OUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgX194ODZfNjRfXworCisjaW5jbHVkZSA8ZmZpLmg+CisjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIGZmaV9wcmVwX2FyZ3MgaXMgY2FsbGVkIGJ5IHRoZSBhc3NlbWJseSByb3V0aW5lIG9uY2Ugc3RhY2sgc3BhY2UKKyAgIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzICovCisKKy8qQC1leHBvcnRoZWFkZXJAKi8KK3ZvaWQgZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKTsKKworc3RhdGljIGlubGluZSBpbnQgcmV0dmFsX29uX3N0YWNrKGZmaV90eXBlKiB0cCkKK3sKKwlpZiAodHAtPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisJCWludCBzeiA9IHRwLT5zaXplOworCQlpZiAoc3ogPiA4KSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzd2l0Y2ggKHN6KSB7CisJCWNhc2UgMTogY2FzZSAyOiBjYXNlIDQ6IGNhc2UgODogcmV0dXJuIDA7CisJCWRlZmF1bHQ6IHJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKK3ZvaWQgZmZpX3ByZXBfYXJncyhjaGFyICpzdGFjaywgZXh0ZW5kZWRfY2lmICplY2lmKQorLypAPWV4cG9ydGhlYWRlckAqLworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKKyAgcmVnaXN0ZXIgY2hhciAqYXJncDsKKyAgcmVnaXN0ZXIgZmZpX3R5cGUgKipwX2FyZzsKKworICBhcmdwID0gc3RhY2s7CisKKyAgaWYgKHJldHZhbF9vbl9zdGFjayhlY2lmLT5jaWYtPnJ0eXBlKSkgeworICAgICAgKih2b2lkICoqKSBhcmdwID0gZWNpZi0+cnZhbHVlOworICAgICAgYXJncCArPSA0OworICB9CisKKworICBwX2FyZ3YgPSBlY2lmLT5hdmFsdWU7CisKKyAgZm9yIChpID0gZWNpZi0+Y2lmLT5uYXJncywgcF9hcmcgPSBlY2lmLT5jaWYtPmFyZ190eXBlczsKKyAgICAgICBpICE9IDA7CisgICAgICAgaS0tLCBwX2FyZysrKQorICAgIHsKKyAgICAgIHNpemVfdCB6OworCisgICAgICAvKiBBbGlnbiBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIGlmICgoc2l6ZW9mKGludCkgLSAxKSAmICh1bnNpZ25lZCkgYXJncCkKKwkgICAgICBhcmdwID0gKGNoYXIgKikgQUxJR04oYXJncCwgc2l6ZW9mKGludCkpOworCisgICAgICB6ID0gKCpwX2FyZyktPnNpemU7CisgICAgICBpZiAoeiA8IHNpemVvZihpbnQpKQorCXsKKwkgIHogPSBzaXplb2YoaW50KTsKKwkgIHN3aXRjaCAoKCpwX2FyZyktPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UODoKKwkgICAgICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDggKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDg6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UOCAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UMTY6CisJICAgICAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkqKFNJTlQxNiAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMTYgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorCSAgICAgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UMzIgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfVUlOVDMyOgorCSAgICAgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDMyICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQzMiAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkgICAgICBGRklfQVNTRVJUKDApOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIG1lbWNweShhcmdwLCAqcF9hcmd2LCB6KTsKKwl9CisgICAgICBwX2FyZ3YrKzsKKyAgICAgIGFyZ3AgKz0gejsKKyAgICB9CisgIAorICByZXR1cm47Cit9CisKKy8qIFBlcmZvcm0gbWFjaGluZSBkZXBlbmRlbnQgY2lmIHByb2Nlc3NpbmcgKi8KK2ZmaV9zdGF0dXMgZmZpX3ByZXBfY2lmX21hY2hkZXAoZmZpX2NpZiAqY2lmKQoreworICAvKiBTZXQgdGhlIHJldHVybiB0eXBlIGZsYWcgKi8KKyAgc3dpdGNoIChjaWYtPnJ0eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEZGSV9UWVBFX1ZPSUQ6CisjaWYgIWRlZmluZWQoWDg2X1dJTjMyKSAKKyAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyNlbmRpZgorICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgIGNhc2UgRkZJX1RZUEVfRkxPQVQ6CisgICAgY2FzZSBGRklfVFlQRV9ET1VCTEU6CisgICAgY2FzZSBGRklfVFlQRV9MT05HRE9VQkxFOgorICAgICAgY2lmLT5mbGFncyA9ICh1bnNpZ25lZCkgY2lmLT5ydHlwZS0+dHlwZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OworICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkIFg4Nl9XSU4zMiAgCisKKyAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKKyAgICAgIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDg7IC8qIHNhbWUgYXMgY2hhciBzaXplICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gMikKKyAgICAgICAgeworICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TSU5UMTY7IC8qIHNhbWUgYXMgc2hvcnQgc2l6ZSAqLworICAgICAgICB9CisgICAgICBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDQpCisgICAgICAgIHsKKyAgICAgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfSU5UOyAvKiBzYW1lIGFzIGludCB0eXBlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gOCkKKyAgICAgICAgeworICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TSU5UNjQ7IC8qIHNhbWUgYXMgaW50NjQgdHlwZSAqLworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU1RSVUNUOworICAgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgZGVmYXVsdDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgLyogRGFyd2luOiBUaGUgc3RhY2sgbmVlZHMgdG8gYmUgYWxpZ25lZCB0byBhIG11bHRpcGxlIG9mIDE2IGJ5dGVzICovCisjaWYgMAorICBjaWYtPmJ5dGVzID0gKGNpZi0+Ynl0ZXMgKyAxNSkgJiB+MHhGOworI2VuZGlmCisKKyAgcmV0dXJuIEZGSV9PSzsKK30KKworLypALWRlY2x1bmRlZkAqLworLypALWV4cG9ydGhlYWRlckAqLworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfU1lTVih2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwgCisJCQkgIC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwgCisJCQkgIHVuc2lnbmVkLCB1bnNpZ25lZCwgCisJCQkgIC8qQG91dEAqLyB1bnNpZ25lZCAqLCAKKwkJCSAgdm9pZCAoKmZuKSh2b2lkKSk7CisvKkA9ZGVjbHVuZGVmQCovCisvKkA9ZXhwb3J0aGVhZGVyQCovCisKKyNpZmRlZiBYODZfV0lOMzIKKy8qQC1kZWNsdW5kZWZAKi8KKy8qQC1leHBvcnRoZWFkZXJAKi8KK2V4dGVybiB2b2lkIGZmaV9jYWxsX1NURENBTEwodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksCisJCQkgIC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwKKwkJCSAgdW5zaWduZWQsIHVuc2lnbmVkLAorCQkJICAvKkBvdXRAKi8gdW5zaWduZWQgKiwKKwkJCSAgdm9pZCAoKmZuKSh2b2lkKSk7CisvKkA9ZGVjbHVuZGVmQCovCisvKkA9ZXhwb3J0aGVhZGVyQCovCisjZW5kaWYgLyogWDg2X1dJTjMyICovCisKK3ZvaWQgZmZpX2NhbGwoLypAZGVwZW5kZW50QCovIGZmaV9jaWYgKmNpZiwgCisJICAgICAgdm9pZCAoKmZuKSgpLCAKKwkgICAgICAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLCAKKwkgICAgICAvKkBkZXBlbmRlbnRAKi8gdm9pZCAqKmF2YWx1ZSkKK3sKKyAgZXh0ZW5kZWRfY2lmIGVjaWY7CisgIGludCBmbGFnczsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisgIAorICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0IGFuZCB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuCSovCisgIC8qIHZhbHVlIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lCQkgICAgICAgICovCisKKyAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYgcmV0dmFsX29uX3N0YWNrKGNpZi0+cnR5cGUpKQorICAgIHsKKyAgICAgIC8qQC1zeXN1bnJlY29nQCovCisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICAgIC8qQD1zeXN1bnJlY29nQCovCisgICAgfQorICBlbHNlCisgICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CisKKyAgZmxhZ3MgPSBjaWYtPmZsYWdzOworICBpZiAoZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gOCkgeworCWZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OworICAgIH0gZWxzZSBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSA0KSB7CisgICAgICAgIGZsYWdzID0gRkZJX1RZUEVfSU5UOworICAgIH0gZWxzZSBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSAyKSB7CisgICAgICAgIGZsYWdzID0gRkZJX1RZUEVfSU5UOworICAgIH0gZWxzZSBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSAxKSB7CisgICAgICAgIGZsYWdzID0gRkZJX1RZUEVfSU5UOworICAgIH0KKyAgfQorCisgIAorICBzd2l0Y2ggKGNpZi0+YWJpKSAKKyAgICB7CisgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgIC8qQC11c2VkZWZAKi8KKyAgICAgIC8qIFRvIGF2b2lkIGNoYW5naW5nIHRoZSBhc3NlbWJseSBjb2RlIG1ha2Ugc3VyZSB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQgCisgICAgICAgKiBibG9jayBpcyBhIG11bHRpcGxlIG9mIDE2LiBUaGVuIGFkZCA4IHRvIGNvbXBlbnNhdGUgZm9yIGxvY2FsIHZhcmlhYmxlcworICAgICAgICogaW4gZmZpX2NhbGxfU1lTVi4KKyAgICAgICAqLworICAgICAgZmZpX2NhbGxfU1lTVihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgQUxJR04oY2lmLT5ieXRlcywgMTYpICs4LCAKKwkJICAgIGZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgLypAPXVzZWRlZkAqLworICAgICAgYnJlYWs7CisjaWZkZWYgWDg2X1dJTjMyCisgICAgY2FzZSBGRklfU1REQ0FMTDoKKyAgICAgIC8qQC11c2VkZWZAKi8KKyAgICAgIGZmaV9jYWxsX1NURENBTEwoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsCisJCSAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgLypAPXVzZWRlZkAqLworICAgICAgYnJlYWs7CisjZW5kaWYgLyogWDg2X1dJTjMyICovCisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKworLyoqIHByaXZhdGUgbWVtYmVycyAqKi8KKworc3RhdGljIHZvaWQgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWIChjaGFyICpzdGFjaywgdm9pZCAqKnJldCwKKwkJCQkJIHZvaWQqKiBhcmdzLCBmZmlfY2lmKiBjaWYpOworc3RhdGljIHZvaWQgZmZpX2Nsb3N1cmVfU1lTViAoZmZpX2Nsb3N1cmUgKikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKKyNpZiAhRkZJX05PX1JBV19BUEkKK3N0YXRpYyB2b2lkIGZmaV9jbG9zdXJlX3Jhd19TWVNWIChmZmlfcmF3X2Nsb3N1cmUgKikKKyAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGp1bXBlZCB0byBieSB0aGUgdHJhbXBvbGluZSAqLworCitzdGF0aWMgdm9pZAorZmZpX2Nsb3N1cmVfU1lTViAoY2xvc3VyZSkKKyAgICAgZmZpX2Nsb3N1cmUgKmNsb3N1cmU7Cit7CisgIC8vIHRoaXMgaXMgb3VyIHJldHVybiB2YWx1ZSBzdG9yYWdlCisgIGxvbmcgZG91YmxlICByZXM7CisKKyAgLy8gb3VyIHZhcmlvdXMgdGhpbmdzLi4uCisgIGZmaV9jaWYgICAgICAgKmNpZjsKKyAgdm9pZCAgICAgICAgICoqYXJnX2FyZWE7CisgIHVuc2lnbmVkIHNob3J0IHJ0eXBlOworICB2b2lkICAgICAgICAgICpyZXNwID0gKHZvaWQqKSZyZXM7CisgIHZvaWQgKmFyZ3MgPSBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpOworCisgIGNpZiAgICAgICAgID0gY2xvc3VyZS0+Y2lmOworICBhcmdfYXJlYSAgICA9ICh2b2lkKiopIGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZiAodm9pZCopKTsgIAorCisgIC8qIHRoaXMgY2FsbCB3aWxsIGluaXRpYWxpemUgQVJHX0FSRUEsIHN1Y2ggdGhhdCBlYWNoCisgICAqIGVsZW1lbnQgaW4gdGhhdCBhcnJheSBwb2ludHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgCisgICAqIHZhbHVlIG9uIHRoZSBzdGFjazsgYW5kIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgICAqIGEgc3RydWN0dXJlLCBpdCB3aWxsIHJlLXNldCBSRVNQIHRvIHBvaW50IHRvIHRoZQorICAgKiBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MuICAqLworCisgIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVihhcmdzLCAodm9pZCoqKSZyZXNwLCBhcmdfYXJlYSwgY2lmKTsKKyAgCisgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJlc3AsIGFyZ19hcmVhLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIHJ0eXBlID0gY2lmLT5mbGFnczsKKworICBpZiAoIXJldHZhbF9vbl9zdGFjayhjaWYtPnJ0eXBlKSAmJiBjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkgeworICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gOCkgeworICAgICAgICAgcnR5cGUgPSBGRklfVFlQRV9TSU5UNjQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAgcnR5cGUgPSBGRklfVFlQRV9JTlQ7CisgICAgICB9CisgIH0KKworICAvKiBub3csIGRvIGEgZ2VuZXJpYyByZXR1cm4gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHJ0eXBlICovCisgIGlmIChydHlwZSA9PSBGRklfVFlQRV9JTlQpCisgICAgeworICAgICAgYXNtICgibW92bCAoJTApLCUlZWF4IiA6IDogInIiIChyZXNwKSA6ICJlYXgiKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0ZMT0FUKQorICAgIHsKKyAgICAgIGFzbSAoImZsZHMgKCUwKSIgOiA6ICJyIiAocmVzcCkgOiAic3QiICk7CisgICAgfQorICBlbHNlIGlmIChydHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisgICAgeworICAgICAgYXNtICgiZmxkbCAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIsICJzdCgxKSIgKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCisgICAgeworICAgICAgYXNtICgiZmxkdCAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIsICJzdCgxKSIgKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NJTlQ2NCkKKyAgICB7CisgICAgICBhc20gKCJtb3ZsIDAoJTApLCUlZWF4OyIKKwkgICAibW92bCA0KCUwKSwlJWVkeCIgCisJICAgOiA6ICJyIihyZXNwKQorCSAgIDogImVheCIsICJlZHgiKTsKKyAgICB9CisjaWZkZWYgWDg2X1dJTjMyCisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NJTlQ4KSAvKiAxLWJ5dGUgc3RydWN0ICAqLworICAgIHsKKyAgICAgIGFzbSAoIm1vdnNibCAoJTApLCUlZWF4IiA6IDogInIiIChyZXNwKSA6ICJlYXgiKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NJTlQxNikgLyogMi1ieXRlcyBzdHJ1Y3QgKi8KKyAgICB7CisgICAgICBhc20gKCJtb3Zzd2wgKCUwKSwlJWVheCIgOiA6ICJyIiAocmVzcCkgOiAiZWF4Iik7CisgICAgfQorI2VuZGlmCit9CisKKy8qQC1leHBvcnRoZWFkZXJAKi8KK3N0YXRpYyB2b2lkIAorZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGNoYXIgKnN0YWNrLCB2b2lkICoqcnZhbHVlLAorCQkJICAgIHZvaWQgKiphdmFsdWUsIGZmaV9jaWYgKmNpZikKKy8qQD1leHBvcnRoZWFkZXJAKi8KK3sKKyAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgIHJlZ2lzdGVyIHZvaWQgKipwX2FyZ3Y7CisgIHJlZ2lzdGVyIGNoYXIgKmFyZ3A7CisgIHJlZ2lzdGVyIGZmaV90eXBlICoqcF9hcmc7CisKKyAgYXJncCA9IHN0YWNrOworCisgIGlmIChyZXR2YWxfb25fc3RhY2soY2lmLT5ydHlwZSkpIHsKKyAgICAqcnZhbHVlID0gKih2b2lkICoqKSBhcmdwOworICAgIGFyZ3AgKz0gNDsKKyAgfQorCisgIHBfYXJndiA9IGF2YWx1ZTsKKworICBmb3IgKGkgPSBjaWYtPm5hcmdzLCBwX2FyZyA9IGNpZi0+YXJnX3R5cGVzOyAoaSAhPSAwKTsgaS0tLCBwX2FyZysrKQorICAgIHsKKyAgICAgIHNpemVfdCB6OworCisgICAgICAvKiBBbGlnbiBpZiBuZWNlc3NhcnkgKi8KKyAgICAgIGlmICgoc2l6ZW9mKGludCkgLSAxKSAmICh1bnNpZ25lZCkgYXJncCkgeworCWFyZ3AgPSAoY2hhciAqKSBBTElHTihhcmdwLCBzaXplb2YoaW50KSk7CisgICAgICB9CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKworICAgICAgLyogYmVjYXVzZSB3ZSdyZSBsaXR0bGUgZW5kaWFuLCB0aGlzIGlzIHdoYXQgaXQgdHVybnMgaW50by4gICAqLworCisgICAgICAqcF9hcmd2ID0gKHZvaWQqKSBhcmdwOworCisgICAgICBwX2FyZ3YrKzsKKyAgICAgIGFyZ3AgKz0gejsKKyAgICB9CisgIAorICByZXR1cm47Cit9CisKKy8qIEhvdyB0byBtYWtlIGEgdHJhbXBvbGluZS4gIERlcml2ZWQgZnJvbSBnY2MvY29uZmlnL2kzODYvaTM4Ni5jLiAqLworCisjZGVmaW5lIEZGSV9JTklUX1RSQU1QT0xJTkUoVFJBTVAsRlVOLENUWCkgXAorKHsgdW5zaWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOyBcCisgICB1bnNpZ25lZCBpbnQgIF9fZnVuID0gKHVuc2lnbmVkIGludCkoRlVOKTsgXAorICAgdW5zaWduZWQgaW50ICBfX2N0eCA9ICh1bnNpZ25lZCBpbnQpKENUWCk7IFwKKyAgIHVuc2lnbmVkIGludCAgX19kaXMgPSBfX2Z1biAtICgodW5zaWduZWQgaW50KSBfX3RyYW1wICsgRkZJX1RSQU1QT0xJTkVfU0laRSk7IFwKKyAgICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzBdID0gMHhiODsgXAorICAgKih1bnNpZ25lZCBpbnQqKSAgJl9fdHJhbXBbMV0gPSBfX2N0eDsgLyogbW92bCBfX2N0eCwgJWVheCAqLyBcCisgICAqKHVuc2lnbmVkIGNoYXIgKikgICZfX3RyYW1wWzVdID0gMHhlOTsgXAorICAgKih1bnNpZ25lZCBpbnQqKSAgJl9fdHJhbXBbNl0gPSBfX2RpczsgLyogam1wIF9fZnVuICAqLyBcCisgfSkKKworCisvKiB0aGUgY2lmIG11c3QgYWxyZWFkeSBiZSBwcmVwJ2VkICovCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX2Nsb3N1cmUgKGZmaV9jbG9zdXJlKiBjbG9zdXJlLAorCQkgIGZmaV9jaWYqIGNpZiwKKwkJICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKix2b2lkKiosdm9pZCopLAorCQkgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpOworCisgIEZGSV9JTklUX1RSQU1QT0xJTkUgKCZjbG9zdXJlLT50cmFtcFswXSwgXAorCQkgICAgICAgJmZmaV9jbG9zdXJlX1NZU1YsICBcCisJCSAgICAgICAodm9pZCopY2xvc3VyZSk7CisgICAgCisgIGNsb3N1cmUtPmNpZiAgPSBjaWY7CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgY2xvc3VyZS0+ZnVuICA9IGZ1bjsKKworICByZXR1cm4gRkZJX09LOworfQorCisvKiAtLS0tLS0tIE5hdGl2ZSByYXcgQVBJIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICFGRklfTk9fUkFXX0FQSQorCitzdGF0aWMgdm9pZAorZmZpX2Nsb3N1cmVfcmF3X1NZU1YgKGNsb3N1cmUpCisgICAgIGZmaV9yYXdfY2xvc3VyZSAqY2xvc3VyZTsKK3sKKyAgLy8gdGhpcyBpcyBvdXIgcmV0dXJuIHZhbHVlIHN0b3JhZ2UKKyAgbG9uZyBkb3VibGUgICAgcmVzOworCisgIC8vIG91ciB2YXJpb3VzIHRoaW5ncy4uLgorICBmZmlfcmF3ICAgICAgICAgKnJhd19hcmdzOworICBmZmlfY2lmICAgICAgICAgKmNpZjsKKyAgdW5zaWduZWQgc2hvcnQgICBydHlwZTsKKyAgdm9pZCAgICAgICAgICAgICpyZXNwID0gKHZvaWQqKSZyZXM7CisKKyAgLyogZ2V0IHRoZSBjaWYgKi8KKyAgY2lmID0gY2xvc3VyZS0+Y2lmOworCisgIC8qIHRoZSBTWVNWL1g4NiBhYmkgbWF0Y2hlcyB0aGUgUkFXIEFQSSBleGFjdGx5LCB3ZWxsLi4gYWxtb3N0ICovCisgIHJhd19hcmdzID0gKGZmaV9yYXcqKSBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpOworCisgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJlc3AsIHJhd19hcmdzLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIHJ0eXBlID0gY2lmLT5mbGFnczsKKworICAvKiBub3csIGRvIGEgZ2VuZXJpYyByZXR1cm4gYmFzZWQgb24gdGhlIHZhbHVlIG9mIHJ0eXBlICovCisgIGlmIChydHlwZSA9PSBGRklfVFlQRV9JTlQpCisgICAgeworICAgICAgYXNtICgibW92bCAoJTApLCUlZWF4IiA6IDogInIiIChyZXNwKSA6ICJlYXgiKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0ZMT0FUKQorICAgIHsKKyAgICAgIGFzbSAoImZsZHMgKCUwKSIgOiA6ICJyIiAocmVzcCkgOiAic3QiICk7CisgICAgfQorICBlbHNlIGlmIChydHlwZSA9PSBGRklfVFlQRV9ET1VCTEUpCisgICAgeworICAgICAgYXNtICgiZmxkbCAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIsICJzdCgxKSIgKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0xPTkdET1VCTEUpCisgICAgeworICAgICAgYXNtICgiZmxkdCAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIsICJzdCgxKSIgKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX1NJTlQ2NCkKKyAgICB7CisgICAgICBhc20gKCJtb3ZsIDAoJTApLCUlZWF4OyBtb3ZsIDQoJTApLCUlZWR4IiAKKwkgICA6IDogInIiKHJlc3ApCisJICAgOiAiZWF4IiwgImVkeCIpOworICAgIH0KK30KKworIAorCisKK2ZmaV9zdGF0dXMKK2ZmaV9wcmVwX3Jhd19jbG9zdXJlIChmZmlfcmF3X2Nsb3N1cmUqIGNsb3N1cmUsCisJCSAgICAgIGZmaV9jaWYqIGNpZiwKKwkJICAgICAgdm9pZCAoKmZ1bikoZmZpX2NpZiosdm9pZCosZmZpX3Jhdyosdm9pZCopLAorCQkgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgIGludCBpOworCisgIEZGSV9BU1NFUlQgKGNpZi0+YWJpID09IEZGSV9TWVNWKTsKKworICAvLyB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBjZXJ0YWluIGtpbmRzIG9mIGFyZ3VtZW50cyBmb3IgcmF3CisgIC8vIGNsb3N1cmVzLiAgVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgYSBzZXBhcmF0ZSBhc3NlbWJseSBsYW5ndWFnZQorICAvLyByb3V0aW5lLCBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIGFyZ3VtZW50IHByb2Nlc3NpbmcsIHNvbWV0aGluZyB3ZQorICAvLyBkb24ndCBkbyBub3cgZm9yIHBlcmZvcm1hbmNlLgorCisgIGZvciAoaSA9IGNpZi0+bmFyZ3MtMTsgaSA+PSAwOyBpLS0pCisgICAgeworICAgICAgRkZJX0FTU0VSVCAoY2lmLT5hcmdfdHlwZXNbaV0tPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUKTsKKyAgICAgIEZGSV9BU1NFUlQgKGNpZi0+YXJnX3R5cGVzW2ldLT50eXBlICE9IEZGSV9UWVBFX0xPTkdET1VCTEUpOworICAgIH0KKyAgCisKKyAgRkZJX0lOSVRfVFJBTVBPTElORSAoJmNsb3N1cmUtPnRyYW1wWzBdLCAmZmZpX2Nsb3N1cmVfcmF3X1NZU1YsCisJCSAgICAgICAodm9pZCopY2xvc3VyZSk7CisgICAgCisgIGNsb3N1cmUtPmNpZiAgPSBjaWY7CisgIGNsb3N1cmUtPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgY2xvc3VyZS0+ZnVuICA9IGZ1bjsKKworICByZXR1cm4gRkZJX09LOworfQorCitzdGF0aWMgdm9pZCAKK2ZmaV9wcmVwX2FyZ3NfcmF3KGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCit7CisgIG1lbWNweSAoc3RhY2ssIGVjaWYtPmF2YWx1ZSwgZWNpZi0+Y2lmLT5ieXRlcyk7Cit9CisKKy8qIHdlIGJvcnJvdyB0aGlzIHJvdXRpbmUgZnJvbSBsaWJmZmkgKGl0IG11c3QgYmUgY2hhbmdlZCwgdGhvdWdoLCB0bworICogYWN0dWFsbHkgY2FsbCB0aGUgZnVuY3Rpb24gcGFzc2VkIGluIHRoZSBmaXJzdCBhcmd1bWVudC4gIGFzIG9mCisgKiBsaWJmZmktMS4yMCwgdGhpcyBpcyBub3QgdGhlIGNhc2UuKQorICovCisKK2V4dGVybiB2b2lkIAorZmZpX2NhbGxfU1lTVih2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwgCisJICAgICAgLypAb3V0QCovIGV4dGVuZGVkX2NpZiAqLCAKKwkgICAgICB1bnNpZ25lZCwgdW5zaWduZWQsIAorCSAgICAgIC8qQG91dEAqLyB1bnNpZ25lZCAqLCAKKwkgICAgICB2b2lkICgqZm4pKCkpOworCisjaWZkZWYgWDg2X1dJTjMyCitleHRlcm4gdm9pZAorZmZpX2NhbGxfU1REQ0FMTCh2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwKKwkgICAgICAvKkBvdXRAKi8gZXh0ZW5kZWRfY2lmICosCisJICAgICAgdW5zaWduZWQsIHVuc2lnbmVkLAorCSAgICAgIC8qQG91dEAqLyB1bnNpZ25lZCAqLAorCSAgICAgIHZvaWQgKCpmbikoKSk7CisjZW5kaWYgLyogWDg2X1dJTjMyICovCisKK3ZvaWQKK2ZmaV9yYXdfY2FsbCgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKKwkgICAgIHZvaWQgKCpmbikoKSwgCisJICAgICAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLCAKKwkgICAgIC8qQGRlcGVuZGVudEAqLyBmZmlfcmF3ICpmYWtlX2F2YWx1ZSkKK3sKKyAgZXh0ZW5kZWRfY2lmIGVjaWY7CisgIHZvaWQgKiphdmFsdWUgPSAodm9pZCAqKilmYWtlX2F2YWx1ZTsKKworICBlY2lmLmNpZiA9IGNpZjsKKyAgZWNpZi5hdmFsdWUgPSBhdmFsdWU7CisgIAorICAvKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RydWN0IGFuZCB3ZSBkb24ndCBoYXZlIGEgcmV0dXJuCSovCisgIC8qIHZhbHVlIGFkZHJlc3MgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugb25lCQkgICAgICAgICovCisKKyAgaWYgKChydmFsdWUgPT0gTlVMTCkgJiYgcmV0dmFsX29uX3N0YWNrKGNpZi0+cnR5cGUpKSAKKyAgICB7CisgICAgICAvKkAtc3lzdW5yZWNvZ0AqLworICAgICAgZWNpZi5ydmFsdWUgPSBhbGxvY2EoY2lmLT5ydHlwZS0+c2l6ZSk7CisgICAgICAvKkA9c3lzdW5yZWNvZ0AqLworICAgIH0KKyAgZWxzZQorICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOworICAgIAorICAKKyAgc3dpdGNoIChjaWYtPmFiaSkgCisgICAgeworICAgIGNhc2UgRkZJX1NZU1Y6CisgICAgICAvKkAtdXNlZGVmQCovCisgICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3NfcmF3LCAmZWNpZiwgY2lmLT5ieXRlcywgCisJCSAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgLypAPXVzZWRlZkAqLworICAgICAgYnJlYWs7CisjaWZkZWYgWDg2X1dJTjMyCisgICAgY2FzZSBGRklfU1REQ0FMTDoKKyAgICAgIC8qQC11c2VkZWZAKi8KKyAgICAgIGZmaV9jYWxsX1NURENBTEwoZmZpX3ByZXBfYXJnc19yYXcsICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkgICAgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIC8qQD11c2VkZWZAKi8KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIFg4Nl9XSU4zMiAqLworICAgIGRlZmF1bHQ6CisgICAgICBGRklfQVNTRVJUKDApOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9feDg2XzY0X18gICovCisKKyNlbmRpZiAvKiBfX2kzODZfXyAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaXRhcmdldC5oCmluZGV4IDk1MDBmNDAuLjhiMjBkM2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZml0YXJnZXQuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpdGFyZ2V0LmgKQEAgLTUxLDcgKzUxLDcgQEAKICNlbmRpZgogCiAgIC8qIC0tLS0gSW50ZWwgeDg2IGFuZCBBTUQgeDg2LTY0IC0gKi8KLSNpZiAhZGVmaW5lZChYODZfV0lOMzIpICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpIAogICBGRklfU1lTViwKICAgRkZJX1VOSVg2NCwgICAvKiBVbml4IHZhcmlhbnRzIGFsbCB1c2UgdGhlIHNhbWUgQUJJIGZvciB4ODYtNjQgICovCiAjaWZkZWYgX19pMzg2X18KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuYwppbmRleCA1YzQ5YjM5Li5lNTYwMGIyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5jCkBAIC0yNiw4ICsyNiw2IEBACiAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZuZGVmIF9feDg2XzY0X18KLQogI2luY2x1ZGUgPGZmaS5oPgogI2luY2x1ZGUgPGZmaV9jb21tb24uaD4KIApAQCAtMTQzLDExICsxNDEsNyBAQAogCiAvKkAtZGVjbHVuZGVmQCovCiAvKkAtZXhwb3J0aGVhZGVyQCovCi0jaWZkZWYgX01TQ19WRVIKIGV4dGVybiBpbnQKLSNlbHNlCi1leHRlcm4gdm9pZAotI2VuZGlmCiBmZmlfY2FsbF9TWVNWKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCAKIAkgICAgICAvKkBvdXRAKi8gZXh0ZW5kZWRfY2lmICosIAogCSAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCwgCkBAIC0xNTYsMTQgKzE1MCw5IEBACiAvKkA9ZGVjbHVuZGVmQCovCiAvKkA9ZXhwb3J0aGVhZGVyQCovCiAKLSNpZiBkZWZpbmVkKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKIC8qQC1kZWNsdW5kZWZAKi8KIC8qQC1leHBvcnRoZWFkZXJAKi8KLSNpZmRlZiBfTVNDX1ZFUgogZXh0ZXJuIGludAotI2Vsc2UKLWV4dGVybiB2b2lkCi0jZW5kaWYKIGZmaV9jYWxsX1NURENBTEwodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksCiAJCSAvKkBvdXRAKi8gZXh0ZW5kZWRfY2lmICosCiAJCSB1bnNpZ25lZCwgdW5zaWduZWQsCkBAIC0xNzEsMTMgKzE2MCw4IEBACiAJCSB2b2lkICgqZm4pKCkpOwogLypAPWRlY2x1bmRlZkAqLwogLypAPWV4cG9ydGhlYWRlckAqLwotI2VuZGlmIC8qIFg4Nl9XSU4zMiB8fCBfTVNDX1ZFUiovCiAKLSNpZmRlZiBfTVNDX1ZFUgogaW50Ci0jZWxzZQotdm9pZAotI2VuZGlmCiBmZmlfY2FsbCgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKIAkgdm9pZCAoKmZuKSgpLCAKIAkgLypAb3V0QCovIHZvaWQgKnJ2YWx1ZSwgCkBAIC0yMDYsMjQgKzE5MCwxOCBAQAogICAgIHsKICAgICBjYXNlIEZGSV9TWVNWOgogICAgICAgLypALXVzZWRlZkAqLwotI2lmZGVmIF9NU0NfVkVSCi0gICAgICByZXR1cm4KLSNlbmRpZgotCSAgICAgIGZmaV9jYWxsX1NZU1YoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsIAotCQkJICAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICByZXR1cm4gZmZpX2NhbGxfU1lTVihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgCisJCQkgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOwogICAgICAgLypAPXVzZWRlZkAqLwogICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCisKICAgICBjYXNlIEZGSV9TVERDQUxMOgogICAgICAgLypALXVzZWRlZkAqLwotI2lmZGVmIF9NU0NfVkVSCi0gICAgICByZXR1cm4KLSNlbmRpZgotCSAgICAgIGZmaV9jYWxsX1NURENBTEwoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsCi0JCQkgICAgICAgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIHJldHVybiBmZmlfY2FsbF9TVERDQUxMKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLAorCQkJICAgICAgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuKTsKICAgICAgIC8qQD11c2VkZWZAKi8KICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIFg4Nl9XSU4zMiAqLworCiAgICAgZGVmYXVsdDoKICAgICAgIEZGSV9BU1NFUlQoMCk7CiAgICAgICBicmVhazsKQEAgLTIzNiwyMyArMjE0LDEwIEBACiAKIHN0YXRpYyB2b2lkIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTViAoY2hhciAqc3RhY2ssIHZvaWQgKipyZXQsCiAJCQkJCSB2b2lkKiogYXJncywgZmZpX2NpZiogY2lmKTsKLSNpZm5kZWYgX01TQ19WRVIKLXN0YXRpYyB2b2lkIGZmaV9jbG9zdXJlX1NZU1YgKGZmaV9jbG9zdXJlICopCi0gICAgIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDEpKSk7Ci1zdGF0aWMgdm9pZCBmZmlfY2xvc3VyZV9yYXdfU1lTViAoZmZpX3Jhd19jbG9zdXJlICopCi0gICAgIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDEpKSk7Ci0jZW5kaWYKLQogLyogVGhpcyBmdW5jdGlvbiBpcyBqdW1wZWQgdG8gYnkgdGhlIHRyYW1wb2xpbmUgKi8KIAotI2lmZGVmIF9NU0NfVkVSCiBzdGF0aWMgdm9pZCBfX2Zhc3RjYWxsCiBmZmlfY2xvc3VyZV9TWVNWIChmZmlfY2xvc3VyZSAqY2xvc3VyZSwgaW50ICphcmdwKQotI2Vsc2UKLXN0YXRpYyB2b2lkCi1mZmlfY2xvc3VyZV9TWVNWIChjbG9zdXJlKQotICAgICBmZmlfY2xvc3VyZSAqY2xvc3VyZTsKLSNlbmRpZgogewogICAvLyB0aGlzIGlzIG91ciByZXR1cm4gdmFsdWUgc3RvcmFnZQogICBsb25nIGRvdWJsZSAgICByZXM7CkBAIC0yNjIsMTEgKzIyNywxMSBAQAogICB2b2lkICAgICAgICAgKiphcmdfYXJlYTsKICAgdW5zaWduZWQgc2hvcnQgcnR5cGU7CiAgIHZvaWQgICAgICAgICAgKnJlc3AgPSAodm9pZCopJnJlczsKLSNpZmRlZiBfTVNDX1ZFUgorLy8jaWZkZWYgX01TQ19WRVIKICAgdm9pZCAqYXJncyA9ICZhcmdwWzFdOwotI2Vsc2UKLSAgdm9pZCAqYXJncyA9IF9fYnVpbHRpbl9kd2FyZl9jZmEgKCk7Ci0jZW5kaWYKKy8vI2Vsc2UKKy8vICB2b2lkICphcmdzID0gX19idWlsdGluX2R3YXJmX2NmYSAoKTsKKy8vI2VuZGlmCiAKICAgY2lmICAgICAgICAgPSBjbG9zdXJlLT5jaWY7CiAgIGFyZ19hcmVhICAgID0gKHZvaWQqKikgYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkKikpOyAgCkBAIC0zOTAsNyArMzU1LDcgQEAKIAogLyogTU9WIEVEWCwgRVNQIGlzIDB4OGIgMHhkNCAqLwogCi0jaWZkZWYgX01TQ19WRVIKKy8vI2lmZGVmIF9NU0NfVkVSCiAKICNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORShUUkFNUCxGVU4sQ1RYLEJZVEVTKSBcCiB7IHVuc2lnbmVkIGNoYXIgKl9fdHJhbXAgPSAodW5zaWduZWQgY2hhciopKFRSQU1QKTsgXApAQCAtNDA3LDE4ICszNzIsMTggQEAKICAgICoodW5zaWduZWQgc2hvcnQqKSAmX190cmFtcFsxM10gPSBCWVRFUzsgXAogIH0KIAotI2Vsc2UKLSNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORShUUkFNUCxGVU4sQ1RYLEJZVEVTKSBcCi0oeyB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKShUUkFNUCk7IFwKLSAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCi0gICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoQ1RYKTsgXAotICAgdW5zaWduZWQgaW50ICBfX2RpcyA9IF9fZnVuIC0gKCh1bnNpZ25lZCBpbnQpIF9fdHJhbXAgKyBGRklfVFJBTVBPTElORV9TSVpFKTsgXAotICAgKih1bnNpZ25lZCBjaGFyKikgJl9fdHJhbXBbMF0gPSAweGI4OyBcCi0gICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFsxXSA9IF9fY3R4OyAvKiBtb3ZsIF9fY3R4LCAlZWF4ICovIFwKLSAgICoodW5zaWduZWQgY2hhciAqKSAgJl9fdHJhbXBbNV0gPSAweGU5OyBcCi0gICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFs2XSA9IF9fZGlzOyAvKiBqbXAgX19mdW4gICovIFwKLSB9KQotI2VuZGlmCisvLyNlbHNlCisvLyNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORShUUkFNUCxGVU4sQ1RYLEJZVEVTKSBcCisvLyh7IHVuc2lnbmVkIGNoYXIgKl9fdHJhbXAgPSAodW5zaWduZWQgY2hhciopKFRSQU1QKTsgXAorLy8gICB1bnNpZ25lZCBpbnQgIF9fZnVuID0gKHVuc2lnbmVkIGludCkoRlVOKTsgXAorLy8gICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoQ1RYKTsgXAorLy8gICB1bnNpZ25lZCBpbnQgIF9fZGlzID0gX19mdW4gLSAoKHVuc2lnbmVkIGludCkgX190cmFtcCArIEZGSV9UUkFNUE9MSU5FX1NJWkUpOyBcCisvLyAgICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzBdID0gMHhiODsgXAorLy8gICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFsxXSA9IF9fY3R4OyAvKiBtb3ZsIF9fY3R4LCAlZWF4ICovIFwKKy8vICAgKih1bnNpZ25lZCBjaGFyICopICAmX190cmFtcFs1XSA9IDB4ZTk7IFwKKy8vICAgKih1bnNpZ25lZCBpbnQqKSAgJl9fdHJhbXBbNl0gPSBfX2RpczsgLyogam1wIF9fZnVuICAqLyBcCisvLyB9KQorLy8jZW5kaWYKIAogLyogdGhlIGNpZiBtdXN0IGFscmVhZHkgYmUgcHJlcCdlZCAqLwogCkBAIC00MzMsMTAgKzM5OCw4IEBACiAgIAogICBpZiAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpCiAgICAgYnl0ZXMgPSAwOwotI2lmZGVmIF9NU0NfVkVSCiAgIGVsc2UgaWYgKGNpZi0+YWJpID09IEZGSV9TVERDQUxMKQogICAgIGJ5dGVzID0gY2lmLT5ieXRlczsKLSNlbmRpZgogICBlbHNlCiAgICAgcmV0dXJuIEZGSV9CQURfQUJJOwogCkBAIC00NTAsNSArNDEzLDMgQEAKIAogICByZXR1cm4gRkZJX09LOwogfQotCi0jZW5kaWYgLyogX194ODZfNjRfXyAgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuaAppbmRleCBiOWQzMWZkLi4yMDMxNDJkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5oCkBAIC0yNzIsMTEgKzI3Miw3IEBACiAJCQkvKkBkZXBlbmRlbnRAKi8gLypAb3V0QCovIC8qQHBhcnRpYWxAKi8gZmZpX3R5cGUgKnJ0eXBlLCAKIAkJCS8qQGRlcGVuZGVudEAqLyBmZmlfdHlwZSAqKmF0eXBlcyk7CiAKLSNpZmRlZiBfTVNDX1ZFUgogaW50Ci0jZWxzZQotdm9pZAotI2VuZGlmCiBmZmlfY2FsbCgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKIAkgdm9pZCAoKmZuKSgpLCAKIAkgLypAb3V0QCovIHZvaWQgKnJ2YWx1ZSwgCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpX2NvbW1vbi5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaV9jb21tb24uaAppbmRleCAxYjk0OGQ1Li40M2ZiODNiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpX2NvbW1vbi5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmlfY29tbW9uLmgKQEAgLTEzLDI0ICsxMyw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgotCi0vKiBEbyBub3QgbW92ZSB0aGlzLiBTb21lIHZlcnNpb25zIG9mIEFJWCBhcmUgdmVyeSBwaWNreSBhYm91dCB3aGVyZQotICAgdGhpcyBpcyBwb3NpdGlvbmVkLiAqLwotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWYgSEFWRV9BTExPQ0FfSAotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKKyNpbmNsdWRlIDxtYWxsb2MuaD4KIAogLyogQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgbWVtY3B5LiAqLwogI2lmIFNURENfSEVBREVSUwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaXRhcmdldC5oCmluZGV4IGM5ZDk1YmMuLjU3ZDI3NWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZml0YXJnZXQuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpdGFyZ2V0LmgKQEAgLTQzLDIzICs0MywyMSBAQAogICBGRklfRklSU1RfQUJJID0gMCwKIAogICAvKiAtLS0tIEludGVsIHg4NiBXaW4zMiAtLS0tLS0tLS0tICovCi0jaWYgZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCiAgIEZGSV9TWVNWLAogICBGRklfU1REQ0FMTCwKICAgLyogVE9ETzogQWRkIGZhc3RjYWxsIHN1cHBvcnQgZm9yIHRoZSBzYWtlIG9mIGNvbXBsZXRlbmVzcyAqLwogICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKLSNlbmRpZgogCiAgIC8qIC0tLS0gSW50ZWwgeDg2IGFuZCBBTUQgeDg2LTY0IC0gKi8KLSNpZiAhZGVmaW5lZChYODZfV0lOMzIpICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQotICBGRklfU1lTViwKLSAgRkZJX1VOSVg2NCwgICAvKiBVbml4IHZhcmlhbnRzIGFsbCB1c2UgdGhlIHNhbWUgQUJJIGZvciB4ODYtNjQgICovCi0jaWZkZWYgX19pMzg2X18KLSAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1NZU1YsCi0jZWxzZQotICBGRklfREVGQVVMVF9BQkkgPSBGRklfVU5JWDY0LAotI2VuZGlmCi0jZW5kaWYKKy8qICNpZiAhZGVmaW5lZChYODZfV0lOMzIpICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKSAqLworLyogICBGRklfU1lTViwgKi8KKy8qICAgRkZJX1VOSVg2NCwqLyAgIC8qIFVuaXggdmFyaWFudHMgYWxsIHVzZSB0aGUgc2FtZSBBQkkgZm9yIHg4Ni02NCAgKi8KKy8qICNpZmRlZiBfX2kzODZfXyAqLworLyogICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwgKi8KKy8qICNlbHNlICovCisvKiAgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9VTklYNjQsICovCisvKiAjZW5kaWYgKi8KKy8qICNlbmRpZiAqLwogCiAgIEZGSV9MQVNUX0FCSSA9IEZGSV9ERUZBVUxUX0FCSSArIDEKIH0gZmZpX2FiaTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9taW5nd2luMzIuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9taW5nd2luMzIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzFmMmIyCi0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL21pbmd3aW4zMi5TCkBAIC0wLDAgKzEsMjI4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgd2luMzIuUyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwMSwgMjAwMiAgUmVkIEhhdCwgSW5jLgorCSAgICAgQ29weXJpZ2h0IChjKSAyMDAxICBKb2huIEJlbml0b24KKwkgICAgIENvcHlyaWdodCAoYykgMjAwMiAgUmFuaml0IE1hdGhldworCQkJCisgCisgICBYODYgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKKyAKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgCisgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICAgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAKKyNkZWZpbmUgTElCRkZJX0FTTQorI2luY2x1ZGUgPGZmaWNvbmZpZy5oPgorI2luY2x1ZGUgPGZmaS5oPgorIAorLnRleHQKKyAKKy5nbG9ibCBmZmlfcHJlcF9hcmdzCisgCisgICAgICAgICMgVGhpcyBhc3N1bWVzIHdlIGFyZSB1c2luZyBnYXMuCisgICAgICAgIC5iYWxpZ24gMTYKKy5nbG9ibCBfZmZpX2NhbGxfU1lTVgorIAorX2ZmaV9jYWxsX1NZU1Y6CisgICAgICAgIHB1c2hsICVlYnAKKyAgICAgICAgbW92bCAgJWVzcCwlZWJwCisgCisgICAgICAgICMgTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLgorICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgc3VibCAgJWVjeCwlZXNwCisgCisgICAgICAgIG1vdmwgICVlc3AsJWVheAorIAorICAgICAgICAjIFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbgorICAgICAgICBwdXNobCAxMiglZWJwKQorICAgICAgICBwdXNobCAlZWF4CisgICAgICAgIGNhbGwgICo4KCVlYnApCisgCisgICAgICAgICMgUmV0dXJuIHN0YWNrIHRvIHByZXZpb3VzIHN0YXRlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbgorICAgICAgICBhZGRsICAkOCwlZXNwCisgCisgICAgICAgICMgRklYTUU6IEFsaWduIHRoZSBzdGFjayB0byBhIDEyOC1iaXQgYm91bmRhcnkgdG8gYXZvaWQKKyAgICAgICAgIyBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaGl0cy4KKworCWNhbGwgICoyOCglZWJwKQorIAorICAgICAgICAjIFJlbW92ZSB0aGUgc3BhY2Ugd2UgcHVzaGVkIGZvciB0aGUgYXJncworICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4CisgICAgICAgIGFkZGwgICVlY3gsJWVzcAorIAorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSByZXR1cm4gdHlwZSBjb2RlCisgICAgICAgIG1vdmwgIDIwKCVlYnApLCVlY3gKKyAKKyAgICAgICAgIyBJZiB0aGUgcmV0dXJuIHZhbHVlIHBvaW50ZXIgaXMgTlVMTCwgYXNzdW1lIG5vIHJldHVybiB2YWx1ZS4KKyAgICAgICAgY21wbCAgJDAsMjQoJWVicCkKKyAgICAgICAgam5lICAgcmV0aW50CisgCisgICAgICAgICMgRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlCisgICAgICAgICMgb2JsaWdlZCB0byBoYW5kbGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICAgICAgICBjbXBsICAkMiwlZWN4ICAjIEZsb2F0X3R5cGUKKyAgICAgICAgam5lICAgbm9yZXR2YWwKKyAgICAgICAgZnN0cCAgJXN0KDApCisgCisgICAgICAgIGptcCAgIGVwaWxvZ3VlCisgCityZXRpbnQ6CisgICAgICAgIGNtcGwgICQxLCVlY3ggICAgIyBJbnRfdHlwZQorICAgICAgICBqbmUgICByZXRmbG9hdAorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKKyAgICAgICAgam1wICAgZXBpbG9ndWUKKyAKK3JldGZsb2F0OgorICAgICAgICBjbXBsICAkMiwlZWN4ICAgIyBGbG9hdF90eXBlCisgICAgICAgIGpuZSAgIHJldGRvdWJsZSAgIAorICAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgZnN0cHMgKCVlY3gpCisgICAgICAgIGptcCAgIGVwaWxvZ3VlCisgCityZXRkb3VibGU6CisgICAgICAgIGNtcGwgICQzLCVlY3ggICAgICMgRG91YmxlX3R5cGUKKyAgICAgICAgam5lICAgcmV0bG9uZ2RvdWJsZQorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBmc3RwbCAoJWVjeCkKKyAgICAgICAgam1wICAgZXBpbG9ndWUKKyAKK3JldGxvbmdkb3VibGU6CisgICAgICAgIGNtcGwgICQ0LCVlY3ggICAgICMgTG9uZ2RvdWJsZV90eXBlCisgICAgICAgIGpuZSAgIHJldGludDY0CisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIGZzdHB0ICglZWN4KQorICAgICAgICBqbXAgICBlcGlsb2d1ZQorIAorcmV0aW50NjQ6CisgICAgICAgIGNtcGwgICQxMiwlZWN4ICAgICAgIyBTSU5UNjRfdHlwZQorICAgICAgICBqbmUgICByZXRzdHJ1Y3QKKyAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgbW92bCAgJWVheCwwKCVlY3gpCisgICAgICAgIG1vdmwgICVlZHgsNCglZWN4KQorIAorcmV0c3RydWN0OgorICAgICAgICAjIE5vdGhpbmcgdG8gZG8hCisgCitub3JldHZhbDoKK2VwaWxvZ3VlOgorICAgICAgICBtb3ZsICVlYnAsJWVzcAorICAgICAgICBwb3BsICVlYnAKKyAgICAgICAgcmV0CisgCisuZmZpX2NhbGxfU1lTVl9lbmQ6CisKKyAgICAgICAgIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KKyAgICAgICAgLmJhbGlnbiAxNgorLmdsb2JsIF9mZmlfY2FsbF9TVERDQUxMCisKK19mZmlfY2FsbF9TVERDQUxMOgorICAgICAgICBwdXNobCAlZWJwCisgICAgICAgIG1vdmwgICVlc3AsJWVicAorCisgICAgICAgICMgTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLgorICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4IAorICAgICAgICBzdWJsICAlZWN4LCVlc3AKKworICAgICAgICBtb3ZsICAlZXNwLCVlYXgKKworICAgICAgICAjIFBsYWNlIGFsbCBvZiB0aGUgZmZpX3ByZXBfYXJncyBpbiBwb3NpdGlvbgorICAgICAgICBwdXNobCAxMiglZWJwKQorICAgICAgICBwdXNobCAlZWF4CisgICAgICAgIGNhbGwgICo4KCVlYnApCisKKyAgICAgICAgIyBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uCisgICAgICAgIGFkZGwgICQ4LCVlc3AKKworICAgICAgICAjIEZJWE1FOiBBbGlnbiB0aGUgc3RhY2sgdG8gYSAxMjgtYml0IGJvdW5kYXJ5IHRvIGF2b2lkCisgICAgICAgICMgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGhpdHMuCisKKyAgICAgICAgY2FsbCAgKjI4KCVlYnApCisKKyAgICAgICAgIyBzdGRjYWxsIGZ1bmN0aW9ucyBwb3AgYXJndW1lbnRzIG9mZiB0aGUgc3RhY2sgdGhlbXNlbHZlcworCisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKKyAgICAgICAgbW92bCAgMjAoJWVicCksJWVjeAorCisgICAgICAgICMgSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuCisgICAgICAgIGNtcGwgICQwLDI0KCVlYnApCisgICAgICAgIGpuZSAgIHNjX3JldGludAorCisgICAgICAgICMgRXZlbiBpZiB0aGVyZSBpcyBubyBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZSwgd2UgYXJlCisgICAgICAgICMgb2JsaWdlZCB0byBoYW5kbGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgorICAgICAgICBjbXBsICAkMiwlZWN4ICAgICAgIyBGbG9hdF90eXBlCisgICAgICAgIGpuZSAgIHNjX25vcmV0dmFsCisgICAgICAgIGZzdHAgICVzdCgwKQorCisgICAgICAgIGptcCAgIHNjX2VwaWxvZ3VlCisKK3NjX3JldGludDoKKyAgICAgICAgY21wbCAgJDEsJWVjeCAgICAgICAjIEludF90eXBlCisgICAgICAgIGpuZSAgIHNjX3JldGZsb2F0CisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIG1vdmwgICVlYXgsMCglZWN4KQorICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQorCitzY19yZXRmbG9hdDoKKyAgICAgICAgY21wbCAgJDIsJWVjeCAgICAgICAjIEZsb2F0X3R5cGUKKyAgICAgICAgam5lICAgc2NfcmV0ZG91YmxlCisgICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBmc3RwcyAoJWVjeCkKKyAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKKworc2NfcmV0ZG91YmxlOgorICAgICAgICBjbXBsICAkMiwlZWN4ICAgICAgICMgRG91YmxlX3R5cGUKKyAgICAgICAgam5lICAgc2NfcmV0bG9uZ2RvdWJsZQorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBmc3RwbCAoJWVjeCkKKyAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKKworc2NfcmV0bG9uZ2RvdWJsZToKKyAgICAgICAgY21wbCAgJDQsJWVjeCAgICAgICMgTG9uZ2RvdWJsZV90eXBlIAorICAgICAgICBqbmUgICBzY19yZXRpbnQ2NAorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBmc3RwdCAoJWVjeCkKKyAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKKworc2NfcmV0aW50NjQ6CisgICAgICAgIGNtcGwgICQxMiwlZWN4ICAgICAgIyBTSU5UNjRfVHlwZQorICAgICAgICBqbmUgICBzY19yZXRzdHJ1Y3QKKyAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgbW92bCAgJWVheCwwKCVlY3gpCisgICAgICAgIG1vdmwgICVlZHgsNCglZWN4KQorCitzY19yZXRzdHJ1Y3Q6CisgICAgICAgICMgTm90aGluZyB0byBkbyEKKworc2Nfbm9yZXR2YWw6CitzY19lcGlsb2d1ZToKKyAgICAgICAgbW92bCAlZWJwLCVlc3AKKyAgICAgICAgcG9wbCAlZWJwCisgICAgICAgIHJldAorCisuZmZpX2NhbGxfU1REQ0FMTF9lbmQ6CisKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9wcmVwX2NpZi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3ByZXBfY2lmLmMKaW5kZXggOWVkY2UyZi4uMjY1MGZhMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3ByZXBfY2lmLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3ByZXBfY2lmLmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgZWxzZQogI2VuZGlmCiAJewotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKIAkJLyogRG9uJ3Qga25vdyBpZiB0aGlzIGlzIGEgbGliZmZpIGJ1ZyBvciBub3QuICBBdCBsZWFzdCBvbgogCQkgICBXaW5kb3dzIHdpdGggTVNWQywgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXJzIGFyZSAqbm90KgogCQkgICBhbGlnbmVkIGluIHRoZSBzYW1lIHdheSBhcyBzdHJ1Y3R1cmUgZmllbGRzIGFyZSwgdGhleSBhcmUKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy93aW4zMi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3dpbjMyLlMKaW5kZXggNDA3NDNhZi4uY2M4MmFiOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3dpbjMyLlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3dpbjMyLlMKQEAgLTQxLDcgKzQxLDExIEBACiBfZmZpX2NhbGxfU1lTVjoKICAgICAgICAgcHVzaGwgJWVicAogICAgICAgICBtb3ZsICAlZXNwLCVlYnAKLSAKKworCSNUSGU6IHNhdmUgcHJldmlvdXMgJWVzaSwgYW5kIHN0b3JlIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIgaW4gJWVzaQorCXB1c2hsICVlc2kKKwltb3ZsICVlc3AsJWVzaQorCiAgICAgICAgICMgTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLgogICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgc3VibCAgJWVjeCwlZXNwCkBAIC02NCw3ICs2OCw5IEBACiAgICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzCiAgICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3gKICAgICAgICAgYWRkbCAgJWVjeCwlZXNwCi0gCisKKwlzdWIgJWVzcCwlZXNpICMgY2FsY3VsYXRlIHN0YWNrIHBvaW50ZXIgZGlmZmVyZW5jZQorCiAgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKICAgICAgICAgbW92bCAgMjAoJWVicCksJWVjeAogIApAQCAtMTI1LDYgKzEzMSw4IEBACiAgCiBub3JldHZhbDoKIGVwaWxvZ3VlOgorCW1vdmwgJWVzaSwlZWF4ICMgcmV0dXJuIHRoZSBzdGFjayBwb2ludGVyIGRldGx0YSBpbiAlZWF4CisJcG9wbCAlZXNpICMgcmVzdG9yZSBwcmV2aW91cyAlZXNpCiAgICAgICAgIG1vdmwgJWVicCwlZXNwCiAgICAgICAgIHBvcGwgJWVicAogICAgICAgICByZXQKQEAgLTEzOSw2ICsxNDcsMTAgQEAKICAgICAgICAgcHVzaGwgJWVicAogICAgICAgICBtb3ZsICAlZXNwLCVlYnAKIAorCSNUSGU6IHNhdmUgcHJldmlvdXMgJWVzaSwgYW5kIHN0b3JlIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIgaW4gJWVzaQorCXB1c2hsICVlc2kKKwltb3ZsICVlc3AsJWVzaQorCQogICAgICAgICAjIE1ha2Ugcm9vbSBmb3IgYWxsIG9mIHRoZSBuZXcgYXJncy4KICAgICAgICAgbW92bCAgMTYoJWVicCksJWVjeCAKICAgICAgICAgc3VibCAgJWVjeCwlZXNwCkBAIC0xNTgsNiArMTcwLDggQEAKIAogICAgICAgICBjYWxsICAqMjgoJWVicCkKIAorCXN1YiAlZXNwLCVlc2kgIyBkaWZmZXJlbmNlIGluIHN0YWNrCisKICAgICAgICAgIyBzdGRjYWxsIGZ1bmN0aW9ucyBwb3AgYXJndW1lbnRzIG9mZiB0aGUgc3RhY2sgdGhlbXNlbHZlcwogCiAgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKQEAgLTIyMCw2ICsyMzQsOCBAQAogCiBzY19ub3JldHZhbDoKIHNjX2VwaWxvZ3VlOgorICAgICAgICBtb3ZsICVlc2ksJWVheCAjIHJldHVybiB0aGUgc3RhY2sgZGlmZmVyZW5jZQorCXBvcGwgJWVzaSAjIHJlc3RvcmUgcHJldmlvdXMgJWVzaSB2YWx1ZQogICAgICAgICBtb3ZsICVlYnAsJWVzcAogICAgICAgICBwb3BsICVlYnAKICAgICAgICAgcmV0CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19lbGVtZW50dHJlZS5jIGIvTW9kdWxlcy9fZWxlbWVudHRyZWUuYwppbmRleCA3ZTM2ZWEzLi44NzFhYTE4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCisrKyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKQEAgLTMyNyw4ICszMjcsMTAgQEAKIAogICAgIGlmIChhdHRyaWIgIT0gUHlfTm9uZSkgewogCi0gICAgICAgIGlmIChlbGVtZW50X25ld19leHRyYShzZWxmLCBhdHRyaWIpIDwgMCkKKyAgICAgICAgaWYgKGVsZW1lbnRfbmV3X2V4dHJhKHNlbGYsIGF0dHJpYikgPCAwKSB7CisgICAgICAgICAgICBQeU9iamVjdF9EZWwoc2VsZik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwl9CiAKICAgICAgICAgc2VsZi0+ZXh0cmEtPmxlbmd0aCA9IDA7CiAgICAgICAgIHNlbGYtPmV4dHJhLT5hbGxvY2F0ZWQgPSBTVEFUSUNfQ0hJTERSRU47CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ob3RzaG90LmMgYi9Nb2R1bGVzL19ob3RzaG90LmMKaW5kZXggMmVlNGViOS4uM2FkMGE5ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faG90c2hvdC5jCisrKyBiL01vZHVsZXMvX2hvdHNob3QuYwpAQCAtMTQyMCw3ICsxNDIwLDcgQEAKICAgICBjaGFyICpidWZmZXI7CiAgICAgY2hhciBjd2RidWZmZXJbUEFUSF9NQVhdOwogICAgIFB5T2JqZWN0ICp0ZW1wOwotICAgIGludCBpLCBsZW47CisgICAgUHlfc3NpemVfdCBpLCBsZW47CiAKICAgICBidWZmZXIgPSBnZXRfdmVyc2lvbl9zdHJpbmcoKTsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jIGIvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKaW5kZXggZTNkMWU3Zi4uNThiZWI1YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKQEAgLTEyLDExICsxMiwxNCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGxvY2FsZS5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAKKyNpZm5kZWYgRE9OVF9IQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKICNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKICNpbmNsdWRlIDxsYW5naW5mby5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvYWRhcHRlcnMuYyBiL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmZkZTAzLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogYWRhcHRlcnMuYyAtIGRlZmF1bHQgYWRhcHRlcnMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotICoKLSAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotICoKLSAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInV0aWwuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJhZGFwdGVycy5oIgotCi0vKiBkdW1teSwgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiBhIGxhdGVyIHZlcnNpb24gKi8KLQotUHlPYmplY3QqIGFkYXB0X2RhdGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQotewotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKLX0KLQotUHlPYmplY3QqIGFkYXB0X2RhdGV0aW1lKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKLXsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7Ci19CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvYWRhcHRlcnMuaCBiL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU4NDc5Li4wMDAwMDAwCi0tLSBhL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogYWRhcHRlcnMuaCAtIGRlZmF1bHQgYWRhcHRlcnMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotICoKLSAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotICoKLSAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0gKi8KLQotI2lmbmRlZiBQWVNRTElURV9BREFQVEVSU19ICi0jZGVmaW5lIFBZU1FMSVRFX0FEQVBURVJTX0gKLSNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlICJweXRocmVhZC5oIgotI2luY2x1ZGUgInNxbGl0ZTMuaCIKLQotUHlPYmplY3QqIGFkYXB0X2RhdGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKLVB5T2JqZWN0KiBhZGFwdF9kYXRldGltZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKaW5kZXggZDEwMmU5Ny4uNjk2MjY5NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KIAogLyogb25seSB1c2VkIGludGVybmFsbHkgKi8KIE5vZGUqIG5ld19ub2RlKFB5T2JqZWN0KiBrZXksIFB5T2JqZWN0KiBkYXRhKQpAQCAtNjAsMTEgKzYxLDExIEBACiAKICAgICBzZWxmLT5mYWN0b3J5ID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpIiwgJmZhY3RvcnksICZzaXplKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsgCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGkiLCAmZmFjdG9yeSwgJnNpemUpKSB7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICAvKiBtaW5pbXVtIGNhY2hlIHNpemUgaXMgNSBlbnRyaWVzICovCiAgICAgaWYgKHNpemUgPCA1KSB7CiAgICAgICAgIHNpemUgPSA1OwogICAgIH0KQEAgLTk1LDYgKzk2LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8qIGl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMgYW5kIGRlYWxsb2NhdGUgdGhlbSAqLwogICAgIG5vZGUgPSBzZWxmLT5maXJzdDsKICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICBkZWxldGVfbm9kZSA9IG5vZGU7CkBAIC0xMTksNyArMTIxLDE0IEBACiAKICAgICBub2RlID0gKE5vZGUqKVB5RGljdF9HZXRJdGVtKHNlbGYtPm1hcHBpbmcsIGtleSk7CiAgICAgaWYgKG5vZGUpIHsKLSAgICAgICAgbm9kZS0+Y291bnQrKzsKKyAgICAgICAgLyogYW4gZW50cnkgZm9yIHRoaXMga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjYWNoZSAqLworCisgICAgICAgIC8qIGluY3JlYXNlIHVzYWdlIGNvdW50ZXIgb2YgdGhlIG5vZGUgZm91bmQgKi8KKyAgICAgICAgaWYgKG5vZGUtPmNvdW50IDwgTE9OR19NQVgpIHsKKyAgICAgICAgICAgIG5vZGUtPmNvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiBuZWNlc3NhcnksIHJlb3JkZXIgZW50cmllcyBpbiB0aGUgY2FjaGUgYnkgc3dhcHBpbmcgcG9zaXRpb25zICovCiAgICAgICAgIGlmIChub2RlLT5wcmV2ICYmIG5vZGUtPmNvdW50ID4gbm9kZS0+cHJldi0+Y291bnQpIHsKICAgICAgICAgICAgIHB0ciA9IG5vZGUtPnByZXY7CiAKQEAgLTE0OSw2ICsxNTgsMTAgQEAKICAgICAgICAgICAgIHB0ci0+cHJldiA9IG5vZGU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgICAvKiBUaGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBrZXkgaW4gdGhlIGNhY2hlLCB5ZXQuIFdlJ2xsIGluc2VydCBhIG5ldworICAgICAgICAgKiBlbnRyeSBpbiB0aGUgY2FjaGUsIGFuZCBtYWtlIHNwYWNlIGlmIG5lY2Vzc2FyeSBieSB0aHJvd2luZyB0aGUKKyAgICAgICAgICogbGVhc3QgdXNlZCBpdGVtIG91dCBvZiB0aGUgY2FjaGUuICovCisKICAgICAgICAgaWYgKFB5RGljdF9TaXplKHNlbGYtPm1hcHBpbmcpID09IHNlbGYtPnNpemUpIHsKICAgICAgICAgICAgIGlmIChzZWxmLT5sYXN0KSB7CiAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYtPmxhc3Q7CkBAIC0yNTMsNyArMjY2LDcgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNhY2hlX21ldGhvZHNbXSA9IHsKICAgICB7ImdldCIsIChQeUNGdW5jdGlvbiljYWNoZV9nZXQsIE1FVEhfTywKLSAgICAgICAgUHlEb2NfU1RSKCJHZXRzIGFuIGVudHJ5IGZyb20gdGhlIGNhY2hlLiIpfSwKKyAgICAgICAgUHlEb2NfU1RSKCJHZXRzIGFuIGVudHJ5IGZyb20gdGhlIGNhY2hlIG9yIGNhbGxzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHRvIHByb2R1Y2Ugb25lLiIpfSwKICAgICB7ImRpc3BsYXkiLCAoUHlDRnVuY3Rpb24pY2FjaGVfZGlzcGxheSwgTUVUSF9OT0FSR1MsCiAgICAgICAgIFB5RG9jX1NUUigiRm9yIGRlYnVnZ2luZyBvbmx5LiIpfSwKICAgICB7TlVMTCwgTlVMTH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5oIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmgKaW5kZXggNWNjMTZmMy4uMWYxMzkwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjYWNoZS5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBMUlUgY2FjaGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKgpAQCAtMjUsNiArMjUsMTAgQEAKICNkZWZpbmUgUFlTUUxJVEVfQ0FDSEVfSAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCisvKiBUaGUgTFJVIGNhY2hlIGlzIGltcGxlbWVudGVkIGFzIGEgY29tYmluYXRpb24gb2YgYSBkb3VibHktbGlua2VkIHdpdGggYQorICogZGljdGlvbmFyeS4gVGhlIGxpc3QgaXRlbXMgYXJlIG9mIHR5cGUgJ05vZGUnIGFuZCB0aGUgZGljdGlvbmFyeSBoYXMgdGhlCisgKiBub2RlcyBhcyB2YWx1ZXMuICovCisKIHR5cGVkZWYgc3RydWN0IF9Ob2RlCiB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtMzksMTAgKzQzLDE4IEBACiB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIGludCBzaXplOworCisgICAgLyogYSBkaWN0aW9uYXJ5IG1hcHBpbmcga2V5cyB0byBOb2RlIGVudHJpZXMgKi8KICAgICBQeU9iamVjdCogbWFwcGluZzsKKworICAgIC8qIHRoZSBmYWN0b3J5IGNhbGxhYmxlICovCiAgICAgUHlPYmplY3QqIGZhY3Rvcnk7CisKICAgICBOb2RlKiBmaXJzdDsKICAgICBOb2RlKiBsYXN0OworCisgICAgLyogaWYgc2V0LCBkZWNyZW1lbnQgdGhlIGZhY3RvcnkgZnVuY3Rpb24gd2hlbiB0aGUgQ2FjaGUgaXMgZGVhbGxvY2F0ZWQuCisgICAgICogdGhpcyBpcyBhbG1vc3QgYWx3YXlzIGRlc2lyYWJsZSwgYnV0IG5vdCBpbiB0aGUgcHlzcWxpdGUgY29udGV4dCAqLwogICAgIGludCBkZWNyZWZfZmFjdG9yeTsKIH0gQ2FjaGU7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCmluZGV4IDc4YWFkMzcuLjY0ZTQzZWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpAQCAtNTYsNiArNTYsNyBAQAogICAgIHNlbGYtPmJlZ2luX3N0YXRlbWVudCA9IE5VTEw7CiAKICAgICBzZWxmLT5zdGF0ZW1lbnRfY2FjaGUgPSBOVUxMOworICAgIHNlbGYtPnN0YXRlbWVudHMgPSBOVUxMOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHNlbGYtPnJvd19mYWN0b3J5ID0gUHlfTm9uZTsKQEAgLTc0LDYgKzc1LDkgQEAKIAogICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7CiAgICAgICAgIGlzb2xhdGlvbl9sZXZlbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICBpZiAoIWlzb2xhdGlvbl9sZXZlbCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgUHlfSU5DUkVGKGlzb2xhdGlvbl9sZXZlbCk7CiAgICAgfQpAQCAtODYsNiArOTAsMTIgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIHNlbGYtPnN0YXRlbWVudHMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghc2VsZi0+c3RhdGVtZW50cykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNlbGYtPmNyZWF0ZWRfc3RhdGVtZW50cyA9IDA7CisKICAgICAvKiBCeSBkZWZhdWx0LCB0aGUgQ2FjaGUgY2xhc3MgSU5DUkVGcyB0aGUgZmFjdG9yeSBpbiBpdHMgaW5pdGlhbGl6ZXIsIGFuZAogICAgICAqIGRlY3JlZnMgaXQgaW4gaXRzIGRlYWxsb2NhdG9yIG1ldGhvZC4gU2luY2UgdGhpcyB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhcgogICAgICAqIHJlZmVyZW5jZSBoZXJlLCB3ZSdyZSBicmVha2luZyBpdCBieSBkZWNyZW1lbnRpbmcgc2VsZiwgYW5kIHRlbGxpbmcgdGhlCkBAIC0xMjYsNiArMTM2LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyogRW1wdHkgdGhlIGVudGlyZSBzdGF0ZW1lbnQgY2FjaGUgb2YgdGhpcyBjb25uZWN0aW9uICovCiB2b2lkIGZsdXNoX3N0YXRlbWVudF9jYWNoZShDb25uZWN0aW9uKiBzZWxmKQogewogICAgIE5vZGUqIG5vZGU7CkBAIC0xNDcsMTUgKzE1OCwxNiBAQAogCiB2b2lkIHJlc2V0X2FsbF9zdGF0ZW1lbnRzKENvbm5lY3Rpb24qIHNlbGYpCiB7Ci0gICAgTm9kZSogbm9kZTsKLSAgICBTdGF0ZW1lbnQqIHN0YXRlbWVudDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCogd2Vha3JlZjsKKyAgICBQeU9iamVjdCogc3RhdGVtZW50OwogCi0gICAgbm9kZSA9IHNlbGYtPnN0YXRlbWVudF9jYWNoZS0+Zmlyc3Q7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50Kikobm9kZS0+ZGF0YSk7Ci0gICAgICAgICh2b2lkKXN0YXRlbWVudF9yZXNldChzdGF0ZW1lbnQpOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUoc2VsZi0+c3RhdGVtZW50cyk7IGkrKykgeworICAgICAgICB3ZWFrcmVmID0gUHlMaXN0X0dldEl0ZW0oc2VsZi0+c3RhdGVtZW50cywgaSk7CisgICAgICAgIHN0YXRlbWVudCA9IFB5V2Vha3JlZl9HZXRPYmplY3Qod2Vha3JlZik7CisgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgKHZvaWQpc3RhdGVtZW50X3Jlc2V0KChTdGF0ZW1lbnQqKXN0YXRlbWVudCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE3OCw2ICsxOTAsNyBAQAogICAgIFB5X1hERUNSRUYoc2VsZi0+cm93X2ZhY3RvcnkpOwogICAgIFB5X1hERUNSRUYoc2VsZi0+dGV4dF9mYWN0b3J5KTsKICAgICBQeV9YREVDUkVGKHNlbGYtPmNvbGxhdGlvbnMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RhdGVtZW50cyk7CiAKICAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7CiB9CkBAIC0zOTEsNyArNDA0LDcgQEAKICAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKICAgICBQeU9iamVjdCogc3RyaW5ndmFsOwogCi0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICBpZiAoKCFweV92YWwpIHx8IFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgLyogRXJyb3JzIGluIGNhbGxiYWNrcyBhcmUgaWdub3JlZCwgYW5kIHdlIHJldHVybiBOVUxMICovCiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7CkBAIC0zOTksMjEgKzQxMiwyMyBAQAogICAgICAgICBzcWxpdGUzX3Jlc3VsdF9udWxsKGNvbnRleHQpOwogICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socHlfdmFsKSkgewogICAgICAgICBsb25ndmFsID0gUHlJbnRfQXNMb25nKHB5X3ZhbCk7Ci0gICAgICAgIC8qIFRPRE86IGludmVzdGlnYXRlIHdoYXQgdG8gZG8gd2l0aCByYW5nZSBvdmVyZmxvd3MgLSBsb25nIHZzLiBsb25nIGxvbmcgKi8KICAgICAgICAgc3FsaXRlM19yZXN1bHRfaW50NjQoY29udGV4dCwgKFBZX0xPTkdfTE9ORylsb25ndmFsKTsKICAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2socHlfdmFsKSkgewogICAgICAgICBzcWxpdGUzX3Jlc3VsdF9kb3VibGUoY29udGV4dCwgUHlGbG9hdF9Bc0RvdWJsZShweV92YWwpKTsKICAgICB9IGVsc2UgaWYgKFB5QnVmZmVyX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICAgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihweV92YWwsICZidWZmZXIsICZidWZsZW4pICE9IDApIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2Jsb2IoY29udGV4dCwgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOwogICAgICAgICB9Ci0gICAgICAgIHNxbGl0ZTNfcmVzdWx0X2Jsb2IoY29udGV4dCwgYnVmZmVyLCBidWZsZW4sIFNRTElURV9UUkFOU0lFTlQpOwogICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socHlfdmFsKSkgewogICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHB5X3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhweV92YWwpKSB7CiAgICAgICAgIHN0cmluZ3ZhbCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocHlfdmFsKTsKLSAgICAgICAgc3FsaXRlM19yZXN1bHRfdGV4dChjb250ZXh0LCBQeVN0cmluZ19Bc1N0cmluZyhzdHJpbmd2YWwpLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOworICAgICAgICBpZiAoc3RyaW5ndmFsKSB7CisgICAgICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHJpbmd2YWwpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogVE9ETzogcmFpc2UgZXJyb3IgKi8KICAgICB9CkBAIC00NTAsNiArNDY1LDcgQEAKICAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOCh2YWxfc3RyLCBzdHJsZW4odmFsX3N0ciksIE5VTEwpOwogICAgICAgICAgICAgICAgIC8qIFRPRE86IGhhdmUgYSB3YXkgdG8gc2hvdyBlcnJvcnMgaGVyZSAqLwogICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKICAgICAgICAgICAgICAgICB9CkBAIC00NTgsMTAgKzQ3NCwxMiBAQAogICAgICAgICAgICAgICAgIGJ1ZmxlbiA9IHNxbGl0ZTNfdmFsdWVfYnl0ZXMoY3VyX3ZhbHVlKTsKICAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeUJ1ZmZlcl9OZXcoYnVmbGVuKTsKICAgICAgICAgICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBlcnJvciAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoY3VyX3B5X3ZhbHVlLCAmcmF3X2J1ZmZlciwgJmJ1ZmxlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cl9weV92YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZW1jcHkocmF3X2J1ZmZlciwgc3FsaXRlM192YWx1ZV9ibG9iKGN1cl92YWx1ZSksIGJ1Zmxlbik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00NzAsNiArNDg4LDEyIEBACiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5X05vbmU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoIWN1cl9weV92YWx1ZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKwogICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgaSwgY3VyX3B5X3ZhbHVlKTsKIAogICAgIH0KQEAgLTQ4MSw4ICs1MDUsNyBAQAogewogICAgIFB5T2JqZWN0KiBhcmdzOwogICAgIFB5T2JqZWN0KiBweV9mdW5jOwotICAgIFB5T2JqZWN0KiBweV9yZXR2YWw7Ci0KKyAgICBQeU9iamVjdCogcHlfcmV0dmFsID0gTlVMTDsKIAogICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CiAKQEAgLTQ5MSw5ICs1MTQsMTAgQEAKICAgICBweV9mdW5jID0gKFB5T2JqZWN0KilzcWxpdGUzX3VzZXJfZGF0YShjb250ZXh0KTsKIAogICAgIGFyZ3MgPSBfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIGFyZ3YpOwotCi0gICAgcHlfcmV0dmFsID0gUHlPYmplY3RfQ2FsbE9iamVjdChweV9mdW5jLCBhcmdzKTsKLSAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgcHlfcmV0dmFsID0gUHlPYmplY3RfQ2FsbE9iamVjdChweV9mdW5jLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KIAogICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIHB5X3JldHZhbCk7CiAgICAgUHlfWERFQ1JFRihweV9yZXR2YWwpOwpAQCAtNTA0LDEwICs1MjgsMTAgQEAKIHN0YXRpYyB2b2lkIF9zdGVwX2NhbGxiYWNrKHNxbGl0ZTNfY29udGV4dCAqY29udGV4dCwgaW50IGFyZ2MsIHNxbGl0ZTNfdmFsdWUqKiBwYXJhbXMpCiB7CiAgICAgUHlPYmplY3QqIGFyZ3M7Ci0gICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdDsKKyAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0ID0gTlVMTDsKICAgICBQeU9iamVjdCogYWdncmVnYXRlX2NsYXNzOwogICAgIFB5T2JqZWN0KiogYWdncmVnYXRlX2luc3RhbmNlOwotICAgIFB5T2JqZWN0KiBzdGVwbWV0aG9kOworICAgIFB5T2JqZWN0KiBzdGVwbWV0aG9kID0gTlVMTDsKIAogICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CiAKQEAgLTUyMCw0NCArNTQ0LDQyIEBACiAgICAgaWYgKCphZ2dyZWdhdGVfaW5zdGFuY2UgPT0gMCkgewogICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGFnZ3JlZ2F0ZV9jbGFzcywgIiIpOwogCi0gICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IDA7Ci0gICAgICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgIH0KIAogICAgIHN0ZXBtZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJzdGVwIik7Ci0gICAgaWYgKCFzdGVwbWV0aG9kKQotICAgIHsKLSAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmICghc3RlcG1ldGhvZCkgeworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGFyZ3MgPSBfYnVpbGRfcHlfcGFyYW1zKGNvbnRleHQsIGFyZ2MsIHBhcmFtcyk7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAgICAgZnVuY3Rpb25fcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChzdGVwbWV0aG9kLCBhcmdzKTsKICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgUHlfREVDUkVGKHN0ZXBtZXRob2QpOwogCi0gICAgaWYgKGZ1bmN0aW9uX3Jlc3VsdCA9PSBOVUxMKSB7CisgICAgaWYgKCFmdW5jdGlvbl9yZXN1bHQpIHsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBQeV9ERUNSRUYoZnVuY3Rpb25fcmVzdWx0KTsKICAgICB9CiAKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoc3RlcG1ldGhvZCk7CisgICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOworCiAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKIH0KIAogdm9pZCBfZmluYWxfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0KiBjb250ZXh0KQogewotICAgIFB5T2JqZWN0KiBhcmdzOwotICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9yZXN1bHQ7CisgICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdCA9IE5VTEw7CiAgICAgUHlPYmplY3QqKiBhZ2dyZWdhdGVfaW5zdGFuY2U7CiAgICAgUHlPYmplY3QqIGFnZ3JlZ2F0ZV9jbGFzczsKLSAgICBQeU9iamVjdCogZmluYWxpemVtZXRob2Q7CiAKICAgICBQeUdJTFN0YXRlX1NUQVRFIHRocmVhZHN0YXRlOwogCkBAIC01NzAsMzUgKzU5Miw1NiBAQAogICAgICAgICAvKiB0aGlzIGJyYW5jaCBpcyBleGVjdXRlZCBpZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uIGluIHRoZSBhZ2dyZWdhdGUncwogICAgICAgICAgKiBfX2luaXRfXyAqLwogCi0gICAgICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBmaW5hbGl6ZW1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgImZpbmFsaXplIik7Ci0KLSAgICBpZiAoIWZpbmFsaXplbWV0aG9kKSB7Ci0gICAgICAgIC8qCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQcm9ncmFtbWluZ0Vycm9yLCAiZmluYWxpemUgbWV0aG9kIG1pc3NpbmciKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgKi8KKyAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJmaW5hbGl6ZSIsICIiKTsKKyAgICBpZiAoIWZ1bmN0aW9uX3Jlc3VsdCkgeworICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5X05vbmU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICBpZiAoIWFyZ3MpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGZpbmFsaXplbWV0aG9kLCBhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoZmluYWxpemVtZXRob2QpOwogICAgIH0KIAogICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIGZ1bmN0aW9uX3Jlc3VsdCk7CisKK2Vycm9yOgogICAgIFB5X1hERUNSRUYoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSk7CiAgICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOwogCiAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKIH0KIAordm9pZCBfZHJvcF91bnVzZWRfc3RhdGVtZW50X3JlZmVyZW5jZXMoQ29ubmVjdGlvbiogc2VsZikKK3sKKyAgICBQeU9iamVjdCogbmV3X2xpc3Q7CisgICAgUHlPYmplY3QqIHdlYWtyZWY7CisgICAgaW50IGk7CisKKyAgICAvKiB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlIGluIGEgd2hpbGUgKi8KKyAgICBpZiAoc2VsZi0+Y3JlYXRlZF9zdGF0ZW1lbnRzKysgPCAyMDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNlbGYtPmNyZWF0ZWRfc3RhdGVtZW50cyA9IDA7CisKKyAgICBuZXdfbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCFuZXdfbGlzdCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHNlbGYtPnN0YXRlbWVudHMpOyBpKyspIHsKKyAgICAgICAgd2Vha3JlZiA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPnN0YXRlbWVudHMsIGkpOworICAgICAgICBpZiAod2Vha3JlZiAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChuZXdfbGlzdCwgd2Vha3JlZikgIT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfbGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUHlfREVDUkVGKHNlbGYtPnN0YXRlbWVudHMpOworICAgIHNlbGYtPnN0YXRlbWVudHMgPSBuZXdfbGlzdDsKK30KIAogUHlPYmplY3QqIGNvbm5lY3Rpb25fY3JlYXRlX2Z1bmN0aW9uKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQogewpAQCAtNjE3LDEwICs2NjAsMTYgQEAKIAogICAgIHJjID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oc2VsZi0+ZGIsIG5hbWUsIG5hcmcsIFNRTElURV9VVEY4LCAodm9pZCopZnVuYywgX2Z1bmNfY2FsbGJhY2ssIE5VTEwsIE5VTEwpOwogCi0gICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGZ1bmMsIFB5X05vbmUpOworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgLyogV29ya2Fyb3VuZCBmb3IgU1FMaXRlIGJ1Zzogbm8gZXJyb3IgY29kZSBvciBzdHJpbmcgaXMgYXZhaWxhYmxlIGhlcmUgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBjcmVhdGluZyBmdW5jdGlvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSk7CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogCiBQeU9iamVjdCogY29ubmVjdGlvbl9jcmVhdGVfYWdncmVnYXRlKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQpAQCAtNjM5LDcgKzY4OCw4IEBACiAKICAgICByYyA9IHNxbGl0ZTNfY3JlYXRlX2Z1bmN0aW9uKHNlbGYtPmRiLCBuYW1lLCBuX2FyZywgU1FMSVRFX1VURjgsICh2b2lkKilhZ2dyZWdhdGVfY2xhc3MsIDAsICZfc3RlcF9jYWxsYmFjaywgJl9maW5hbF9jYWxsYmFjayk7CiAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewotICAgICAgICBfc2V0ZXJyb3Ioc2VsZi0+ZGIpOworICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBTUUxpdGUgYnVnOiBubyBlcnJvciBjb2RlIG9yIHN0cmluZyBpcyBhdmFpbGFibGUgaGVyZSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIGNyZWF0aW5nIGFnZ3JlZ2F0ZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewogICAgICAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgYWdncmVnYXRlX2NsYXNzLCBQeV9Ob25lKTsKQEAgLTY4Miw3ICs3MzIsNiBAQAogCiBzdGF0aWMgaW50IGNvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKQogewotICAgIFB5T2JqZWN0KiBlbXB0eTsKICAgICBQeU9iamVjdCogcmVzOwogICAgIFB5T2JqZWN0KiBiZWdpbl9zdGF0ZW1lbnQ7CiAKQEAgLTY5NywxNSArNzQ2LDEwIEBACiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgc2VsZi0+aXNvbGF0aW9uX2xldmVsID0gUHlfTm9uZTsKIAotICAgICAgICBlbXB0eSA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICBpZiAoIWVtcHR5KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gY29ubmVjdGlvbl9jb21taXQoc2VsZiwgZW1wdHkpOworICAgICAgICByZXMgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLCBOVUxMKTsKICAgICAgICAgaWYgKCFyZXMpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBQeV9ERUNSRUYoZW1wdHkpOwogICAgICAgICBQeV9ERUNSRUYocmVzKTsKIAogICAgICAgICBzZWxmLT5pblRyYW5zYWN0aW9uID0gMDsKQEAgLTczOCwxMiArNzgyLDE1IEBACiB7CiAgICAgUHlPYmplY3QqIHNxbDsKICAgICBTdGF0ZW1lbnQqIHN0YXRlbWVudDsKKyAgICBQeU9iamVjdCogd2Vha3JlZjsKICAgICBpbnQgcmM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmc3FsKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBfZHJvcF91bnVzZWRfc3RhdGVtZW50X3JlZmVyZW5jZXMoc2VsZik7CisKICAgICBzdGF0ZW1lbnQgPSBQeU9iamVjdF9OZXcoU3RhdGVtZW50LCAmU3RhdGVtZW50VHlwZSk7CiAgICAgaWYgKCFzdGF0ZW1lbnQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC03NjIsOCArODA5LDI0IEBACiAKICAgICAgICAgUHlfREVDUkVGKHN0YXRlbWVudCk7CiAgICAgICAgIHN0YXRlbWVudCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2Vha3JlZiA9IFB5V2Vha3JlZl9OZXdSZWYoKFB5T2JqZWN0KilzdGF0ZW1lbnQsIE5VTEwpOworICAgICAgICBpZiAoIXdlYWtyZWYpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdGF0ZW1lbnQpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gMDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5zdGF0ZW1lbnRzLCB3ZWFrcmVmKSAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYod2Vha3JlZik7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSAwOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIFB5X0RFQ1JFRih3ZWFrcmVmKTsKICAgICB9CiAKK2Vycm9yOgogICAgIHJldHVybiAoUHlPYmplY3QqKXN0YXRlbWVudDsKIH0KIApAQCAtOTgzLDcgKzEwNDYsNyBAQAogfQogCiBzdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KLVB5RG9jX1NUUigiPG1pc3NpbmcgZG9jc3RyaW5nPiIpOworUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3QuIik7CiAKIHN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewogICAgIHsiaXNvbGF0aW9uX2xldmVsIiwgIChnZXR0ZXIpY29ubmVjdGlvbl9nZXRfaXNvbGF0aW9uX2xldmVsLCAoc2V0dGVyKWNvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbH0sCkBAIC0xMDExLDcgKzEwNzQsNyBAQAogICAgIHsiZXhlY3V0ZXNjcmlwdCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2V4ZWN1dGVzY3JpcHQsIE1FVEhfVkFSQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIG11bHRpcGxlIFNRTCBzdGF0ZW1lbnRzIGF0IG9uY2UuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJjcmVhdGVfY29sbGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fY3JlYXRlX2NvbGxhdGlvbiwgTUVUSF9WQVJBUkdTLAotICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb2xsYXRpb24gZnVuY3Rpb24uIil9LAorICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb2xsYXRpb24gZnVuY3Rpb24uIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAge05VTEwsIE5VTEx9CiB9OwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaAppbmRleCBmYWFlNmU0Li44ZjRkMzZlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjb25uZWN0aW9uLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIGNvbm5lY3Rpb24gdHlwZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICAqCkBAIC0zNyw3ICszNywxMiBAQAogICAgIFB5T2JqZWN0X0hFQUQKICAgICBzcWxpdGUzKiBkYjsKIAorICAgIC8qIDEgaWYgd2UgYXJlIGN1cnJlbnRseSB3aXRoaW4gYSB0cmFuc2FjdGlvbiwgaS4gZS4gaWYgYSBCRUdJTiBoYXMgYmVlbgorICAgICAqIGlzc3VlZCAqLwogICAgIGludCBpblRyYW5zYWN0aW9uOworCisgICAgLyogdGhlIHR5cGUgZGV0ZWN0aW9uIG1vZGUuIE9ubHkgMCwgUEFSU0VfREVDTFRZUEVTLCBQQVJTRV9DT0xOQU1FUyBvciBhCisgICAgICogYml0d2lzZSBjb21iaW5hdGlvbiB0aGVyZW9mIG1ha2VzIHNlbnNlICovCiAgICAgaW50IGRldGVjdF90eXBlczsKIAogICAgIC8qIHRoZSB0aW1lb3V0IHZhbHVlIGluIHNlY29uZHMgZm9yIGRhdGFiYXNlIGxvY2tzICovCkBAIC01NCwxMyArNTksMzEgQEAKICAgICAgKiBmcmVlZCBpbiBjb25uZWN0aW9uIGRlc3RydWN0b3IgKi8KICAgICBjaGFyKiBiZWdpbl9zdGF0ZW1lbnQ7CiAKKyAgICAvKiAxIGlmIGEgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZWFjaCBBUEkgY2FsbCBpZiB0aGUgY29ubmVjdGlvbiBpcworICAgICAqIHVzZWQgZnJvbSB0aGUgc2FtZSB0aHJlYWQgaXQgd2FzIGNyZWF0ZWQgaW4gKi8KICAgICBpbnQgY2hlY2tfc2FtZV90aHJlYWQ7CisKKyAgICAvKiB0aHJlYWQgaWRlbnRpZmljYXRpb24gb2YgdGhlIHRocmVhZCB0aGUgY29ubmVjdGlvbiB3YXMgY3JlYXRlZCBpbiAqLwogICAgIGxvbmcgdGhyZWFkX2lkZW50OwogCiAgICAgQ2FjaGUqIHN0YXRlbWVudF9jYWNoZTsKIAorICAgIC8qIEEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gc3RhdGVtZW50cyB1c2VkIHdpdGhpbiB0aGlzIGNvbm5lY3Rpb24gKi8KKyAgICBQeU9iamVjdCogc3RhdGVtZW50czsKKworICAgIC8qIGEgY291bnRlciBmb3IgaG93IG1hbnkgc3RhdGVtZW50cyB3ZXJlIGNyZWF0ZWQgaW4gdGhlIGNvbm5lY3Rpb24uIE1heSBiZQorICAgICAqIHJlc2V0IHRvIDAgYXQgY2VydGFpbiBpbnRlcnZhbHMgKi8KKyAgICBpbnQgY3JlYXRlZF9zdGF0ZW1lbnRzOworCiAgICAgUHlPYmplY3QqIHJvd19mYWN0b3J5OwogCisgICAgLyogRGV0ZXJtaW5lcyBob3cgYnl0ZXN0cmluZ3MgZnJvbSBTUUxpdGUgYXJlIGNvbnZlcnRlZCB0byBQeXRob24gb2JqZWN0czoKKyAgICAgKiAtIFB5VW5pY29kZV9UeXBlOiAgICAgICAgUHl0aG9uIFVuaWNvZGUgb2JqZWN0cyBhcmUgY29uc3RydWN0ZWQgZnJvbSBVVEYtOCBieXRlc3RyaW5ncworICAgICAqIC0gT3B0aW1pemVkVW5pY29kZTogICAgICBMaWtlIGJlZm9yZSwgYnV0IGZvciBBU0NJSSBkYXRhLCBvbmx5IFB5U3RyaW5ncyBhcmUgY3JlYXRlZC4KKyAgICAgKiAtIFB5U3RyaW5nX1R5cGU6ICAgICAgICAgUHlTdHJpbmdzIGFyZSBjcmVhdGVkIGFzLWlzLgorICAgICAqIC0gQW55IGN1c3RvbSBjYWxsYWJsZTogICBBbnkgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGNhbGxhYmxlIGNhbGxlZCB3aXRoIHRoZSBieXRlc3RyaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHNpbmdsZSBwYXJhbWV0ZXIuCisgICAgICovCiAgICAgUHlPYmplY3QqIHRleHRfZmFjdG9yeTsKIAogICAgIC8qIHJlbWVtYmVyIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb25zL2NsYXNzZXMgdXNlZCBpbgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuYyBiL01vZHVsZXMvX3NxbGl0ZS9jb252ZXJ0ZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODA2M2EuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIGNvbnZlcnRlcnMuYyAtIGRlZmF1bHQgY29udmVydGVycwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0jaW5jbHVkZSAidXRpbC5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgImFkYXB0ZXJzLmgiCi0KLS8qIGR1bW15LCB3aWxsIGJlIGltcGxlbWVudGVkIGluIGEgbGF0ZXIgdmVyc2lvbiAqLwotCi1QeU9iamVjdCogY29udmVydF9kYXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKLXsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7Ci19Ci0KLVB5T2JqZWN0KiBjb252ZXJ0X3RpbWVzdGFtcChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCi17Ci0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOwotfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuaCBiL01vZHVsZXMvX3NxbGl0ZS9jb252ZXJ0ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzc2OGEuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIGNvbnZlcnRlcnMuaCAtIGRlZmF1bHQgY29udmVydGVycwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0jaWZuZGVmIFBZU1FMSVRFX0NPTlZFUlRFUlNfSAotI2RlZmluZSBQWVNRTElURV9DT05WRVJURVJTX0gKLSNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlICJweXRocmVhZC5oIgotI2luY2x1ZGUgInNxbGl0ZTMuaCIKLQotUHlPYmplY3QqIGNvbnZlcnRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwotUHlPYmplY3QqIGNvbnZlcnRfdGltZXN0YW1wKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCmluZGV4IGM2YjhjNzcuLjZlZThiZWEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTI3LDggKzI3LDEyIEBACiAjaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCiAKIC8qIHVzZWQgdG8gZGVjaWRlIHdldGhlciB0byBjYWxsIFB5SW50X0Zyb21Mb25nIG9yIFB5TG9uZ19Gcm9tTG9uZ0xvbmcgKi8KKyNpZm5kZWYgSU5UMzJfTUlOCiAjZGVmaW5lIElOVDMyX01JTiAoLTIxNDc0ODM2NDcgLSAxKQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01BWAogI2RlZmluZSBJTlQzMl9NQVggMjE0NzQ4MzY0NworI2VuZGlmCiAKIFB5T2JqZWN0KiBjdXJzb3JfaXRlcm5leHQoQ3Vyc29yICpzZWxmKTsKIApAQCAtMTU3LDI0ICsxNjEsMjQgQEAKIAogICAgICAgICBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+ZGV0ZWN0X3R5cGVzIHwgUEFSU0VfQ09MTkFNRVMpIHsKICAgICAgICAgICAgIGNvbG5hbWUgPSBzcWxpdGUzX2NvbHVtbl9uYW1lKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOworICAgICAgICAgICAgaWYgKGNvbG5hbWUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHBvcyA9IGNvbG5hbWU7ICpwb3MgIT0gMDsgcG9zKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwb3MgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3N0YXJ0ID0gcG9zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqcG9zID09ICddJyAmJiB0eXBlX3N0YXJ0ICE9IChjb25zdCBjaGFyKiktMSkgeworICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodHlwZV9zdGFydCwgcG9zIC0gdHlwZV9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0aW5nIGEgc3RyaW5nIGZhaWxlZCwgYnV0IGl0IGlzIHRvbyBjb21wbGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgaGVyZSwgd2UganVzdCBhc3N1bWUgdGhlcmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBubyBjb252ZXJ0ZXIgYW5kIHByb2NlZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChwb3MgPSBjb2xuYW1lOyAqcG9zICE9IDA7IHBvcysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCpwb3MgPT0gJ1snKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVfc3RhcnQgPSBwb3MgKyAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnBvcyA9PSAnXScgJiYgdHlwZV9zdGFydCAhPSAoY29uc3QgY2hhciopLTEpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodHlwZV9zdGFydCwgcG9zIC0gdHlwZV9zdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGluZyBhIHN0cmluZyBmYWlsZWQsIGJ1dCBpdCBpcyB0b28gY29tcGxpY2F0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIHByb3BhZ2F0ZSB0aGUgZXJyb3IgaGVyZSwgd2UganVzdCBhc3N1bWUgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vIGNvbnZlcnRlciBhbmQgcHJvY2VlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gUHlEaWN0X0dldEl0ZW0oY29udmVydGVycywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeURpY3RfR2V0SXRlbShjb252ZXJ0ZXJzLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjc2LDYgKzI4MCw3IEBACiAgICAgdm9pZCogcmF3X2J1ZmZlcjsKICAgICBjb25zdCBjaGFyKiB2YWxfc3RyOwogICAgIGNoYXIgYnVmWzIwMF07CisgICAgY29uc3QgY2hhciogY29sbmFtZTsKIAogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICBudW1jb2xzID0gc3FsaXRlM19kYXRhX2NvdW50KHNlbGYtPnN0YXRlbWVudC0+c3QpOwpAQCAtMzQwLDggKzM0NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y29ubmVjdGlvbi0+dGV4dF9mYWN0b3J5ID09IE9wdGltaXplZFVuaWNvZGUgPyAxIDogMCk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWUgPSBzcWxpdGUzX2NvbHVtbl9uYW1lKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lID0gIjx1bmtub3duIGNvbHVtbiBuYW1lPiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiQ291bGQgbm90IGRlY29kZSB0byBVVEYtOCBjb2x1bW4gJXMgd2l0aCB0ZXh0ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZTNfY29sdW1uX25hbWUoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSksIHZhbF9zdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWUgLCB2YWxfc3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCBidWYpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gKFB5T2JqZWN0KikmUHlTdHJpbmdfVHlwZSkgewpAQCAtNDE5LDggKzQyOCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBzZXF1ZW5jZSAqLwogICAgICAgICAgICAgcGFyYW1ldGVyc19pdGVyID0gUHlPYmplY3RfR2V0SXRlcihzZWNvbmRfYXJndW1lbnQpOwotICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzX2l0ZXIpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnNfaXRlcikgewogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDYsMTIgKzUxNCw3IEBACiAgICAgICAgICAgICAgICAgLyogaXQncyBhIERETCBzdGF0ZW1lbnQgb3Igc29tZXRoaW5nIHNpbWlsYXIKICAgICAgICAgICAgICAgICAgICAtIHdlIGJldHRlciBDT01NSVQgZmlyc3Qgc28gaXQgd29ya3MgZm9yIGFsbCBjYXNlcyAqLwogICAgICAgICAgICAgICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5pblRyYW5zYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZ1bmNfYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWZ1bmNfYXJncykgewotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLT5jb25uZWN0aW9uLCBmdW5jX2FyZ3MpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuY19hcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC03MDEsNyArNzA0LDYgQEAKICAgICBjb25zdCBjaGFyKiBzY3JpcHRfY3N0cjsKICAgICBzcWxpdGUzX3N0bXQqIHN0YXRlbWVudDsKICAgICBpbnQgcmM7Ci0gICAgUHlPYmplY3QqIGZ1bmNfYXJnczsKICAgICBQeU9iamVjdCogcmVzdWx0OwogICAgIGludCBzdGF0ZW1lbnRfY29tcGxldGVkID0gMDsKIApAQCAtNzI4LDEyICs3MzAsNyBAQAogICAgIH0KIAogICAgIC8qIGNvbW1pdCBmaXJzdCAqLwotICAgIGZ1bmNfYXJncyA9IFB5VHVwbGVfTmV3KDApOwotICAgIGlmICghZnVuY19hcmdzKSB7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHJlc3VsdCA9IGNvbm5lY3Rpb25fY29tbWl0KHNlbGYtPmNvbm5lY3Rpb24sIGZ1bmNfYXJncyk7Ci0gICAgUHlfREVDUkVGKGZ1bmNfYXJncyk7CisgICAgcmVzdWx0ID0gY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgTlVMTCk7CiAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CkBAIC05NzcsNiArOTc0LDkgQEAKICAgICB7TlVMTH0KIH07CiAKK3N0YXRpYyBjaGFyIGN1cnNvcl9kb2NbXSA9CitQeURvY19TVFIoIlNRTGl0ZSBkYXRhYmFzZSBjdXJzb3IgY2xhc3MuIik7CisKIFB5VHlwZU9iamVjdCBDdXJzb3JUeXBlID0gewogICAgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLwpAQCAtOTk5LDcgKzk5OSw3IEBACiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19IQVZFX0lURVJ8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIGN1cnNvcl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCmluZGV4IDdmNTY3OTkuLjgzMWZmODEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjdXJzb3IuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgY3Vyc29yIHR5cGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21pY3JvcHJvdG9jb2xzLmggYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaAppbmRleCBkMmQ5YjY1Li5mNjAxYmIzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaApAQCAtNTQsNiArNTQsNiBAQAogZXh0ZXJuIFB5T2JqZWN0ICoKICAgICBwc3ljb19taWNyb3Byb3RvY29sc19hZGFwdChDdXJzb3IqIHNlbGYsIFB5T2JqZWN0ICphcmdzKTsgICAKICNkZWZpbmUgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHRfZG9jIFwKLSAgICAiYWRhcHQob2JqLCBwcm90b2NvbCwgYWx0ZXJuYXRlKSAtPiBhZGFwdCBvYmogdG8gZ2l2ZW4gcHJvdG9jb2wiCi0gICAgCisgICAgImFkYXB0KG9iaiwgcHJvdG9jb2wsIGFsdGVybmF0ZSkgLT4gYWRhcHQgb2JqIHRvIGdpdmVuIHByb3RvY29sLiBOb24tc3RhbmRhcmQuIgorCiAjZW5kaWYgLyogIWRlZmluZWQoUFNZQ09QR19NSUNST1BST1RPQ09MU19IKSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCmluZGV4IDE1MzdlNzkuLmZiNmViMDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKQEAgLTE2NywxMiArMTY3LDEyIEBACiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewogICAgIHsiY29ubmVjdCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2Nvbm5lY3QsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJDcmVhdGVzIGEgY29ubmVjdGlvbi4iKX0sCi0gICAgeyJjb21wbGV0ZV9zdGF0ZW1lbnQiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9jb21wbGV0ZSwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkNoZWNrcyBpZiBhIHN0cmluZyBjb250YWlucyBhIGNvbXBsZXRlIFNRTCBzdGF0ZW1lbnQuIil9LAorICAgIHsiY29tcGxldGVfc3RhdGVtZW50IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29tcGxldGUsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJDaGVja3MgaWYgYSBzdHJpbmcgY29udGFpbnMgYSBjb21wbGV0ZSBTUUwgc3RhdGVtZW50LiBOb24tc3RhbmRhcmQuIil9LAogI2lmZGVmIEhBVkVfU0hBUkVEX0NBQ0hFCi0gICAgeyJlbmFibGVfc2hhcmVkX2NhY2hlIiwgIChQeUNGdW5jdGlvbiltb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZSwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkVuYWJsZSBvciBkaXNhYmxlIHNoYXJlZCBjYWNoZSBtb2RlIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuIil9LAorICAgIHsiZW5hYmxlX3NoYXJlZF9jYWNoZSIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2VuYWJsZV9zaGFyZWRfY2FjaGUsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgUHlEb2NfU1RSKCJFbmFibGUgb3IgZGlzYWJsZSBzaGFyZWQgY2FjaGUgbW9kZSBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkLiBFeHBlcmltZW50YWwvTm9uLXN0YW5kYXJkLiIpfSwKICNlbmRpZgotICAgIHsicmVnaXN0ZXJfYWRhcHRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfYWRhcHRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhbiBhZGFwdGVyIHdpdGggc3FsaXRlJ3MgYWRhcHRlciByZWdpc3RyeS4iKX0sCi0gICAgeyJyZWdpc3Rlcl9jb252ZXJ0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhIGNvbnZlcnRlciB3aXRoIHNxbGl0ZS4iKX0sCisgICAgeyJyZWdpc3Rlcl9hZGFwdGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGFuIGFkYXB0ZXIgd2l0aCBweXNxbGl0ZSdzIGFkYXB0ZXIgcmVnaXN0cnkuIE5vbi1zdGFuZGFyZC4iKX0sCisgICAgeyJyZWdpc3Rlcl9jb252ZXJ0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2NvbnZlcnRlciwgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIlJlZ2lzdGVycyBhIGNvbnZlcnRlciB3aXRoIHB5c3FsaXRlLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiYWRhcHQiLCAgKFB5Q0Z1bmN0aW9uKXBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0LCBNRVRIX1ZBUkFSR1MsIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0X2RvY30sCiAgICAge05VTEwsIE5VTEx9CiB9OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oCmluZGV4IDY2OTQ3MzUuLmYzZTJhYTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKQEAgLTEsNiArMSw2IEBACiAvKiBtb2R1bGUuaCAtIGRlZmluaXRpb25zIGZvciB0aGUgbW9kdWxlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICoKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgUFlTUUxJVEVfTU9EVUxFX0gKICNpbmNsdWRlICJQeXRob24uaCIKIAotI2RlZmluZSBQWVNRTElURV9WRVJTSU9OICIyLjIuMCIKKyNkZWZpbmUgUFlTUUxJVEVfVkVSU0lPTiAiMi4yLjIiCiAKIGV4dGVybiBQeU9iamVjdCogRXJyb3I7CiBleHRlcm4gUHlPYmplY3QqIFdhcm5pbmc7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMgYi9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMKaW5kZXggMGM5MzY1MS4uNTU5MjNlNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYwpAQCAtNjQsNiArNjQsNyBAQAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCisgICAgc2VsZi0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOwogICAgIHNlbGYtPnNxbCA9IHNxbF9zdHI7CiAKICAgICBzcWxfY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNxbF9zdHIpOwpAQCAtMzA0LDYgKzMwNSwxMCBAQAogCiAgICAgUHlfWERFQ1JFRihzZWxmLT5zcWwpOwogCisgICAgaWYgKHNlbGYtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QqKXNlbGYpOworICAgIH0KKwogICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKIH0KIApAQCAtMzk4LDEyICs0MDMsMTIgQEAKICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgIC8qIHRwX2ZsYWdzICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgICAgICBvZmZzZXRvZihTdGF0ZW1lbnQsIGluX3dlYWtyZWZsaXN0KSwgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuaCBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuaAppbmRleCBlNDVhMGZjLi41N2VlMzZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc3FsaXRlM19zdG10KiBzdDsKICAgICBQeU9iamVjdCogc3FsOwogICAgIGludCBpbl91c2U7CisgICAgUHlPYmplY3QqIGluX3dlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogfSBTdGF0ZW1lbnQ7CiAKIGV4dGVybiBQeVR5cGVPYmplY3QgU3RhdGVtZW50VHlwZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NyZS5jIGIvTW9kdWxlcy9fc3JlLmMKaW5kZXggNGFmMDhlZC4uMDZhY2I2OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3JlLmMKKysrIGIvTW9kdWxlcy9fc3JlLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogZGF0YV9zdGFja19kZWFsbG9jKFNSRV9TVEFURSogc3RhdGUpCiB7CiAgICAgaWYgKHN0YXRlLT5kYXRhX3N0YWNrKSB7Ci0gICAgICAgIGZyZWUoc3RhdGUtPmRhdGFfc3RhY2spOworICAgICAgICBQeU1lbV9GUkVFKHN0YXRlLT5kYXRhX3N0YWNrKTsKICAgICAgICAgc3RhdGUtPmRhdGFfc3RhY2sgPSBOVUxMOwogICAgIH0KICAgICBzdGF0ZS0+ZGF0YV9zdGFja19zaXplID0gc3RhdGUtPmRhdGFfc3RhY2tfYmFzZSA9IDA7CkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAgICAgdm9pZCogc3RhY2s7CiAgICAgICAgIGN1cnNpemUgPSBtaW5zaXplK21pbnNpemUvNCsxMDI0OwogICAgICAgICBUUkFDRSgoImFsbG9jYXRlL2dyb3cgc3RhY2sgJWRcbiIsIGN1cnNpemUpKTsKLSAgICAgICAgc3RhY2sgPSByZWFsbG9jKHN0YXRlLT5kYXRhX3N0YWNrLCBjdXJzaXplKTsKKyAgICAgICAgc3RhY2sgPSBQeU1lbV9SRUFMTE9DKHN0YXRlLT5kYXRhX3N0YWNrLCBjdXJzaXplKTsKICAgICAgICAgaWYgKCFzdGFjaykgewogICAgICAgICAgICAgZGF0YV9zdGFja19kZWFsbG9jKHN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBTUkVfRVJST1JfTUVNT1JZOwpAQCAtMTE2Myw3ICsxMTYzLDcgQEAKICAgICAgICAgICAgICAgICAgICBjdHgtPnBhdHRlcm5bMV0sIGN0eC0+cGF0dGVyblsyXSkpOwogCiAgICAgICAgICAgICAvKiBpbnN0YWxsIG5ldyByZXBlYXQgY29udGV4dCAqLwotICAgICAgICAgICAgY3R4LT51LnJlcCA9IChTUkVfUkVQRUFUKikgbWFsbG9jKHNpemVvZigqY3R4LT51LnJlcCkpOworICAgICAgICAgICAgY3R4LT51LnJlcCA9IChTUkVfUkVQRUFUKikgUHlPYmplY3RfTUFMTE9DKHNpemVvZigqY3R4LT51LnJlcCkpOwogICAgICAgICAgICAgY3R4LT51LnJlcC0+Y291bnQgPSAtMTsKICAgICAgICAgICAgIGN0eC0+dS5yZXAtPnBhdHRlcm4gPSBjdHgtPnBhdHRlcm47CiAgICAgICAgICAgICBjdHgtPnUucmVwLT5wcmV2ID0gc3RhdGUtPnJlcGVhdDsKQEAgLTExNzMsNyArMTE3Myw3IEBACiAgICAgICAgICAgICBzdGF0ZS0+cHRyID0gY3R4LT5wdHI7CiAgICAgICAgICAgICBET19KVU1QKEpVTVBfUkVQRUFULCBqdW1wX3JlcGVhdCwgY3R4LT5wYXR0ZXJuK2N0eC0+cGF0dGVyblswXSk7CiAgICAgICAgICAgICBzdGF0ZS0+cmVwZWF0ID0gY3R4LT51LnJlcC0+cHJldjsKLSAgICAgICAgICAgIGZyZWUoY3R4LT51LnJlcCk7CisgICAgICAgICAgICBQeU9iamVjdF9GUkVFKGN0eC0+dS5yZXApOwogCiAgICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgICAgUkVUVVJOX09OX0VSUk9SKHJldCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zc2wuYyBiL01vZHVsZXMvX3NzbC5jCmluZGV4IDRjMGRhNmYuLmY0OTM5MWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NzbC5jCisrKyBiL01vZHVsZXMvX3NzbC5jCkBAIC0xODMsMTAgKzE4Myw4IEBACiAJaW50IHNvY2tzdGF0ZTsKIAogCXNlbGYgPSBQeU9iamVjdF9OZXcoUHlTU0xPYmplY3QsICZQeVNTTF9UeXBlKTsgLyogQ3JlYXRlIG5ldyBvYmplY3QgKi8KLQlpZiAoc2VsZiA9PSBOVUxMKXsKLQkJZXJyc3RyID0gIm5ld1B5U1NMT2JqZWN0IGVycm9yIjsKLQkJZ290byBmYWlsOwotCX0KKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKIAltZW1zZXQoc2VsZi0+c2VydmVyLCAnXDAnLCBzaXplb2YoY2hhcikgKiBYNTA5X05BTUVfTUFYTEVOKTsKIAltZW1zZXQoc2VsZi0+aXNzdWVyLCAnXDAnLCBzaXplb2YoY2hhcikgKiBYNTA5X05BTUVfTUFYTEVOKTsKIAlzZWxmLT5zZXJ2ZXJfY2VydCA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zdHJ1Y3QuYyBiL01vZHVsZXMvX3N0cnVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMmU1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19zdHJ1Y3QuYwpAQCAtMCwwICsxLDE2NjAgQEAKKy8qIHN0cnVjdCBtb2R1bGUgLS0gcGFjayB2YWx1ZXMgaW50byBhbmQgKG91dCBvZikgc3RyaW5ncyAqLworCisvKiBOZXcgdmVyc2lvbiBzdXBwb3J0aW5nIGJ5dGUgb3JkZXIsIGFsaWdubWVudCBhbmQgc2l6ZSBvcHRpb25zLAorICAgY2hhcmFjdGVyIHN0cmluZ3MsIGFuZCB1bnNpZ25lZCBudW1iZXJzICovCisKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgorCisjaW5jbHVkZSAiUHl0aG9uLmgiCisjaW5jbHVkZSAic3RydWN0c2VxLmgiCisjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIFB5VHlwZU9iamVjdCBQeVN0cnVjdFR5cGU7CisKKy8qIGNvbXBhdGliaWxpdHkgbWFjcm9zICovCisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKK3R5cGVkZWYgaW50IFB5X3NzaXplX3Q7CisjZW5kaWYKKworLyogVGhlIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIGZvciBlYWNoIGZvcm1hdCBjaGFyYWN0ZXIgaXMgdGFibGUgZHJpdmVuICovCit0eXBlZGVmIHN0cnVjdCBfZm9ybWF0ZGVmIHsKKwljaGFyIGZvcm1hdDsKKwlQeV9zc2l6ZV90IHNpemU7CisJUHlfc3NpemVfdCBhbGlnbm1lbnQ7CisJUHlPYmplY3QqICgqdW5wYWNrKShjb25zdCBjaGFyICosCisJCQkgICAgY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKik7CisJaW50ICgqcGFjaykoY2hhciAqLCBQeU9iamVjdCAqLAorCQkgICAgY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKik7Cit9IGZvcm1hdGRlZjsKKwordHlwZWRlZiBzdHJ1Y3QgX2Zvcm1hdGNvZGUgeworCWNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICpmbXRkZWY7CisJUHlfc3NpemVfdCBvZmZzZXQ7CisJUHlfc3NpemVfdCBzaXplOworfSBmb3JtYXRjb2RlOworCisvKiBTdHJ1Y3Qgb2JqZWN0IGludGVyZmFjZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJUHlPYmplY3RfSEVBRAorCVB5X3NzaXplX3Qgc19zaXplOworCVB5X3NzaXplX3Qgc19sZW47CisJZm9ybWF0Y29kZSAqc19jb2RlczsKKwlQeU9iamVjdCAqc19mb3JtYXQ7CisJUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworfSBQeVN0cnVjdE9iamVjdDsKKworCisjZGVmaW5lIFB5U3RydWN0X0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsICZQeVN0cnVjdFR5cGUpCisjZGVmaW5lIFB5U3RydWN0X0NoZWNrRXhhY3Qob3ApICgob3ApLT5vYl90eXBlID09ICZQeVN0cnVjdFR5cGUpCisKKworLyogRXhjZXB0aW9uICovCisKK3N0YXRpYyBQeU9iamVjdCAqU3RydWN0RXJyb3I7CisKKworLyogRGVmaW5lIHZhcmlvdXMgc3RydWN0cyB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnRzIG9mIHR5cGVzICovCisKKwordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IHNob3J0IHg7IH0gc3Rfc2hvcnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgaW50IHg7IH0gc3RfaW50OwordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGxvbmcgeDsgfSBzdF9sb25nOwordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGZsb2F0IHg7IH0gc3RfZmxvYXQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgZG91YmxlIHg7IH0gc3RfZG91YmxlOwordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IHZvaWQgKng7IH0gc3Rfdm9pZF9wOworCisjZGVmaW5lIFNIT1JUX0FMSUdOIChzaXplb2Yoc3Rfc2hvcnQpIC0gc2l6ZW9mKHNob3J0KSkKKyNkZWZpbmUgSU5UX0FMSUdOIChzaXplb2Yoc3RfaW50KSAtIHNpemVvZihpbnQpKQorI2RlZmluZSBMT05HX0FMSUdOIChzaXplb2Yoc3RfbG9uZykgLSBzaXplb2YobG9uZykpCisjZGVmaW5lIEZMT0FUX0FMSUdOIChzaXplb2Yoc3RfZmxvYXQpIC0gc2l6ZW9mKGZsb2F0KSkKKyNkZWZpbmUgRE9VQkxFX0FMSUdOIChzaXplb2Yoc3RfZG91YmxlKSAtIHNpemVvZihkb3VibGUpKQorI2RlZmluZSBWT0lEX1BfQUxJR04gKHNpemVvZihzdF92b2lkX3ApIC0gc2l6ZW9mKHZvaWQgKikpCisKKy8qIFdlIGNhbid0IHN1cHBvcnQgcSBhbmQgUSBpbiBuYXRpdmUgbW9kZSB1bmxlc3MgdGhlIGNvbXBpbGVyIGRvZXM7CisgICBpbiBzdGQgbW9kZSwgdGhleSdyZSA4IGJ5dGVzIG9uIGFsbCBwbGF0Zm9ybXMuICovCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKK3R5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBQWV9MT05HX0xPTkcgeDsgfSBzX2xvbmdfbG9uZzsKKyNkZWZpbmUgTE9OR19MT05HX0FMSUdOIChzaXplb2Yoc19sb25nX2xvbmcpIC0gc2l6ZW9mKFBZX0xPTkdfTE9ORykpCisjZW5kaWYKKworI2RlZmluZSBTVFJJTkdJRlkoeCkgICAgI3gKKworI2lmZGVmIF9fcG93ZXJjCisjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKKyNlbmRpZgorCisvKiBIZWxwZXIgdG8gZ2V0IGEgUHlMb25nT2JqZWN0IGJ5IGhvb2sgb3IgYnkgY3Jvb2suICBDYWxsZXIgc2hvdWxkIGRlY3JlZi4gKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK2dldF9weWxvbmcoUHlPYmplY3QgKnYpCit7CisJUHlOdW1iZXJNZXRob2RzICptOworCisJYXNzZXJ0KHYgIT0gTlVMTCk7CisJaWYgKFB5SW50X0NoZWNrKHYpKQorCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOworCWlmIChQeUxvbmdfQ2hlY2sodikpIHsKKwkJUHlfSU5DUkVGKHYpOworCQlyZXR1cm4gdjsKKwl9CisJbSA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKwlpZiAobSAhPSBOVUxMICYmIG0tPm5iX2xvbmcgIT0gTlVMTCkgeworCQl2ID0gbS0+bmJfbG9uZyh2KTsKKwkJaWYgKHYgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoUHlMb25nX0NoZWNrKHYpKQorCQkJcmV0dXJuIHY7CisJCVB5X0RFQ1JFRih2KTsKKwl9CisJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJImNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IHRvIGxvbmciKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogSGVscGVyIHJvdXRpbmUgdG8gZ2V0IGEgUHl0aG9uIGludGVnZXIgYW5kIHJhaXNlIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgorICAgaWYgaXQgaXNuJ3Qgb25lICovCisKK3N0YXRpYyBpbnQKK2dldF9sb25nKFB5T2JqZWN0ICp2LCBsb25nICpwKQoreworCWxvbmcgeCA9IFB5SW50X0FzTG9uZyh2KTsKKwlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYW4gaW50ZWdlciIpOworCQlyZXR1cm4gLTE7CisJfQorCSpwID0geDsKKwlyZXR1cm4gMDsKK30KKworCisvKiBTYW1lLCBidXQgaGFuZGxpbmcgdW5zaWduZWQgbG9uZyAqLworCitzdGF0aWMgaW50CitnZXRfdWxvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIGxvbmcgKnApCit7CisJaWYgKFB5TG9uZ19DaGVjayh2KSkgeworCQl1bnNpZ25lZCBsb25nIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisJCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSgtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKwkJCXJldHVybiAtMTsKKwkJKnAgPSB4OworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGdldF9sb25nKHYsIChsb25nICopcCkgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKCgobG9uZykqcCkgPCAwKSB7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkidW5zaWduZWQgYXJndW1lbnQgaXMgPCAwIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCisvKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIGxvbmcgbG9uZy4gKi8KKworc3RhdGljIGludAorZ2V0X2xvbmdsb25nKFB5T2JqZWN0ICp2LCBQWV9MT05HX0xPTkcgKnApCit7CisJUFlfTE9OR19MT05HIHg7CisKKwl2ID0gZ2V0X3B5bG9uZyh2KTsKKwlpZiAodiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisJeCA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOworCVB5X0RFQ1JFRih2KTsKKwlpZiAoeCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisJCXJldHVybiAtMTsKKwkqcCA9IHg7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgdW5zaWduZWQgbG9uZyBsb25nLiAqLworCitzdGF0aWMgaW50CitnZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnApCit7CisJdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisKKwl2ID0gZ2V0X3B5bG9uZyh2KTsKKwlpZiAodiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7CisJUHlfREVDUkVGKHYpOworCWlmICh4ID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKwkJcmV0dXJuIC0xOworCSpwID0geDsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qIEZsb2F0aW5nIHBvaW50IGhlbHBlcnMgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK3VucGFja19mbG9hdChjb25zdCBjaGFyICpwLCAgLyogc3RhcnQgb2YgNC1ieXRlIHN0cmluZyAqLworICAgICAgICAgICAgIGludCBsZSkJICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLworeworCWRvdWJsZSB4OworCisJeCA9IF9QeUZsb2F0X1VucGFjazQoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7CisJaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgordW5wYWNrX2RvdWJsZShjb25zdCBjaGFyICpwLCAgLyogc3RhcnQgb2YgOC1ieXRlIHN0cmluZyAqLworICAgICAgICAgICAgICBpbnQgbGUpICAgICAgICAgLyogdHJ1ZSBmb3IgbGl0dGxlLWVuZGlhbiwgZmFsc2UgZm9yIGJpZy1lbmRpYW4gKi8KK3sKKwlkb3VibGUgeDsKKworCXggPSBfUHlGbG9hdF9VbnBhY2s4KCh1bnNpZ25lZCBjaGFyICopcCwgbGUpOworCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKK30KKworLyogSGVscGVyIHRvIGZvcm1hdCB0aGUgcmFuZ2UgZXJyb3IgZXhjZXB0aW9ucyAqLworc3RhdGljIGludAorX3JhbmdlX2Vycm9yKGNoYXIgZm9ybWF0LCBQeV9zc2l6ZV90IHNpemUsIGludCBpc191bnNpZ25lZCkKK3sKKwlpZiAoaXNfdW5zaWduZWQgPT0gMCkgeworCQlsb25nIHNtYWxsZXN0ID0gMCwgbGFyZ2VzdCA9IDA7CisJCVB5X3NzaXplX3QgaSA9IHNpemUgKiA4OworCQl3aGlsZSAoLS1pID4gMCkgeworCQkJc21hbGxlc3QgPSAoc21hbGxlc3QgKiAyKSAtIDE7CisJCQlsYXJnZXN0ID0gKGxhcmdlc3QgKiAyKSArIDE7CisJCX0KKwkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorCQkJIiclYycgZm9ybWF0IHJlcXVpcmVzICVsZCA8PSBudW1iZXIgPD0gJWxkIiwKKwkJCWZvcm1hdCwKKwkJCXNtYWxsZXN0LAorCQkJbGFyZ2VzdCk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBsYXJnZXN0ID0gMDsKKwkJUHlfc3NpemVfdCBpID0gc2l6ZSAqIDg7CisJCXdoaWxlICgtLWkgPj0gMCkKKwkJCWxhcmdlc3QgPSAobGFyZ2VzdCAqIDIpICsgMTsKKwkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorCQkJIiclYycgZm9ybWF0IHJlcXVpcmVzIDAgPD0gbnVtYmVyIDw9ICVsdSIsCisJCQlmb3JtYXQsCisJCQlsYXJnZXN0KTsKKwl9CisJcmV0dXJuIC0xOworfQorCisKKworLyogQSBsYXJnZSBudW1iZXIgb2Ygc21hbGwgcm91dGluZXMgZm9sbG93LCB3aXRoIG5hbWVzIG9mIHRoZSBmb3JtCisKKyAgIFtibG5dW3VwXV9UWVBFCisKKyAgIFtibG5dIGRpc3RpZ3Vpc2hlcyBhbW9uZyBiaWctZW5kaWFuLCBsaXR0bGUtZW5kaWFuIGFuZCBuYXRpdmUuCisgICBbcHVdIGRpc3RpZ3Vpc2hlcyBiZXR3ZWVuIHBhY2sgKHRvIHN0cnVjdCkgYW5kIHVucGFjayAoZnJvbSBzdHJ1Y3QpLgorICAgVFlQRSBpcyBvbmUgb2YgY2hhciwgYnl0ZSwgdWJ5dGUsIGV0Yy4KKyovCisKKy8qIE5hdGl2ZSBtb2RlIHJvdXRpbmVzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTk9URToKKyAgIEluIGFsbCBuW3VwXV88dHlwZT4gcm91dGluZXMgaGFuZGxpbmcgdHlwZXMgbGFyZ2VyIHRoYW4gMSBieXRlLCB0aGVyZSBpcworICAgKm5vKiBndWFyYW50ZWUgdGhhdCB0aGUgcCBwb2ludGVyIGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGVhY2ggdHlwZSwKKyAgIHRoZXJlZm9yZSBtZW1jcHkgaXMgY2FsbGVkLiAgQW4gaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGlzIHVzZWQgdG8KKyAgIGNvbXBlbnNhdGUgZm9yIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4KKyAgIE5vcm1hbGx5IGJvdGggdGhlIGludGVybWVkaWF0ZSB2YXJpYWJsZSBhbmQgdGhlIG1lbWNweSBjYWxsIHdpbGwgYmUKKyAgIHNraXBwZWQgYnkgQyBvcHRpbWlzYXRpb24gaW4gbGl0dGxlLWVuZGlhbiBhcmNoaXRlY3R1cmVzIChnY2MgPj0gMi45MQorICAgZG9lcyB0aGlzKS4gKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK251X2NoYXIoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAxKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X2J5dGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKihzaWduZWQgY2hhciAqKXApOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfdWJ5dGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKih1bnNpZ25lZCBjaGFyICopcCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitudV9zaG9ydChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJc2hvcnQgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X3VzaG9ydChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdW5zaWduZWQgc2hvcnQgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X2ludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJaW50IHg7CisJbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKwlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitudV91aW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBpbnQgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworI2lmIChTSVpFT0ZfTE9ORyA+IFNJWkVPRl9JTlQpCisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworI2Vsc2UKKwlpZiAoeCA8PSAoKHVuc2lnbmVkIGludClMT05HX01BWCkpCisJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKKwlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpeCk7CisjZW5kaWYKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X3Vsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisJbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKwlpZiAoeCA8PSBMT05HX01BWCkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKK30KKworLyogTmF0aXZlIG1vZGUgZG9lc24ndCBzdXBwb3J0IHEgb3IgUSB1bmxlc3MgdGhlIHBsYXRmb3JtIEMgc3VwcG9ydHMKKyAgIGxvbmcgbG9uZyAob3IsIG9uIFdpbmRvd3MsIF9faW50NjQpLiAqLworCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKworc3RhdGljIFB5T2JqZWN0ICoKK251X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlQWV9MT05HX0xPTkcgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCWlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCisJCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCWlmICh4IDw9IExPTkdfTUFYKQorCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKwlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOworfQorCisjZW5kaWYKKworc3RhdGljIFB5T2JqZWN0ICoKK251X2Zsb2F0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlmbG9hdCB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfZG91YmxlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlkb3VibGUgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitudV92b2lkX3AoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXZvaWQgKng7CisJbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKwlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHgpOworfQorCitzdGF0aWMgaW50CitucF9ieXRlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJbG9uZyB4OworCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHggPCAtMTI4IHx8IHggPiAxMjcpeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJImJ5dGUgZm9ybWF0IHJlcXVpcmVzIC0xMjggPD0gbnVtYmVyIDw9IDEyNyIpOworCQlyZXR1cm4gLTE7CisJfQorCSpwID0gKGNoYXIpeDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfdWJ5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHg7CisJaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoeCA8IDAgfHwgeCA+IDI1NSl7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkidWJ5dGUgZm9ybWF0IHJlcXVpcmVzIDAgPD0gbnVtYmVyIDw9IDI1NSIpOworCQlyZXR1cm4gLTE7CisJfQorCSpwID0gKGNoYXIpeDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfY2hhcihjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlTdHJpbmdfU2l6ZSh2KSAhPSAxKSB7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkiY2hhciBmb3JtYXQgcmVxdWlyZSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqcCA9ICpQeVN0cmluZ19Bc1N0cmluZyh2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfc2hvcnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHg7CisJc2hvcnQgeTsKKwlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmICh4IDwgU0hSVF9NSU4gfHwgeCA+IFNIUlRfTUFYKXsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJzaG9ydCBmb3JtYXQgcmVxdWlyZXMgIiBTVFJJTkdJRlkoU0hSVF9NSU4pCisJCQkJIiA8PSBudW1iZXIgPD0gIiBTVFJJTkdJRlkoU0hSVF9NQVgpKTsKKwkJcmV0dXJuIC0xOworCX0KKwl5ID0gKHNob3J0KXg7CisJbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfdXNob3J0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJbG9uZyB4OworCXVuc2lnbmVkIHNob3J0IHk7CisJaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoeCA8IDAgfHwgeCA+IFVTSFJUX01BWCl7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkic2hvcnQgZm9ybWF0IHJlcXVpcmVzIDAgPD0gbnVtYmVyIDw9ICIgU1RSSU5HSUZZKFVTSFJUX01BWCkpOworCQlyZXR1cm4gLTE7CisJfQorCXkgPSAodW5zaWduZWQgc2hvcnQpeDsKKwltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF9pbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHg7CisJaW50IHk7CisJaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisJCXJldHVybiAtMTsKKyNpZiAoU0laRU9GX0xPTkcgPiBTSVpFT0ZfSU5UKQorCWlmICgoeCA8ICgobG9uZylJTlRfTUlOKSkgfHwgKHggPiAoKGxvbmcpSU5UX01BWCkpKQorCQlyZXR1cm4gX3JhbmdlX2Vycm9yKGYtPmZvcm1hdCwgc2l6ZW9mKHkpLCAwKTsKKyNlbmRpZgorCXkgPSAoaW50KXg7CisJbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKwl1bnNpZ25lZCBpbnQgeTsKKwlpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCisJCXJldHVybiBfcmFuZ2VfZXJyb3IoZi0+Zm9ybWF0LCBzaXplb2YoeSksIDEpOworCXkgPSAodW5zaWduZWQgaW50KXg7CisjaWYgKFNJWkVPRl9MT05HID4gU0laRU9GX0lOVCkKKwlpZiAoeCA+ICgodW5zaWduZWQgbG9uZylVSU5UX01BWCkpCisJCXJldHVybiBfcmFuZ2VfZXJyb3IoZi0+Zm9ybWF0LCBzaXplb2YoeSksIDEpOworI2VuZGlmCisJbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeDsKKwlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25wX3Vsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdW5zaWduZWQgbG9uZyB4OworCWlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLT5mb3JtYXQsIHNpemVvZih4KSwgMSk7CisJbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhBVkVfTE9OR19MT05HCisKK3N0YXRpYyBpbnQKK25wX2xvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJUFlfTE9OR19MT05HIHg7CisJaWYgKGdldF9sb25nbG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisJaWYgKGdldF91bG9uZ2xvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorbnBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlmbG9hdCB4ID0gKGZsb2F0KVB5RmxvYXRfQXNEb3VibGUodik7CisJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfZG91YmxlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YoZG91YmxlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25wX3ZvaWRfcChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXZvaWQgKng7CisKKwl2ID0gZ2V0X3B5bG9uZyh2KTsKKwlpZiAodiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisJeCA9IFB5TG9uZ19Bc1ZvaWRQdHIodik7CisJUHlfREVDUkVGKHYpOworCWlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKwkJcmV0dXJuIC0xOworCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBmb3JtYXRkZWYgbmF0aXZlX3RhYmxlW10gPSB7CisJeyd4JywJc2l6ZW9mKGNoYXIpLAkwLAkJTlVMTH0sCisJeydiJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfYnl0ZSwJbnBfYnl0ZX0sCisJeydCJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfdWJ5dGUsCW5wX3VieXRlfSwKKwl7J2MnLAlzaXplb2YoY2hhciksCTAsCQludV9jaGFyLAlucF9jaGFyfSwKKwl7J3MnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKKwl7J3AnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKKwl7J2gnLAlzaXplb2Yoc2hvcnQpLAlTSE9SVF9BTElHTiwJbnVfc2hvcnQsCW5wX3Nob3J0fSwKKwl7J0gnLAlzaXplb2Yoc2hvcnQpLAlTSE9SVF9BTElHTiwJbnVfdXNob3J0LAlucF91c2hvcnR9LAorCXsnaScsCXNpemVvZihpbnQpLAlJTlRfQUxJR04sCW51X2ludCwJCW5wX2ludH0sCisJeydJJywJc2l6ZW9mKGludCksCUlOVF9BTElHTiwJbnVfdWludCwJbnBfdWludH0sCisJeydsJywJc2l6ZW9mKGxvbmcpLAlMT05HX0FMSUdOLAludV9sb25nLAlucF9sb25nfSwKKwl7J0wnLAlzaXplb2YobG9uZyksCUxPTkdfQUxJR04sCW51X3Vsb25nLAlucF91bG9uZ30sCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwl7J3EnLAlzaXplb2YoUFlfTE9OR19MT05HKSwgTE9OR19MT05HX0FMSUdOLCBudV9sb25nbG9uZywgbnBfbG9uZ2xvbmd9LAorCXsnUScsCXNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X3Vsb25nbG9uZyxucF91bG9uZ2xvbmd9LAorI2VuZGlmCisJeydmJywJc2l6ZW9mKGZsb2F0KSwJRkxPQVRfQUxJR04sCW51X2Zsb2F0LAlucF9mbG9hdH0sCisJeydkJywJc2l6ZW9mKGRvdWJsZSksCURPVUJMRV9BTElHTiwJbnVfZG91YmxlLAlucF9kb3VibGV9LAorCXsnUCcsCXNpemVvZih2b2lkICopLAlWT0lEX1BfQUxJR04sCW51X3ZvaWRfcCwJbnBfdm9pZF9wfSwKKwl7MH0KK307CisKKy8qIEJpZy1lbmRpYW4gcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgUHlPYmplY3QgKgorYnVfaW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHggPSAwOworCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisJZG8geworCQl4ID0gKHg8PDgpIHwgKCpwKysgJiAweEZGKTsKKwl9IHdoaWxlICgtLWkgPiAwKTsKKwkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLworCWlmIChTSVpFT0ZfTE9ORyA+IGYtPnNpemUpCisJCXggfD0gLSh4ICYgKDFMIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKKwlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitidV91aW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBsb25nIHggPSAwOworCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisJZG8geworCQl4ID0gKHg8PDgpIHwgKCpwKysgJiAweEZGKTsKKwl9IHdoaWxlICgtLWkgPiAwKTsKKwlpZiAoeCA8PSBMT05HX01BWCkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2J1X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCVBZX0xPTkdfTE9ORyB4ID0gMDsKKwlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworCWRvIHsKKwkJeCA9ICh4PDw4KSB8ICgqcCsrICYgMHhGRik7CisJfSB3aGlsZSAoLS1pID4gMCk7CisJLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KKwlpZiAoU0laRU9GX0xPTkdfTE9ORyA+IGYtPnNpemUpCisJCXggfD0gLSh4ICYgKDFMIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKKwlpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQorCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKwlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKKyNlbHNlCisJcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCisJCQkJICAgICAgOCwKKwkJCQkgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCisJCQkJICAgICAgMSAgLyogc2lnbmVkICovKTsKKyNlbmRpZgorfQorCitzdGF0aWMgUHlPYmplY3QgKgorYnVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4ID0gMDsKKwlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworCWRvIHsKKwkJeCA9ICh4PDw4KSB8ICgqcCsrICYgMHhGRik7CisJfSB3aGlsZSAoLS1pID4gMCk7CisJaWYgKHggPD0gTE9OR19NQVgpCisJCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgbG9uZykpOworCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7CisjZWxzZQorCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAorCQkJCSAgICAgIDgsCisJCQkJICAgICAgMCwgLyogbGl0dGxlLWVuZGlhbiAqLworCQkJCSAgICAgIDAgIC8qIHNpZ25lZCAqLyk7CisjZW5kaWYKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2J1X2Zsb2F0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlyZXR1cm4gdW5wYWNrX2Zsb2F0KHAsIDApOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorYnVfZG91YmxlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlyZXR1cm4gdW5wYWNrX2RvdWJsZShwLCAwKTsKK30KKworc3RhdGljIGludAorYnBfaW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJbG9uZyB4OworCVB5X3NzaXplX3QgaTsKKwlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworCWkgPSBmLT5zaXplOworCWlmIChpICE9IFNJWkVPRl9MT05HKSB7CisJCWlmICgoaSA9PSAyKSAmJiAoeCA8IC0zMjc2OCB8fCB4ID4gMzI3NjcpKQorCQkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLT5mb3JtYXQsIGksIDApOworI2lmIChTSVpFT0ZfTE9ORyAhPSA0KQorCQllbHNlIGlmICgoaSA9PSA0KSAmJiAoeCA8IC0yMTQ3NDgzNjQ4TCB8fCB4ID4gMjE0NzQ4MzY0N0wpKQorCQkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLT5mb3JtYXQsIGksIDApOworI2VuZGlmCisJfQorCWRvIHsKKwkJcFstLWldID0gKGNoYXIpeDsKKwkJeCA+Pj0gODsKKwl9IHdoaWxlIChpID4gMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JwX3VpbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisJUHlfc3NpemVfdCBpOworCWlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworCWkgPSBmLT5zaXplOworCWlmIChpICE9IFNJWkVPRl9MT05HKSB7CisJCXVuc2lnbmVkIGxvbmcgbWF4aW50ID0gMTsKKwkJbWF4aW50IDw8PSAodW5zaWduZWQgbG9uZykoaSAqIDgpOworCQlpZiAoeCA+PSBtYXhpbnQpCisJCQlyZXR1cm4gX3JhbmdlX2Vycm9yKGYtPmZvcm1hdCwgZi0+c2l6ZSwgMSk7CisJfQorCWRvIHsKKwkJcFstLWldID0gKGNoYXIpeDsKKwkJeCA+Pj0gODsKKwl9IHdoaWxlIChpID4gMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JwX2xvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJaW50IHJlczsKKwl2ID0gZ2V0X3B5bG9uZyh2KTsKKwlpZiAodiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopdiwKKwkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKKwkJCQkgIDgsCisJCQkJICAwLCAvKiBsaXR0bGVfZW5kaWFuICovCisJCQkJICAxICAvKiBzaWduZWQgKi8pOworCVB5X0RFQ1JFRih2KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CiticF91bG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlpbnQgcmVzOworCXYgPSBnZXRfcHlsb25nKHYpOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2LAorCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKilwLAorCQkJCSAgOCwKKwkJCQkgIDAsIC8qIGxpdHRsZV9lbmRpYW4gKi8KKwkJCQkgIDAgIC8qIHNpZ25lZCAqLyk7CisJUHlfREVDUkVGKHYpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK2JwX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDApOworfQorCitzdGF0aWMgaW50CiticF9kb3VibGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMCk7Cit9CisKK3N0YXRpYyBmb3JtYXRkZWYgYmlnZW5kaWFuX3RhYmxlW10gPSB7CisJeyd4JywJMSwJCTAsCQlOVUxMfSwKKwl7J2InLAkxLAkJMCwJCW51X2J5dGUsCW5wX2J5dGV9LAorCXsnQicsCTEsCQkwLAkJbnVfdWJ5dGUsCW5wX3VieXRlfSwKKwl7J2MnLAkxLAkJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAorCXsncycsCTEsCQkwLAkJTlVMTH0sCisJeydwJywJMSwJCTAsCQlOVUxMfSwKKwl7J2gnLAkyLAkJMCwJCWJ1X2ludCwJCWJwX2ludH0sCisJeydIJywJMiwJCTAsCQlidV91aW50LAlicF91aW50fSwKKwl7J2knLAk0LAkJMCwJCWJ1X2ludCwJCWJwX2ludH0sCisJeydJJywJNCwJCTAsCQlidV91aW50LAlicF91aW50fSwKKwl7J2wnLAk0LAkJMCwJCWJ1X2ludCwJCWJwX2ludH0sCisJeydMJywJNCwJCTAsCQlidV91aW50LAlicF91aW50fSwKKwl7J3EnLAk4LAkJMCwJCWJ1X2xvbmdsb25nLAlicF9sb25nbG9uZ30sCisJeydRJywJOCwJCTAsCQlidV91bG9uZ2xvbmcsCWJwX3Vsb25nbG9uZ30sCisJeydmJywJNCwJCTAsCQlidV9mbG9hdCwJYnBfZmxvYXR9LAorCXsnZCcsCTgsCQkwLAkJYnVfZG91YmxlLAlicF9kb3VibGV9LAorCXswfQorfTsKKworLyogTGl0dGxlLWVuZGlhbiByb3V0aW5lcy4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBQeU9iamVjdCAqCitsdV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeCA9IDA7CisJUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKwlkbyB7CisJCXggPSAoeDw8OCkgfCAocFstLWldICYgMHhGRik7CisJfSB3aGlsZSAoaSA+IDApOworCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisJaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKKwkJeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2x1X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIGxvbmcgeCA9IDA7CisJUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKwlkbyB7CisJCXggPSAoeDw8OCkgfCAocFstLWldICYgMHhGRik7CisJfSB3aGlsZSAoaSA+IDApOworCWlmICh4IDw9IExPTkdfTUFYKQorCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKChsb25nKXgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbHVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworI2lmZGVmIEhBVkVfTE9OR19MT05HCisJUFlfTE9OR19MT05HIHggPSAwOworCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisJZG8geworCQl4ID0gKHg8PDgpIHwgKHBbLS1pXSAmIDB4RkYpOworCX0gd2hpbGUgKGkgPiAwKTsKKwkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLworCWlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKKwkJeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworCWlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCisJCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOworI2Vsc2UKKwlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKwkJCQkgICAgICA4LAorCQkJCSAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKwkJCQkgICAgICAxICAvKiBzaWduZWQgKi8pOworI2VuZGlmCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitsdV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworI2lmZGVmIEhBVkVfTE9OR19MT05HCisJdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOworCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisJZG8geworCQl4ID0gKHg8PDgpIHwgKHBbLS1pXSAmIDB4RkYpOworCX0gd2hpbGUgKGkgPiAwKTsKKwlpZiAoeCA8PSBMT05HX01BWCkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKKyNlbHNlCisJcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCisJCQkJICAgICAgOCwKKwkJCQkgICAgICAxLCAvKiBsaXR0bGUtZW5kaWFuICovCisJCQkJICAgICAgMCAgLyogc2lnbmVkICovKTsKKyNlbmRpZgorfQorCitzdGF0aWMgUHlPYmplY3QgKgorbHVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXJldHVybiB1bnBhY2tfZmxvYXQocCwgMSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitsdV9kb3VibGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXJldHVybiB1bnBhY2tfZG91YmxlKHAsIDEpOworfQorCitzdGF0aWMgaW50CitscF9pbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHg7CisJUHlfc3NpemVfdCBpOworCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJaSA9IGYtPnNpemU7CisJaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKwkJaWYgKChpID09IDIpICYmICh4IDwgLTMyNzY4IHx8IHggPiAzMjc2NykpCisJCQlyZXR1cm4gX3JhbmdlX2Vycm9yKGYtPmZvcm1hdCwgaSwgMCk7CisjaWYgKFNJWkVPRl9MT05HICE9IDQpCisJCWVsc2UgaWYgKChpID09IDQpICYmICh4IDwgLTIxNDc0ODM2NDhMIHx8IHggPiAyMTQ3NDgzNjQ3TCkpCisJCQlyZXR1cm4gX3JhbmdlX2Vycm9yKGYtPmZvcm1hdCwgaSwgMCk7CisjZW5kaWYKKwl9CisJZG8geworCQkqcCsrID0gKGNoYXIpeDsKKwkJeCA+Pj0gODsKKwl9IHdoaWxlICgtLWkgPiAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbHBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKwlQeV9zc2l6ZV90IGk7CisJaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJaSA9IGYtPnNpemU7CisJaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKwkJdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOworCQltYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7CisJCWlmICh4ID49IG1heGludCkKKwkJCXJldHVybiBfcmFuZ2VfZXJyb3IoZi0+Zm9ybWF0LCBmLT5zaXplLCAxKTsKKwl9CisJZG8geworCQkqcCsrID0gKGNoYXIpeDsKKwkJeCA+Pj0gODsKKwl9IHdoaWxlICgtLWkgPiAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbHBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlpbnQgcmVzOworCXYgPSBnZXRfcHlsb25nKHYpOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QqKXYsCisJCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCisJCQkJICA4LAorCQkJCSAgMSwgLyogbGl0dGxlX2VuZGlhbiAqLworCQkJCSAgMSAgLyogc2lnbmVkICovKTsKKwlQeV9ERUNSRUYodik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorbHBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJaW50IHJlczsKKwl2ID0gZ2V0X3B5bG9uZyh2KTsKKwlpZiAodiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0Kil2LAorCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKilwLAorCQkJCSAgOCwKKwkJCQkgIDEsIC8qIGxpdHRsZV9lbmRpYW4gKi8KKwkJCQkgIDAgIC8qIHNpZ25lZCAqLyk7CisJUHlfREVDUkVGKHYpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK2xwX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiBfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDEpOworfQorCitzdGF0aWMgaW50CitscF9kb3VibGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMSk7Cit9CisKK3N0YXRpYyBmb3JtYXRkZWYgbGlsZW5kaWFuX3RhYmxlW10gPSB7CisJeyd4JywJMSwJCTAsCQlOVUxMfSwKKwl7J2InLAkxLAkJMCwJCW51X2J5dGUsCW5wX2J5dGV9LAorCXsnQicsCTEsCQkwLAkJbnVfdWJ5dGUsCW5wX3VieXRlfSwKKwl7J2MnLAkxLAkJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAorCXsncycsCTEsCQkwLAkJTlVMTH0sCisJeydwJywJMSwJCTAsCQlOVUxMfSwKKwl7J2gnLAkyLAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCisJeydIJywJMiwJCTAsCQlsdV91aW50LAlscF91aW50fSwKKwl7J2knLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCisJeydJJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKKwl7J2wnLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCisJeydMJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKKwl7J3EnLAk4LAkJMCwJCWx1X2xvbmdsb25nLAlscF9sb25nbG9uZ30sCisJeydRJywJOCwJCTAsCQlsdV91bG9uZ2xvbmcsCWxwX3Vsb25nbG9uZ30sCisJeydmJywJNCwJCTAsCQlsdV9mbG9hdCwJbHBfZmxvYXR9LAorCXsnZCcsCTgsCQkwLAkJbHVfZG91YmxlLAlscF9kb3VibGV9LAorCXswfQorfTsKKworCitzdGF0aWMgY29uc3QgZm9ybWF0ZGVmICoKK3doaWNodGFibGUoY2hhciAqKnBmbXQpCit7CisJY29uc3QgY2hhciAqZm10ID0gKCpwZm10KSsrOyAvKiBNYXkgYmUgYmFja2VkIG91dCBvZiBsYXRlciAqLworCXN3aXRjaCAoKmZtdCkgeworCWNhc2UgJzwnOgorCQlyZXR1cm4gbGlsZW5kaWFuX3RhYmxlOworCWNhc2UgJz4nOgorCWNhc2UgJyEnOiAvKiBOZXR3b3JrIGJ5dGUgb3JkZXIgaXMgYmlnLWVuZGlhbiAqLworCQlyZXR1cm4gYmlnZW5kaWFuX3RhYmxlOworCWNhc2UgJz0nOiB7IC8qIEhvc3QgYnl0ZSBvcmRlciAtLSBkaWZmZXJlbnQgZnJvbSBuYXRpdmUgaW4gYWxpZ21lbnQhICovCisJCWludCBuID0gMTsKKwkJY2hhciAqcCA9IChjaGFyICopICZuOworCQlpZiAoKnAgPT0gMSkKKwkJCXJldHVybiBsaWxlbmRpYW5fdGFibGU7CisJCWVsc2UKKwkJCXJldHVybiBiaWdlbmRpYW5fdGFibGU7CisJfQorCWRlZmF1bHQ6CisJCS0tKnBmbXQ7IC8qIEJhY2sgb3V0IG9mIHBvaW50ZXIgaW5jcmVtZW50ICovCisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgJ0AnOgorCQlyZXR1cm4gbmF0aXZlX3RhYmxlOworCX0KK30KKworCisvKiBHZXQgdGhlIHRhYmxlIGVudHJ5IGZvciBhIGZvcm1hdCBjb2RlICovCisKK3N0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgorZ2V0ZW50cnkoaW50IGMsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlmb3IgKDsgZi0+Zm9ybWF0ICE9ICdcMCc7IGYrKykgeworCQlpZiAoZi0+Zm9ybWF0ID09IGMpIHsKKwkJCXJldHVybiBmOworCQl9CisJfQorCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwgImJhZCBjaGFyIGluIHN0cnVjdCBmb3JtYXQiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBBbGlnbiBhIHNpemUgYWNjb3JkaW5nIHRvIGEgZm9ybWF0IGNvZGUgKi8KKworc3RhdGljIGludAorYWxpZ24oUHlfc3NpemVfdCBzaXplLCBjaGFyIGMsIGNvbnN0IGZvcm1hdGRlZiAqZSkKK3sKKwlpZiAoZS0+Zm9ybWF0ID09IGMpIHsKKwkJaWYgKGUtPmFsaWdubWVudCkgeworCQkJc2l6ZSA9ICgoc2l6ZSArIGUtPmFsaWdubWVudCAtIDEpCisJCQkJLyBlLT5hbGlnbm1lbnQpCisJCQkJKiBlLT5hbGlnbm1lbnQ7CisJCX0KKwl9CisJcmV0dXJuIHNpemU7Cit9CisKKworLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgZm9ybWF0IHN0cmluZyAqLworCitzdGF0aWMgaW50CitwcmVwYXJlX3MoUHlTdHJ1Y3RPYmplY3QgKnNlbGYpCit7CisJY29uc3QgZm9ybWF0ZGVmICpmOworCWNvbnN0IGZvcm1hdGRlZiAqZTsKKwlmb3JtYXRjb2RlICpjb2RlczsKKwkKKwljb25zdCBjaGFyICpzOworCWNvbnN0IGNoYXIgKmZtdDsKKwljaGFyIGM7CisJUHlfc3NpemVfdCBzaXplLCBsZW4sIG51bSwgaXRlbXNpemUsIHg7CisKKwlmbXQgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZi0+c19mb3JtYXQpOworCisJZiA9IHdoaWNodGFibGUoKGNoYXIgKiopJmZtdCk7CisJCisJcyA9IGZtdDsKKwlzaXplID0gMDsKKwlsZW4gPSAwOworCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKwkJaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQorCQkJY29udGludWU7CisJCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgeworCQkJbnVtID0gYyAtICcwJzsKKwkJCXdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykgeworCQkJCXggPSBudW0qMTAgKyAoYyAtICcwJyk7CisJCQkJaWYgKHgvMTAgIT0gbnVtKSB7CisJCQkJCVB5RXJyX1NldFN0cmluZygKKwkJCQkJCVN0cnVjdEVycm9yLAorCQkJCQkJIm92ZXJmbG93IGluIGl0ZW0gY291bnQiKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQludW0gPSB4OworCQkJfQorCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQludW0gPSAxOworCisJCWUgPSBnZXRlbnRyeShjLCBmKTsKKwkJaWYgKGUgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJCisJCXN3aXRjaCAoYykgeworCQkJY2FzZSAncyc6IC8qIGZhbGwgdGhyb3VnaCAqLworCQkJY2FzZSAncCc6IGxlbisrOyBicmVhazsKKwkJCWNhc2UgJ3gnOiBicmVhazsKKwkJCWRlZmF1bHQ6IGxlbiArPSBudW07IGJyZWFrOworCQl9CisKKwkJaXRlbXNpemUgPSBlLT5zaXplOworCQlzaXplID0gYWxpZ24oc2l6ZSwgYywgZSk7CisJCXggPSBudW0gKiBpdGVtc2l6ZTsKKwkJc2l6ZSArPSB4OworCQlpZiAoeC9pdGVtc2l6ZSAhPSBudW0gfHwgc2l6ZSA8IDApIHsKKwkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkJInRvdGFsIHN0cnVjdCBzaXplIHRvbyBsb25nIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlzZWxmLT5zX3NpemUgPSBzaXplOworCXNlbGYtPnNfbGVuID0gbGVuOworCWNvZGVzID0gUHlNZW1fTUFMTE9DKChsZW4gKyAxKSAqIHNpemVvZihmb3JtYXRjb2RlKSk7CisJaWYgKGNvZGVzID09IE5VTEwpIHsKKwkJUHlFcnJfTm9NZW1vcnkoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWxmLT5zX2NvZGVzID0gY29kZXM7CisJCisJcyA9IGZtdDsKKwlzaXplID0gMDsKKwl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7CisJCWlmIChpc3NwYWNlKFB5X0NIQVJNQVNLKGMpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKKwkJCW51bSA9IGMgLSAnMCc7CisJCQl3aGlsZSAoJzAnIDw9IChjID0gKnMrKykgJiYgYyA8PSAnOScpCisJCQkJbnVtID0gbnVtKjEwICsgKGMgLSAnMCcpOworCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJfQorCQllbHNlCisJCQludW0gPSAxOworCisJCWUgPSBnZXRlbnRyeShjLCBmKTsKKwkJCisJCXNpemUgPSBhbGlnbihzaXplLCBjLCBlKTsKKwkJaWYgKGMgPT0gJ3MnIHx8IGMgPT0gJ3AnKSB7CisJCQljb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKwkJCWNvZGVzLT5zaXplID0gbnVtOworCQkJY29kZXMtPmZtdGRlZiA9IGU7CisJCQljb2RlcysrOworCQkJc2l6ZSArPSBudW07CisJCX0gZWxzZSBpZiAoYyA9PSAneCcpIHsKKwkJCXNpemUgKz0gbnVtOworCQl9IGVsc2UgeworCQkJd2hpbGUgKC0tbnVtID49IDApIHsKKwkJCQljb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKwkJCQljb2Rlcy0+c2l6ZSA9IGUtPnNpemU7CisJCQkJY29kZXMtPmZtdGRlZiA9IGU7CisJCQkJY29kZXMrKzsKKwkJCQlzaXplICs9IGUtPnNpemU7CisJCQl9CisJCX0KKwl9CisJY29kZXMtPmZtdGRlZiA9IE5VTEw7CisJY29kZXMtPm9mZnNldCA9IHNpemU7CisJY29kZXMtPnNpemUgPSAwOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorc19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJUHlPYmplY3QgKnNlbGY7CisKKwlhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOworCisJc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworCWlmIChzZWxmICE9IE5VTEwpIHsKKwkJUHlTdHJ1Y3RPYmplY3QgKnMgPSAoUHlTdHJ1Y3RPYmplY3QqKXNlbGY7CisJCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwkJcy0+c19mb3JtYXQgPSBQeV9Ob25lOworCQlzLT5zX2NvZGVzID0gTlVMTDsKKwkJcy0+c19zaXplID0gLTE7CisJCXMtPnNfbGVuID0gLTE7CisJfQorCXJldHVybiBzZWxmOworfQorCitzdGF0aWMgaW50CitzX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKwlQeU9iamVjdCAqb19mb3JtYXQgPSBOVUxMOworCWludCByZXQgPSAwOworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZm9ybWF0IiwgMH07CisKKwlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlM6U3RydWN0Iiwga3dsaXN0LAorCQkJCQkgJm9fZm9ybWF0KSkKKwkJcmV0dXJuIC0xOworCisJUHlfSU5DUkVGKG9fZm9ybWF0KTsKKwlQeV9YREVDUkVGKHNvc2VsZi0+c19mb3JtYXQpOworCXNvc2VsZi0+c19mb3JtYXQgPSBvX2Zvcm1hdDsKKwkKKwlyZXQgPSBwcmVwYXJlX3Moc29zZWxmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorc19kZWFsbG9jKFB5U3RydWN0T2JqZWN0ICpzKQoreworCWlmIChzLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXMpOworCWlmIChzLT5zX2NvZGVzICE9IE5VTEwpIHsKKwkJUHlNZW1fRlJFRShzLT5zX2NvZGVzKTsKKwl9CisJUHlfWERFQ1JFRihzLT5zX2Zvcm1hdCk7CisJcy0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3NfdW5wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIGNoYXIgKnN0YXJ0ZnJvbSkgeworCWZvcm1hdGNvZGUgKmNvZGU7CisJUHlfc3NpemVfdCBpID0gMDsKKwlQeU9iamVjdCAqcmVzdWx0ID0gUHlUdXBsZV9OZXcoc29zZWxmLT5zX2xlbik7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoY29kZSA9IHNvc2VsZi0+c19jb2RlczsgY29kZS0+Zm10ZGVmICE9IE5VTEw7IGNvZGUrKykgeworCQlQeU9iamVjdCAqdjsKKwkJY29uc3QgZm9ybWF0ZGVmICplID0gY29kZS0+Zm10ZGVmOworCQljb25zdCBjaGFyICpyZXMgPSBzdGFydGZyb20gKyBjb2RlLT5vZmZzZXQ7CisJCWlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7CisJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzLCBjb2RlLT5zaXplKTsKKwkJCWlmICh2ID09IE5VTEwpCisJCQkJZ290byBmYWlsOworCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7CisJCX0gZWxzZSBpZiAoZS0+Zm9ybWF0ID09ICdwJykgeworCQkJUHlfc3NpemVfdCBuID0gKih1bnNpZ25lZCBjaGFyKilyZXM7CisJCQlpZiAobiA+PSBjb2RlLT5zaXplKQorCQkJCW4gPSBjb2RlLT5zaXplIC0gMTsKKwkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXMgKyAxLCBuKTsKKwkJCWlmICh2ID09IE5VTEwpCisJCQkJZ290byBmYWlsOworCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7CisJCX0gZWxzZSB7CisJCQl2ID0gZS0+dW5wYWNrKHJlcywgZSk7CisJCQlpZiAodiA9PSBOVUxMKQorCQkJCWdvdG8gZmFpbDsKKwkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpKyssIHYpOworCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK2ZhaWw6CisJUHlfREVDUkVGKHJlc3VsdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworUHlEb2NfU1RSVkFSKHNfdW5wYWNrX19kb2NfXywKKyJTLnVucGFjayhzdHIpIC0+ICh2MSwgdjIsIC4uLilcblwKK1xuXAorUmV0dXJuIHR1cGxlIGNvbnRhaW5pbmcgdmFsdWVzIHVucGFja2VkIGFjY29yZGluZyB0byB0aGlzIFN0cnVjdCdzIGZvcm1hdC5cblwKK1JlcXVpcmVzIGxlbihzdHIpID09IHNlbGYuc2l6ZS4gU2VlIHN0cnVjdC5fX2RvY19fIGZvciBtb3JlIG9uIGZvcm1hdFxuXAorc3RyaW5ncy4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3NfdW5wYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXRzdHIpCit7CisJUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisJYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKwlhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOwkKKwlpZiAoaW5wdXRzdHIgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soaW5wdXRzdHIpIHx8CisJCVB5U3RyaW5nX0dFVF9TSVpFKGlucHV0c3RyKSAhPSBzb3NlbGYtPnNfc2l6ZSkgeworCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisJCQkidW5wYWNrIHJlcXVpcmVzIGEgc3RyaW5nIGFyZ3VtZW50IG9mIGxlbmd0aCAlemQiLCBzb3NlbGYtPnNfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRzdHIpKTsKK30KKworUHlEb2NfU1RSVkFSKHNfdW5wYWNrX2Zyb21fX2RvY19fLAorIlMudW5wYWNrX2Zyb20oYnVmZmVyWywgb2Zmc2V0XSkgLT4gKHYxLCB2MiwgLi4uKVxuXAorXG5cCitSZXR1cm4gdHVwbGUgY29udGFpbmluZyB2YWx1ZXMgdW5wYWNrZWQgYWNjb3JkaW5nIHRvIHRoaXMgU3RydWN0J3MgZm9ybWF0LlxuXAorVW5saWtlIHVucGFjaywgdW5wYWNrX2Zyb20gY2FuIHVucGFjayB2YWx1ZXMgZnJvbSBhbnkgb2JqZWN0IHN1cHBvcnRpbmdcblwKK3RoZSBidWZmZXIgQVBJLCBub3QganVzdCBzdHIuIFJlcXVpcmVzIGxlbihidWZmZXJbb2Zmc2V0Ol0pID49IHNlbGYuc2l6ZS5cblwKK1NlZSBzdHJ1Y3QuX19kb2NfXyBmb3IgbW9yZSBvbiBmb3JtYXQgc3RyaW5ncy4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3NfdW5wYWNrX2Zyb20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJvZmZzZXQiLCAwfTsKKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQorCXN0YXRpYyBjaGFyICpmbXQgPSAieiN8aTp1bnBhY2tfZnJvbSI7CisjZWxzZQorCXN0YXRpYyBjaGFyICpmbXQgPSAieiN8bjp1bnBhY2tfZnJvbSI7CisjZW5kaWYKKwlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4gPSAwLCBvZmZzZXQgPSAwOworCWNoYXIgKmJ1ZmZlciA9IE5VTEw7CisJUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisJYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKwlhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgZm10LCBrd2xpc3QsCisJCQkJCSAmYnVmZmVyLCAmYnVmZmVyX2xlbiwgJm9mZnNldCkpCisJCXJldHVybiBOVUxMOworCisJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKwkJCSJ1bnBhY2tfZnJvbSByZXF1aXJlcyBhIGJ1ZmZlciBhcmd1bWVudCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKG9mZnNldCA8IDApCisJCW9mZnNldCArPSBidWZmZXJfbGVuOworCisJaWYgKG9mZnNldCA8IDAgfHwgKGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIDwgc29zZWxmLT5zX3NpemUpIHsKKwkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorCQkJInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIG9mIGF0IGxlYXN0ICV6ZCBieXRlcyIsCisJCQlzb3NlbGYtPnNfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBidWZmZXIgKyBvZmZzZXQpOworfQorCisKKy8qCisgKiBHdXRzIG9mIHRoZSBwYWNrIGZ1bmN0aW9uLgorICoKKyAqIFRha2VzIGEgc3RydWN0IG9iamVjdCwgYSB0dXBsZSBvZiBhcmd1bWVudHMsIGFuZCBvZmZzZXQgaW4gdGhhdCB0dXBsZSBvZgorICogYXJndW1lbnQgZm9yIHdoZXJlIHRvIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGFyZ3VtZW50cyBmb3IgcGFja2luZywgYW5kIGEKKyAqIGNoYXJhY3RlciBidWZmZXIgZm9yIHdyaXRpbmcgdGhlIHBhY2tlZCBzdHJpbmcuICBUaGUgY2FsbGVyIG11c3QgaW5zdXJlCisgKiB0aGF0IHRoZSBidWZmZXIgbWF5IGNvbnRhaW4gdGhlIHJlcXVpcmVkIGxlbmd0aCBmb3IgcGFja2luZyB0aGUgYXJndW1lbnRzLgorICogMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLCAxIGlzIHJldHVybmVkIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICoKKyAqLworc3RhdGljIGludAorc19wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgb2Zmc2V0LCBjaGFyKiBidWYpCit7CisJZm9ybWF0Y29kZSAqY29kZTsKKwlQeV9zc2l6ZV90IGk7CisKKwltZW1zZXQoYnVmLCAnXDAnLCBzb3NlbGYtPnNfc2l6ZSk7CisJaSA9IG9mZnNldDsKKwlmb3IgKGNvZGUgPSBzb3NlbGYtPnNfY29kZXM7IGNvZGUtPmZtdGRlZiAhPSBOVUxMOyBjb2RlKyspIHsKKwkJUHlfc3NpemVfdCBuOworCQlQeU9iamVjdCAqdjsKKwkJY29uc3QgZm9ybWF0ZGVmICplID0gY29kZS0+Zm10ZGVmOworCQljaGFyICpyZXMgPSBidWYgKyBjb2RlLT5vZmZzZXQ7CisJCWlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7CisJCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOworCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgeworCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkJCSJhcmd1bWVudCBmb3IgJ3MnIG11c3QgYmUgYSBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQluID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisJCQlpZiAobiA+IGNvZGUtPnNpemUpCisJCQkJbiA9IGNvZGUtPnNpemU7CisJCQlpZiAobiA+IDApCisJCQkJbWVtY3B5KHJlcywgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKKwkJfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7CisJCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOworCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgeworCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkJCSJhcmd1bWVudCBmb3IgJ3AnIG11c3QgYmUgYSBzdHJpbmciKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQluID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisJCQlpZiAobiA+IChjb2RlLT5zaXplIC0gMSkpCisJCQkJbiA9IGNvZGUtPnNpemUgLSAxOworCQkJaWYgKG4gPiAwKQorCQkJCW1lbWNweShyZXMgKyAxLCBQeVN0cmluZ19BU19TVFJJTkcodiksIG4pOworCQkJaWYgKG4gPiAyNTUpCisJCQkJbiA9IDI1NTsKKwkJCSpyZXMgPSBQeV9TQUZFX0RPV05DQVNUKG4sIFB5X3NzaXplX3QsIHVuc2lnbmVkIGNoYXIpOworCQl9IGVsc2UgeworCQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSsrKTsKKwkJCWlmIChlLT5wYWNrKHJlcywgdiwgZSkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfQorCX0KKwkKKwkvKiBTdWNjZXNzICovCisJcmV0dXJuIDA7Cit9CisKKworUHlEb2NfU1RSVkFSKHNfcGFja19fZG9jX18sCisiUy5wYWNrKHYxLCB2MiwgLi4uKSAtPiBzdHJpbmdcblwKK1xuXAorUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWVzIHYxLCB2MiwgLi4uIHBhY2tlZCBhY2NvcmRpbmcgdG8gdGhpc1xuXAorU3RydWN0J3MgZm9ybWF0LiBTZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0IHN0cmluZ3MuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitzX3BhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCVB5U3RydWN0T2JqZWN0ICpzb3NlbGY7CisJUHlPYmplY3QgKnJlc3VsdDsKKworCS8qIFZhbGlkYXRlIGFyZ3VtZW50cy4gKi8KKwlzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisJYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKwlpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8CisJICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gc29zZWxmLT5zX2xlbikKKwl7CisJCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKwkJCSJwYWNrIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsIHNvc2VsZi0+c19sZW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nICovCisJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBzb3NlbGYtPnNfc2l6ZSk7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwkKKwkvKiBDYWxsIHRoZSBndXRzICovCisJaWYgKCBzX3BhY2tfaW50ZXJuYWwoc29zZWxmLCBhcmdzLCAwLCBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSkgIT0gMCApIHsKKwkJUHlfREVDUkVGKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK1B5RG9jX1NUUlZBUihzX3BhY2tfdG9fX2RvY19fLAorIlMucGFja190byhidWZmZXIsIG9mZnNldCwgdjEsIHYyLCAuLi4pXG5cCitcblwKK1BhY2sgdGhlIHZhbHVlcyB2MiwgdjIsIC4uLiBhY2NvcmRpbmcgdG8gdGhpcyBTdHJ1Y3QncyBmb3JtYXQsIHdyaXRlIFxuXAordGhlIHBhY2tlZCBieXRlcyBpbnRvIHRoZSB3cml0YWJsZSBidWZmZXIgYnVmIHN0YXJ0aW5nIGF0IG9mZnNldC4gIE5vdGVcblwKK3RoYXQgdGhlIG9mZnNldCBpcyBub3QgYW4gb3B0aW9uYWwgYXJndW1lbnQuICBTZWUgc3RydWN0Ll9fZG9jX18gZm9yIFxuXAorbW9yZSBvbiBmb3JtYXQgc3RyaW5ncy4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3NfcGFja190byhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZjsKKwljaGFyICpidWZmZXI7CisJUHlfc3NpemVfdCBidWZmZXJfbGVuLCBvZmZzZXQ7CisKKwkvKiBWYWxpZGF0ZSBhcmd1bWVudHMuICArMSBpcyBmb3IgdGhlIGZpcnN0IGFyZyBhcyBidWZmZXIuICovCisJc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKwlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworCWFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7CisJaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAorCSAgICBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IChzb3NlbGYtPnNfbGVuICsgMikpCisJeworCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisJCQkgICAgICJwYWNrX3RvIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsIAorCQkJICAgICAoc29zZWxmLT5zX2xlbiArIDIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRXh0cmFjdCBhIHdyaXRhYmxlIG1lbW9yeSBidWZmZXIgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KKwlpZiAoIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSwgCisJCQkJCQkJCSh2b2lkKiopJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pID09IC0xICkgeyAKKwkJcmV0dXJuIE5VTEw7CisJfQorCWFzc2VydCggYnVmZmVyX2xlbiA+PSAwICk7CisKKwkvKiBFeHRyYWN0IHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KKwlvZmZzZXQgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAxKSk7CisKKwkvKiBTdXBwb3J0IG5lZ2F0aXZlIG9mZnNldHMuICovCisJaWYgKG9mZnNldCA8IDApCisJCW9mZnNldCArPSBidWZmZXJfbGVuOworCisJLyogQ2hlY2sgYm91bmRhcmllcyAqLworCWlmIChvZmZzZXQgPCAwIHx8IChidWZmZXJfbGVuIC0gb2Zmc2V0KSA8IHNvc2VsZi0+c19zaXplKSB7CisJCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKwkJCSAgICAgInBhY2tfdG8gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKKwkJCSAgICAgc29zZWxmLT5zX3NpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJLyogQ2FsbCB0aGUgZ3V0cyAqLworCWlmICggc19wYWNrX2ludGVybmFsKHNvc2VsZiwgYXJncywgMiwgYnVmZmVyICsgb2Zmc2V0KSAhPSAwICkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3NfZ2V0X2Zvcm1hdChQeVN0cnVjdE9iamVjdCAqc2VsZiwgdm9pZCAqdW51c2VkKQoreworCVB5X0lOQ1JFRihzZWxmLT5zX2Zvcm1hdCk7CisJcmV0dXJuIHNlbGYtPnNfZm9ybWF0OworfQorCitzdGF0aWMgUHlPYmplY3QgKgorc19nZXRfc2l6ZShQeVN0cnVjdE9iamVjdCAqc2VsZiwgdm9pZCAqdW51c2VkKQoreworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5zX3NpemUpOworfQorCisvKiBMaXN0IG9mIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHNfbWV0aG9kc1tdID0geworCXsicGFjayIsCShQeUNGdW5jdGlvbilzX3BhY2ssCQlNRVRIX1ZBUkFSR1MsIHNfcGFja19fZG9jX199LAorCXsicGFja190byIsCShQeUNGdW5jdGlvbilzX3BhY2tfdG8sCQlNRVRIX1ZBUkFSR1MsIHNfcGFja190b19fZG9jX199LCAKKwl7InVucGFjayIsCShQeUNGdW5jdGlvbilzX3VucGFjaywJCU1FVEhfTywgc191bnBhY2tfX2RvY19ffSwKKwl7InVucGFja19mcm9tIiwJKFB5Q0Z1bmN0aW9uKXNfdW5wYWNrX2Zyb20sCU1FVEhfS0VZV09SRFMsIHNfdW5wYWNrX2Zyb21fX2RvY19ffSwKKwl7TlVMTCwJIE5VTEx9CQkvKiBzZW50aW5lbCAqLworfTsKKworUHlEb2NfU1RSVkFSKHNfX2RvY19fLCAiQ29tcGlsZWQgc3RydWN0IG9iamVjdCIpOworCisjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeVN0cnVjdE9iamVjdCwgeCkKKworc3RhdGljIFB5R2V0U2V0RGVmIHNfZ2V0c2V0bGlzdFtdID0geworCXsiZm9ybWF0IiwgKGdldHRlcilzX2dldF9mb3JtYXQsIChzZXR0ZXIpTlVMTCwgInN0cnVjdCBmb3JtYXQgc3RyaW5nIiwgTlVMTH0sCisJeyJzaXplIiwgKGdldHRlcilzX2dldF9zaXplLCAoc2V0dGVyKU5VTEwsICJzdHJ1Y3Qgc2l6ZSBpbiBieXRlcyIsIE5VTEx9LAorCXtOVUxMfSAvKiBzZW50aW5lbCAqLworfTsKKworc3RhdGljCitQeVR5cGVPYmplY3QgUHlTdHJ1Y3RUeXBlID0geworCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorCTAsCisJIlN0cnVjdCIsCisJc2l6ZW9mKFB5U3RydWN0T2JqZWN0KSwKKwkwLAorCShkZXN0cnVjdG9yKXNfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLworCTAsCQkJCQkvKiB0cF9wcmludCAqLworCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCisJMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KKwkwLAkJCQkJLyogdHBfY29tcGFyZSAqLworCTAsCQkJCQkvKiB0cF9yZXByICovCisJMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLworCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLworCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCisJMCwJCQkJCS8qIHRwX2hhc2ggKi8KKwkwLAkJCQkJLyogdHBfY2FsbCAqLworCTAsCQkJCQkvKiB0cF9zdHIgKi8KKwlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KKwlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJLyogdHBfc2V0YXR0cm8gKi8KKwkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCisJUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywvKiB0cF9mbGFncyAqLworCXNfX2RvY19fLAkJCS8qIHRwX2RvYyAqLworCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLworCTAsCQkJCQkvKiB0cF9jbGVhciAqLworCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworCW9mZnNldG9mKFB5U3RydWN0T2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwJCQkJCS8qIHRwX2l0ZXIgKi8KKwkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KKwlzX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLworCU5VTEwsCQkJCS8qIHRwX21lbWJlcnMgKi8KKwlzX2dldHNldGxpc3QsCQkvKiB0cF9nZXRzZXQgKi8KKwkwLAkJCQkJLyogdHBfYmFzZSAqLworCTAsCQkJCQkvKiB0cF9kaWN0ICovCisJMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLworCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKwkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLworCXNfaW5pdCwJCQkJLyogdHBfaW5pdCAqLworCVB5VHlwZV9HZW5lcmljQWxsb2MsLyogdHBfYWxsb2MgKi8KKwlzX25ldywJCQkJLyogdHBfbmV3ICovCisJUHlPYmplY3RfRGVsLAkJLyogdHBfZnJlZSAqLworfTsKKworLyogTW9kdWxlIGluaXRpYWxpemF0aW9uICovCisKK1B5TU9ESU5JVF9GVU5DCitpbml0X3N0cnVjdCh2b2lkKQoreworCVB5T2JqZWN0ICptID0gUHlfSW5pdE1vZHVsZSgiX3N0cnVjdCIsIE5VTEwpOworCWlmIChtID09IE5VTEwpCisJCXJldHVybjsKKworCVB5U3RydWN0VHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworCWlmIChQeVR5cGVfUmVhZHkoJlB5U3RydWN0VHlwZSkgPCAwKQorCQlyZXR1cm47CisKKwkvKiBDaGVjayBlbmRpYW4gYW5kIHN3YXAgaW4gZmFzdGVyIGZ1bmN0aW9ucyAqLworCXsKKwkJaW50IG9uZSA9IDE7CisJCWZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOworCQlmb3JtYXRkZWYgKm90aGVyLCAqcHRyOworCQlpZiAoKGludCkqKHVuc2lnbmVkIGNoYXIqKSZvbmUpCisJCQlvdGhlciA9IGxpbGVuZGlhbl90YWJsZTsKKwkJZWxzZQorCQkJb3RoZXIgPSBiaWdlbmRpYW5fdGFibGU7CisJCS8qIFNjYW4gdGhyb3VnaCB0aGUgbmF0aXZlIHRhYmxlLCBmaW5kIGEgbWF0Y2hpbmcKKwkJICAgZW50cnkgaW4gdGhlIGVuZGlhbiB0YWJsZSBhbmQgc3dhcCBpbiB0aGUKKwkJICAgbmF0aXZlIGltcGxlbWVudGF0aW9ucyB3aGVuZXZlciBwb3NzaWJsZQorCQkgICAoNjQtYml0IHBsYXRmb3JtcyBtYXkgbm90IGhhdmUgInN0YW5kYXJkIiBzaXplcykgKi8KKwkJd2hpbGUgKG5hdGl2ZS0+Zm9ybWF0ICE9ICdcMCcgJiYgb3RoZXItPmZvcm1hdCAhPSAnXDAnKSB7CisJCQlwdHIgPSBvdGhlcjsKKwkJCXdoaWxlIChwdHItPmZvcm1hdCAhPSAnXDAnKSB7CisJCQkJaWYgKHB0ci0+Zm9ybWF0ID09IG5hdGl2ZS0+Zm9ybWF0KSB7CisJCQkJCS8qIE1hdGNoIGZhc3RlciB3aGVuIGZvcm1hdHMgYXJlCisJCQkJCSAgIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciAqLworCQkJCQlpZiAocHRyID09IG90aGVyKQorCQkJCQkJb3RoZXIrKzsKKwkJCQkJLyogT25seSB1c2UgdGhlIHRyaWNrIGlmIHRoZSAKKwkJCQkJICAgc2l6ZSBtYXRjaGVzICovCisJCQkJCWlmIChwdHItPnNpemUgIT0gbmF0aXZlLT5zaXplKQorCQkJCQkJYnJlYWs7CisJCQkJCS8qIFNraXAgZmxvYXQgYW5kIGRvdWJsZSwgY291bGQgYmUKKwkJCQkJICAgInVua25vd24iIGZsb2F0IGZvcm1hdCAqLworCQkJCQlpZiAocHRyLT5mb3JtYXQgPT0gJ2QnIHx8IHB0ci0+Zm9ybWF0ID09ICdmJykKKwkJCQkJCWJyZWFrOworCQkJCQlwdHItPnBhY2sgPSBuYXRpdmUtPnBhY2s7CisJCQkJCXB0ci0+dW5wYWNrID0gbmF0aXZlLT51bnBhY2s7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwdHIrKzsKKwkJCX0KKwkJCW5hdGl2ZSsrOworCQl9CisJfQorCQorCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisJaWYgKFN0cnVjdEVycm9yID09IE5VTEwpIHsKKwkJU3RydWN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN0cnVjdC5lcnJvciIsIE5VTEwsIE5VTEwpOworCQlpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkKKwkJCXJldHVybjsKKwl9CisKKwlQeV9JTkNSRUYoU3RydWN0RXJyb3IpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTdHJ1Y3RFcnJvcik7CisKKwlQeV9JTkNSRUYoKFB5T2JqZWN0KikmUHlTdHJ1Y3RUeXBlKTsKKwlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0cnVjdCIsIChQeU9iamVjdCopJlB5U3RydWN0VHlwZSk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwppbmRleCBlODg4MWRjLi42YjlkZmZkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKQEAgLTQ4Niw4ICs0ODYsOCBAQAogCXJldHVybiBQeV9Ob25lOwogfQogCi1zdGF0aWMKLVB5T2JqZWN0ICpjb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorc3RhdGljIFB5T2JqZWN0ICoKK2NvZGVjX2luY3JlbWVudGFsZW5jb2RlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAJY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnMgPSBOVUxMOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnRlc3RfaW5jcmVtZW50YWxlbmNvZGVyIiwKQEAgLTQ5Niw4ICs0OTYsOCBAQAogCXJldHVybiBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcihlbmNvZGluZywgZXJyb3JzKTsKIH0KIAotc3RhdGljCi1QeU9iamVjdCAqY29kZWNfaW5jcmVtZW50YWxkZWNvZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3N0YXRpYyBQeU9iamVjdCAqCitjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCWNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZGVjb2RlciIsCkBAIC02NjAsNiArNjYwLDQyIEBACiB9CiAjZW5kaWYKIAorLyogU29tZSB0ZXN0cyBvZiBQeVN0cmluZ19Gcm9tRm9ybWF0KCkuICBUaGlzIG5lZWRzIG1vcmUgdGVzdHMuICovCitzdGF0aWMgUHlPYmplY3QgKgordGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworCVB5T2JqZWN0ICpyZXN1bHQ7CisJY2hhciAqbXNnOworCisjZGVmaW5lIENIRUNLXzFfRk9STUFUKEZPUk1BVCwgVFlQRSkgCQkJXAorCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoRk9STUFULCAoVFlQRSkxKTsJXAorCWlmIChyZXN1bHQgPT0gTlVMTCkJCQkJXAorCQlyZXR1cm4gTlVMTDsJCQkJXAorCWlmIChzdHJjbXAoUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgIjEiKSkgewlcCisJCW1zZyA9IEZPUk1BVCAiIGZhaWxlZCBhdCAxIjsJCVwKKwkJZ290byBGYWlsOwkJCQlcCisJfQkJCQkJCVwKKwlQeV9ERUNSRUYocmVzdWx0KQorCisJQ0hFQ0tfMV9GT1JNQVQoIiVkIiwgaW50KTsKKwlDSEVDS18xX0ZPUk1BVCgiJWxkIiwgbG9uZyk7CisJLyogVGhlIHogd2lkdGggbW9kaWZpZXIgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuICovCisJQ0hFQ0tfMV9GT1JNQVQoIiV6ZCIsIFB5X3NzaXplX3QpOworCisJLyogVGhlIHUgdHlwZSBjb2RlIHdhcyBhZGRlZCBpbiBQeXRob24gMi41LiAqLworCUNIRUNLXzFfRk9STUFUKCIldSIsIHVuc2lnbmVkIGludCk7CisJQ0hFQ0tfMV9GT1JNQVQoIiVsdSIsIHVuc2lnbmVkIGxvbmcpOworCUNIRUNLXzFfRk9STUFUKCIlenUiLCBzaXplX3QpOworCisJUHlfUkVUVVJOX05PTkU7CisKKyBGYWlsOgorIAlQeV9YREVDUkVGKHJlc3VsdCk7CisJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIG1zZyk7CisKKyN1bmRlZiBDSEVDS18xX0ZPUk1BVAorfQorCiBzdGF0aWMgUHlNZXRob2REZWYgVGVzdE1ldGhvZHNbXSA9IHsKIAl7InJhaXNlX2V4Y2VwdGlvbiIsCXJhaXNlX2V4Y2VwdGlvbiwJCSBNRVRIX1ZBUkFSR1N9LAogCXsidGVzdF9jb25maWciLAkJKFB5Q0Z1bmN0aW9uKXRlc3RfY29uZmlnLAkgTUVUSF9OT0FSR1N9LApAQCAtNjY5LDYgKzcwNSw3IEBACiAJeyJ0ZXN0X2xvbmdfbnVtYml0cyIsCShQeUNGdW5jdGlvbil0ZXN0X2xvbmdfbnVtYml0cywJIE1FVEhfTk9BUkdTfSwKIAl7InRlc3Rfa19jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X2tfY29kZSwJIE1FVEhfTk9BUkdTfSwKIAl7InRlc3RfbnVsbF9zdHJpbmdzIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbnVsbF9zdHJpbmdzLAkgTUVUSF9OT0FSR1N9LAorCXsidGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQiLCAoUHlDRnVuY3Rpb24pdGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQsIE1FVEhfTk9BUkdTfSwKIAogCXsiZ2V0YXJnc19iIiwJCWdldGFyZ3NfYiwJCQkgTUVUSF9WQVJBUkdTfSwKIAl7ImdldGFyZ3NfQiIsCQlnZXRhcmdzX0IsCQkJIE1FVEhfVkFSQVJHU30sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190a2ludGVyLmMgYi9Nb2R1bGVzL190a2ludGVyLmMKaW5kZXggYzE3YjZjNi4uNzc1ODNiNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGtpbnRlci5jCisrKyBiL01vZHVsZXMvX3RraW50ZXIuYwpAQCAtMjYxOSwyMSArMjYxOSwzMiBAQAogc3RhdGljIFB5T2JqZWN0CSoKIFRrYXBwX1RrSW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CisJc3RhdGljIGludCBoYXNfZmFpbGVkOwogCVRjbF9JbnRlcnAgKmludGVycCA9IFRrYXBwX0ludGVycChzZWxmKTsKIAlUa19XaW5kb3cgbWFpbl93aW5kb3c7CiAJY29uc3QgY2hhciAqIF90a19leGlzdHMgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMgPQlOVUxMOwogCWludCBlcnI7CiAJbWFpbl93aW5kb3cgPSBUa19NYWluV2luZG93KGludGVycCk7CiAKKwkvKiBJbiBhbGwgY3VycmVudCB2ZXJzaW9ucyBvZiBUayAoaW5jbHVkaW5nIDguNC4xMyksIFRrX0luaXQKKwkgICBkZWFkbG9ja3Mgb24gdGhlIHNlY29uZCBjYWxsIHdoZW4gdGhlIGZpcnN0IGNhbGwgZmFpbGVkLgorCSAgIFRvIGF2b2lkIHRoZSBkZWFkbG9jaywgd2UganVzdCByZWZ1c2UgdGhlIHNlY29uZCBjYWxsIHRocm91Z2gKKwkgICBhIHN0YXRpYyB2YXJpYWJsZS4gKi8KKwlpZiAoaGFzX2ZhaWxlZCkgeworCQlQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgCisJCQkJIkNhbGxpbmcgVGtfSW5pdCBhZ2FpbiBhZnRlciBhIHByZXZpb3VzIGNhbGwgZmFpbGVkIG1pZ2h0IGRlYWRsb2NrIik7CisJCXJldHVybiBOVUxMOworCX0KKwkgICAKIAkvKiBXZSB3YW50IHRvIGd1YXJkIGFnYWluc3QgY2FsbGluZyBUa19Jbml0KCkgbXVsdGlwbGUgdGltZXMgKi8KIAlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKIAlFTlRFUl9UQ0wKIAllcnIgPSBUY2xfRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksICJpbmZvIGV4aXN0cwl0a192ZXJzaW9uIik7CiAJRU5URVJfT1ZFUkxBUAogCWlmIChlcnIgPT0gVENMX0VSUk9SKSB7Ci0JCS8qIFhYWDogc2hvdWxkbid0IHdlIGRvIHNvbWV0aGluZyB3aXRoIHJlcz8gKi8KLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKwkJLyogVGhpcyBzZXRzIGFuIGV4Y2VwdGlvbiwgYnV0IHdlIGNhbm5vdCByZXR1cm4gcmlnaHQKKwkJICAgYXdheSBiZWNhdXNlIHdlIG5lZWQgdG8gZXhpdCB0aGUgb3ZlcmxhcCBmaXJzdC4gKi8KKwkJVGtpbnRlcl9FcnJvcihzZWxmKTsKIAl9IGVsc2UgewogCQlfdGtfZXhpc3RzID0gVGthcHBfUmVzdWx0KHNlbGYpOwogCX0KQEAgLTI2NDQsNiArMjY1NSw3IEBACiAJaWYgKF90a19leGlzdHMgPT0gTlVMTCB8fCBzdHJjbXAoX3RrX2V4aXN0cywgIjEiKSAhPSAwKQl7CiAJCWlmIChUa19Jbml0KGludGVycCkJPT0gVENMX0VSUk9SKSB7CiAJCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRjbF9HZXRTdHJpbmdSZXN1bHQoVGthcHBfSW50ZXJwKHNlbGYpKSk7CisJCQloYXNfZmFpbGVkID0gMTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IDUyYTdmNWUuLmFmMTI3NjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTE5NzUsOSArMTk3NSw5IEBACiAJMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KIAkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwogCShyZXByZnVuYylhcnJheV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXMgX251bWJlciovCi0JJmFycmF5X2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzIF9zZXF1ZW5jZSovCi0JJmFycmF5X2FzX21hcHBpbmcsCQkJLyogdHBfYXMgX21hcHBpbmcqLworCTAsCQkJCQkvKiB0cF9hc19udW1iZXIqLworCSZhcnJheV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSovCisJJmFycmF5X2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyovCiAJMCwgCQkJCQkvKiB0cF9oYXNoICovCiAJMCwJCQkJCS8qIHRwX2NhbGwgKi8KIAkwLAkJCQkJLyogdHBfc3RyICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NQaWNrbGUuYyBiL01vZHVsZXMvY1BpY2tsZS5jCmluZGV4IDE4ZGY1OTkuLjg1ZmQ0NTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY1BpY2tsZS5jCisrKyBiL01vZHVsZXMvY1BpY2tsZS5jCkBAIC0xMTUxLDcgKzExNTEsOSBAQAogCWVsc2UgewogCQljaGFyIGNfc3RyWzI1MF07CiAJCWNfc3RyWzBdID0gRkxPQVQ7Ci0JCVB5T1Nfc25wcmludGYoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMSwgIiUuMTdnXG4iLCB4KTsKKwkJUHlPU19hc2NpaV9mb3JtYXRkKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDIsICIlLjE3ZyIsIHgpOworCQkvKiBFeHRlbmQgdGhlIGZvcm1hdHRlZCBzdHJpbmcgd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyICovCisJCXN0cmNhdChjX3N0ciwgIlxuIik7CiAKIAkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIHN0cmxlbihjX3N0cikpIDwgMCkKIAkJCXJldHVybiAtMTsKQEAgLTMwNzEsOCArMzA3Myw4IEBACiAJCQkJCSJwaWNrbGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmYywgIk9PIiwgcHlfbW9kdWxlX25hbWUsCi0JCQkJCSAgICAgcHlfZ2xvYmFsX25hbWUpOworCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmYywgcHlfbW9kdWxlX25hbWUsCisJCQkJCSAgICAgICAgICAgIHB5X2dsb2JhbF9uYW1lLCBOVUxMKTsKIAl9CiAKIAltb2R1bGUgPSBQeVN5c19HZXRPYmplY3QoIm1vZHVsZXMiKTsKQEAgLTU2MjMsNyArNTYyNSw2IEBACiAKIAlpZiAoISggdD1QeURpY3RfTmV3KCkpKSAgcmV0dXJuIC0xOwogCWlmICghKCByPVB5UnVuX1N0cmluZygKLQkJICAgICAgICJkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOiBzZWxmLmFyZ3M9YXJnc1xuXG4iCiAJCSAgICAgICAiZGVmIF9fc3RyX18oc2VsZik6XG4iCiAJCSAgICAgICAiICByZXR1cm4gc2VsZi5hcmdzIGFuZCAoJyVzJyAlIHNlbGYuYXJnc1swXSkgb3IgJyh3aGF0KSdcbiIsCiAJCSAgICAgICBQeV9maWxlX2lucHV0LApAQCAtNTY0Myw3ICs1NjQ0LDYgQEAKIAogCWlmICghKCB0PVB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CiAJaWYgKCEoIHI9UHlSdW5fU3RyaW5nKAotCQkgICAgICAgImRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6IHNlbGYuYXJncz1hcmdzXG5cbiIKIAkJICAgICAgICJkZWYgX19zdHJfXyhzZWxmKTpcbiIKIAkJICAgICAgICIgIGE9c2VsZi5hcmdzXG4iCiAJCSAgICAgICAiICBhPWEgYW5kIHR5cGUoYVswXSkgb3IgJyh3aGF0KSdcbiIKZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCmluZGV4IGFhMDA5NmEuLjdlNmFlZGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYwpAQCAtODMxLDcgKzgzMSw3IEBACiB7CiAJd2hpbGUgKGJ1Zi0+aW5idWYgPCBidWYtPmluYnVmX2VuZCkgewogCQlQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdDsKLQkJaW50IHI7CisJCVB5X3NzaXplX3QgcjsKIAogCQlpbmxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKIAkJb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1Zl9lbmQgLSBidWYtPm91dGJ1Zik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKaW5kZXggOWFlMjM1YS4uNzYwYWIzMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYwpAQCAtMzY3OSw2ICszNjc5LDEzIEBACiAJCXJldHVybiBOVUxMOwogCWZyYWN0aW9uID0gdGltZXN0YW1wIC0gKGRvdWJsZSl0aW1ldDsKIAl1cyA9IChpbnQpcm91bmRfdG9fbG9uZyhmcmFjdGlvbiAqIDFlNik7CisJLyogSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGEKKwkgKiBmdWxsIHNlY29uZCwgcm91bmQgdXAuIE90aGVyd2lzZSwgVmFsdWVFcnJvcnMgYXJlIHJhaXNlZAorCSAqIGZvciBzb21lIGZsb2F0cy4gKi8KKwlpZiAodXMgPT0gMTAwMDAwMCkgeworCQl0aW1ldCArPSAxOworCQl1cyA9IDA7CisJfQogCXJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHRpbWV0LCB1cywgdHppbmZvKTsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC9leHBhdF9jb25maWcuaCBiL01vZHVsZXMvZXhwYXQvZXhwYXRfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjMTYzOQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvZXhwYXQvZXhwYXRfY29uZmlnLmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIEV4cGF0IGNvbmZpZ3VyYXRpb24gZm9yIHB5dGhvbi4gVGhpcyBmaWxlIGlzIG5vdCBwYXJ0IG9mIHRoZSBleHBhdAorICogZGlzdHJpYnV0aW9uLgorICovCisjaWZuZGVmIEVYUEFUX0NPTkZJR19ICisjZGVmaW5lIEVYUEFUX0NPTkZJR19ICisKKyNpbmNsdWRlIDxweWNvbmZpZy5oPgorI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBCWVRFT1JERVIgNDMyMQorI2Vsc2UKKyNkZWZpbmUgQllURU9SREVSIDEyMzQKKyNlbmRpZgorCisjZGVmaW5lIFhNTF9OUyAxCisjZGVmaW5lIFhNTF9EVEQgMQorI2RlZmluZSBYTUxfQ09OVEVYVF9CWVRFUyAxMDI0CisKKyNlbmRpZiAvKiBFWFBBVF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jIGIvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jCmluZGV4IDMzNzJiYzkuLjQyZDk1YjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1scGFyc2UuYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHBhcnNlLmMKQEAgLTIsMTAgKzIsNiBAQAogICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KICovCiAKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgICAgICAgICAvKiBtZW1zZXQoKSwgbWVtY3B5KCkgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQogI2RlZmluZSBYTUxfQlVJTERJTkdfRVhQQVQgMQogCiAjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKQEAgLTE2LDYgKzEyLDEwIEBACiAjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CiAjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAgICAgICAgICAgICAgICAgLyogbWVtc2V0KCksIG1lbWNweSgpICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKICNpbmNsdWRlICJleHBhdC5oIgogCiAjaWZkZWYgWE1MX1VOSUNPREUKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQveG1scm9sZS5jIGIvTW9kdWxlcy9leHBhdC94bWxyb2xlLmMKaW5kZXggMTkyNGZjYi4uMjU4N2ZkZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC94bWxyb2xlLmMKKysrIGIvTW9kdWxlcy9leHBhdC94bWxyb2xlLmMKQEAgLTIsOCArMiw2IEBACiAgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgogKi8KIAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCiAjaWZkZWYgQ09NUElMRURfRlJPTV9EU1AKICNpbmNsdWRlICJ3aW5jb25maWcuaCIKICNlbGlmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykKQEAgLTE0LDYgKzEyLDggQEAKICNlbmRpZgogI2VuZGlmIC8qIG5kZWYgQ09NUElMRURfRlJPTV9EU1AgKi8KIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCiAjaW5jbHVkZSAiZXhwYXRfZXh0ZXJuYWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInhtbHJvbGUuaCIKZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQveG1sdG9rLmMgYi9Nb2R1bGVzL2V4cGF0L3htbHRvay5jCmluZGV4IDE2MGZhNDAuLjhiOWQ5OTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1sdG9rLmMKKysrIGIvTW9kdWxlcy9leHBhdC94bWx0b2suYwpAQCAtMiw4ICsyLDYgQEAKICAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCiAqLwogCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KICNpZmRlZiBDT01QSUxFRF9GUk9NX0RTUAogI2luY2x1ZGUgIndpbmNvbmZpZy5oIgogI2VsaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQpAQCAtMTQsNiArMTIsOCBAQAogI2VuZGlmCiAjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKICNpbmNsdWRlICJleHBhdF9leHRlcm5hbC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAieG1sdG9rLmgiCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKaW5kZXggYTM2ODQ5NC4uNDc3YWYwNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mY250bG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZmNudGxtb2R1bGUuYwpAQCAtOTUsNiArOTUsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZjbnRsX2lvY3RsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKKyNkZWZpbmUgSU9DVExfQlVGU1ogMTAyNAogCWludCBmZDsKIAkvKiBJbiBQeUFyZ19QYXJzZVR1cGxlIGJlbG93LCB1c2UgdGhlIHVuc2lnbmVkIGludCAnSScgZm9ybWF0IGZvcgogCSAgIHRoZSBzaWduZWQgaW50ICdjb2RlJyB2YXJpYWJsZSwgYmVjYXVzZSBQeXRob24gdHVybnMgMHg4MDAwMDAwCkBAIC0xMDYsNyArMTA3LDcgQEAKIAljaGFyICpzdHI7CiAJUHlfc3NpemVfdCBsZW47CiAJaW50IG11dGF0ZV9hcmcgPSAxOwotCWNoYXIgYnVmWzEwMjRdOworIAljaGFyIGJ1ZltJT0NUTF9CVUZTWisxXTsgIC8qIGFyZ3VtZW50IHBsdXMgTlVMIGJ5dGUgKi8KIAogCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJkl3I3xpOmlvY3RsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAKQEAgLTExNCw4ICsxMTUsOSBAQAogCQljaGFyICphcmc7CiAKIAkgICAgICAgCWlmIChtdXRhdGVfYXJnKSB7Ci0JCQlpZiAobGVuIDw9IHNpemVvZiBidWYpIHsKKwkJCWlmIChsZW4gPD0gSU9DVExfQlVGU1opIHsKIAkJCQltZW1jcHkoYnVmLCBzdHIsIGxlbik7CisJCQkJYnVmW2xlbl0gPSAnXDAnOwogCQkJCWFyZyA9IGJ1ZjsKIAkJCX0gCiAJCQllbHNlIHsKQEAgLTEyMywxMyArMTI1LDE0IEBACiAJCQl9CiAJCX0KIAkJZWxzZSB7Ci0JCQlpZiAobGVuID4gc2l6ZW9mIGJ1ZikgeworCQkJaWYgKGxlbiA+IElPQ1RMX0JVRlNaKSB7CiAJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAJCQkJCSJpb2N0bCBzdHJpbmcgYXJnIHRvbyBsb25nIik7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCQllbHNlIHsKIAkJCQltZW1jcHkoYnVmLCBzdHIsIGxlbik7CisJCQkJYnVmW2xlbl0gPSAnXDAnOwogCQkJCWFyZyA9IGJ1ZjsKIAkJCX0KIAkJfQpAQCAtMTQxLDcgKzE0NCw3IEBACiAJCWVsc2UgewogCQkJcmV0ID0gaW9jdGwoZmQsIGNvZGUsIGFyZyk7CiAJCX0KLQkJaWYgKG11dGF0ZV9hcmcgJiYgKGxlbiA8IHNpemVvZiBidWYpKSB7CisJCWlmIChtdXRhdGVfYXJnICYmIChsZW4gPCBJT0NUTF9CVUZTWikpIHsKIAkJCW1lbWNweShzdHIsIGJ1ZiwgbGVuKTsKIAkJfQogCQlpZiAocmV0IDwgMCkgewpAQCAtMTU5LDEyICsxNjIsMTMgQEAKIAlQeUVycl9DbGVhcigpOwogCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJklzIzppb2N0bCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKLQkJaWYgKGxlbiA+IHNpemVvZiBidWYpIHsKKwkJaWYgKGxlbiA+IElPQ1RMX0JVRlNaKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKIAkJCQkJImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCW1lbWNweShidWYsIHN0ciwgbGVuKTsKKwkJYnVmW2xlbl0gPSAnXDAnOwogCQlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJCXJldCA9IGlvY3RsKGZkLCBjb2RlLCBidWYpOwogCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwpAQCAtMTk1LDYgKzE5OSw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmV0KTsKKyN1bmRlZiBJT0NUTF9CVUZTWgogfQogCiBQeURvY19TVFJWQVIoaW9jdGxfZG9jLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nY21vZHVsZS5jIGIvTW9kdWxlcy9nY21vZHVsZS5jCmluZGV4IDAxNzZkNmYuLjg3MjcyN2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2Ntb2R1bGUuYworKysgYi9Nb2R1bGVzL2djbW9kdWxlLmMKQEAgLTc1LDYgKzc1LDcgQEAKIAkJCQlERUJVR19PQkpFQ1RTIHwgXAogCQkJCURFQlVHX1NBVkVBTEwKIHN0YXRpYyBpbnQgZGVidWc7CitzdGF0aWMgUHlPYmplY3QgKnRtb2QgPSBOVUxMOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBnY19yZWZzIHZhbHVlcy4KQEAgLTYwMiw3ICs2MDMsNyBAQAogCQlhc3NlcnQoY2FsbGJhY2sgIT0gTlVMTCk7CiAKIAkJLyogY29weS1wYXN0ZSBvZiB3ZWFrcmVmb2JqZWN0LmMncyBoYW5kbGVfY2FsbGJhY2soKSAqLwotCQl0ZW1wID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNhbGxiYWNrLCAiTyIsIHdyKTsKKwkJdGVtcCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2FsbGJhY2ssIHdyLCBOVUxMKTsKIAkJaWYgKHRlbXAgPT0gTlVMTCkKIAkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYmFjayk7CiAJCWVsc2UKQEAgLTczNCw3ICs3MzUsNiBAQAogCVB5R0NfSGVhZCB1bnJlYWNoYWJsZTsgLyogbm9uLXByb2JsZW1hdGljIHVucmVhY2hhYmxlIHRyYXNoICovCiAJUHlHQ19IZWFkIGZpbmFsaXplcnM7ICAvKiBvYmplY3RzIHdpdGgsICYgcmVhY2hhYmxlIGZyb20sIF9fZGVsX18gKi8KIAlQeUdDX0hlYWQgKmdjOwotCXN0YXRpYyBQeU9iamVjdCAqdG1vZCA9IE5VTEw7CiAJZG91YmxlIHQxID0gMC4wOwogCiAJaWYgKGRlbHN0ciA9PSBOVUxMKSB7CkBAIC03NDMsMTIgKzc0Myw2IEBACiAJCQlQeV9GYXRhbEVycm9yKCJnYyBjb3VsZG4ndCBhbGxvY2F0ZSBcIl9fZGVsX19cIiIpOwogCX0KIAotCWlmICh0bW9kID09IE5VTEwpIHsKLQkJdG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgidGltZSIpOwotCQlpZiAodG1vZCA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0KIAlpZiAoZGVidWcgJiBERUJVR19TVEFUUykgewogCQlpZiAodG1vZCAhPSBOVUxMKSB7CiAJCQlQeU9iamVjdCAqZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodG1vZCwgInRpbWUiLCBOVUxMKTsKQEAgLTEyMzMsNiArMTIyNywxOSBAQAogCVB5X0lOQ1JFRihnYXJiYWdlKTsKIAlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJnYXJiYWdlIiwgZ2FyYmFnZSkgPCAwKQogCQlyZXR1cm47CisKKwkvKiBJbXBvcnRpbmcgY2FuJ3QgYmUgZG9uZSBpbiBjb2xsZWN0KCkgYmVjYXVzZSBjb2xsZWN0KCkKKwkgKiBjYW4gYmUgY2FsbGVkIHZpYSBQeUdDX0NvbGxlY3QoKSBpbiBQeV9GaW5hbGl6ZSgpLgorCSAqIFRoaXMgd291bGRuJ3QgYmUgYSBwcm9ibGVtLCBleGNlcHQgdGhhdCA8aW5pdGlhbGl6ZWQ+IGlzCisJICogcmVzZXQgdG8gMCBiZWZvcmUgY2FsbGluZyBjb2xsZWN0IHdoaWNoIHRyaXBzIHVwCisJICogdGhlIGltcG9ydCBhbmQgdHJpZ2dlcnMgYW4gYXNzZXJ0aW9uLgorCSAqLworCWlmICh0bW9kID09IE5VTEwpIHsKKwkJdG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgidGltZSIpOworCQlpZiAodG1vZCA9PSBOVUxMKQorCQkJUHlFcnJfQ2xlYXIoKTsKKwl9CisKICNkZWZpbmUgQUREX0lOVChOQU1FKSBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgI05BTUUsIE5BTUUpIDwgMCkgcmV0dXJuCiAJQUREX0lOVChERUJVR19TVEFUUyk7CiAJQUREX0lOVChERUJVR19DT0xMRUNUQUJMRSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dycG1vZHVsZS5jIGIvTW9kdWxlcy9ncnBtb2R1bGUuYwppbmRleCAxMmQzM2RkLi5lNWI5ZjQ3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2dycG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZ3JwbW9kdWxlLmMKQEAgLTg0LDEyICs4NCwxOCBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZ3JwX2dldGdyZ2lkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK2dycF9nZXRncmdpZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnB5b19pZCkKIHsKKyAgICBQeU9iamVjdCAqcHlfaW50X2lkOwogICAgIHVuc2lnbmVkIGludCBnaWQ7CiAgICAgc3RydWN0IGdyb3VwICpwOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpnZXRncmdpZCIsICZnaWQpKQotICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHB5X2ludF9pZCA9IFB5TnVtYmVyX0ludChweW9faWQpOworICAgIGlmICghcHlfaW50X2lkKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICBnaWQgPSBQeUludF9BU19MT05HKHB5X2ludF9pZCk7CisgICAgUHlfREVDUkVGKHB5X2ludF9pZCk7CisKICAgICBpZiAoKHAgPSBnZXRncmdpZChnaWQpKSA9PSBOVUxMKSB7CiAJUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiZ2V0Z3JnaWQoKTogZ2lkIG5vdCBmb3VuZDogJWQiLCBnaWQpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTk4LDI3ICsxMDQsMzMgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWdycF9nZXRncm5hbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCitncnBfZ2V0Z3JuYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpweW9fbmFtZSkKIHsKKyAgICBQeU9iamVjdCAqcHlfc3RyX25hbWU7CiAgICAgY2hhciAqbmFtZTsKICAgICBzdHJ1Y3QgZ3JvdXAgKnA7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGdybmFtIiwgJm5hbWUpKQotICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHB5X3N0cl9uYW1lID0gUHlPYmplY3RfU3RyKHB5b19uYW1lKTsKKyAgICBpZiAoIXB5X3N0cl9uYW1lKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKHB5X3N0cl9uYW1lKTsKKyAgICAKICAgICBpZiAoKHAgPSBnZXRncm5hbShuYW1lKSkgPT0gTlVMTCkgewogCVB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgImdldGdybmFtKCk6IG5hbWUgbm90IGZvdW5kOiAlcyIsIG5hbWUpOworCVB5X0RFQ1JFRihweV9zdHJfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKworICAgIFB5X0RFQ1JFRihweV9zdHJfbmFtZSk7CiAgICAgcmV0dXJuIG1rZ3JlbnQocCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ncnBfZ2V0Z3JhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorZ3JwX2dldGdyYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaWdub3JlKQogewogICAgIFB5T2JqZWN0ICpkOwogICAgIHN0cnVjdCBncm91cCAqcDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldGdyYWxsIikpCi0gICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmICgoZCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHNldGdyZW50KCk7CkBAIC0xMzYsMTUgKzE0OCwxNSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZ3JwX21ldGhvZHNbXSA9IHsKLSAgICB7ImdldGdyZ2lkIiwJZ3JwX2dldGdyZ2lkLAlNRVRIX1ZBUkFSR1MsCisgICAgeyJnZXRncmdpZCIsCWdycF9nZXRncmdpZCwJTUVUSF9PLAogICAgICAiZ2V0Z3JnaWQoaWQpIC0+IHR1cGxlXG5cCiBSZXR1cm4gdGhlIGdyb3VwIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gbnVtZXJpYyBncm91cCBJRC4gIElmXG5cCiBpZCBpcyBub3QgdmFsaWQsIHJhaXNlIEtleUVycm9yLiJ9LAotICAgIHsiZ2V0Z3JuYW0iLAlncnBfZ2V0Z3JuYW0sCU1FVEhfVkFSQVJHUywKKyAgICB7ImdldGdybmFtIiwJZ3JwX2dldGdybmFtLAlNRVRIX08sCiAgICAgICJnZXRncm5hbShuYW1lKSAtPiB0dXBsZVxuXAogUmV0dXJuIHRoZSBncm91cCBkYXRhYmFzZSBlbnRyeSBmb3IgdGhlIGdpdmVuIGdyb3VwIG5hbWUuICBJZlxuXAogbmFtZSBpcyBub3QgdmFsaWQsIHJhaXNlIEtleUVycm9yLiJ9LAotICAgIHsiZ2V0Z3JhbGwiLAlncnBfZ2V0Z3JhbGwsCU1FVEhfVkFSQVJHUywKKyAgICB7ImdldGdyYWxsIiwJZ3JwX2dldGdyYWxsLAlNRVRIX05PQVJHUywKICAgICAgImdldGdyYWxsKCkgLT4gbGlzdCBvZiB0dXBsZXNcblwKIFJldHVybiBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBncm91cCBlbnRyaWVzLCBpbiBhcmJpdHJhcnkgb3JkZXIuIn0sCiAgICAge05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCmluZGV4IDk0NjE3YTkuLjg2YjFiYmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwpAQCAtMTA5MywxMCArMTA5MywxMCBAQAogdHlwZWRlZiBzdHJ1Y3QgewogCVB5T2JqZWN0X0hFQUQKIAlQeU9iamVjdCAqaXQ7Ci0JbG9uZwluZXh0OwotCWxvbmcJc3RvcDsKLQlsb25nCXN0ZXA7Ci0JbG9uZwljbnQ7CisJUHlfc3NpemVfdCBuZXh0OworCVB5X3NzaXplX3Qgc3RvcDsKKwlQeV9zc2l6ZV90IHN0ZXA7CisJUHlfc3NpemVfdCBjbnQ7CiB9IGlzbGljZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpc2xpY2VfdHlwZTsKQEAgLTExMDUsNyArMTEwNSw3IEBACiBpc2xpY2VfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogCVB5T2JqZWN0ICpzZXE7Ci0JbG9uZyBzdGFydD0wLCBzdG9wPS0xLCBzdGVwPTE7CisJUHlfc3NpemVfdCBzdGFydD0wLCBzdG9wPS0xLCBzdGVwPTE7CiAJUHlPYmplY3QgKml0LCAqYTE9TlVMTCwgKmEyPU5VTEwsICphMz1OVUxMOwogCVB5X3NzaXplX3QgbnVtYXJnczsKIAlpc2xpY2VvYmplY3QgKmx6OwpAQCAtMTExOSw3ICsxMTE5LDcgQEAKIAludW1hcmdzID0gUHlUdXBsZV9TaXplKGFyZ3MpOwogCWlmIChudW1hcmdzID09IDIpIHsKIAkJaWYgKGExICE9IFB5X05vbmUpIHsKLQkJCXN0b3AgPSBQeUludF9Bc0xvbmcoYTEpOworCQkJc3RvcCA9IFB5SW50X0FzU3NpemVfdChhMSk7CiAJCQlpZiAoc3RvcCA9PSAtMSkgewogCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQogCQkJCQlQeUVycl9DbGVhcigpOwpAQCAtMTEzMCwxMSArMTEzMCwxMSBAQAogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGExICE9IFB5X05vbmUpCi0JCQlzdGFydCA9IFB5SW50X0FzTG9uZyhhMSk7CisJCQlzdGFydCA9IFB5SW50X0FzU3NpemVfdChhMSk7CiAJCWlmIChzdGFydCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogCQkJUHlFcnJfQ2xlYXIoKTsKIAkJaWYgKGEyICE9IFB5X05vbmUpIHsKLQkJCXN0b3AgPSBQeUludF9Bc0xvbmcoYTIpOworCQkJc3RvcCA9IFB5SW50X0FzU3NpemVfdChhMik7CiAJCQlpZiAoc3RvcCA9PSAtMSkgewogCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQogCQkJCQlQeUVycl9DbGVhcigpOwpAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAogCWlmIChhMyAhPSBOVUxMKSB7CiAJCWlmIChhMyAhPSBQeV9Ob25lKQotCQkJc3RlcCA9IFB5SW50X0FzTG9uZyhhMyk7CisJCQlzdGVwID0gUHlJbnRfQXNTc2l6ZV90KGEzKTsKIAkJaWYgKHN0ZXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKIAkJCVB5RXJyX0NsZWFyKCk7CiAJfQpAQCAtMTIwMiw3ICsxMjAyLDcgQEAKIHsKIAlQeU9iamVjdCAqaXRlbTsKIAlQeU9iamVjdCAqaXQgPSBsei0+aXQ7Ci0JbG9uZyBvbGRuZXh0OworCVB5X3NzaXplX3Qgb2xkbmV4dDsKIAlQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAKIAlhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7CkBAIC0xNjAwLDggKzE2MDAsOCBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QJdHVwbGVzaXplOwotCWxvbmcJaXRlcm51bTsJCS8qIHdoaWNoIGl0ZXJhdG9yIGlzIGFjdGl2ZSAqLworCVB5X3NzaXplX3QgdHVwbGVzaXplOworCVB5X3NzaXplX3QgaXRlcm51bTsJCS8qIHdoaWNoIGl0ZXJhdG9yIGlzIGFjdGl2ZSAqLwogCVB5T2JqZWN0ICppdHR1cGxlOwkJLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCiB9IGNoYWlub2JqZWN0OwogCkBAIC0xNjEyLDcgKzE2MTIsNyBAQAogewogCWNoYWlub2JqZWN0ICpsejsKIAlQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpOwotCWludCBpOworCVB5X3NzaXplX3QgaTsKIAlQeU9iamVjdCAqaXR0dXBsZTsKIAogCWlmICghX1B5QXJnX05vS2V5d29yZHMoImNoYWluKCkiLCBrd2RzKSkKQEAgLTE2MjEsNyArMTYyMSw3IEBACiAJLyogb2J0YWluIGl0ZXJhdG9ycyAqLwogCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKIAlpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZihpdHR1cGxlID09IE5VTEwpCisJaWYgKGl0dHVwbGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgewogCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CkBAIC0xNjI5LDcgKzE2MjksNyBAQAogCQlpZiAoaXQgPT0gTlVMTCkgewogCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKIAkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiY2hhaW4gYXJndW1lbnQgIyVkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAorCQkJCSAgICAiY2hhaW4gYXJndW1lbnQgIyV6ZCBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIiwKIAkJCQkgICAgaSsxKTsKIAkJCVB5X0RFQ1JFRihpdHR1cGxlKTsKIAkJCXJldHVybiBOVUxMOwpAQCAtMjAzMyw3ICsyMDMzLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogCVB5T2JqZWN0X0hFQUQKLQlsb25nCWNudDsKKwlQeV9zc2l6ZV90IGNudDsKIH0gY291bnRvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY291bnRfdHlwZTsKQEAgLTIwNDIsMTIgKzIwNDIsMTIgQEAKIGNvdW50X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKIAljb3VudG9iamVjdCAqbHo7Ci0JbG9uZyBjbnQgPSAwOworCVB5X3NzaXplX3QgY250ID0gMDsKIAogCWlmICghX1B5QXJnX05vS2V5d29yZHMoImNvdW50KCkiLCBrd2RzKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxsOmNvdW50IiwgJmNudCkpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpjb3VudCIsICZjbnQpKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIGNyZWF0ZSBjb3VudG9iamVjdCBzdHJ1Y3R1cmUgKi8KQEAgLTIwNjIsMTMgKzIwNjIsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9uZXh0KGNvdW50b2JqZWN0ICpseikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobHotPmNudCsrKTsKKwlyZXR1cm4gUHlJbnRfRnJvbVNpemVfdChsei0+Y250KyspOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY291bnRfcmVwcihjb3VudG9iamVjdCAqbHopCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoImNvdW50KCVsZCkiLCBsei0+Y250KTsKKwlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiY291bnQoJXpkKSIsIGx6LT5jbnQpOwogfQogCiBQeURvY19TVFJWQVIoY291bnRfZG9jLApAQCAtMjEzOCw3ICsyMTM4LDcgQEAKIGl6aXBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogCWl6aXBvYmplY3QgKmx6OwotCWludCBpOworCVB5X3NzaXplX3QgaTsKIAlQeU9iamVjdCAqaXR0dXBsZTsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLwogCVB5T2JqZWN0ICpyZXN1bHQ7CiAJUHlfc3NpemVfdCB0dXBsZXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKQEAgLTIxNTEsNyArMjE1MSw3IEBACiAKIAkvKiBvYnRhaW4gaXRlcmF0b3JzICovCiAJaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7Ci0JaWYoaXR0dXBsZSA9PSBOVUxMKQorCWlmIChpdHR1cGxlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCWZvciAoaT0wOyBpIDwgdHVwbGVzaXplOyArK2kpIHsKIAkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwpAQCAtMjE1OSw3ICsyMTU5LDcgQEAKIAkJaWYgKGl0ID09IE5VTEwpIHsKIAkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCiAJCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIml6aXAgYXJndW1lbnQgIyVkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAorCQkJCSAgICAiaXppcCBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAogCQkJCSAgICBpKzEpOwogCQkJUHlfREVDUkVGKGl0dHVwbGUpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC0yMjEyLDcgKzIyMTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGl6aXBfbmV4dChpemlwb2JqZWN0ICpseikKIHsKLQlpbnQgaTsKKwlQeV9zc2l6ZV90IGk7CiAJUHlfc3NpemVfdCB0dXBsZXNpemUgPSBsei0+dHVwbGVzaXplOwogCVB5T2JqZWN0ICpyZXN1bHQgPSBsei0+cmVzdWx0OwogCVB5T2JqZWN0ICppdDsKQEAgLTIzMTQsNyArMjMxNCw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAogCVB5T2JqZWN0ICplbGVtZW50OwotCWxvbmcgY250OworCVB5X3NzaXplX3QgY250OwogfSByZXBlYXRvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcmVwZWF0X3R5cGU7CkBAIC0yMzI0LDEyICsyMzI0LDEyIEBACiB7CiAJcmVwZWF0b2JqZWN0ICpybzsKIAlQeU9iamVjdCAqZWxlbWVudDsKLQlsb25nIGNudCA9IC0xOworCVB5X3NzaXplX3QgY250ID0gLTE7CiAKIAlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJyZXBlYXQoKSIsIGt3ZHMpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xsOnJlcGVhdCIsICZlbGVtZW50LCAmY250KSkKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98bjpyZXBlYXQiLCAmZWxlbWVudCwgJmNudCkpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAyICYmIGNudCA8IDApCkBAIC0yMzgzLDcgKzIzODMsNyBAQAogCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJyZXBlYXQoJXMpIiwKIAkJCVB5U3RyaW5nX0FTX1NUUklORyhvYmpyZXByKSk7CiAJZWxzZQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJyZXBlYXQoJXMsICVsZCkiLAorCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJyZXBlYXQoJXMsICV6ZCkiLAogCQkJUHlTdHJpbmdfQVNfU1RSSU5HKG9ianJlcHIpLCByby0+Y250KTsKIAlQeV9ERUNSRUYob2JqcmVwcik7CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTIzOTYsNyArMjM5Niw3IEBACiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxlbigpIG9mIHVuc2l6ZWQgb2JqZWN0Iik7CiAJCXJldHVybiBOVUxMOwogCX0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJvLT5jbnQpOworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNpemVfdChyby0+Y250KTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYWluLmMgYi9Nb2R1bGVzL21haW4uYwppbmRleCA3MzI2YTI3Li4yM2E3NjBmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21haW4uYworKysgYi9Nb2R1bGVzL21haW4uYwpAQCAtOSw4ICs5LDEwIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorI2lmZGVmIEhBVkVfRkNOVExfSAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgKGRlZmluZWQoUFlPU19PUzIpICYmICFkZWZpbmVkKFBZQ0NfR0NDKSkgfHwgZGVmaW5lZChNU19XSU5ET1dTKQogI2RlZmluZSBQWVRIT05IT01FSEVMUCAiPHByZWZpeD5cXGxpYiIKZGlmZiAtLWdpdCBhL01vZHVsZXMvb3BlcmF0b3IuYyBiL01vZHVsZXMvb3BlcmF0b3IuYwppbmRleCBjYmNlMTZlLi5iZjNkZWY0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL29wZXJhdG9yLmMKKysrIGIvTW9kdWxlcy9vcGVyYXRvci5jCkBAIC00OCw2ICs0OCwxMiBAQAogICBpZigtMSA9PSAocj1BT1AoYTEsYTIpKSkgcmV0dXJuIE5VTEw7IFwKICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHIpOyB9CiAKKyNkZWZpbmUgc3BhbW4yKE9QLEFPUCkgc3RhdGljIFB5T2JqZWN0ICpPUChQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpIHsgXAorICBQeU9iamVjdCAqYTEsICphMjsgUHlfc3NpemVfdCByOyBcCisgIGlmKCEgUHlBcmdfVW5wYWNrVHVwbGUoYSwjT1AsMiwyLCZhMSwmYTIpKSByZXR1cm4gTlVMTDsgXAorICBpZigtMSA9PSAocj1BT1AoYTEsYTIpKSkgcmV0dXJuIE5VTEw7IFwKKyAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHIpOyB9CisKICNkZWZpbmUgc3BhbWkyYihPUCxBT1ApIHN0YXRpYyBQeU9iamVjdCAqT1AoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKSB7IFwKICAgUHlPYmplY3QgKmExLCAqYTI7IGxvbmcgcjsgXAogICBpZighIFB5QXJnX1VucGFja1R1cGxlKGEsI09QLDIsMiwmYTEsJmEyKSkgcmV0dXJuIE5VTEw7IFwKQEAgLTk3LDggKzEwMyw4IEBACiBzcGFtb2kob3BfaXJlcGVhdCAgICAgICwgUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0KQogc3BhbWkyYihvcF9jb250YWlucyAgICAgLCBQeVNlcXVlbmNlX0NvbnRhaW5zKQogc3BhbWkyYihzZXF1ZW5jZUluY2x1ZGVzLCBQeVNlcXVlbmNlX0NvbnRhaW5zKQotc3BhbWkyKGluZGV4T2YgICAgICAgICAsIFB5U2VxdWVuY2VfSW5kZXgpCi1zcGFtaTIoY291bnRPZiAgICAgICAgICwgUHlTZXF1ZW5jZV9Db3VudCkKK3NwYW1uMihpbmRleE9mICAgICAgICAgLCBQeVNlcXVlbmNlX0luZGV4KQorc3BhbW4yKGNvdW50T2YgICAgICAgICAsIFB5U2VxdWVuY2VfQ291bnQpCiBzcGFtaShpc01hcHBpbmdUeXBlICAgICwgUHlNYXBwaW5nX0NoZWNrKQogc3BhbTIob3BfZ2V0aXRlbSAgICAgICAsIFB5T2JqZWN0X0dldEl0ZW0pCiBzcGFtMm4ob3BfZGVsaXRlbSAgICAgICAsIFB5T2JqZWN0X0RlbEl0ZW0pCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwppbmRleCBjOWVkYWU2Li5lMzMxOTdlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCisrKyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKQEAgLTMyNjcsOCArMzI2Nyw4IEBACiAgICAgICAgICAgICAmJiAocGlja2xlciAhPSBOVUxMKSkgewogICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKIAotICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICJPT08iLCAmUHlTVF9UeXBlLCBwaWNrbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZV9jb25zdHJ1Y3Rvcik7CisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmMsICZQeVNUX1R5cGUsIHBpY2tsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZV9jb25zdHJ1Y3RvciwgTlVMTCk7CiAgICAgICAgICAgICBQeV9YREVDUkVGKHJlcyk7CiAgICAgICAgIH0KICAgICAgICAgUHlfWERFQ1JFRihmdW5jKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwppbmRleCBiNTFiYTVkLi43ZjBhMjYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCkBAIC0xMyw2ICsxMywxOCBAQAogCiAvKiBTZWUgYWxzbyAuLi9Eb3MvZG9zbW9kdWxlLmMgKi8KIAorI2lmZGVmIF9fQVBQTEVfXworICAgLyoKKyAgICAqIFN0ZXAgMSBvZiBzdXBwb3J0IGZvciB3ZWFrLWxpbmtpbmcgYSBudW1iZXIgb2Ygc3ltYm9scyBleGlzdGluZyBvbiAKKyAgICAqIE9TWCAxMC40IGFuZCBsYXRlciwgc2VlIHRoZSBjb21tZW50IGluIHRoZSAjaWZkZWYgX19BUFBMRV9fIGJsb2NrCisgICAgKiBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAqLworIyAgcHJhZ21hIHdlYWsgbGNob3duCisjICBwcmFnbWEgd2VhayBzdGF0dmZzCisjICBwcmFnbWEgd2VhayBmc3RhdHZmcworCisjZW5kaWYgLyogX19BUFBMRV9fICovCisKICNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCkBAIC0yNTAsNyArMjYyLDExIEBACiAjZW5kaWYgLyogT1MyICovCiAKICNpZm5kZWYgTUFYUEFUSExFTgorI2lmIGRlZmluZWQoUEFUSF9NQVgpICYmIFBBVEhfTUFYID4gMTAyNAorI2RlZmluZSBNQVhQQVRITEVOIFBBVEhfTUFYCisjZWxzZQogI2RlZmluZSBNQVhQQVRITEVOIDEwMjQKKyNlbmRpZgogI2VuZGlmIC8qIE1BWFBBVEhMRU4gKi8KIAogI2lmZGVmIFVOSU9OX1dBSVQKQEAgLTQ0MiwyMSArNDU4LDI5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqX1B5VW5pY29kZV9Gcm9tRmlsZVN5c3RlbUVuY29kZWRPYmplY3QocmVnaXN0ZXIgUHlPYmplY3QgKm9iaikKIHsKLQkvKiBYWFggUGVyaGFwcyB3ZSBzaG91bGQgbWFrZSB0aGlzIEFQSSBhbiBhbGlhcyBvZgotCSAgIFB5T2JqZWN0X1VuaWNvZGUoKSBpbnN0ZWFkID8hICovCi0JaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KG9iaikpIHsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXJldHVybiBvYmo7Ci0JfQotCWlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworfQorCisvKiBGdW5jdGlvbiBzdWl0YWJsZSBmb3IgTyYgY29udmVyc2lvbiAqLworc3RhdGljIGludAorY29udmVydF90b191bmljb2RlKFB5T2JqZWN0ICphcmcsIHZvaWQqIF9wYXJhbSkKK3sKKwlQeU9iamVjdCAqKnBhcmFtID0gKFB5T2JqZWN0KiopX3BhcmFtOworCWlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChhcmcpKSB7CisJCVB5X0lOQ1JFRihhcmcpOworCQkqcGFyYW0gPSBhcmc7CisJfSAKKwllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewogCQkvKiBGb3IgYSBVbmljb2RlIHN1YnR5cGUgdGhhdCdzIG5vdCBhIFVuaWNvZGUgb2JqZWN0LAogCQkgICByZXR1cm4gYSB0cnVlIFVuaWNvZGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgZGF0YS4gKi8KLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKG9iaiksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKSk7CisJCSpwYXJhbSA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpLAorCQkJCQkgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKGFyZykpOworCQlyZXR1cm4gKnBhcmFtICE9IE5VTEw7CiAJfQotCXJldHVybiBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Qob2JqLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpY3QiKTsKKwllbHNlCisJCSpwYXJhbSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChhcmcsCisJCQkJICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKKwkJCQkJICAgICAgICAgICAgICJzdHJpY3QiKTsKKwlyZXR1cm4gKCpwYXJhbSkgIT0gTlVMTDsKIH0KIAogI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwpAQCAtNTczLDM1ICs1OTcsMTAgQEAKICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgotcG9zaXhfMXN0cihQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCBpbnQgKCpmdW5jKShjb25zdCBjaGFyKiksCi0JICAgY2hhciAqd2Zvcm1hdCwgaW50ICgqd2Z1bmMpKGNvbnN0IFB5X1VOSUNPREUqKSkKK3Bvc2l4XzFzdHIoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKmZvcm1hdCwgaW50ICgqZnVuYykoY29uc3QgY2hhciopKQogewogCWNoYXIgKnBhdGgxID0gTlVMTDsKIAlpbnQgcmVzOwotI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwotCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgewotCQlQeVVuaWNvZGVPYmplY3QgKnBvOwotCQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCB3Zm9ybWF0LCAmcG8pKSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkvKiAgUHlVbmljb2RlX0FTX1VOSUNPREUgT0sgd2l0aG91dCB0aHJlYWQKLQkJCSAgICBsb2NrIGFzIGl0IGlzIGEgc2ltcGxlIGRlcmVmZXJlbmNlLiAqLwotCQkJcmVzID0gKCp3ZnVuYykoUHlVbmljb2RlX0FTX1VOSUNPREUocG8pKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQlpZiAocmVzIDwgMCkKLQkJCQlyZXR1cm4gcG9zaXhfZXJyb3Jfd2l0aF91bmljb2RlX2ZpbGVuYW1lKFB5VW5pY29kZV9BU19VTklDT0RFKHBvKSk7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfQotCQkvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdwotCQkgICBzdHJpbmdzIGFyZSBhbHNvIHZhbGlkLiAqLwotCQlQeUVycl9DbGVhcigpOwotCX0KLSNlbHNlCi0JLyogUGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBVbmljb2RlIGZpbGVuYW1lcwotCSAgIHNob3VsZG4ndCBiZSBwYXNzaW5nIHRoZXNlIGV4dHJhIHBhcmFtcyAqLwotCWFzc2VydCh3Zm9ybWF0PT1OVUxMICYmIHdmdW5jID09IE5VTEwpOwotI2VuZGlmCi0KIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgZm9ybWF0LAogCSAgICAgICAgICAgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aDEpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTYxOCw1MiArNjE3LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfMnN0cihQeU9iamVjdCAqYXJncywKIAkgICBjaGFyICpmb3JtYXQsCi0JICAgaW50ICgqZnVuYykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopLAotCSAgIGNoYXIgKndmb3JtYXQsCi0JICAgaW50ICgqd2Z1bmMpKGNvbnN0IFB5X1VOSUNPREUgKiwgY29uc3QgUHlfVU5JQ09ERSAqKSkKKwkgICBpbnQgKCpmdW5jKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpCiB7CiAJY2hhciAqcGF0aDEgPSBOVUxMLCAqcGF0aDIgPSBOVUxMOwogCWludCByZXM7Ci0jaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCi0JaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7Ci0JCVB5T2JqZWN0ICpwbzE7Ci0JCVB5T2JqZWN0ICpwbzI7Ci0JCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIHdmb3JtYXQsICZwbzEsICZwbzIpKSB7Ci0JCQlpZiAoUHlVbmljb2RlX0NoZWNrKHBvMSkgfHwgUHlVbmljb2RlX0NoZWNrKHBvMikpIHsKLQkJCQlQeU9iamVjdCAqd3BhdGgxOwotCQkJCVB5T2JqZWN0ICp3cGF0aDI7Ci0JCQkJd3BhdGgxID0gX1B5VW5pY29kZV9Gcm9tRmlsZVN5c3RlbUVuY29kZWRPYmplY3QocG8xKTsKLQkJCQl3cGF0aDIgPSBfUHlVbmljb2RlX0Zyb21GaWxlU3lzdGVtRW5jb2RlZE9iamVjdChwbzIpOwotCQkJCWlmICghd3BhdGgxIHx8ICF3cGF0aDIpIHsKLQkJCQkJUHlfWERFQ1JFRih3cGF0aDEpOwotCQkJCQlQeV9YREVDUkVGKHdwYXRoMik7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJLyogUHlVbmljb2RlX0FTX1VOSUNPREUgT0sgd2l0aG91dCB0aHJlYWQKLQkJCQkgICBsb2NrIGFzIGl0IGlzIGEgc2ltcGxlIGRlcmVmZXJlbmNlLiAgKi8KLQkJCQlyZXMgPSAoKndmdW5jKShQeVVuaWNvZGVfQVNfVU5JQ09ERSh3cGF0aDEpLAotCQkJCQkgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUod3BhdGgyKSk7Ci0JCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCQlQeV9YREVDUkVGKHdwYXRoMSk7Ci0JCQkJUHlfWERFQ1JFRih3cGF0aDIpOwotCQkJCWlmIChyZXMgIT0gMCkKLQkJCQkJcmV0dXJuIHBvc2l4X2Vycm9yKCk7Ci0JCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJCXJldHVybiBQeV9Ob25lOwotCQkJfQotCQkJLyogRWxzZSBmbG93IHRocm91Z2ggYXMgbmVpdGhlciBpcyBVbmljb2RlLiAqLwotCQl9Ci0JCS8qIERyb3AgdGhlIGFyZ3VtZW50IHBhcnNpbmcgZXJyb3IgYXMgbmFycm93Ci0JCSAgIHN0cmluZ3MgYXJlIGFsc28gdmFsaWQuICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotI2Vsc2UKLQkvKiBQbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IFVuaWNvZGUgZmlsZW5hbWVzCi0JICAgc2hvdWxkbid0IGJlIHBhc3NpbmcgdGhlc2UgZXh0cmEgcGFyYW1zICovCi0JYXNzZXJ0KHdmb3JtYXQ9PU5VTEwgJiYgd2Z1bmMgPT0gTlVMTCk7Ci0jZW5kaWYKLQogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBmb3JtYXQsCiAJICAgICAgICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoMSwKIAkgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgJnBhdGgyKSkKQEAgLTY4MCw2ICs2MzcsMTAxIEBACiAJcmV0dXJuIFB5X05vbmU7CiB9CiAKKyNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKK3N0YXRpYyBQeU9iamVjdCoKK3dpbjMyXzFzdHIoUHlPYmplY3QqIGFyZ3MsIGNoYXIqIGZ1bmMsIAorCSAgIGNoYXIqIGZvcm1hdCwgQk9PTCAoX19zdGRjYWxsICpmdW5jQSkoTFBDU1RSKSwgCisJICAgY2hhciogd2Zvcm1hdCwgQk9PTCAoX19zdGRjYWxsICpmdW5jVykoTFBXU1RSKSkKK3sKKwlQeU9iamVjdCAqdW5pOworCWNoYXIgKmFuc2k7CisJQk9PTCByZXN1bHQ7CisJaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7CisJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCB3Zm9ybWF0LCAmdW5pKSkKKwkJCVB5RXJyX0NsZWFyKCk7CisJCWVsc2UgeworCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCQkJcmVzdWx0ID0gZnVuY1coUHlVbmljb2RlX0FzVW5pY29kZSh1bmkpKTsKKwkJCVB5X0VORF9BTExPV19USFJFQURTCisJCQlpZiAoIXJlc3VsdCkKKwkJCQlyZXR1cm4gd2luMzJfZXJyb3JfdW5pY29kZShmdW5jLCBQeVVuaWNvZGVfQXNVbmljb2RlKHVuaSkpOworCQkJUHlfSU5DUkVGKFB5X05vbmUpOworCQkJcmV0dXJuIFB5X05vbmU7CisJCX0KKwl9CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIGZvcm1hdCwgJmFuc2kpKQorCQlyZXR1cm4gTlVMTDsKKwlQeV9CRUdJTl9BTExPV19USFJFQURTCisJcmVzdWx0ID0gZnVuY0EoYW5zaSk7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIHdpbjMyX2Vycm9yKGZ1bmMsIGFuc2kpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlyZXR1cm4gUHlfTm9uZTsKKworfQorCisvKiBUaGlzIGlzIGEgcmVpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQyBsaWJyYXJ5J3MgY2hkaXIgZnVuY3Rpb24sCisgICBidXQgb25lIHRoYXQgcHJvZHVjZXMgV2luMzIgZXJyb3JzIGluc3RlYWQgb2YgRE9TIGVycm9yIGNvZGVzLgorICAgY2hkaXIgaXMgZXNzZW50aWFsbHkgYSB3cmFwcGVyIGFyb3VuZCBTZXRDdXJyZW50RGlyZWN0b3J5OyBob3dldmVyLAorICAgaXQgYWxzbyBuZWVkcyB0byBzZXQgIm1hZ2ljIiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW5kaWNhdGluZworICAgdGhlIHBlci1kcml2ZSBjdXJyZW50IGRpcmVjdG9yeSwgd2hpY2ggYXJlIG9mIHRoZSBmb3JtID08ZHJpdmU+OiAqLworQk9PTCBfX3N0ZGNhbGwKK3dpbjMyX2NoZGlyKExQQ1NUUiBwYXRoKQoreworCWNoYXIgbmV3X3BhdGhbTUFYX1BBVEgrMV07CisJaW50IHJlc3VsdDsKKwljaGFyIGVudls0XSA9ICI9eDoiOworCisJaWYoIVNldEN1cnJlbnREaXJlY3RvcnlBKHBhdGgpKQorCQlyZXR1cm4gRkFMU0U7CisJcmVzdWx0ID0gR2V0Q3VycmVudERpcmVjdG9yeUEoTUFYX1BBVEgrMSwgbmV3X3BhdGgpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gRkFMU0U7CisJLyogSW4gdGhlIEFOU0kgQVBJLCB0aGVyZSBzaG91bGQgbm90IGJlIGFueSBwYXRocyBsb25nZXIKKwkgICB0aGFuIE1BWF9QQVRILiAqLworCWFzc2VydChyZXN1bHQgPD0gTUFYX1BBVEgrMSk7CisJaWYgKHN0cm5jbXAobmV3X3BhdGgsICJcXFxcIiwgMikgPT0gMCB8fAorCSAgICBzdHJuY21wKG5ld19wYXRoLCAiLy8iLCAyKSA9PSAwKQorCSAgICAvKiBVTkMgcGF0aCwgbm90aGluZyB0byBkby4gKi8KKwkgICAgcmV0dXJuIFRSVUU7CisJZW52WzFdID0gbmV3X3BhdGhbMF07CisJcmV0dXJuIFNldEVudmlyb25tZW50VmFyaWFibGVBKGVudiwgbmV3X3BhdGgpOworfQorCisvKiBUaGUgVW5pY29kZSB2ZXJzaW9uIGRpZmZlcnMgZnJvbSB0aGUgQU5TSSB2ZXJzaW9uCisgICBzaW5jZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgbWlnaHQgZXhjZWVkIE1BWF9QQVRIIGNoYXJhY3RlcnMgKi8KK0JPT0wgX19zdGRjYWxsCit3aW4zMl93Y2hkaXIoTFBDV1NUUiBwYXRoKQoreworCXdjaGFyX3QgX25ld19wYXRoW01BWF9QQVRIKzFdLCAqbmV3X3BhdGggPSBfbmV3X3BhdGg7CisJaW50IHJlc3VsdDsKKwl3Y2hhcl90IGVudls0XSA9IEwiPXg6IjsKKworCWlmKCFTZXRDdXJyZW50RGlyZWN0b3J5VyhwYXRoKSkKKwkJcmV0dXJuIEZBTFNFOworCXJlc3VsdCA9IEdldEN1cnJlbnREaXJlY3RvcnlXKE1BWF9QQVRIKzEsIG5ld19wYXRoKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIEZBTFNFOworCWlmIChyZXN1bHQgPiBNQVhfUEFUSCsxKSB7CisJCW5ld19wYXRoID0gbWFsbG9jKHJlc3VsdCk7CisJCWlmICghbmV3X3BhdGgpIHsKKwkJCVNldExhc3RFcnJvcihFUlJPUl9PVVRPRk1FTU9SWSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJaWYgKHdjc25jbXAobmV3X3BhdGgsIEwiXFxcXCIsIDIpID09IDAgfHwKKwkgICAgd2NzbmNtcChuZXdfcGF0aCwgTCIvLyIsIDIpID09IDApCisJICAgIC8qIFVOQyBwYXRoLCBub3RoaW5nIHRvIGRvLiAqLworCSAgICByZXR1cm4gVFJVRTsKKwllbnZbMV0gPSBuZXdfcGF0aFswXTsKKwlyZXN1bHQgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlVyhlbnYsIG5ld19wYXRoKTsKKwlpZiAobmV3X3BhdGggIT0gX25ld19wYXRoKQorCQlmcmVlKG5ld19wYXRoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKICNpZmRlZiBNU19XSU5ET1dTCiAvKiBUaGUgQ1JUIG9mIFdpbmRvd3MgaGFzIGEgbnVtYmVyIG9mIGZsYXdzIHdydC4gaXRzIHN0YXQoKSBpbXBsZW1lbnRhdGlvbjoKICAgIC0gdGltZSBzdGFtcHMgYXJlIHJlc3RyaWN0ZWQgdG8gc2Vjb25kIHJlc29sdXRpb24KQEAgLTcxMSwxMyArNzYzLDI2IEBACiBzdGF0aWMgdm9pZAogRklMRV9USU1FX3RvX3RpbWVfdF9uc2VjKEZJTEVUSU1FICppbl9wdHIsIGludCAqdGltZV9vdXQsIGludCogbnNlY19vdXQpCiB7Ci0JLyogWFhYIGVuZGlhbm5lc3MgKi8KLQlfX2ludDY0IGluID0gKihfX2ludDY0Kilpbl9wdHI7CisJLyogWFhYIGVuZGlhbm5lc3MuIFNob3VsZG4ndCBtYXR0ZXIsIGFzIGFsbCBXaW5kb3dzIGltcGxlbWVudGF0aW9ucyBhcmUgbGl0dGxlLWVuZGlhbiAqLworCS8qIENhbm5vdCBzaW1wbHkgY2FzdCBhbmQgZGVyZWZlcmVuY2UgaW5fcHRyLCAKKwkgICBzaW5jZSBpdCBtaWdodCBub3QgYmUgYWxpZ25lZCBwcm9wZXJseSAqLworCV9faW50NjQgaW47CisJbWVtY3B5KCZpbiwgaW5fcHRyLCBzaXplb2YoaW4pKTsKIAkqbnNlY19vdXQgPSAoaW50KShpbiAlIDEwMDAwMDAwKSAqIDEwMDsgLyogRklMRVRJTUUgaXMgaW4gdW5pdHMgb2YgMTAwIG5zZWMuICovCiAJLyogWFhYIFdpbjMyIHN1cHBvcnRzIHRpbWUgc3RhbXBzIHBhc3QgMjAzODsgd2UgY3VycmVudGx5IGRvbid0ICovCiAJKnRpbWVfb3V0ID0gUHlfU0FGRV9ET1dOQ0FTVCgoaW4gLyAxMDAwMDAwMCkgLSBzZWNzX2JldHdlZW5fZXBvY2hzLCBfX2ludDY0LCBpbnQpOwogfQogCitzdGF0aWMgdm9pZAordGltZV90X3RvX0ZJTEVfVElNRShpbnQgdGltZV9pbiwgaW50IG5zZWNfaW4sIEZJTEVUSU1FICpvdXRfcHRyKQoreworCS8qIFhYWCBlbmRpYW5uZXNzICovCisJX19pbnQ2NCBvdXQ7CisJb3V0ID0gdGltZV9pbiArIHNlY3NfYmV0d2Vlbl9lcG9jaHM7CisJb3V0ID0gb3V0ICogMTAwMDAwMDAgKyBuc2VjX2luOworCW1lbWNweShvdXRfcHRyLCAmb3V0LCBzaXplb2Yob3V0KSk7Cit9CisKIC8qIEJlbG93LCB3ZSAqa25vdyogdGhhdCB1Z28rciBpcyAwNDQ0ICovCiAjaWYgX1NfSVJFQUQgIT0gMDQwMAogI2Vycm9yIFVuc3VwcG9ydGVkIEMgbGlicmFyeQpAQCAtMTI5MiwyNCArMTM1NywzOSBAQAogewogCWNoYXIgKnBhdGg7CiAJaW50IG1vZGU7Ci0JaW50IHJlczsKLQorCQogI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUworCURXT1JEIGF0dHI7CiAJaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7CiAJCVB5VW5pY29kZU9iamVjdCAqcG87CiAJCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVaTphY2Nlc3MiLCAmcG8sICZtb2RlKSkgewogCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCQkJLyogUHlVbmljb2RlX0FTX1VOSUNPREUgT0sgd2l0aG91dCB0aHJlYWQgbG9jayBhcwogCQkJICAgaXQgaXMgYSBzaW1wbGUgZGVyZWZlcmVuY2UuICovCi0JCQlyZXMgPSBfd2FjY2VzcyhQeVVuaWNvZGVfQVNfVU5JQ09ERShwbyksIG1vZGUpOworCQkJYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzVyhQeVVuaWNvZGVfQVNfVU5JQ09ERShwbykpOwogCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzID09IDApOworCQkJZ290byBmaW5pc2g7CiAJCX0KIAkJLyogRHJvcCB0aGUgYXJndW1lbnQgcGFyc2luZyBlcnJvciBhcyBuYXJyb3cgc3RyaW5ncwogCQkgICBhcmUgYWxzbyB2YWxpZC4gKi8KIAkJUHlFcnJfQ2xlYXIoKTsKIAl9Ci0jZW5kaWYKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTphY2Nlc3MiLAorCQkJICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgJnBhdGgsICZtb2RlKSkKKwkJcmV0dXJuIDA7CisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCWF0dHIgPSBHZXRGaWxlQXR0cmlidXRlc0EocGF0aCk7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwlQeU1lbV9GcmVlKHBhdGgpOworZmluaXNoOgorCWlmIChhdHRyID09IDB4RkZGRkZGRkYpCisJCS8qIEZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIGNhbm5vdCByZWFkIGF0dHJpYnV0ZXMgKi8KKwkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKwkvKiBBY2Nlc3MgaXMgcG9zc2libGUgaWYgZWl0aGVyIHdyaXRlIGFjY2VzcyB3YXNuJ3QgcmVxdWVzdGVkLCBvcgorCSAgIHRoZSBmaWxlIGlzbid0IHJlYWQtb25seS4gKi8KKwlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKCEobW9kZSAmIDIpIHx8ICEoYXR0ciAmJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkpOworI2Vsc2UKKwlpbnQgcmVzOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRpOmFjY2VzcyIsIAogCQkJICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgJnBhdGgsICZtb2RlKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMzE4LDYgKzEzOTgsNyBAQAogCVB5X0VORF9BTExPV19USFJFQURTCiAJUHlNZW1fRnJlZShwYXRoKTsKIAlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyA9PSAwKTsKKyNlbmRpZgogfQogCiAjaWZuZGVmIEZfT0sKQEAgLTEzOTQsMTQgKzE0NzUsMTMgQEAKIHBvc2l4X2NoZGlyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OmNoZGlyIiwgY2hkaXIsICJVOmNoZGlyIiwgX3djaGRpcik7CisJcmV0dXJuIHdpbjMyXzFzdHIoYXJncywgImNoZGlyIiwgInM6Y2hkaXIiLCB3aW4zMl9jaGRpciwgIlU6Y2hkaXIiLCB3aW4zMl93Y2hkaXIpOwogI2VsaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykKLQlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hkaXIiLCBfY2hkaXIyLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hkaXIiLCBfY2hkaXIyKTsKICNlbGlmIGRlZmluZWQoX19WTVMpCi0JcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OmNoZGlyIiwgKGludCAoKikoY29uc3QgY2hhciAqKSljaGRpciwKLQkJCSAgTlVMTCwgTlVMTCk7CisJcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OmNoZGlyIiwgKGludCAoKikoY29uc3QgY2hhciAqKSljaGRpcik7CiAjZWxzZQotCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpjaGRpciIsIGNoZGlyLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hkaXIiLCBjaGRpcik7CiAjZW5kaWYKIH0KIApAQCAtMTQzMCwxNCArMTUxMCwyNCBAQAogCWludCBpOwogCWludCByZXM7CiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCisJRFdPUkQgYXR0cjsKIAlpZiAodW5pY29kZV9maWxlX25hbWVzKCkpIHsKIAkJUHlVbmljb2RlT2JqZWN0ICpwbzsKIAkJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVpfDpjaG1vZCIsICZwbywgJmkpKSB7CiAJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQlyZXMgPSBfd2NobW9kKFB5VW5pY29kZV9BU19VTklDT0RFKHBvKSwgaSk7CisJCQlhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXNXKFB5VW5pY29kZV9BU19VTklDT0RFKHBvKSk7CisJCQlpZiAoYXR0ciAhPSAweEZGRkZGRkZGKSB7CisJCQkJaWYgKGkgJiBfU19JV1JJVEUpCisJCQkJCWF0dHIgJj0gfkZJTEVfQVRUUklCVVRFX1JFQURPTkxZOworCQkJCWVsc2UKKwkJCQkJYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9SRUFET05MWTsKKwkJCQlyZXMgPSBTZXRGaWxlQXR0cmlidXRlc1coUHlVbmljb2RlX0FTX1VOSUNPREUocG8pLCBhdHRyKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlyZXMgPSAwOwogCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCWlmIChyZXMgPCAwKQotCQkJCXJldHVybiBwb3NpeF9lcnJvcl93aXRoX3VuaWNvZGVfZmlsZW5hbWUoCisJCQlpZiAoIXJlcykKKwkJCQlyZXR1cm4gd2luMzJfZXJyb3JfdW5pY29kZSgiY2htb2QiLAogCQkJCQkJUHlVbmljb2RlX0FTX1VOSUNPREUocG8pKTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCXJldHVybiBQeV9Ob25lOwpAQCAtMTQ0Niw3ICsxNTM2LDMwIEBACiAJCSAgIGFyZSBhbHNvIHZhbGlkLiAqLwogCQlQeUVycl9DbGVhcigpOwogCX0KLSNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTpjaG1vZCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsCisJICAgICAgICAgICAgICAgICAgICAgICZwYXRoLCAmaSkpCisJCXJldHVybiBOVUxMOworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwlhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgpOworCWlmIChhdHRyICE9IDB4RkZGRkZGRkYpIHsKKwkJaWYgKGkgJiBfU19JV1JJVEUpCisJCQlhdHRyICY9IH5GSUxFX0FUVFJJQlVURV9SRUFET05MWTsKKwkJZWxzZQorCQkJYXR0ciB8PSBGSUxFX0FUVFJJQlVURV9SRUFET05MWTsKKwkJcmVzID0gU2V0RmlsZUF0dHJpYnV0ZXNBKHBhdGgsIGF0dHIpOworCX0KKwllbHNlCisJCXJlcyA9IDA7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwlpZiAoIXJlcykgeworCQl3aW4zMl9lcnJvcigiY2htb2QiLCBwYXRoKTsKKwkJUHlNZW1fRnJlZShwYXRoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVB5TWVtX0ZyZWUocGF0aCk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworI2Vsc2UgLyogUHlfV0lOX1dJREVfRklMRU5BTUVTICovCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGk6Y2htb2QiLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLAogCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwgJmkpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTE0NTgsNiArMTU3MSw3IEBACiAJUHlNZW1fRnJlZShwYXRoKTsKIAlQeV9JTkNSRUYoUHlfTm9uZSk7CiAJcmV0dXJuIFB5X05vbmU7CisjZW5kaWYKIH0KIAogCkBAIC0xNDY5LDcgKzE1ODMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X2Nocm9vdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OmNocm9vdCIsIGNocm9vdCwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OmNocm9vdCIsIGNocm9vdCk7CiB9CiAjZW5kaWYKIApAQCAtMTU5MywxNSArMTcwNywzMyBAQAogCWNoYXIgKnJlczsKIAogI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUworCURXT1JEIGxlbjsKIAlpZiAodW5pY29kZV9maWxlX25hbWVzKCkpIHsKLQkJd2NoYXJfdCAqd3JlczsKIAkJd2NoYXJfdCB3YnVmWzEwMjZdOworCQl3Y2hhcl90ICp3YnVmMiA9IHdidWY7CisJCVB5T2JqZWN0ICpyZXNvYmo7CiAJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJd3JlcyA9IF93Z2V0Y3dkKHdidWYsIHNpemVvZiB3YnVmLyBzaXplb2Ygd2J1ZlswXSk7CisJCWxlbiA9IEdldEN1cnJlbnREaXJlY3RvcnlXKHNpemVvZiB3YnVmLyBzaXplb2Ygd2J1ZlswXSwgd2J1Zik7CisJCS8qIElmIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoLCBsZW4gZG9lcyBub3QgaW5jbHVkZSB0aGUKKwkJICAgdGVybWluYXRpbmcgXDAuIElmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLCBsZW4gaW5jbHVkZXMKKwkJICAgdGhlIHNwYWNlIG5lZWRlZCBmb3IgdGhlIHRlcm1pbmF0b3IuICovCisJCWlmIChsZW4gPj0gc2l6ZW9mIHdidWYvIHNpemVvZiB3YnVmWzBdKSB7CisJCQl3YnVmMiA9IG1hbGxvYyhsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworCQkJaWYgKHdidWYyKQorCQkJCWxlbiA9IEdldEN1cnJlbnREaXJlY3RvcnlXKGxlbiwgd2J1ZjIpOworCQl9CiAJCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmICh3cmVzID09IE5VTEwpCi0JCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIod2J1Ziwgd2NzbGVuKHdidWYpKTsKKwkJaWYgKCF3YnVmMikgeworCQkJUHlFcnJfTm9NZW1vcnkoKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmICghbGVuKSB7CisJCQlpZiAod2J1ZjIgIT0gd2J1ZikgZnJlZSh3YnVmMik7CisJCQlyZXR1cm4gd2luMzJfZXJyb3IoImdldGN3ZHUiLCBOVUxMKTsKKwkJfQorCQlyZXNvYmogPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHdidWYyLCBsZW4pOworCQlpZiAod2J1ZjIgIT0gd2J1ZikgZnJlZSh3YnVmMik7CisJCXJldHVybiByZXNvYmo7CiAJfQogI2VuZGlmCiAKQEAgLTE2MjgsNyArMTc2MCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfbGluayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHBvc2l4XzJzdHIoYXJncywgImV0ZXQ6bGluayIsIGxpbmssIE5VTEwsIE5VTEwpOworCXJldHVybiBwb3NpeF8yc3RyKGFyZ3MsICJldGV0OmxpbmsiLCBsaW5rKTsKIH0KICNlbmRpZiAvKiBIQVZFX0xJTksgKi8KIApAQCAtMTY1MywzNyArMTc4NSw0NiBAQAogCUhBTkRMRSBoRmluZEZpbGU7CiAJQk9PTCByZXN1bHQ7CiAJV0lOMzJfRklORF9EQVRBIEZpbGVEYXRhOwotCS8qIE1BWF9QQVRIIGNoYXJhY3RlcnMgY291bGQgbWVhbiBhIGJpZ2dlciBlbmNvZGVkIHN0cmluZyAqLwotCWNoYXIgbmFtZWJ1ZltNQVhfUEFUSCoyKzVdOworCWNoYXIgbmFtZWJ1ZltNQVhfUEFUSCs1XTsgLyogT3ZlcmFsbG9jYXRlIGZvciBcXCouKlwwICovCiAJY2hhciAqYnVmcHRyID0gbmFtZWJ1ZjsKLQlQeV9zc2l6ZV90IGxlbiA9IHNpemVvZihuYW1lYnVmKS9zaXplb2YobmFtZWJ1ZlswXSk7CisJUHlfc3NpemVfdCBsZW4gPSBzaXplb2YobmFtZWJ1ZiktNTsgLyogb25seSBjbGFpbSB0byBoYXZlIHNwYWNlIGZvciBNQVhfUEFUSCAqLwogCiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCiAJLyogSWYgb24gd2lkZS1jaGFyYWN0ZXItY2FwYWJsZSBPUyBzZWUgaWYgYXJndW1lbnQKIAkgICBpcyBVbmljb2RlIGFuZCBpZiBzbyB1c2Ugd2lkZSBBUEkuICAqLwogCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgewotCQlQeVVuaWNvZGVPYmplY3QgKnBvOworCQlQeU9iamVjdCAqcG87CiAJCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVOmxpc3RkaXIiLCAmcG8pKSB7CiAJCQlXSU4zMl9GSU5EX0RBVEFXIHdGaWxlRGF0YTsKLQkJCVB5X1VOSUNPREUgd25hbWVidWZbTUFYX1BBVEgqMis1XTsKKwkJCVB5X1VOSUNPREUgKnduYW1lYnVmOwogCQkJUHlfVU5JQ09ERSB3Y2g7Ci0JCQl3Y3NuY3B5KHduYW1lYnVmLCBQeVVuaWNvZGVfQVNfVU5JQ09ERShwbyksIE1BWF9QQVRIKTsKLQkJCXduYW1lYnVmW01BWF9QQVRIXSA9IEwnXDAnOwotCQkJbGVuID0gd2NzbGVuKHduYW1lYnVmKTsKLQkJCXdjaCA9IChsZW4gPiAwKSA/IHduYW1lYnVmW2xlbi0xXSA6IEwnXDAnOwotCQkJaWYgKHdjaCAhPSBMJy8nICYmIHdjaCAhPSBMJ1xcJyAmJiB3Y2ggIT0gTCc6JykKLQkJCQl3bmFtZWJ1ZltsZW4rK10gPSBMJy8nOwotCQkJd2NzY3B5KHduYW1lYnVmICsgbGVuLCBMIiouKiIpOwotCQkJaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKwkJCS8qIE92ZXJhbGxvY2F0ZSBmb3IgXFwqLipcMCAqLworCQkJbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHBvKTsKKwkJCXduYW1lYnVmID0gbWFsbG9jKChsZW4gKyA1KSAqIHNpemVvZih3Y2hhcl90KSk7CisJCQlpZiAoIXduYW1lYnVmKSB7CisJCQkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXdjc2NweSh3bmFtZWJ1ZiwgUHlVbmljb2RlX0FTX1VOSUNPREUocG8pKTsKKwkJCXdjaCA9IGxlbiA+IDAgPyB3bmFtZWJ1ZltsZW4tMV0gOiAnXDAnOworCQkJaWYgKHdjaCAhPSBMJy8nICYmIHdjaCAhPSBMJ1xcJyAmJiB3Y2ggIT0gTCc6JykKKwkJCQl3bmFtZWJ1ZltsZW4rK10gPSBMJ1xcJzsKKwkJCXdjc2NweSh3bmFtZWJ1ZiArIGxlbiwgTCIqLioiKTsKKwkJCWlmICgoZCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpIHsKKwkJCQlmcmVlKHduYW1lYnVmKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KIAkJCWhGaW5kRmlsZSA9IEZpbmRGaXJzdEZpbGVXKHduYW1lYnVmLCAmd0ZpbGVEYXRhKTsKIAkJCWlmIChoRmluZEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJCQllcnJubyA9IEdldExhc3RFcnJvcigpOwotCQkJCWlmIChlcnJubyA9PSBFUlJPUl9GSUxFX05PVF9GT1VORCkgeworCQkJCWludCBlcnJvciA9IEdldExhc3RFcnJvcigpOworCQkJCWlmIChlcnJvciA9PSBFUlJPUl9GSUxFX05PVF9GT1VORCkgeworCQkJCQlmcmVlKHduYW1lYnVmKTsKIAkJCQkJcmV0dXJuIGQ7CiAJCQkJfQogCQkJCVB5X0RFQ1JFRihkKTsKLQkJCQlyZXR1cm4gd2luMzJfZXJyb3JfdW5pY29kZSgiRmluZEZpcnN0RmlsZVciLCB3bmFtZWJ1Zik7CisJCQkJd2luMzJfZXJyb3JfdW5pY29kZSgiRmluZEZpcnN0RmlsZVciLCB3bmFtZWJ1Zik7CisJCQkJZnJlZSh3bmFtZWJ1Zik7CisJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCQlkbyB7CiAJCQkJLyogU2tpcCBvdmVyIC4gYW5kIC4uICovCkBAIC0xNzEwLDggKzE4NTEsMTEgQEAKIAogCQkJaWYgKEZpbmRDbG9zZShoRmluZEZpbGUpID09IEZBTFNFKSB7CiAJCQkJUHlfREVDUkVGKGQpOwotCQkJCXJldHVybiB3aW4zMl9lcnJvcl91bmljb2RlKCJGaW5kQ2xvc2UiLCB3bmFtZWJ1Zik7CisJCQkJd2luMzJfZXJyb3JfdW5pY29kZSgiRmluZENsb3NlIiwgd25hbWVidWYpOworCQkJCWZyZWUod25hbWVidWYpOworCQkJCXJldHVybiBOVUxMOwogCQkJfQorCQkJZnJlZSh3bmFtZWJ1Zik7CiAJCQlyZXR1cm4gZDsKIAkJfQogCQkvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdyBzdHJpbmdzCkBAIC0xNzM1LDggKzE4NzksOCBAQAogCiAJaEZpbmRGaWxlID0gRmluZEZpcnN0RmlsZShuYW1lYnVmLCAmRmlsZURhdGEpOwogCWlmIChoRmluZEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKLQkJaWYgKGVycm5vID09IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKQorCQlpbnQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKwkJaWYgKGVycm9yID09IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKQogCQkJcmV0dXJuIGQ7CiAJCVB5X0RFQ1JFRihkKTsKIAkJcmV0dXJuIHdpbjMyX2Vycm9yKCJGaW5kRmlyc3RGaWxlIiwgbmFtZWJ1Zik7CkBAIC0xOTgyLDEwICsyMTI2LDEwIEBACiAJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJCQkvKiBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZCBsb2NrIGFzCiAJCQkgICBpdCBpcyBhIHNpbXBsZSBkZXJlZmVyZW5jZS4gKi8KLQkJCXJlcyA9IF93bWtkaXIoUHlVbmljb2RlX0FTX1VOSUNPREUocG8pKTsKKwkJCXJlcyA9IENyZWF0ZURpcmVjdG9yeVcoUHlVbmljb2RlX0FTX1VOSUNPREUocG8pLCBOVUxMKTsKIAkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQlpZiAocmVzIDwgMCkKLQkJCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKKwkJCWlmICghcmVzKQorCQkJCXJldHVybiB3aW4zMl9lcnJvcl91bmljb2RlKCJta2RpciIsIFB5VW5pY29kZV9BU19VTklDT0RFKHBvKSk7CiAJCQlQeV9JTkNSRUYoUHlfTm9uZSk7CiAJCQlyZXR1cm4gUHlfTm9uZTsKIAkJfQpAQCAtMTk5MywxMyArMjEzNywyOSBAQAogCQkgICBhcmUgYWxzbyB2YWxpZC4gKi8KIAkJUHlFcnJfQ2xlYXIoKTsKIAl9Ci0jZW5kaWYKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0fGk6bWtkaXIiLAorCSAgICAgICAgICAgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCwgJm1vZGUpKQorCQlyZXR1cm4gTlVMTDsKKwlQeV9CRUdJTl9BTExPV19USFJFQURTCisJLyogUHlVbmljb2RlX0FTX1VOSUNPREUgT0sgd2l0aG91dCB0aHJlYWQgbG9jayBhcworCSAgIGl0IGlzIGEgc2ltcGxlIGRlcmVmZXJlbmNlLiAqLworCXJlcyA9IENyZWF0ZURpcmVjdG9yeUEocGF0aCwgTlVMTCk7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwlpZiAoIXJlcykgeworCQl3aW4zMl9lcnJvcigibWtkaXIiLCBwYXRoKTsKKwkJUHlNZW1fRnJlZShwYXRoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVB5TWVtX0ZyZWUocGF0aCk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworI2Vsc2UKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXR8aTpta2RpciIsCiAJICAgICAgICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoLCAmbW9kZSkpCiAJCXJldHVybiBOVUxMOwogCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSNpZiAoIGRlZmluZWQoX19XQVRDT01DX18pIHx8IGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoUFlDQ19WQUNQUCkgKSAmJiAhZGVmaW5lZChfX1FOWF9fKQorI2lmICggZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChQWUNDX1ZBQ1BQKSApICYmICFkZWZpbmVkKF9fUU5YX18pCiAJcmVzID0gbWtkaXIocGF0aCk7CiAjZWxzZQogCXJlcyA9IG1rZGlyKHBhdGgsIG1vZGUpOwpAQCAtMjAxMCw2ICsyMTcwLDcgQEAKIAlQeU1lbV9GcmVlKHBhdGgpOwogCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAlyZXR1cm4gUHlfTm9uZTsKKyNlbmRpZgogfQogCiAKQEAgLTIwNTUsNyArMjIxNiw2IEBACiB9CiAjZW5kaWYgLyogSEFWRV9OSUNFICovCiAKLQogUHlEb2NfU1RSVkFSKHBvc2l4X3JlbmFtZV9fZG9jX18sCiAicmVuYW1lKG9sZCwgbmV3KVxuXG5cCiBSZW5hbWUgYSBmaWxlIG9yIGRpcmVjdG9yeS4iKTsKQEAgLTIwNjQsOSArMjIyNCwzOCBAQAogcG9zaXhfcmVuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JcmV0dXJuIHBvc2l4XzJzdHIoYXJncywgImV0ZXQ6cmVuYW1lIiwgcmVuYW1lLCAiT086cmVuYW1lIiwgX3dyZW5hbWUpOworCVB5T2JqZWN0ICpvMSwgKm8yOworCWNoYXIgKnAxLCAqcDI7CisJQk9PTCByZXN1bHQ7CisJaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7CisJICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJjpyZW5hbWUiLCAKKwkJY29udmVydF90b191bmljb2RlLCAmbzEsCisJCWNvbnZlcnRfdG9fdW5pY29kZSwgJm8yKSkKKwkJICAgIFB5RXJyX0NsZWFyKCk7CisJICAgIGVsc2UgeworCQkgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCQkgICAgcmVzdWx0ID0gTW92ZUZpbGVXKFB5VW5pY29kZV9Bc1VuaWNvZGUobzEpLAorCQkJCSAgICAgICBQeVVuaWNvZGVfQXNVbmljb2RlKG8yKSk7CisJCSAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCQkgICAgUHlfREVDUkVGKG8xKTsKKwkJICAgIFB5X0RFQ1JFRihvMik7CisJCSAgICBpZiAoIXJlc3VsdCkKKwkJCSAgICByZXR1cm4gd2luMzJfZXJyb3IoInJlbmFtZSIsIE5VTEwpOworCQkgICAgUHlfSU5DUkVGKFB5X05vbmUpOworCQkgICAgcmV0dXJuIFB5X05vbmU7CisJICAgIH0KKwl9CisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpyZW5hbWUiLCAmcDEsICZwMikpCisJCXJldHVybiBOVUxMOworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwlyZXN1bHQgPSBNb3ZlRmlsZUEocDEsIHAyKTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gd2luMzJfZXJyb3IoInJlbmFtZSIsIE5VTEwpOworCVB5X0lOQ1JFRihQeV9Ob25lKTsKKwlyZXR1cm4gUHlfTm9uZTsKICNlbHNlCi0JcmV0dXJuIHBvc2l4XzJzdHIoYXJncywgImV0ZXQ6cmVuYW1lIiwgcmVuYW1lLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gcG9zaXhfMnN0cihhcmdzLCAiZXRldDpyZW5hbWUiLCByZW5hbWUpOwogI2VuZGlmCiB9CiAKQEAgLTIwNzksOSArMjI2OCw5IEBACiBwb3NpeF9ybWRpcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAjaWZkZWYgTVNfV0lORE9XUwotCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpybWRpciIsIHJtZGlyLCAiVTpybWRpciIsIF93cm1kaXIpOworCXJldHVybiB3aW4zMl8xc3RyKGFyZ3MsICJybWRpciIsICJzOnJtZGlyIiwgUmVtb3ZlRGlyZWN0b3J5QSwgIlU6cm1kaXIiLCBSZW1vdmVEaXJlY3RvcnlXKTsKICNlbHNlCi0JcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OnJtZGlyIiwgcm1kaXIsIE5VTEwsIE5VTEwpOworCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpybWRpciIsIHJtZGlyKTsKICNlbmRpZgogfQogCkBAIC0yMTUwLDkgKzIzMzksOSBAQAogcG9zaXhfdW5saW5rKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OnJlbW92ZSIsIHVubGluaywgIlU6cmVtb3ZlIiwgX3d1bmxpbmspOworCXJldHVybiB3aW4zMl8xc3RyKGFyZ3MsICJyZW1vdmUiLCAiczpyZW1vdmUiLCBEZWxldGVGaWxlQSwgIlU6cmVtb3ZlIiwgRGVsZXRlRmlsZVcpOwogI2Vsc2UKLQlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6cmVtb3ZlIiwgdW5saW5rLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6cmVtb3ZlIiwgdW5saW5rKTsKICNlbmRpZgogfQogCkBAIC0yMjEyLDcgKzI0MDEsNyBAQAogfQogCiBQeURvY19TVFJWQVIocG9zaXhfdXRpbWVfX2RvY19fLAotInV0aW1lKHBhdGgsIChhdGltZSwgdXRpbWUpKVxuXAorInV0aW1lKHBhdGgsIChhdGltZSwgbXRpbWUpKVxuXAogdXRpbWUocGF0aCwgTm9uZSlcblxuXAogU2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWVkIHRpbWUgb2YgdGhlIGZpbGUgdG8gdGhlIGdpdmVuIHZhbHVlcy4gIElmIHRoZVxuXAogc2Vjb25kIGZvcm0gaXMgdXNlZCwgc2V0IHRoZSBhY2Nlc3MgYW5kIG1vZGlmaWVkIHRpbWVzIHRvIHRoZSBjdXJyZW50IHRpbWUuIik7CkBAIC0yMjIwLDYgKzI0MDksODQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF91dGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CisjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCisJUHlPYmplY3QgKmFyZzsKKwlQeVVuaWNvZGVPYmplY3QgKm9id3BhdGg7CisJd2NoYXJfdCAqd3BhdGggPSBOVUxMOworCWNoYXIgKmFwYXRoID0gTlVMTDsKKwlIQU5ETEUgaEZpbGU7CisJbG9uZyBhdGltZXNlYywgbXRpbWVzZWMsIGF1c2VjLCBtdXNlYzsKKwlGSUxFVElNRSBhdGltZSwgbXRpbWU7CisJUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisKKwlpZiAodW5pY29kZV9maWxlX25hbWVzKCkpIHsKKwkJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVPfDp1dGltZSIsICZvYndwYXRoLCAmYXJnKSkgeworCQkJd3BhdGggPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYndwYXRoKTsKKwkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwkJCWhGaWxlID0gQ3JlYXRlRmlsZVcod3BhdGgsIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgMCwKKwkJCQkJICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIDAsIE5VTEwpOworCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwkJCWlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkJCQlyZXR1cm4gd2luMzJfZXJyb3JfdW5pY29kZSgidXRpbWUiLCB3cGF0aCk7CisJCX0gZWxzZQorCQkJLyogRHJvcCB0aGUgYXJndW1lbnQgcGFyc2luZyBlcnJvciBhcyBuYXJyb3cgc3RyaW5ncworCQkJICAgYXJlIGFsc28gdmFsaWQuICovCisJCQlQeUVycl9DbGVhcigpOworCX0KKwlpZiAoIXdwYXRoKSB7CisJCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRPOnV0aW1lIiwKKwkJCQlQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmYXBhdGgsICZhcmcpKQorCQkJcmV0dXJuIE5VTEw7CisJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwkJaEZpbGUgPSBDcmVhdGVGaWxlQShhcGF0aCwgRklMRV9XUklURV9BVFRSSUJVVEVTLCAwLAorCQkJCSAgICBOVUxMLCBPUEVOX0VYSVNUSU5HLCAwLCBOVUxMKTsKKwkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwkJaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisJCQl3aW4zMl9lcnJvcigidXRpbWUiLCBhcGF0aCk7CisJCQlQeU1lbV9GcmVlKGFwYXRoKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVB5TWVtX0ZyZWUoYXBhdGgpOworCX0KKwkKKwlpZiAoYXJnID09IFB5X05vbmUpIHsKKwkJU1lTVEVNVElNRSBub3c7CisJCUdldFN5c3RlbVRpbWUoJm5vdyk7CisJCWlmICghU3lzdGVtVGltZVRvRmlsZVRpbWUoJm5vdywgJm10aW1lKSB8fAorCQkgICAgIVN5c3RlbVRpbWVUb0ZpbGVUaW1lKCZub3csICZhdGltZSkpIHsKKwkJCXdpbjMyX2Vycm9yKCJ1dGltZSIsIE5VTEwpOworCQkJZ290byBkb25lOworCQkgICAgfQorCX0KKwllbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmcpIHx8IFB5VHVwbGVfU2l6ZShhcmcpICE9IDIpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKwkJCQkidXRpbWUoKSBhcmcgMiBtdXN0IGJlIGEgdHVwbGUgKGF0aW1lLCBtdGltZSkiKTsKKwkJZ290byBkb25lOworCX0KKwllbHNlIHsKKwkJaWYgKGV4dHJhY3RfdGltZShQeVR1cGxlX0dFVF9JVEVNKGFyZywgMCksCisJCQkJICZhdGltZXNlYywgJmF1c2VjKSA9PSAtMSkKKwkJCWdvdG8gZG9uZTsKKwkJdGltZV90X3RvX0ZJTEVfVElNRShhdGltZXNlYywgYXVzZWMsICZhdGltZSk7CisJCWlmIChleHRyYWN0X3RpbWUoUHlUdXBsZV9HRVRfSVRFTShhcmcsIDEpLAorCQkJCSAmbXRpbWVzZWMsICZtdXNlYykgPT0gLTEpCisJCQlnb3RvIGRvbmU7CisJCXRpbWVfdF90b19GSUxFX1RJTUUobXRpbWVzZWMsIG11c2VjLCAmbXRpbWUpOworCX0KKwlpZiAoIVNldEZpbGVUaW1lKGhGaWxlLCBOVUxMLCAmYXRpbWUsICZtdGltZSkpIHsKKwkJLyogQXZvaWQgcHV0dGluZyB0aGUgZmlsZSBuYW1lIGludG8gdGhlIGVycm9yIGhlcmUsCisJCSAgIGFzIHRoYXQgbWF5IGNvbmZ1c2UgdGhlIHVzZXIgaW50byBiZWxpZXZpbmcgdGhhdAorCQkgICBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgZmlsZSwgd2hlbiBpdCBhbHNvCisJCSAgIGNvdWxkIGJlIHRoZSB0aW1lIHN0YW1wIHRoYXQgZ2l2ZXMgYSBwcm9ibGVtLiAqLworCQl3aW4zMl9lcnJvcigidXRpbWUiLCBOVUxMKTsKKwl9CisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJlc3VsdCA9IFB5X05vbmU7Citkb25lOgorCUNsb3NlSGFuZGxlKGhGaWxlKTsKKwlyZXR1cm4gcmVzdWx0OworI2Vsc2UgLyogUHlfV0lOX1dJREVfRklMRU5BTUVTICovCisKIAljaGFyICpwYXRoID0gTlVMTDsKIAlsb25nIGF0aW1lLCBtdGltZSwgYXVzZWMsIG11c2VjOwogCWludCByZXM7CkBAIC0yMjQyLDMzICsyNTA5LDEzIEBACiAjZGVmaW5lIFVUSU1FX0FSRyBidWYKICNlbmRpZiAvKiBIQVZFX1VUSU1FUyAqLwogCi0JaW50IGhhdmVfdW5pY29kZV9maWxlbmFtZSA9IDA7Ci0jaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCi0JUHlVbmljb2RlT2JqZWN0ICpvYndwYXRoOwotCXdjaGFyX3QgKndwYXRoOwotCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgewotCQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVU98OnV0aW1lIiwgJm9id3BhdGgsICZhcmcpKSB7Ci0JCQl3cGF0aCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9id3BhdGgpOwotCQkJaGF2ZV91bmljb2RlX2ZpbGVuYW1lID0gMTsKLQkJfSBlbHNlCi0JCQkvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdyBzdHJpbmdzCi0JCQkgICBhcmUgYWxzbyB2YWxpZC4gKi8KLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogCi0JaWYgKCFoYXZlX3VuaWNvZGVfZmlsZW5hbWUgJiYgXAotCQkhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRPOnV0aW1lIiwKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0Tzp1dGltZSIsCiAJCQkJICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCwgJmFyZykpCiAJCXJldHVybiBOVUxMOwogCWlmIChhcmcgPT0gUHlfTm9uZSkgewogCQkvKiBvcHRpb25hbCB0aW1lIHZhbHVlcyBub3QgZ2l2ZW4gKi8KIAkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwotCQlpZiAoaGF2ZV91bmljb2RlX2ZpbGVuYW1lKQotCQkJcmVzID0gX3d1dGltZSh3cGF0aCwgTlVMTCk7Ci0JCWVsc2UKLSNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIAkJcmVzID0gdXRpbWUocGF0aCwgTlVMTCk7CiAJCVB5X0VORF9BTExPV19USFJFQURTCiAJfQpAQCAtMjI5OSwyMyArMjU0NiwxMSBAQAogCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2Vsc2UKIAkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwotCQlpZiAoaGF2ZV91bmljb2RlX2ZpbGVuYW1lKQotCQkJLyogdXRpbWUgaXMgT0sgd2l0aCB1dGltYnVmLCBidXQgX3d1dGltZSBpbnNpc3RzCi0JCQkgICBvbiBfdXRpbWJ1ZiAodGhlIG1zdmMgaGVhZGVycyBhc3NlcnQgdGhlCi0JCQkgICB1bmRlcnNjb3JlIHZlcnNpb24gaXMgYW5zaSkgKi8KLQkJCXJlcyA9IF93dXRpbWUod3BhdGgsIChzdHJ1Y3QgX3V0aW1idWYgKilVVElNRV9BUkcpOwotCQllbHNlCi0jZW5kaWYgLyogUHlfV0lOX1dJREVfRklMRU5BTUVTICovCiAJCXJlcyA9IHV0aW1lKHBhdGgsIFVUSU1FX0FSRyk7CiAJCVB5X0VORF9BTExPV19USFJFQURTCiAjZW5kaWYgLyogSEFWRV9VVElNRVMgKi8KIAl9CiAJaWYgKHJlcyA8IDApIHsKLSNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKLQkJaWYgKGhhdmVfdW5pY29kZV9maWxlbmFtZSkKLQkJCXJldHVybiBwb3NpeF9lcnJvcl93aXRoX3VuaWNvZGVfZmlsZW5hbWUod3BhdGgpOwotI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogCQlyZXR1cm4gcG9zaXhfZXJyb3Jfd2l0aF9hbGxvY2F0ZWRfZmlsZW5hbWUocGF0aCk7CiAJfQogCVB5TWVtX0ZyZWUocGF0aCk7CkBAIC0yMzI0LDYgKzI1NTksNyBAQAogI3VuZGVmIFVUSU1FX0FSRwogI3VuZGVmIEFUSU1FCiAjdW5kZWYgTVRJTUUKKyNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIH0KIAogCkBAIC0yNDQwLDcgKzI2NzYsNyBAQAogCVB5T2JqZWN0ICprZXksICp2YWwsICprZXlzPU5VTEwsICp2YWxzPU5VTEw7CiAJUHlfc3NpemVfdCBpLCBwb3MsIGFyZ2MsIGVudmM7CiAJUHlPYmplY3QgKigqZ2V0aXRlbSkoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7Ci0JaW50IGxhc3RhcmcgPSAwOworCVB5X3NzaXplX3QgbGFzdGFyZyA9IDA7CiAKIAkvKiBleGVjdmUgaGFzIHRocmVlIGFyZ3VtZW50czogKHBhdGgsIGFyZ3YsIGVudiksIHdoZXJlCiAJICAgYXJndiBpcyBhIGxpc3Qgb3IgdHVwbGUgb2Ygc3RyaW5ncyBhbmQgZW52IGlzIGEgZGljdGlvbmFyeQpAQCAtMjU4MSw3ICsyODE3LDggQEAKIAljaGFyICpwYXRoOwogCVB5T2JqZWN0ICphcmd2OwogCWNoYXIgKiphcmd2bGlzdDsKLQlpbnQgbW9kZSwgaSwgYXJnYzsKKwlpbnQgbW9kZSwgaTsKKwlQeV9zc2l6ZV90IGFyZ2M7CiAJUHlfaW50cHRyX3Qgc3Bhd252YWw7CiAJUHlPYmplY3QgKigqZ2V0aXRlbSkoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CiAKQEAgLTI2NzAsMTAgKzI5MDcsMTEgQEAKIAljaGFyICoqYXJndmxpc3Q7CiAJY2hhciAqKmVudmxpc3Q7CiAJUHlPYmplY3QgKmtleSwgKnZhbCwgKmtleXM9TlVMTCwgKnZhbHM9TlVMTCwgKnJlcz1OVUxMOwotCWludCBtb2RlLCBpLCBwb3MsIGFyZ2MsIGVudmM7CisJaW50IG1vZGUsIHBvcywgZW52YzsKKwlQeV9zc2l6ZV90IGFyZ2MsIGk7CiAJUHlfaW50cHRyX3Qgc3Bhd252YWw7CiAJUHlPYmplY3QgKigqZ2V0aXRlbSkoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7Ci0JaW50IGxhc3RhcmcgPSAwOworCVB5X3NzaXplX3QgbGFzdGFyZyA9IDA7CiAKIAkvKiBzcGF3bnZlIGhhcyBmb3VyIGFyZ3VtZW50czogKG1vZGUsIHBhdGgsIGFyZ3YsIGVudiksIHdoZXJlCiAJICAgYXJndiBpcyBhIGxpc3Qgb3IgdHVwbGUgb2Ygc3RyaW5ncyBhbmQgZW52IGlzIGEgZGljdGlvbmFyeQpAQCAtNDM3NCw3ICs0NjEyLDcgQEAKIAkJCWNoYXIgbW9kdWxlcGF0aFtfTUFYX1BBVEhdOwogCQkJc3RydWN0IHN0YXQgc3RhdGluZm87CiAJCQlHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBtb2R1bGVwYXRoLCBzaXplb2YobW9kdWxlcGF0aCkpOwotCQkJZm9yIChpID0geCA9IDA7IG1vZHVsZXBhdGhbaV07IGkrKykKKwkJCWZvciAoeCA9IGkgPSAwOyBtb2R1bGVwYXRoW2ldOyBpKyspCiAJCQkJaWYgKG1vZHVsZXBhdGhbaV0gPT0gU0VQKQogCQkJCQl4ID0gaSsxOwogCQkJbW9kdWxlcGF0aFt4XSA9ICdcMCc7CkBAIC00NTUxLDcgKzQ3ODksNyBAQAogCQkgc3dpdGNoIChtb2RlICYgKF9PX1JET05MWSB8IF9PX1RFWFQgfCBfT19CSU5BUlkgfCBfT19XUk9OTFkpKSB7CiAJCSBjYXNlIF9PX1dST05MWSB8IF9PX1RFWFQ6CiAJCQkgLyogQ2FzZSBmb3Igd3JpdGluZyB0byBjaGlsZCBTdGRpbiBpbiB0ZXh0IG1vZGUuICovCi0JCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRpbldyRHVwLCBtb2RlKTsKKwkJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZGluV3JEdXAsIG1vZGUpOwogCQkJIGYxID0gX2Zkb3BlbihmZDEsICJ3Iik7CiAJCQkgZiA9IFB5RmlsZV9Gcm9tRmlsZShmMSwgY21kc3RyaW5nLCAidyIsIF9QeVBjbG9zZSk7CiAJCQkgUHlGaWxlX1NldEJ1ZlNpemUoZiwgMCk7CkBAIC00NTYyLDcgKzQ4MDAsNyBAQAogCiAJCSBjYXNlIF9PX1JET05MWSB8IF9PX1RFWFQ6CiAJCQkgLyogQ2FzZSBmb3IgcmVhZGluZyBmcm9tIGNoaWxkIFN0ZG91dCBpbiB0ZXh0IG1vZGUuICovCi0JCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRvdXRSZER1cCwgbW9kZSk7CisJCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChQeV9pbnRwdHJfdCloQ2hpbGRTdGRvdXRSZER1cCwgbW9kZSk7CiAJCQkgZjEgPSBfZmRvcGVuKGZkMSwgInIiKTsKIAkJCSBmID0gUHlGaWxlX0Zyb21GaWxlKGYxLCBjbWRzdHJpbmcsICJyIiwgX1B5UGNsb3NlKTsKIAkJCSBQeUZpbGVfU2V0QnVmU2l6ZShmLCAwKTsKQEAgLTQ1NzMsNyArNDgxMSw3IEBACiAKIAkJIGNhc2UgX09fUkRPTkxZIHwgX09fQklOQVJZOgogCQkJIC8qIENhc2UgZm9yIHJlYWRpbmlnIGZyb20gY2hpbGQgU3Rkb3V0IGluIGJpbmFyeSBtb2RlLiAqLwotCQkJIGZkMSA9IF9vcGVuX29zZmhhbmRsZSgoaW50cHRyX3QpaENoaWxkU3Rkb3V0UmREdXAsIG1vZGUpOworCQkJIGZkMSA9IF9vcGVuX29zZmhhbmRsZSgoUHlfaW50cHRyX3QpaENoaWxkU3Rkb3V0UmREdXAsIG1vZGUpOwogCQkJIGYxID0gX2Zkb3BlbihmZDEsICJyYiIpOwogCQkJIGYgPSBQeUZpbGVfRnJvbUZpbGUoZjEsIGNtZHN0cmluZywgInJiIiwgX1B5UGNsb3NlKTsKIAkJCSBQeUZpbGVfU2V0QnVmU2l6ZShmLCAwKTsKQEAgLTQ1ODQsNyArNDgyMiw3IEBACiAKIAkJIGNhc2UgX09fV1JPTkxZIHwgX09fQklOQVJZOgogCQkJIC8qIENhc2UgZm9yIHdyaXRpbmcgdG8gY2hpbGQgU3RkaW4gaW4gYmluYXJ5IG1vZGUuICovCi0JCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRpbldyRHVwLCBtb2RlKTsKKwkJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZGluV3JEdXAsIG1vZGUpOwogCQkJIGYxID0gX2Zkb3BlbihmZDEsICJ3YiIpOwogCQkJIGYgPSBQeUZpbGVfRnJvbUZpbGUoZjEsIGNtZHN0cmluZywgIndiIiwgX1B5UGNsb3NlKTsKIAkJCSBQeUZpbGVfU2V0QnVmU2l6ZShmLCAwKTsKQEAgLTQ2MTAsOSArNDg0OCw5IEBACiAJCQkgbTIgPSAid2IiOwogCQkgfQogCi0JCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKGludHB0cl90KWhDaGlsZFN0ZGluV3JEdXAsIG1vZGUpOworCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChQeV9pbnRwdHJfdCloQ2hpbGRTdGRpbldyRHVwLCBtb2RlKTsKIAkJIGYxID0gX2Zkb3BlbihmZDEsIG0yKTsKLQkJIGZkMiA9IF9vcGVuX29zZmhhbmRsZSgoaW50cHRyX3QpaENoaWxkU3Rkb3V0UmREdXAsIG1vZGUpOworCQkgZmQyID0gX29wZW5fb3NmaGFuZGxlKChQeV9pbnRwdHJfdCloQ2hpbGRTdGRvdXRSZER1cCwgbW9kZSk7CiAJCSBmMiA9IF9mZG9wZW4oZmQyLCBtMSk7CiAJCSBwMSA9IFB5RmlsZV9Gcm9tRmlsZShmMSwgY21kc3RyaW5nLCBtMiwgX1B5UGNsb3NlKTsKIAkJIFB5RmlsZV9TZXRCdWZTaXplKHAxLCAwKTsKQEAgLTQ2NDIsMTEgKzQ4ODAsMTEgQEAKIAkJCSBtMiA9ICJ3YiI7CiAJCSB9CiAKLQkJIGZkMSA9IF9vcGVuX29zZmhhbmRsZSgoaW50cHRyX3QpaENoaWxkU3RkaW5XckR1cCwgbW9kZSk7CisJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZGluV3JEdXAsIG1vZGUpOwogCQkgZjEgPSBfZmRvcGVuKGZkMSwgbTIpOwotCQkgZmQyID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRvdXRSZER1cCwgbW9kZSk7CisJCSBmZDIgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZG91dFJkRHVwLCBtb2RlKTsKIAkJIGYyID0gX2Zkb3BlbihmZDIsIG0xKTsKLQkJIGZkMyA9IF9vcGVuX29zZmhhbmRsZSgoaW50cHRyX3QpaENoaWxkU3RkZXJyUmREdXAsIG1vZGUpOworCQkgZmQzID0gX29wZW5fb3NmaGFuZGxlKChQeV9pbnRwdHJfdCloQ2hpbGRTdGRlcnJSZER1cCwgbW9kZSk7CiAJCSBmMyA9IF9mZG9wZW4oZmQzLCBtMSk7CiAJCSBwMSA9IFB5RmlsZV9Gcm9tRmlsZShmMSwgY21kc3RyaW5nLCBtMiwgX1B5UGNsb3NlKTsKIAkJIHAyID0gUHlGaWxlX0Zyb21GaWxlKGYyLCBjbWRzdHJpbmcsIG0xLCBfUHlQY2xvc2UpOwpAQCAtNTI1MCw3ICs1NDg4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF93YWl0cGlkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnRwdHJfdCBwaWQ7CisJUHlfaW50cHRyX3QgcGlkOwogCWludCBzdGF0dXMsIG9wdGlvbnM7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOndhaXRwaWQiLCAmcGlkLCAmb3B0aW9ucykpCkBAIC01MzM5LDcgKzU1NzcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X3N5bWxpbmsoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBwb3NpeF8yc3RyKGFyZ3MsICJldGV0OnN5bWxpbmsiLCBzeW1saW5rLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gcG9zaXhfMnN0cihhcmdzLCAiZXRldDpzeW1saW5rIiwgc3ltbGluayk7CiB9CiAjZW5kaWYgLyogSEFWRV9TWU1MSU5LICovCiAKQEAgLTYyODAsNyArNjUxOCw3IEBACiAjZW5kaWYgLyogSEFWRV9TWVNfV0FJVF9IICovCiAKIAotI2lmIGRlZmluZWQoSEFWRV9GU1RBVFZGUykKKyNpZiBkZWZpbmVkKEhBVkVfRlNUQVRWRlMpICYmIGRlZmluZWQoSEFWRV9TWVNfU1RBVFZGU19IKQogI2lmZGVmIF9TQ09fRFMKIC8qIFNDTyBPcGVuU2VydmVyIDUuMCBhbmQgbGF0ZXIgcmVxdWlyZXMgX1NWSUQzIGJlZm9yZSBpdCByZXZlYWxzIHRoZQogICAgbmVlZGVkIGRlZmluaXRpb25zIGluIHN5cy9zdGF0dmZzLmggKi8KQEAgLTYzNDcsMTAgKzY1ODUsMTAgQEAKIAogICAgICAgICByZXR1cm4gX3B5c3RhdHZmc19mcm9tc3RydWN0c3RhdHZmcyhzdCk7CiB9Ci0jZW5kaWYgLyogSEFWRV9GU1RBVFZGUyAqLworI2VuZGlmIC8qIEhBVkVfRlNUQVRWRlMgJiYgSEFWRV9TWVNfU1RBVFZGU19IICovCiAKIAotI2lmIGRlZmluZWQoSEFWRV9TVEFUVkZTKQorI2lmIGRlZmluZWQoSEFWRV9TVEFUVkZTKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1NUQVRWRlNfSCkKICNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgogCiBQeURvY19TVFJWQVIocG9zaXhfc3RhdHZmc19fZG9jX18sCkBAIC03ODg4LDEwICs4MTI2LDEwIEBACiAgICAgICAgIHsiV1NUT1BTSUciLAlwb3NpeF9XU1RPUFNJRywgTUVUSF9WQVJBUkdTLCBwb3NpeF9XU1RPUFNJR19fZG9jX199LAogI2VuZGlmIC8qIFdTVE9QU0lHICovCiAjZW5kaWYgLyogSEFWRV9TWVNfV0FJVF9IICovCi0jaWZkZWYgSEFWRV9GU1RBVFZGUworI2lmIGRlZmluZWQoSEFWRV9GU1RBVFZGUykgJiYgZGVmaW5lZChIQVZFX1NZU19TVEFUVkZTX0gpCiAJeyJmc3RhdHZmcyIsCXBvc2l4X2ZzdGF0dmZzLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X2ZzdGF0dmZzX19kb2NfX30sCiAjZW5kaWYKLSNpZmRlZiBIQVZFX1NUQVRWRlMKKyNpZiBkZWZpbmVkKEhBVkVfU1RBVFZGUykgJiYgZGVmaW5lZChIQVZFX1NZU19TVEFUVkZTX0gpCiAJeyJzdGF0dmZzIiwJcG9zaXhfc3RhdHZmcywgTUVUSF9WQVJBUkdTLCBwb3NpeF9zdGF0dmZzX19kb2NfX30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX1RNUEZJTEUKQEAgLTgyNjQsNiArODUwMiw0NSBAQAogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RhdHZmc19yZXN1bHQiLAogCQkJICAgKFB5T2JqZWN0KikgJlN0YXRWRlNSZXN1bHRUeXBlKTsKIAlpbml0aWFsaXplZCA9IDE7CisKKyNpZmRlZiBfX0FQUExFX18KKwkvKgorCSAqIFN0ZXAgMiBvZiB3ZWFrLWxpbmtpbmcgc3VwcG9ydCBvbiBNYWMgT1MgWC4KKwkgKgorCSAqIFRoZSBjb2RlIGJlbG93IHJlbW92ZXMgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlCisJICogY3VycmVudGx5IGFjdGl2ZSBwbGF0Zm9ybS4gCisJICoKKwkgKiBUaGlzIGJsb2NrIGFsbG93IG9uZSB0byB1c2UgYSBweXRob24gYmluYXJ5IHRoYXQgd2FzIGJ1aWxkIG9uCisJICogT1NYIDEwLjQgb24gT1NYIDEwLjMsIHdpdGhvdXQgbG9vc2luZyBhY2Nlc3MgdG8gbmV3IEFQSXMgb24gCisJICogT1NYIDEwLjQuCisJICovCisjaWZkZWYgSEFWRV9GU1RBVFZGUworCWlmIChmc3RhdHZmcyA9PSBOVUxMKSB7CisJCWlmIChQeU9iamVjdF9EZWxBdHRyU3RyaW5nKG0sICJmc3RhdHZmcyIpID09IC0xKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLyogSEFWRV9GU1RBVFZGUyAqLworCisjaWZkZWYgSEFWRV9TVEFUVkZTCisJaWYgKHN0YXR2ZnMgPT0gTlVMTCkgeworCQlpZiAoUHlPYmplY3RfRGVsQXR0clN0cmluZyhtLCAic3RhdHZmcyIpID09IC0xKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLyogSEFWRV9TVEFUVkZTICovCisKKyMgaWZkZWYgSEFWRV9MQ0hPV04KKwlpZiAobGNob3duID09IE5VTEwpIHsKKwkJaWYgKFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcobSwgImxjaG93biIpID09IC0xKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisjZW5kaWYgLyogSEFWRV9MQ0hPV04gKi8KKworCisjZW5kaWYgLyogX19BUFBMRV9fICovCisKIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JvdGF0aW5ndHJlZS5oIGIvTW9kdWxlcy9yb3RhdGluZ3RyZWUuaAppbmRleCA5N2NjOGU4Li4zYWEwOTg2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3JvdGF0aW5ndHJlZS5oCisrKyBiL01vZHVsZXMvcm90YXRpbmd0cmVlLmgKQEAgLTQsNyArNCw3IEBACiAgKgogICogSXQncyBhIGRpY3QtbGlrZSBkYXRhIHN0cnVjdHVyZSB0aGF0IHdvcmtzIGJlc3Qgd2hlbiBhY2Nlc3NlcyBhcmUgbm90CiAgKiByYW5kb20sIGJ1dCBmb2xsb3cgYSBzdHJvbmcgcGF0dGVybi4gIFRoZSBvbmUgaW1wbGVtZW50ZWQgaGVyZSBpcyBmb3IKLSAqIGFjY2Vzc2VzIHBhdHRlcm5zIHdoZXJlIHRoZSBzYW1lIHNtYWxsIHNldCBvZiBrZXlzIGlzIGxvb2tlZCB1cCBvdmVyCisgKiBhY2Nlc3MgcGF0dGVybnMgd2hlcmUgdGhlIHNhbWUgc21hbGwgc2V0IG9mIGtleXMgaXMgbG9va2VkIHVwIG92ZXIKICAqIGFuZCBvdmVyIGFnYWluLCBhbmQgdGhpcyBzZXQgb2Yga2V5cyBldm9sdmVzIHNsb3dseSBvdmVyIHRpbWUuCiAgKi8KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKaW5kZXggYzlkNDAzYS4uNGEwNGFmMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCkBAIC04LDYgKzgsMTMgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCisjaWZkZWYgX19BUFBMRV9fCisgICAgLyogUGVyZm9ybSBydW50aW1lIHRlc3RpbmcgZm9yIGEgYnJva2VuIHBvbGwgb24gT1NYIHRvIG1ha2UgaXQgZWFzaWVyCisgICAgICogdG8gdXNlIHRoZSBzYW1lIGJpbmFyeSBvbiBtdWx0aXBsZSByZWxlYXNlcyBvZiB0aGUgT1MuCisgICAgICovCisjdW5kZWYgSEFWRV9CUk9LRU5fUE9MTAorI2VuZGlmCisKIC8qIFdpbmRvd3MgI2RlZmluZXMgRkRfU0VUU0laRSB0byA2NCBpZiBGRF9TRVRTSVpFIGlzbid0IGFscmVhZHkgZGVmaW5lZC4KICAgIDY0IGlzIHRvbyBzbWFsbCAodG9vIG1hbnkgcGVvcGxlIGhhdmUgYnVtcGVkIGludG8gdGhhdCBsaW1pdCkuCiAgICBIZXJlIHdlIGJvb3N0IGl0LgpAQCAtNjE4LDcgKzYyNSwzOCBAQAogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gKFB5T2JqZWN0ICopcnY7CiB9Ci0jZW5kaWYgLyogSEFWRV9QT0xMICYmICFIQVZFX0JST0tFTl9QT0xMICovCisKKyNpZmRlZiBfX0FQUExFX18KKy8qIAorICogT24gc29tZSBzeXN0ZW1zIHBvbGwoKSBzZXRzIGVycm5vIG9uIGludmFsaWQgZmlsZSBkZXNjcmlwdG9ycy4gV2UgdGVzdAorICogZm9yIHRoaXMgYXQgcnVudGltZSBiZWNhdXNlIHRoaXMgYnVnIG1heSBiZSBmaXhlZCBvciBpbnRyb2R1Y2VkIGJldHdlZW4KKyAqIE9TIHJlbGVhc2VzLgorICovCitzdGF0aWMgaW50IHNlbGVjdF9oYXZlX2Jyb2tlbl9wb2xsKHZvaWQpCit7CisJaW50IHBvbGxfdGVzdDsKKwlpbnQgZmlsZWRlc1syXTsKKworCXN0cnVjdCBwb2xsZmQgcG9sbF9zdHJ1Y3QgPSB7IDAsIFBPTExJTnxQT0xMUFJJfFBPTExPVVQsIDAgfTsKKworCS8qIENyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciB0byBtYWtlIGludmFsaWQgKi8KKwlpZiAocGlwZShmaWxlZGVzKSA8IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCXBvbGxfc3RydWN0LmZkID0gZmlsZWRlc1swXTsKKwljbG9zZShmaWxlZGVzWzBdKTsKKwljbG9zZShmaWxlZGVzWzFdKTsKKwlwb2xsX3Rlc3QgPSBwb2xsKCZwb2xsX3N0cnVjdCwgMSwgMCk7CisJaWYgKHBvbGxfdGVzdCA8IDApIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChwb2xsX3Rlc3QgPT0gMCAmJiBwb2xsX3N0cnVjdC5yZXZlbnRzICE9IFBPTExOVkFMKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBfX0FQUExFX18gKi8KKworI2VuZGlmIC8qIEhBVkVfUE9MTCAqLwogCiBQeURvY19TVFJWQVIoc2VsZWN0X2RvYywKICJzZWxlY3Qocmxpc3QsIHdsaXN0LCB4bGlzdFssIHRpbWVvdXRdKSAtPiAocmxpc3QsIHdsaXN0LCB4bGlzdClcblwKQEAgLTY0NSw5ICs2ODMsOSBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgc2VsZWN0X21ldGhvZHNbXSA9IHsKICAgICB7InNlbGVjdCIsCXNlbGVjdF9zZWxlY3QsIE1FVEhfVkFSQVJHUywgc2VsZWN0X2RvY30sCi0jaWYgZGVmaW5lZChIQVZFX1BPTEwpICYmICFkZWZpbmVkKEhBVkVfQlJPS0VOX1BPTEwpCisjaWYgZGVmaW5lZChIQVZFX1BPTEwpIAogICAgIHsicG9sbCIsICAgIHNlbGVjdF9wb2xsLCAgIE1FVEhfVkFSQVJHUywgcG9sbF9kb2N9LAotI2VuZGlmIC8qIEhBVkVfUE9MTCAmJiAhSEFWRV9CUk9LRU5fUE9MTCAqLworI2VuZGlmIC8qIEhBVkVfUE9MTCAqLwogICAgIHswLCAgCTB9LAkJCSAgICAgLyogc2VudGluZWwgKi8KIH07CiAKQEAgLTY2OCwyOSArNzA2LDQwIEBACiAJU2VsZWN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNlbGVjdC5lcnJvciIsIE5VTEwsIE5VTEwpOwogCVB5X0lOQ1JFRihTZWxlY3RFcnJvcik7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFNlbGVjdEVycm9yKTsKLSNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoSEFWRV9CUk9LRU5fUE9MTCkKLQlwb2xsX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTElOIiwgUE9MTElOKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFBSSSIsIFBPTExQUkkpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMT1VUIiwgUE9MTE9VVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExFUlIiLCBQT0xMRVJSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEhVUCIsIFBPTExIVVApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMTlZBTCIsIFBPTExOVkFMKTsKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgCisKKyNpZmRlZiBfX0FQUExFX18KKwlpZiAoc2VsZWN0X2hhdmVfYnJva2VuX3BvbGwoKSkgeworCQlpZiAoUHlPYmplY3RfRGVsQXR0clN0cmluZyhtLCAicG9sbCIpID09IC0xKSB7CisJCQlQeUVycl9DbGVhcigpOworCQl9CisJfSBlbHNlIHsKKyNlbHNlCisJeworI2VuZGlmCisJCXBvbGxfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTElOIiwgUE9MTElOKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExQUkkiLCBQT0xMUFJJKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExPVVQiLCBQT0xMT1VUKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExFUlIiLCBQT0xMRVJSKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExIVVAiLCBQT0xMSFVQKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExOVkFMIiwgUE9MTE5WQUwpOwogCiAjaWZkZWYgUE9MTFJETk9STQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUkROT1JNIiwgUE9MTFJETk9STSk7CisJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUkROT1JNIiwgUE9MTFJETk9STSk7CiAjZW5kaWYKICNpZmRlZiBQT0xMUkRCQU5ECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSREJBTkQiLCBQT0xMUkRCQU5EKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSREJBTkQiLCBQT0xMUkRCQU5EKTsKICNlbmRpZgogI2lmZGVmIFBPTExXUk5PUk0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFdSTk9STSIsIFBPTExXUk5PUk0pOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFdSTk9STSIsIFBPTExXUk5PUk0pOwogI2VuZGlmCiAjaWZkZWYgUE9MTFdSQkFORAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JCQU5EIiwgUE9MTFdSQkFORCk7CisJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JCQU5EIiwgUE9MTFdSQkFORCk7CiAjZW5kaWYKICNpZmRlZiBQT0xMTVNHCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExNU0ciLCBQT0xMTVNHKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExNU0ciLCBQT0xMTVNHKTsKICNlbmRpZgotI2VuZGlmIC8qIEhBVkVfUE9MTCAmJiAhSEFWRV9CUk9LRU5fUE9MTCAqLworCX0KKyNlbmRpZiAvKiBIQVZFX1BPTEwgKi8KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2hhNTEybW9kdWxlLmMgYi9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jCmluZGV4IDUzOTIwNGUuLmM1YTg1ZmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2hhNTEybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYwpAQCAtMTIxLDEyICsxMjEsMTIgQEAKIAogLyogVmFyaW91cyBsb2dpY2FsIGZ1bmN0aW9ucyAqLwogI2RlZmluZSBST1I2NCh4LCB5KSBcCi0gICAgKCAoKCgoeCkgJiAweEZGRkZGRkZGRkZGRkZGRkZVTEwpPj4oKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoeSkgJiA2MykpIHwgXAotICAgICAgKCh4KTw8KCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpKDY0LSgoeSkgJiA2MykpKSkpICYgMHhGRkZGRkZGRkZGRkZGRkZGVUxMKQorICAgICggKCgoKHgpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpPj4oKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoeSkgJiA2MykpIHwgXAorICAgICAgKCh4KTw8KCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpKDY0LSgoeSkgJiA2MykpKSkpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpCiAjZGVmaW5lIENoKHgseSx6KSAgICAgICAoeiBeICh4ICYgKHkgXiB6KSkpCiAjZGVmaW5lIE1haih4LHkseikgICAgICAoKCh4IHwgeSkgJiB6KSB8ICh4ICYgeSkpIAogI2RlZmluZSBTKHgsIG4pICAgICAgICAgUk9SNjQoKHgpLChuKSkKLSNkZWZpbmUgUih4LCBuKSAgICAgICAgICgoKHgpICYgMHhGRkZGRkZGRkZGRkZGRkZGVUxMKSA+PiAoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyluKSkKKyNkZWZpbmUgUih4LCBuKSAgICAgICAgICgoKHgpICYgUHlfVUxMKDB4RkZGRkZGRkZGRkZGRkZGRikpID4+ICgodW5zaWduZWQgUFlfTE9OR19MT05HKW4pKQogI2RlZmluZSBTaWdtYTAoeCkgICAgICAgKFMoeCwgMjgpIF4gUyh4LCAzNCkgXiBTKHgsIDM5KSkKICNkZWZpbmUgU2lnbWExKHgpICAgICAgIChTKHgsIDE0KSBeIFMoeCwgMTgpIF4gUyh4LCA0MSkpCiAjZGVmaW5lIEdhbW1hMCh4KSAgICAgICAoUyh4LCAxKSBeIFMoeCwgOCkgXiBSKHgsIDcpKQpAQCAtMTU2LDg2ICsxNTYsODYgQEAKICAgICAgZCArPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICBoICA9IHQwICsgdDE7CiAKLSAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDAsMHg0MjhhMmY5OGQ3MjhhZTIyVUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDEsMHg3MTM3NDQ5MTIzZWY2NWNkVUxMKTsKLSAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDIsMHhiNWMwZmJjZmVjNGQzYjJmVUxMKTsKLSAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDMsMHhlOWI1ZGJhNTgxODlkYmJjVUxMKTsKLSAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDQsMHgzOTU2YzI1YmYzNDhiNTM4VUxMKTsKLSAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDUsMHg1OWYxMTFmMWI2MDVkMDE5VUxMKTsKLSAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDYsMHg5MjNmODJhNGFmMTk0ZjliVUxMKTsKLSAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDcsMHhhYjFjNWVkNWRhNmQ4MTE4VUxMKTsKLSAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDgsMHhkODA3YWE5OGEzMDMwMjQyVUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDksMHgxMjgzNWIwMTQ1NzA2ZmJlVUxMKTsKLSAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDEwLDB4MjQzMTg1YmU0ZWU0YjI4Y1VMTCk7Ci0gICAgUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSwxMSwweDU1MGM3ZGMzZDVmZmI0ZTJVTEwpOwotICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sMTIsMHg3MmJlNWQ3NGYyN2I4OTZmVUxMKTsKLSAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDEzLDB4ODBkZWIxZmUzYjE2OTZiMVVMTCk7Ci0gICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSwxNCwweDliZGMwNmE3MjVjNzEyMzVVTEwpOwotICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sMTUsMHhjMTliZjE3NGNmNjkyNjk0VUxMKTsKLSAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDE2LDB4ZTQ5YjY5YzE5ZWYxNGFkMlVMTCk7Ci0gICAgUk5EKFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSwxNywweGVmYmU0Nzg2Mzg0ZjI1ZTNVTEwpOwotICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMTgsMHgwZmMxOWRjNjhiOGNkNWI1VUxMKTsKLSAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDE5LDB4MjQwY2ExY2M3N2FjOWM2NVVMTCk7Ci0gICAgUk5EKFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSwyMCwweDJkZTkyYzZmNTkyYjAyNzVVTEwpOwotICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sMjEsMHg0YTc0ODRhYTZlYTZlNDgzVUxMKTsKLSAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDIyLDB4NWNiMGE5ZGNiZDQxZmJkNFVMTCk7Ci0gICAgUk5EKFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSwyMywweDc2Zjk4OGRhODMxMTUzYjVVTEwpOwotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMjQsMHg5ODNlNTE1MmVlNjZkZmFiVUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDI1LDB4YTgzMWM2NmQyZGI0MzIxMFVMTCk7Ci0gICAgUk5EKFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSwyNiwweGIwMDMyN2M4OThmYjIxM2ZVTEwpOwotICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sMjcsMHhiZjU5N2ZjN2JlZWYwZWU0VUxMKTsKLSAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDI4LDB4YzZlMDBiZjMzZGE4OGZjMlVMTCk7Ci0gICAgUk5EKFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSwyOSwweGQ1YTc5MTQ3OTMwYWE3MjVVTEwpOwotICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sMzAsMHgwNmNhNjM1MWUwMDM4MjZmVUxMKTsKLSAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDMxLDB4MTQyOTI5NjcwYTBlNmU3MFVMTCk7Ci0gICAgUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSwzMiwweDI3YjcwYTg1NDZkMjJmZmNVTEwpOwotICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sMzMsMHgyZTFiMjEzODVjMjZjOTI2VUxMKTsKLSAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDM0LDB4NGQyYzZkZmM1YWM0MmFlZFVMTCk7Ci0gICAgUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSwzNSwweDUzMzgwZDEzOWQ5NWIzZGZVTEwpOwotICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sMzYsMHg2NTBhNzM1NDhiYWY2M2RlVUxMKTsKLSAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDM3LDB4NzY2YTBhYmIzYzc3YjJhOFVMTCk7Ci0gICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSwzOCwweDgxYzJjOTJlNDdlZGFlZTZVTEwpOwotICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sMzksMHg5MjcyMmM4NTE0ODIzNTNiVUxMKTsKLSAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDQwLDB4YTJiZmU4YTE0Y2YxMDM2NFVMTCk7Ci0gICAgUk5EKFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSw0MSwweGE4MWE2NjRiYmM0MjMwMDFVTEwpOwotICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNDIsMHhjMjRiOGI3MGQwZjg5NzkxVUxMKTsKLSAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDQzLDB4Yzc2YzUxYTMwNjU0YmUzMFVMTCk7Ci0gICAgUk5EKFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSw0NCwweGQxOTJlODE5ZDZlZjUyMThVTEwpOwotICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNDUsMHhkNjk5MDYyNDU1NjVhOTEwVUxMKTsKLSAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDQ2LDB4ZjQwZTM1ODU1NzcxMjAyYVVMTCk7Ci0gICAgUk5EKFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSw0NywweDEwNmFhMDcwMzJiYmQxYjhVTEwpOwotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNDgsMHgxOWE0YzExNmI4ZDJkMGM4VUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDQ5LDB4MWUzNzZjMDg1MTQxYWI1M1VMTCk7Ci0gICAgUk5EKFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSw1MCwweDI3NDg3NzRjZGY4ZWViOTlVTEwpOwotICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNTEsMHgzNGIwYmNiNWUxOWI0OGE4VUxMKTsKLSAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDUyLDB4MzkxYzBjYjNjNWM5NWE2M1VMTCk7Ci0gICAgUk5EKFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSw1MywweDRlZDhhYTRhZTM0MThhY2JVTEwpOwotICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNTQsMHg1YjljY2E0Zjc3NjNlMzczVUxMKTsKLSAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDU1LDB4NjgyZTZmZjNkNmIyYjhhM1VMTCk7Ci0gICAgUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSw1NiwweDc0OGY4MmVlNWRlZmIyZmNVTEwpOwotICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNTcsMHg3OGE1NjM2ZjQzMTcyZjYwVUxMKTsKLSAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDU4LDB4ODRjODc4MTRhMWYwYWI3MlVMTCk7Ci0gICAgUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSw1OSwweDhjYzcwMjA4MWE2NDM5ZWNVTEwpOwotICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNjAsMHg5MGJlZmZmYTIzNjMxZTI4VUxMKTsKLSAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDYxLDB4YTQ1MDZjZWJkZTgyYmRlOVVMTCk7Ci0gICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSw2MiwweGJlZjlhM2Y3YjJjNjc5MTVVTEwpOwotICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNjMsMHhjNjcxNzhmMmUzNzI1MzJiVUxMKTsKLSAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDY0LDB4Y2EyNzNlY2VlYTI2NjE5Y1VMTCk7Ci0gICAgUk5EKFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSw2NSwweGQxODZiOGM3MjFjMGMyMDdVTEwpOwotICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNjYsMHhlYWRhN2RkNmNkZTBlYjFlVUxMKTsKLSAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDY3LDB4ZjU3ZDRmN2ZlZTZlZDE3OFVMTCk7Ci0gICAgUk5EKFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSw2OCwweDA2ZjA2N2FhNzIxNzZmYmFVTEwpOwotICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNjksMHgwYTYzN2RjNWEyYzg5OGE2VUxMKTsKLSAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDcwLDB4MTEzZjk4MDRiZWY5MGRhZVVMTCk7Ci0gICAgUk5EKFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSw3MSwweDFiNzEwYjM1MTMxYzQ3MWJVTEwpOwotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNzIsMHgyOGRiNzdmNTIzMDQ3ZDg0VUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDczLDB4MzJjYWFiN2I0MGM3MjQ5M1VMTCk7Ci0gICAgUk5EKFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSw3NCwweDNjOWViZTBhMTVjOWJlYmNVTEwpOwotICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNzUsMHg0MzFkNjdjNDljMTAwZDRjVUxMKTsKLSAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDc2LDB4NGNjNWQ0YmVjYjNlNDJiNlVMTCk7Ci0gICAgUk5EKFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSw3NywweDU5N2YyOTljZmM2NTdlMmFVTEwpOwotICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNzgsMHg1ZmNiNmZhYjNhZDZmYWVjVUxMKTsKLSAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDc5LDB4NmM0NDE5OGM0YTQ3NTgxN1VMTCk7CisgICAgUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSwwLFB5X1VMTCgweDQyOGEyZjk4ZDcyOGFlMjIpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDEsUHlfVUxMKDB4NzEzNzQ0OTEyM2VmNjVjZCkpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMixQeV9VTEwoMHhiNWMwZmJjZmVjNGQzYjJmKSk7CisgICAgUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSwzLFB5X1VMTCgweGU5YjVkYmE1ODE4OWRiYmMpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDQsUHlfVUxMKDB4Mzk1NmMyNWJmMzQ4YjUzOCkpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNSxQeV9VTEwoMHg1OWYxMTFmMWI2MDVkMDE5KSk7CisgICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSw2LFB5X1VMTCgweDkyM2Y4MmE0YWYxOTRmOWIpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDcsUHlfVUxMKDB4YWIxYzVlZDVkYTZkODExOCkpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sOCxQeV9VTEwoMHhkODA3YWE5OGEzMDMwMjQyKSk7CisgICAgUk5EKFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSw5LFB5X1VMTCgweDEyODM1YjAxNDU3MDZmYmUpKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDEwLFB5X1VMTCgweDI0MzE4NWJlNGVlNGIyOGMpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDExLFB5X1VMTCgweDU1MGM3ZGMzZDVmZmI0ZTIpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDEyLFB5X1VMTCgweDcyYmU1ZDc0ZjI3Yjg5NmYpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDEzLFB5X1VMTCgweDgwZGViMWZlM2IxNjk2YjEpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDE0LFB5X1VMTCgweDliZGMwNmE3MjVjNzEyMzUpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDE1LFB5X1VMTCgweGMxOWJmMTc0Y2Y2OTI2OTQpKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDE2LFB5X1VMTCgweGU0OWI2OWMxOWVmMTRhZDIpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDE3LFB5X1VMTCgweGVmYmU0Nzg2Mzg0ZjI1ZTMpKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDE4LFB5X1VMTCgweDBmYzE5ZGM2OGI4Y2Q1YjUpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDE5LFB5X1VMTCgweDI0MGNhMWNjNzdhYzljNjUpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDIwLFB5X1VMTCgweDJkZTkyYzZmNTkyYjAyNzUpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDIxLFB5X1VMTCgweDRhNzQ4NGFhNmVhNmU0ODMpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDIyLFB5X1VMTCgweDVjYjBhOWRjYmQ0MWZiZDQpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDIzLFB5X1VMTCgweDc2Zjk4OGRhODMxMTUzYjUpKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDI0LFB5X1VMTCgweDk4M2U1MTUyZWU2NmRmYWIpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDI1LFB5X1VMTCgweGE4MzFjNjZkMmRiNDMyMTApKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDI2LFB5X1VMTCgweGIwMDMyN2M4OThmYjIxM2YpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDI3LFB5X1VMTCgweGJmNTk3ZmM3YmVlZjBlZTQpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDI4LFB5X1VMTCgweGM2ZTAwYmYzM2RhODhmYzIpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDI5LFB5X1VMTCgweGQ1YTc5MTQ3OTMwYWE3MjUpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDMwLFB5X1VMTCgweDA2Y2E2MzUxZTAwMzgyNmYpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDMxLFB5X1VMTCgweDE0MjkyOTY3MGEwZTZlNzApKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDMyLFB5X1VMTCgweDI3YjcwYTg1NDZkMjJmZmMpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDMzLFB5X1VMTCgweDJlMWIyMTM4NWMyNmM5MjYpKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDM0LFB5X1VMTCgweDRkMmM2ZGZjNWFjNDJhZWQpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDM1LFB5X1VMTCgweDUzMzgwZDEzOWQ5NWIzZGYpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDM2LFB5X1VMTCgweDY1MGE3MzU0OGJhZjYzZGUpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDM3LFB5X1VMTCgweDc2NmEwYWJiM2M3N2IyYTgpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDM4LFB5X1VMTCgweDgxYzJjOTJlNDdlZGFlZTYpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDM5LFB5X1VMTCgweDkyNzIyYzg1MTQ4MjM1M2IpKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDQwLFB5X1VMTCgweGEyYmZlOGExNGNmMTAzNjQpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDQxLFB5X1VMTCgweGE4MWE2NjRiYmM0MjMwMDEpKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDQyLFB5X1VMTCgweGMyNGI4YjcwZDBmODk3OTEpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDQzLFB5X1VMTCgweGM3NmM1MWEzMDY1NGJlMzApKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDQ0LFB5X1VMTCgweGQxOTJlODE5ZDZlZjUyMTgpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDQ1LFB5X1VMTCgweGQ2OTkwNjI0NTU2NWE5MTApKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDQ2LFB5X1VMTCgweGY0MGUzNTg1NTc3MTIwMmEpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDQ3LFB5X1VMTCgweDEwNmFhMDcwMzJiYmQxYjgpKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDQ4LFB5X1VMTCgweDE5YTRjMTE2YjhkMmQwYzgpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDQ5LFB5X1VMTCgweDFlMzc2YzA4NTE0MWFiNTMpKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDUwLFB5X1VMTCgweDI3NDg3NzRjZGY4ZWViOTkpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDUxLFB5X1VMTCgweDM0YjBiY2I1ZTE5YjQ4YTgpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDUyLFB5X1VMTCgweDM5MWMwY2IzYzVjOTVhNjMpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDUzLFB5X1VMTCgweDRlZDhhYTRhZTM0MThhY2IpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDU0LFB5X1VMTCgweDViOWNjYTRmNzc2M2UzNzMpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDU1LFB5X1VMTCgweDY4MmU2ZmYzZDZiMmI4YTMpKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDU2LFB5X1VMTCgweDc0OGY4MmVlNWRlZmIyZmMpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDU3LFB5X1VMTCgweDc4YTU2MzZmNDMxNzJmNjApKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDU4LFB5X1VMTCgweDg0Yzg3ODE0YTFmMGFiNzIpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDU5LFB5X1VMTCgweDhjYzcwMjA4MWE2NDM5ZWMpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDYwLFB5X1VMTCgweDkwYmVmZmZhMjM2MzFlMjgpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDYxLFB5X1VMTCgweGE0NTA2Y2ViZGU4MmJkZTkpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDYyLFB5X1VMTCgweGJlZjlhM2Y3YjJjNjc5MTUpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDYzLFB5X1VMTCgweGM2NzE3OGYyZTM3MjUzMmIpKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDY0LFB5X1VMTCgweGNhMjczZWNlZWEyNjYxOWMpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDY1LFB5X1VMTCgweGQxODZiOGM3MjFjMGMyMDcpKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDY2LFB5X1VMTCgweGVhZGE3ZGQ2Y2RlMGViMWUpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDY3LFB5X1VMTCgweGY1N2Q0ZjdmZWU2ZWQxNzgpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDY4LFB5X1VMTCgweDA2ZjA2N2FhNzIxNzZmYmEpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDY5LFB5X1VMTCgweDBhNjM3ZGM1YTJjODk4YTYpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDcwLFB5X1VMTCgweDExM2Y5ODA0YmVmOTBkYWUpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDcxLFB5X1VMTCgweDFiNzEwYjM1MTMxYzQ3MWIpKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDcyLFB5X1VMTCgweDI4ZGI3N2Y1MjMwNDdkODQpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDczLFB5X1VMTCgweDMyY2FhYjdiNDBjNzI0OTMpKTsKKyAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDc0LFB5X1VMTCgweDNjOWViZTBhMTVjOWJlYmMpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDc1LFB5X1VMTCgweDQzMWQ2N2M0OWMxMDBkNGMpKTsKKyAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDc2LFB5X1VMTCgweDRjYzVkNGJlY2IzZTQyYjYpKTsKKyAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDc3LFB5X1VMTCgweDU5N2YyOTljZmM2NTdlMmEpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDc4LFB5X1VMTCgweDVmY2I2ZmFiM2FkNmZhZWMpKTsKKyAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDc5LFB5X1VMTCgweDZjNDQxOThjNGE0NzU4MTcpKTsKIAogI3VuZGVmIFJORCAgICAgCiAgICAgCkBAIC0yNTQsMTQgKzI1NCwxNCBAQAogc2hhNTEyX2luaXQoU0hBb2JqZWN0ICpzaGFfaW5mbykKIHsKICAgICBUZXN0RW5kaWFubmVzcyhzaGFfaW5mby0+RW5kaWFubmVzcykKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzBdID0gMHg2YTA5ZTY2N2YzYmNjOTA4VUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbMV0gPSAweGJiNjdhZTg1ODRjYWE3M2JVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFsyXSA9IDB4M2M2ZWYzNzJmZTk0ZjgyYlVMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzNdID0gMHhhNTRmZjUzYTVmMWQzNmYxVUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbNF0gPSAweDUxMGU1MjdmYWRlNjgyZDFVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFs1XSA9IDB4OWIwNTY4OGMyYjNlNmMxZlVMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzZdID0gMHgxZjgzZDlhYmZiNDFiZDZiVUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbN10gPSAweDViZTBjZDE5MTM3ZTIxNzlVTEw7CisgICAgc2hhX2luZm8tPmRpZ2VzdFswXSA9IFB5X1VMTCgweDZhMDllNjY3ZjNiY2M5MDgpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbMV0gPSBQeV9VTEwoMHhiYjY3YWU4NTg0Y2FhNzNiKTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzJdID0gUHlfVUxMKDB4M2M2ZWYzNzJmZTk0ZjgyYik7CisgICAgc2hhX2luZm8tPmRpZ2VzdFszXSA9IFB5X1VMTCgweGE1NGZmNTNhNWYxZDM2ZjEpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbNF0gPSBQeV9VTEwoMHg1MTBlNTI3ZmFkZTY4MmQxKTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzVdID0gUHlfVUxMKDB4OWIwNTY4OGMyYjNlNmMxZik7CisgICAgc2hhX2luZm8tPmRpZ2VzdFs2XSA9IFB5X1VMTCgweDFmODNkOWFiZmI0MWJkNmIpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbN10gPSBQeV9VTEwoMHg1YmUwY2QxOTEzN2UyMTc5KTsKICAgICBzaGFfaW5mby0+Y291bnRfbG8gPSAwTDsKICAgICBzaGFfaW5mby0+Y291bnRfaGkgPSAwTDsKICAgICBzaGFfaW5mby0+bG9jYWwgPSAwOwpAQCAtMjcyLDE0ICsyNzIsMTQgQEAKIHNoYTM4NF9pbml0KFNIQW9iamVjdCAqc2hhX2luZm8pCiB7CiAgICAgVGVzdEVuZGlhbm5lc3Moc2hhX2luZm8tPkVuZGlhbm5lc3MpCi0gICAgc2hhX2luZm8tPmRpZ2VzdFswXSA9IDB4Y2JiYjlkNWRjMTA1OWVkOFVMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzFdID0gMHg2MjlhMjkyYTM2N2NkNTA3VUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbMl0gPSAweDkxNTkwMTVhMzA3MGRkMTdVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFszXSA9IDB4MTUyZmVjZDhmNzBlNTkzOVVMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzRdID0gMHg2NzMzMjY2N2ZmYzAwYjMxVUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbNV0gPSAweDhlYjQ0YTg3Njg1ODE1MTFVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFs2XSA9IDB4ZGIwYzJlMGQ2NGY5OGZhN1VMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzddID0gMHg0N2I1NDgxZGJlZmE0ZmE0VUxMOworICAgIHNoYV9pbmZvLT5kaWdlc3RbMF0gPSBQeV9VTEwoMHhjYmJiOWQ1ZGMxMDU5ZWQ4KTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzFdID0gUHlfVUxMKDB4NjI5YTI5MmEzNjdjZDUwNyk7CisgICAgc2hhX2luZm8tPmRpZ2VzdFsyXSA9IFB5X1VMTCgweDkxNTkwMTVhMzA3MGRkMTcpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbM10gPSBQeV9VTEwoMHgxNTJmZWNkOGY3MGU1OTM5KTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzRdID0gUHlfVUxMKDB4NjczMzI2NjdmZmMwMGIzMSk7CisgICAgc2hhX2luZm8tPmRpZ2VzdFs1XSA9IFB5X1VMTCgweDhlYjQ0YTg3Njg1ODE1MTEpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbNl0gPSBQeV9VTEwoMHhkYjBjMmUwZDY0Zjk4ZmE3KTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzddID0gUHlfVUxMKDB4NDdiNTQ4MWRiZWZhNGZhNCk7CiAgICAgc2hhX2luZm8tPmNvdW50X2xvID0gMEw7CiAgICAgc2hhX2luZm8tPmNvdW50X2hpID0gMEw7CiAgICAgc2hhX2luZm8tPmxvY2FsID0gMDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IGM5ZGQ0YTMuLjE2NGE1ZDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtNjEsNiArNjEsMTUgQEAKIAogKi8KIAorI2lmZGVmIF9fQVBQTEVfXworICAvKgorICAgKiBpbmV0X2F0b24gaXMgbm90IGF2YWlsYWJsZSBvbiBPU1ggMTAuMywgeWV0IHdlIHdhbnQgdG8gdXNlIGEgYmluYXJ5CisgICAqIHRoYXQgd2FzIGJ1aWxkIG9uIDEwLjQgb3IgbGF0ZXIgdG8gd29yayBvbiB0aGF0IHJlbGVhc2UsIHdlYWsgbGlua2luZworICAgKiBjb21lcyB0byB0aGUgcmVzY3VlLgorICAgKi8KKyMgcHJhZ21hIHdlYWsgaW5ldF9hdG9uCisjZW5kaWYKKwogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCkBAIC05NSw3ICsxMDQsMTAgQEAKIGxpc3RlbihuKSAtLSBzdGFydCBsaXN0ZW5pbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zXG5cCiBtYWtlZmlsZShbbW9kZSwgW2J1ZnNpemVdXSkgLS0gcmV0dXJuIGEgZmlsZSBvYmplY3QgZm9yIHRoZSBzb2NrZXQgWypdXG5cCiByZWN2KGJ1ZmxlblssIGZsYWdzXSkgLS0gcmVjZWl2ZSBkYXRhXG5cCi1yZWN2ZnJvbShidWZsZW5bLCBmbGFnc10pIC0tIHJlY2VpdmUgZGF0YSBhbmQgc2VuZGVyJ3MgYWRkcmVzc1xuXAorcmVjdl9idWYoYnVmZmVyWywgbmJ5dGVzWywgZmxhZ3NdXSkgLS0gcmVjZWl2ZSBkYXRhIChpbnRvIGEgYnVmZmVyKVxuXAorcmVjdmZyb20oYnVmbGVuWywgZmxhZ3NdKSAtLSByZWNlaXZlIGRhdGEgYW5kIHNlbmRlclwncyBhZGRyZXNzXG5cCityZWN2ZnJvbV9idWYoYnVmZmVyWywgbmJ5dGVzLCBbLCBmbGFnc10pXG5cCisgIC0tIHJlY2VpdmUgZGF0YSBhbmQgc2VuZGVyXCdzIGFkZHJlc3MgKGludG8gYSBidWZmZXIpXG5cCiBzZW5kYWxsKGRhdGFbLCBmbGFnc10pIC0tIHNlbmQgYWxsIGRhdGFcblwKIHNlbmQoZGF0YVssIGZsYWdzXSkgLS0gc2VuZCBkYXRhLCBtYXkgbm90IHNlbmQgYWxsIG9mIGl0XG5cCiBzZW5kdG8oZGF0YVssIGZsYWdzXSwgYWRkcikgLS0gc2VuZCBkYXRhIHRvIGEgZ2l2ZW4gYWRkcmVzc1xuXApAQCAtMTk2LDcgKzIwOCw3IEBACiAgICBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGNvcnJlY3RseSBpZiBjb21waWxpbmcgd2l0aAogICAgTUlQU1BybyA3LnggaW4gQU5TSSBDIG1vZGUgKGRlZmF1bHQpICovCiAKLS8qIFhYWCBVc2luZyBfU0dJQVBJIGlzIHRoZSB3cm9uZyB0aGluZywgCisvKiBYWFggVXNpbmcgX1NHSUFQSSBpcyB0aGUgd3JvbmcgdGhpbmcsCiAgICBidXQgSSBkb24ndCBrbm93IHdoYXQgdGhlIHJpZ2h0IHRoaW5nIGlzLiAqLwogI3VuZGVmIF9TR0lBUEkgLyogdG8gYXZvaWQgd2FybmluZyAqLwogI2RlZmluZSBfU0dJQVBJIDEKQEAgLTIxNCw4ICsyMjYsOCBAQAogI2luY2x1ZGUgPG5ldGRiLmg+CiAjZW5kaWYKIAotLyogSXJpeCA2LjUgZmFpbHMgdG8gZGVmaW5lIHRoaXMgdmFyaWFibGUgYXQgYWxsLiBUaGlzIGlzIG5lZWRlZCAKLSAgIGZvciBib3RoIEdDQyBhbmQgU0dJJ3MgY29tcGlsZXIuIEknZCBzYXkgdGhhdCB0aGUgU0dJIGhlYWRlcnMgCisvKiBJcml4IDYuNSBmYWlscyB0byBkZWZpbmUgdGhpcyB2YXJpYWJsZSBhdCBhbGwuIFRoaXMgaXMgbmVlZGVkCisgICBmb3IgYm90aCBHQ0MgYW5kIFNHSSdzIGNvbXBpbGVyLiBJJ2Qgc2F5IHRoYXQgdGhlIFNHSSBoZWFkZXJzCiAgICBhcmUganVzdCBidXN0ZWQuIFNhbWUgdGhpbmcgZm9yIFNvbGFyaXMuICovCiAjaWYgKGRlZmluZWQoX19zZ2kpIHx8IGRlZmluZWQoc3VuKSkgJiYgIWRlZmluZWQoSU5FVF9BRERSU1RSTEVOKQogI2RlZmluZSBJTkVUX0FERFJTVFJMRU4gMTYKQEAgLTMwNiw2ICszMTgsMTEgQEAKICAgIG9sZGVyIHJlbGVhc2VzIGRvbid0IGhhdmUgKi8KICN1bmRlZiBIQVZFX0dFVEFERFJJTkZPCiAjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5FVF9BVE9OCisjZGVmaW5lIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKKyNlbmRpZgorCiAjZW5kaWYKIAogLyogSSBrbm93IHRoaXMgaXMgYSBiYWQgcHJhY3RpY2UsIGJ1dCBpdCBpcyB0aGUgZWFzaWVzdC4uLiAqLwpAQCAtMTE4MCwxMCArMTE5NywxMCBAQAogCQkJCWFyZ3MtPm9iX3R5cGUtPnRwX25hbWUpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGk6Z2V0c29ja2FkZHJhcmciLCAKKwkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGk6Z2V0c29ja2FkZHJhcmciLAogCQkJCSAgICAgICJpZG5hIiwgJmhvc3QsICZwb3J0KSkKIAkJCXJldHVybiAwOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwgCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFkZHIpLCAgQUZfSU5FVCk7CiAgICAgICAgICAgICAgICAgUHlNZW1fRnJlZShob3N0KTsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKQEAgLTEyMDMsMTIgKzEyMjAsMjAgQEAKIAkJaW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZCwgcmVzdWx0OwogIAkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KikmKHMtPnNvY2tfYWRkcikuaW42OwogCQlmbG93aW5mbyA9IHNjb3BlX2lkID0gMDsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGl8aWkiLCAKKwkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisJCQlQeUVycl9Gb3JtYXQoCisJCQkJUHlFeGNfVHlwZUVycm9yLAorCQkJCSJnZXRzb2NrYWRkcmFyZzogIgorCQkJCSJBRl9JTkVUNiBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAorCQkJCWFyZ3MtPm9iX3R5cGUtPnRwX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGl8aWkiLAogCQkJCSAgICAgICJpZG5hIiwgJmhvc3QsICZwb3J0LCAmZmxvd2luZm8sCiAJCQkJICAgICAgJnNjb3BlX2lkKSkgewogCQkJcmV0dXJuIDA7CiAJCX0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzZXRpcGFkZHIoaG9zdCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsICAKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZXRpcGFkZHIoaG9zdCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqYWRkciksIEFGX0lORVQ2KTsKICAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKGhvc3QpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQpAQCAtMTMwNSw2ICsxMzMwLDE0IEBACiAJCWNoYXIgKmhhZGRyID0gTlVMTDsKIAkJdW5zaWduZWQgaW50IGhhbGVuID0gMDsKIAorCQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKwkJCVB5RXJyX0Zvcm1hdCgKKwkJCQlQeUV4Y19UeXBlRXJyb3IsCisJCQkJImdldHNvY2thZGRyYXJnOiAiCisJCQkJIkFGX1BBQ0tFVCBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAorCQkJCWFyZ3MtPm9iX3R5cGUtPnRwX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KIAkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaXxpaXMjIiwgJmludGVyZmFjZU5hbWUsCiAJCQkJICAgICAgJnByb3RvTnVtYmVyLCAmcGt0dHlwZSwgJmhhdHlwZSwKIAkJCQkgICAgICAmaGFkZHIsICZoYWxlbikpCkBAIC0xODA5LDcgKzE4NDIsNyBAQAogCQkJCQlpbnQgcmVzX3NpemUgPSBzaXplb2YgcmVzOwogCQkJCQkvKiBJdCBtdXN0IGJlIGluIHRoZSBleGNlcHRpb24gc2V0ICovCiAJCQkJCWFzc2VydChGRF9JU1NFVChzLT5zb2NrX2ZkLCAmZmRzX2V4YykpOwotCQkJCQlpZiAoMCA9PSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAKKwkJCQkJaWYgKDAgPT0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwKIAkJCQkJICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZyZXMsICZyZXNfc2l6ZSkpCiAJCQkJCQkvKiBnZXRzb2Nrb3B0IGFsc28gY2xlYXJzIFdTQUdldExhc3RFcnJvciwKIAkJCQkJCSAgIHNvIHJlc2V0IGl0IGJhY2suICovCkBAIC0yMTA1LDk1ICsyMTM4LDEyNiBAQAogCiAjZW5kaWYgLyogTk9fRFVQICovCiAKKy8qCisgKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSByZWN2KCkgYW5kIHJlY3ZfYnVmKCkgbWV0aG9kcywgd2hpY2ggcmVhZHMgaW50byBhCisgKiBjaGFyIGJ1ZmZlci4gIElmIHlvdSBoYXZlIGFueSBpbmMvZGVmIHJlZiB0byBkbyB0byB0aGUgb2JqZWN0cyB0aGF0IGNvbnRhaW4KKyAqIHRoZSBidWZmZXIsIGRvIGl0IGluIHRoZSBjYWxsZXIuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICogc3VjY2VzZnVsbHkgcmVhZC4gIElmIHRoZXJlIHdhcyBhbiBlcnJvciwgaXQgcmV0dXJucyAtMS4gIE5vdGUgdGhhdCBpdCBpcworICogYWxzbyBwb3NzaWJsZSB0aGF0IHdlIHJldHVybiBhIG51bWJlciBvZiBieXRlcyBzbWFsbGVyIHRoYW4gdGhlIHJlcXVlc3QKKyAqIGJ5dGVzLgorICovCitzdGF0aWMgaW50Citzb2NrX3JlY3ZfZ3V0cyhQeVNvY2tldFNvY2tPYmplY3QgKnMsIGNoYXIqIGNidWYsIGludCBsZW4sIGludCBmbGFncykKK3sKKyAgICAgICAgaW50IHRpbWVvdXQsIG91dGxlbiA9IDA7CisjaWZkZWYgX19WTVMKKwlpbnQgcmVtYWluaW5nLCBucmVhZDsKKwljaGFyICpyZWFkX2J1ZjsKKyNlbmRpZgorCisJaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7CisJCXNlbGVjdF9lcnJvcigpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZuZGVmIF9fVk1TCisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisJaWYgKCF0aW1lb3V0KQorCQlvdXRsZW4gPSByZWN2KHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MpOworCVB5X0VORF9BTExPV19USFJFQURTCisKKwlpZiAodGltZW91dCkgeworCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAob3V0bGVuIDwgMCkgeworCQkvKiBOb3RlOiB0aGUgY2FsbCB0byBlcnJvcmhhbmRsZXIoKSBBTFdBWVMgaW5kaXJlY3RseSByZXR1cm5lZAorCQkgICBOVUxMLCBzbyBpZ25vcmUgaXRzIHJldHVybiB2YWx1ZSAqLworCQlzLT5lcnJvcmhhbmRsZXIoKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbHNlCisJcmVhZF9idWYgPSBjYnVmOworCXJlbWFpbmluZyA9IGxlbjsKKwl3aGlsZSAocmVtYWluaW5nICE9IDApIHsKKwkJdW5zaWduZWQgaW50IHNlZ21lbnQ7CisKKwkJc2VnbWVudCA9IHJlbWFpbmluZyAvU0VHTUVOVF9TSVpFOworCQlpZiAoc2VnbWVudCAhPSAwKSB7CisJCQlzZWdtZW50ID0gU0VHTUVOVF9TSVpFOworCQl9CisJCWVsc2UgeworCQkJc2VnbWVudCA9IHJlbWFpbmluZzsKKwkJfQorCisJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwkJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKKwkJaWYgKCF0aW1lb3V0KQorCQkJbnJlYWQgPSByZWN2KHMtPnNvY2tfZmQsIHJlYWRfYnVmLCBzZWdtZW50LCBmbGFncyk7CisJCVB5X0VORF9BTExPV19USFJFQURTCisKKwkJaWYgKHRpbWVvdXQpIHsKKwkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChucmVhZCA8IDApIHsKKwkJCXMtPmVycm9yaGFuZGxlcigpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChucmVhZCAhPSByZW1haW5pbmcpIHsKKwkJCXJlYWRfYnVmICs9IG5yZWFkOworCQkJYnJlYWs7CisJCX0KKworCQlyZW1haW5pbmcgLT0gc2VnbWVudDsKKwkJcmVhZF9idWYgKz0gc2VnbWVudDsKKwl9CisJb3V0bGVuID0gcmVhZF9idWYgLSBjYnVmOworI2VuZGlmIC8qICFfX1ZNUyAqLworCisJcmV0dXJuIG91dGxlbjsKK30KKwogCiAvKiBzLnJlY3YobmJ5dGVzIFssZmxhZ3NdKSBtZXRob2QgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfcmVjdihQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBsZW4sIG4gPSAwLCBmbGFncyA9IDAsIHRpbWVvdXQ7CisJaW50IHJlY3ZsZW4sIGZsYWdzID0gMCwgb3V0bGVuOwogCVB5T2JqZWN0ICpidWY7Ci0jaWZkZWYgX19WTVMKLQlpbnQgcmVhZF9sZW5ndGg7Ci0JY2hhciAqcmVhZF9idWY7Ci0jZW5kaWYKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3YiLCAmbGVuLCAmZmxhZ3MpKQorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3YiLCAmcmVjdmxlbiwgJmZsYWdzKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAobGVuIDwgMCkgeworCWlmIChyZWN2bGVuIDwgMCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKIAkJCQkibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2Iik7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCWJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIGxlbik7CisJLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nLiAqLworCWJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOwogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpCi0JCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKLQotI2lmbmRlZiBfX1ZNUwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCWlmICghdGltZW91dCkKLQkJbiA9IHJlY3Yocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0KLQlpZiAodGltZW91dCkgeworCS8qIENhbGwgdGhlIGd1dHMgKi8KKwlvdXRsZW4gPSBzb2NrX3JlY3ZfZ3V0cyhzLCBQeVN0cmluZ19Bc1N0cmluZyhidWYpLCByZWN2bGVuLCBmbGFncyk7CisJaWYgKG91dGxlbiA8IDApIHsKKwkJLyogQW4gZXJyb3Igb2NjdXJlZCwgcmVsZWFzZSB0aGUgc3RyaW5nIGFuZCByZXR1cm4gYW4KKwkJICAgZXJyb3IuICovCiAJCVB5X0RFQ1JFRihidWYpOwotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChuIDwgMCkgewotCQlQeV9ERUNSRUYoYnVmKTsKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCX0KLQlpZiAobiAhPSBsZW4pCi0JCV9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgbik7Ci0jZWxzZQotCXJlYWRfYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcoYnVmKTsKLQlyZWFkX2xlbmd0aCA9IGxlbjsKLQl3aGlsZSAocmVhZF9sZW5ndGggIT0gMCkgewotCQl1bnNpZ25lZCBpbnQgc2VnbWVudDsKLQotCQlzZWdtZW50ID0gcmVhZF9sZW5ndGggL1NFR01FTlRfU0laRTsKLQkJaWYgKHNlZ21lbnQgIT0gMCkgewotCQkJc2VnbWVudCA9IFNFR01FTlRfU0laRTsKLQkJfQotCQllbHNlIHsKLQkJCXNlZ21lbnQgPSByZWFkX2xlbmd0aDsKLQkJfQotCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKLQkJaWYgKCF0aW1lb3V0KQotCQkJbiA9IHJlY3Yocy0+c29ja19mZCwgcmVhZF9idWYsIHNlZ21lbnQsIGZsYWdzKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQotCQlpZiAodGltZW91dCkgewotCQkJUHlfREVDUkVGKGJ1Zik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKwlpZiAob3V0bGVuICE9IHJlY3ZsZW4pIHsKKwkJLyogV2UgZGlkIG5vdCByZWFkIGFzIG1hbnkgYnl0ZXMgYXMgd2UgYW50aWNpcGF0ZWQsIHJlc2l6ZSB0aGUKKwkJICAgc3RyaW5nIGlmIHBvc3NpYmxlIGFuZCBiZSBzdWNjZXNmdWwuICovCisJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYsIG91dGxlbikgPCAwKQorCQkJLyogT29wc3ksIG5vdCBzbyBzdWNjZXNmdWwgYWZ0ZXIgYWxsLiAqLwogCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKG4gPCAwKSB7Ci0JCQlQeV9ERUNSRUYoYnVmKTsKLQkJCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQkJfQotCQlpZiAobiAhPSByZWFkX2xlbmd0aCkgewotCQkJcmVhZF9idWYgKz0gbjsKLQkJCWJyZWFrOwotCQl9CisJfQogCi0JCXJlYWRfbGVuZ3RoIC09IHNlZ21lbnQ7Ci0JCXJlYWRfYnVmICs9IHNlZ21lbnQ7Ci0JfQotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYsIChyZWFkX2J1ZiAtIFB5U3RyaW5nX0FzU3RyaW5nKGJ1ZikpKSA8IDApCi0JewotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0jZW5kaWYgLyogIV9fVk1TICovCiAJcmV0dXJuIGJ1ZjsKIH0KIApAQCAtMjIwNiwyOSArMjI3MCw5MCBAQAogdGhlIHJlbW90ZSBlbmQgaXMgY2xvc2VkIGFuZCBhbGwgZGF0YSBpcyByZWFkLCByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4iKTsKIAogCi0vKiBzLnJlY3Zmcm9tKG5ieXRlcyBbLGZsYWdzXSkgbWV0aG9kICovCisvKiBzLnJlY3ZfYnVmKGJ1ZmZlciwgW25ieXRlcyBbLGZsYWdzXV0pIG1ldGhvZCAqLwogCi1zdGF0aWMgUHlPYmplY3QgKgotc29ja19yZWN2ZnJvbShQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQorc3RhdGljIFB5T2JqZWN0Kgorc29ja19yZWN2X2J1ZihQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJuYnl0ZXMiLCAiZmxhZ3MiLCAwfTsKKworCWludCByZWN2bGVuID0gMCwgZmxhZ3MgPSAwLCByZWFkbGVuOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmbGVuOworCisJLyogR2V0IHRoZSBidWZmZXIncyBtZW1vcnkgKi8KKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAicyN8aWk6cmVjdiIsIGt3bGlzdCwKKwkJCQkJICZidWYsICZidWZsZW4sICZyZWN2bGVuLCAmZmxhZ3MpKQorCQlyZXR1cm4gTlVMTDsKKwlhc3NlcnQoYnVmICE9IDAgJiYgYnVmbGVuID4gMCk7CisKKwlpZiAocmVjdmxlbiA8IDApIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkJIm5lZ2F0aXZlIGJ1ZmZlcnNpemUgaW4gcmVjdiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHJlY3ZsZW4gPT0gMCkgeworICAgICAgICAgICAgLyogSWYgbmJ5dGVzIHdhcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGJ1ZmZlcidzIGxlbmd0aCAqLworICAgICAgICAgICAgcmVjdmxlbiA9IGJ1ZmxlbjsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCAqLworCWlmIChidWZsZW4gPCByZWN2bGVuKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorCQkJCSJidWZmZXIgdG9vIHNtYWxsIGZvciByZXF1ZXN0ZWQgYnl0ZXMiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogQ2FsbCB0aGUgZ3V0cyAqLworCXJlYWRsZW4gPSBzb2NrX3JlY3ZfZ3V0cyhzLCBidWYsIHJlY3ZsZW4sIGZsYWdzKTsKKwlpZiAocmVhZGxlbiA8IDApIHsKKwkJLyogUmV0dXJuIGFuIGVycm9yLiAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBkbyBhbnl0aGluZworCSAgIHNwZWNpYWwgaGVyZSBpbiB0aGUgY2FzZSB0aGF0IHJlYWRsZW4gPCByZWN2bGVuLiAqLworCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZWFkbGVuKTsKK30KKworUHlEb2NfU1RSVkFSKHJlY3ZfYnVmX2RvYywKKyJyZWN2X2J1ZihidWZmZXIsIFtuYnl0ZXNbLCBmbGFnc11dKSAtPiBuYnl0ZXNfcmVhZFxuXAorXG5cCitBIHZlcnNpb24gb2YgcmVjdigpIHRoYXQgc3RvcmVzIGl0cyBkYXRhIGludG8gYSBidWZmZXIgcmF0aGVyIHRoYW4gY3JlYXRpbmcgXG5cCithIG5ldyBzdHJpbmcuICBSZWNlaXZlIHVwIHRvIGJ1ZmZlcnNpemUgYnl0ZXMgZnJvbSB0aGUgc29ja2V0LiAgSWYgYnVmZmVyc2l6ZSBcblwKK2lzIG5vdCBzcGVjaWZpZWQgKG9yIDApLCByZWNlaXZlIHVwIHRvIHRoZSBzaXplIGF2YWlsYWJsZSBpbiB0aGUgZ2l2ZW4gYnVmZmVyLlxuXAorXG5cCitTZWUgcmVjdigpIGZvciBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBmbGFncy4iKTsKKworCisvKgorICogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgcmVjdigpIGFuZCByZWN2X2J1ZigpIG1ldGhvZHMsIHdoaWNoIHJlYWRzIGludG8gYQorICogY2hhciBidWZmZXIuICBJZiB5b3UgaGF2ZSBhbnkgaW5jL2RlZiByZWYgdG8gZG8gdG8gdGhlIG9iamVjdHMgdGhhdCBjb250YWluCisgKiB0aGUgYnVmZmVyLCBkbyBpdCBpbiB0aGUgY2FsbGVyLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIHN1Y2Nlc2Z1bGx5IHJlYWQuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGl0IHJldHVybnMgLTEuICBOb3RlIHRoYXQgaXQgaXMKKyAqIGFsc28gcG9zc2libGUgdGhhdCB3ZSByZXR1cm4gYSBudW1iZXIgb2YgYnl0ZXMgc21hbGxlciB0aGFuIHRoZSByZXF1ZXN0CisgKiBieXRlcy4KKyAqCisgKiAnYWRkcicgaXMgYSByZXR1cm4gdmFsdWUgZm9yIHRoZSBhZGRyZXNzIG9iamVjdC4gIE5vdGUgdGhhdCB5b3UgbXVzdCBkZWNyZWYKKyAqIGl0IHlvdXJzZWxmLgorICovCitzdGF0aWMgaW50Citzb2NrX3JlY3Zmcm9tX2d1dHMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBjaGFyKiBjYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsCisJCSAgIFB5T2JqZWN0KiogYWRkcikKIHsKIAlzb2NrX2FkZHJfdCBhZGRyYnVmOwotCVB5T2JqZWN0ICpidWYgPSBOVUxMOwotCVB5T2JqZWN0ICphZGRyID0gTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgbGVuLCBuID0gMCwgZmxhZ3MgPSAwLCB0aW1lb3V0OworCWludCBuID0gMCwgdGltZW91dDsKIAlzb2NrbGVuX3QgYWRkcmxlbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3Zmcm9tIiwgJmxlbiwgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CisJKmFkZHIgPSBOVUxMOwogCiAJaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCi0JCXJldHVybiBOVUxMOwotCWJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIGxlbik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC0xOwogCi0JaWYgKCFJU19TRUxFQ1RBQkxFKHMpKQotCQlyZXR1cm4gc2VsZWN0X2Vycm9yKCk7CisJaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7CisJCXNlbGVjdF9lcnJvcigpOworCQlyZXR1cm4gLTE7CisJfQogCiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCW1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7CkBAIC0yMjM2LDQxICsyMzYxLDcxIEBACiAJaWYgKCF0aW1lb3V0KSB7CiAjaWZuZGVmIE1TX1dJTkRPV1MKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiAhZGVmaW5lZChQWUNDX0dDQykKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCBsZW4sIGZsYWdzLAorCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKIAkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2Vsc2UKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCBsZW4sIGZsYWdzLAorCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKIAkJCSAgICAgKHZvaWQgKikgJmFkZHJidWYsICZhZGRybGVuKTsKICNlbmRpZgogI2Vsc2UKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCBsZW4sIGZsYWdzLAorCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKIAkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2VuZGlmCiAJfQogCVB5X0VORF9BTExPV19USFJFQURTCiAKIAlpZiAodGltZW91dCkgewotCQlQeV9ERUNSRUYoYnVmKTsKIAkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLTE7CiAJfQogCWlmIChuIDwgMCkgewotCQlQeV9ERUNSRUYoYnVmKTsKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworCQlzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAJfQogCi0JaWYgKG4gIT0gbGVuICYmIF9QeVN0cmluZ19SZXNpemUoJmJ1ZiwgbikgPCAwKQorCWlmICghKCphZGRyID0gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJidWYsCisJCQkJICAgYWRkcmxlbiwgcy0+c29ja19wcm90bykpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbjsKK30KKworLyogcy5yZWN2ZnJvbShuYnl0ZXMgWyxmbGFnc10pIG1ldGhvZCAqLworCitzdGF0aWMgUHlPYmplY3QgKgorc29ja19yZWN2ZnJvbShQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQoreworCVB5T2JqZWN0ICpidWYgPSBOVUxMOworCVB5T2JqZWN0ICphZGRyID0gTlVMTDsKKwlQeU9iamVjdCAqcmV0ID0gTlVMTDsKKwlpbnQgcmVjdmxlbiwgb3V0bGVuLCBmbGFncyA9IDA7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8aTpyZWN2ZnJvbSIsICZyZWN2bGVuLCAmZmxhZ3MpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghKGFkZHIgPSBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwKLQkJCQkgIGFkZHJsZW4sIHMtPnNvY2tfcHJvdG8pKSkKKwlidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCByZWN2bGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJb3V0bGVuID0gc29ja19yZWN2ZnJvbV9ndXRzKHMsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLAorCQkJCSAgICByZWN2bGVuLCBmbGFncywgJmFkZHIpOworCWlmIChvdXRsZW4gPCAwKSB7CiAJCWdvdG8gZmluYWxseTsKKwl9CisKKwlpZiAob3V0bGVuICE9IHJlY3ZsZW4pIHsKKwkJLyogV2UgZGlkIG5vdCByZWFkIGFzIG1hbnkgYnl0ZXMgYXMgd2UgYW50aWNpcGF0ZWQsIHJlc2l6ZSB0aGUKKwkJICAgc3RyaW5nIGlmIHBvc3NpYmxlIGFuZCBiZSBzdWNjZXNmdWwuICovCisJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYsIG91dGxlbikgPCAwKQorCQkJLyogT29wc3ksIG5vdCBzbyBzdWNjZXNmdWwgYWZ0ZXIgYWxsLiAqLworCQkJZ290byBmaW5hbGx5OworCX0KIAogCXJldCA9IFB5VHVwbGVfUGFjaygyLCBidWYsIGFkZHIpOwogCiBmaW5hbGx5OgotCVB5X1hERUNSRUYoYWRkcik7CiAJUHlfWERFQ1JFRihidWYpOworCVB5X1hERUNSRUYoYWRkcik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjI3OSw2ICsyNDM0LDU3IEBACiBcblwKIExpa2UgcmVjdihidWZmZXJzaXplLCBmbGFncykgYnV0IGFsc28gcmV0dXJuIHRoZSBzZW5kZXIncyBhZGRyZXNzIGluZm8uIik7CiAKKworLyogcy5yZWN2ZnJvbV9idWYoYnVmZmVyWywgbmJ5dGVzIFssZmxhZ3NdXSkgbWV0aG9kICovCisKK3N0YXRpYyBQeU9iamVjdCAqCitzb2NrX3JlY3Zmcm9tX2J1ZihQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCoga3dkcykKK3sKKwlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJuYnl0ZXMiLCAiZmxhZ3MiLCAwfTsKKworCWludCByZWN2bGVuID0gMCwgZmxhZ3MgPSAwLCByZWFkbGVuOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmbGVuOworCisJUHlPYmplY3QgKmFkZHIgPSBOVUxMOworCVB5T2JqZWN0ICpyZXQgPSBOVUxMOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInMjfGlpOnJlY3Zmcm9tIiwga3dsaXN0LAorCQkJCQkgJmJ1ZiwgJmJ1ZmxlbiwgJnJlY3ZsZW4sICZmbGFncykpCisJCXJldHVybiBOVUxMOworCWFzc2VydChidWYgIT0gMCAmJiBidWZsZW4gPiAwKTsKKworCWlmIChyZWN2bGVuIDwgMCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKwkJCQkibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2Iik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAocmVjdmxlbiA9PSAwKSB7CisgICAgICAgICAgICAvKiBJZiBuYnl0ZXMgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYnVmZmVyJ3MgbGVuZ3RoICovCisgICAgICAgICAgICByZWN2bGVuID0gYnVmbGVuOworCX0KKworCXJlYWRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgYnVmLCByZWN2bGVuLCBmbGFncywgJmFkZHIpOworCWlmIChyZWFkbGVuIDwgMCkgeworCQkvKiBSZXR1cm4gYW4gZXJyb3IgKi8KKwkJZ290byBmaW5hbGx5OworCX0KKworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYW5kIHRoZSBhZGRyZXNzLiAgTm90ZSB0aGF0IHdlIGRvCisJICAgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgaGVyZSBpbiB0aGUgY2FzZSB0aGF0IHJlYWRsZW4gPCByZWN2bGVuLiAqLworCXJldCA9IFB5VHVwbGVfUGFjaygyLCBQeUludF9Gcm9tTG9uZyhyZWFkbGVuKSwgYWRkcik7CisJCitmaW5hbGx5OgorCVB5X1hERUNSRUYoYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworUHlEb2NfU1RSVkFSKHJlY3Zmcm9tX2J1Zl9kb2MsCisicmVjdmZyb21fYnVmKGJ1ZmZlclssIG5ieXRlc1ssIGZsYWdzXV0pIC0+IChuYnl0ZXMsIGFkZHJlc3MgaW5mbylcblwKK1xuXAorTGlrZSByZWN2X2J1ZihidWZmZXJbLCBuYnl0ZXNbLCBmbGFnc11dKSBidXQgYWxzbyByZXR1cm4gdGhlIHNlbmRlcidzIGFkZHJlc3MgaW5mby4iKTsKKworCiAvKiBzLnNlbmQoZGF0YSBbLGZsYWdzXSkgbWV0aG9kICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yNDczLDU5ICsyNjc5LDYzIEBACiAvKiBMaXN0IG9mIG1ldGhvZHMgZm9yIHNvY2tldCBvYmplY3RzICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzb2NrX21ldGhvZHNbXSA9IHsKLQl7ImFjY2VwdCIsCShQeUNGdW5jdGlvbilzb2NrX2FjY2VwdCwgTUVUSF9OT0FSR1MsCi0JCQlhY2NlcHRfZG9jfSwKLQl7ImJpbmQiLAkoUHlDRnVuY3Rpb24pc29ja19iaW5kLCBNRVRIX08sCi0JCQliaW5kX2RvY30sCi0JeyJjbG9zZSIsCShQeUNGdW5jdGlvbilzb2NrX2Nsb3NlLCBNRVRIX05PQVJHUywKLQkJCWNsb3NlX2RvY30sCi0JeyJjb25uZWN0IiwJKFB5Q0Z1bmN0aW9uKXNvY2tfY29ubmVjdCwgTUVUSF9PLAotCQkJY29ubmVjdF9kb2N9LAotCXsiY29ubmVjdF9leCIsCShQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3RfZXgsIE1FVEhfTywKLQkJCWNvbm5lY3RfZXhfZG9jfSwKKwl7ImFjY2VwdCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfYWNjZXB0LCBNRVRIX05PQVJHUywKKwkJCSAgYWNjZXB0X2RvY30sCisJeyJiaW5kIiwJICAoUHlDRnVuY3Rpb24pc29ja19iaW5kLCBNRVRIX08sCisJCQkgIGJpbmRfZG9jfSwKKwl7ImNsb3NlIiwJICAoUHlDRnVuY3Rpb24pc29ja19jbG9zZSwgTUVUSF9OT0FSR1MsCisJCQkgIGNsb3NlX2RvY30sCisJeyJjb25uZWN0IiwJICAoUHlDRnVuY3Rpb24pc29ja19jb25uZWN0LCBNRVRIX08sCisJCQkgIGNvbm5lY3RfZG9jfSwKKwl7ImNvbm5lY3RfZXgiLAkgIChQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3RfZXgsIE1FVEhfTywKKwkJCSAgY29ubmVjdF9leF9kb2N9LAogI2lmbmRlZiBOT19EVVAKLQl7ImR1cCIsCQkoUHlDRnVuY3Rpb24pc29ja19kdXAsIE1FVEhfTk9BUkdTLAotCQkJZHVwX2RvY30sCisJeyJkdXAiLAkJICAoUHlDRnVuY3Rpb24pc29ja19kdXAsIE1FVEhfTk9BUkdTLAorCQkJICBkdXBfZG9jfSwKICNlbmRpZgotCXsiZmlsZW5vIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfZmlsZW5vLCBNRVRIX05PQVJHUywKLQkJCWZpbGVub19kb2N9LAorCXsiZmlsZW5vIiwJICAoUHlDRnVuY3Rpb24pc29ja19maWxlbm8sIE1FVEhfTk9BUkdTLAorCQkJICBmaWxlbm9fZG9jfSwKICNpZmRlZiBIQVZFX0dFVFBFRVJOQU1FCi0JeyJnZXRwZWVybmFtZSIsCShQeUNGdW5jdGlvbilzb2NrX2dldHBlZXJuYW1lLAotCQkJTUVUSF9OT0FSR1MsIGdldHBlZXJuYW1lX2RvY30sCisJeyJnZXRwZWVybmFtZSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0cGVlcm5hbWUsCisJCQkgIE1FVEhfTk9BUkdTLCBnZXRwZWVybmFtZV9kb2N9LAogI2VuZGlmCi0JeyJnZXRzb2NrbmFtZSIsCShQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tuYW1lLAotCQkJTUVUSF9OT0FSR1MsIGdldHNvY2tuYW1lX2RvY30sCi0JeyJnZXRzb2Nrb3B0IiwJKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0c29ja29wdCwgTUVUSF9WQVJBUkdTLAotCQkJZ2V0c29ja29wdF9kb2N9LAotCXsibGlzdGVuIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfbGlzdGVuLCBNRVRIX08sCi0JCQlsaXN0ZW5fZG9jfSwKKwl7ImdldHNvY2tuYW1lIiwJICAoUHlDRnVuY3Rpb24pc29ja19nZXRzb2NrbmFtZSwKKwkJCSAgTUVUSF9OT0FSR1MsIGdldHNvY2tuYW1lX2RvY30sCisJeyJnZXRzb2Nrb3B0IiwJICAoUHlDRnVuY3Rpb24pc29ja19nZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCisJCQkgIGdldHNvY2tvcHRfZG9jfSwKKwl7Imxpc3RlbiIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfbGlzdGVuLCBNRVRIX08sCisJCQkgIGxpc3Rlbl9kb2N9LAogI2lmbmRlZiBOT19EVVAKLQl7Im1ha2VmaWxlIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfbWFrZWZpbGUsIE1FVEhfVkFSQVJHUywKLQkJCW1ha2VmaWxlX2RvY30sCisJeyJtYWtlZmlsZSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfbWFrZWZpbGUsIE1FVEhfVkFSQVJHUywKKwkJCSAgbWFrZWZpbGVfZG9jfSwKICNlbmRpZgotCXsicmVjdiIsCShQeUNGdW5jdGlvbilzb2NrX3JlY3YsIE1FVEhfVkFSQVJHUywKLQkJCXJlY3ZfZG9jfSwKLQl7InJlY3Zmcm9tIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdmZyb20sIE1FVEhfVkFSQVJHUywKLQkJCXJlY3Zmcm9tX2RvY30sCi0JeyJzZW5kIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZCwgTUVUSF9WQVJBUkdTLAotCQkJc2VuZF9kb2N9LAotCXsic2VuZGFsbCIsCShQeUNGdW5jdGlvbilzb2NrX3NlbmRhbGwsIE1FVEhfVkFSQVJHUywKLQkJCXNlbmRhbGxfZG9jfSwKLQl7InNlbmR0byIsCShQeUNGdW5jdGlvbilzb2NrX3NlbmR0bywgTUVUSF9WQVJBUkdTLAotCQkJc2VuZHRvX2RvY30sCi0JeyJzZXRibG9ja2luZyIsCShQeUNGdW5jdGlvbilzb2NrX3NldGJsb2NraW5nLCBNRVRIX08sCi0JCQlzZXRibG9ja2luZ19kb2N9LAotCXsic2V0dGltZW91dCIsIChQeUNGdW5jdGlvbilzb2NrX3NldHRpbWVvdXQsIE1FVEhfTywKLQkJCXNldHRpbWVvdXRfZG9jfSwKLQl7ImdldHRpbWVvdXQiLCAoUHlDRnVuY3Rpb24pc29ja19nZXR0aW1lb3V0LCBNRVRIX05PQVJHUywKLQkJCWdldHRpbWVvdXRfZG9jfSwKLQl7InNldHNvY2tvcHQiLAkoUHlDRnVuY3Rpb24pc29ja19zZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCi0JCQlzZXRzb2Nrb3B0X2RvY30sCi0JeyJzaHV0ZG93biIsCShQeUNGdW5jdGlvbilzb2NrX3NodXRkb3duLCBNRVRIX08sCi0JCQlzaHV0ZG93bl9kb2N9LAorCXsicmVjdiIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdiwgTUVUSF9WQVJBUkdTLAorCQkJICByZWN2X2RvY30sCisJeyJyZWN2X2J1ZiIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdl9idWYsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisJCQkgIHJlY3ZfYnVmX2RvY30sCisJeyJyZWN2ZnJvbSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdmZyb20sIE1FVEhfVkFSQVJHUywKKwkJCSAgcmVjdmZyb21fZG9jfSwKKwl7InJlY3Zmcm9tX2J1ZiIsICAoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbV9idWYsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisJCQkgIHJlY3Zmcm9tX2J1Zl9kb2N9LAorCXsic2VuZCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZCwgTUVUSF9WQVJBUkdTLAorCQkJICBzZW5kX2RvY30sCisJeyJzZW5kYWxsIiwJICAoUHlDRnVuY3Rpb24pc29ja19zZW5kYWxsLCBNRVRIX1ZBUkFSR1MsCisJCQkgIHNlbmRhbGxfZG9jfSwKKwl7InNlbmR0byIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZHRvLCBNRVRIX1ZBUkFSR1MsCisJCQkgIHNlbmR0b19kb2N9LAorCXsic2V0YmxvY2tpbmciLAkgIChQeUNGdW5jdGlvbilzb2NrX3NldGJsb2NraW5nLCBNRVRIX08sCisJCQkgIHNldGJsb2NraW5nX2RvY30sCisJeyJzZXR0aW1lb3V0IiwgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0dGltZW91dCwgTUVUSF9PLAorCQkJICBzZXR0aW1lb3V0X2RvY30sCisJeyJnZXR0aW1lb3V0IiwgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0dGltZW91dCwgTUVUSF9OT0FSR1MsCisJCQkgIGdldHRpbWVvdXRfZG9jfSwKKwl7InNldHNvY2tvcHQiLAkgIChQeUNGdW5jdGlvbilzb2NrX3NldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKKwkJCSAgc2V0c29ja29wdF9kb2N9LAorCXsic2h1dGRvd24iLAkgIChQeUNGdW5jdGlvbilzb2NrX3NodXRkb3duLCBNRVRIX08sCisJCQkgIHNodXRkb3duX2RvY30sCiAjaWZkZWYgUklTQ09TCi0JeyJzbGVlcHRhc2t3IiwJKFB5Q0Z1bmN0aW9uKXNvY2tfc2xlZXB0YXNrdywgTUVUSF9PLAotCSAJCXNsZWVwdGFza3dfZG9jfSwKKwl7InNsZWVwdGFza3ciLAkgIChQeUNGdW5jdGlvbilzb2NrX3NsZWVwdGFza3csIE1FVEhfTywKKwkgCQkgIHNsZWVwdGFza3dfZG9jfSwKICNlbmRpZgogCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwogfTsKQEAgLTMzMzMsNyArMzU0Myw5IEBACiAjZW5kaWYKICNpZmRlZiBIQVZFX0lORVRfQVRPTgogCXN0cnVjdCBpbl9hZGRyIGJ1ZjsKLSNlbHNlCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfSU5FVF9BVE9OKSB8fCBkZWZpbmVkKFVTRV9JTkVUX0FUT05fV0VBS0xJTkspCiAJLyogSGF2ZSB0byB1c2UgaW5ldF9hZGRyKCkgaW5zdGVhZCAqLwogCXVuc2lnbmVkIGxvbmcgcGFja2VkX2FkZHI7CiAjZW5kaWYKQEAgLTMzNDQsNiArMzU1NiwxMCBAQAogCiAKICNpZmRlZiBIQVZFX0lORVRfQVRPTgorCisjaWZkZWYgVVNFX0lORVRfQVRPTl9XRUFLTElOSworICAgIGlmIChpbmV0X2F0b24gIT0gTlVMTCkgeworI2VuZGlmCiAJaWYgKGluZXRfYXRvbihpcF9hZGRyLCAmYnVmKSkKIAkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopKCZidWYpLAogCQkJCQkJICBzaXplb2YoYnVmKSk7CkBAIC0zMzUyLDEzICszNTY4LDIwIEBACiAJCQkiaWxsZWdhbCBJUCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9hdG9uIik7CiAJcmV0dXJuIE5VTEw7CiAKLSNlbHNlIC8qICEgSEFWRV9JTkVUX0FUT04gKi8KKyNpZmRlZiBVU0VfSU5FVF9BVE9OX1dFQUtMSU5LCisgICB9IGVsc2UgeworI2VuZGlmCisKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JTkVUX0FUT04pIHx8IGRlZmluZWQoVVNFX0lORVRfQVRPTl9XRUFLTElOSykKKwogCS8qIHNwZWNpYWwtY2FzZSB0aGlzIGFkZHJlc3MgYXMgaW5ldF9hZGRyIG1pZ2h0IHJldHVybiBJTkFERFJfTk9ORQogCSAqIGZvciB0aGlzICovCiAJaWYgKHN0cmNtcChpcF9hZGRyLCAiMjU1LjI1NS4yNTUuMjU1IikgPT0gMCkgewogCQlwYWNrZWRfYWRkciA9IDB4RkZGRkZGRkY7CiAJfSBlbHNlIHsKLQkKKwogCQlwYWNrZWRfYWRkciA9IGluZXRfYWRkcihpcF9hZGRyKTsKIAogCQlpZiAocGFja2VkX2FkZHIgPT0gSU5BRERSX05PTkUpIHsJLyogaW52YWxpZCBhZGRyZXNzICovCkBAIC0zMzY5LDYgKzM1OTIsMTEgQEAKIAl9CiAJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopICZwYWNrZWRfYWRkciwKIAkJCQkJICBzaXplb2YocGFja2VkX2FkZHIpKTsKKworI2lmZGVmIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKKyAgIH0KKyNlbmRpZgorCiAjZW5kaWYKIH0KIApAQCAtMzQyOCw3ICszNjU2LDcgQEAKIAkJCQkiY2FuJ3QgdXNlIEFGX0lORVQ2LCBJUHY2IGlzIGRpc2FibGVkIik7CiAJCXJldHVybiBOVUxMOwogCX0KLSNlbmRpZiAKKyNlbmRpZgogCiAJcmV0dmFsID0gaW5ldF9wdG9uKGFmLCBpcCwgcGFja2VkKTsKIAlpZiAocmV0dmFsIDwgMCkgewpAQCAtMzQ1MSw3ICszNjc5LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogfQotCQorCiBQeURvY19TVFJWQVIoaW5ldF9udG9wX2RvYywKICJpbmV0X250b3AoYWYsIHBhY2tlZF9pcCkgLT4gc3RyaW5nIGZvcm1hdHRlZCBJUCBhZGRyZXNzXG5cCiBcblwKQEAgLTM0NjksNyArMzY5Nyw3IEBACiAjZWxzZQogCWNoYXIgaXBbSU5FVF9BRERSU1RSTEVOICsgMV07CiAjZW5kaWYKLQkKKwogCS8qIEd1YXJhbnRlZSBOVUwtdGVybWluYXRpb24gZm9yIFB5U3RyaW5nX0Zyb21TdHJpbmcoKSBiZWxvdyAqLwogCW1lbXNldCgodm9pZCAqKSAmaXBbMF0sICdcMCcsIHNpemVvZihpcCkpOwogCkBAIC0zNTQ3LDcgKzM3NzUsNyBAQAogCX0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soaG9iaikpIHsKIAkJaHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGhvYmopOwogCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAorCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogCQkJCSJnZXRhZGRyaW5mbygpIGFyZ3VtZW50IDEgbXVzdCBiZSBzdHJpbmcgb3IgTm9uZSIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N0cnVjdG1vZHVsZS5jIGIvTW9kdWxlcy9zdHJ1Y3Rtb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxM2MwYy4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL3N0cnVjdG1vZHVsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5MyArMCwwIEBACi0vKiBzdHJ1Y3QgbW9kdWxlIC0tIHBhY2sgdmFsdWVzIGludG8gYW5kIChvdXQgb2YpIHN0cmluZ3MgKi8KLQotLyogTmV3IHZlcnNpb24gc3VwcG9ydGluZyBieXRlIG9yZGVyLCBhbGlnbm1lbnQgYW5kIHNpemUgb3B0aW9ucywKLSAgIGNoYXJhY3RlciBzdHJpbmdzLCBhbmQgdW5zaWduZWQgbnVtYmVycyAqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotUHlEb2NfU1RSVkFSKHN0cnVjdF9fZG9jX18sCi0iRnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiBQeXRob24gdmFsdWVzIGFuZCBDIHN0cnVjdHMuXG5cCi1QeXRob24gc3RyaW5ncyBhcmUgdXNlZCB0byBob2xkIHRoZSBkYXRhIHJlcHJlc2VudGluZyB0aGUgQyBzdHJ1Y3RcblwKLWFuZCBhbHNvIGFzIGZvcm1hdCBzdHJpbmdzIHRvIGRlc2NyaWJlIHRoZSBsYXlvdXQgb2YgZGF0YSBpbiB0aGUgQyBzdHJ1Y3QuXG5cCi1cblwKLVRoZSBvcHRpb25hbCBmaXJzdCBmb3JtYXQgY2hhciBpbmRpY2F0ZXMgYnl0ZSBvcmRlciwgc2l6ZSBhbmQgYWxpZ25tZW50OlxuXAotIEA6IG5hdGl2ZSBvcmRlciwgc2l6ZSAmIGFsaWdubWVudCAoZGVmYXVsdClcblwKLSA9OiBuYXRpdmUgb3JkZXIsIHN0ZC4gc2l6ZSAmIGFsaWdubWVudFxuXAotIDw6IGxpdHRsZS1lbmRpYW4sIHN0ZC4gc2l6ZSAmIGFsaWdubWVudFxuXAotID46IGJpZy1lbmRpYW4sIHN0ZC4gc2l6ZSAmIGFsaWdubWVudFxuXAotICE6IHNhbWUgYXMgPlxuXAotXG5cCi1UaGUgcmVtYWluaW5nIGNoYXJzIGluZGljYXRlIHR5cGVzIG9mIGFyZ3MgYW5kIG11c3QgbWF0Y2ggZXhhY3RseTtcblwKLXRoZXNlIGNhbiBiZSBwcmVjZWRlZCBieSBhIGRlY2ltYWwgcmVwZWF0IGNvdW50OlxuXAotIHg6IHBhZCBieXRlIChubyBkYXRhKTsgYzpjaGFyOyBiOnNpZ25lZCBieXRlOyBCOnVuc2lnbmVkIGJ5dGU7XG5cCi0gaDpzaG9ydDsgSDp1bnNpZ25lZCBzaG9ydDsgaTppbnQ7IEk6dW5zaWduZWQgaW50O1xuXAotIGw6bG9uZzsgTDp1bnNpZ25lZCBsb25nOyBmOmZsb2F0OyBkOmRvdWJsZS5cblwKLVNwZWNpYWwgY2FzZXMgKHByZWNlZGluZyBkZWNpbWFsIGNvdW50IGluZGljYXRlcyBsZW5ndGgpOlxuXAotIHM6c3RyaW5nIChhcnJheSBvZiBjaGFyKTsgcDogcGFzY2FsIHN0cmluZyAod2l0aCBjb3VudCBieXRlKS5cblwKLVNwZWNpYWwgY2FzZSAob25seSBhdmFpbGFibGUgaW4gbmF0aXZlIGZvcm1hdCk6XG5cCi0gUDphbiBpbnRlZ2VyIHR5cGUgdGhhdCBpcyB3aWRlIGVub3VnaCB0byBob2xkIGEgcG9pbnRlci5cblwKLVNwZWNpYWwgY2FzZSAobm90IGluIG5hdGl2ZSBtb2RlIHVubGVzcyAnbG9uZyBsb25nJyBpbiBwbGF0Zm9ybSBDKTpcblwKLSBxOmxvbmcgbG9uZzsgUTp1bnNpZ25lZCBsb25nIGxvbmdcblwKLVdoaXRlc3BhY2UgYmV0d2VlbiBmb3JtYXRzIGlzIGlnbm9yZWQuXG5cCi1cblwKLVRoZSB2YXJpYWJsZSBzdHJ1Y3QuZXJyb3IgaXMgYW4gZXhjZXB0aW9uIHJhaXNlZCBvbiBlcnJvcnMuIik7Ci0KLQotLyogRXhjZXB0aW9uICovCi0KLXN0YXRpYyBQeU9iamVjdCAqU3RydWN0RXJyb3I7Ci0KLQotLyogRGVmaW5lIHZhcmlvdXMgc3RydWN0cyB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnRzIG9mIHR5cGVzICovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IHNob3J0IHg7IH0gc3Rfc2hvcnQ7Ci10eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgaW50IHg7IH0gc3RfaW50OwotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGxvbmcgeDsgfSBzdF9sb25nOwotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGZsb2F0IHg7IH0gc3RfZmxvYXQ7Ci10eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgZG91YmxlIHg7IH0gc3RfZG91YmxlOwotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IHZvaWQgKng7IH0gc3Rfdm9pZF9wOwotCi0jZGVmaW5lIFNIT1JUX0FMSUdOIChzaXplb2Yoc3Rfc2hvcnQpIC0gc2l6ZW9mKHNob3J0KSkKLSNkZWZpbmUgSU5UX0FMSUdOIChzaXplb2Yoc3RfaW50KSAtIHNpemVvZihpbnQpKQotI2RlZmluZSBMT05HX0FMSUdOIChzaXplb2Yoc3RfbG9uZykgLSBzaXplb2YobG9uZykpCi0jZGVmaW5lIEZMT0FUX0FMSUdOIChzaXplb2Yoc3RfZmxvYXQpIC0gc2l6ZW9mKGZsb2F0KSkKLSNkZWZpbmUgRE9VQkxFX0FMSUdOIChzaXplb2Yoc3RfZG91YmxlKSAtIHNpemVvZihkb3VibGUpKQotI2RlZmluZSBWT0lEX1BfQUxJR04gKHNpemVvZihzdF92b2lkX3ApIC0gc2l6ZW9mKHZvaWQgKikpCi0KLS8qIFdlIGNhbid0IHN1cHBvcnQgcSBhbmQgUSBpbiBuYXRpdmUgbW9kZSB1bmxlc3MgdGhlIGNvbXBpbGVyIGRvZXM7Ci0gICBpbiBzdGQgbW9kZSwgdGhleSdyZSA4IGJ5dGVzIG9uIGFsbCBwbGF0Zm9ybXMuICovCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLXR5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBQWV9MT05HX0xPTkcgeDsgfSBzX2xvbmdfbG9uZzsKLSNkZWZpbmUgTE9OR19MT05HX0FMSUdOIChzaXplb2Yoc19sb25nX2xvbmcpIC0gc2l6ZW9mKFBZX0xPTkdfTE9ORykpCi0jZW5kaWYKLQotI2RlZmluZSBTVFJJTkdJRlkoeCkgICAgI3gKLQotI2lmZGVmIF9fcG93ZXJjCi0jcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKLSNlbmRpZgotCi0vKiBIZWxwZXIgdG8gZ2V0IGEgUHlMb25nT2JqZWN0IGJ5IGhvb2sgb3IgYnkgY3Jvb2suICBDYWxsZXIgc2hvdWxkIGRlY3JlZi4gKi8KLQotc3RhdGljIFB5T2JqZWN0ICoKLWdldF9weWxvbmcoUHlPYmplY3QgKnYpCi17Ci0JUHlOdW1iZXJNZXRob2RzICptOwotCi0JYXNzZXJ0KHYgIT0gTlVMTCk7Ci0JaWYgKFB5SW50X0NoZWNrKHYpKQotCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOwotCWlmIChQeUxvbmdfQ2hlY2sodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9Ci0JbSA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAhPSBOVUxMICYmIG0tPm5iX2xvbmcgIT0gTlVMTCkgewotCQl2ID0gbS0+bmJfbG9uZyh2KTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoUHlMb25nX0NoZWNrKHYpKQotCQkJcmV0dXJuIHY7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJImNhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IHRvIGxvbmciKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogSGVscGVyIHJvdXRpbmUgdG8gZ2V0IGEgUHl0aG9uIGludGVnZXIgYW5kIHJhaXNlIHRoZSBhcHByb3ByaWF0ZSBlcnJvcgotICAgaWYgaXQgaXNuJ3Qgb25lICovCi0KLXN0YXRpYyBpbnQKLWdldF9sb25nKFB5T2JqZWN0ICp2LCBsb25nICpwKQotewotCWxvbmcgeCA9IFB5SW50X0FzTG9uZyh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0geDsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBTYW1lLCBidXQgaGFuZGxpbmcgdW5zaWduZWQgbG9uZyAqLwotCi1zdGF0aWMgaW50Ci1nZXRfdWxvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIGxvbmcgKnApCi17Ci0JaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQl1bnNpZ25lZCBsb25nIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSgtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKnAgPSB4OwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiBnZXRfbG9uZyh2LCAobG9uZyAqKXApOwotCX0KLX0KLQotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0KLS8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgbG9uZyBsb25nLiAqLwotCi1zdGF0aWMgaW50Ci1nZXRfbG9uZ2xvbmcoUHlPYmplY3QgKnYsIFBZX0xPTkdfTE9ORyAqcCkKLXsKLQlQWV9MT05HX0xPTkcgeDsKLQotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzTG9uZ0xvbmcodik7Ci0JUHlfREVDUkVGKHYpOwotCWlmICh4ID09IChQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKLX0KLQotLyogU2FtZSwgYnV0IGhhbmRsaW5nIG5hdGl2ZSB1bnNpZ25lZCBsb25nIGxvbmcuICovCi0KLXN0YXRpYyBpbnQKLWdldF91bG9uZ2xvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqcCkKLXsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKLQotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKLQlQeV9ERUNSRUYodik7Ci0JaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOwotfQotCi0jZW5kaWYKLQotLyogRmxvYXRpbmcgcG9pbnQgaGVscGVycyAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotdW5wYWNrX2Zsb2F0KGNvbnN0IGNoYXIgKnAsICAvKiBzdGFydCBvZiA0LWJ5dGUgc3RyaW5nICovCi0gICAgICAgICAgICAgaW50IGxlKQkgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCi17Ci0JZG91YmxlIHg7Ci0KLQl4ID0gX1B5RmxvYXRfVW5wYWNrNCgodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi11bnBhY2tfZG91YmxlKGNvbnN0IGNoYXIgKnAsICAvKiBzdGFydCBvZiA4LWJ5dGUgc3RyaW5nICovCi0gICAgICAgICAgICAgIGludCBsZSkgICAgICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLwotewotCWRvdWJsZSB4OwotCi0JeCA9IF9QeUZsb2F0X1VucGFjazgoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotfQotCi0KLS8qIFRoZSB0cmFuc2xhdGlvbiBmdW5jdGlvbiBmb3IgZWFjaCBmb3JtYXQgY2hhcmFjdGVyIGlzIHRhYmxlIGRyaXZlbiAqLwotCi10eXBlZGVmIHN0cnVjdCBfZm9ybWF0ZGVmIHsKLQljaGFyIGZvcm1hdDsKLQlpbnQgc2l6ZTsKLQlpbnQgYWxpZ25tZW50OwotCVB5T2JqZWN0KiAoKnVucGFjaykoY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICopOwotCWludCAoKnBhY2spKGNoYXIgKiwgUHlPYmplY3QgKiwKLQkJICAgIGNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICopOwotfSBmb3JtYXRkZWY7Ci0KLS8qIEEgbGFyZ2UgbnVtYmVyIG9mIHNtYWxsIHJvdXRpbmVzIGZvbGxvdywgd2l0aCBuYW1lcyBvZiB0aGUgZm9ybQotCi0JW2Jsbl1bdXBdX1RZUEUKLQotICAgW2Jsbl0gZGlzdGlndWlzaGVzIGFtb25nIGJpZy1lbmRpYW4sIGxpdHRsZS1lbmRpYW4gYW5kIG5hdGl2ZS4KLSAgIFtwdV0gZGlzdGlndWlzaGVzIGJldHdlZW4gcGFjayAodG8gc3RydWN0KSBhbmQgdW5wYWNrIChmcm9tIHN0cnVjdCkuCi0gICBUWVBFIGlzIG9uZSBvZiBjaGFyLCBieXRlLCB1Ynl0ZSwgZXRjLgotKi8KLQotLyogTmF0aXZlIG1vZGUgcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBOT1RFOgotICAgSW4gYWxsIG5bdXBdXzx0eXBlPiByb3V0aW5lcyBoYW5kbGluZyB0eXBlcyBsYXJnZXIgdGhhbiAxIGJ5dGUsIHRoZXJlIGlzCi0gICAqbm8qIGd1YXJhbnRlZSB0aGF0IHRoZSBwIHBvaW50ZXIgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgZWFjaCB0eXBlLAotICAgdGhlcmVmb3JlIG1lbWNweSBpcyBjYWxsZWQuICBBbiBpbnRlcm1lZGlhdGUgdmFyaWFibGUgaXMgdXNlZCB0bwotICAgY29tcGVuc2F0ZSBmb3IgYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzLgotICAgTm9ybWFsbHkgYm90aCB0aGUgaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGFuZCB0aGUgbWVtY3B5IGNhbGwgd2lsbCBiZQotICAgc2tpcHBlZCBieSBDIG9wdGltaXNhdGlvbiBpbiBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZXMgKGdjYyA+PSAyLjkxCi0gICBkb2VzIHRoaXMpLiAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfY2hhcihjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsIDEpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfYnl0ZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAqKHNpZ25lZCBjaGFyICopcCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV91Ynl0ZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAqKHVuc2lnbmVkIGNoYXIgKilwKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW51X3Nob3J0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlzaG9ydCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfdXNob3J0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl1bnNpZ25lZCBzaG9ydCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfaW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlpbnQgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW51X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIGludCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JbG9uZyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfdWxvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIGxvbmcgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKLX0KLQotLyogTmF0aXZlIG1vZGUgZG9lc24ndCBzdXBwb3J0IHEgb3IgUSB1bmxlc3MgdGhlIHBsYXRmb3JtIEMgc3VwcG9ydHMKLSAgIGxvbmcgbG9uZyAob3IsIG9uIFdpbmRvd3MsIF9faW50NjQpLiAqLwotCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQotc3RhdGljIFB5T2JqZWN0ICoKLW51X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlQWV9MT05HX0xPTkcgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWZsb2F0IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV9kb3VibGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWRvdWJsZSB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW51X3ZvaWRfcChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0Jdm9pZCAqeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoeCk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX2J5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IC0xMjggfHwgeCA+IDEyNyl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkiYnl0ZSBmb3JtYXQgcmVxdWlyZXMgLTEyODw9bnVtYmVyPD0xMjciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcCA9IChjaGFyKXg7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX3VieXRlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JbG9uZyB4OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHggPCAwIHx8IHggPiAyNTUpewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInVieXRlIGZvcm1hdCByZXF1aXJlcyAwPD1udW1iZXI8PTI1NSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0gKGNoYXIpeDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfY2hhcihjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlTdHJpbmdfU2l6ZSh2KSAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkiY2hhciBmb3JtYXQgcmVxdWlyZSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcCA9ICpQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfc2hvcnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHg7Ci0Jc2hvcnQgeTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmICh4IDwgU0hSVF9NSU4gfHwgeCA+IFNIUlRfTUFYKXsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJzaG9ydCBmb3JtYXQgcmVxdWlyZXMgIiBTVFJJTkdJRlkoU0hSVF9NSU4pCi0JCQkJIjw9bnVtYmVyPD0iIFNUUklOR0lGWShTSFJUX01BWCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXkgPSAoc2hvcnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ucF91c2hvcnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHg7Ci0JdW5zaWduZWQgc2hvcnQgeTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmICh4IDwgMCB8fCB4ID4gVVNIUlRfTUFYKXsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJzaG9ydCBmb3JtYXQgcmVxdWlyZXMgMDw9bnVtYmVyPD0iIFNUUklOR0lGWShVU0hSVF9NQVgpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl5ID0gKHVuc2lnbmVkIHNob3J0KXg7Ci0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfaW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JbG9uZyB4OwotCWludCB5OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JeSA9IChpbnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ucF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgbG9uZyB4OwotCXVuc2lnbmVkIGludCB5OwotCWlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXkgPSAodW5zaWduZWQgaW50KXg7Ci0JbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWxvbmcgeDsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX3Vsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgbG9uZyB4OwotCWlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCi1zdGF0aWMgaW50Ci1ucF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCVBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfbG9uZ2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfdWxvbmdsb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLW5wX2Zsb2F0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JZmxvYXQgeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mKGRvdWJsZSkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ucF92b2lkX3AoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl2b2lkICp4OwotCi0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWFzc2VydChQeUxvbmdfQ2hlY2sodikpOwotCXggPSBQeUxvbmdfQXNWb2lkUHRyKHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZm9ybWF0ZGVmIG5hdGl2ZV90YWJsZVtdID0gewotCXsneCcsCXNpemVvZihjaGFyKSwJMCwJCU5VTEx9LAotCXsnYicsCXNpemVvZihjaGFyKSwJMCwJCW51X2J5dGUsCW5wX2J5dGV9LAotCXsnQicsCXNpemVvZihjaGFyKSwJMCwJCW51X3VieXRlLAlucF91Ynl0ZX0sCi0JeydjJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfY2hhciwJbnBfY2hhcn0sCi0JeydzJywJc2l6ZW9mKGNoYXIpLAkwLAkJTlVMTH0sCi0JeydwJywJc2l6ZW9mKGNoYXIpLAkwLAkJTlVMTH0sCi0JeydoJywJc2l6ZW9mKHNob3J0KSwJU0hPUlRfQUxJR04sCW51X3Nob3J0LAlucF9zaG9ydH0sCi0JeydIJywJc2l6ZW9mKHNob3J0KSwJU0hPUlRfQUxJR04sCW51X3VzaG9ydCwJbnBfdXNob3J0fSwKLQl7J2knLAlzaXplb2YoaW50KSwJSU5UX0FMSUdOLAludV9pbnQsCQlucF9pbnR9LAotCXsnSScsCXNpemVvZihpbnQpLAlJTlRfQUxJR04sCW51X3VpbnQsCW5wX3VpbnR9LAotCXsnbCcsCXNpemVvZihsb25nKSwJTE9OR19BTElHTiwJbnVfbG9uZywJbnBfbG9uZ30sCi0JeydMJywJc2l6ZW9mKGxvbmcpLAlMT05HX0FMSUdOLAludV91bG9uZywJbnBfdWxvbmd9LAotCXsnZicsCXNpemVvZihmbG9hdCksCUZMT0FUX0FMSUdOLAludV9mbG9hdCwJbnBfZmxvYXR9LAotCXsnZCcsCXNpemVvZihkb3VibGUpLAlET1VCTEVfQUxJR04sCW51X2RvdWJsZSwJbnBfZG91YmxlfSwKLQl7J1AnLAlzaXplb2Yodm9pZCAqKSwJVk9JRF9QX0FMSUdOLAludV92b2lkX3AsCW5wX3ZvaWRfcH0sCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQl7J3EnLAlzaXplb2YoUFlfTE9OR19MT05HKSwgTE9OR19MT05HX0FMSUdOLCBudV9sb25nbG9uZywgbnBfbG9uZ2xvbmd9LAotCXsnUScsCXNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X3Vsb25nbG9uZyxucF91bG9uZ2xvbmd9LAotI2VuZGlmCi0JezB9Ci19OwotCi0vKiBCaWctZW5kaWFuIHJvdXRpbmVzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIFB5T2JqZWN0ICoKLWJ1X2ludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JbG9uZyB4ID0gMDsKLQlpbnQgaSA9IGYtPnNpemU7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgKCpwKysgJiAweEZGKTsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLwotCWlmIChTSVpFT0ZfTE9ORyA+IGYtPnNpemUpCi0JCXggfD0gLSh4ICYgKDFMIDw8ICg4KmYtPnNpemUgLSAxKSkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWJ1X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIGxvbmcgeCA9IDA7Ci0JaW50IGkgPSBmLT5zaXplOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8ICgqcCsrICYgMHhGRik7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JaWYgKGYtPnNpemUgPj0gNCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOwotCWVsc2UKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotYnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgICAgIDgsCi0JCQkJICAgICAgMCwgLyogbGl0dGxlLWVuZGlhbiAqLwotCQkJCSAgICAgIDEgIC8qIHNpZ25lZCAqLyk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1idV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgICAgIDgsCi0JCQkJICAgICAgMCwgLyogbGl0dGxlLWVuZGlhbiAqLwotCQkJCSAgICAgIDAgIC8qIHNpZ25lZCAqLyk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1idV9mbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIHVucGFja19mbG9hdChwLCAwKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWJ1X2RvdWJsZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIHVucGFja19kb3VibGUocCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWJwX2ludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWxvbmcgeDsKLQlpbnQgaTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWRvIHsKLQkJcFstLWldID0gKGNoYXIpeDsKLQkJeCA+Pj0gODsKLQl9IHdoaWxlIChpID4gMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWJwX3VpbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JaW50IGk7Ci0JaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaSA9IGYtPnNpemU7Ci0JZG8gewotCQlwWy0taV0gPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKGkgPiAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotYnBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlpbnQgcmVzOwotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2LAotCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgOCwKLQkJCQkgIDAsIC8qIGxpdHRsZV9lbmRpYW4gKi8KLQkJCQkgIDEgIC8qIHNpZ25lZCAqLyk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLWJwX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCi0JCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICA4LAotCQkJCSAgMCwgLyogbGl0dGxlX2VuZGlhbiAqLwotCQkJCSAgMCAgLyogc2lnbmVkICovKTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotYnBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWJwX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKLX0KLQotc3RhdGljIGZvcm1hdGRlZiBiaWdlbmRpYW5fdGFibGVbXSA9IHsKLQl7J3gnLAkxLAkJMCwJCU5VTEx9LAotCXsnYicsCTEsCQkwLAkJYnVfaW50LAkJYnBfaW50fSwKLQl7J0InLAkxLAkJMCwJCWJ1X3VpbnQsCWJwX2ludH0sCi0JeydjJywJMSwJCTAsCQludV9jaGFyLAlucF9jaGFyfSwKLQl7J3MnLAkxLAkJMCwJCU5VTEx9LAotCXsncCcsCTEsCQkwLAkJTlVMTH0sCi0JeydoJywJMiwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnSCcsCTIsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydpJywJNCwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnSScsCTQsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydsJywJNCwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnTCcsCTQsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydxJywJOCwJCTAsCQlidV9sb25nbG9uZywJYnBfbG9uZ2xvbmd9LAotCXsnUScsCTgsCQkwLAkJYnVfdWxvbmdsb25nLAlicF91bG9uZ2xvbmd9LAotCXsnZicsCTQsCQkwLAkJYnVfZmxvYXQsCWJwX2Zsb2F0fSwKLQl7J2QnLAk4LAkJMCwJCWJ1X2RvdWJsZSwJYnBfZG91YmxlfSwKLQl7MH0KLX07Ci0KLS8qIExpdHRsZS1lbmRpYW4gcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotbHVfaW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHggPSAwOwotCWludCBpID0gZi0+c2l6ZTsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCAocFstLWldICYgMHhGRik7Ci0JfSB3aGlsZSAoaSA+IDApOwotCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCi0JaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKLQkJeCB8PSAtKHggJiAoMUwgPDwgKDgqZi0+c2l6ZSAtIDEpKSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbHVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgbG9uZyB4ID0gMDsKLQlpbnQgaSA9IGYtPnNpemU7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgKHBbLS1pXSAmIDB4RkYpOwotCX0gd2hpbGUgKGkgPiAwKTsKLQlpZiAoZi0+c2l6ZSA+PSA0KQotCQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoeCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1sdV9sb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAxLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMSAgLyogc2lnbmVkICovKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWx1X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAxLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMCAgLyogc2lnbmVkICovKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWx1X2Zsb2F0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gdW5wYWNrX2Zsb2F0KHAsIDEpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbHVfZG91YmxlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gdW5wYWNrX2RvdWJsZShwLCAxKTsKLX0KLQotc3RhdGljIGludAotbHBfaW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JbG9uZyB4OwotCWludCBpOwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaSA9IGYtPnNpemU7Ci0JZG8gewotCQkqcCsrID0gKGNoYXIpeDsKLQkJeCA+Pj0gODsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbHBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIGxvbmcgeDsKLQlpbnQgaTsKLQlpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpID0gZi0+c2l6ZTsKLQlkbyB7Ci0JCSpwKysgPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKC0taSA+IDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1scF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCopdiwKLQkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgIDgsCi0JCQkJICAxLCAvKiBsaXR0bGVfZW5kaWFuICovCi0JCQkJICAxICAvKiBzaWduZWQgKi8pOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci1scF91bG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlpbnQgcmVzOwotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QqKXYsCi0JCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICA4LAotCQkJCSAgMSwgLyogbGl0dGxlX2VuZGlhbiAqLwotCQkJCSAgMCAgLyogc2lnbmVkICovKTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotbHBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWxwX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAxKTsKLX0KLQotc3RhdGljIGZvcm1hdGRlZiBsaWxlbmRpYW5fdGFibGVbXSA9IHsKLQl7J3gnLAkxLAkJMCwJCU5VTEx9LAotCXsnYicsCTEsCQkwLAkJbHVfaW50LAkJbHBfaW50fSwKLQl7J0InLAkxLAkJMCwJCWx1X3VpbnQsCWxwX2ludH0sCi0JeydjJywJMSwJCTAsCQludV9jaGFyLAlucF9jaGFyfSwKLQl7J3MnLAkxLAkJMCwJCU5VTEx9LAotCXsncCcsCTEsCQkwLAkJTlVMTH0sCi0JeydoJywJMiwJCTAsCQlsdV9pbnQsCQlscF9pbnR9LAotCXsnSCcsCTIsCQkwLAkJbHVfdWludCwJbHBfdWludH0sCi0JeydpJywJNCwJCTAsCQlsdV9pbnQsCQlscF9pbnR9LAotCXsnSScsCTQsCQkwLAkJbHVfdWludCwJbHBfdWludH0sCi0JeydsJywJNCwJCTAsCQlsdV9pbnQsCQlscF9pbnR9LAotCXsnTCcsCTQsCQkwLAkJbHVfdWludCwJbHBfdWludH0sCi0JeydxJywJOCwJCTAsCQlsdV9sb25nbG9uZywJbHBfbG9uZ2xvbmd9LAotCXsnUScsCTgsCQkwLAkJbHVfdWxvbmdsb25nLAlscF91bG9uZ2xvbmd9LAotCXsnZicsCTQsCQkwLAkJbHVfZmxvYXQsCWxwX2Zsb2F0fSwKLQl7J2QnLAk4LAkJMCwJCWx1X2RvdWJsZSwJbHBfZG91YmxlfSwKLQl7MH0KLX07Ci0KLQotc3RhdGljIGNvbnN0IGZvcm1hdGRlZiAqCi13aGljaHRhYmxlKGNoYXIgKipwZm10KQotewotCWNvbnN0IGNoYXIgKmZtdCA9ICgqcGZtdCkrKzsgLyogTWF5IGJlIGJhY2tlZCBvdXQgb2YgbGF0ZXIgKi8KLQlzd2l0Y2ggKCpmbXQpIHsKLQljYXNlICc8JzoKLQkJcmV0dXJuIGxpbGVuZGlhbl90YWJsZTsKLQljYXNlICc+JzoKLQljYXNlICchJzogLyogTmV0d29yayBieXRlIG9yZGVyIGlzIGJpZy1lbmRpYW4gKi8KLQkJcmV0dXJuIGJpZ2VuZGlhbl90YWJsZTsKLQljYXNlICc9JzogeyAvKiBIb3N0IGJ5dGUgb3JkZXIgLS0gZGlmZmVyZW50IGZyb20gbmF0aXZlIGluIGFsaWdtZW50ISAqLwotCQlpbnQgbiA9IDE7Ci0JCWNoYXIgKnAgPSAoY2hhciAqKSAmbjsKLQkJaWYgKCpwID09IDEpCi0JCQlyZXR1cm4gbGlsZW5kaWFuX3RhYmxlOwotCQllbHNlCi0JCQlyZXR1cm4gYmlnZW5kaWFuX3RhYmxlOwotCX0KLQlkZWZhdWx0OgotCQktLSpwZm10OyAvKiBCYWNrIG91dCBvZiBwb2ludGVyIGluY3JlbWVudCAqLwotCQkvKiBGYWxsIHRocm91Z2ggKi8KLQljYXNlICdAJzoKLQkJcmV0dXJuIG5hdGl2ZV90YWJsZTsKLQl9Ci19Ci0KLQotLyogR2V0IHRoZSB0YWJsZSBlbnRyeSBmb3IgYSBmb3JtYXQgY29kZSAqLwotCi1zdGF0aWMgY29uc3QgZm9ybWF0ZGVmICoKLWdldGVudHJ5KGludCBjLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JZm9yICg7IGYtPmZvcm1hdCAhPSAnXDAnOyBmKyspIHsKLQkJaWYgKGYtPmZvcm1hdCA9PSBjKSB7Ci0JCQlyZXR1cm4gZjsKLQkJfQotCX0KLQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsICJiYWQgY2hhciBpbiBzdHJ1Y3QgZm9ybWF0Iik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogQWxpZ24gYSBzaXplIGFjY29yZGluZyB0byBhIGZvcm1hdCBjb2RlICovCi0KLXN0YXRpYyBpbnQKLWFsaWduKGludCBzaXplLCBpbnQgYywgY29uc3QgZm9ybWF0ZGVmICplKQotewotCWlmIChlLT5mb3JtYXQgPT0gYykgewotCQlpZiAoZS0+YWxpZ25tZW50KSB7Ci0JCQlzaXplID0gKChzaXplICsgZS0+YWxpZ25tZW50IC0gMSkKLQkJCQkvIGUtPmFsaWdubWVudCkKLQkJCQkqIGUtPmFsaWdubWVudDsKLQkJfQotCX0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotCi0vKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBmb3JtYXQgc3RyaW5nICovCi0KLXN0YXRpYyBpbnQKLWNhbGNzaXplKGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWNvbnN0IGZvcm1hdGRlZiAqZTsKLQljb25zdCBjaGFyICpzOwotCWNoYXIgYzsKLQlpbnQgc2l6ZSwgIG51bSwgaXRlbXNpemUsIHg7Ci0KLQlzID0gZm10OwotCXNpemUgPSAwOwotCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKLQkJaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQotCQkJY29udGludWU7Ci0JCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgewotCQkJbnVtID0gYyAtICcwJzsKLQkJCXdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykgewotCQkJCXggPSBudW0qMTAgKyAoYyAtICcwJyk7Ci0JCQkJaWYgKHgvMTAgIT0gbnVtKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQkJCVN0cnVjdEVycm9yLAotCQkJCQkJIm92ZXJmbG93IGluIGl0ZW0gY291bnQiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQludW0gPSB4OwotCQkJfQotCQkJaWYgKGMgPT0gJ1wwJykKLQkJCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQludW0gPSAxOwotCi0JCWUgPSBnZXRlbnRyeShjLCBmKTsKLQkJaWYgKGUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaXRlbXNpemUgPSBlLT5zaXplOwotCQlzaXplID0gYWxpZ24oc2l6ZSwgYywgZSk7Ci0JCXggPSBudW0gKiBpdGVtc2l6ZTsKLQkJc2l6ZSArPSB4OwotCQlpZiAoeC9pdGVtc2l6ZSAhPSBudW0gfHwgc2l6ZSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJInRvdGFsIHN0cnVjdCBzaXplIHRvbyBsb25nIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotCi1QeURvY19TVFJWQVIoY2FsY3NpemVfX2RvY19fLAotImNhbGNzaXplKGZtdCkgLT4gaW50XG5cCi1SZXR1cm4gc2l6ZSBvZiBDIHN0cnVjdCBkZXNjcmliZWQgYnkgZm9ybWF0IHN0cmluZyBmbXQuXG5cCi1TZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0IHN0cmluZ3MuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1zdHJ1Y3RfY2FsY3NpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCWNoYXIgKmZtdDsKLQljb25zdCBmb3JtYXRkZWYgKmY7Ci0JaW50IHNpemU7Ci0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Y2FsY3NpemUiLCAmZm10KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZiA9IHdoaWNodGFibGUoJmZtdCk7Ci0Jc2l6ZSA9IGNhbGNzaXplKGZtdCwgZik7Ci0JaWYgKHNpemUgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2l6ZSk7Ci19Ci0KLQotUHlEb2NfU1RSVkFSKHBhY2tfX2RvY19fLAotInBhY2soZm10LCB2MSwgdjIsIC4uLikgLT4gc3RyaW5nXG5cCi1SZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgdmFsdWVzIHYxLCB2MiwgLi4uIHBhY2tlZCBhY2NvcmRpbmcgdG8gZm10LlxuXAotU2VlIHN0cnVjdC5fX2RvY19fIGZvciBtb3JlIG9uIGZvcm1hdCBzdHJpbmdzLiIpOwotCi1zdGF0aWMgUHlPYmplY3QgKgotc3RydWN0X3BhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCWNvbnN0IGZvcm1hdGRlZiAqZiwgKmU7Ci0JUHlPYmplY3QgKmZvcm1hdCwgKnJlc3VsdCwgKnY7Ci0JY2hhciAqZm10OwotCWludCBzaXplLCBudW07Ci0JUHlfc3NpemVfdCBpLCBuOwotCWNoYXIgKnMsICpyZXMsICpyZXN0YXJ0LCAqbnJlczsKLQljaGFyIGM7Ci0KLQlpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8Ci0JICAgIChuID0gUHlUdXBsZV9TaXplKGFyZ3MpKSA8IDEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJInN0cnVjdC5wYWNrIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9ybWF0ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCWZtdCA9IFB5U3RyaW5nX0FzU3RyaW5nKGZvcm1hdCk7Ci0JaWYgKCFmbXQpCi0JCXJldHVybiBOVUxMOwotCWYgPSB3aGljaHRhYmxlKCZmbXQpOwotCXNpemUgPSBjYWxjc2l6ZShmbXQsIGYpOwotCWlmIChzaXplIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBzaXplKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcyA9IGZtdDsKLQlpID0gMTsKLQlyZXMgPSByZXN0YXJ0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKLQotCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKLQkJaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQotCQkJY29udGludWU7Ci0JCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgewotCQkJbnVtID0gYyAtICcwJzsKLQkJCXdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykKLQkJCSAgICAgICBudW0gPSBudW0qMTAgKyAoYyAtICcwJyk7Ci0JCQlpZiAoYyA9PSAnXDAnKQotCQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCW51bSA9IDE7Ci0KLQkJZSA9IGdldGVudHJ5KGMsIGYpOwotCQlpZiAoZSA9PSBOVUxMKQotCQkJZ290byBmYWlsOwotCQlucmVzID0gcmVzdGFydCArIGFsaWduKChpbnQpKHJlcy1yZXN0YXJ0KSwgYywgZSk7Ci0JCS8qIEZpbGwgcGFkZCBieXRlcyB3aXRoIHplcm9zICovCi0JCXdoaWxlIChyZXMgPCBucmVzKQotCQkJKnJlcysrID0gJ1wwJzsKLQkJaWYgKG51bSA9PSAwICYmIGMgIT0gJ3MnKQotCQkJY29udGludWU7Ci0JCWRvIHsKLQkJCWlmIChjID09ICd4JykgewotCQkJCS8qIGRvZXNuJ3QgY29uc3VtZSBhcmd1bWVudHMgKi8KLQkJCQltZW1zZXQocmVzLCAnXDAnLCBudW0pOwotCQkJCXJlcyArPSBudW07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaSA+PSBuKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCQkiaW5zdWZmaWNpZW50IGFyZ3VtZW50cyB0byBwYWNrIik7Ci0JCQkJZ290byBmYWlsOwotCQkJCX0KLQkJCXYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSsrKTsKLQkJCWlmICh2ID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJaWYgKGMgPT0gJ3MnKSB7Ci0JCQkJLyogbnVtIGlzIHN0cmluZyBzaXplLCBub3QgcmVwZWF0IGNvdW50ICovCi0JCQkJUHlfc3NpemVfdCBuOwotCQkJCWlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCQkgICJhcmd1bWVudCBmb3IgJ3MnIG11c3QgYmUgYSBzdHJpbmciKTsKLQkJCQkJZ290byBmYWlsOwotCQkJCX0KLQkJCQluID0gUHlTdHJpbmdfU2l6ZSh2KTsKLQkJCQlpZiAobiA+IG51bSkKLQkJCQkJbiA9IG51bTsKLQkJCQlpZiAobiA+IDApCi0JCQkJCW1lbWNweShyZXMsIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCBuKTsKLQkJCQlpZiAobiA8IG51bSkKLQkJCQkJbWVtc2V0KHJlcytuLCAnXDAnLCBudW0tbik7Ci0JCQkJcmVzICs9IG51bTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gJ3AnKSB7Ci0JCQkJLyogbnVtIGlzIHN0cmluZyBzaXplICsgMSwKLQkJCQkgICB0byBmaXQgaW4gdGhlIGNvdW50IGJ5dGUgKi8KLQkJCQlQeV9zc2l6ZV90IG47Ci0JCQkJbnVtLS07IC8qIG5vdyBudW0gaXMgbWF4IHN0cmluZyBzaXplICovCi0JCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCSAgImFyZ3VtZW50IGZvciAncCcgbXVzdCBiZSBhIHN0cmluZyIpOwotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJfQotCQkJCW4gPSBQeVN0cmluZ19TaXplKHYpOwotCQkJCWlmIChuID4gbnVtKQotCQkJCQluID0gbnVtOwotCQkJCWlmIChuID4gMCkKLQkJCQkJbWVtY3B5KHJlcysxLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgbik7Ci0JCQkJaWYgKG4gPCBudW0pCi0JCQkJCS8qIG5vIHJlYWwgbmVlZCwganVzdCB0byBiZSBuaWNlICovCi0JCQkJCW1lbXNldChyZXMrMStuLCAnXDAnLCBudW0tbik7Ci0JCQkJaWYgKG4gPiAyNTUpCi0JCQkJCW4gPSAyNTU7Ci0JCQkJLyogc3RvcmUgdGhlIGxlbmd0aCBieXRlICovCi0JCQkJKnJlcysrID0gUHlfU0FGRV9ET1dOQ0FTVChuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBjaGFyKTsKLQkJCQlyZXMgKz0gbnVtOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGUtPnBhY2socmVzLCB2LCBlKSA8IDApCi0JCQkJCWdvdG8gZmFpbDsKLQkJCQlyZXMgKz0gZS0+c2l6ZTsKLQkJCX0KLQkJfSB3aGlsZSAoLS1udW0gPiAwKTsKLQl9Ci0KLQlpZiAoaSA8IG4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJ0b28gbWFueSBhcmd1bWVudHMgZm9yIHBhY2sgZm9ybWF0Iik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi0gZmFpbDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotCi1QeURvY19TVFJWQVIodW5wYWNrX19kb2NfXywKLSJ1bnBhY2soZm10LCBzdHJpbmcpIC0+ICh2MSwgdjIsIC4uLilcblwKLVVucGFjayB0aGUgc3RyaW5nLCBjb250YWluaW5nIHBhY2tlZCBDIHN0cnVjdHVyZSBkYXRhLCBhY2NvcmRpbmdcblwKLXRvIGZtdC4gIFJlcXVpcmVzIGxlbihzdHJpbmcpPT1jYWxjc2l6ZShmbXQpLlxuXAotU2VlIHN0cnVjdC5fX2RvY19fIGZvciBtb3JlIG9uIGZvcm1hdCBzdHJpbmdzLiIpOwotCi1zdGF0aWMgUHlPYmplY3QgKgotc3RydWN0X3VucGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JY29uc3QgZm9ybWF0ZGVmICpmLCAqZTsKLQljaGFyICpzdHIsICpzdGFydCwgKmZtdCwgKnM7Ci0JY2hhciBjOwotCWludCBsZW4sIHNpemUsIG51bTsKLQlQeU9iamVjdCAqcmVzLCAqdjsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3MjOnVucGFjayIsICZmbXQsICZzdGFydCwgJmxlbikpCi0JCXJldHVybiBOVUxMOwotCWYgPSB3aGljaHRhYmxlKCZmbXQpOwotCXNpemUgPSBjYWxjc2l6ZShmbXQsIGYpOwotCWlmIChzaXplIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNpemUgIT0gbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkidW5wYWNrIHN0ciBzaXplIGRvZXMgbm90IG1hdGNoIGZvcm1hdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gUHlMaXN0X05ldygwKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXN0ciA9IHN0YXJ0OwotCXMgPSBmbXQ7Ci0Jd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0JCQludW0gPSBjIC0gJzAnOwotCQkJd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKQotCQkJICAgICAgIG51bSA9IG51bSoxMCArIChjIC0gJzAnKTsKLQkJCWlmIChjID09ICdcMCcpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJbnVtID0gMTsKLQotCQllID0gZ2V0ZW50cnkoYywgZik7Ci0JCWlmIChlID09IE5VTEwpCi0JCQlnb3RvIGZhaWw7Ci0JCXN0ciA9IHN0YXJ0ICsgYWxpZ24oKGludCkoc3RyLXN0YXJ0KSwgYywgZSk7Ci0JCWlmIChudW0gPT0gMCAmJiBjICE9ICdzJykKLQkJCWNvbnRpbnVlOwotCi0JCWRvIHsKLQkJCWlmIChjID09ICd4JykgewotCQkJCXN0ciArPSBudW07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAncycpIHsKLQkJCQkvKiBudW0gaXMgc3RyaW5nIHNpemUsIG5vdCByZXBlYXQgY291bnQgKi8KLQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyLCBudW0pOwotCQkJCWlmICh2ID09IE5VTEwpCi0JCQkJCWdvdG8gZmFpbDsKLQkJCQlzdHIgKz0gbnVtOwotCQkJCW51bSA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChjID09ICdwJykgewotCQkJCS8qIG51bSBpcyBzdHJpbmcgYnVmZmVyIHNpemUsCi0JCQkJICAgbm90IHJlcGVhdCBjb3VudCAqLwotCQkJCWludCBuID0gKih1bnNpZ25lZCBjaGFyKilzdHI7Ci0JCQkJLyogZmlyc3QgYnl0ZSAodW5zaWduZWQpIGlzIHN0cmluZyBzaXplICovCi0JCQkJaWYgKG4gPj0gbnVtKQotCQkJCQluID0gbnVtLTE7Ci0JCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0cisxLCBuKTsKLQkJCQlpZiAodiA9PSBOVUxMKQotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJc3RyICs9IG51bTsKLQkJCQludW0gPSAwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdiA9IGUtPnVucGFjayhzdHIsIGUpOwotCQkJCWlmICh2ID09IE5VTEwpCi0JCQkJCWdvdG8gZmFpbDsKLQkJCQlzdHIgKz0gZS0+c2l6ZTsKLQkJCX0KLQkJCWlmICh2ID09IE5VTEwgfHwgUHlMaXN0X0FwcGVuZChyZXMsIHYpIDwgMCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0gd2hpbGUgKC0tbnVtID4gMCk7Ci0JfQotCi0JdiA9IFB5TGlzdF9Bc1R1cGxlKHJlcyk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIHY7Ci0KLSBmYWlsOgotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBOVUxMOwotfQotCi0KLS8qIExpc3Qgb2YgZnVuY3Rpb25zICovCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBzdHJ1Y3RfbWV0aG9kc1tdID0gewotCXsiY2FsY3NpemUiLAlzdHJ1Y3RfY2FsY3NpemUsCU1FVEhfVkFSQVJHUywgY2FsY3NpemVfX2RvY19ffSwKLQl7InBhY2siLAlzdHJ1Y3RfcGFjaywJCU1FVEhfVkFSQVJHUywgcGFja19fZG9jX199LAotCXsidW5wYWNrIiwJc3RydWN0X3VucGFjaywJCU1FVEhfVkFSQVJHUywgdW5wYWNrX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KLX07Ci0KLQotLyogTW9kdWxlIGluaXRpYWxpemF0aW9uICovCi0KLVB5TU9ESU5JVF9GVU5DCi1pbml0c3RydWN0KHZvaWQpCi17Ci0JUHlPYmplY3QgKm07Ci0KLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZTQoInN0cnVjdCIsIHN0cnVjdF9tZXRob2RzLCBzdHJ1Y3RfX2RvY19fLAotCQkJICAgKFB5T2JqZWN0KilOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JaWYgKFN0cnVjdEVycm9yID09IE5VTEwpIHsKLQkJU3RydWN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN0cnVjdC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCQlpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkKLQkJCXJldHVybjsKLQl9Ci0JUHlfSU5DUkVGKFN0cnVjdEVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgU3RydWN0RXJyb3IpOwotfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYyBiL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKaW5kZXggODMzMTNkZi4uOWFjOTg4MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCkBAIC05OCwxMyArOTgsNiBAQAogXG5cCiBSZXR1cm4gd2hldGhlciB0aGUgbG9jayBpcyBpbiB0aGUgbG9ja2VkIHN0YXRlLiIpOwogCi1zdGF0aWMgUHlPYmplY3QgKgotbG9ja19jb250ZXh0KGxvY2tvYmplY3QgKnNlbGYpCi17Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotfQotCiBzdGF0aWMgUHlNZXRob2REZWYgbG9ja19tZXRob2RzW10gPSB7CiAJeyJhY3F1aXJlX2xvY2siLCAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9hY3F1aXJlX2xvY2ssIAogCSBNRVRIX1ZBUkFSR1MsIGFjcXVpcmVfZG9jfSwKQEAgLTExOCw4ICsxMTEsNiBAQAogCSBNRVRIX05PQVJHUywgbG9ja2VkX2RvY30sCiAJeyJsb2NrZWQiLCAgICAgICAoUHlDRnVuY3Rpb24pbG9ja19sb2NrZWRfbG9jaywgIAogCSBNRVRIX05PQVJHUywgbG9ja2VkX2RvY30sCi0JeyJfX2NvbnRleHRfXyIsICAoUHlDRnVuY3Rpb24pbG9ja19jb250ZXh0LAotCSBNRVRIX05PQVJHUywgUHlEb2NfU1RSKCJfX2NvbnRleHRfXygpIC0+IHNlbGYuIil9LAogCXsiX19lbnRlcl9fIiwgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrLAogCSBNRVRIX1ZBUkFSR1MsIGFjcXVpcmVfZG9jfSwKIAl7Il9fZXhpdF9fIiwgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfcmVsZWFzZV9sb2NrLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCAwOGQyOGExLi5lMDNiN2UxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtNSw2ICs1LDE4IEBACiAjaW5jbHVkZSAic3RydWN0c2VxLmgiCiAjaW5jbHVkZSAidGltZWZ1bmNzLmgiCiAKKyNpZmRlZiBfX0FQUExFX18KKyNpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKSAmJiBkZWZpbmVkKEhBVkVfRlRJTUUpCisgIC8qCisgICAqIGZsb2F0dGltZSBmYWxscyBiYWNrIHRvIGZ0aW1lIHdoZW4gZ2V0dHRpbWVvZmRheSBmYWlscyBiZWNhdXNlIHRoZSBsYXR0ZXIKKyAgICogbWlnaHQgZmFpbCBvbiBzb21lIHBsYXRmb3Jtcy4gVGhpcyBmYWxsYmFjayBpcyB1bndhbnRlZCBvbiBNYWNPU1ggYmVjYXVzZQorICAgKiB0aGF0IG1ha2VzIGl0IGltcG9zc2libGUgdG8gdXNlIGEgYmluYXJ5IGJ1aWxkIG9uIE9TWCAxMC40IG9uIGVhcmxpZXIKKyAgICogcmVsZWFzZXMgb2YgdGhlIE9TLiBUaGVyZWZvcmUgY2xhaW0gd2UgZG9uJ3Qgc3VwcG9ydCBmdGltZS4KKyAgICovCisjIHVuZGVmIEhBVkVfRlRJTUUKKyNlbmRpZgorI2VuZGlmCisKICNpbmNsdWRlIDxjdHlwZS5oPgogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC01MSwxMSArNjMsMTAgQEAKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAjZW5kaWYgLyogIV9fV0FUQ09NQ19fIHx8IF9fUU5YX18gKi8KIAotI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoTVNfV0lONjQpICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKLS8qIFdpbjMyIGhhcyBiZXR0ZXIgY2xvY2sgcmVwbGFjZW1lbnQKLSAgIFhYWCBXaW42NCBkb2VzIG5vdCB5ZXQsIGJ1dCBtaWdodCB3aGVuIHRoZSBwbGF0Zm9ybSBtYXR1cmVzLiAqLwotI3VuZGVmIEhBVkVfQ0xPQ0sgLyogV2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gZG93biBiZWxvdyAqLwotI2VuZGlmIC8qIE1TX1dJTkRPV1MgJiYgIU1TX1dJTjY0ICovCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisvKiBXaW4zMiBoYXMgYmV0dGVyIGNsb2NrIHJlcGxhY2VtZW50OyB3ZSBoYXZlIG91ciBvd24gdmVyc2lvbiBiZWxvdy4gKi8KKyN1bmRlZiBIQVZFX0NMT0NLCisjZW5kaWYgLyogTVNfV0lORE9XUyAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pICovCiAKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQogI2RlZmluZSBJTkNMX0RPUwpAQCAtMTUwLDcgKzE2MSw3IEBACiB9CiAjZW5kaWYgLyogSEFWRV9DTE9DSyAqLwogCi0jaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiAhZGVmaW5lZChNU19XSU42NCkgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQorI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQogLyogRHVlIHRvIE1hcmsgSGFtbW9uZCBhbmQgVGltIFBldGVycyAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfY2xvY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQpAQCAtMTc5LDcgKzE5MCw3IEBACiB9CiAKICNkZWZpbmUgSEFWRV9DTE9DSyAvKiBTbyBpdCBnZXRzIGluY2x1ZGVkIGluIHRoZSBtZXRob2RzICovCi0jZW5kaWYgLyogTVNfV0lORE9XUyAmJiAhTVNfV0lONjQgKi8KKyNlbmRpZiAvKiBNU19XSU5ET1dTICYmICFkZWZpbmVkKF9fQk9STEFORENfXykgKi8KIAogI2lmZGVmIEhBVkVfQ0xPQ0sKIFB5RG9jX1NUUlZBUihjbG9ja19kb2MsCkBAIC03MDEsNyArNzEyLDcgQEAKICNpZmRlZiBfX0NZR1dJTl9fCiAJdHpzZXQoKTsKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBfdGltZXpvbmUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgX3RpbWV6b25lKTsKKwlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLCBfZGF5bGlnaHQpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKIAkJCSAgIFB5X0J1aWxkVmFsdWUoIih6eikiLCBfdHpuYW1lWzBdLCBfdHpuYW1lWzFdKSk7CkBAIC04MDksNyArODIwLDcgQEAKIAlTZXRDb25zb2xlQ3RybEhhbmRsZXIoIFB5Q3RybEhhbmRsZXIsIFRSVUUpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFRpbWVUeXBlLCAKKwkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0VGltZVR5cGUsCiAJCQkJCSAgJnN0cnVjdF90aW1lX3R5cGVfZGVzYyk7CiAJfQogCVB5X0lOQ1JFRigmU3RydWN0VGltZVR5cGUpOwpAQCAtODQyLDYgKzg1Myw3IEBACiAJCQlyZXR1cm4gKGRvdWJsZSl0LnR2X3NlYyArIHQudHZfdXNlYyowLjAwMDAwMTsKICNlbmRpZiAvKiAhR0VUVElNRU9GREFZX05PX1RaICovCiAJfQorCiAjZW5kaWYgLyogIUhBVkVfR0VUVElNRU9GREFZICovCiAJewogI2lmIGRlZmluZWQoSEFWRV9GVElNRSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvdW5pY29kZWRhdGEuYyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwppbmRleCAyOTc2MTFjLi4wNjYwMzUzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKKysrIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCkBAIC0yMDksNyArMjA5LDcgQEAKICAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgICAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgICAgICBoYXZlX29sZCA9IDE7Ci0gICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgcmMgPSAtMS4wOwogICAgICAgICB9IAogICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgICBoYXZlX29sZCA9IDE7CkBAIC0yMTksNyArMjE5LDcgQEAKIAogICAgIGlmICghaGF2ZV9vbGQpCiAgICAgICAgIHJjID0gUHlfVU5JQ09ERV9UT05VTUVSSUMoKlB5VW5pY29kZV9BU19VTklDT0RFKHYpKTsKLSAgICBpZiAocmMgPCAwKSB7CisgICAgaWYgKHJjID09IC0xLjApIHsKIAlpZiAoZGVmb2JqID09IE5VTEwpIHsKIAkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJub3QgYSBudW1lcmljIGNoYXJhY3RlciIpOwogCSAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYm1vZHVsZS5jIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKaW5kZXggMzViOGMzMi4uMDZiMDY5MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGlibW9kdWxlLmMKKysrIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKQEAgLTY1Myw2ICs2NTMsMTA4IEBACiAgICAgcmV0dXJuIFJldFZhbDsKIH0KIAorUHlEb2NfU1RSVkFSKGNvbXBfY29weV9fZG9jX18sCisiY29weSgpIC0tIFJldHVybiBhIGNvcHkgb2YgdGhlIGNvbXByZXNzaW9uIG9iamVjdC4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK1B5WmxpYl9jb3B5KGNvbXBvYmplY3QgKnNlbGYpCit7CisgICAgY29tcG9iamVjdCAqcmV0dmFsID0gTlVMTDsKKyAgICBpbnQgZXJyOworCisgICAgcmV0dmFsID0gbmV3Y29tcG9iamVjdCgmQ29tcHR5cGUpOworICAgIGlmICghcmV0dmFsKSByZXR1cm4gTlVMTDsKKworICAgIC8qIENvcHkgdGhlIHpzdHJlYW0gc3RhdGUKKyAgICAgKiBXZSB1c2UgRU5URVJfWkxJQiAvIExFQVZFX1pMSUIgdG8gbWFrZSB0aGlzIHRocmVhZC1zYWZlCisgICAgICovCisgICAgRU5URVJfWkxJQgorICAgIGVyciA9IGRlZmxhdGVDb3B5KCZyZXR2YWwtPnpzdCwgJnNlbGYtPnpzdCk7CisgICAgc3dpdGNoKGVycikgeworICAgIGNhc2UoWl9PSyk6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkluY29uc2lzdGVudCBzdHJlYW0gc3RhdGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBjYXNlKFpfTUVNX0VSUk9SKToKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tcHJlc3Npb24gb2JqZWN0Iik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGNvcHlpbmcgY29tcHJlc3Npb24gb2JqZWN0Iik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgUHlfSU5DUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKKyAgICBQeV9JTkNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKKyAgICBQeV9YREVDUkVGKHJldHZhbC0+dW51c2VkX2RhdGEpOworICAgIFB5X1hERUNSRUYocmV0dmFsLT51bmNvbnN1bWVkX3RhaWwpOworICAgIHJldHZhbC0+dW51c2VkX2RhdGEgPSBzZWxmLT51bnVzZWRfZGF0YTsKKyAgICByZXR2YWwtPnVuY29uc3VtZWRfdGFpbCA9IHNlbGYtPnVuY29uc3VtZWRfdGFpbDsKKworICAgIC8qIE1hcmsgaXQgYXMgYmVpbmcgaW5pdGlhbGl6ZWQgKi8KKyAgICByZXR2YWwtPmlzX2luaXRpYWxpc2VkID0gMTsKKworICAgIExFQVZFX1pMSUIKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmV0dmFsOworCitlcnJvcjoKKyAgICBMRUFWRV9aTElCCisgICAgUHlfWERFQ1JFRihyZXR2YWwpOworICAgIHJldHVybiBOVUxMOworfQorCitQeURvY19TVFJWQVIoZGVjb21wX2NvcHlfX2RvY19fLAorImNvcHkoKSAtLSBSZXR1cm4gYSBjb3B5IG9mIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdC4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK1B5WmxpYl91bmNvcHkoY29tcG9iamVjdCAqc2VsZikKK3sKKyAgICBjb21wb2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIGludCBlcnI7CisKKyAgICByZXR2YWwgPSBuZXdjb21wb2JqZWN0KCZEZWNvbXB0eXBlKTsKKyAgICBpZiAoIXJldHZhbCkgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBDb3B5IHRoZSB6c3RyZWFtIHN0YXRlCisgICAgICogV2UgdXNlIEVOVEVSX1pMSUIgLyBMRUFWRV9aTElCIHRvIG1ha2UgdGhpcyB0aHJlYWQtc2FmZQorICAgICAqLworICAgIEVOVEVSX1pMSUIKKyAgICBlcnIgPSBpbmZsYXRlQ29weSgmcmV0dmFsLT56c3QsICZzZWxmLT56c3QpOworICAgIHN3aXRjaChlcnIpIHsKKyAgICBjYXNlKFpfT0spOgorICAgICAgICBicmVhazsKKyAgICBjYXNlKFpfU1RSRUFNX0VSUk9SKToKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbmNvbnNpc3RlbnQgc3RyZWFtIHN0YXRlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgY2FzZShaX01FTV9FUlJPUik6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlY29tcHJlc3Npb24gb2JqZWN0Iik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGNvcHlpbmcgZGVjb21wcmVzc2lvbiBvYmplY3QiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworICAgIFB5X0lOQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOworICAgIFB5X1hERUNSRUYocmV0dmFsLT51bnVzZWRfZGF0YSk7CisgICAgUHlfWERFQ1JFRihyZXR2YWwtPnVuY29uc3VtZWRfdGFpbCk7CisgICAgcmV0dmFsLT51bnVzZWRfZGF0YSA9IHNlbGYtPnVudXNlZF9kYXRhOworICAgIHJldHZhbC0+dW5jb25zdW1lZF90YWlsID0gc2VsZi0+dW5jb25zdW1lZF90YWlsOworCisgICAgLyogTWFyayBpdCBhcyBiZWluZyBpbml0aWFsaXplZCAqLworICAgIHJldHZhbC0+aXNfaW5pdGlhbGlzZWQgPSAxOworCisgICAgTEVBVkVfWkxJQgorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXR2YWw7CisKK2Vycm9yOgorICAgIExFQVZFX1pMSUIKKyAgICBQeV9YREVDUkVGKHJldHZhbCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKIFB5RG9jX1NUUlZBUihkZWNvbXBfZmx1c2hfX2RvY19fLAogImZsdXNoKCBbbGVuZ3RoXSApIC0tIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFueSByZW1haW5pbmdcbiIKICJkZWNvbXByZXNzZWQgZGF0YS4gbGVuZ3RoLCBpZiBnaXZlbiwgaXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGVcbiIKQEAgLTcyNSw2ICs4MjcsOCBAQAogICAgICAgICAgICAgICAgICBjb21wX2NvbXByZXNzX19kb2NfX30sCiAgICAgeyJmbHVzaCIsIChiaW5hcnlmdW5jKVB5WmxpYl9mbHVzaCwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICBjb21wX2ZsdXNoX19kb2NfX30sCisgICAgeyJjb3B5IiwgIChQeUNGdW5jdGlvbilQeVpsaWJfY29weSwgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgIGNvbXBfY29weV9fZG9jX199LAogICAgIHtOVUxMLCBOVUxMfQogfTsKIApAQCAtNzM0LDYgKzgzOCw4IEBACiAgICAgICAgICAgICAgICAgICAgZGVjb21wX2RlY29tcHJlc3NfX2RvY19ffSwKICAgICB7ImZsdXNoIiwgKGJpbmFyeWZ1bmMpUHlabGliX3VuZmx1c2gsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgZGVjb21wX2ZsdXNoX19kb2NfX30sCisgICAgeyJjb3B5IiwgIChQeUNGdW5jdGlvbilQeVpsaWJfdW5jb3B5LCBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgZGVjb21wX2NvcHlfX2RvY19ffSwKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvY2xhc3NvYmplY3QuYyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwppbmRleCA1OTRkZTExLi45Y2ZkZjBlIDEwMDY0NAotLS0gYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jbGFzc29iamVjdC5jCkBAIC04MSwxMiArODEsOSBAQAogCQkJaWYgKCFQeUNsYXNzX0NoZWNrKGJhc2UpKSB7CiAJCQkJaWYgKFB5Q2FsbGFibGVfQ2hlY2soCiAJCQkJCShQeU9iamVjdCAqKSBiYXNlLT5vYl90eXBlKSkKLQkJCQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKwkJCQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCiAJCQkJCQkoUHlPYmplY3QgKikgYmFzZS0+b2JfdHlwZSwKLQkJCQkJCSJPT08iLAotCQkJCQkJbmFtZSwKLQkJCQkJCWJhc2VzLAotCQkJCQkJZGljdCk7CisJCQkJCQluYW1lLCBiYXNlcywgZGljdCwgTlVMTCk7CiAJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkJIlB5Q2xhc3NfTmV3OiBiYXNlIG11c3QgYmUgYSBjbGFzcyIpOwogCQkJCXJldHVybiBOVUxMOwpAQCAtMzIwLDcgKzMxNyw3IEBACiAJfQogCXNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CiAJaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKLQkJaW50IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOworCQlQeV9zc2l6ZV90IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOwogCQlpZiAoc25hbWVbbi0xXSA9PSAnXycgJiYgc25hbWVbbi0yXSA9PSAnXycpIHsKIAkJCWNoYXIgKmVyciA9IE5VTEw7CiAJCQlpZiAoc3RyY21wKHNuYW1lLCAiX19kaWN0X18iKSA9PSAwKQpAQCAtMzgwLDcgKzM3Nyw3IEBACiAJUHlPYmplY3QgKm1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG9wLT5jbF9kaWN0LCAiX19tb2R1bGVfXyIpOwogCVB5T2JqZWN0ICpuYW1lID0gb3AtPmNsX25hbWU7CiAJUHlPYmplY3QgKnJlczsKLQlpbnQgbSwgbjsKKwlQeV9zc2l6ZV90IG0sIG47CiAKIAlpZiAobmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhuYW1lKSkKIAkJcmV0dXJuIGNsYXNzX3JlcHIob3ApOwpAQCAtNjM4LDcgKzYzNSw3IEBACiAJCVB5T2JqZWN0X0dDX0RlbChpbnN0KTsKIAl9CiAJZWxzZSB7Ci0JCWludCByZWZjbnQgPSBpbnN0LT5vYl9yZWZjbnQ7CisJCVB5X3NzaXplX3QgcmVmY250ID0gaW5zdC0+b2JfcmVmY250OwogCQkvKiBfX2RlbF9fIHJlc3VycmVjdGVkIGl0ISAgTWFrZSBpdCBsb29rIGxpa2UgdGhlIG9yaWdpbmFsCiAJCSAqIFB5X0RFQ1JFRiBuZXZlciBoYXBwZW5lZC4KIAkJICovCkBAIC03NzgsNyArNzc1LDcgQEAKIAlQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXMsICp0bXA7CiAJY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKIAlpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgewotCQlpbnQgbiA9IFB5U3RyaW5nX1NpemUobmFtZSk7CisJCVB5X3NzaXplX3QgbiA9IFB5U3RyaW5nX1NpemUobmFtZSk7CiAJCWlmIChzbmFtZVtuLTFdID09ICdfJyAmJiBzbmFtZVtuLTJdID09ICdfJykgewogCQkJaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgewogCQkJCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CkBAIC0xMDc1LDIxICsxMDcyLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfaXRlbShQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeV9zc2l6ZV90IGkpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CisJUHlPYmplY3QgKmZ1bmMsICpyZXM7CiAKIAlpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKQogCQlnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKIAlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKIAlpZiAoZnVuYyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQlhcmcgPSBQeV9CdWlsZFZhbHVlKCIobikiLCBpKTsKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKKwlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIm4iLCBpKTsKIAlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGFyZyk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTI2Myw3ICsxMjU0LDcgQEAKIAkJICovCiAJCVB5RXJyX0NsZWFyKCk7CiAJCXJldHVybiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKChQeU9iamVjdCAqKWluc3QsIG1lbWJlciwKLQkJCQkJICAgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUyk7CisJCQkJCSAgICAgIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpID4gMDsKIAl9CiAJZWxzZQogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9PYmplY3RzL2NvZGVvYmplY3QuYyBiL09iamVjdHMvY29kZW9iamVjdC5jCmluZGV4IDhhZTIzOTkuLmE5YmNiMDEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvY29kZW9iamVjdC5jCkBAIC0xMDIsNiArMTAyLDcgQEAKIAkJY28tPmNvX2ZpcnN0bGluZW5vID0gZmlyc3RsaW5lbm87CiAJCVB5X0lOQ1JFRihsbm90YWIpOwogCQljby0+Y29fbG5vdGFiID0gbG5vdGFiOworICAgICAgICAgICAgICAgIGNvLT5jb196b21iaWVmcmFtZSA9IE5VTEw7CiAJfQogCXJldHVybiBjbzsKIH0KQEAgLTI2NSw2ICsyNjYsOCBAQAogCVB5X1hERUNSRUYoY28tPmNvX2ZpbGVuYW1lKTsKIAlQeV9YREVDUkVGKGNvLT5jb19uYW1lKTsKIAlQeV9YREVDUkVGKGNvLT5jb19sbm90YWIpOworICAgICAgICBpZiAoY28tPmNvX3pvbWJpZWZyYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgUHlPYmplY3RfR0NfRGVsKGNvLT5jb196b21iaWVmcmFtZSk7CiAJUHlPYmplY3RfREVMKGNvKTsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9leGNlcHRpb25zLmMgYi9PYmplY3RzL2V4Y2VwdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjcxMzcyCi0tLSAvZGV2L251bGwKKysrIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKQEAgLTAsMCArMSwyMTQxIEBACisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKKyNpbmNsdWRlICJvc2RlZnMuaCIKKworI2RlZmluZSBNQUtFX0lUX05PTkUoeCkgKHgpID0gUHlfTm9uZTsgUHlfSU5DUkVGKFB5X05vbmUpOworI2RlZmluZSBFWENfTU9EVUxFX05BTUUgImV4Y2VwdGlvbnMuIgorCisvKiBOT1RFOiBJZiB0aGUgZXhjZXB0aW9uIGNsYXNzIGhpZXJhcmNoeSBjaGFuZ2VzLCBkb24ndCBmb3JnZXQgdG8gdXBkYXRlCisgKiBMaWIvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dAorICovCisKK1B5RG9jX1NUUlZBUihleGNlcHRpb25zX2RvYywgIlB5dGhvbidzIHN0YW5kYXJkIGV4Y2VwdGlvbiBjbGFzcyBoaWVyYXJjaHkuXG5cCitcblwKK0V4Y2VwdGlvbnMgZm91bmQgaGVyZSBhcmUgZGVmaW5lZCBib3RoIGluIHRoZSBleGNlcHRpb25zIG1vZHVsZSBhbmQgdGhlXG5cCitidWlsdC1pbiBuYW1lc3BhY2UuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHVzZXItZGVmaW5lZCBleGNlcHRpb25zXG5cCitpbmhlcml0IGZyb20gRXhjZXB0aW9uLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZXhjZXB0aW9uXG5cCitpbmhlcml0YW5jZSBoaWVyYXJjaHkuXG5cCisiKTsKKworLyoKKyAqICAgIEJhc2VFeGNlcHRpb24KKyAqLworc3RhdGljIFB5T2JqZWN0ICoKK0Jhc2VFeGNlcHRpb25fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZjsKKworICAgIHNlbGYgPSAoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgLyogdGhlIGRpY3QgaXMgY3JlYXRlZCBvbiB0aGUgZmx5IGluIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyICovCisgICAgc2VsZi0+bWVzc2FnZSA9IHNlbGYtPmRpY3QgPSBOVUxMOworCisgICAgc2VsZi0+YXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmICghc2VsZi0+YXJncykgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNlbGYtPm1lc3NhZ2UgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsgCisgICAgaWYgKCFzZWxmLT5tZXNzYWdlKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKK3N0YXRpYyBpbnQKK0Jhc2VFeGNlcHRpb25faW5pdChQeUJhc2VFeGNlcHRpb25PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeV9ERUNSRUYoc2VsZi0+YXJncyk7CisgICAgc2VsZi0+YXJncyA9IGFyZ3M7CisgICAgUHlfSU5DUkVGKHNlbGYtPmFyZ3MpOworCisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoc2VsZi0+YXJncykgPT0gMSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+bWVzc2FnZSk7CisgICAgICAgIHNlbGYtPm1lc3NhZ2UgPSBQeVR1cGxlX0dFVF9JVEVNKHNlbGYtPmFyZ3MsIDApOworCVB5X0lOQ1JFRihzZWxmLT5tZXNzYWdlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorQmFzZUV4Y2VwdGlvbl9jbGVhcihQeUJhc2VFeGNlcHRpb25PYmplY3QgKnNlbGYpCit7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZGljdCk7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJncyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+bWVzc2FnZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitCYXNlRXhjZXB0aW9uX2RlYWxsb2MoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICpzZWxmKQoreworICAgIEJhc2VFeGNlcHRpb25fY2xlYXIoc2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKK30KKworaW50CitCYXNlRXhjZXB0aW9uX3RyYXZlcnNlKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCit7CisgICAgaWYgKHNlbGYtPmRpY3QpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmRpY3QpOworICAgIFB5X1ZJU0lUKHNlbGYtPmFyZ3MpOworICAgIFB5X1ZJU0lUKHNlbGYtPm1lc3NhZ2UpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorQmFzZUV4Y2VwdGlvbl9zdHIoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICpzZWxmKQoreworICAgIFB5T2JqZWN0ICpvdXQ7CisKKyAgICBzd2l0Y2ggKFB5U2VxdWVuY2VfTGVuZ3RoKHNlbGYtPmFyZ3MpKSB7CisgICAgY2FzZSAwOgorICAgICAgICBvdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZWxmLT5hcmdzLCAwKTsKKyAgICAgICAgaWYgKHRtcCkgeworICAgICAgICAgICAgb3V0ID0gUHlPYmplY3RfU3RyKHRtcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBvdXQgPSBOVUxMOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAtMToKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgb3V0ID0gUHlPYmplY3RfU3RyKHNlbGYtPmFyZ3MpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgUHlPYmplY3QgKgorQmFzZUV4Y2VwdGlvbl9yZXByKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZikKK3sKKyAgICBQeV9zc2l6ZV90IGFyZ3NfbGVuOworICAgIFB5T2JqZWN0ICpyZXByX3N1ZmZpeDsKKyAgICBQeU9iamVjdCAqcmVwcjsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKmRvdDsKKworICAgIGFyZ3NfbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoc2VsZi0+YXJncyk7CisgICAgaWYgKGFyZ3NfbGVuIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgaWYgKGFyZ3NfbGVuID09IDApIHsKKyAgICAgICAgcmVwcl9zdWZmaXggPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoKSIpOworICAgICAgICBpZiAoIXJlcHJfc3VmZml4KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqYXJnc19yZXByID0gUHlPYmplY3RfUmVwcihzZWxmLT5hcmdzKTsKKyAgICAgICAgaWYgKCFhcmdzX3JlcHIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVwcl9zdWZmaXggPSBhcmdzX3JlcHI7CisgICAgfQorCisgICAgbmFtZSA9IChjaGFyICopc2VsZi0+b2JfdHlwZS0+dHBfbmFtZTsKKyAgICBkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7CisgICAgaWYgKGRvdCAhPSBOVUxMKSBuYW1lID0gZG90KzE7CisKKyAgICByZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAoIXJlcHIpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcHJfc3VmZml4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLCByZXByX3N1ZmZpeCk7CisgICAgcmV0dXJuIHJlcHI7Cit9CisKKy8qIFBpY2tsaW5nIHN1cHBvcnQgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitCYXNlRXhjZXB0aW9uX3JlZHVjZShQeUJhc2VFeGNlcHRpb25PYmplY3QgKnNlbGYpCit7CisgICAgcmV0dXJuIFB5VHVwbGVfUGFjaygzLCBzZWxmLT5vYl90eXBlLCBzZWxmLT5hcmdzLCBzZWxmLT5kaWN0KTsKK30KKworCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorLyogd2hpbGUgdGhpcyBtZXRob2QgZ2VuZXJhdGVzIGZhaXJseSB1bmluc3BpcmVkIG91dHB1dCwgaXQgYSBsZWFzdAorICogZ3VhcmFudGVlcyB0aGF0IHdlIGNhbiBkaXNwbGF5IGV4Y2VwdGlvbnMgdGhhdCBoYXZlIHVuaWNvZGUgYXR0cmlidXRlcworICovCitzdGF0aWMgUHlPYmplY3QgKgorQmFzZUV4Y2VwdGlvbl91bmljb2RlKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZikKK3sKKyAgICBpZiAoUHlTZXF1ZW5jZV9MZW5ndGgoc2VsZi0+YXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKKyAgICBpZiAoUHlTZXF1ZW5jZV9MZW5ndGgoc2VsZi0+YXJncykgPT0gMSkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZWxmLT5hcmdzLCAwKTsKKyAgICAgICAgUHlPYmplY3QgKnVuaWNvZGVfb2JqOworICAgICAgICBpZiAoIXRlbXApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHVuaWNvZGVfb2JqID0gUHlPYmplY3RfVW5pY29kZSh0ZW1wKTsKKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICByZXR1cm4gdW5pY29kZV9vYmo7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9Vbmljb2RlKHNlbGYtPmFyZ3MpOworfQorI2VuZGlmIC8qIFB5X1VTSU5HX1VOSUNPREUgKi8KKworc3RhdGljIFB5TWV0aG9kRGVmIEJhc2VFeGNlcHRpb25fbWV0aG9kc1tdID0geworICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKUJhc2VFeGNlcHRpb25fcmVkdWNlLCBNRVRIX05PQVJHUyB9LAorI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgIHsiX191bmljb2RlX18iLCAoUHlDRnVuY3Rpb24pQmFzZUV4Y2VwdGlvbl91bmljb2RlLCBNRVRIX05PQVJHUyB9LAorI2VuZGlmCisgICB7TlVMTCwgTlVMTCwgMCwgTlVMTH0sCit9OworCisKKworc3RhdGljIFB5T2JqZWN0ICoKK0Jhc2VFeGNlcHRpb25fZ2V0aXRlbShQeUJhc2VFeGNlcHRpb25PYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgpCit7CisgICAgcmV0dXJuIFB5U2VxdWVuY2VfR2V0SXRlbShzZWxmLT5hcmdzLCBpbmRleCk7Cit9CisKK3N0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBCYXNlRXhjZXB0aW9uX2FzX3NlcXVlbmNlID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0OyAqLworICAgIChzc2l6ZWFyZ2Z1bmMpQmFzZUV4Y2VwdGlvbl9nZXRpdGVtLCAgLyogc3FfaXRlbTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3Nfc2xpY2U7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29udGFpbnM7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9jb25jYXQ7ICovCisgICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQ7ICovCit9OworCitzdGF0aWMgUHlNZW1iZXJEZWYgQmFzZUV4Y2VwdGlvbl9tZW1iZXJzW10gPSB7CisgICAgeyJtZXNzYWdlIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCwgbWVzc2FnZSksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIG1lc3NhZ2UiKX0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworCitzdGF0aWMgUHlPYmplY3QgKgorQmFzZUV4Y2VwdGlvbl9nZXRfZGljdChQeUJhc2VFeGNlcHRpb25PYmplY3QgKnNlbGYpCit7CisgICAgaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkgeworICAgICAgICBzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoIXNlbGYtPmRpY3QpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYtPmRpY3QpOworICAgIHJldHVybiBzZWxmLT5kaWN0OworfQorCitzdGF0aWMgaW50CitCYXNlRXhjZXB0aW9uX3NldF9kaWN0KFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbCkKK3sKKyAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZGljdF9fIG1heSBub3QgYmUgZGVsZXRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlEaWN0X0NoZWNrKHZhbCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fZGljdF9fIG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfQ0xFQVIoc2VsZi0+ZGljdCk7CisgICAgUHlfSU5DUkVGKHZhbCk7CisgICAgc2VsZi0+ZGljdCA9IHZhbDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK0Jhc2VFeGNlcHRpb25fZ2V0X2FyZ3MoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICpzZWxmKQoreworICAgIGlmIChzZWxmLT5hcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYtPmFyZ3MpOworICAgIHJldHVybiBzZWxmLT5hcmdzOworfQorCitzdGF0aWMgaW50CitCYXNlRXhjZXB0aW9uX3NldF9hcmdzKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbCkKK3sKKyAgICBQeU9iamVjdCAqc2VxOworICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJncyBtYXkgbm90IGJlIGRlbGV0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzZXEgPSBQeVNlcXVlbmNlX1R1cGxlKHZhbCk7CisgICAgaWYgKCFzZXEpIHJldHVybiAtMTsKKyAgICBzZWxmLT5hcmdzID0gc2VxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlHZXRTZXREZWYgQmFzZUV4Y2VwdGlvbl9nZXRzZXRbXSA9IHsKKyAgICB7Il9fZGljdF9fIiwgKGdldHRlcilCYXNlRXhjZXB0aW9uX2dldF9kaWN0LCAoc2V0dGVyKUJhc2VFeGNlcHRpb25fc2V0X2RpY3R9LAorICAgIHsiYXJncyIsIChnZXR0ZXIpQmFzZUV4Y2VwdGlvbl9nZXRfYXJncywgKHNldHRlcilCYXNlRXhjZXB0aW9uX3NldF9hcmdzfSwKKyAgICB7TlVMTH0sCit9OworCisKK3N0YXRpYyBQeVR5cGVPYmplY3QgX1B5RXhjX0Jhc2VFeGNlcHRpb24gPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgRVhDX01PRFVMRV9OQU1FICJCYXNlRXhjZXB0aW9uIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUHlCYXNlRXhjZXB0aW9uT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAoZGVzdHJ1Y3RvcilCYXNlRXhjZXB0aW9uX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlOyAqLworICAgIChyZXByZnVuYylCYXNlRXhjZXB0aW9uX3JlcHIsIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAmQmFzZUV4Y2VwdGlvbl9hc19zZXF1ZW5jZSwgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYylCYXNlRXhjZXB0aW9uX3N0ciwgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgIC8qdHBfZmxhZ3MqLworICAgIFB5RG9jX1NUUigiQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIiksIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQmFzZUV4Y2VwdGlvbl90cmF2ZXJzZSwgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlCYXNlRXhjZXB0aW9uX2NsZWFyLCAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgQmFzZUV4Y2VwdGlvbl9tZXRob2RzLCAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBCYXNlRXhjZXB0aW9uX21lbWJlcnMsICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIEJhc2VFeGNlcHRpb25fZ2V0c2V0LCAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBvZmZzZXRvZihQeUJhc2VFeGNlcHRpb25PYmplY3QsIGRpY3QpLCAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKUJhc2VFeGNlcHRpb25faW5pdCwgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEJhc2VFeGNlcHRpb25fbmV3LCAgICAgICAgICAvKiB0cF9uZXcgKi8KK307CisvKiB0aGUgQ1B5dGhvbiBBUEkgZXhwZWN0cyBleGNlcHRpb25zIHRvIGJlIChQeU9iamVjdCAqKSAtIGJvdGggYSBob2xkLW92ZXIKK2Zyb20gdGhlIHByZXZpb3VzIGltcGxtZW50YXRpb24gYW5kIGFsc28gYWxsb3dpbmcgUHl0aG9uIG9iamVjdHMgdG8gYmUgdXNlZAoraW4gdGhlIEFQSSAqLworUHlPYmplY3QgKlB5RXhjX0Jhc2VFeGNlcHRpb24gPSAoUHlPYmplY3QgKikmX1B5RXhjX0Jhc2VFeGNlcHRpb247CisKKy8qIG5vdGUgdGhlc2UgbWFjcm9zIG9taXQgdGhlIGxhc3Qgc2VtaWNvbG9uIHNvIHRoZSBtYWNybyBpbnZvY2F0aW9uIG1heQorICogaW5jbHVkZSBpdCBhbmQgbm90IGxvb2sgc3RyYW5nZS4KKyAqLworI2RlZmluZSBTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKEVYQ0JBU0UsIEVYQ05BTUUsIEVYQ0RPQykgXAorc3RhdGljIFB5VHlwZU9iamVjdCBfUHlFeGNfICMjIEVYQ05BTUUgPSB7IFwKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkgXAorICAgIDAsIFwKKyAgICBFWENfTU9EVUxFX05BTUUgIyBFWENOQU1FLCBcCisgICAgc2l6ZW9mKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCksIFwKKyAgICAwLCAoZGVzdHJ1Y3RvcilCYXNlRXhjZXB0aW9uX2RlYWxsb2MsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBcCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgXAorICAgIFB5RG9jX1NUUihFWENET0MpLCAodHJhdmVyc2Vwcm9jKUJhc2VFeGNlcHRpb25fdHJhdmVyc2UsIFwKKyAgICAoaW5xdWlyeSlCYXNlRXhjZXB0aW9uX2NsZWFyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAmXyAjIyBFWENCQVNFLCBcCisgICAgMCwgMCwgMCwgb2Zmc2V0b2YoUHlCYXNlRXhjZXB0aW9uT2JqZWN0LCBkaWN0KSwgXAorICAgIChpbml0cHJvYylCYXNlRXhjZXB0aW9uX2luaXQsIDAsIEJhc2VFeGNlcHRpb25fbmV3LFwKK307IFwKK1B5T2JqZWN0ICpQeUV4Y18gIyMgRVhDTkFNRSA9IChQeU9iamVjdCAqKSZfUHlFeGNfICMjIEVYQ05BTUUKKworI2RlZmluZSBNaWRkbGluZ0V4dGVuZHNFeGNlcHRpb24oRVhDQkFTRSwgRVhDTkFNRSwgRVhDU1RPUkUsIEVYQ0RPQykgXAorc3RhdGljIFB5VHlwZU9iamVjdCBfUHlFeGNfICMjIEVYQ05BTUUgPSB7IFwKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkgXAorICAgIDAsIFwKKyAgICBFWENfTU9EVUxFX05BTUUgIyBFWENOQU1FLCBcCisgICAgc2l6ZW9mKFB5ICMjIEVYQ1NUT1JFICMjIE9iamVjdCksIFwKKyAgICAwLCAoZGVzdHJ1Y3RvcilCYXNlRXhjZXB0aW9uX2RlYWxsb2MsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFwKKyAgICAwLCAwLCAwLCAwLCAwLCBcCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgXAorICAgIFB5RG9jX1NUUihFWENET0MpLCAodHJhdmVyc2Vwcm9jKUJhc2VFeGNlcHRpb25fdHJhdmVyc2UsIFwKKyAgICAoaW5xdWlyeSlCYXNlRXhjZXB0aW9uX2NsZWFyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAmXyAjIyBFWENCQVNFLCBcCisgICAgMCwgMCwgMCwgb2Zmc2V0b2YoUHkgIyMgRVhDU1RPUkUgIyMgT2JqZWN0LCBkaWN0KSwgXAorICAgIChpbml0cHJvYylFWENTVE9SRSAjIyBfaW5pdCwgMCwgRVhDU1RPUkUgIyMgX25ldyxcCit9OyBcCitQeU9iamVjdCAqUHlFeGNfICMjIEVYQ05BTUUgPSAoUHlPYmplY3QgKikmX1B5RXhjXyAjIyBFWENOQU1FCisKKyNkZWZpbmUgQ29tcGxleEV4dGVuZHNFeGNlcHRpb24oRVhDQkFTRSwgRVhDTkFNRSwgRVhDU1RPUkUsIEVYQ0RFQUxMT0MsIEVYQ01FVEhPRFMsIEVYQ01FTUJFUlMsIEVYQ1NUUiwgRVhDRE9DKSBcCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9QeUV4Y18gIyMgRVhDTkFNRSA9IHsgXAorICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKSBcCisgICAgMCwgXAorICAgIEVYQ19NT0RVTEVfTkFNRSAjIEVYQ05BTUUsIFwKKyAgICBzaXplb2YoUHkgIyMgRVhDU1RPUkUgIyMgT2JqZWN0KSwgMCwgXAorICAgIChkZXN0cnVjdG9yKUVYQ1NUT1JFICMjIF9kZWFsbG9jLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBcCisgICAgKHJlcHJmdW5jKUVYQ1NUUiwgMCwgMCwgMCwgXAorICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIFwKKyAgICBQeURvY19TVFIoRVhDRE9DKSwgKHRyYXZlcnNlcHJvYylFWENTVE9SRSAjIyBfdHJhdmVyc2UsIFwKKyAgICAoaW5xdWlyeSlFWENTVE9SRSAjIyBfY2xlYXIsIDAsIDAsIDAsIDAsIEVYQ01FVEhPRFMsIFwKKyAgICBFWENNRU1CRVJTLCAwLCAmXyAjIyBFWENCQVNFLCBcCisgICAgMCwgMCwgMCwgb2Zmc2V0b2YoUHkgIyMgRVhDU1RPUkUgIyMgT2JqZWN0LCBkaWN0KSwgXAorICAgIChpbml0cHJvYylFWENTVE9SRSAjIyBfaW5pdCwgMCwgRVhDU1RPUkUgIyMgX25ldyxcCit9OyBcCitQeU9iamVjdCAqUHlFeGNfICMjIEVYQ05BTUUgPSAoUHlPYmplY3QgKikmX1B5RXhjXyAjIyBFWENOQU1FCisKKworLyoKKyAqICAgIEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24KKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19CYXNlRXhjZXB0aW9uLCBFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICJDb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIG5vbi1leGl0IGV4Y2VwdGlvbnMuIik7CisKKworLyoKKyAqICAgIFN0YW5kYXJkRXJyb3IgZXh0ZW5kcyBFeGNlcHRpb24KKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19FeGNlcHRpb24sIFN0YW5kYXJkRXJyb3IsIAorICAgICJCYXNlIGNsYXNzIGZvciBhbGwgc3RhbmRhcmQgUHl0aG9uIGV4Y2VwdGlvbnMgdGhhdCBkbyBub3QgcmVwcmVzZW50XG4iCisgICAgImludGVycHJldGVyIGV4aXRpbmcuIik7CisKKworLyoKKyAqICAgIFR5cGVFcnJvciBleHRlbmRzIFN0YW5kYXJkRXJyb3IKKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19TdGFuZGFyZEVycm9yLCBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbmFwcHJvcHJpYXRlIGFyZ3VtZW50IHR5cGUuIik7CisKKworLyoKKyAqICAgIFN0b3BJdGVyYXRpb24gZXh0ZW5kcyBFeGNlcHRpb24KKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19FeGNlcHRpb24sIFN0b3BJdGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICJTaWduYWwgdGhlIGVuZCBmcm9tIGl0ZXJhdG9yLm5leHQoKS4iKTsKKworCisvKgorICogICAgR2VuZXJhdG9yRXhpdCBleHRlbmRzIEV4Y2VwdGlvbgorICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX0V4Y2VwdGlvbiwgR2VuZXJhdG9yRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QgdGhhdCBhIGdlbmVyYXRvciBleGl0LiIpOworCisKKy8qCisgKiAgICBTeXN0ZW1FeGl0IGV4dGVuZHMgQmFzZUV4Y2VwdGlvbgorICovCitzdGF0aWMgUHlPYmplY3QgKgorU3lzdGVtRXhpdF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlTeXN0ZW1FeGl0T2JqZWN0ICpzZWxmOworCisgICAgc2VsZiA9IChQeVN5c3RlbUV4aXRPYmplY3QgKilCYXNlRXhjZXB0aW9uX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgTUFLRV9JVF9OT05FKHNlbGYtPmNvZGUpOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKK3N0YXRpYyBpbnQKK1N5c3RlbUV4aXRfaW5pdChQeVN5c3RlbUV4aXRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeV9zc2l6ZV90IHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworCisgICAgaWYgKEJhc2VFeGNlcHRpb25faW5pdCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFB5X0RFQ1JFRihzZWxmLT5jb2RlKTsKKyAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICBzZWxmLT5jb2RlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBlbHNlIGlmIChzaXplID4gMSkKKyAgICAgICAgc2VsZi0+Y29kZSA9IGFyZ3M7CisgICAgUHlfSU5DUkVGKHNlbGYtPmNvZGUpOworICAgIHJldHVybiAwOworfQorCitpbnQKK1N5c3RlbUV4aXRfY2xlYXIoUHlTeXN0ZW1FeGl0T2JqZWN0ICpzZWxmKQoreworICAgIFB5X0NMRUFSKHNlbGYtPmNvZGUpOworICAgIHJldHVybiBCYXNlRXhjZXB0aW9uX2NsZWFyKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK1N5c3RlbUV4aXRfZGVhbGxvYyhQeVN5c3RlbUV4aXRPYmplY3QgKnNlbGYpCit7CisgICAgU3lzdGVtRXhpdF9jbGVhcihzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworfQorCitpbnQKK1N5c3RlbUV4aXRfdHJhdmVyc2UoUHlTeXN0ZW1FeGl0T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKyAgICBQeV9WSVNJVChzZWxmLT5jb2RlKTsKKyAgICByZXR1cm4gQmFzZUV4Y2VwdGlvbl90cmF2ZXJzZSgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiwgdmlzaXQsIGFyZyk7Cit9CisKK3N0YXRpYyBQeU1lbWJlckRlZiBTeXN0ZW1FeGl0X21lbWJlcnNbXSA9IHsKKyAgICB7Im1lc3NhZ2UiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTeXN0ZW1FeGl0T2JqZWN0LCBtZXNzYWdlKSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gbWVzc2FnZSIpfSwKKyAgICB7ImNvZGUiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTeXN0ZW1FeGl0T2JqZWN0LCBjb2RlKSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gY29kZSIpfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCitDb21wbGV4RXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19CYXNlRXhjZXB0aW9uLCBTeXN0ZW1FeGl0LCBTeXN0ZW1FeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtRXhpdF9kZWFsbG9jLCAwLCBTeXN0ZW1FeGl0X21lbWJlcnMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0byBleGl0IGZyb20gdGhlIGludGVycHJldGVyLiIpOworCisvKgorICogICAgS2V5Ym9hcmRJbnRlcnJ1cHQgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfQmFzZUV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICAgICAgICJQcm9ncmFtIGludGVycnVwdGVkIGJ5IHVzZXIuIik7CisKKworLyoKKyAqICAgIEltcG9ydEVycm9yIGV4dGVuZHMgU3RhbmRhcmRFcnJvcgorICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX1N0YW5kYXJkRXJyb3IsIEltcG9ydEVycm9yLAorICAgICAgICAgICJJbXBvcnQgY2FuJ3QgZmluZCBtb2R1bGUsIG9yIGNhbid0IGZpbmQgbmFtZSBpbiBtb2R1bGUuIik7CisKKworLyoKKyAqICAgIEVudmlyb25tZW50RXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK0Vudmlyb25tZW50RXJyb3JfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5RW52aXJvbm1lbnRFcnJvck9iamVjdCAqc2VsZiA9IE5VTEw7CisKKyAgICBzZWxmID0gKFB5RW52aXJvbm1lbnRFcnJvck9iamVjdCAqKUJhc2VFeGNlcHRpb25fbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzZWxmLT5teWVycm5vID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgc2VsZi0+c3RyZXJyb3IgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5maWxlbmFtZSA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKKy8qIFdoZXJlIGEgZnVuY3Rpb24gaGFzIGEgc2luZ2xlIGZpbGVuYW1lLCBzdWNoIGFzIG9wZW4oKSBvciBzb21lCisgKiBvZiB0aGUgb3MgbW9kdWxlIGZ1bmN0aW9ucywgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKCkgaXMKKyAqIGNhbGxlZCwgZ2l2aW5nIGEgdGhpcmQgYXJndW1lbnQgd2hpY2ggaXMgdGhlIGZpbGVuYW1lLiAgQnV0LCBzbworICogdGhhdCBvbGQgY29kZSB1c2luZyBpbi1wbGFjZSB1bnBhY2tpbmcgZG9lc24ndCBicmVhaywgZS5nLjoKKyAqCisgKiBleGNlcHQgSU9FcnJvciwgKGVycm5vLCBzdHJlcnJvcik6CisgKgorICogd2UgaGFjayBhcmdzIHNvIHRoYXQgaXQgb25seSBjb250YWlucyB0d28gaXRlbXMuICBUaGlzIGFsc28KKyAqIG1lYW5zIHdlIG5lZWQgb3VyIG93biBfX3N0cl9fKCkgd2hpY2ggcHJpbnRzIG91dCB0aGUgZmlsZW5hbWUKKyAqIHdoZW4gaXQgd2FzIHN1cHBsaWVkLgorICovCitzdGF0aWMgaW50CitFbnZpcm9ubWVudEVycm9yX2luaXQoUHlFbnZpcm9ubWVudEVycm9yT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywKKyAgICBQeU9iamVjdCAqa3dkcykKK3sKKyAgICBQeU9iamVjdCAqbXllcnJubyA9IE5VTEwsICpzdHJlcnJvciA9IE5VTEwsICpmaWxlbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnN1YnNsaWNlID0gTlVMTDsKKworICAgIGlmIChCYXNlRXhjZXB0aW9uX2luaXQoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8PSAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJFbnZpcm9ubWVudEVycm9yIiwgMiwgMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXllcnJubywgJnN0cmVycm9yLCAmZmlsZW5hbWUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHNlbGYtPm15ZXJybm8pOyAgICAgICAvKiByZXBsYWNpbmcgKi8KKyAgICBzZWxmLT5teWVycm5vID0gbXllcnJubzsKKyAgICBQeV9JTkNSRUYoc2VsZi0+bXllcnJubyk7CisKKyAgICBQeV9ERUNSRUYoc2VsZi0+c3RyZXJyb3IpOyAgICAgIC8qIHJlcGxhY2luZyAqLworICAgIHNlbGYtPnN0cmVycm9yID0gc3RyZXJyb3I7CisgICAgUHlfSU5DUkVGKHNlbGYtPnN0cmVycm9yKTsKKworICAgIC8qIHNlbGYtPmZpbGVuYW1lIHdpbGwgcmVtYWluIFB5X05vbmUgb3RoZXJ3aXNlICovCisgICAgaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmZpbGVuYW1lKTsgICAgICAvKiByZXBsYWNpbmcgKi8KKyAgICAgICAgc2VsZi0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPmZpbGVuYW1lKTsKKworICAgICAgICBzdWJzbGljZSA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMCwgMik7CisgICAgICAgIGlmICghc3Vic2xpY2UpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmFyZ3MpOyAgLyogcmVwbGFjaW5nIGFyZ3MgKi8KKyAgICAgICAgc2VsZi0+YXJncyA9IHN1YnNsaWNlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CitFbnZpcm9ubWVudEVycm9yX2NsZWFyKFB5RW52aXJvbm1lbnRFcnJvck9iamVjdCAqc2VsZikKK3sKKyAgICBQeV9DTEVBUihzZWxmLT5teWVycm5vKTsKKyAgICBQeV9DTEVBUihzZWxmLT5zdHJlcnJvcik7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZW5hbWUpOworICAgIHJldHVybiBCYXNlRXhjZXB0aW9uX2NsZWFyKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK0Vudmlyb25tZW50RXJyb3JfZGVhbGxvYyhQeUVudmlyb25tZW50RXJyb3JPYmplY3QgKnNlbGYpCit7CisgICAgRW52aXJvbm1lbnRFcnJvcl9jbGVhcihzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworfQorCitpbnQKK0Vudmlyb25tZW50RXJyb3JfdHJhdmVyc2UoUHlFbnZpcm9ubWVudEVycm9yT2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsCisgICAgICAgIHZvaWQgKmFyZykKK3sKKyAgICBQeV9WSVNJVChzZWxmLT5teWVycm5vKTsKKyAgICBQeV9WSVNJVChzZWxmLT5zdHJlcnJvcik7CisgICAgUHlfVklTSVQoc2VsZi0+ZmlsZW5hbWUpOworICAgIHJldHVybiBCYXNlRXhjZXB0aW9uX3RyYXZlcnNlKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmLCB2aXNpdCwgYXJnKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK0Vudmlyb25tZW50RXJyb3Jfc3RyKFB5RW52aXJvbm1lbnRFcnJvck9iamVjdCAqc2VsZikKK3sKKyAgICBQeU9iamVjdCAqcnRudmFsID0gTlVMTDsKKworICAgIGlmIChzZWxmLT5maWxlbmFtZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5T2JqZWN0ICpmbXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbRXJybm8gJXNdICVzOiAlcyIpOworICAgICAgICBQeU9iamVjdCAqcmVwciA9IFB5T2JqZWN0X1JlcHIoc2VsZi0+ZmlsZW5hbWUpOworICAgICAgICBQeU9iamVjdCAqdHVwbGUgPSBQeVR1cGxlX05ldygzKTsKKworICAgICAgICBpZiAoIWZtdCB8fCAhcmVwciB8fCAhdHVwbGUpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZm10KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHR1cGxlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5teWVycm5vKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgc2VsZi0+bXllcnJubyk7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5zdHJlcnJvcik7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDEsIHNlbGYtPnN0cmVycm9yKTsKKyAgICAgICAgUHlfSU5DUkVGKHJlcHIpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAyLCByZXByKTsKKworICAgICAgICBydG52YWwgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCB0dXBsZSk7CisKKyAgICAgICAgUHlfREVDUkVGKGZtdCk7CisgICAgICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5T2JqZWN0X0lzVHJ1ZShzZWxmLT5teWVycm5vKSAmJgorICAgICAgICAgICAgUHlPYmplY3RfSXNUcnVlKHNlbGYtPnN0cmVycm9yKSkgeworICAgICAgICBQeU9iamVjdCAqZm10ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiW0Vycm5vICVzXSAlcyIpOworICAgICAgICBQeU9iamVjdCAqdHVwbGUgPSBQeVR1cGxlX05ldygyKTsKKworICAgICAgICBpZiAoIWZtdCB8fCAhdHVwbGUpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZm10KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodHVwbGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPm15ZXJybm8pOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBzZWxmLT5teWVycm5vKTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnN0cmVycm9yKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMSwgc2VsZi0+c3RyZXJyb3IpOworCisgICAgICAgIHJ0bnZhbCA9IFB5U3RyaW5nX0Zvcm1hdChmbXQsIHR1cGxlKTsKKworICAgICAgICBQeV9ERUNSRUYoZm10KTsKKyAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBydG52YWwgPSBCYXNlRXhjZXB0aW9uX3N0cigoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZik7CisKKyAgICByZXR1cm4gcnRudmFsOworfQorCitzdGF0aWMgUHlNZW1iZXJEZWYgRW52aXJvbm1lbnRFcnJvcl9tZW1iZXJzW10gPSB7CisgICAgeyJtZXNzYWdlIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5RW52aXJvbm1lbnRFcnJvck9iamVjdCwgbWVzc2FnZSksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIG1lc3NhZ2UiKX0sCisgICAgeyJlcnJubyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeUVudmlyb25tZW50RXJyb3JPYmplY3QsIG15ZXJybm8pLCAwLAorICAgICAgICBQeURvY19TVFIoImV4Y2VwdGlvbiBlcnJubyIpfSwKKyAgICB7InN0cmVycm9yIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5RW52aXJvbm1lbnRFcnJvck9iamVjdCwgc3RyZXJyb3IpLCAwLAorICAgICAgICBQeURvY19TVFIoImV4Y2VwdGlvbiBzdHJlcnJvciIpfSwKKyAgICB7ImZpbGVuYW1lIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5RW52aXJvbm1lbnRFcnJvck9iamVjdCwgZmlsZW5hbWUpLCAwLAorICAgICAgICBQeURvY19TVFIoImV4Y2VwdGlvbiBmaWxlbmFtZSIpfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKK3N0YXRpYyBQeU9iamVjdCAqCitFbnZpcm9ubWVudEVycm9yX3JlZHVjZShQeUVudmlyb25tZW50RXJyb3JPYmplY3QgKnNlbGYpCit7CisgICAgUHlPYmplY3QgKmFyZ3MgPSBzZWxmLT5hcmdzOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMLCAqdG1wOworICAgIC8qIHNlbGYtPmFyZ3MgaXMgb25seSB0aGUgZmlyc3QgdHdvIHJlYWwgYXJndW1lbnRzIGlmIHRoZXJlIHdhcyBhCisgICAgICogZmlsZSBuYW1lIGdpdmVuIHRvIEVudmlyb25tZW50RXJyb3IuICovCisgICAgaWYgKFB5VHVwbGVfQ2hlY2soYXJncykgJiYgCisgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMiAmJgorICAgICAgICBzZWxmLT5maWxlbmFtZSAhPSBQeV9Ob25lKSB7ICAKKworICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMyk7CisgICAgICAgIGlmICghYXJncykgcmV0dXJuIE5VTEw7CisgICAgICAgIAorICAgICAgICB0bXAgPSBQeVR1cGxlX0dldEl0ZW0oc2VsZi0+YXJncywgMCk7CisgICAgICAgIGlmICghdG1wKSBnb3RvIGZpbmlzaDsKKyAgICAgICAgUHlfSU5DUkVGKHRtcCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgdG1wKTsKKyAgICAgICAgCisgICAgICAgIHRtcCA9IFB5VHVwbGVfR2V0SXRlbShzZWxmLT5hcmdzLCAxKTsKKyAgICAgICAgaWYgKCF0bXApIGdvdG8gZmluaXNoOworICAgICAgICBQeV9JTkNSRUYodG1wKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB0bXApOworCisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5maWxlbmFtZSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMiwgc2VsZi0+ZmlsZW5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICB9CisgICAgcmVzID0gUHlUdXBsZV9QYWNrKDMsIHNlbGYtPm9iX3R5cGUsIGFyZ3MsIHNlbGYtPmRpY3QpOworICBmaW5pc2g6CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXM7Cit9CisKKworc3RhdGljIFB5TWV0aG9kRGVmIEVudmlyb25tZW50RXJyb3JfbWV0aG9kc1tdID0geworICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilFbnZpcm9ubWVudEVycm9yX3JlZHVjZSwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMfQorfTsKKworQ29tcGxleEV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgRW52aXJvbm1lbnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50RXJyb3IsIEVudmlyb25tZW50RXJyb3JfZGVhbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50RXJyb3JfbWV0aG9kcywgRW52aXJvbm1lbnRFcnJvcl9tZW1iZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnRFcnJvcl9zdHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2UgY2xhc3MgZm9yIEkvTyByZWxhdGVkIGVycm9ycy4iKTsKKworCisvKgorICogICAgSU9FcnJvciBleHRlbmRzIEVudmlyb25tZW50RXJyb3IKKyAqLworTWlkZGxpbmdFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX0Vudmlyb25tZW50RXJyb3IsIElPRXJyb3IsIAorICAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50RXJyb3IsICJJL08gb3BlcmF0aW9uIGZhaWxlZC4iKTsKKworCisvKgorICogICAgT1NFcnJvciBleHRlbmRzIEVudmlyb25tZW50RXJyb3IKKyAqLworTWlkZGxpbmdFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX0Vudmlyb25tZW50RXJyb3IsIE9TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnRFcnJvciwgIk9TIHN5c3RlbSBjYWxsIGZhaWxlZC4iKTsKKworCisvKgorICogICAgV2luZG93c0Vycm9yIGV4dGVuZHMgT1NFcnJvcgorICovCisjaWZkZWYgTVNfV0lORE9XUworI2luY2x1ZGUgImVycm1hcC5oIgorCitpbnQKK1dpbmRvd3NFcnJvcl9jbGVhcihQeVdpbmRvd3NFcnJvck9iamVjdCAqc2VsZikKK3sKKyAgICBQeV9DTEVBUihzZWxmLT5teWVycm5vKTsKKyAgICBQeV9DTEVBUihzZWxmLT5zdHJlcnJvcik7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZW5hbWUpOworICAgIFB5X0NMRUFSKHNlbGYtPndpbmVycm9yKTsKKyAgICByZXR1cm4gQmFzZUV4Y2VwdGlvbl9jbGVhcigoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitXaW5kb3dzRXJyb3JfZGVhbGxvYyhQeVdpbmRvd3NFcnJvck9iamVjdCAqc2VsZikKK3sKKyAgICBXaW5kb3dzRXJyb3JfY2xlYXIoc2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKK30KKworaW50CitXaW5kb3dzRXJyb3JfdHJhdmVyc2UoUHlXaW5kb3dzRXJyb3JPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworICAgIFB5X1ZJU0lUKHNlbGYtPm15ZXJybm8pOworICAgIFB5X1ZJU0lUKHNlbGYtPnN0cmVycm9yKTsKKyAgICBQeV9WSVNJVChzZWxmLT5maWxlbmFtZSk7CisgICAgUHlfVklTSVQoc2VsZi0+d2luZXJyb3IpOworICAgIHJldHVybiBCYXNlRXhjZXB0aW9uX3RyYXZlcnNlKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmLCB2aXNpdCwgYXJnKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK1dpbmRvd3NFcnJvcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmplY3QgKm9fZXJyY29kZSA9IE5VTEw7CisgICAgbG9uZyBlcnJjb2RlOworICAgIFB5V2luZG93c0Vycm9yT2JqZWN0ICpzZWxmOworICAgIGxvbmcgcG9zaXhfZXJybm87CisKKyAgICBzZWxmID0gKFB5V2luZG93c0Vycm9yT2JqZWN0ICopRW52aXJvbm1lbnRFcnJvcl9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChzZWxmLT5teWVycm5vID09IFB5X05vbmUpIHsKKyAgICAgICAgc2VsZi0+d2luZXJyb3IgPSBzZWxmLT5teWVycm5vOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+d2luZXJyb3IpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICB9CisKKyAgICAvKiBTZXQgZXJybm8gdG8gdGhlIFBPU0lYIGVycm5vLCBhbmQgd2luZXJyb3IgdG8gdGhlIFdpbjMyCisgICAgICAgZXJyb3IgY29kZS4gKi8KKyAgICBlcnJjb2RlID0gUHlJbnRfQXNMb25nKHNlbGYtPm15ZXJybm8pOworICAgIGlmIChlcnJjb2RlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgIC8qIGdpdmUgYSBjbGVhcmVyIGVycm9yIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlcnJubyBoYXMgdG8gYmUgYW4gaW50ZWdlciIpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgcG9zaXhfZXJybm8gPSB3aW5lcnJvcl90b19lcnJubyhlcnJjb2RlKTsKKworICAgIHNlbGYtPndpbmVycm9yID0gc2VsZi0+bXllcnJubzsKKworICAgIG9fZXJyY29kZSA9IFB5SW50X0Zyb21Mb25nKHBvc2l4X2Vycm5vKTsKKyAgICBpZiAoIW9fZXJyY29kZSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICBzZWxmLT5teWVycm5vID0gb19lcnJjb2RlOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CitmYWlsZWQ6CisgICAgLyogQ291bGQgbm90IHNldCBlcnJuby4gKi8KKyAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK1dpbmRvd3NFcnJvcl9pbml0KFB5V2luZG93c0Vycm9yT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlPYmplY3QgKm9fZXJyY29kZSA9IE5VTEw7CisgICAgbG9uZyBlcnJjb2RlOworICAgIGxvbmcgcG9zaXhfZXJybm87CisKKyAgICBpZiAoRW52aXJvbm1lbnRFcnJvcl9pbml0KChQeUVudmlyb25tZW50RXJyb3JPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKQorICAgICAgICAgICAgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChzZWxmLT5teWVycm5vID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPndpbmVycm9yKTsKKyAgICAgICAgc2VsZi0+d2luZXJyb3IgPSBzZWxmLT5teWVycm5vOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+d2luZXJyb3IpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBTZXQgZXJybm8gdG8gdGhlIFBPU0lYIGVycm5vLCBhbmQgd2luZXJyb3IgdG8gdGhlIFdpbjMyCisgICAgICAgZXJyb3IgY29kZS4gKi8KKyAgICBlcnJjb2RlID0gUHlJbnRfQXNMb25nKHNlbGYtPm15ZXJybm8pOworICAgIGlmIChlcnJjb2RlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwb3NpeF9lcnJubyA9IHdpbmVycm9yX3RvX2Vycm5vKGVycmNvZGUpOworCisgICAgUHlfREVDUkVGKHNlbGYtPndpbmVycm9yKTsKKyAgICBzZWxmLT53aW5lcnJvciA9IHNlbGYtPm15ZXJybm87CisKKyAgICBvX2VycmNvZGUgPSBQeUludF9Gcm9tTG9uZyhwb3NpeF9lcnJubyk7CisgICAgaWYgKCFvX2VycmNvZGUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHNlbGYtPm15ZXJybm8gPSBvX2VycmNvZGU7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorV2luZG93c0Vycm9yX3N0cihQeVdpbmRvd3NFcnJvck9iamVjdCAqc2VsZikKK3sKKyAgICBQeU9iamVjdCAqcmVwciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZtdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnR1cGxlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcnRudmFsID0gTlVMTDsKKworICAgIGlmIChzZWxmLT5maWxlbmFtZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIGZtdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIltFcnJvciAlc10gJXM6ICVzIik7CisgICAgICAgIHJlcHIgPSBQeU9iamVjdF9SZXByKHNlbGYtPmZpbGVuYW1lKTsKKyAgICAgICAgaWYgKCFmbXQgfHwgIXJlcHIpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisKKyAgICAgICAgdHVwbGUgPSBQeVR1cGxlX1BhY2soMywgc2VsZi0+bXllcnJubywgc2VsZi0+c3RyZXJyb3IsIHJlcHIpOworICAgICAgICBpZiAoIXR1cGxlKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworCisgICAgICAgIHJ0bnZhbCA9IFB5U3RyaW5nX0Zvcm1hdChmbXQsIHR1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlPYmplY3RfSXNUcnVlKHNlbGYtPm15ZXJybm8pICYmCisgICAgICAgICAgICBQeU9iamVjdF9Jc1RydWUoc2VsZi0+c3RyZXJyb3IpKSB7CisgICAgICAgIGZtdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIltFcnJvciAlc10gJXMiKTsKKyAgICAgICAgaWYgKCFmbXQpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisKKyAgICAgICAgdHVwbGUgPSBQeVR1cGxlX1BhY2soMiwgc2VsZi0+bXllcnJubywgc2VsZi0+c3RyZXJyb3IpOworICAgICAgICBpZiAoIXR1cGxlKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworCisgICAgICAgIHJ0bnZhbCA9IFB5U3RyaW5nX0Zvcm1hdChmbXQsIHR1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHJ0bnZhbCA9IEVudmlyb25tZW50RXJyb3Jfc3RyKChQeUVudmlyb25tZW50RXJyb3JPYmplY3QgKilzZWxmKTsKKworICBmaW5hbGx5OgorICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgUHlfWERFQ1JFRihmbXQpOworICAgIFB5X1hERUNSRUYodHVwbGUpOworICAgIHJldHVybiBydG52YWw7Cit9CisKK3N0YXRpYyBQeU1lbWJlckRlZiBXaW5kb3dzRXJyb3JfbWVtYmVyc1tdID0geworICAgIHsibWVzc2FnZSIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVdpbmRvd3NFcnJvck9iamVjdCwgbWVzc2FnZSksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIG1lc3NhZ2UiKX0sCisgICAgeyJlcnJubyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVdpbmRvd3NFcnJvck9iamVjdCwgbXllcnJubyksIDAsCisgICAgICAgIFB5RG9jX1NUUigiUE9TSVggZXhjZXB0aW9uIGNvZGUiKX0sCisgICAgeyJzdHJlcnJvciIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVdpbmRvd3NFcnJvck9iamVjdCwgc3RyZXJyb3IpLCAwLAorICAgICAgICBQeURvY19TVFIoImV4Y2VwdGlvbiBzdHJlcnJvciIpfSwKKyAgICB7ImZpbGVuYW1lIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5V2luZG93c0Vycm9yT2JqZWN0LCBmaWxlbmFtZSksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIGZpbGVuYW1lIil9LAorICAgIHsid2luZXJyb3IiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlXaW5kb3dzRXJyb3JPYmplY3QsIHdpbmVycm9yKSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJXaW4zMiBleGNlcHRpb24gY29kZSIpfSwKKyAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCitDb21wbGV4RXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19PU0Vycm9yLCBXaW5kb3dzRXJyb3IsIFdpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd3NFcnJvcl9kZWFsbG9jLCAwLCBXaW5kb3dzRXJyb3JfbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd3NFcnJvcl9zdHIsICJNUy1XaW5kb3dzIE9TIHN5c3RlbSBjYWxsIGZhaWxlZC4iKTsKKworI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KKworCisvKgorICogICAgVk1TRXJyb3IgZXh0ZW5kcyBPU0Vycm9yIChJIHRoaW5rKQorICovCisjaWZkZWYgX19WTVMKK01pZGRsaW5nRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19PU0Vycm9yLCBWTVNFcnJvciwgRW52aXJvbm1lbnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiT3BlblZNUyBPUyBzeXN0ZW0gY2FsbCBmYWlsZWQuIik7CisjZW5kaWYKKworCisvKgorICogICAgRU9GRXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJSZWFkIGJleW9uZCBlbmQgb2YgZmlsZS4iKTsKKworCisvKgorICogICAgUnVudGltZUVycm9yIGV4dGVuZHMgU3RhbmRhcmRFcnJvcgorICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX1N0YW5kYXJkRXJyb3IsIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIlVuc3BlY2lmaWVkIHJ1bi10aW1lIGVycm9yLiIpOworCisKKy8qCisgKiAgICBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgUnVudGltZUVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfUnVudGltZUVycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIG9yIGZ1bmN0aW9uIGhhc24ndCBiZWVuIGltcGxlbWVudGVkIHlldC4iKTsKKworLyoKKyAqICAgIE5hbWVFcnJvciBleHRlbmRzIFN0YW5kYXJkRXJyb3IKKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19TdGFuZGFyZEVycm9yLCBOYW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJOYW1lIG5vdCBmb3VuZCBnbG9iYWxseS4iKTsKKworLyoKKyAqICAgIFVuYm91bmRMb2NhbEVycm9yIGV4dGVuZHMgTmFtZUVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfTmFtZUVycm9yLCBVbmJvdW5kTG9jYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIkxvY2FsIG5hbWUgcmVmZXJlbmNlZCBidXQgbm90IGJvdW5kIHRvIGEgdmFsdWUuIik7CisKKy8qCisgKiAgICBBdHRyaWJ1dGVFcnJvciBleHRlbmRzIFN0YW5kYXJkRXJyb3IKKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19TdGFuZGFyZEVycm9yLCBBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBub3QgZm91bmQuIik7CisKKworLyoKKyAqICAgIFN5bnRheEVycm9yIGV4dGVuZHMgU3RhbmRhcmRFcnJvcgorICovCitzdGF0aWMgUHlPYmplY3QgKgorU3ludGF4RXJyb3JfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5U3ludGF4RXJyb3JPYmplY3QgKnNlbGYgPSBOVUxMOworCisgICAgc2VsZiA9IChQeVN5bnRheEVycm9yT2JqZWN0ICopQmFzZUV4Y2VwdGlvbl9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIE1BS0VfSVRfTk9ORShzZWxmLT5tc2cpCisgICAgTUFLRV9JVF9OT05FKHNlbGYtPmZpbGVuYW1lKQorICAgIE1BS0VfSVRfTk9ORShzZWxmLT5saW5lbm8pCisgICAgTUFLRV9JVF9OT05FKHNlbGYtPm9mZnNldCkKKyAgICBNQUtFX0lUX05PTkUoc2VsZi0+dGV4dCkKKworICAgIC8qIHRoaXMgaXMgYWx3YXlzIE5vbmUgLSB5ZXMsIEkga25vdyBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZAorICAgICAgIGFueXdoZXJlLCBidXQgaXQgd2FzIGluIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiAqLworICAgIE1BS0VfSVRfTk9ORShzZWxmLT5wcmludF9maWxlX2FuZF9saW5lKQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Cit9CisKK3N0YXRpYyBpbnQKK1N5bnRheEVycm9yX2luaXQoUHlTeW50YXhFcnJvck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworICAgIFB5T2JqZWN0ICppbmZvID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGxlbmFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworCisgICAgaWYgKEJhc2VFeGNlcHRpb25faW5pdCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChsZW5hcmdzID49IDEpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPm1zZyk7CisgICAgICAgIHNlbGYtPm1zZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5tc2cpOworICAgIH0KKyAgICBpZiAobGVuYXJncyA9PSAyKSB7CisgICAgICAgIGluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOworICAgICAgICBpbmZvID0gUHlTZXF1ZW5jZV9UdXBsZShpbmZvKTsKKyAgICAgICAgaWYgKCFpbmZvKSByZXR1cm4gLTE7CisKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmZpbGVuYW1lKTsKKyAgICAgICAgc2VsZi0+ZmlsZW5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGluZm8sIDApOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+ZmlsZW5hbWUpOworCisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5saW5lbm8pOworICAgICAgICBzZWxmLT5saW5lbm8gPSBQeVR1cGxlX0dFVF9JVEVNKGluZm8sIDEpOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+bGluZW5vKTsKKworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+b2Zmc2V0KTsKKyAgICAgICAgc2VsZi0+b2Zmc2V0ID0gUHlUdXBsZV9HRVRfSVRFTShpbmZvLCAyKTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPm9mZnNldCk7CisKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPnRleHQpOworICAgICAgICBzZWxmLT50ZXh0ID0gUHlUdXBsZV9HRVRfSVRFTShpbmZvLCAzKTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnRleHQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CitTeW50YXhFcnJvcl9jbGVhcihQeVN5bnRheEVycm9yT2JqZWN0ICpzZWxmKQoreworICAgIFB5X0NMRUFSKHNlbGYtPm1zZyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZW5hbWUpOworICAgIFB5X0NMRUFSKHNlbGYtPmxpbmVubyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+b2Zmc2V0KTsKKyAgICBQeV9DTEVBUihzZWxmLT50ZXh0KTsKKyAgICBQeV9DTEVBUihzZWxmLT5wcmludF9maWxlX2FuZF9saW5lKTsKKyAgICByZXR1cm4gQmFzZUV4Y2VwdGlvbl9jbGVhcigoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCitTeW50YXhFcnJvcl9kZWFsbG9jKFB5U3ludGF4RXJyb3JPYmplY3QgKnNlbGYpCit7CisgICAgU3ludGF4RXJyb3JfY2xlYXIoc2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKK30KKworaW50CitTeW50YXhFcnJvcl90cmF2ZXJzZShQeVN5bnRheEVycm9yT2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKyAgICBQeV9WSVNJVChzZWxmLT5tc2cpOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbGVuYW1lKTsKKyAgICBQeV9WSVNJVChzZWxmLT5saW5lbm8pOworICAgIFB5X1ZJU0lUKHNlbGYtPm9mZnNldCk7CisgICAgUHlfVklTSVQoc2VsZi0+dGV4dCk7CisgICAgUHlfVklTSVQoc2VsZi0+cHJpbnRfZmlsZV9hbmRfbGluZSk7CisgICAgcmV0dXJuIEJhc2VFeGNlcHRpb25fdHJhdmVyc2UoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYsIHZpc2l0LCBhcmcpOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCAibXlfYmFzZW5hbWUiIGluc3RlYWQgb2YganVzdCAiYmFzZW5hbWUiIHRvIGF2b2lkIG5hbWUKKyAgIGNvbmZsaWN0cyB3aXRoIGdsaWJjOyBiYXNlbmFtZSBpcyBhbHJlYWR5IHByb3RvdHlwZWQgaWYgX0dOVV9TT1VSQ0UgaXMKKyAgIGRlZmluZWQsIGFuZCBQeXRob24gZG9lcyBkZWZpbmUgdGhhdC4gKi8KK3N0YXRpYyBjaGFyICoKK215X2Jhc2VuYW1lKGNoYXIgKm5hbWUpCit7CisgICAgY2hhciAqY3AgPSBuYW1lOworICAgIGNoYXIgKnJlc3VsdCA9IG5hbWU7CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gIj8/PyI7CisgICAgd2hpbGUgKCpjcCAhPSAnXDAnKSB7CisgICAgICAgIGlmICgqY3AgPT0gU0VQKQorICAgICAgICAgICAgcmVzdWx0ID0gY3AgKyAxOworICAgICAgICArK2NwOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCitTeW50YXhFcnJvcl9zdHIoUHlTeW50YXhFcnJvck9iamVjdCAqc2VsZikKK3sKKyAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzdHIgPSBQeU9iamVjdF9TdHIoc2VsZi0+bXNnKTsKKyAgICByZXN1bHQgPSBzdHI7CisKKyAgICAvKiBYWFggLS0gZG8gYWxsIHRoZSBhZGRpdGlvbmFsIGZvcm1hdHRpbmcgd2l0aCBmaWxlbmFtZSBhbmQKKyAgICAgICBsaW5lbm8gaGVyZSAqLworCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHN0cikpIHsKKyAgICAgICAgaW50IGhhdmVfZmlsZW5hbWUgPSAwOworICAgICAgICBpbnQgaGF2ZV9saW5lbm8gPSAwOworICAgICAgICBjaGFyICpidWZmZXIgPSBOVUxMOworCisgICAgICAgIGhhdmVfZmlsZW5hbWUgPSAoc2VsZi0+ZmlsZW5hbWUgIT0gTlVMTCkgJiYgCisgICAgICAgICAgICBQeVN0cmluZ19DaGVjayhzZWxmLT5maWxlbmFtZSk7CisgICAgICAgIGhhdmVfbGluZW5vID0gKHNlbGYtPmxpbmVubyAhPSBOVUxMKSAmJiBQeUludF9DaGVjayhzZWxmLT5saW5lbm8pOworCisgICAgICAgIGlmIChoYXZlX2ZpbGVuYW1lIHx8IGhhdmVfbGluZW5vKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGJ1ZnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShzdHIpICsgNjQ7CisgICAgICAgICAgICBpZiAoaGF2ZV9maWxlbmFtZSkKKyAgICAgICAgICAgICAgICBidWZzaXplICs9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYtPmZpbGVuYW1lKTsKKworICAgICAgICAgICAgYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZV9maWxlbmFtZSAmJiBoYXZlX2xpbmVubykKKyAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZnNpemUsICIlcyAoJXMsIGxpbmUgJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG15X2Jhc2VuYW1lKFB5U3RyaW5nX0FTX1NUUklORyhzZWxmLT5maWxlbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfQXNMb25nKHNlbGYtPmxpbmVubykpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhdmVfZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZzaXplLCAiJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG15X2Jhc2VuYW1lKFB5U3RyaW5nX0FTX1NUUklORyhzZWxmLT5maWxlbmFtZSkpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXZlX2xpbmVubykKKyAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZnNpemUsICIlcyAobGluZSAlbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfQXNMb25nKHNlbGYtPmxpbmVubykpOworCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUoYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5TWVtYmVyRGVmIFN5bnRheEVycm9yX21lbWJlcnNbXSA9IHsKKyAgICB7Im1lc3NhZ2UiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTeW50YXhFcnJvck9iamVjdCwgbWVzc2FnZSksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIG1lc3NhZ2UiKX0sCisgICAgeyJtc2ciLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTeW50YXhFcnJvck9iamVjdCwgbXNnKSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gbXNnIil9LAorICAgIHsiZmlsZW5hbWUiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTeW50YXhFcnJvck9iamVjdCwgZmlsZW5hbWUpLCAwLAorICAgICAgICBQeURvY19TVFIoImV4Y2VwdGlvbiBmaWxlbmFtZSIpfSwKKyAgICB7ImxpbmVubyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVN5bnRheEVycm9yT2JqZWN0LCBsaW5lbm8pLCAwLAorICAgICAgICBQeURvY19TVFIoImV4Y2VwdGlvbiBsaW5lbm8iKX0sCisgICAgeyJvZmZzZXQiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTeW50YXhFcnJvck9iamVjdCwgb2Zmc2V0KSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gb2Zmc2V0Iil9LAorICAgIHsidGV4dCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVN5bnRheEVycm9yT2JqZWN0LCB0ZXh0KSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gdGV4dCIpfSwKKyAgICB7InByaW50X2ZpbGVfYW5kX2xpbmUiLCBUX09CSkVDVCwKKyAgICAgICAgb2Zmc2V0b2YoUHlTeW50YXhFcnJvck9iamVjdCwgcHJpbnRfZmlsZV9hbmRfbGluZSksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIHByaW50X2ZpbGVfYW5kX2xpbmUiKX0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLworfTsKKworQ29tcGxleEV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgU3ludGF4RXJyb3IsIFN5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3JfZGVhbGxvYywgMCwgU3ludGF4RXJyb3JfbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yX3N0ciwgIkludmFsaWQgc3ludGF4LiIpOworCisKKy8qCisgKiAgICBJbmRlbnRhdGlvbkVycm9yIGV4dGVuZHMgU3ludGF4RXJyb3IKKyAqLworTWlkZGxpbmdFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX1N5bnRheEVycm9yLCBJbmRlbnRhdGlvbkVycm9yLCBTeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wcm9wZXIgaW5kZW50YXRpb24uIik7CisKKworLyoKKyAqICAgIFRhYkVycm9yIGV4dGVuZHMgSW5kZW50YXRpb25FcnJvcgorICovCitNaWRkbGluZ0V4dGVuZHNFeGNlcHRpb24oUHlFeGNfSW5kZW50YXRpb25FcnJvciwgVGFiRXJyb3IsIFN5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJJbXByb3BlciBtaXh0dXJlIG9mIHNwYWNlcyBhbmQgdGFicy4iKTsKKworCisvKgorICogICAgTG9va3VwRXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgTG9va3VwRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJCYXNlIGNsYXNzIGZvciBsb29rdXAgZXJyb3JzLiIpOworCisKKy8qCisgKiAgICBJbmRleEVycm9yIGV4dGVuZHMgTG9va3VwRXJyb3IKKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19Mb29rdXBFcnJvciwgSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIlNlcXVlbmNlIGluZGV4IG91dCBvZiByYW5nZS4iKTsKKworCisvKgorICogICAgS2V5RXJyb3IgZXh0ZW5kcyBMb29rdXBFcnJvcgorICovCitzdGF0aWMgUHlPYmplY3QgKgorS2V5RXJyb3Jfc3RyKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZikKK3sKKyAgICAvKiBJZiBhcmdzIGlzIGEgdHVwbGUgb2YgZXhhY3RseSBvbmUgaXRlbSwgYXBwbHkgcmVwciB0byBhcmdzWzBdLgorICAgICAgIFRoaXMgaXMgZG9uZSBzbyB0aGF0IGUuZy4gdGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkge31bJyddIHByaW50cworICAgICAgICAgS2V5RXJyb3I6ICcnCisgICAgICAgcmF0aGVyIHRoYW4gdGhlIGNvbmZ1c2luZworICAgICAgICAgS2V5RXJyb3IKKyAgICAgICBhbG9uZS4gIFRoZSBkb3duc2lkZSBpcyB0aGF0IGlmIEtleUVycm9yIGlzIHJhaXNlZCB3aXRoIGFuIGV4cGxhbmF0b3J5CisgICAgICAgc3RyaW5nLCB0aGF0IHN0cmluZyB3aWxsIGJlIGRpc3BsYXllZCBpbiBxdW90ZXMuICBUb28gYmFkLgorICAgICAgIElmIGFyZ3MgaXMgYW55dGhpbmcgZWxzZSwgdXNlIHRoZSBkZWZhdWx0IEJhc2VFeGNlcHRpb25fX3N0cl9fKCkuCisgICAgKi8KKyAgICBpZiAoUHlUdXBsZV9DaGVjayhzZWxmLT5hcmdzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKHNlbGYtPmFyZ3MpID09IDEpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0oc2VsZi0+YXJncywgMCk7CisgICAgICAgIHJldHVybiBQeU9iamVjdF9SZXByKGtleSk7CisgICAgfQorICAgIHJldHVybiBCYXNlRXhjZXB0aW9uX3N0cihzZWxmKTsKK30KKworQ29tcGxleEV4dGVuZHNFeGNlcHRpb24oUHlFeGNfTG9va3VwRXJyb3IsIEtleUVycm9yLCBCYXNlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgS2V5RXJyb3Jfc3RyLCAiTWFwcGluZyBrZXkgbm90IGZvdW5kLiIpOworCisKKy8qCisgKiAgICBWYWx1ZUVycm9yIGV4dGVuZHMgU3RhbmRhcmRFcnJvcgorICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX1N0YW5kYXJkRXJyb3IsIFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbmFwcHJvcHJpYXRlIGFyZ3VtZW50IHZhbHVlIChvZiBjb3JyZWN0IHR5cGUpLiIpOworCisvKgorICogICAgVW5pY29kZUVycm9yIGV4dGVuZHMgVmFsdWVFcnJvcgorICovCisKK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfVmFsdWVFcnJvciwgVW5pY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZSByZWxhdGVkIGVycm9yLiIpOworCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorc3RhdGljIGludAorZ2V0X2ludChQeU9iamVjdCAqYXR0ciwgUHlfc3NpemVfdCAqdmFsdWUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKCFhdHRyKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlLjIwMHMgYXR0cmlidXRlIG5vdCBzZXQiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChQeUludF9DaGVjayhhdHRyKSkgeworICAgICAgICAqdmFsdWUgPSBQeUludF9BU19MT05HKGF0dHIpOworICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKGF0dHIpKSB7CisgICAgICAgICp2YWx1ZSA9IF9QeUxvbmdfQXNTc2l6ZV90KGF0dHIpOworICAgICAgICBpZiAoKnZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcyBhdHRyaWJ1dGUgbXVzdCBiZSBpbnQiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2V0X3NzaXplX3QoUHlPYmplY3QgKiphdHRyLCBQeV9zc2l6ZV90IHZhbHVlKQoreworICAgIFB5T2JqZWN0ICpvYmogPSBQeUludF9Gcm9tU3NpemVfdCh2YWx1ZSk7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKCphdHRyKTsKKyAgICAqYXR0ciA9IG9iajsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2dldF9zdHJpbmcoUHlPYmplY3QgKmF0dHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKCFhdHRyKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlLjIwMHMgYXR0cmlidXRlIG5vdCBzZXQiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhhdHRyKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJS4yMDBzIGF0dHJpYnV0ZSBtdXN0IGJlIHN0ciIsIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGF0dHIpOworICAgIHJldHVybiBhdHRyOworfQorCisKK3N0YXRpYyBpbnQKK3NldF9zdHJpbmcoUHlPYmplY3QgKiphdHRyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBQeU9iamVjdCAqb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSk7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKCphdHRyKTsKKyAgICAqYXR0ciA9IG9iajsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorZ2V0X3VuaWNvZGUoUHlPYmplY3QgKmF0dHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKCFhdHRyKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlLjIwMHMgYXR0cmlidXRlIG5vdCBzZXQiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soYXR0cikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMgYXR0cmlidXRlIG11c3QgYmUgdW5pY29kZSIsIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGF0dHIpOworICAgIHJldHVybiBhdHRyOworfQorCitQeU9iamVjdCAqCitQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZyhQeU9iamVjdCAqZXhjKQoreworICAgIHJldHVybiBnZXRfc3RyaW5nKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5lbmNvZGluZywgImVuY29kaW5nIik7Cit9CisKK1B5T2JqZWN0ICoKK1B5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICpleGMpCit7CisgICAgcmV0dXJuIGdldF9zdHJpbmcoKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKWV4YyktPmVuY29kaW5nLCAiZW5jb2RpbmciKTsKK30KKworUHlPYmplY3QgKgorUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0KFB5T2JqZWN0ICpleGMpCit7CisgICAgcmV0dXJuIGdldF91bmljb2RlKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5vYmplY3QsICJvYmplY3QiKTsKK30KKworUHlPYmplY3QgKgorUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0KFB5T2JqZWN0ICpleGMpCit7CisgICAgcmV0dXJuIGdldF9zdHJpbmcoKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKWV4YyktPm9iamVjdCwgIm9iamVjdCIpOworfQorCitQeU9iamVjdCAqCitQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKmV4YykKK3sKKyAgICByZXR1cm4gZ2V0X3VuaWNvZGUoKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKWV4YyktPm9iamVjdCwgIm9iamVjdCIpOworfQorCitpbnQKK1B5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgKnN0YXJ0KQoreworICAgIGlmICghZ2V0X2ludCgoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+c3RhcnQsIHN0YXJ0LCAic3RhcnQiKSkgeworICAgICAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgICAgIFB5T2JqZWN0ICpvYmogPSBnZXRfdW5pY29kZSgoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+b2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCIpOworICAgICAgICBpZiAoIW9iaikgcmV0dXJuIC0xOworICAgICAgICBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKG9iaik7CisgICAgICAgIGlmICgqc3RhcnQ8MCkKKyAgICAgICAgICAgICpzdGFydCA9IDA7IC8qWFhYIGNoZWNrIGZvciB2YWx1ZXMgPDAqLworICAgICAgICBpZiAoKnN0YXJ0Pj1zaXplKQorICAgICAgICAgICAgKnN0YXJ0ID0gc2l6ZS0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKK2ludAorUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqc3RhcnQpCit7CisgICAgaWYgKCFnZXRfaW50KCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5zdGFydCwgc3RhcnQsICJzdGFydCIpKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICAgICAgUHlPYmplY3QgKm9iaiA9IGdldF9zdHJpbmcoKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKWV4YyktPm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCIpOworICAgICAgICBpZiAoIW9iaikgcmV0dXJuIC0xOworICAgICAgICBzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUob2JqKTsKKyAgICAgICAgaWYgKCpzdGFydDwwKQorICAgICAgICAgICAgKnN0YXJ0ID0gMDsKKyAgICAgICAgaWYgKCpzdGFydD49c2l6ZSkKKyAgICAgICAgICAgICpzdGFydCA9IHNpemUtMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworCitpbnQKK1B5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgKnN0YXJ0KQoreworICAgIHJldHVybiBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydChleGMsIHN0YXJ0KTsKK30KKworCitpbnQKK1B5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3Qgc3RhcnQpCit7CisgICAgcmV0dXJuIHNldF9zc2l6ZV90KCYoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+c3RhcnQsIHN0YXJ0KTsKK30KKworCitpbnQKK1B5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3Qgc3RhcnQpCit7CisgICAgcmV0dXJuIHNldF9zc2l6ZV90KCYoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+c3RhcnQsIHN0YXJ0KTsKK30KKworCitpbnQKK1B5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3Qgc3RhcnQpCit7CisgICAgcmV0dXJuIHNldF9zc2l6ZV90KCYoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+c3RhcnQsIHN0YXJ0KTsKK30KKworCitpbnQKK1B5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90ICplbmQpCit7CisgICAgaWYgKCFnZXRfaW50KCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5lbmQsIGVuZCwgImVuZCIpKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICAgICAgUHlPYmplY3QgKm9iaiA9IGdldF91bmljb2RlKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0Iik7CisgICAgICAgIGlmICghb2JqKSByZXR1cm4gLTE7CisgICAgICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKTsKKyAgICAgICAgaWYgKCplbmQ8MSkKKyAgICAgICAgICAgICplbmQgPSAxOworICAgICAgICBpZiAoKmVuZD5zaXplKQorICAgICAgICAgICAgKmVuZCA9IHNpemU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworaW50CitQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqZW5kKQoreworICAgIGlmICghZ2V0X2ludCgoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+ZW5kLCBlbmQsICJlbmQiKSkgeworICAgICAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgICAgIFB5T2JqZWN0ICpvYmogPSBnZXRfc3RyaW5nKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QiKTsKKyAgICAgICAgaWYgKCFvYmopIHJldHVybiAtMTsKKyAgICAgICAgc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7CisgICAgICAgIGlmICgqZW5kPDEpCisgICAgICAgICAgICAqZW5kID0gMTsKKyAgICAgICAgaWYgKCplbmQ+c2l6ZSkKKyAgICAgICAgICAgICplbmQgPSBzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKK2ludAorUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kKFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgKnN0YXJ0KQoreworICAgIHJldHVybiBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCBzdGFydCk7Cit9CisKKworaW50CitQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCBlbmQpCit7CisgICAgcmV0dXJuIHNldF9zc2l6ZV90KCYoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+ZW5kLCBlbmQpOworfQorCisKK2ludAorUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kKFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgZW5kKQoreworICAgIHJldHVybiBzZXRfc3NpemVfdCgmKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKWV4YyktPmVuZCwgZW5kKTsKK30KKworCitpbnQKK1B5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90IGVuZCkKK3sKKyAgICByZXR1cm4gc2V0X3NzaXplX3QoJigoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5lbmQsIGVuZCk7Cit9CisKK1B5T2JqZWN0ICoKK1B5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbihQeU9iamVjdCAqZXhjKQoreworICAgIHJldHVybiBnZXRfc3RyaW5nKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5yZWFzb24sICJyZWFzb24iKTsKK30KKworCitQeU9iamVjdCAqCitQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb24oUHlPYmplY3QgKmV4YykKK3sKKyAgICByZXR1cm4gZ2V0X3N0cmluZygoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+cmVhc29uLCAicmVhc29uIik7Cit9CisKKworUHlPYmplY3QgKgorUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uKFB5T2JqZWN0ICpleGMpCit7CisgICAgcmV0dXJuIGdldF9zdHJpbmcoKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKWV4YyktPnJlYXNvbiwgInJlYXNvbiIpOworfQorCisKK2ludAorUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uKFB5T2JqZWN0ICpleGMsIGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKyAgICByZXR1cm4gc2V0X3N0cmluZygmKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKWV4YyktPnJlYXNvbiwgcmVhc29uKTsKK30KKworCitpbnQKK1B5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbihQeU9iamVjdCAqZXhjLCBjb25zdCBjaGFyICpyZWFzb24pCit7CisgICAgcmV0dXJuIHNldF9zdHJpbmcoJigoUHlVbmljb2RlRXJyb3JPYmplY3QgKilleGMpLT5yZWFzb24sIHJlYXNvbik7Cit9CisKKworaW50CitQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24oUHlPYmplY3QgKmV4YywgY29uc3QgY2hhciAqcmVhc29uKQoreworICAgIHJldHVybiBzZXRfc3RyaW5nKCYoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopZXhjKS0+cmVhc29uLCByZWFzb24pOworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCitVbmljb2RlRXJyb3JfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLAorICAgICAgICAgICAgICAgICBQeVR5cGVPYmplY3QgKm9iamVjdHR5cGUpCit7CisgICAgUHlVbmljb2RlRXJyb3JPYmplY3QgKnNlbGY7CisKKyAgICBzZWxmID0gKFB5VW5pY29kZUVycm9yT2JqZWN0ICopQmFzZUV4Y2VwdGlvbl9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIE1BS0VfSVRfTk9ORShzZWxmLT5lbmNvZGluZyk7CisgICAgTUFLRV9JVF9OT05FKHNlbGYtPm9iamVjdCk7CisgICAgTUFLRV9JVF9OT05FKHNlbGYtPnN0YXJ0KTsKKyAgICBNQUtFX0lUX05PTkUoc2VsZi0+ZW5kKTsKKyAgICBNQUtFX0lUX05PTkUoc2VsZi0+cmVhc29uKTsKKworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworfQorCitzdGF0aWMgaW50CitVbmljb2RlRXJyb3JfaW5pdChQeVVuaWNvZGVFcnJvck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLAorICAgICAgICAgICAgICAgICAgUHlUeXBlT2JqZWN0ICpvYmplY3R0eXBlKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFPIU8hTyFPISIsCisgICAgICAgICZQeVN0cmluZ19UeXBlLCAmc2VsZi0+ZW5jb2RpbmcsCisgICAgICAgIG9iamVjdHR5cGUsICZzZWxmLT5vYmplY3QsCisgICAgICAgICZQeUludF9UeXBlLCAmc2VsZi0+c3RhcnQsCisgICAgICAgICZQeUludF9UeXBlLCAmc2VsZi0+ZW5kLAorICAgICAgICAmUHlTdHJpbmdfVHlwZSwgJnNlbGYtPnJlYXNvbikpIHsKKyAgICAgICAgc2VsZi0+ZW5jb2RpbmcgPSBzZWxmLT5vYmplY3QgPSBzZWxmLT5zdGFydCA9IHNlbGYtPmVuZCA9IAorICAgICAgICAgICAgc2VsZi0+cmVhc29uID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFB5X0lOQ1JFRihzZWxmLT5lbmNvZGluZyk7CisgICAgUHlfSU5DUkVGKHNlbGYtPm9iamVjdCk7CisgICAgUHlfSU5DUkVGKHNlbGYtPnN0YXJ0KTsKKyAgICBQeV9JTkNSRUYoc2VsZi0+ZW5kKTsKKyAgICBQeV9JTkNSRUYoc2VsZi0+cmVhc29uKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQKK1VuaWNvZGVFcnJvcl9jbGVhcihQeVVuaWNvZGVFcnJvck9iamVjdCAqc2VsZikKK3sKKyAgICBQeV9DTEVBUihzZWxmLT5lbmNvZGluZyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+b2JqZWN0KTsKKyAgICBQeV9DTEVBUihzZWxmLT5zdGFydCk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZW5kKTsKKyAgICBQeV9DTEVBUihzZWxmLT5yZWFzb24pOworICAgIHJldHVybiBCYXNlRXhjZXB0aW9uX2NsZWFyKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK1VuaWNvZGVFcnJvcl9kZWFsbG9jKFB5VW5pY29kZUVycm9yT2JqZWN0ICpzZWxmKQoreworICAgIFVuaWNvZGVFcnJvcl9jbGVhcihzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworfQorCitpbnQKK1VuaWNvZGVFcnJvcl90cmF2ZXJzZShQeVVuaWNvZGVFcnJvck9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCit7CisgICAgUHlfVklTSVQoc2VsZi0+ZW5jb2RpbmcpOworICAgIFB5X1ZJU0lUKHNlbGYtPm9iamVjdCk7CisgICAgUHlfVklTSVQoc2VsZi0+c3RhcnQpOworICAgIFB5X1ZJU0lUKHNlbGYtPmVuZCk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVhc29uKTsKKyAgICByZXR1cm4gQmFzZUV4Y2VwdGlvbl90cmF2ZXJzZSgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiwgdmlzaXQsIGFyZyk7Cit9CisKK3N0YXRpYyBQeU1lbWJlckRlZiBVbmljb2RlRXJyb3JfbWVtYmVyc1tdID0geworICAgIHsibWVzc2FnZSIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVVuaWNvZGVFcnJvck9iamVjdCwgbWVzc2FnZSksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIG1lc3NhZ2UiKX0sCisgICAgeyJlbmNvZGluZyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVVuaWNvZGVFcnJvck9iamVjdCwgZW5jb2RpbmcpLCAwLAorICAgICAgICBQeURvY19TVFIoImV4Y2VwdGlvbiBlbmNvZGluZyIpfSwKKyAgICB7Im9iamVjdCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVVuaWNvZGVFcnJvck9iamVjdCwgb2JqZWN0KSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gb2JqZWN0Iil9LAorICAgIHsic3RhcnQiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlVbmljb2RlRXJyb3JPYmplY3QsIHN0YXJ0KSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gc3RhcnQiKX0sCisgICAgeyJlbmQiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlVbmljb2RlRXJyb3JPYmplY3QsIGVuZCksIDAsCisgICAgICAgIFB5RG9jX1NUUigiZXhjZXB0aW9uIGVuZCIpfSwKKyAgICB7InJlYXNvbiIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVVuaWNvZGVFcnJvck9iamVjdCwgcmVhc29uKSwgMCwKKyAgICAgICAgUHlEb2NfU1RSKCJleGNlcHRpb24gcmVhc29uIil9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KK307CisKKworLyoKKyAqICAgIFVuaWNvZGVFbmNvZGVFcnJvciBleHRlbmRzIFVuaWNvZGVFcnJvcgorICovCitzdGF0aWMgUHlPYmplY3QgKgorVW5pY29kZUVuY29kZUVycm9yX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKyAgICByZXR1cm4gVW5pY29kZUVycm9yX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAmUHlVbmljb2RlX1R5cGUpOworfQorCitzdGF0aWMgaW50CitVbmljb2RlRW5jb2RlRXJyb3JfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworICAgIGlmIChCYXNlRXhjZXB0aW9uX2luaXQoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIFVuaWNvZGVFcnJvcl9pbml0KChQeVVuaWNvZGVFcnJvck9iamVjdCAqKXNlbGYsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3ZHMsICZQeVVuaWNvZGVfVHlwZSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitVbmljb2RlRW5jb2RlRXJyb3Jfc3RyKFB5T2JqZWN0ICpzZWxmKQoreworICAgIFB5X3NzaXplX3Qgc3RhcnQ7CisgICAgUHlfc3NpemVfdCBlbmQ7CisKKyAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoc2VsZiwgJnN0YXJ0KSkKKyAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoc2VsZiwgJmVuZCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoZW5kPT1zdGFydCsxKSB7CisgICAgaW50IGJhZGNoYXIgPSAoaW50KVB5VW5pY29kZV9BU19VTklDT0RFKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilzZWxmKS0+b2JqZWN0KVtzdGFydF07CisgICAgY2hhciBiYWRjaGFyX3N0clsyMF07CisgICAgaWYgKGJhZGNoYXIgPD0gMHhmZikKKyAgICAgICAgUHlPU19zbnByaW50ZihiYWRjaGFyX3N0ciwgc2l6ZW9mKGJhZGNoYXJfc3RyKSwgInglMDJ4IiwgYmFkY2hhcik7CisgICAgZWxzZSBpZiAoYmFkY2hhciA8PSAweGZmZmYpCisgICAgICAgIFB5T1Nfc25wcmludGYoYmFkY2hhcl9zdHIsIHNpemVvZihiYWRjaGFyX3N0ciksICJ1JTA0eCIsIGJhZGNoYXIpOworICAgIGVsc2UKKyAgICAgICAgUHlPU19zbnByaW50ZihiYWRjaGFyX3N0ciwgc2l6ZW9mKGJhZGNoYXJfc3RyKSwgIlUlMDh4IiwgYmFkY2hhcik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgICAgICInJS40MDBzJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyIHUnXFwlcycgaW4gcG9zaXRpb24gJXpkOiAlLjQwMHMiLAorICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKXNlbGYpLT5lbmNvZGluZyksCisgICAgICAgIGJhZGNoYXJfc3RyLAorICAgICAgICBzdGFydCwKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilzZWxmKS0+cmVhc29uKQorICAgICk7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAiJyUuNDAwcycgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlcnMgaW4gcG9zaXRpb24gJXpkLSV6ZDogJS40MDBzIiwKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilzZWxmKS0+ZW5jb2RpbmcpLAorICAgICAgICBzdGFydCwKKyAgICAgICAgKGVuZC0xKSwKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilzZWxmKS0+cmVhc29uKQorICAgICk7Cit9CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgX1B5RXhjX1VuaWNvZGVFbmNvZGVFcnJvciA9IHsKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLAorICAgICJVbmljb2RlRW5jb2RlRXJyb3IiLAorICAgIHNpemVvZihQeVVuaWNvZGVFcnJvck9iamVjdCksIDAsCisgICAgKGRlc3RydWN0b3IpVW5pY29kZUVycm9yX2RlYWxsb2MsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgKHJlcHJmdW5jKVVuaWNvZGVFbmNvZGVFcnJvcl9zdHIsIDAsIDAsIDAsCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywKKyAgICBQeURvY19TVFIoIlVuaWNvZGUgZW5jb2RpbmcgZXJyb3IuIiksICh0cmF2ZXJzZXByb2MpQmFzZUV4Y2VwdGlvbl90cmF2ZXJzZSwKKyAgICAoaW5xdWlyeSlCYXNlRXhjZXB0aW9uX2NsZWFyLCAwLCAwLCAwLCAwLCAwLCBVbmljb2RlRXJyb3JfbWVtYmVycywKKyAgICAwLCAmX1B5RXhjX1VuaWNvZGVFcnJvciwgMCwgMCwgMCwgb2Zmc2V0b2YoUHlVbmljb2RlRXJyb3JPYmplY3QsIGRpY3QpLAorICAgIChpbml0cHJvYylVbmljb2RlRW5jb2RlRXJyb3JfaW5pdCwgMCwgVW5pY29kZUVuY29kZUVycm9yX25ldywKK307CitQeU9iamVjdCAqUHlFeGNfVW5pY29kZUVuY29kZUVycm9yID0gKFB5T2JqZWN0ICopJl9QeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3I7CisKK1B5T2JqZWN0ICoKK1B5VW5pY29kZUVuY29kZUVycm9yX0NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgY29uc3QgUHlfVU5JQ09ERSAqb2JqZWN0LCBQeV9zc2l6ZV90IGxlbmd0aCwKKyAgICBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgY29uc3QgY2hhciAqcmVhc29uKQoreworICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfVW5pY29kZUVuY29kZUVycm9yLCAic3Ujbm5zIiwKKyAgICBlbmNvZGluZywgb2JqZWN0LCBsZW5ndGgsIHN0YXJ0LCBlbmQsIHJlYXNvbik7Cit9CisKKworLyoKKyAqICAgIFVuaWNvZGVEZWNvZGVFcnJvciBleHRlbmRzIFVuaWNvZGVFcnJvcgorICovCitzdGF0aWMgUHlPYmplY3QgKgorVW5pY29kZURlY29kZUVycm9yX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKyAgICByZXR1cm4gVW5pY29kZUVycm9yX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAmUHlTdHJpbmdfVHlwZSk7Cit9CisKK3N0YXRpYyBpbnQKK1VuaWNvZGVEZWNvZGVFcnJvcl9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgaWYgKEJhc2VFeGNlcHRpb25faW5pdCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gVW5pY29kZUVycm9yX2luaXQoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopc2VsZiwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dkcywgJlB5U3RyaW5nX1R5cGUpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorVW5pY29kZURlY29kZUVycm9yX3N0cihQeU9iamVjdCAqc2VsZikKK3sKKyAgICBQeV9zc2l6ZV90IHN0YXJ0OworICAgIFB5X3NzaXplX3QgZW5kOworCisgICAgaWYgKFB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0KHNlbGYsICZzdGFydCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kKHNlbGYsICZlbmQpKQorICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGVuZD09c3RhcnQrMSkgeworICAgIC8qIEZyb21Gb3JtYXQgZG9lcyBub3Qgc3VwcG9ydCAlMDJ4LCBzbyBmb3JtYXQgdGhhdCBzZXBhcmF0ZWx5ICovCisgICAgY2hhciBieXRlWzRdOworICAgIFB5T1Nfc25wcmludGYoYnl0ZSwgc2l6ZW9mKGJ5dGUpLCAiJTAyeCIsIAorICAgICAgICAgICAgICAoKGludClQeVN0cmluZ19BU19TVFJJTkcoKChQeVVuaWNvZGVFcnJvck9iamVjdCAqKXNlbGYpLT5vYmplY3QpW3N0YXJ0XSkmMHhmZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICInJS40MDBzJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweCVzIGluIHBvc2l0aW9uICV6ZDogJS40MDBzIiwKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilzZWxmKS0+ZW5jb2RpbmcpLAorICAgICAgICBieXRlLAorICAgICAgICBzdGFydCwKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilzZWxmKS0+cmVhc29uKQorICAgICk7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAiJyUuNDAwcycgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGVzIGluIHBvc2l0aW9uICV6ZC0lemQ6ICUuNDAwcyIsCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopc2VsZiktPmVuY29kaW5nKSwKKyAgICAgICAgc3RhcnQsCisgICAgICAgIChlbmQtMSksCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopc2VsZiktPnJlYXNvbikKKyAgICApOworfQorCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9QeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICBFWENfTU9EVUxFX05BTUUgIlVuaWNvZGVEZWNvZGVFcnJvciIsCisgICAgc2l6ZW9mKFB5VW5pY29kZUVycm9yT2JqZWN0KSwgMCwKKyAgICAoZGVzdHJ1Y3RvcilVbmljb2RlRXJyb3JfZGVhbGxvYywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAocmVwcmZ1bmMpVW5pY29kZURlY29kZUVycm9yX3N0ciwgMCwgMCwgMCwKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAorICAgIFB5RG9jX1NUUigiVW5pY29kZSBkZWNvZGluZyBlcnJvci4iKSwgKHRyYXZlcnNlcHJvYylCYXNlRXhjZXB0aW9uX3RyYXZlcnNlLAorICAgIChpbnF1aXJ5KUJhc2VFeGNlcHRpb25fY2xlYXIsIDAsIDAsIDAsIDAsIDAsIFVuaWNvZGVFcnJvcl9tZW1iZXJzLAorICAgIDAsICZfUHlFeGNfVW5pY29kZUVycm9yLCAwLCAwLCAwLCBvZmZzZXRvZihQeVVuaWNvZGVFcnJvck9iamVjdCwgZGljdCksCisgICAgKGluaXRwcm9jKVVuaWNvZGVEZWNvZGVFcnJvcl9pbml0LCAwLCBVbmljb2RlRGVjb2RlRXJyb3JfbmV3LAorfTsKK1B5T2JqZWN0ICpQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IgPSAoUHlPYmplY3QgKikmX1B5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcjsKKworUHlPYmplY3QgKgorUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlKAorICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICpvYmplY3QsIFB5X3NzaXplX3QgbGVuZ3RoLAorICAgIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBjb25zdCBjaGFyICpyZWFzb24pCit7CisgICAgYXNzZXJ0KGxlbmd0aCA8IElOVF9NQVgpOworICAgIGFzc2VydChzdGFydCA8IElOVF9NQVgpOworICAgIGFzc2VydChlbmQgPCBJTlRfTUFYKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciwgInNzI25ucyIsCisgICAgZW5jb2RpbmcsIG9iamVjdCwgbGVuZ3RoLCBzdGFydCwgZW5kLCByZWFzb24pOworfQorCisKKy8qCisgKiAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IgZXh0ZW5kcyBVbmljb2RlRXJyb3IKKyAqLworc3RhdGljIFB5T2JqZWN0ICoKK1VuaWNvZGVUcmFuc2xhdGVFcnJvcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgUHlVbmljb2RlRXJyb3JPYmplY3QgKnNlbGYgPSBOVUxMOworCisgICAgc2VsZiA9IChQeVVuaWNvZGVFcnJvck9iamVjdCAqKUJhc2VFeGNlcHRpb25fbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNQUtFX0lUX05PTkUoc2VsZi0+ZW5jb2RpbmcpOworICAgIE1BS0VfSVRfTk9ORShzZWxmLT5vYmplY3QpOworICAgIE1BS0VfSVRfTk9ORShzZWxmLT5zdGFydCk7CisgICAgTUFLRV9JVF9OT05FKHNlbGYtPmVuZCk7CisgICAgTUFLRV9JVF9OT05FKHNlbGYtPnJlYXNvbik7CisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKK30KKworc3RhdGljIGludAorVW5pY29kZVRyYW5zbGF0ZUVycm9yX2luaXQoUHlVbmljb2RlRXJyb3JPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZHMpCit7CisgICAgaWYgKEJhc2VFeGNlcHRpb25faW5pdCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFB5X0NMRUFSKHNlbGYtPm9iamVjdCk7CisgICAgUHlfQ0xFQVIoc2VsZi0+c3RhcnQpOworICAgIFB5X0NMRUFSKHNlbGYtPmVuZCk7CisgICAgUHlfQ0xFQVIoc2VsZi0+cmVhc29uKTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFPIU8hTyEiLAorICAgICAgICAmUHlVbmljb2RlX1R5cGUsICZzZWxmLT5vYmplY3QsCisgICAgICAgICZQeUludF9UeXBlLCAmc2VsZi0+c3RhcnQsCisgICAgICAgICZQeUludF9UeXBlLCAmc2VsZi0+ZW5kLAorICAgICAgICAmUHlTdHJpbmdfVHlwZSwgJnNlbGYtPnJlYXNvbikpIHsKKyAgICAgICAgc2VsZi0+b2JqZWN0ID0gc2VsZi0+c3RhcnQgPSBzZWxmLT5lbmQgPSBzZWxmLT5yZWFzb24gPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIFB5X0lOQ1JFRihzZWxmLT5vYmplY3QpOworICAgIFB5X0lOQ1JFRihzZWxmLT5zdGFydCk7CisgICAgUHlfSU5DUkVGKHNlbGYtPmVuZCk7CisgICAgUHlfSU5DUkVGKHNlbGYtPnJlYXNvbik7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgUHlPYmplY3QgKgorVW5pY29kZVRyYW5zbGF0ZUVycm9yX3N0cihQeU9iamVjdCAqc2VsZikKK3sKKyAgICBQeV9zc2l6ZV90IHN0YXJ0OworICAgIFB5X3NzaXplX3QgZW5kOworCisgICAgaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0KHNlbGYsICZzdGFydCkpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kKHNlbGYsICZlbmQpKQorICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGVuZD09c3RhcnQrMSkgeworICAgIGludCBiYWRjaGFyID0gKGludClQeVVuaWNvZGVfQVNfVU5JQ09ERSgoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopc2VsZiktPm9iamVjdClbc3RhcnRdOworICAgIGNoYXIgYmFkY2hhcl9zdHJbMjBdOworICAgIGlmIChiYWRjaGFyIDw9IDB4ZmYpCisgICAgICAgIFB5T1Nfc25wcmludGYoYmFkY2hhcl9zdHIsIHNpemVvZihiYWRjaGFyX3N0ciksICJ4JTAyeCIsIGJhZGNoYXIpOworICAgIGVsc2UgaWYgKGJhZGNoYXIgPD0gMHhmZmZmKQorICAgICAgICBQeU9TX3NucHJpbnRmKGJhZGNoYXJfc3RyLCBzaXplb2YoYmFkY2hhcl9zdHIpLCAidSUwNHgiLCBiYWRjaGFyKTsKKyAgICBlbHNlCisgICAgICAgIFB5T1Nfc25wcmludGYoYmFkY2hhcl9zdHIsIHNpemVvZihiYWRjaGFyX3N0ciksICJVJTA4eCIsIGJhZGNoYXIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAgICAgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXIgdSdcXCVzJyBpbiBwb3NpdGlvbiAlemQ6ICUuNDAwcyIsCisgICAgICAgIGJhZGNoYXJfc3RyLAorICAgICAgICBzdGFydCwKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlVbmljb2RlRXJyb3JPYmplY3QgKilzZWxmKS0+cmVhc29uKQorICAgICk7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAiY2FuJ3QgdHJhbnNsYXRlIGNoYXJhY3RlcnMgaW4gcG9zaXRpb24gJXpkLSV6ZDogJS40MDBzIiwKKyAgICAgICAgc3RhcnQsCisgICAgICAgIChlbmQtMSksCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoKFB5VW5pY29kZUVycm9yT2JqZWN0ICopc2VsZiktPnJlYXNvbikKKyAgICApOworfQorCitzdGF0aWMgUHlUeXBlT2JqZWN0IF9QeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICBFWENfTU9EVUxFX05BTUUgIlVuaWNvZGVUcmFuc2xhdGVFcnJvciIsCisgICAgc2l6ZW9mKFB5VW5pY29kZUVycm9yT2JqZWN0KSwgMCwKKyAgICAoZGVzdHJ1Y3RvcilVbmljb2RlRXJyb3JfZGVhbGxvYywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAocmVwcmZ1bmMpVW5pY29kZVRyYW5zbGF0ZUVycm9yX3N0ciwgMCwgMCwgMCwKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAorICAgIFB5RG9jX1NUUigiVW5pY29kZSBkZWNvZGluZyBlcnJvci4iKSwgKHRyYXZlcnNlcHJvYylVbmljb2RlRXJyb3JfdHJhdmVyc2UsCisgICAgKGlucXVpcnkpVW5pY29kZUVycm9yX2NsZWFyLCAwLCAwLCAwLCAwLCAwLCBVbmljb2RlRXJyb3JfbWVtYmVycywKKyAgICAwLCAmX1B5RXhjX1VuaWNvZGVFcnJvciwgMCwgMCwgMCwgb2Zmc2V0b2YoUHlVbmljb2RlRXJyb3JPYmplY3QsIGRpY3QpLAorICAgIChpbml0cHJvYylVbmljb2RlVHJhbnNsYXRlRXJyb3JfaW5pdCwgMCwgVW5pY29kZVRyYW5zbGF0ZUVycm9yX25ldywKK307CitQeU9iamVjdCAqUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yID0gKFB5T2JqZWN0ICopJl9QeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3I7CisKK1B5T2JqZWN0ICoKK1B5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0NyZWF0ZSgKKyAgICBjb25zdCBQeV9VTklDT0RFICpvYmplY3QsIFB5X3NzaXplX3QgbGVuZ3RoLAorICAgIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBjb25zdCBjaGFyICpyZWFzb24pCit7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IsICJ1I25ucyIsCisgICAgb2JqZWN0LCBsZW5ndGgsIHN0YXJ0LCBlbmQsIHJlYXNvbik7Cit9CisjZW5kaWYKKworCisvKgorICogICAgQXNzZXJ0aW9uRXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgQXNzZXJ0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbGVkLiIpOworCisKKy8qCisgKiAgICBBcml0aG1ldGljRXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgQXJpdGhtZXRpY0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBjbGFzcyBmb3IgYXJpdGhtZXRpYyBlcnJvcnMuIik7CisKKworLyoKKyAqICAgIEZsb2F0aW5nUG9pbnRFcnJvciBleHRlbmRzIEFyaXRobWV0aWNFcnJvcgorICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX0FyaXRobWV0aWNFcnJvciwgRmxvYXRpbmdQb2ludEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiRmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uIGZhaWxlZC4iKTsKKworCisvKgorICogICAgT3ZlcmZsb3dFcnJvciBleHRlbmRzIEFyaXRobWV0aWNFcnJvcgorICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX0FyaXRobWV0aWNFcnJvciwgT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIlJlc3VsdCB0b28gbGFyZ2UgdG8gYmUgcmVwcmVzZW50ZWQuIik7CisKKworLyoKKyAqICAgIFplcm9EaXZpc2lvbkVycm9yIGV4dGVuZHMgQXJpdGhtZXRpY0Vycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfQXJpdGhtZXRpY0Vycm9yLCBaZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAiU2Vjb25kIGFyZ3VtZW50IHRvIGEgZGl2aXNpb24gb3IgbW9kdWxvIG9wZXJhdGlvbiB3YXMgemVyby4iKTsKKworCisvKgorICogICAgU3lzdGVtRXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgU3lzdGVtRXJyb3IsCisgICAgIkludGVybmFsIGVycm9yIGluIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuXG4iCisgICAgIlxuIgorICAgICJQbGVhc2UgcmVwb3J0IHRoaXMgdG8gdGhlIFB5dGhvbiBtYWludGFpbmVyLCBhbG9uZyB3aXRoIHRoZSB0cmFjZWJhY2ssXG4iCisgICAgInRoZSBQeXRob24gdmVyc2lvbiwgYW5kIHRoZSBoYXJkd2FyZS9PUyBwbGF0Zm9ybSBhbmQgdmVyc2lvbi4iKTsKKworCisvKgorICogICAgUmVmZXJlbmNlRXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgUmVmZXJlbmNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJXZWFrIHJlZiBwcm94eSB1c2VkIGFmdGVyIHJlZmVyZW50IHdlbnQgYXdheS4iKTsKKworCisvKgorICogICAgTWVtb3J5RXJyb3IgZXh0ZW5kcyBTdGFuZGFyZEVycm9yCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfU3RhbmRhcmRFcnJvciwgTWVtb3J5RXJyb3IsICJPdXQgb2YgbWVtb3J5LiIpOworCisKKy8qIFdhcm5pbmcgY2F0ZWdvcnkgZG9jc3RyaW5ncyAqLworCisvKgorICogICAgV2FybmluZyBleHRlbmRzIEV4Y2VwdGlvbgorICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX0V4Y2VwdGlvbiwgV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIkJhc2UgY2xhc3MgZm9yIHdhcm5pbmcgY2F0ZWdvcmllcy4iKTsKKworCisvKgorICogICAgVXNlcldhcm5pbmcgZXh0ZW5kcyBXYXJuaW5nCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfV2FybmluZywgVXNlcldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICJCYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgdXNlciBjb2RlLiIpOworCisKKy8qCisgKiAgICBEZXByZWNhdGlvbldhcm5pbmcgZXh0ZW5kcyBXYXJuaW5nCisgKi8KK1NpbXBsZUV4dGVuZHNFeGNlcHRpb24oUHlFeGNfV2FybmluZywgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBjbGFzcyBmb3Igd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBmZWF0dXJlcy4iKTsKKworCisvKgorICogICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyBleHRlbmRzIFdhcm5pbmcKKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19XYXJuaW5nLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICJCYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBmZWF0dXJlcyB3aGljaCB3aWxsIGJlIGRlcHJlY2F0ZWRcbiIKKyAgICAiaW4gdGhlIGZ1dHVyZS4iKTsKKworCisvKgorICogICAgU3ludGF4V2FybmluZyBleHRlbmRzIFdhcm5pbmcKKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19XYXJuaW5nLCBTeW50YXhXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBjbGFzcyBmb3Igd2FybmluZ3MgYWJvdXQgZHViaW91cyBzeW50YXguIik7CisKKworLyoKKyAqICAgIFJ1bnRpbWVXYXJuaW5nIGV4dGVuZHMgV2FybmluZworICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX1dhcm5pbmcsIFJ1bnRpbWVXYXJuaW5nLAorICAgICAgICAgICAgICAgICAiQmFzZSBjbGFzcyBmb3Igd2FybmluZ3MgYWJvdXQgZHViaW91cyBydW50aW1lIGJlaGF2aW9yLiIpOworCisKKy8qCisgKiAgICBGdXR1cmVXYXJuaW5nIGV4dGVuZHMgV2FybmluZworICovCitTaW1wbGVFeHRlbmRzRXhjZXB0aW9uKFB5RXhjX1dhcm5pbmcsIEZ1dHVyZVdhcm5pbmcsCisgICAgIkJhc2UgY2xhc3MgZm9yIHdhcm5pbmdzIGFib3V0IGNvbnN0cnVjdHMgdGhhdCB3aWxsIGNoYW5nZSBzZW1hbnRpY2FsbHlcbiIKKyAgICAiaW4gdGhlIGZ1dHVyZS4iKTsKKworCisvKgorICogICAgSW1wb3J0V2FybmluZyBleHRlbmRzIFdhcm5pbmcKKyAqLworU2ltcGxlRXh0ZW5kc0V4Y2VwdGlvbihQeUV4Y19XYXJuaW5nLCBJbXBvcnRXYXJuaW5nLAorICAgICAgICAgICJCYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBwcm9iYWJsZSBtaXN0YWtlcyBpbiBtb2R1bGUgaW1wb3J0cyIpOworCisKKy8qIFByZS1jb21wdXRlZCBNZW1vcnlFcnJvciBpbnN0YW5jZS4gIEJlc3QgdG8gY3JlYXRlIHRoaXMgYXMgZWFybHkgYXMKKyAqIHBvc3NpYmxlIGFuZCBub3Qgd2FpdCB1bnRpbCBhIE1lbW9yeUVycm9yIGlzIGFjdHVhbGx5IHJhaXNlZCEKKyAqLworUHlPYmplY3QgKlB5RXhjX01lbW9yeUVycm9ySW5zdD1OVUxMOworCisvKiBtb2R1bGUgZ2xvYmFsIGZ1bmN0aW9ucyAqLworc3RhdGljIFB5TWV0aG9kRGVmIGZ1bmN0aW9uc1tdID0geworICAgIC8qIFNlbnRpbmVsICovCisgICAge05VTEwsIE5VTEx9Cit9OworCisjZGVmaW5lIFBSRV9JTklUKFRZUEUpIGlmIChQeVR5cGVfUmVhZHkoJl9QeUV4Y18gIyMgVFlQRSkgPCAwKSBcCisgICAgUHlfRmF0YWxFcnJvcigiZXhjZXB0aW9ucyBib290c3RyYXBwaW5nIGVycm9yLiIpOworCisjZGVmaW5lIFBPU1RfSU5JVChUWVBFKSBQeV9JTkNSRUYoUHlFeGNfICMjIFRZUEUpOyBcCisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICMgVFlQRSwgUHlFeGNfICMjIFRZUEUpOyBcCisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGJkaWN0LCAjIFRZUEUsIFB5RXhjXyAjIyBUWVBFKSkgXAorICAgICAgICBQeV9GYXRhbEVycm9yKCJNb2R1bGUgZGljdGlvbmFyeSBpbnNlcnRpb24gcHJvYmxlbS4iKTsKKworUHlNT0RJTklUX0ZVTkMKK19QeUV4Y19Jbml0KHZvaWQpIAoreworICAgIFB5T2JqZWN0ICptLCAqYmx0aW5tb2QsICpiZGljdDsKKworICAgIFBSRV9JTklUKEJhc2VFeGNlcHRpb24pCisgICAgUFJFX0lOSVQoRXhjZXB0aW9uKQorICAgIFBSRV9JTklUKFN0YW5kYXJkRXJyb3IpCisgICAgUFJFX0lOSVQoVHlwZUVycm9yKQorICAgIFBSRV9JTklUKFN0b3BJdGVyYXRpb24pCisgICAgUFJFX0lOSVQoR2VuZXJhdG9yRXhpdCkKKyAgICBQUkVfSU5JVChTeXN0ZW1FeGl0KQorICAgIFBSRV9JTklUKEtleWJvYXJkSW50ZXJydXB0KQorICAgIFBSRV9JTklUKEltcG9ydEVycm9yKQorICAgIFBSRV9JTklUKEVudmlyb25tZW50RXJyb3IpCisgICAgUFJFX0lOSVQoSU9FcnJvcikKKyAgICBQUkVfSU5JVChPU0Vycm9yKQorI2lmZGVmIE1TX1dJTkRPV1MKKyAgICBQUkVfSU5JVChXaW5kb3dzRXJyb3IpCisjZW5kaWYKKyNpZmRlZiBfX1ZNUworICAgIFBSRV9JTklUKFZNU0Vycm9yKQorI2VuZGlmCisgICAgUFJFX0lOSVQoRU9GRXJyb3IpCisgICAgUFJFX0lOSVQoUnVudGltZUVycm9yKQorICAgIFBSRV9JTklUKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgUFJFX0lOSVQoTmFtZUVycm9yKQorICAgIFBSRV9JTklUKFVuYm91bmRMb2NhbEVycm9yKQorICAgIFBSRV9JTklUKEF0dHJpYnV0ZUVycm9yKQorICAgIFBSRV9JTklUKFN5bnRheEVycm9yKQorICAgIFBSRV9JTklUKEluZGVudGF0aW9uRXJyb3IpCisgICAgUFJFX0lOSVQoVGFiRXJyb3IpCisgICAgUFJFX0lOSVQoTG9va3VwRXJyb3IpCisgICAgUFJFX0lOSVQoSW5kZXhFcnJvcikKKyAgICBQUkVfSU5JVChLZXlFcnJvcikKKyAgICBQUkVfSU5JVChWYWx1ZUVycm9yKQorICAgIFBSRV9JTklUKFVuaWNvZGVFcnJvcikKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgUFJFX0lOSVQoVW5pY29kZUVuY29kZUVycm9yKQorICAgIFBSRV9JTklUKFVuaWNvZGVEZWNvZGVFcnJvcikKKyAgICBQUkVfSU5JVChVbmljb2RlVHJhbnNsYXRlRXJyb3IpCisjZW5kaWYKKyAgICBQUkVfSU5JVChBc3NlcnRpb25FcnJvcikKKyAgICBQUkVfSU5JVChBcml0aG1ldGljRXJyb3IpCisgICAgUFJFX0lOSVQoRmxvYXRpbmdQb2ludEVycm9yKQorICAgIFBSRV9JTklUKE92ZXJmbG93RXJyb3IpCisgICAgUFJFX0lOSVQoWmVyb0RpdmlzaW9uRXJyb3IpCisgICAgUFJFX0lOSVQoU3lzdGVtRXJyb3IpCisgICAgUFJFX0lOSVQoUmVmZXJlbmNlRXJyb3IpCisgICAgUFJFX0lOSVQoTWVtb3J5RXJyb3IpCisgICAgUFJFX0lOSVQoV2FybmluZykKKyAgICBQUkVfSU5JVChVc2VyV2FybmluZykKKyAgICBQUkVfSU5JVChEZXByZWNhdGlvbldhcm5pbmcpCisgICAgUFJFX0lOSVQoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICBQUkVfSU5JVChTeW50YXhXYXJuaW5nKQorICAgIFBSRV9JTklUKFJ1bnRpbWVXYXJuaW5nKQorICAgIFBSRV9JTklUKEZ1dHVyZVdhcm5pbmcpCisgICAgUFJFX0lOSVQoSW1wb3J0V2FybmluZykKKworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiZXhjZXB0aW9ucyIsIGZ1bmN0aW9ucywgZXhjZXB0aW9uc19kb2MsCisgICAgICAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkgcmV0dXJuOworCisgICAgYmx0aW5tb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoIl9fYnVpbHRpbl9fIik7CisgICAgaWYgKGJsdGlubW9kID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImV4Y2VwdGlvbnMgYm9vdHN0cmFwcGluZyBlcnJvci4iKTsKKyAgICBiZGljdCA9IFB5TW9kdWxlX0dldERpY3QoYmx0aW5tb2QpOworICAgIGlmIChiZGljdCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJleGNlcHRpb25zIGJvb3RzdHJhcHBpbmcgZXJyb3IuIik7CisKKyAgICBQT1NUX0lOSVQoQmFzZUV4Y2VwdGlvbikKKyAgICBQT1NUX0lOSVQoRXhjZXB0aW9uKQorICAgIFBPU1RfSU5JVChTdGFuZGFyZEVycm9yKQorICAgIFBPU1RfSU5JVChUeXBlRXJyb3IpCisgICAgUE9TVF9JTklUKFN0b3BJdGVyYXRpb24pCisgICAgUE9TVF9JTklUKEdlbmVyYXRvckV4aXQpCisgICAgUE9TVF9JTklUKFN5c3RlbUV4aXQpCisgICAgUE9TVF9JTklUKEtleWJvYXJkSW50ZXJydXB0KQorICAgIFBPU1RfSU5JVChJbXBvcnRFcnJvcikKKyAgICBQT1NUX0lOSVQoRW52aXJvbm1lbnRFcnJvcikKKyAgICBQT1NUX0lOSVQoSU9FcnJvcikKKyAgICBQT1NUX0lOSVQoT1NFcnJvcikKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgUE9TVF9JTklUKFdpbmRvd3NFcnJvcikKKyNlbmRpZgorI2lmZGVmIF9fVk1TCisgICAgUE9TVF9JTklUKFZNU0Vycm9yKQorI2VuZGlmCisgICAgUE9TVF9JTklUKEVPRkVycm9yKQorICAgIFBPU1RfSU5JVChSdW50aW1lRXJyb3IpCisgICAgUE9TVF9JTklUKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgUE9TVF9JTklUKE5hbWVFcnJvcikKKyAgICBQT1NUX0lOSVQoVW5ib3VuZExvY2FsRXJyb3IpCisgICAgUE9TVF9JTklUKEF0dHJpYnV0ZUVycm9yKQorICAgIFBPU1RfSU5JVChTeW50YXhFcnJvcikKKyAgICBQT1NUX0lOSVQoSW5kZW50YXRpb25FcnJvcikKKyAgICBQT1NUX0lOSVQoVGFiRXJyb3IpCisgICAgUE9TVF9JTklUKExvb2t1cEVycm9yKQorICAgIFBPU1RfSU5JVChJbmRleEVycm9yKQorICAgIFBPU1RfSU5JVChLZXlFcnJvcikKKyAgICBQT1NUX0lOSVQoVmFsdWVFcnJvcikKKyAgICBQT1NUX0lOSVQoVW5pY29kZUVycm9yKQorI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICBQT1NUX0lOSVQoVW5pY29kZUVuY29kZUVycm9yKQorICAgIFBPU1RfSU5JVChVbmljb2RlRGVjb2RlRXJyb3IpCisgICAgUE9TVF9JTklUKFVuaWNvZGVUcmFuc2xhdGVFcnJvcikKKyNlbmRpZgorICAgIFBPU1RfSU5JVChBc3NlcnRpb25FcnJvcikKKyAgICBQT1NUX0lOSVQoQXJpdGhtZXRpY0Vycm9yKQorICAgIFBPU1RfSU5JVChGbG9hdGluZ1BvaW50RXJyb3IpCisgICAgUE9TVF9JTklUKE92ZXJmbG93RXJyb3IpCisgICAgUE9TVF9JTklUKFplcm9EaXZpc2lvbkVycm9yKQorICAgIFBPU1RfSU5JVChTeXN0ZW1FcnJvcikKKyAgICBQT1NUX0lOSVQoUmVmZXJlbmNlRXJyb3IpCisgICAgUE9TVF9JTklUKE1lbW9yeUVycm9yKQorICAgIFBPU1RfSU5JVChXYXJuaW5nKQorICAgIFBPU1RfSU5JVChVc2VyV2FybmluZykKKyAgICBQT1NUX0lOSVQoRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIFBPU1RfSU5JVChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIFBPU1RfSU5JVChTeW50YXhXYXJuaW5nKQorICAgIFBPU1RfSU5JVChSdW50aW1lV2FybmluZykKKyAgICBQT1NUX0lOSVQoRnV0dXJlV2FybmluZykKKyAgICBQT1NUX0lOSVQoSW1wb3J0V2FybmluZykKKworICAgIFB5RXhjX01lbW9yeUVycm9ySW5zdCA9IEJhc2VFeGNlcHRpb25fbmV3KCZfUHlFeGNfTWVtb3J5RXJyb3IsIE5VTEwsIE5VTEwpOworICAgIGlmICghUHlFeGNfTWVtb3J5RXJyb3JJbnN0KQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW5ub3QgcHJlLWFsbG9jYXRlIE1lbW9yeUVycm9yIGluc3RhbmNlXG4iKTsKKworICAgIFB5X0RFQ1JFRihibHRpbm1vZCk7Cit9CisKK3ZvaWQKK19QeUV4Y19GaW5pKHZvaWQpCit7CisgICAgUHlfWERFQ1JFRihQeUV4Y19NZW1vcnlFcnJvckluc3QpOworICAgIFB5RXhjX01lbW9yeUVycm9ySW5zdCA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZpbGVvYmplY3QuYyBiL09iamVjdHMvZmlsZW9iamVjdC5jCmluZGV4IGFiMjYxNmQuLjk5Nzc5MmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmlsZW9iamVjdC5jCisrKyBiL09iamVjdHMvZmlsZW9iamVjdC5jCkBAIC0xMzYsNDYgKzEzNiw0NSBAQAogLyogY2hlY2sgZm9yIGtub3duIGluY29ycmVjdCBtb2RlIHN0cmluZ3MgLSBwcm9ibGVtIGlzLCBwbGF0Zm9ybXMgYXJlCiAgICBmcmVlIHRvIGFjY2VwdCBhbnkgbW9kZSBjaGFyYWN0ZXJzIHRoZXkgbGlrZSBhbmQgYXJlIHN1cHBvc2VkIHRvCiAgICBpZ25vcmUgc3R1ZmYgdGhleSBkb24ndCB1bmRlcnN0YW5kLi4uIHdyaXRlIG9yIGFwcGVuZCBtb2RlIHdpdGgKLSAgIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgaXMgZXhwcmVzc2x5IGZvcmJpZGRlbiBieSBQRVAgMjc4LiAqLworICAgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydCBpcyBleHByZXNzbHkgZm9yYmlkZGVuIGJ5IFBFUCAyNzguCisgICBBZGRpdGlvbmFsbHksIHJlbW92ZSB0aGUgJ1UnIGZyb20gdGhlIG1vZGUgc3RyaW5nIGFzIHBsYXRmb3JtcworICAgd29uJ3Qga25vdyB3aGF0IGl0IGlzLiAqLwogLyogemVybyByZXR1cm4gaXMga2V3bCAtIG9uZSBpcyB1bi1rZXdsICovCiBzdGF0aWMgaW50Ci1jaGVja190aGVfbW9kZShjaGFyICptb2RlKQorc2FuaXRpemVfdGhlX21vZGUoY2hhciAqbW9kZSkKIHsKKwljaGFyICp1cG9zOwogCXNpemVfdCBsZW4gPSBzdHJsZW4obW9kZSk7CiAKLQlzd2l0Y2ggKGxlbikgewotCWNhc2UgMDoKKwlpZiAoIWxlbikgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IG1vZGUgc3RyaW5nIik7CiAJCXJldHVybiAxOworCX0KIAotCS8qIHJlamVjdCB3VSwgYVUgKi8KLQljYXNlIDI6Ci0JCXN3aXRjaCAobW9kZVswXSkgewotCQljYXNlICd3JzoKLQkJY2FzZSAnYSc6Ci0JCQlpZiAobW9kZVsxXSA9PSAnVScpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJpbnZhbGlkIG1vZGUgc3RyaW5nIik7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKKwl1cG9zID0gc3RyY2hyKG1vZGUsICdVJyk7CisJaWYgKHVwb3MpIHsKKwkJbWVtbW92ZSh1cG9zLCB1cG9zKzEsIGxlbi0odXBvcy1tb2RlKSk7IC8qIGluY2wgbnVsbCBjaGFyICovCiAKLQkvKiByZWplY3QgdytVLCBhK1UsIHdVKywgYVUrICovCi0JY2FzZSAzOgotCQlzd2l0Y2ggKG1vZGVbMF0pIHsKLQkJY2FzZSAndyc6Ci0JCWNhc2UgJ2EnOgotCQkJaWYgKChtb2RlWzFdID09ICcrJyAmJiBtb2RlWzJdID09ICdVJykgfHwKLQkJCSAgICAobW9kZVsxXSA9PSAnVScgJiYgbW9kZVsyXSA9PSAnKycpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiaW52YWxpZCBtb2RlIHN0cmluZyIpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQkJYnJlYWs7CisJCWlmIChtb2RlWzBdID09ICd3JyB8fCBtb2RlWzBdID09ICdhJykgeworCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bml2ZXJzYWwgbmV3bGluZSAiCisJCQkgICAgICAgICAgICAgIm1vZGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG1vZGVzICIKKwkJCQkgICAgICJzdGFydGluZyB3aXRoICdyJyIpOworCQkJcmV0dXJuIDE7CiAJCX0KLQkJYnJlYWs7CisKKwkJaWYgKG1vZGVbMF0gIT0gJ3InKSB7CisJCQltZW1tb3ZlKG1vZGUrMSwgbW9kZSwgc3RybGVuKG1vZGUpKzEpOworCQkJbW9kZVswXSA9ICdyJzsKKwkJfQorCisJCWlmICghc3RyY2hyKG1vZGUsICdiJykpIHsKKwkJCW1lbW1vdmUobW9kZSsyLCBtb2RlKzEsIHN0cmxlbihtb2RlKSk7CisJCQltb2RlWzFdID0gJ2InOworCQl9CisJfSBlbHNlIGlmIChtb2RlWzBdICE9ICdyJyAmJiBtb2RlWzBdICE9ICd3JyAmJiBtb2RlWzBdICE9ICdhJykgeworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm1vZGUgc3RyaW5nIG11c3QgYmVnaW4gd2l0aCAiCisJICAgICAgICAJICAgICJvbmUgb2YgJ3InLCAndycsICdhJyBvciAnVScsIG5vdCAnJS4yMDBzJyIsIG1vZGUpOworCQlyZXR1cm4gMTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE4NCw2ICsxODMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG9wZW5fdGhlX2ZpbGUoUHlGaWxlT2JqZWN0ICpmLCBjaGFyICpuYW1lLCBjaGFyICptb2RlKQogeworCWNoYXIgKm5ld21vZGU7CiAJYXNzZXJ0KGYgIT0gTlVMTCk7CiAJYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7CiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtMTk1LDggKzE5NSwxOCBAQAogCWFzc2VydChtb2RlICE9IE5VTEwpOwogCWFzc2VydChmLT5mX2ZwID09IE5VTEwpOwogCi0JaWYgKGNoZWNrX3RoZV9tb2RlKG1vZGUpKQorCS8qIHByb2JhYmx5IG5lZWQgdG8gcmVwbGFjZSAnVScgYnkgJ3JiJyAqLworCW5ld21vZGUgPSBQeU1lbV9NQUxMT0Moc3RybGVuKG1vZGUpICsgMyk7CisJaWYgKCFuZXdtb2RlKSB7CisJCVB5RXJyX05vTWVtb3J5KCk7CiAJCXJldHVybiBOVUxMOworCX0KKwlzdHJjcHkobmV3bW9kZSwgbW9kZSk7CisKKwlpZiAoc2FuaXRpemVfdGhlX21vZGUobmV3bW9kZSkpIHsKKwkJZiA9IE5VTEw7CisJCWdvdG8gY2xlYW51cDsKKwl9CiAKIAkvKiByZXhlYy5weSBjYW4ndCBzdG9wIGEgdXNlciBmcm9tIGdldHRpbmcgdGhlIGZpbGUoKSBjb25zdHJ1Y3RvciAtLQogCSAgIGFsbCB0aGV5IGhhdmUgdG8gZG8gaXMgZ2V0ICphbnkqIGZpbGUgb2JqZWN0IGYsIGFuZCB0aGVuIGRvCkBAIC0yMDQsMTYgKzIxNCwxNSBAQAogCWlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAogCQkiZmlsZSgpIGNvbnN0cnVjdG9yIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQlyZXR1cm4gTlVMTDsKKwkJZiA9IE5VTEw7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAJZXJybm8gPSAwOwogCi0JaWYgKHN0cmNtcChtb2RlLCAiVSIpID09IDAgfHwgc3RyY21wKG1vZGUsICJyVSIpID09IDApCi0JCW1vZGUgPSAicmIiOwogI2lmZGVmIE1TX1dJTkRPV1MKIAlpZiAoUHlVbmljb2RlX0NoZWNrKGYtPmZfbmFtZSkpIHsKIAkJUHlPYmplY3QgKndtb2RlOwotCQl3bW9kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShtb2RlLCBzdHJsZW4obW9kZSksIE5VTEwpOworCQl3bW9kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShuZXdtb2RlLCBzdHJsZW4obmV3bW9kZSksIE5VTEwpOwogCQlpZiAoZi0+Zl9uYW1lICYmIHdtb2RlKSB7CiAJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJCQkvKiBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZApAQCAtMjI3LDcgKzIzNiw3IEBACiAjZW5kaWYKIAlpZiAoTlVMTCA9PSBmLT5mX2ZwICYmIE5VTEwgIT0gbmFtZSkgewogCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWYtPmZfZnAgPSBmb3BlbihuYW1lLCBtb2RlKTsKKwkJZi0+Zl9mcCA9IGZvcGVuKG5hbWUsIG5ld21vZGUpOwogCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCX0KIApAQCAtMjU0LDYgKzI2MywxMCBAQAogCX0KIAlpZiAoZiAhPSBOVUxMKQogCQlmID0gZGlyY2hlY2soZik7CisKK2NsZWFudXA6CisJUHlNZW1fRlJFRShuZXdtb2RlKTsKKwogCXJldHVybiAoUHlPYmplY3QgKilmOwogfQogCkBAIC0xNzA1LDkgKzE3MTgsNiBAQAogUHlEb2NfU1RSVkFSKGlzYXR0eV9kb2MsCiAiaXNhdHR5KCkgLT4gdHJ1ZSBvciBmYWxzZS4gIFRydWUgaWYgdGhlIGZpbGUgaXMgY29ubmVjdGVkIHRvIGEgdHR5IGRldmljZS4iKTsKIAotUHlEb2NfU1RSVkFSKGNvbnRleHRfZG9jLAotCSAgICAgIl9fY29udGV4dF9fKCkgLT4gc2VsZi4iKTsKLQogUHlEb2NfU1RSVkFSKGVudGVyX2RvYywKIAkgICAgICJfX2VudGVyX18oKSAtPiBzZWxmLiIpOwogCkBAIC0xNzI3LDcgKzE3MzcsNiBAQAogCXsiZmx1c2giLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfZmx1c2gsICAgIE1FVEhfTk9BUkdTLCAgZmx1c2hfZG9jfSwKIAl7ImNsb3NlIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX2Nsb3NlLCAgICBNRVRIX05PQVJHUywgIGNsb3NlX2RvY30sCiAJeyJpc2F0dHkiLCAgICAoUHlDRnVuY3Rpb24pZmlsZV9pc2F0dHksICAgTUVUSF9OT0FSR1MsICBpc2F0dHlfZG9jfSwKLQl7Il9fY29udGV4dF9fIiwgKFB5Q0Z1bmN0aW9uKWZpbGVfc2VsZiwgICBNRVRIX05PQVJHUywgIGNvbnRleHRfZG9jfSwKIAl7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilmaWxlX3NlbGYsICAgICBNRVRIX05PQVJHUywgIGVudGVyX2RvY30sCiAJeyJfX2V4aXRfXyIsICAoUHlDRnVuY3Rpb24pZmlsZV9jbG9zZSwgICAgTUVUSF9WQVJBUkdTLCBjbG9zZV9kb2N9LAogCXtOVUxMLAkgICAgICBOVUxMfQkJLyogc2VudGluZWwgKi8KQEAgLTIwMjMsMTAgKzIwMzIsNiBAQAogIidcXHInLCAnXFxuJywgJ1xcclxcbicgb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZSB0eXBlcyBzZWVuLlxuIgogIlxuIgogIidVJyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAndycgb3IgJysnIG1vZGUuXG4iCi0pCi1QeURvY19TVFIoCi0iXG4iCi0iTm90ZTogIG9wZW4oKSBpcyBhbiBhbGlhcyBmb3IgZmlsZSgpLiIKICk7CiAKIFB5VHlwZU9iamVjdCBQeUZpbGVfVHlwZSA9IHsKQEAgLTI0NDcsNCArMjQ1MiwzIEBACiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgotCmRpZmYgLS1naXQgYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMgYi9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKaW5kZXggODcwODY5MC4uNzRmMTMxNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mbG9hdG9iamVjdC5jCisrKyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwpAQCAtMzg0LDcgKzM4NCw3IEBACiAJaWYgKFB5RmxvYXRfQ2hlY2sodykpCiAJCWogPSBQeUZsb2F0X0FTX0RPVUJMRSh3KTsKIAotCWVsc2UgaWYgKFB5X0lTX0lORklOSVRZKGkpIHx8IFB5X0lTX05BTihpKSkgeworCWVsc2UgaWYgKCFQeV9JU19GSU5JVEUoaSkpIHsKIAkJaWYgKFB5SW50X0NoZWNrKHcpIHx8IFB5TG9uZ19DaGVjayh3KSkKIAkJCS8qIElmIGkgaXMgYW4gaW5maW5pdHksIGl0cyBtYWduaXR1ZGUgZXhjZWVkcyBhbnkKIAkJCSAqIGZpbml0ZSBpbnRlZ2VyLCBzbyBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBpbnQgd2UKQEAgLTc4MywxMCArNzgzLDcgQEAKIAkJICogYnVnOyB3ZSBsZXQgdGhhdCBzbGlkZSBpbiBtYXRoLnBvdygpICh3aGljaCBjdXJyZW50bHkKIAkJICogcmVmbGVjdHMgYWxsIHBsYXRmb3JtIGFjY2lkZW50cyksIGJ1dCBub3QgZm9yIFB5dGhvbidzICoqLgogCQkgKi8KLQkJIGlmIChpdiA9PSAtMS4wICYmICFQeV9JU19JTkZJTklUWShpdykgJiYgaXcgPT0gaXcpIHsKLQkJIAkvKiBYWFggdGhlICJpdyA9PSBpdyIgd2FzIHRvIHdlZWQgb3V0IE5hTnMuICBUaGlzCi0JCSAJICogWFhYIGRvZXNuJ3QgYWN0dWFsbHkgd29yayBvbiBhbGwgcGxhdGZvcm1zLgotCQkgCSAqLworCQkgaWYgKGl2ID09IC0xLjAgJiYgUHlfSVNfRklOSVRFKGl3KSkgewogCQkgCS8qIFJldHVybiAxIGlmIGl3IGlzIGV2ZW4sIC0xIGlmIGl3IGlzIG9kZDsgdGhlcmUncwogCQkgCSAqIG5vIGd1YXJhbnRlZSB0aGF0IGFueSBDIGludGVncmFsIHR5cGUgaXMgYmlnCiAJCSAJICogZW5vdWdoIHRvIGhvbGQgaXcsIHNvIHdlIGhhdmUgdG8gY2hlY2sgdGhpcwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCmluZGV4IDlhYWJjN2EuLmZjYjVlNGUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnJhbWVvYmplY3QuYworKysgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKQEAgLTM1MCwxMyArMzUwLDMyIEBACiB9OwogCiAvKiBTdGFjayBmcmFtZXMgYXJlIGFsbG9jYXRlZCBhbmQgZGVhbGxvY2F0ZWQgYXQgYSBjb25zaWRlcmFibGUgcmF0ZS4KLSAgIEluIGFuIGF0dGVtcHQgdG8gaW1wcm92ZSB0aGUgc3BlZWQgb2YgZnVuY3Rpb24gY2FsbHMsIHdlIG1haW50YWluIGEKLSAgIHNlcGFyYXRlIGZyZWUgbGlzdCBvZiBzdGFjayBmcmFtZXMgKGp1c3QgbGlrZSBpbnRlZ2VycyBhcmUKLSAgIGFsbG9jYXRlZCBpbiBhIHNwZWNpYWwgd2F5IC0tIHNlZSBpbnRvYmplY3QuYykuICBXaGVuIGEgc3RhY2sgZnJhbWUKLSAgIGlzIG9uIHRoZSBmcmVlIGxpc3QsIG9ubHkgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGhhdmUgYSBtZWFuaW5nOgorICAgSW4gYW4gYXR0ZW1wdCB0byBpbXByb3ZlIHRoZSBzcGVlZCBvZiBmdW5jdGlvbiBjYWxscywgd2U6CisKKyAgIDEuIEhvbGQgYSBzaW5nbGUgInpvbWJpZSIgZnJhbWUgb24gZWFjaCBjb2RlIG9iamVjdC4gVGhpcyByZXRhaW5zCisgICB0aGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXNlZCBmcmFtZSBvYmplY3QgZnJvbSBhbiBpbnZvY2F0aW9uIG9mCisgICB0aGUgY29kZSBvYmplY3QuIFRoZSB6b21iaWUgaXMgcmVhbmltYXRlZCB0aGUgbmV4dCB0aW1lIHdlIG5lZWQgYQorICAgZnJhbWUgb2JqZWN0IGZvciB0aGF0IGNvZGUgb2JqZWN0LiBEb2luZyB0aGlzIHNhdmVzIHRoZSBtYWxsb2MvCisgICByZWFsbG9jIHJlcXVpcmVkIHdoZW4gdXNpbmcgYSBmcmVlX2xpc3QgZnJhbWUgdGhhdCBpc24ndCB0aGUKKyAgIGNvcnJlY3Qgc2l6ZS4gSXQgYWxzbyBzYXZlcyBzb21lIGZpZWxkIGluaXRpYWxpc2F0aW9uLgorCisgICBJbiB6b21iaWUgbW9kZSwgbm8gZmllbGQgb2YgUHlGcmFtZU9iamVjdCBob2xkcyBhIHJlZmVyZW5jZSwgYnV0CisgICB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgc3RpbGwgdmFsaWQ6CisKKyAgICAgKiBvYl90eXBlLCBvYl9zaXplLCBmX2NvZGUsIGZfdmFsdWVzdGFjazsKKyAgICAgICAKKyAgICAgKiBmX2xvY2FscywgZl90cmFjZSwKKyAgICAgICBmX2V4Y190eXBlLCBmX2V4Y192YWx1ZSwgZl9leGNfdHJhY2ViYWNrIGFyZSBOVUxMOworCisgICAgICogZl9sb2NhbHNwbHVzIGRvZXMgbm90IHJlcXVpcmUgcmUtYWxsb2NhdGlvbiBhbmQKKyAgICAgICB0aGUgbG9jYWwgdmFyaWFibGVzIGluIGZfbG9jYWxzcGx1cyBhcmUgTlVMTC4KKworICAgMi4gV2UgYWxzbyBtYWludGFpbiBhIHNlcGFyYXRlIGZyZWUgbGlzdCBvZiBzdGFjayBmcmFtZXMgKGp1c3QgbGlrZQorICAgaW50ZWdlcnMgYXJlIGFsbG9jYXRlZCBpbiBhIHNwZWNpYWwgd2F5IC0tIHNlZSBpbnRvYmplY3QuYykuICBXaGVuCisgICBhIHN0YWNrIGZyYW1lIGlzIG9uIHRoZSBmcmVlIGxpc3QsIG9ubHkgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGhhdmUKKyAgIGEgbWVhbmluZzoKIAlvYl90eXBlCQk9PSAmRnJhbWV0eXBlCiAJZl9iYWNrCQluZXh0IGl0ZW0gb24gZnJlZSBsaXN0LCBvciBOVUxMCi0JZl9ubG9jYWxzCW51bWJlciBvZiBsb2NhbHMKIAlmX3N0YWNrc2l6ZQlzaXplIG9mIHZhbHVlIHN0YWNrCiAgICAgICAgIG9iX3NpemUgICAgICAgICBzaXplIG9mIGxvY2Fsc3BsdXMKICAgIE5vdGUgdGhhdCB0aGUgdmFsdWUgYW5kIGJsb2NrIHN0YWNrcyBhcmUgcHJlc2VydmVkIC0tIHRoaXMgY2FuIHNhdmUKQEAgLTM4MCw0MSArMzk5LDQzIEBACiBzdGF0aWMgdm9pZAogZnJhbWVfZGVhbGxvYyhQeUZyYW1lT2JqZWN0ICpmKQogewotCWludCBpLCBzbG90czsKLQlQeU9iamVjdCAqKmZhc3Rsb2NhbHM7Ci0JUHlPYmplY3QgKipwOworCVB5T2JqZWN0ICoqcCwgKip2YWx1ZXN0YWNrOworCVB5Q29kZU9iamVjdCAqY287CiAKICAJUHlPYmplY3RfR0NfVW5UcmFjayhmKTsKIAlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKGYpCiAJLyogS2lsbCBhbGwgbG9jYWwgdmFyaWFibGVzICovCi0Jc2xvdHMgPSBmLT5mX25sb2NhbHMgKyBmLT5mX25jZWxscyArIGYtPmZfbmZyZWV2YXJzOwotCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpIHsKLQkJUHlfWERFQ1JFRigqZmFzdGxvY2Fscyk7Ci0JfQorICAgICAgICB2YWx1ZXN0YWNrID0gZi0+Zl92YWx1ZXN0YWNrOworICAgICAgICBmb3IgKHAgPSBmLT5mX2xvY2Fsc3BsdXM7IHAgPCB2YWx1ZXN0YWNrOyBwKyspCisgICAgICAgICAgICAgICAgUHlfQ0xFQVIoKnApOwogCiAJLyogRnJlZSBzdGFjayAqLwogCWlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKLQkJZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQorCQlmb3IgKHAgPSB2YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQogCQkJUHlfWERFQ1JFRigqcCk7CiAJfQogCiAJUHlfWERFQ1JFRihmLT5mX2JhY2spOwotCVB5X0RFQ1JFRihmLT5mX2NvZGUpOwogCVB5X0RFQ1JFRihmLT5mX2J1aWx0aW5zKTsKIAlQeV9ERUNSRUYoZi0+Zl9nbG9iYWxzKTsKLQlQeV9YREVDUkVGKGYtPmZfbG9jYWxzKTsKLQlQeV9YREVDUkVGKGYtPmZfdHJhY2UpOwotCVB5X1hERUNSRUYoZi0+Zl9leGNfdHlwZSk7Ci0JUHlfWERFQ1JFRihmLT5mX2V4Y192YWx1ZSk7Ci0JUHlfWERFQ1JFRihmLT5mX2V4Y190cmFjZWJhY2spOwotCWlmIChudW1mcmVlIDwgTUFYRlJFRUxJU1QpIHsKKwlQeV9DTEVBUihmLT5mX2xvY2Fscyk7CisJUHlfQ0xFQVIoZi0+Zl90cmFjZSk7CisJUHlfQ0xFQVIoZi0+Zl9leGNfdHlwZSk7CisJUHlfQ0xFQVIoZi0+Zl9leGNfdmFsdWUpOworCVB5X0NMRUFSKGYtPmZfZXhjX3RyYWNlYmFjayk7CisKKyAgICAgICAgY28gPSBmLT5mX2NvZGU7CisgICAgICAgIGlmIChjbyAhPSBOVUxMICYmIGNvLT5jb196b21iaWVmcmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGNvLT5jb196b21iaWVmcmFtZSA9IGY7CisJZWxzZSBpZiAobnVtZnJlZSA8IE1BWEZSRUVMSVNUKSB7CiAJCSsrbnVtZnJlZTsKIAkJZi0+Zl9iYWNrID0gZnJlZV9saXN0OwogCQlmcmVlX2xpc3QgPSBmOwotCX0KLQllbHNlCisgICAgICAgIH0KKwllbHNlIAogCQlQeU9iamVjdF9HQ19EZWwoZik7CisKKyAgICAgICAgUHlfWERFQ1JFRihjbyk7CiAJUHlfVFJBU0hDQU5fU0FGRV9FTkQoZikKIH0KIApAQCAtNDM1LDcgKzQ1Niw3IEBACiAJUHlfVklTSVQoZi0+Zl9leGNfdHJhY2ViYWNrKTsKIAogCS8qIGxvY2FscyAqLwotCXNsb3RzID0gZi0+Zl9ubG9jYWxzICsgZi0+Zl9uY2VsbHMgKyBmLT5mX25mcmVldmFyczsKKwlzbG90cyA9IGYtPmZfY29kZS0+Y29fbmxvY2FscyArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycykgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpOwogCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CiAJZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpCiAJCVB5X1ZJU0lUKCpmYXN0bG9jYWxzKTsKQEAgLTQ2OCw3ICs0ODksNyBAQAogCVB5X0NMRUFSKGYtPmZfdHJhY2UpOwogCiAJLyogbG9jYWxzICovCi0Jc2xvdHMgPSBmLT5mX25sb2NhbHMgKyBmLT5mX25jZWxscyArIGYtPmZfbmZyZWV2YXJzOworCXNsb3RzID0gZi0+Zl9jb2RlLT5jb19ubG9jYWxzICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKSArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19mcmVldmFycyk7CiAJZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKIAlmb3IgKGkgPSBzbG90czsgLS1pID49IDA7ICsrZmFzdGxvY2FscykKIAkJUHlfQ0xFQVIoKmZhc3Rsb2NhbHMpOwpAQCAtNTMyLDcgKzU1Myw3IEBACiAJUHlGcmFtZU9iamVjdCAqYmFjayA9IHRzdGF0ZS0+ZnJhbWU7CiAJUHlGcmFtZU9iamVjdCAqZjsKIAlQeU9iamVjdCAqYnVpbHRpbnM7Ci0JUHlfc3NpemVfdCBleHRyYXMsIG5jZWxscywgbmZyZWVzLCBpOworCVB5X3NzaXplX3QgaTsKIAogI2lmZGVmIFB5X0RFQlVHCiAJaWYgKGNvZGUgPT0gTlVMTCB8fCBnbG9iYWxzID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhnbG9iYWxzKSB8fApAQCAtNTQxLDkgKzU2Miw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KICNlbmRpZgotCW5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoY29kZS0+Y29fY2VsbHZhcnMpOwotCW5mcmVlcyA9IFB5VHVwbGVfR0VUX1NJWkUoY29kZS0+Y29fZnJlZXZhcnMpOwotCWV4dHJhcyA9IGNvZGUtPmNvX3N0YWNrc2l6ZSArIGNvZGUtPmNvX25sb2NhbHMgKyBuY2VsbHMgKyBuZnJlZXM7CiAJaWYgKGJhY2sgPT0gTlVMTCB8fCBiYWNrLT5mX2dsb2JhbHMgIT0gZ2xvYmFscykgewogCQlidWlsdGlucyA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIGJ1aWx0aW5fb2JqZWN0KTsKIAkJaWYgKGJ1aWx0aW5zKSB7CkBAIC01NzQsNzEgKzU5Miw4MiBAQAogCQlhc3NlcnQoYnVpbHRpbnMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soYnVpbHRpbnMpKTsKIAkJUHlfSU5DUkVGKGJ1aWx0aW5zKTsKIAl9Ci0JaWYgKGZyZWVfbGlzdCA9PSBOVUxMKSB7Ci0JCWYgPSBQeU9iamVjdF9HQ19OZXdWYXIoUHlGcmFtZU9iamVjdCwgJlB5RnJhbWVfVHlwZSwgZXh0cmFzKTsKLQkJaWYgKGYgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGJ1aWx0aW5zKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisJaWYgKGNvZGUtPmNvX3pvbWJpZWZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmID0gY29kZS0+Y29fem9tYmllZnJhbWU7CisgICAgICAgICAgICAgICAgY29kZS0+Y29fem9tYmllZnJhbWUgPSBOVUxMOworICAgICAgICAgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopZik7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGYtPmZfY29kZSA9PSBjb2RlKTsKIAl9Ci0JZWxzZSB7Ci0JCWFzc2VydChudW1mcmVlID4gMCk7Ci0JCS0tbnVtZnJlZTsKLQkJZiA9IGZyZWVfbGlzdDsKLQkJZnJlZV9saXN0ID0gZnJlZV9saXN0LT5mX2JhY2s7Ci0JCWlmIChmLT5vYl9zaXplIDwgZXh0cmFzKSB7Ci0JCQlmID0gUHlPYmplY3RfR0NfUmVzaXplKFB5RnJhbWVPYmplY3QsIGYsIGV4dHJhcyk7Ci0JCQlpZiAoZiA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGJ1aWx0aW5zKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWYpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGV4dHJhcywgbmNlbGxzLCBuZnJlZXM7CisgICAgICAgICAgICAgICAgbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19jZWxsdmFycyk7CisgICAgICAgICAgICAgICAgbmZyZWVzID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19mcmVldmFycyk7CisgICAgICAgICAgICAgICAgZXh0cmFzID0gY29kZS0+Y29fc3RhY2tzaXplICsgY29kZS0+Y29fbmxvY2FscyArIG5jZWxscyArCisgICAgICAgICAgICAgICAgICAgIG5mcmVlczsKKyAgICAgICAgICAgICAgICBpZiAoZnJlZV9saXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZiA9IFB5T2JqZWN0X0dDX05ld1ZhcihQeUZyYW1lT2JqZWN0LCAmUHlGcmFtZV9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihidWlsdGlucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChudW1mcmVlID4gMCk7CisgICAgICAgICAgICAgICAgICAgIC0tbnVtZnJlZTsKKyAgICAgICAgICAgICAgICAgICAgZiA9IGZyZWVfbGlzdDsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9saXN0ID0gZnJlZV9saXN0LT5mX2JhY2s7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLT5vYl9zaXplIDwgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IFB5T2JqZWN0X0dDX1Jlc2l6ZShQeUZyYW1lT2JqZWN0LCBmLCBleHRyYXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihidWlsdGlucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilmKTsKKyAgICAgICAgICAgICAgICB9CisKKwkJZi0+Zl9jb2RlID0gY29kZTsKKwkJZXh0cmFzID0gY29kZS0+Y29fbmxvY2FscyArIG5jZWxscyArIG5mcmVlczsKKwkJZi0+Zl92YWx1ZXN0YWNrID0gZi0+Zl9sb2NhbHNwbHVzICsgZXh0cmFzOworCQlmb3IgKGk9MDsgaTxleHRyYXM7IGkrKykKKwkJCWYtPmZfbG9jYWxzcGx1c1tpXSA9IE5VTEw7CisJCWYtPmZfbG9jYWxzID0gTlVMTDsKKwkJZi0+Zl90cmFjZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgZi0+Zl9leGNfdHlwZSA9IGYtPmZfZXhjX3ZhbHVlID0gZi0+Zl9leGNfdHJhY2ViYWNrID0gTlVMTDsKIAl9CiAJZi0+Zl9idWlsdGlucyA9IGJ1aWx0aW5zOwogCVB5X1hJTkNSRUYoYmFjayk7CiAJZi0+Zl9iYWNrID0gYmFjazsKIAlQeV9JTkNSRUYoY29kZSk7Ci0JZi0+Zl9jb2RlID0gY29kZTsKIAlQeV9JTkNSRUYoZ2xvYmFscyk7CiAJZi0+Zl9nbG9iYWxzID0gZ2xvYmFsczsKIAkvKiBNb3N0IGZ1bmN0aW9ucyBoYXZlIENPX05FV0xPQ0FMUyBhbmQgQ09fT1BUSU1JWkVEIHNldC4gKi8KIAlpZiAoKGNvZGUtPmNvX2ZsYWdzICYgKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpID09CiAJCShDT19ORVdMT0NBTFMgfCBDT19PUFRJTUlaRUQpKQotCQlsb2NhbHMgPSBOVUxMOyAvKiBQeUZyYW1lX0Zhc3RUb0xvY2FscygpIHdpbGwgc2V0LiAqLworCQk7IC8qIGZfbG9jYWxzID0gTlVMTDsgd2lsbCBiZSBzZXQgYnkgUHlGcmFtZV9GYXN0VG9Mb2NhbHMoKSAqLwogCWVsc2UgaWYgKGNvZGUtPmNvX2ZsYWdzICYgQ09fTkVXTE9DQUxTKSB7CiAJCWxvY2FscyA9IFB5RGljdF9OZXcoKTsKIAkJaWYgKGxvY2FscyA9PSBOVUxMKSB7CiAJCQlQeV9ERUNSRUYoZik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQorICAgICAgICAgICAgICAgIGYtPmZfbG9jYWxzID0gbG9jYWxzOwogCX0KIAllbHNlIHsKIAkJaWYgKGxvY2FscyA9PSBOVUxMKQogCQkJbG9jYWxzID0gZ2xvYmFsczsKIAkJUHlfSU5DUkVGKGxvY2Fscyk7CisgICAgICAgICAgICAgICAgZi0+Zl9sb2NhbHMgPSBsb2NhbHM7CiAJfQotCWYtPmZfbG9jYWxzID0gbG9jYWxzOwotCWYtPmZfdHJhY2UgPSBOVUxMOwotCWYtPmZfZXhjX3R5cGUgPSBmLT5mX2V4Y192YWx1ZSA9IGYtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7CiAJZi0+Zl90c3RhdGUgPSB0c3RhdGU7CiAKIAlmLT5mX2xhc3RpID0gLTE7CiAJZi0+Zl9saW5lbm8gPSBjb2RlLT5jb19maXJzdGxpbmVubzsKIAlmLT5mX3Jlc3RyaWN0ZWQgPSAoYnVpbHRpbnMgIT0gdHN0YXRlLT5pbnRlcnAtPmJ1aWx0aW5zKTsKIAlmLT5mX2libG9jayA9IDA7Ci0JZi0+Zl9ubG9jYWxzID0gY29kZS0+Y29fbmxvY2FsczsKLQlmLT5mX3N0YWNrc2l6ZSA9IGNvZGUtPmNvX3N0YWNrc2l6ZTsKLQlmLT5mX25jZWxscyA9IG5jZWxsczsKLQlmLT5mX25mcmVldmFycyA9IG5mcmVlczsKIAotCWV4dHJhcyA9IGYtPmZfbmxvY2FscyArIG5jZWxscyArIG5mcmVlczsKLQkvKiBUaW0gc2FpZCBpdCdzIG9rIHRvIHJlcGxhY2UgbWVtc2V0ICovCi0JZm9yIChpPTA7IGk8ZXh0cmFzOyBpKyspCi0JCWYtPmZfbG9jYWxzcGx1c1tpXSA9IE5VTEw7Ci0KLQlmLT5mX3ZhbHVlc3RhY2sgPSBmLT5mX2xvY2Fsc3BsdXMgKyBleHRyYXM7Ci0JZi0+Zl9zdGFja3RvcCA9IGYtPmZfdmFsdWVzdGFjazsKKyAgICAgICAgZi0+Zl9zdGFja3RvcCA9IGYtPmZfdmFsdWVzdGFjazsKIAlfUHlPYmplY3RfR0NfVFJBQ0soZik7CiAJcmV0dXJuIGY7CiB9CkBAIC03MjUsNyArNzU0LDkgQEAKIAlQeU9iamVjdCAqbG9jYWxzLCAqbWFwOwogCVB5T2JqZWN0ICoqZmFzdDsKIAlQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworCVB5Q29kZU9iamVjdCAqY287CiAJUHlfc3NpemVfdCBqOworICAgICAgICBpbnQgbmNlbGxzLCBuZnJlZXZhcnM7CiAJaWYgKGYgPT0gTlVMTCkKIAkJcmV0dXJuOwogCWxvY2FscyA9IGYtPmZfbG9jYWxzOwpAQCAtNzM2LDI3ICs3NjcsMjQgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQltYXAgPSBmLT5mX2NvZGUtPmNvX3Zhcm5hbWVzOworCWNvID0gZi0+Zl9jb2RlOworCW1hcCA9IGNvLT5jb192YXJuYW1lczsKIAlpZiAoIVB5VHVwbGVfQ2hlY2sobWFwKSkKIAkJcmV0dXJuOwogCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwogCWZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7CiAJaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKLQlpZiAoaiA+IGYtPmZfbmxvY2FscykKLQkJaiA9IGYtPmZfbmxvY2FsczsKLQlpZiAoZi0+Zl9ubG9jYWxzKQorCWlmIChqID4gY28tPmNvX25sb2NhbHMpCisJCWogPSBjby0+Y29fbmxvY2FsczsKKwlpZiAoY28tPmNvX25sb2NhbHMpCiAJCW1hcF90b19kaWN0KG1hcCwgaiwgbG9jYWxzLCBmYXN0LCAwKTsKLQlpZiAoZi0+Zl9uY2VsbHMgfHwgZi0+Zl9uZnJlZXZhcnMpIHsKLQkJaWYgKCEoUHlUdXBsZV9DaGVjayhmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKQotCQkgICAgICAmJiBQeVR1cGxlX0NoZWNrKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCW1hcF90b19kaWN0KGYtPmZfY29kZS0+Y29fY2VsbHZhcnMsCi0JCQkgICAgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKSwKLQkJCSAgICBsb2NhbHMsIGZhc3QgKyBmLT5mX25sb2NhbHMsIDEpOwotCQltYXBfdG9fZGljdChmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzLAotCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19mcmVldmFycyksCi0JCQkgICAgbG9jYWxzLCBmYXN0ICsgZi0+Zl9ubG9jYWxzICsgZi0+Zl9uY2VsbHMsIDEpOworCW5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKTsKKwluZnJlZXZhcnMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19mcmVldmFycyk7CisJaWYgKG5jZWxscyB8fCBuZnJlZXZhcnMpIHsKKwkJbWFwX3RvX2RpY3QoY28tPmNvX2NlbGx2YXJzLCBuY2VsbHMsCisJCQkgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMsIDEpOworCQltYXBfdG9fZGljdChjby0+Y29fZnJlZXZhcnMsIG5mcmVldmFycywKKwkJCSAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscyArIG5jZWxscywgMSk7CiAJfQogCVB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CiB9CkBAIC03NjgsMTEgKzc5NiwxNCBAQAogCVB5T2JqZWN0ICpsb2NhbHMsICptYXA7CiAJUHlPYmplY3QgKipmYXN0OwogCVB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisJUHlDb2RlT2JqZWN0ICpjbzsKIAlQeV9zc2l6ZV90IGo7CisJaW50IG5jZWxscywgbmZyZWV2YXJzOwogCWlmIChmID09IE5VTEwpCiAJCXJldHVybjsKIAlsb2NhbHMgPSBmLT5mX2xvY2FsczsKLQltYXAgPSBmLT5mX2NvZGUtPmNvX3Zhcm5hbWVzOworCWNvID0gZi0+Zl9jb2RlOworCW1hcCA9IGNvLT5jb192YXJuYW1lczsKIAlpZiAobG9jYWxzID09IE5VTEwpCiAJCXJldHVybjsKIAlpZiAoIVB5VHVwbGVfQ2hlY2sobWFwKSkKQEAgLTc4MCwyMSArODExLDE4IEBACiAJUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CiAJZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKIAlqID0gUHlUdXBsZV9HRVRfU0laRShtYXApOwotCWlmIChqID4gZi0+Zl9ubG9jYWxzKQotCQlqID0gZi0+Zl9ubG9jYWxzOwotCWlmIChmLT5mX25sb2NhbHMpCi0JICAgIGRpY3RfdG9fbWFwKGYtPmZfY29kZS0+Y29fdmFybmFtZXMsIGosIGxvY2FscywgZmFzdCwgMCwgY2xlYXIpOwotCWlmIChmLT5mX25jZWxscyB8fCBmLT5mX25mcmVldmFycykgewotCQlpZiAoIShQeVR1cGxlX0NoZWNrKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpCi0JCSAgICAgICYmIFB5VHVwbGVfQ2hlY2soZi0+Zl9jb2RlLT5jb19mcmVldmFycykpKQotCQkJcmV0dXJuOwotCQlkaWN0X3RvX21hcChmLT5mX2NvZGUtPmNvX2NlbGx2YXJzLAotCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycyksCi0JCQkgICAgbG9jYWxzLCBmYXN0ICsgZi0+Zl9ubG9jYWxzLCAxLCBjbGVhcik7Ci0JCWRpY3RfdG9fbWFwKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMsCi0JCQkgICAgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKSwKLQkJCSAgICBsb2NhbHMsIGZhc3QgKyBmLT5mX25sb2NhbHMgKyBmLT5mX25jZWxscywgMSwKLQkJCSAgICBjbGVhcik7CisJaWYgKGogPiBjby0+Y29fbmxvY2FscykKKwkJaiA9IGNvLT5jb19ubG9jYWxzOworCWlmIChjby0+Y29fbmxvY2FscykKKwkgICAgZGljdF90b19tYXAoY28tPmNvX3Zhcm5hbWVzLCBqLCBsb2NhbHMsIGZhc3QsIDAsIGNsZWFyKTsKKwluY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7CisJbmZyZWV2YXJzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOworCWlmIChuY2VsbHMgfHwgbmZyZWV2YXJzKSB7CisJCWRpY3RfdG9fbWFwKGNvLT5jb19jZWxsdmFycywgbmNlbGxzLAorCQkJICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzLCAxLCBjbGVhcik7CisJCWRpY3RfdG9fbWFwKGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAorCQkJICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzICsgbmNlbGxzLCAxLCAKKyAJCQkgICAgY2xlYXIpOwogCX0KIAlQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCAzMDczOTIzLi5jZDAyZWIzIDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtNDAsNyArNDAsNyBAQAogI2RlZmluZSBTSUdDSEVDSyhQeVRyeUJsb2NrKSBcCiAJaWYgKC0tX1B5X1RpY2tlciA8IDApIHsgXAogCQlfUHlfVGlja2VyID0gX1B5X0NoZWNrSW50ZXJ2YWw7IFwKLQkJaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSB7IFB5VHJ5QmxvY2s7IH0gXAorCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIFB5VHJ5QmxvY2sgXAogCX0KIAogLyogTm9ybWFsaXplIChyZW1vdmUgbGVhZGluZyB6ZXJvcyBmcm9tKSBhIGxvbmcgaW50IG9iamVjdC4KQEAgLTY2LDggKzY2LDcgQEAKIFB5TG9uZ09iamVjdCAqCiBfUHlMb25nX05ldyhQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaWYgKHNpemUgPiBJTlRfTUFYKSB7Ci0JCS8qIFhYWDogRml4IHRoaXMgY2hlY2sgd2hlbiBvYl9zaXplIGJlY29tZXMgc3NpemVfdCAqLworCWlmIChzaXplID4gUFlfU1NJWkVfVF9NQVgpIHsKIAkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjc4LDkgKzI3Nyw5IEBACiAgb3ZlcmZsb3c6CiAJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAJCQkibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50Iik7Ci0JaWYgKHNpZ24gPiAwKSAKKwlpZiAoc2lnbiA+IDApCiAJCXJldHVybiBQWV9TU0laRV9UX01BWDsKLQllbHNlIAorCWVsc2UKIAkJcmV0dXJuIFBZX1NTSVpFX1RfTUlOOwogfQogCkBAIC04NDUsMTEgKzg0NCwzNiBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MT05HX0xPTkcgaXZhbCkKIHsKLQlQWV9MT05HX0xPTkcgYnl0ZXMgPSBpdmFsOwotCWludCBvbmUgPSAxOwotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoCi0JCQkodW5zaWduZWQgY2hhciAqKSZieXRlcywKLQkJCVNJWkVPRl9MT05HX0xPTkcsIElTX0xJVFRMRV9FTkRJQU4sIDEpOworCVB5TG9uZ09iamVjdCAqdjsKKwl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCisJaW50IG5kaWdpdHMgPSAwOworCWludCBuZWdhdGl2ZSA9IDA7CisKKwlpZiAoaXZhbCA8IDApIHsKKwkJaXZhbCA9IC1pdmFsOworCQluZWdhdGl2ZSA9IDE7CisJfQorCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLgorCSAgIFdlIHVzZWQgdG8gcGljayA1ICgiYmlnIGVub3VnaCBmb3IgYW55dGhpbmciKSwgYnV0IHRoYXQncyBhCisJICAgd2FzdGUgb2YgdGltZSBhbmQgc3BhY2UgZ2l2ZW4gdGhhdCA1KjE1ID0gNzUgYml0cyBhcmUgcmFyZWx5CisJICAgbmVlZGVkLiAqLworCXQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKWl2YWw7CisJd2hpbGUgKHQpIHsKKwkJKytuZGlnaXRzOworCQl0ID4+PSBTSElGVDsKKwl9CisJdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworCWlmICh2ICE9IE5VTEwpIHsKKwkJZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKwkJdi0+b2Jfc2l6ZSA9IG5lZ2F0aXZlID8gLW5kaWdpdHMgOiBuZGlnaXRzOworCQl0ID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOworCQl3aGlsZSAodCkgeworCQkJKnArKyA9IChkaWdpdCkodCAmIE1BU0spOworCQkJdCA+Pj0gU0hJRlQ7CisJCX0KKwl9CisJcmV0dXJuIChQeU9iamVjdCAqKXY7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgdW5zaWduZWQgUFlfTE9OR19MT05HIGludC4gKi8KQEAgLTg1NywxMSArODgxLDI2IEBACiBQeU9iamVjdCAqCiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodW5zaWduZWQgUFlfTE9OR19MT05HIGl2YWwpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIGJ5dGVzID0gaXZhbDsKLQlpbnQgb25lID0gMTsKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAotCQkJKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCi0JCQlTSVpFT0ZfTE9OR19MT05HLCBJU19MSVRUTEVfRU5ESUFOLCAwKTsKKwlQeUxvbmdPYmplY3QgKnY7CisJdW5zaWduZWQgUFlfTE9OR19MT05HIHQ7CisJaW50IG5kaWdpdHMgPSAwOworCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLworCXQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKWl2YWw7CisJd2hpbGUgKHQpIHsKKwkJKytuZGlnaXRzOworCQl0ID4+PSBTSElGVDsKKwl9CisJdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworCWlmICh2ICE9IE5VTEwpIHsKKwkJZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKwkJdi0+b2Jfc2l6ZSA9IG5kaWdpdHM7CisJCXdoaWxlIChpdmFsKSB7CisJCQkqcCsrID0gKGRpZ2l0KShpdmFsICYgTUFTSyk7CisJCQlpdmFsID4+PSBTSElGVDsKKwkJfQorCX0KKwlyZXR1cm4gKFB5T2JqZWN0ICopdjsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGxvbmcgaW50IG9iamVjdCBmcm9tIGEgQyBQeV9zc2l6ZV90LiAqLwpAQCAtMTMwNSw3ICsxMzQ0LDMzIEBACiAJcmV0dXJuIChQeU9iamVjdCAqKXN0cjsKIH0KIAotLyogKnN0ciBwb2ludHMgdG8gdGhlIGZpcnN0IGRpZ2l0IGluIGEgc3RyaW5nIG9mIGJhc2UgYmFzZSBkaWdpdHMuICBiYXNlCisvKiBUYWJsZSBvZiBkaWdpdCB2YWx1ZXMgZm9yIDgtYml0IHN0cmluZyAtPiBpbnRlZ2VyIGNvbnZlcnNpb24uCisgKiAnMCcgbWFwcyB0byAwLCAuLi4sICc5JyBtYXBzIHRvIDkuCisgKiAnYScgYW5kICdBJyBtYXAgdG8gMTAsIC4uLiwgJ3onIGFuZCAnWicgbWFwIHRvIDM1LgorICogQWxsIG90aGVyIGluZGljZXMgbWFwIHRvIDM3LgorICogTm90ZSB0aGF0IHdoZW4gY29udmVydGluZyBhIGJhc2UgQiBzdHJpbmcsIGEgY2hhciBjIGlzIGEgbGVnaXRpbWF0ZQorICogYmFzZSBCIGRpZ2l0IGlmZiBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soYyldIDwgQi4KKyAqLworaW50IF9QeUxvbmdfRGlnaXRWYWx1ZVsyNTZdID0geworCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorCTI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAorCTI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorCTM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LAorfTsKKworLyogKnN0ciBwb2ludHMgdG8gdGhlIGZpcnN0IGRpZ2l0IGluIGEgc3RyaW5nIG9mIGJhc2UgYGJhc2VgIGRpZ2l0cy4gIGJhc2UKICAqIGlzIGEgcG93ZXIgb2YgMiAoMiwgNCwgOCwgMTYsIG9yIDMyKS4gICpzdHIgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBmaXJzdAogICogbm9uLWRpZ2l0ICh3aGljaCBtYXkgYmUgKnN0ciEpLiAgQSBub3JtYWxpemVkIGxvbmcgaXMgcmV0dXJuZWQuCiAgKiBUaGUgcG9pbnQgdG8gdGhpcyByb3V0aW5lIGlzIHRoYXQgaXQgdGFrZXMgdGltZSBsaW5lYXIgaW4gdGhlIG51bWJlciBvZgpAQCAtMTMyOSwyMCArMTM5NCw4IEBACiAJCW4gPj49IDE7CiAJLyogbiA8LSB0b3RhbCAjIG9mIGJpdHMgbmVlZGVkLCB3aGlsZSBzZXR0aW5nIHAgdG8gZW5kLW9mLXN0cmluZyAqLwogCW4gPSAwOwotCWZvciAoOzspIHsKLQkJaW50IGsgPSAtMTsKLQkJY2hhciBjaCA9ICpwOwotCi0JCWlmIChjaCA8PSAnOScpCi0JCQlrID0gY2ggLSAnMCc7Ci0JCWVsc2UgaWYgKGNoID49ICdhJykKLQkJCWsgPSBjaCAtICdhJyArIDEwOwotCQllbHNlIGlmIChjaCA+PSAnQScpCi0JCQlrID0gY2ggLSAnQScgKyAxMDsKLQkJaWYgKGsgPCAwIHx8IGsgPj0gYmFzZSkKLQkJCWJyZWFrOworCXdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnApXSA8IGJhc2UpCiAJCSsrcDsKLQl9CiAJKnN0ciA9IHA7CiAJbiA9IChwIC0gc3RhcnQpICogYml0c19wZXJfY2hhcjsKIAlpZiAobiAvIGJpdHNfcGVyX2NoYXIgIT0gcCAtIHN0YXJ0KSB7CkBAIC0xMzYyLDE3ICsxNDE1LDcgQEAKIAliaXRzX2luX2FjY3VtID0gMDsKIAlwZGlnaXQgPSB6LT5vYl9kaWdpdDsKIAl3aGlsZSAoLS1wID49IHN0YXJ0KSB7Ci0JCWludCBrOwotCQljaGFyIGNoID0gKnA7Ci0KLQkJaWYgKGNoIDw9ICc5JykKLQkJCWsgPSBjaCAtICcwJzsKLQkJZWxzZSBpZiAoY2ggPj0gJ2EnKQotCQkJayA9IGNoIC0gJ2EnICsgMTA7Ci0JCWVsc2UgewotCQkJYXNzZXJ0KGNoID49ICdBJyk7Ci0JCQlrID0gY2ggLSAnQScgKyAxMDsKLQkJfQorCQlpbnQgayA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqcCldOwogCQlhc3NlcnQoayA+PSAwICYmIGsgPCBiYXNlKTsKIAkJYWNjdW0gfD0gKHR3b2RpZ2l0cykoayA8PCBiaXRzX2luX2FjY3VtKTsKIAkJYml0c19pbl9hY2N1bSArPSBiaXRzX3Blcl9jaGFyOwpAQCAtMTQyOCwzMyArMTQ3MSwxNDAgQEAKIAl9CiAJaWYgKGJhc2UgPT0gMTYgJiYgc3RyWzBdID09ICcwJyAmJiAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKSkKIAkJc3RyICs9IDI7CisKIAlzdGFydCA9IHN0cjsKIAlpZiAoKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKQogCQl6ID0gbG9uZ19mcm9tX2JpbmFyeV9iYXNlKCZzdHIsIGJhc2UpOwogCWVsc2UgewotCQl6ID0gX1B5TG9uZ19OZXcoMCk7Ci0JCWZvciAoIDsgeiAhPSBOVUxMOyArK3N0cikgewotCQkJaW50IGsgPSAtMTsKLQkJCVB5TG9uZ09iamVjdCAqdGVtcDsKKy8qKioKK0JpbmFyeSBiYXNlcyBjYW4gYmUgY29udmVydGVkIGluIHRpbWUgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZGlnaXRzLCBiZWNhdXNlCitQeXRob24ncyByZXByZXNlbnRhdGlvbiBiYXNlIGlzIGJpbmFyeS4gIE90aGVyIGJhc2VzIChpbmNsdWRpbmcgZGVjaW1hbCEpIHVzZQordGhlIHNpbXBsZSBxdWFkcmF0aWMtdGltZSBhbGdvcml0aG0gYmVsb3csIGNvbXBsaWNhdGVkIGJ5IHNvbWUgc3BlZWQgdHJpY2tzLgogCi0JCQlpZiAoKnN0ciA8PSAnOScpCi0JCQkJayA9ICpzdHIgLSAnMCc7Ci0JCQllbHNlIGlmICgqc3RyID49ICdhJykKLQkJCQlrID0gKnN0ciAtICdhJyArIDEwOwotCQkJZWxzZSBpZiAoKnN0ciA+PSAnQScpCi0JCQkJayA9ICpzdHIgLSAnQScgKyAxMDsKLQkJCWlmIChrIDwgMCB8fCBrID49IGJhc2UpCi0JCQkJYnJlYWs7Ci0JCQl0ZW1wID0gbXVsYWRkMSh6LCAoZGlnaXQpYmFzZSwgKGRpZ2l0KWspOwotCQkJUHlfREVDUkVGKHopOwotCQkJeiA9IHRlbXA7CitGaXJzdCBzb21lIG1hdGg6ICB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHRoYXQgY2FuIGJlIGV4cHJlc3NlZCBpbiBOIGJhc2UtQiBkaWdpdHMKK2lzIEIqKk4tMS4gIENvbnNlcXVlbnRseSwgaWYgd2UgaGF2ZSBhbiBOLWRpZ2l0IGlucHV0IGluIGJhc2UgQiwgdGhlIHdvcnN0LQorY2FzZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cyBuZWVkZWQgdG8gaG9sZCBpdCBpcyB0aGUgc21hbGxlc3QgaW50ZWdlciBuIHMudC4KKworICAgIEJBU0UqKm4tMSA+PSBCKipOLTEgIFtvciwgYWRkaW5nIDEgdG8gYm90aCBzaWRlc10KKyAgICBCQVNFKipuID49IEIqKk4gICAgICBbdGFraW5nIGxvZ3MgdG8gYmFzZSBCQVNFXQorICAgIG4gPj0gbG9nKEIqKk4pL2xvZyhCQVNFKSA9IE4gKiBsb2coQikvbG9nKEJBU0UpCisKK1RoZSBzdGF0aWMgYXJyYXkgbG9nX2Jhc2VfQkFTRVtiYXNlXSA9PSBsb2coYmFzZSkvbG9nKEJBU0UpIHNvIHdlIGNhbiBjb21wdXRlCit0aGlzIHF1aWNrbHkuICBBIFB5dGhvbiBsb25nIHdpdGggdGhhdCBtdWNoIHNwYWNlIGlzIHJlc2VydmVkIG5lYXIgdGhlIHN0YXJ0LAorYW5kIHRoZSByZXN1bHQgaXMgY29tcHV0ZWQgaW50byBpdC4KKworVGhlIGlucHV0IHN0cmluZyBpcyBhY3R1YWxseSB0cmVhdGVkIGFzIGJlaW5nIGluIGJhc2UgYmFzZSoqaSAoaS5lLiwgaSBkaWdpdHMKK2FyZSBwcm9jZXNzZWQgYXQgYSB0aW1lKSwgd2hlcmUgdHdvIG1vcmUgc3RhdGljIGFycmF5cyBob2xkOgorCisgICAgY29udndpZHRoX2Jhc2VbYmFzZV0gPSB0aGUgbGFyZ2VzdCBpbnRlZ2VyIGkgc3VjaCB0aGF0IGJhc2UqKmkgPD0gQkFTRQorICAgIGNvbnZtdWx0bWF4X2Jhc2VbYmFzZV0gPSBiYXNlICoqIGNvbnZ3aWR0aF9iYXNlW2Jhc2VdCisKK1RoZSBmaXJzdCBvZiB0aGVzZSBpcyB0aGUgbGFyZ2VzdCBpIHN1Y2ggdGhhdCBpIGNvbnNlY3V0aXZlIGlucHV0IGRpZ2l0cworbXVzdCBmaXQgaW4gYSBzaW5nbGUgUHl0aG9uIGRpZ2l0LiAgVGhlIHNlY29uZCBpcyBlZmZlY3RpdmVseSB0aGUgaW5wdXQKK2Jhc2Ugd2UncmUgcmVhbGx5IHVzaW5nLgorCitWaWV3aW5nIHRoZSBpbnB1dCBhcyBhIHNlcXVlbmNlIDxjMCwgYzEsIC4uLiwgY19uLTE+IG9mIGRpZ2l0cyBpbiBiYXNlCitjb252bXVsdG1heF9iYXNlW2Jhc2VdLCB0aGUgcmVzdWx0IGlzICJzaW1wbHkiCisKKyAgICgoKGMwKkIgKyBjMSkqQiArIGMyKSpCICsgYzMpKkIgKyAuLi4gKSkpICsgY19uLTEKKword2hlcmUgQiA9IGNvbnZtdWx0bWF4X2Jhc2VbYmFzZV0uCisqKiovCisJCXJlZ2lzdGVyIHR3b2RpZ2l0cyBjOwkvKiBjdXJyZW50IGlucHV0IGNoYXJhY3RlciAqLworCQlQeV9zc2l6ZV90IHNpemVfejsKKwkJaW50IGk7CisJCWludCBjb252d2lkdGg7CisJCXR3b2RpZ2l0cyBjb252bXVsdG1heCwgY29udm11bHQ7CisJCWRpZ2l0ICpweiwgKnB6c3RvcDsKKwkJY2hhciogc2NhbjsKKworCQlzdGF0aWMgZG91YmxlIGxvZ19iYXNlX0JBU0VbMzddID0gezAuMGUwLH07CisJCXN0YXRpYyBpbnQgY29udndpZHRoX2Jhc2VbMzddID0gezAsfTsKKwkJc3RhdGljIHR3b2RpZ2l0cyBjb252bXVsdG1heF9iYXNlWzM3XSA9IHswLH07CisKKwkJaWYgKGxvZ19iYXNlX0JBU0VbYmFzZV0gPT0gMC4wKSB7CisJCQl0d29kaWdpdHMgY29udm1heCA9IGJhc2U7CisJCQlpbnQgaSA9IDE7CisKKwkJCWxvZ19iYXNlX0JBU0VbYmFzZV0gPSBsb2coKGRvdWJsZSliYXNlKSAvCisJCQkJCQlsb2coKGRvdWJsZSlCQVNFKTsKKwkJCWZvciAoOzspIHsKKwkJCQl0d29kaWdpdHMgbmV4dCA9IGNvbnZtYXggKiBiYXNlOworCQkJCWlmIChuZXh0ID4gQkFTRSkKKwkJCQkJYnJlYWs7CisJCQkJY29udm1heCA9IG5leHQ7CisJCQkJKytpOworCQkJfQorCQkJY29udm11bHRtYXhfYmFzZVtiYXNlXSA9IGNvbnZtYXg7CisJCQlhc3NlcnQoaSA+IDApOworCQkJY29udndpZHRoX2Jhc2VbYmFzZV0gPSBpOworCQl9CisKKwkJLyogRmluZCBsZW5ndGggb2YgdGhlIHN0cmluZyBvZiBudW1lcmljIGNoYXJhY3RlcnMuICovCisJCXNjYW4gPSBzdHI7CisJCXdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnNjYW4pXSA8IGJhc2UpCisJCQkrK3NjYW47CisKKwkJLyogQ3JlYXRlIGEgbG9uZyBvYmplY3QgdGhhdCBjYW4gY29udGFpbiB0aGUgbGFyZ2VzdCBwb3NzaWJsZQorCQkgKiBpbnRlZ2VyIHdpdGggdGhpcyBiYXNlIGFuZCBsZW5ndGguICBOb3RlIHRoYXQgdGhlcmUncyBubworCQkgKiBuZWVkIHRvIGluaXRpYWxpemUgei0+b2JfZGlnaXQgLS0gbm8gc2xvdCBpcyByZWFkIHVwIGJlZm9yZQorCQkgKiBiZWluZyBzdG9yZWQgaW50by4KKwkJICovCisJCXNpemVfeiA9IChQeV9zc2l6ZV90KSgoc2NhbiAtIHN0cikgKiBsb2dfYmFzZV9CQVNFW2Jhc2VdKSArIDE7CisJCWFzc2VydChzaXplX3ogPiAwKTsKKwkJeiA9IF9QeUxvbmdfTmV3KHNpemVfeik7CisJCWlmICh6ID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJei0+b2Jfc2l6ZSA9IDA7CisKKwkJLyogYGNvbnZ3aWR0aGAgY29uc2VjdXRpdmUgaW5wdXQgZGlnaXRzIGFyZSB0cmVhdGVkIGFzIGEgc2luZ2xlCisJCSAqIGRpZ2l0IGluIGJhc2UgYGNvbnZtdWx0bWF4YC4KKwkJICovCisJCWNvbnZ3aWR0aCA9IGNvbnZ3aWR0aF9iYXNlW2Jhc2VdOworCQljb252bXVsdG1heCA9IGNvbnZtdWx0bWF4X2Jhc2VbYmFzZV07CisKKwkJLyogV29yayA7LSkgKi8KKwkJd2hpbGUgKHN0ciA8IHNjYW4pIHsKKwkJCS8qIGdyYWIgdXAgdG8gY29udndpZHRoIGRpZ2l0cyBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgKi8KKwkJCWMgPSAoZGlnaXQpX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzdHIrKyldOworCQkJZm9yIChpID0gMTsgaSA8IGNvbnZ3aWR0aCAmJiBzdHIgIT0gc2NhbjsgKytpLCArK3N0cikgeworCQkJCWMgPSAodHdvZGlnaXRzKShjICogIGJhc2UgKworCQkJCQlfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildKTsKKwkJCQlhc3NlcnQoYyA8IEJBU0UpOworCQkJfQorCisJCQljb252bXVsdCA9IGNvbnZtdWx0bWF4OworCQkJLyogQ2FsY3VsYXRlIHRoZSBzaGlmdCBvbmx5IGlmIHdlIGNvdWxkbid0IGdldAorCQkJICogY29udndpZHRoIGRpZ2l0cy4KKwkJCSAqLworCQkJaWYgKGkgIT0gY29udndpZHRoKSB7CisJCQkJY29udm11bHQgPSBiYXNlOworCQkJCWZvciAoIDsgaSA+IDE7IC0taSkKKwkJCQkJY29udm11bHQgKj0gYmFzZTsKKwkJCX0KKworCQkJLyogTXVsdGlwbHkgeiBieSBjb252bXVsdCwgYW5kIGFkZCBjLiAqLworCQkJcHogPSB6LT5vYl9kaWdpdDsKKwkJCXB6c3RvcCA9IHB6ICsgei0+b2Jfc2l6ZTsKKwkJCWZvciAoOyBweiA8IHB6c3RvcDsgKytweikgeworCQkJCWMgKz0gKHR3b2RpZ2l0cykqcHogKiBjb252bXVsdDsKKwkJCQkqcHogPSAoZGlnaXQpKGMgJiBNQVNLKTsKKwkJCQljID4+PSBTSElGVDsKKwkJCX0KKwkJCS8qIGNhcnJ5IG9mZiB0aGUgY3VycmVudCBlbmQ/ICovCisJCQlpZiAoYykgeworCQkJCWFzc2VydChjIDwgQkFTRSk7CisJCQkJYXNzZXJ0KHotPm9iX3NpemUgPCBzaXplX3opOworCQkJCSpweiA9IChkaWdpdCljOworCQkJCSsrei0+b2Jfc2l6ZTsKKwkJCX0KIAkJfQogCX0KIAlpZiAoeiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAoc3RyID09IHN0YXJ0KQogCQlnb3RvIG9uRXJyb3I7Ci0JaWYgKHNpZ24gPCAwICYmIHogIT0gTlVMTCAmJiB6LT5vYl9zaXplICE9IDApCisJaWYgKHNpZ24gPCAwKQogCQl6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKIAlpZiAoKnN0ciA9PSAnTCcgfHwgKnN0ciA9PSAnbCcpCiAJCXN0cisrOwpAQCAtMTU4MCw5ICsxNzMwLDEwIEBACiAJYXNzZXJ0KHNpemVfdyA9PSBBQlMody0+b2Jfc2l6ZSkpOyAvKiBUaGF0J3MgaG93IGQgd2FzIGNhbGN1bGF0ZWQgKi8KIAogCXNpemVfdiA9IEFCUyh2LT5vYl9zaXplKTsKLQlhID0gX1B5TG9uZ19OZXcoc2l6ZV92IC0gc2l6ZV93ICsgMSk7CisJayA9IHNpemVfdiAtIHNpemVfdzsKKwlhID0gX1B5TG9uZ19OZXcoayArIDEpOwogCi0JZm9yIChqID0gc2l6ZV92LCBrID0gYS0+b2Jfc2l6ZS0xOyBhICE9IE5VTEwgJiYgayA+PSAwOyAtLWosIC0taykgeworCWZvciAoaiA9IHNpemVfdjsgYSAhPSBOVUxMICYmIGsgPj0gMDsgLS1qLCAtLWspIHsKIAkJZGlnaXQgdmogPSAoaiA+PSBzaXplX3YpID8gMCA6IHYtPm9iX2RpZ2l0W2pdOwogCQl0d29kaWdpdHMgcTsKIAkJc3R3b2RpZ2l0cyBjYXJyeSA9IDA7CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9SRUFETUUudHh0IGIvT2JqZWN0cy9zdHJpbmdsaWIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE4Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDM0IEBACitiaXRzIHNoYXJlZCBieSB0aGUgc3RyaW5nb2JqZWN0IGFuZCB1bmljb2Rlb2JqZWN0IGltcGxlbWVudGF0aW9ucyAoYW5kCitwb3NzaWJseSBvdGhlciBtb2R1bGVzLCBpbiBhIG5vdCB0b28gZGlzdGFudCBmdXR1cmUpLgorCit0aGUgc3R1ZmYgaW4gaGVyZSBpcyBpbmNsdWRlZCBpbnRvIHJlbGV2YW50IHBsYWNlczsgc2VlIHRoZSBpbmRpdmlkdWFsCitzb3VyY2UgZmlsZXMgZm9yIGRldGFpbHMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0aGUgZm9sbG93aW5nIGRlZmluZXMgdXNlZCBieSB0aGUgZGlmZmVyZW50IG1vZHVsZXM6CisKK1NUUklOR0xJQl9DSEFSCisKKyAgICB0aGUgdHlwZSB1c2VkIHRvIGhvbGQgYSBjaGFyYWN0ZXIgKGNoYXIgb3IgUHlfVU5JQ09ERSkKKworU1RSSU5HTElCX0VNUFRZCisKKyAgICBhIFB5T2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZW1wdHkgc3RyaW5nCisKK2ludCBTVFJJTkdMSUJfQ01QKFNUUklOR0xJQl9DSEFSKiwgU1RSSU5HTElCX0NIQVIqLCBQeV9zc2l6ZV90KQorCisgICAgY29tcGFyZXMgdHdvIHN0cmluZ3MuIHJldHVybnMgMCBpZiB0aGV5IG1hdGNoLCBhbmQgbm9uLXplcm8gaWYgbm90LgorCitQeV9zc2l6ZV90IFNUUklOR0xJQl9MRU4oUHlPYmplY3QqKQorCisgICAgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBzdHJpbmcgb2JqZWN0ICh3aGljaCBtdXN0IGJlIG9mIHRoZQorICAgIHJpZ2h0IHR5cGUpCisKK1B5T2JqZWN0KiBTVFJJTkdMSUJfTkVXKFNUUklOR0xJQl9DSEFSKiwgUHlfc3NpemVfdCkKKworICAgIGNyZWF0ZXMgYSBuZXcgc3RyaW5nIG9iamVjdAorCitTVFJJTkdMSUJfQ0hBUiogU1RSSU5HTElCX1NUUihQeU9iamVjdCopCisKKyAgICByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgZGF0YSBmb3IgdGhlIGdpdmVuIHN0cmluZworICAgIG9iamVjdCAod2hpY2ggbXVzdCBiZSBvZiB0aGUgcmlnaHQgdHlwZSkKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2NvdW50LmggYi9PYmplY3RzL3N0cmluZ2xpYi9jb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZDAyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9jb3VudC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIHN0cmluZ2xpYjogY291bnQgaW1wbGVtZW50YXRpb24gKi8KKworI2lmbmRlZiBTVFJJTkdMSUJfQ09VTlRfSAorI2RlZmluZSBTVFJJTkdMSUJfQ09VTlRfSAorCisjaWZuZGVmIFNUUklOR0xJQl9GQVNUU0VBUkNIX0gKKyNlcnJvciBtdXN0IGluY2x1ZGUgInN0cmluZ2xpYi9mYXN0c2VhcmNoLmgiIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBtb2R1bGUKKyNlbmRpZgorCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK3N0cmluZ2xpYl9jb3VudChjb25zdCBTVFJJTkdMSUJfQ0hBUiogc3RyLCBQeV9zc2l6ZV90IHN0cl9sZW4sCisgICAgICAgICAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIqIHN1YiwgUHlfc3NpemVfdCBzdWJfbGVuKQoreworICAgIFB5X3NzaXplX3QgY291bnQ7CisKKyAgICBpZiAoc3ViX2xlbiA9PSAwKQorICAgICAgICByZXR1cm4gc3RyX2xlbiArIDE7CisKKyAgICBjb3VudCA9IGZhc3RzZWFyY2goc3RyLCBzdHJfbGVuLCBzdWIsIHN1Yl9sZW4sIEZBU1RfQ09VTlQpOworCisgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgY291bnQgPSAwOyAvKiBubyBtYXRjaCAqLworCisgICAgcmV0dXJuIGNvdW50OworfQorCisjZW5kaWYKKworLyoKK0xvY2FsIHZhcmlhYmxlczoKK2MtYmFzaWMtb2Zmc2V0OiA0CitpbmRlbnQtdGFicy1tb2RlOiBuaWwKK0VuZDoKKyovCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmggYi9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3OWMzNgotLS0gL2Rldi9udWxsCisrKyBiL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaApAQCAtMCwwICsxLDEwNCBAQAorLyogc3RyaW5nbGliOiBmYXN0c2VhcmNoIGltcGxlbWVudGF0aW9uICovCisKKyNpZm5kZWYgU1RSSU5HTElCX0ZBU1RTRUFSQ0hfSAorI2RlZmluZSBTVFJJTkdMSUJfRkFTVFNFQVJDSF9ICisKKy8qIGZhc3Qgc2VhcmNoL2NvdW50IGltcGxlbWVudGF0aW9uLCBiYXNlZCBvbiBhIG1peCBiZXR3ZWVuIGJveWVyLQorICAgbW9vcmUgYW5kIGhvcnNwb29sLCB3aXRoIGEgZmV3IG1vcmUgYmVsbHMgYW5kIHdoaXN0bGVzIG9uIHRoZSB0b3AuCisgICBmb3Igc29tZSBtb3JlIGJhY2tncm91bmQsIHNlZTogaHR0cDovL2VmZmJvdC5vcmcvc3RyaW5nbGliICovCisKKy8qIG5vdGU6IGZhc3RzZWFyY2ggbWF5IGFjY2VzcyBzW25dLCB3aGljaCBpc24ndCBhIHByb2JsZW0gd2hlbiB1c2luZworICAgUHl0aG9uJ3Mgb3JkaW5hcnkgc3RyaW5nIHR5cGVzLCBidXQgbWF5IGNhdXNlIHByb2JsZW1zIGlmIHlvdSdyZQorICAgdXNpbmcgdGhpcyBjb2RlIGluIG90aGVyIGNvbnRleHRzLiAgYWxzbywgdGhlIGNvdW50IG1vZGUgcmV0dXJucyAtMQorICAgaWYgdGhlcmUgY2Fubm90IHBvc3NpYmxlIGJlIGEgbWF0Y2ggaW4gdGhlIHRhcmdldCBzdHJpbmcsIGFuZCAwIGlmCisgICBpdCBoYXMgYWN0dWFsbHkgY2hlY2tlZCBmb3IgbWF0Y2hlcywgYnV0IGRpZG4ndCBmaW5kIGFueS4gIGNhbGxlcnMKKyAgIGJld2FyZSEgKi8KKworI2RlZmluZSBGQVNUX0NPVU5UIDAKKyNkZWZpbmUgRkFTVF9TRUFSQ0ggMQorCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK2Zhc3RzZWFyY2goY29uc3QgU1RSSU5HTElCX0NIQVIqIHMsIFB5X3NzaXplX3QgbiwKKyAgICAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIqIHAsIFB5X3NzaXplX3QgbSwKKyAgICAgICAgICAgaW50IG1vZGUpCit7CisgICAgbG9uZyBtYXNrOworICAgIFB5X3NzaXplX3Qgc2tpcCwgY291bnQgPSAwOworICAgIFB5X3NzaXplX3QgaSwgaiwgbWxhc3QsIHc7CisKKyAgICB3ID0gbiAtIG07CisKKyAgICBpZiAodyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGxvb2sgZm9yIHNwZWNpYWwgY2FzZXMgKi8KKyAgICBpZiAobSA8PSAxKSB7CisgICAgICAgIGlmIChtIDw9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIC8qIHVzZSBzcGVjaWFsIGNhc2UgZm9yIDEtY2hhcmFjdGVyIHN0cmluZ3MgKi8KKyAgICAgICAgaWYgKG1vZGUgPT0gRkFTVF9DT1VOVCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSBwWzBdKQorICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSBwWzBdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWxhc3QgPSBtIC0gMTsKKworICAgIC8qIGNyZWF0ZSBjb21wcmVzc2VkIGJveWVyLW1vb3JlIGRlbHRhIDEgdGFibGUgKi8KKyAgICBza2lwID0gbWxhc3QgLSAxOworICAgIC8qIHByb2Nlc3MgcGF0dGVybls6LTFdICovCisgICAgZm9yIChtYXNrID0gaSA9IDA7IGkgPCBtbGFzdDsgaSsrKSB7CisgICAgICAgIG1hc2sgfD0gKDEgPDwgKHBbaV0gJiAweDFGKSk7CisgICAgICAgIGlmIChwW2ldID09IHBbbWxhc3RdKQorICAgICAgICAgICAgc2tpcCA9IG1sYXN0IC0gaSAtIDE7CisgICAgfQorICAgIC8qIHByb2Nlc3MgcGF0dGVyblstMV0gb3V0c2lkZSB0aGUgbG9vcCAqLworICAgIG1hc2sgfD0gKDEgPDwgKHBbbWxhc3RdICYgMHgxRikpOworCisgICAgZm9yIChpID0gMDsgaSA8PSB3OyBpKyspIHsKKyAgICAgICAgLyogbm90ZTogdXNpbmcgbWxhc3QgaW4gdGhlIHNraXAgcGF0aCBzbG93cyB0aGluZ3MgZG93biBvbiB4ODYgKi8KKyAgICAgICAgaWYgKHNbaSttLTFdID09IHBbbS0xXSkgeworICAgICAgICAgICAgLyogY2FuZGlkYXRlIG1hdGNoICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWxhc3Q7IGorKykKKyAgICAgICAgICAgICAgICBpZiAoc1tpK2pdICE9IHBbal0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGogPT0gbWxhc3QpIHsKKyAgICAgICAgICAgICAgICAvKiBnb3QgYSBtYXRjaCEgKi8KKyAgICAgICAgICAgICAgICBpZiAobW9kZSAhPSBGQVNUX0NPVU5UKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGkgPSBpICsgbWxhc3Q7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBtaXNzOiBjaGVjayBpZiBuZXh0IGNoYXJhY3RlciBpcyBwYXJ0IG9mIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIGlmICghKG1hc2sgJiAoMSA8PCAoc1tpK21dICYgMHgxRikpKSkKKyAgICAgICAgICAgICAgICBpID0gaSArIG07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IGkgKyBza2lwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc2tpcDogY2hlY2sgaWYgbmV4dCBjaGFyYWN0ZXIgaXMgcGFydCBvZiBwYXR0ZXJuICovCisgICAgICAgICAgICBpZiAoIShtYXNrICYgKDEgPDwgKHNbaSttXSAmIDB4MUYpKSkpCisgICAgICAgICAgICAgICAgaSA9IGkgKyBtOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1vZGUgIT0gRkFTVF9DT1VOVCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBjb3VudDsKK30KKworI2VuZGlmCisKKy8qCitMb2NhbCB2YXJpYWJsZXM6CitjLWJhc2ljLW9mZnNldDogNAoraW5kZW50LXRhYnMtbW9kZTogbmlsCitFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZWEyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9maW5kLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHN0cmluZ2xpYjogZmluZC9pbmRleCBpbXBsZW1lbnRhdGlvbiAqLworCisjaWZuZGVmIFNUUklOR0xJQl9GSU5EX0gKKyNkZWZpbmUgU1RSSU5HTElCX0ZJTkRfSAorCisjaWZuZGVmIFNUUklOR0xJQl9GQVNUU0VBUkNIX0gKKyNlcnJvciBtdXN0IGluY2x1ZGUgInN0cmluZ2xpYi9mYXN0c2VhcmNoLmgiIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBtb2R1bGUKKyNlbmRpZgorCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK3N0cmluZ2xpYl9maW5kKGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzdHIsIFB5X3NzaXplX3Qgc3RyX2xlbiwKKyAgICAgICAgICAgICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzdWIsIFB5X3NzaXplX3Qgc3ViX2xlbiwKKyAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgb2Zmc2V0KQoreworICAgIFB5X3NzaXplX3QgcG9zOworCisgICAgaWYgKHN1Yl9sZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKworICAgIHBvcyA9IGZhc3RzZWFyY2goc3RyLCBzdHJfbGVuLCBzdWIsIHN1Yl9sZW4sIEZBU1RfU0VBUkNIKTsKKworICAgIGlmIChwb3MgPj0gMCkKKyAgICAgICAgcG9zICs9IG9mZnNldDsKKworICAgIHJldHVybiBwb3M7Cit9CisKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorc3RyaW5nbGliX3JmaW5kKGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzdHIsIFB5X3NzaXplX3Qgc3RyX2xlbiwKKyAgICAgICAgICAgICAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiogc3ViLCBQeV9zc2l6ZV90IHN1Yl9sZW4sCisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvZmZzZXQpCit7CisgICAgUHlfc3NpemVfdCBwb3M7CisKKyAgICAvKiBYWFggLSBjcmVhdGUgcmV2ZXJzZWZhc3RzZWFyY2ggaGVscGVyISAqLworICAgIGlmIChzdWJfbGVuID09IDApCisJcG9zID0gc3RyX2xlbiArIG9mZnNldDsKKyAgICBlbHNlIHsKKwlQeV9zc2l6ZV90IGo7CisgICAgICAgIHBvcyA9IC0xOworCWZvciAoaiA9IHN0cl9sZW4gLSBzdWJfbGVuOyBqID49IDA7IC0taikKKyAgICAgICAgICAgIGlmIChTVFJJTkdMSUJfQ01QKHN0citqLCBzdWIsIHN1Yl9sZW4pID09IDApIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBqICsgb2Zmc2V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwb3M7Cit9CisKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorc3RyaW5nbGliX2ZpbmRfc2xpY2UoY29uc3QgU1RSSU5HTElCX0NIQVIqIHN0ciwgUHlfc3NpemVfdCBzdHJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIqIHN1YiwgUHlfc3NpemVfdCBzdWJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQpCit7CisgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgc3RhcnQgKz0gc3RyX2xlbjsKKyAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICBzdGFydCA9IDA7CisgICAgaWYgKGVuZCA+IHN0cl9sZW4pCisgICAgICAgIGVuZCA9IHN0cl9sZW47CisgICAgaWYgKGVuZCA8IDApCisgICAgICAgIGVuZCArPSBzdHJfbGVuOworICAgIGlmIChlbmQgPCAwKQorICAgICAgICBlbmQgPSAwOworCisgICAgcmV0dXJuIHN0cmluZ2xpYl9maW5kKAorICAgICAgICBzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQKKyAgICAgICAgKTsKK30KKworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitzdHJpbmdsaWJfcmZpbmRfc2xpY2UoY29uc3QgU1RSSU5HTElCX0NIQVIqIHN0ciwgUHlfc3NpemVfdCBzdHJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzdWIsIFB5X3NzaXplX3Qgc3ViX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCkKK3sKKyAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICBzdGFydCArPSBzdHJfbGVuOworICAgIGlmIChzdGFydCA8IDApCisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICBpZiAoZW5kID4gc3RyX2xlbikKKyAgICAgICAgZW5kID0gc3RyX2xlbjsKKyAgICBpZiAoZW5kIDwgMCkKKyAgICAgICAgZW5kICs9IHN0cl9sZW47CisgICAgaWYgKGVuZCA8IDApCisgICAgICAgIGVuZCA9IDA7CisKKyAgICByZXR1cm4gc3RyaW5nbGliX3JmaW5kKHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViLCBzdWJfbGVuLCBzdGFydCk7Cit9CisKKyNpZmRlZiBTVFJJTkdMSUJfU1RSCisKK1B5X0xPQ0FMX0lOTElORShpbnQpCitzdHJpbmdsaWJfY29udGFpbnNfb2JqKFB5T2JqZWN0KiBzdHIsIFB5T2JqZWN0KiBzdWIpCit7CisgICAgcmV0dXJuIHN0cmluZ2xpYl9maW5kKAorICAgICAgICBTVFJJTkdMSUJfU1RSKHN0ciksIFNUUklOR0xJQl9MRU4oc3RyKSwKKyAgICAgICAgU1RSSU5HTElCX1NUUihzdWIpLCBTVFJJTkdMSUJfTEVOKHN1YiksIDAKKyAgICAgICAgKSAhPSAtMTsKK30KKworI2VuZGlmIC8qIFNUUklOR0xJQl9TVFIgKi8KKworI2VuZGlmIC8qIFNUUklOR0xJQl9GSU5EX0ggKi8KKworLyoKK0xvY2FsIHZhcmlhYmxlczoKK2MtYmFzaWMtb2Zmc2V0OiA0CitpbmRlbnQtdGFicy1tb2RlOiBuaWwKK0VuZDoKKyovCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9wYXJ0aXRpb24uaCBiL09iamVjdHMvc3RyaW5nbGliL3BhcnRpdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODYzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9wYXJ0aXRpb24uaApAQCAtMCwwICsxLDExMSBAQAorLyogc3RyaW5nbGliOiBwYXJ0aXRpb24gaW1wbGVtZW50YXRpb24gKi8KKworI2lmbmRlZiBTVFJJTkdMSUJfUEFSVElUSU9OX0gKKyNkZWZpbmUgU1RSSU5HTElCX1BBUlRJVElPTl9ICisKKyNpZm5kZWYgU1RSSU5HTElCX0ZBU1RTRUFSQ0hfSAorI2Vycm9yIG11c3QgaW5jbHVkZSAic3RyaW5nbGliL2Zhc3RzZWFyY2guaCIgYmVmb3JlIGluY2x1ZGluZyB0aGlzIG1vZHVsZQorI2VuZGlmCisKK1B5X0xPQ0FMX0lOTElORShQeU9iamVjdCopCitzdHJpbmdsaWJfcGFydGl0aW9uKAorICAgIFB5T2JqZWN0KiBzdHJfb2JqLCBjb25zdCBTVFJJTkdMSUJfQ0hBUiogc3RyLCBQeV9zc2l6ZV90IHN0cl9sZW4sCisgICAgUHlPYmplY3QqIHNlcF9vYmosIGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzZXAsIFB5X3NzaXplX3Qgc2VwX2xlbgorICAgICkKK3sKKyAgICBQeU9iamVjdCogb3V0OworICAgIFB5X3NzaXplX3QgcG9zOworCisgICAgaWYgKHNlcF9sZW4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHNlcGFyYXRvciIpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIG91dCA9IFB5VHVwbGVfTmV3KDMpOworICAgIGlmICghb3V0KQorCXJldHVybiBOVUxMOworCisgICAgcG9zID0gZmFzdHNlYXJjaChzdHIsIHN0cl9sZW4sIHNlcCwgc2VwX2xlbiwgRkFTVF9TRUFSQ0gpOworCisgICAgaWYgKHBvcyA8IDApIHsKKwlQeV9JTkNSRUYoc3RyX29iaik7CisJUHlUdXBsZV9TRVRfSVRFTShvdXQsIDAsIChQeU9iamVjdCopIHN0cl9vYmopOworCVB5X0lOQ1JFRihTVFJJTkdMSUJfRU1QVFkpOworCVB5VHVwbGVfU0VUX0lURU0ob3V0LCAxLCAoUHlPYmplY3QqKSBTVFJJTkdMSUJfRU1QVFkpOworCVB5X0lOQ1JFRihTVFJJTkdMSUJfRU1QVFkpOworCVB5VHVwbGVfU0VUX0lURU0ob3V0LCAyLCAoUHlPYmplY3QqKSBTVFJJTkdMSUJfRU1QVFkpOworCXJldHVybiBvdXQ7CisgICAgfQorCisgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDAsIFNUUklOR0xJQl9ORVcoc3RyLCBwb3MpKTsKKyAgICBQeV9JTkNSRUYoc2VwX29iaik7CisgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDEsIHNlcF9vYmopOworICAgIHBvcyArPSBzZXBfbGVuOworICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAyLCBTVFJJTkdMSUJfTkVXKHN0ciArIHBvcywgc3RyX2xlbiAtIHBvcykpOworCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKwlQeV9ERUNSRUYob3V0KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCitQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QqKQorc3RyaW5nbGliX3JwYXJ0aXRpb24oCisgICAgUHlPYmplY3QqIHN0cl9vYmosIGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzdHIsIFB5X3NzaXplX3Qgc3RyX2xlbiwKKyAgICBQeU9iamVjdCogc2VwX29iaiwgY29uc3QgU1RSSU5HTElCX0NIQVIqIHNlcCwgUHlfc3NpemVfdCBzZXBfbGVuCisgICAgKQoreworICAgIFB5T2JqZWN0KiBvdXQ7CisgICAgUHlfc3NpemVfdCBwb3MsIGo7CisKKyAgICBpZiAoc2VwX2xlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc2VwYXJhdG9yIik7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgb3V0ID0gUHlUdXBsZV9OZXcoMyk7CisgICAgaWYgKCFvdXQpCisJcmV0dXJuIE5VTEw7CisKKyAgICAvKiBYWFggLSBjcmVhdGUgcmV2ZXJzZWZhc3RzZWFyY2ggaGVscGVyISAqLworICAgICAgICBwb3MgPSAtMTsKKwlmb3IgKGogPSBzdHJfbGVuIC0gc2VwX2xlbjsgaiA+PSAwOyAtLWopCisgICAgICAgICAgICBpZiAoU1RSSU5HTElCX0NNUChzdHIraiwgc2VwLCBzZXBfbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcG9zID0gajsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgIGlmIChwb3MgPCAwKSB7CisJUHlfSU5DUkVGKHN0cl9vYmopOworCVB5VHVwbGVfU0VUX0lURU0ob3V0LCAwLCAoUHlPYmplY3QqKSBzdHJfb2JqKTsKKwlQeV9JTkNSRUYoU1RSSU5HTElCX0VNUFRZKTsKKwlQeVR1cGxlX1NFVF9JVEVNKG91dCwgMSwgKFB5T2JqZWN0KikgU1RSSU5HTElCX0VNUFRZKTsKKwlQeV9JTkNSRUYoU1RSSU5HTElCX0VNUFRZKTsKKwlQeVR1cGxlX1NFVF9JVEVNKG91dCwgMiwgKFB5T2JqZWN0KikgU1RSSU5HTElCX0VNUFRZKTsKKwlyZXR1cm4gb3V0OworICAgIH0KKworICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAwLCBTVFJJTkdMSUJfTkVXKHN0ciwgcG9zKSk7CisgICAgUHlfSU5DUkVGKHNlcF9vYmopOworICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAxLCBzZXBfb2JqKTsKKyAgICBwb3MgKz0gc2VwX2xlbjsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKG91dCwgMiwgU1RSSU5HTElCX05FVyhzdHIgKyBwb3MsIHN0cl9sZW4gLSBwb3MpKTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisJUHlfREVDUkVGKG91dCk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKK30KKworI2VuZGlmCisKKy8qCitMb2NhbCB2YXJpYWJsZXM6CitjLWJhc2ljLW9mZnNldDogNAoraW5kZW50LXRhYnMtbW9kZTogbmlsCitFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYyBiL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKaW5kZXggYjM0ZGNiMi4uMTEwYzM4ZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYworKysgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCkBAIC0xLDYgKzEsNyBAQAogLyogU3RyaW5nIG9iamVjdCBpbXBsZW1lbnRhdGlvbiAqLwogCiAjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKwogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KQEAgLTE3NiwxNCArMTc3LDExIEBACiAJCQl3aGlsZSAoKisrZiAmJiAqZiAhPSAnJScgJiYgIWlzYWxwaGEoUHlfQ0hBUk1BU0soKmYpKSkKIAkJCQk7CiAKLQkJCS8qIHNraXAgdGhlICdsJyBpbiAlbGQsIHNpbmNlIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZQotCQkJICAgd2lkdGguICBhbHRob3VnaCBvbmx5ICVkIGlzIHN1cHBvcnRlZCAoc2VlCi0JCQkgICAiZXhwYW5kIiBzZWN0aW9uIGJlbG93KSwgb3RoZXJzIGNhbiBiZSBlYXNpbHkKLQkJCSAgIGFkZGVkICovCi0JCQlpZiAoKmYgPT0gJ2wnICYmICooZisxKSA9PSAnZCcpCi0JCQkJKytmOwotCQkJLyogbGlrZXdpc2UgZm9yICV6ZCAqLwotCQkJaWYgKCpmID09ICd6JyAmJiAqKGYrMSkgPT0gJ2QnKQorCQkJLyogc2tpcCB0aGUgJ2wnIG9yICd6JyBpbiB7JWxkLCAlemQsICVsdSwgJXp1fSBzaW5jZQorCQkJICogdGhleSBkb24ndCBhZmZlY3QgdGhlIGFtb3VudCBvZiBzcGFjZSB3ZSByZXNlcnZlLgorCQkJICovCisJCQlpZiAoKCpmID09ICdsJyB8fCAqZiA9PSAneicpICYmCisJCQkJCShmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpCiAJCQkJKytmOwogCiAJCQlzd2l0Y2ggKCpmKSB7CkBAIC0xOTMsNyArMTkxLDcgQEAKIAkJCWNhc2UgJyUnOgogCQkJCW4rKzsKIAkJCQlicmVhazsKLQkJCWNhc2UgJ2QnOiBjYXNlICdpJzogY2FzZSAneCc6CisJCQljYXNlICdkJzogY2FzZSAndSc6IGNhc2UgJ2knOiBjYXNlICd4JzoKIAkJCQkodm9pZCkgdmFfYXJnKGNvdW50LCBpbnQpOwogCQkJCS8qIDIwIGJ5dGVzIGlzIGVub3VnaCB0byBob2xkIGEgNjQtYml0CiAJCQkJICAgaW50ZWdlci4gIERlY2ltYWwgdGFrZXMgdGhlIG1vc3Qgc3BhY2UuCkBAIC0yNTUsMTQgKzI1MywxNCBAQAogCQkJfQogCQkJd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhaXNhbHBoYShQeV9DSEFSTUFTSygqZikpKQogCQkJCWYrKzsKLQkJCS8qIGhhbmRsZSB0aGUgbG9uZyBmbGFnLCBidXQgb25seSBmb3IgJWxkLiAgb3RoZXJzCi0JCQkgICBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCi0JCQlpZiAoKmYgPT0gJ2wnICYmICooZisxKSA9PSAnZCcpIHsKKwkJCS8qIGhhbmRsZSB0aGUgbG9uZyBmbGFnLCBidXQgb25seSBmb3IgJWxkIGFuZCAlbHUuCisJCQkgICBvdGhlcnMgY2FuIGJlIGFkZGVkIHdoZW4gbmVjZXNzYXJ5LiAqLworCQkJaWYgKCpmID09ICdsJyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7CiAJCQkJbG9uZ2ZsYWcgPSAxOwogCQkJCSsrZjsKIAkJCX0KIAkJCS8qIGhhbmRsZSB0aGUgc2l6ZV90IGZsYWcuICovCi0JCQlpZiAoKmYgPT0gJ3onICYmICooZisxKSA9PSAnZCcpIHsKKwkJCWlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewogCQkJCXNpemVfdGZsYWcgPSAxOwogCQkJCSsrZjsKIAkJCX0KQEAgLTI3NSwxMCArMjczLDIyIEBACiAJCQkJaWYgKGxvbmdmbGFnKQogCQkJCQlzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKIAkJCQllbHNlIGlmIChzaXplX3RmbGFnKQorCQkJCQlzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKwkJCQkJICAgICAgICB2YV9hcmcodmFyZ3MsIFB5X3NzaXplX3QpKTsKKwkJCQllbHNlCisJCQkJCXNwcmludGYocywgIiVkIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKwkJCQlzICs9IHN0cmxlbihzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3UnOgorCQkJCWlmIChsb25nZmxhZykKKwkJCQkJc3ByaW50ZihzLCAiJWx1IiwKKwkJCQkJCXZhX2FyZyh2YXJncywgdW5zaWduZWQgbG9uZykpOworCQkJCWVsc2UgaWYgKHNpemVfdGZsYWcpCiAJCQkJCXNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgInUiLAogCQkJCQkgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7CiAJCQkJZWxzZQotCQkJCQlzcHJpbnRmKHMsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisJCQkJCXNwcmludGYocywgIiV1IiwKKwkJCQkJCXZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7CiAJCQkJcyArPSBzdHJsZW4ocyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlICdpJzoKQEAgLTY4MCw2ICs2OTAsOSBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogb2JqZWN0IGFwaSAqLworCiBzdGF0aWMgUHlfc3NpemVfdAogc3RyaW5nX2dldHNpemUocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewpAQCAtNzU0LDggKzc2NywyNSBAQAogCXJldHVybiAwOwogfQogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogTWV0aG9kcyAqLwogCisjZGVmaW5lIFNUUklOR0xJQl9DSEFSIGNoYXIKKworI2RlZmluZSBTVFJJTkdMSUJfQ01QIG1lbWNtcAorI2RlZmluZSBTVFJJTkdMSUJfTEVOIFB5U3RyaW5nX0dFVF9TSVpFCisjZGVmaW5lIFNUUklOR0xJQl9ORVcgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUKKyNkZWZpbmUgU1RSSU5HTElCX1NUUiBQeVN0cmluZ19BU19TVFJJTkcKKworI2RlZmluZSBTVFJJTkdMSUJfRU1QVFkgbnVsbHN0cmluZworCisjaW5jbHVkZSAic3RyaW5nbGliL2Zhc3RzZWFyY2guaCIKKworI2luY2x1ZGUgInN0cmluZ2xpYi9jb3VudC5oIgorI2luY2x1ZGUgInN0cmluZ2xpYi9maW5kLmgiCisjaW5jbHVkZSAic3RyaW5nbGliL3BhcnRpdGlvbi5oIgorCisKIHN0YXRpYyBpbnQKIHN0cmluZ19wcmludChQeVN0cmluZ09iamVjdCAqb3AsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7CkBAIC05MDAsNyArOTMwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfY29uY2F0KHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICphLCByZWdpc3RlciBQeU9iamVjdCAqYmIpCiB7Ci0JcmVnaXN0ZXIgc2l6ZV90IHNpemU7CisJcmVnaXN0ZXIgUHlfc3NpemVfdCBzaXplOwogCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKIAlpZiAoIVB5U3RyaW5nX0NoZWNrKGJiKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKQEAgLTkyNCw3ICs5NTQsMTIgQEAKIAkJcmV0dXJuIChQeU9iamVjdCAqKWE7CiAJfQogCXNpemUgPSBhLT5vYl9zaXplICsgYi0+b2Jfc2l6ZTsKLQkvKiBYWFggY2hlY2sgb3ZlcmZsb3cgKi8KKwlpZiAoc2l6ZSA8IDApIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisJCQkJInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSAgCiAJLyogSW5saW5lIFB5T2JqZWN0X05ld1ZhciAqLwogCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBzaXplKTsKIAlpZiAob3AgPT0gTlVMTCkKQEAgLTEwMTcsNjUgKzEwNTIsMzYgQEAKIH0KIAogc3RhdGljIGludAotc3RyaW5nX2NvbnRhaW5zKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqZWwpCitzdHJpbmdfY29udGFpbnMoUHlPYmplY3QgKnN0cl9vYmosIFB5T2JqZWN0ICpzdWJfb2JqKQogewotCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoYSk7Ci0JY29uc3QgY2hhciAqc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKGVsKTsKLQljaGFyICpsYXN0OwotCVB5X3NzaXplX3QgbGVuX3N1YiA9IFB5U3RyaW5nX0dFVF9TSVpFKGVsKTsKLQlQeV9zc2l6ZV90IHNob3J0c3ViOwotCWNoYXIgZmlyc3RjaGFyLCBsYXN0Y2hhcjsKLQotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChlbCkpIHsKKwlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoc3ViX29iaikpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2soZWwpKQotCQkJcmV0dXJuIFB5VW5pY29kZV9Db250YWlucyhhLCBlbCk7CisJCWlmIChQeVVuaWNvZGVfQ2hlY2soc3ViX29iaikpCisJCQlyZXR1cm4gUHlVbmljb2RlX0NvbnRhaW5zKHN0cl9vYmosIHN1Yl9vYmopOwogI2VuZGlmCi0JCWlmICghUHlTdHJpbmdfQ2hlY2soZWwpKSB7CisJCWlmICghUHlTdHJpbmdfQ2hlY2soc3ViX29iaikpIHsKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQogCi0JaWYgKGxlbl9zdWIgPT0gMCkKLQkJcmV0dXJuIDE7Ci0JLyogbGFzdCBwb2ludHMgdG8gb25lIGNoYXIgYmV5b25kIHRoZSBzdGFydCBvZiB0aGUgcmlnaHRtb3N0Ci0JICAgc3Vic3RyaW5nLiAgV2hlbiBzPGxhc3QsIHRoZXJlIGlzIHN0aWxsIHJvb20gZm9yIGEgcG9zc2libGUgbWF0Y2gKLQkgICBhbmQgc1swXSB0aHJvdWdoIHNbbGVuX3N1Yi0xXSB3aWxsIGJlIGluIGJvdW5kcy4KLQkgICBzaG9ydHN1YiBpcyBsZW5fc3ViIG1pbnVzIHRoZSBsYXN0IGNoYXJhY3RlciB3aGljaCBpcyBjaGVja2VkCi0JICAgc2VwYXJhdGVseSBqdXN0IGJlZm9yZSB0aGUgbWVtY21wKCkuICBUaGF0IGNoZWNrIGhlbHBzIHByZXZlbnQKLQkgICBmYWxzZSBzdGFydHMgYW5kIHNhdmVzIHRoZSBzZXR1cCB0aW1lIGZvciBtZW1jbXAoKS4KLQkqLwotCWZpcnN0Y2hhciA9IHN1YlswXTsKLQlzaG9ydHN1YiA9IGxlbl9zdWIgLSAxOwotCWxhc3RjaGFyID0gc3ViW3Nob3J0c3ViXTsKLQlsYXN0ID0gcyArIFB5U3RyaW5nX0dFVF9TSVpFKGEpIC0gbGVuX3N1YiArIDE7Ci0Jd2hpbGUgKHMgPCBsYXN0KSB7Ci0JCXMgPSAoY2hhciAqKW1lbWNocihzLCBmaXJzdGNoYXIsIGxhc3Qtcyk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJYXNzZXJ0KHMgPCBsYXN0KTsKLQkJaWYgKHNbc2hvcnRzdWJdID09IGxhc3RjaGFyICYmIG1lbWNtcChzLCBzdWIsIHNob3J0c3ViKSA9PSAwKQotCQkJcmV0dXJuIDE7Ci0JCXMrKzsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHN0cmluZ2xpYl9jb250YWluc19vYmooc3RyX29iaiwgc3ViX29iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfaXRlbShQeVN0cmluZ09iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpKQogeworCWNoYXIgcGNoYXI7CiAJUHlPYmplY3QgKnY7Ci0JY2hhciAqcGNoYXI7CiAJaWYgKGkgPCAwIHx8IGkgPj0gYS0+b2Jfc2l6ZSkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXBjaGFyID0gYS0+b2Jfc3ZhbCArIGk7Ci0JdiA9IChQeU9iamVjdCAqKWNoYXJhY3RlcnNbKnBjaGFyICYgVUNIQVJfTUFYXTsKKwlwY2hhciA9IGEtPm9iX3N2YWxbaV07CisJdiA9IChQeU9iamVjdCAqKWNoYXJhY3RlcnNbcGNoYXIgJiBVQ0hBUl9NQVhdOwogCWlmICh2ID09IE5VTEwpCi0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwY2hhciwgMSk7CisJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmcGNoYXIsIDEpOwogCWVsc2UgewogI2lmZGVmIENPVU5UX0FMTE9DUwogCQlvbmVfc3RyaW5ncysrOwpAQCAtMTE1MSw5ICsxMTU3LDggQEAKIGludAogX1B5U3RyaW5nX0VxKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKQogewotCVB5U3RyaW5nT2JqZWN0ICphLCAqYjsKLQlhID0gKFB5U3RyaW5nT2JqZWN0KilvMTsKLQliID0gKFB5U3RyaW5nT2JqZWN0KilvMjsKKwlQeVN0cmluZ09iamVjdCAqYSA9IChQeVN0cmluZ09iamVjdCopIG8xOworCVB5U3RyaW5nT2JqZWN0ICpiID0gKFB5U3RyaW5nT2JqZWN0KikgbzI7CiAgICAgICAgIHJldHVybiBhLT5vYl9zaXplID09IGItPm9iX3NpemUKICAgICAgICAgICAmJiAqYS0+b2Jfc3ZhbCA9PSAqYi0+b2Jfc3ZhbAogICAgICAgICAgICYmIG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBhLT5vYl9zaXplKSA9PSAwOwpAQCAtMTMwOCw2ICsxMzEzLDI3IEBACiAKICNkZWZpbmUgU1RSSVBOQU1FKGkpIChzdHJpcGZvcm1hdFtpXSszKQogCisKKy8qIERvbid0IGNhbGwgaWYgbGVuZ3RoIDwgMiAqLworI2RlZmluZSBQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBvZmZzZXQsIHBhdHRlcm4sIGxlbmd0aCkJXAorICAodGFyZ2V0W29mZnNldF0gPT0gcGF0dGVyblswXSAmJgkJCQlcCisgICB0YXJnZXRbb2Zmc2V0K2xlbmd0aC0xXSA9PSBwYXR0ZXJuW2xlbmd0aC0xXSAmJgkJXAorICAgIW1lbWNtcCh0YXJnZXQrb2Zmc2V0KzEsIHBhdHRlcm4rMSwgbGVuZ3RoLTIpICkKKworCisvKiBPdmVyYWxsb2NhdGUgdGhlIGluaXRpYWwgbGlzdCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiByZWFsbG9jcyBmb3Igc21hbGwKKyAgIHNwbGl0IHNpemVzLiAgRWcsICJBIEEgQSBBIEEgQSBBIEEgQSBBIi5zcGxpdCgpICgxMCBlbGVtZW50cykgaGFzIHRocmVlCisgICByZXNpemVzLCB0byBzaXplcyA0LCA4LCB0aGVuIDE2LiAgTW9zdCBvYnNlcnZlZCBzdHJpbmcgc3BsaXRzIGFyZSBmb3IgaHVtYW4KKyAgIHRleHQgKHJvdWdobHkgMTEgd29yZHMgcGVyIGxpbmUpIGFuZCBmaWVsZCBkZWxpbWl0ZWQgZGF0YSAodXN1YWxseSAxLTEwCisgICBmaWVsZHMpLiAgRm9yIGxhcmdlIHN0cmluZ3MgdGhlIHNwbGl0IGFsZ29yaXRobXMgYXJlIGJhbmR3aWR0aCBsaW1pdGVkCisgICBzbyBpbmNyZWFzaW5nIHRoZSBwcmVhbGxvY2F0aW9uIGxpa2VseSB3aWxsIG5vdCBpbXByb3ZlIHRoaW5ncy4qLworCisjZGVmaW5lIE1BWF9QUkVBTExPQyAxMgorCisvKiA1IHNwbGl0cyBnaXZlcyA2IGVsZW1lbnRzICovCisjZGVmaW5lIFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpIFwKKwkobWF4c3BsaXQgPj0gTUFYX1BSRUFMTE9DID8gTUFYX1BSRUFMTE9DIDogbWF4c3BsaXQrMSkKKwogI2RlZmluZSBTUExJVF9BUFBFTkQoZGF0YSwgbGVmdCwgcmlnaHQpCQkJCVwKIAlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoZGF0YSkgKyAobGVmdCksCVwKIAkJCQkJIChyaWdodCkgLSAobGVmdCkpOwlcCkBAIC0xMzIwLDc0ICsxMzQ2LDkwIEBACiAJZWxzZQkJCQkJCQlcCiAJCVB5X0RFQ1JFRihzdHIpOwogCi0jZGVmaW5lIFNQTElUX0lOU0VSVChkYXRhLCBsZWZ0LCByaWdodCkJCQkgCVwKKyNkZWZpbmUgU1BMSVRfQUREKGRhdGEsIGxlZnQsIHJpZ2h0KSB7CQkJCVwKIAlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoZGF0YSkgKyAobGVmdCksCVwKIAkJCQkJIChyaWdodCkgLSAobGVmdCkpOwlcCiAJaWYgKHN0ciA9PSBOVUxMKQkJCQkJXAogCQlnb3RvIG9uRXJyb3I7CQkJCQlcCi0JaWYgKFB5TGlzdF9JbnNlcnQobGlzdCwgMCwgc3RyKSkgewkJCVwKLQkJUHlfREVDUkVGKHN0cik7CQkJCQlcCi0JCWdvdG8gb25FcnJvcjsJCQkJCVwKKwlpZiAoY291bnQgPCBNQVhfUFJFQUxMT0MpIHsJCQkJXAorCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgY291bnQsIHN0cik7CQlcCisJfSBlbHNlIHsJCQkJCQlcCisJCWlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIHN0cikpIHsJCQlcCisJCQlQeV9ERUNSRUYoc3RyKTsJCQkJXAorCQkJZ290byBvbkVycm9yOwkJCQlcCisJCX0JCQkJCQlcCisJCWVsc2UJCQkJCQlcCisJCQlQeV9ERUNSRUYoc3RyKTsJCQkJXAogCX0JCQkJCQkJXAotCWVsc2UJCQkJCQkJXAotCQlQeV9ERUNSRUYoc3RyKTsKKwljb3VudCsrOyB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCisvKiBBbHdheXMgZm9yY2UgdGhlIGxpc3QgdG8gdGhlIGV4cGVjdGVkIHNpemUuICovCisjZGVmaW5lIEZJWF9QUkVBTExPQ19TSVpFKGxpc3QpICgoUHlMaXN0T2JqZWN0ICopbGlzdCktPm9iX3NpemUgPSBjb3VudDsJCisKKyNkZWZpbmUgU0tJUF9TUEFDRShzLCBpLCBsZW4pICAgIHsgd2hpbGUgKGk8bGVuICYmICBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgaSsrOyB9CisjZGVmaW5lIFNLSVBfTk9OU1BBQ0UocywgaSwgbGVuKSB7IHdoaWxlIChpPGxlbiAmJiAhaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIGkrKzsgfQorI2RlZmluZSBSU0tJUF9TUEFDRShzLCBpKSAgICAgICAgeyB3aGlsZSAoaT49MCAgJiYgIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSBpLS07IH0KKyNkZWZpbmUgUlNLSVBfTk9OU1BBQ0UocywgaSkgICAgIHsgd2hpbGUgKGk+PTAgICYmICFpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgaS0tOyB9CisKK1B5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogc3BsaXRfd2hpdGVzcGFjZShjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbiwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKLQlQeV9zc2l6ZV90IGksIGo7CisJUHlfc3NpemVfdCBpLCBqLCBjb3VudD0wOwogCVB5T2JqZWN0ICpzdHI7Ci0JUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KDApOworCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7CiAKIAlpZiAobGlzdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyApIHsKLQkJd2hpbGUgKGkgPCBsZW4gJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpCi0JCQlpKys7Ci0JCWogPSBpOwotCQl3aGlsZSAoaSA8IGxlbiAmJiAhaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpCi0JCQlpKys7Ci0JCWlmIChqIDwgaSkgewotCQkJaWYgKG1heHNwbGl0LS0gPD0gMCkKLQkJCQlicmVhazsKLQkJCVNQTElUX0FQUEVORChzLCBqLCBpKTsKLQkJCXdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKQotCQkJCWkrKzsKLQkJCWogPSBpOwotCQl9CisJaSA9IGogPSAwOworCisJd2hpbGUgKG1heHNwbGl0LS0gPiAwKSB7CisJCVNLSVBfU1BBQ0UocywgaSwgbGVuKTsKKwkJaWYgKGk9PWxlbikgYnJlYWs7CisJCWogPSBpOyBpKys7CisJCVNLSVBfTk9OU1BBQ0UocywgaSwgbGVuKTsKKwkJU1BMSVRfQUREKHMsIGosIGkpOwogCX0KLQlpZiAoaiA8IGxlbikgewotCQlTUExJVF9BUFBFTkQocywgaiwgbGVuKTsKKworCWlmIChpIDwgbGVuKSB7CisJCS8qIE9ubHkgb2NjdXJzIHdoZW4gbWF4c3BsaXQgd2FzIHJlYWNoZWQgKi8KKwkJLyogU2tpcCBhbnkgcmVtYWluaW5nIHdoaXRlc3BhY2UgYW5kIGNvcHkgdG8gZW5kIG9mIHN0cmluZyAqLworCQlTS0lQX1NQQUNFKHMsIGksIGxlbik7CisJCWlmIChpICE9IGxlbikKKwkJCVNQTElUX0FERChzLCBpLCBsZW4pOwogCX0KKwlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKIAlyZXR1cm4gbGlzdDsKICAgb25FcnJvcjoKIAlQeV9ERUNSRUYobGlzdCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCitQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIHNwbGl0X2NoYXIoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIGNoYXIgY2gsIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOworCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKIAlQeU9iamVjdCAqc3RyOwotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldygwKTsKKwlQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhjb3VudCkpOwogCiAJaWYgKGxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKSB7Ci0JCWlmIChzW2ldID09IGNoKSB7Ci0JCQlpZiAobWF4Y291bnQtLSA8PSAwKQorCWkgPSBqID0gMDsKKwl3aGlsZSAoKGogPCBsZW4pICYmIChtYXhjb3VudC0tID4gMCkpIHsKKwkJZm9yKDsgajxsZW47IGorKykgeworCQkJLyogSSBmb3VuZCB0aGF0IHVzaW5nIG1lbWNociBtYWtlcyBubyBkaWZmZXJlbmNlICovCisJCQlpZiAoc1tqXSA9PSBjaCkgeworCQkJCVNQTElUX0FERChzLCBpLCBqKTsKKwkJCQlpID0gaiA9IGogKyAxOwogCQkJCWJyZWFrOwotCQkJU1BMSVRfQVBQRU5EKHMsIGosIGkpOwotCQkJaSA9IGogPSBpICsgMTsKLQkJfSBlbHNlCi0JCQlpKys7CisJCQl9CisJCX0KIAl9Ci0JaWYgKGogPD0gbGVuKSB7Ci0JCVNQTElUX0FQUEVORChzLCBqLCBsZW4pOworCWlmIChpIDw9IGxlbikgeworCQlTUExJVF9BREQocywgaSwgbGVuKTsKIAl9CisJRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7CiAJcmV0dXJuIGxpc3Q7CiAKICAgb25FcnJvcjoKQEAgLTE0MDcsMTAgKzE0NDksMTIgQEAKIHN0cmluZ19zcGxpdChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbiwgaSwgajsKLQlpbnQgZXJyOwotCVB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMTsKKwlQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTEsIGNvdW50PTA7CiAJY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW0sICpzdWJvYmogPSBQeV9Ob25lOworCVB5T2JqZWN0ICpsaXN0LCAqc3RyLCAqc3Vib2JqID0gUHlfTm9uZTsKKyNpZmRlZiBVU0VfRkFTVAorCVB5X3NzaXplX3QgcG9zOworI2VuZGlmCiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCiAJCXJldHVybiBOVUxMOwpAQCAtMTQzNiw5OCArMTQ4MCwxNjYgQEAKIAllbHNlIGlmIChuID09IDEpCiAJCXJldHVybiBzcGxpdF9jaGFyKHMsIGxlbiwgc3ViWzBdLCBtYXhzcGxpdCk7CiAKLQlsaXN0ID0gUHlMaXN0X05ldygwKTsKKwlsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7CiAJaWYgKGxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKKyNpZmRlZiBVU0VfRkFTVAogCWkgPSBqID0gMDsKLQl3aGlsZSAoaStuIDw9IGxlbikgewotCQlpZiAoc1tpXSA9PSBzdWJbMF0gJiYgbWVtY21wKHMraSwgc3ViLCBuKSA9PSAwKSB7Ci0JCQlpZiAobWF4c3BsaXQtLSA8PSAwKQotCQkJCWJyZWFrOwotCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgaS1qKTsKLQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gZmFpbDsKLQkJCWkgPSBqID0gaSArIG47Ci0JCX0KLQkJZWxzZQotCQkJaSsrOworCXdoaWxlIChtYXhzcGxpdC0tID4gMCkgeworCQlwb3MgPSBmYXN0c2VhcmNoKHMraSwgbGVuLWksIHN1YiwgbiwgRkFTVF9TRUFSQ0gpOworCQlpZiAocG9zIDwgMCkKKwkJCWJyZWFrOworCQlqID0gaStwb3M7CisJCVNQTElUX0FERChzLCBpLCBqKTsKKwkJaSA9IGogKyBuOworCQkKIAl9Ci0JaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgbGVuLWopOwotCWlmIChpdGVtID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOwotCVB5X0RFQ1JFRihpdGVtKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBmYWlsOwotCisjZWxzZQorCWkgPSBqID0gMDsKKwl3aGlsZSAoKGorbiA8PSBsZW4pICYmIChtYXhzcGxpdC0tID4gMCkpIHsKKwkJZm9yICg7IGorbiA8PSBsZW47IGorKykgeworCQkJaWYgKFB5X1NUUklOR19NQVRDSChzLCBqLCBzdWIsIG4pKSB7CisJCQkJU1BMSVRfQUREKHMsIGksIGopOworCQkJCWkgPSBqID0gaiArIG47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlTUExJVF9BREQocywgaSwgbGVuKTsKKwlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKIAlyZXR1cm4gbGlzdDsKIAotIGZhaWw6Cisgb25FcnJvcjoKIAlQeV9ERUNSRUYobGlzdCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKK1B5RG9jX1NUUlZBUihwYXJ0aXRpb25fX2RvY19fLAorIlMucGFydGl0aW9uKHNlcCkgLT4gKGhlYWQsIHNlcCwgdGFpbClcblwKK1xuXAorU2VhcmNoZXMgZm9yIHRoZSBzZXBhcmF0b3Igc2VwIGluIFMsIGFuZCByZXR1cm5zIHRoZSBwYXJ0IGJlZm9yZSBpdCxcblwKK3RoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuXAorZm91bmQsIHJldHVybnMgUyBhbmQgdHdvIGVtcHR5IHN0cmluZ3MuIik7CisKIHN0YXRpYyBQeU9iamVjdCAqCitzdHJpbmdfcGFydGl0aW9uKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwX29iaikKK3sKKwljb25zdCBjaGFyICpzZXA7CisJUHlfc3NpemVfdCBzZXBfbGVuOworCisJaWYgKFB5U3RyaW5nX0NoZWNrKHNlcF9vYmopKSB7CisJCXNlcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZXBfb2JqKTsKKwkJc2VwX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcF9vYmopOworCX0KKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcF9vYmopKQorCQlyZXR1cm4gUHlVbmljb2RlX1BhcnRpdGlvbigoUHlPYmplY3QgKikgc2VsZiwgc2VwX29iaik7CisjZW5kaWYKKwllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc2VwX29iaiwgJnNlcCwgJnNlcF9sZW4pKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBzdHJpbmdsaWJfcGFydGl0aW9uKAorCQkoUHlPYmplY3QqKSBzZWxmLAorCQlQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorCQlzZXBfb2JqLCBzZXAsIHNlcF9sZW4KKwkJKTsKK30KKworUHlEb2NfU1RSVkFSKHJwYXJ0aXRpb25fX2RvY19fLAorIlMucnBhcnRpdGlvbihzZXApIC0+IChoZWFkLCBzZXAsIHRhaWwpXG5cCitcblwKK1NlYXJjaGVzIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiBTLCBzdGFydGluZyBhdCB0aGUgZW5kIG9mIFMsIGFuZCByZXR1cm5zXG5cCit0aGUgcGFydCBiZWZvcmUgaXQsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuICBJZiB0aGVcblwKK3NlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgUyBhbmQgdHdvIGVtcHR5IHN0cmluZ3MuIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCitzdHJpbmdfcnBhcnRpdGlvbihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcF9vYmopCit7CisJY29uc3QgY2hhciAqc2VwOworCVB5X3NzaXplX3Qgc2VwX2xlbjsKKworCWlmIChQeVN0cmluZ19DaGVjayhzZXBfb2JqKSkgeworCQlzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VwX29iaik7CisJCXNlcF9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZXBfb2JqKTsKKwl9CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXBfb2JqKSkKKwkJcmV0dXJuIFB5VW5pY29kZV9QYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOworI2VuZGlmCisJZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHNlcF9vYmosICZzZXAsICZzZXBfbGVuKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gc3RyaW5nbGliX3JwYXJ0aXRpb24oCisJCShQeU9iamVjdCopIHNlbGYsCisJCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisJCXNlcF9vYmosIHNlcCwgc2VwX2xlbgorCQkpOworfQorCitQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIHJzcGxpdF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotCVB5X3NzaXplX3QgaSwgajsKKwlQeV9zc2l6ZV90IGksIGosIGNvdW50PTA7CiAJUHlPYmplY3QgKnN0cjsKLQlQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisJUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpKTsKIAogCWlmIChsaXN0ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JZm9yIChpID0gaiA9IGxlbiAtIDE7IGkgPj0gMDsgKSB7Ci0JCXdoaWxlIChpID49IDAgJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpCi0JCQlpLS07Ci0JCWogPSBpOwotCQl3aGlsZSAoaSA+PSAwICYmICFpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkKLQkJCWktLTsKLQkJaWYgKGogPiBpKSB7Ci0JCQlpZiAobWF4c3BsaXQtLSA8PSAwKQotCQkJCWJyZWFrOwotCQkJU1BMSVRfSU5TRVJUKHMsIGkgKyAxLCBqICsgMSk7Ci0JCQl3aGlsZSAoaSA+PSAwICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKQotCQkJCWktLTsKLQkJCWogPSBpOwotCQl9CisJaSA9IGogPSBsZW4tMTsKKwkKKwl3aGlsZSAobWF4c3BsaXQtLSA+IDApIHsKKwkJUlNLSVBfU1BBQ0UocywgaSk7CisJCWlmIChpPDApIGJyZWFrOworCQlqID0gaTsgaS0tOworCQlSU0tJUF9OT05TUEFDRShzLCBpKTsKKwkJU1BMSVRfQUREKHMsIGkgKyAxLCBqICsgMSk7CiAJfQotCWlmIChqID49IDApIHsKLQkJU1BMSVRfSU5TRVJUKHMsIDAsIGogKyAxKTsKKwlpZiAoaSA+PSAwKSB7CisJCS8qIE9ubHkgb2NjdXJzIHdoZW4gbWF4c3BsaXQgd2FzIHJlYWNoZWQgKi8KKwkJLyogU2tpcCBhbnkgcmVtYWluaW5nIHdoaXRlc3BhY2UgYW5kIGNvcHkgdG8gYmVnaW5uaW5nIG9mIHN0cmluZyAqLworCQlSU0tJUF9TUEFDRShzLCBpKTsKKwkJaWYgKGkgPj0gMCkKKwkJCVNQTElUX0FERChzLCAwLCBpICsgMSk7CisKIAl9CisJRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7CisJaWYgKFB5TGlzdF9SZXZlcnNlKGxpc3QpIDwgMCkKKwkJZ290byBvbkVycm9yOwogCXJldHVybiBsaXN0OwogICBvbkVycm9yOgogCVB5X0RFQ1JFRihsaXN0KTsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKK1B5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogcnNwbGl0X2NoYXIoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4sIGNoYXIgY2gsIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOworCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKIAlQeU9iamVjdCAqc3RyOwotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldygwKTsKKwlQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhjb3VudCkpOwogCiAJaWYgKGxpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSBqID0gbGVuIC0gMTsgaSA+PSAwOyApIHsKLQkJaWYgKHNbaV0gPT0gY2gpIHsKLQkJCWlmIChtYXhjb3VudC0tIDw9IDApCisJaSA9IGogPSBsZW4gLSAxOworCXdoaWxlICgoaSA+PSAwKSAmJiAobWF4Y291bnQtLSA+IDApKSB7CisJCWZvciAoOyBpID49IDA7IGktLSkgeworCQkJaWYgKHNbaV0gPT0gY2gpIHsKKwkJCQlTUExJVF9BREQocywgaSArIDEsIGogKyAxKTsKKwkJCQlqID0gaSA9IGkgLSAxOwogCQkJCWJyZWFrOwotCQkJU1BMSVRfSU5TRVJUKHMsIGkgKyAxLCBqICsgMSk7Ci0JCQlqID0gaSA9IGkgLSAxOwotCQl9IGVsc2UKLQkJCWktLTsKKwkJCX0KKwkJfQogCX0KIAlpZiAoaiA+PSAtMSkgewotCQlTUExJVF9JTlNFUlQocywgMCwgaiArIDEpOworCQlTUExJVF9BREQocywgMCwgaiArIDEpOwogCX0KKwlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKKwlpZiAoUHlMaXN0X1JldmVyc2UobGlzdCkgPCAwKQorCQlnb3RvIG9uRXJyb3I7CiAJcmV0dXJuIGxpc3Q7CiAKICBvbkVycm9yOgpAQCAtMTU0OCwxMCArMTY2MCw5IEBACiBzdHJpbmdfcnNwbGl0KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuLCBpLCBqOwotCWludCBlcnI7Ci0JUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOworCVB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMSwgY291bnQ9MDsKIAljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnN1Ym9iaiA9IFB5X05vbmU7CisJUHlPYmplY3QgKmxpc3QsICpzdHIsICpzdWJvYmogPSBQeV9Ob25lOwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8T246cnNwbGl0IiwgJnN1Ym9iaiwgJm1heHNwbGl0KSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNTc3LDQwICsxNjg4LDMwIEBACiAJZWxzZSBpZiAobiA9PSAxKQogCQlyZXR1cm4gcnNwbGl0X2NoYXIocywgbGVuLCBzdWJbMF0sIG1heHNwbGl0KTsKIAotCWxpc3QgPSBQeUxpc3RfTmV3KDApOworCWxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpKTsKIAlpZiAobGlzdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCWogPSBsZW47CiAJaSA9IGogLSBuOwotCXdoaWxlIChpID49IDApIHsKLQkJaWYgKHNbaV0gPT0gc3ViWzBdICYmIG1lbWNtcChzK2ksIHN1YiwgbikgPT0gMCkgewotCQkJaWYgKG1heHNwbGl0LS0gPD0gMCkKLQkJCQlicmVhazsKLQkJCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2krbiwgai1pLW4pOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQllcnIgPSBQeUxpc3RfSW5zZXJ0KGxpc3QsIDAsIGl0ZW0pOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJaWYgKGVyciA8IDApCi0JCQkJZ290byBmYWlsOwotCQkJaiA9IGk7Ci0JCQlpIC09IG47Ci0JCX0KLQkJZWxzZQotCQkJaS0tOwotCX0KLQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgaik7Ci0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCWVyciA9IFB5TGlzdF9JbnNlcnQobGlzdCwgMCwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGZhaWw7CiAKKwl3aGlsZSAoIChpID49IDApICYmIChtYXhzcGxpdC0tID4gMCkgKSB7CisJCWZvciAoOyBpPj0wOyBpLS0pIHsKKwkJCWlmIChQeV9TVFJJTkdfTUFUQ0gocywgaSwgc3ViLCBuKSkgeworCQkJCVNQTElUX0FERChzLCBpICsgbiwgaik7CisJCQkJaiA9IGk7CisJCQkJaSAtPSBuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCVNQTElUX0FERChzLCAwLCBqKTsKKwlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKKwlpZiAoUHlMaXN0X1JldmVyc2UobGlzdCkgPCAwKQorCQlnb3RvIG9uRXJyb3I7CiAJcmV0dXJuIGxpc3Q7CiAKLSBmYWlsOgorb25FcnJvcjoKIAlQeV9ERUNSRUYobGlzdCk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xNzI3LDcgKzE4MjgsNyBAQAogCXJldHVybiBzdHJpbmdfam9pbigoUHlTdHJpbmdPYmplY3QgKilzZXAsIHgpOwogfQogCi1zdGF0aWMgdm9pZAorUHlfTE9DQUxfSU5MSU5FKHZvaWQpCiBzdHJpbmdfYWRqdXN0X2luZGljZXMoUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCwgUHlfc3NpemVfdCBsZW4pCiB7CiAJaWYgKCplbmQgPiBsZW4pCkBAIC0xNzQyLDUwICsxODQzLDM4IEBACiAJCSpzdGFydCA9IDA7CiB9CiAKLXN0YXRpYyBQeV9zc2l6ZV90CitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKIHN0cmluZ19maW5kX2ludGVybmFsKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKIHsKLQljb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JUHlfc3NpemVfdCBuLCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOwogCVB5T2JqZWN0ICpzdWJvYmo7CisJY29uc3QgY2hhciAqc3ViOworCVB5X3NzaXplX3Qgc3ViX2xlbjsKKwlQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKIAogCS8qIFhYWCBzc2l6ZV90IGkgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpmaW5kL3JmaW5kL2luZGV4L3JpbmRleCIsCi0JCSZzdWJvYmosIF9QeUV2YWxfU2xpY2VJbmRleCwgJmksIF9QeUV2YWxfU2xpY2VJbmRleCwgJmxhc3QpKQorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmZpbmQvcmZpbmQvaW5kZXgvcmluZGV4IiwgJnN1Ym9iaiwKKwkJX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCiAJCXJldHVybiAtMjsKIAlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewogCQlzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKLQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7CisJCXN1Yl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOwogCX0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCi0JCXJldHVybiBQeVVuaWNvZGVfRmluZCgoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIGksIGxhc3QsIGRpcik7CisJCXJldHVybiBQeVVuaWNvZGVfRmluZCgKKwkJCShQeU9iamVjdCAqKXNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgZGlyKTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZuKSkKKwllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmc3ViX2xlbikpCiAJCXJldHVybiAtMjsKIAotCXN0cmluZ19hZGp1c3RfaW5kaWNlcygmaSwgJmxhc3QsIGxlbik7Ci0KLQlpZiAoZGlyID4gMCkgewotCQlpZiAobiA9PSAwICYmIGkgPD0gbGFzdCkKLQkJCXJldHVybiAobG9uZylpOwotCQlsYXN0IC09IG47Ci0JCWZvciAoOyBpIDw9IGxhc3Q7ICsraSkKLQkJCWlmIChzW2ldID09IHN1YlswXSAmJiBtZW1jbXAoJnNbaV0sIHN1YiwgbikgPT0gMCkKLQkJCQlyZXR1cm4gKGxvbmcpaTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgajsKLQotICAgICAgICAJaWYgKG4gPT0gMCAmJiBpIDw9IGxhc3QpCi0JCQlyZXR1cm4gbGFzdDsKLQkJZm9yIChqID0gbGFzdC1uOyBqID49IGk7IC0taikKLQkJCWlmIChzW2pdID09IHN1YlswXSAmJiBtZW1jbXAoJnNbal0sIHN1YiwgbikgPT0gMCkKLQkJCQlyZXR1cm4gajsKLQl9Ci0KLQlyZXR1cm4gLTE7CisJaWYgKGRpciA+IDApCisJCXJldHVybiBzdHJpbmdsaWJfZmluZF9zbGljZSgKKwkJCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisJCQlzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOworCWVsc2UKKwkJcmV0dXJuIHN0cmluZ2xpYl9yZmluZF9zbGljZSgKKwkJCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisJCQlzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwogfQogCiAKQEAgLTE4NjcsNyArMTk1Niw3IEBACiB9CiAKIAotc3RhdGljIFB5T2JqZWN0ICoKK1B5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogZG9feHN0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBpbnQgc3RyaXB0eXBlLCBQeU9iamVjdCAqc2Vwb2JqKQogewogCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CkBAIC0xOTAwLDcgKzE5ODksNyBAQAogfQogCiAKLXN0YXRpYyBQeU9iamVjdCAqCitQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIGRvX3N0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBpbnQgc3RyaXB0eXBlKQogewogCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CkBAIC0xOTMwLDcgKzIwMTksNyBAQAogfQogCiAKLXN0YXRpYyBQeU9iamVjdCAqCitQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIGRvX2FyZ3N0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBpbnQgc3RyaXB0eXBlLCBQeU9iamVjdCAqYXJncykKIHsKIAlQeU9iamVjdCAqc2VwID0gTlVMTDsKQEAgLTIwMjQsNTcgKzIxMTMsNjggQEAKIFxuXAogUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIFMgY29udmVydGVkIHRvIGxvd2VyY2FzZS4iKTsKIAorLyogX3RvbG93ZXIgYW5kIF90b3VwcGVyIGFyZSBkZWZpbmVkIGJ5IFNVU3YyLCBidXQgdGhleSdyZSBub3QgSVNPIEMgKi8KKyNpZm5kZWYgX3RvbG93ZXIKKyNkZWZpbmUgX3RvbG93ZXIgdG9sb3dlcgorI2VuZGlmCisKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfbG93ZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OworCWNoYXIgKnM7CiAJUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAJUHlPYmplY3QgKm5ld29iajsKIAogCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkKKwlpZiAoIW5ld29iaikKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOworCisJcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOworCisJbWVtY3B5KHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CisKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc3VwcGVyKGMpKSB7Ci0JCQkqc19uZXcgPSB0b2xvd2VyKGMpOwotCQl9IGVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7CisJCWludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7CisJCWlmIChpc3VwcGVyKGMpKQorCQkJc1tpXSA9IF90b2xvd2VyKGMpOwogCX0KKwogCXJldHVybiBuZXdvYmo7CiB9CiAKLQogUHlEb2NfU1RSVkFSKHVwcGVyX19kb2NfXywKICJTLnVwcGVyKCkgLT4gc3RyaW5nXG5cCiBcblwKIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBTIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuIik7CiAKKyNpZm5kZWYgX3RvdXBwZXIKKyNkZWZpbmUgX3RvdXBwZXIgdG91cHBlcgorI2VuZGlmCisKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfdXBwZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OworCWNoYXIgKnM7CiAJUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAJUHlPYmplY3QgKm5ld29iajsKIAogCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkKKwlpZiAoIW5ld29iaikKIAkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOworCisJcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOworCisJbWVtY3B5KHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CisKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKSB7Ci0JCQkqc19uZXcgPSB0b3VwcGVyKGMpOwotCQl9IGVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7CisJCWludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7CisJCWlmIChpc2xvd2VyKGMpKQorCQkJc1tpXSA9IF90b3VwcGVyKGMpOwogCX0KKwogCXJldHVybiBuZXdvYmo7CiB9CiAKLQogUHlEb2NfU1RSVkFSKHRpdGxlX19kb2NfXywKICJTLnRpdGxlKCkgLT4gc3RyaW5nXG5cCiBcblwKQEAgLTIxNTAsNjIgKzIyNTAsNDQgQEAKIFB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCiAiUy5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKIFxuXAotUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nIHN1YiBpbiBzdHJpbmdcblwKLVNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZVxuXAotaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uIik7CitSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nIHN1YiBpblxuXAorc3RyaW5nIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZFxuXAorYXMgaW4gc2xpY2Ugbm90YXRpb24uIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfY291bnQoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzdWIsICp0OwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIG47Ci0JUHlfc3NpemVfdCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOwotCVB5X3NzaXplX3QgbSwgcjsKLQlQeU9iamVjdCAqc3Vib2JqOworCVB5T2JqZWN0ICpzdWJfb2JqOworCWNvbnN0IGNoYXIgKnN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKKwlQeV9zc2l6ZV90IHN1Yl9sZW47CisJUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6Y291bnQiLCAmc3Vib2JqLAotCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZpLCBfUHlFdmFsX1NsaWNlSW5kZXgsICZsYXN0KSkKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpjb3VudCIsICZzdWJfb2JqLAorCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewotCQlzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKLQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7CisJaWYgKFB5U3RyaW5nX0NoZWNrKHN1Yl9vYmopKSB7CisJCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJfb2JqKTsKKwkJc3ViX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Yl9vYmopOwogCX0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpIHsKKwllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3ViX29iaikpIHsKIAkJUHlfc3NpemVfdCBjb3VudDsKLQkJY291bnQgPSBQeVVuaWNvZGVfQ291bnQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBpLCBsYXN0KTsKKwkJY291bnQgPSBQeVVuaWNvZGVfQ291bnQoKFB5T2JqZWN0ICopc2VsZiwgc3ViX29iaiwgc3RhcnQsIGVuZCk7CiAJCWlmIChjb3VudCA9PSAtMSkKIAkJCXJldHVybiBOVUxMOwogCQllbHNlCi0JCSAgICAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBjb3VudCk7CisJCSAgICAJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKIAl9CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmbikpCisJZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Yl9vYmosICZzdWIsICZzdWJfbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlzdHJpbmdfYWRqdXN0X2luZGljZXMoJmksICZsYXN0LCBsZW4pOworCXN0cmluZ19hZGp1c3RfaW5kaWNlcygmc3RhcnQsICZlbmQsIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKIAotCW0gPSBsYXN0ICsgMSAtIG47Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KG0taSk7Ci0KLQlyID0gMDsKLQl3aGlsZSAoaSA8IG0pIHsKLQkJaWYgKCFtZW1jbXAocytpLCBzdWIsIG4pKSB7Ci0JCQlyKys7Ci0JCQlpICs9IG47Ci0JCX0gZWxzZSB7Ci0JCQlpKys7Ci0JCX0KLQkJaWYgKGkgPj0gbSkKLQkJCWJyZWFrOwotCQl0ID0gKGNvbnN0IGNoYXIgKiltZW1jaHIocytpLCBzdWJbMF0sIG0taSk7Ci0JCWlmICh0ID09IE5VTEwpCi0JCQlicmVhazsKLQkJaSA9IHQgLSBzOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qocik7CisJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KAorCQlzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4pCisJCSk7CiB9CiAKIFB5RG9jX1NUUlZBUihzd2FwY2FzZV9fZG9jX18sCkBAIC0yMzU5LDE1NiArMjQ0MSw2MTYgQEAKIH0KIAogCi0vKiBXaGF0IGZvbGxvd3MgaXMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHJlcGxhY2UoKS4gIFBlcnJ5IFN0b2xsLiAqLworI2RlZmluZSBGT1JXQVJEIDEKKyNkZWZpbmUgUkVWRVJTRSAtMQogCi0vKgotICBteW1lbWZpbmQKKy8qIGZpbmQgYW5kIGNvdW50IGNoYXJhY3RlcnMgYW5kIHN1YnN0cmluZ3MgKi8KIAotICBzdHJzdHIgcmVwbGFjZW1lbnQgZm9yIGFyYml0cmFyeSBibG9ja3Mgb2YgbWVtb3J5LgorI2RlZmluZSBmaW5kY2hhcih0YXJnZXQsIHRhcmdldF9sZW4sIGMpCQkJCVwKKyAgKChjaGFyICopbWVtY2hyKChjb25zdCB2b2lkICopKHRhcmdldCksIGMsIHRhcmdldF9sZW4pKQogCi0gIExvY2F0ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2UgaW4gdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IE1FTSBvZiB0aGUKLSAgY29udGVudHMgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgUEFULiAgUmV0dXJucyB0aGUgaW5kZXggaW50byBNRU0gaWYKLSAgZm91bmQsIG9yIC0xIGlmIG5vdCBmb3VuZC4gIElmIGxlbiBvZiBQQVQgaXMgZ3JlYXRlciB0aGFuIGxlbmd0aCBvZgotICBNRU0sIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xLgotKi8KLXN0YXRpYyBQeV9zc2l6ZV90Ci1teW1lbWZpbmQoY29uc3QgY2hhciAqbWVtLCBQeV9zc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqcGF0LCBQeV9zc2l6ZV90IHBhdF9sZW4pCisvKiBTdHJpbmcgb3BzIG11c3QgcmV0dXJuIGEgc3RyaW5nLiAgKi8KKy8qIElmIHRoZSBvYmplY3QgaXMgc3ViY2xhc3Mgb2Ygc3RyaW5nLCBjcmVhdGUgYSBjb3B5ICovCitQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQorcmV0dXJuX3NlbGYoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpaTsKKwlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworCQlQeV9JTkNSRUYoc2VsZik7CisJCXJldHVybiBzZWxmOworCX0KKwlyZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisJCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwKKwkJUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikpOworfQogCi0JLyogcGF0dGVybiBjYW4gbm90IG9jY3VyIGluIHRoZSBsYXN0IHBhdF9sZW4tMSBjaGFycyAqLwotCWxlbiAtPSBwYXRfbGVuOworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitjb3VudGNoYXIoY2hhciAqdGFyZ2V0LCBpbnQgdGFyZ2V0X2xlbiwgY2hhciBjLCBQeV9zc2l6ZV90IG1heGNvdW50KQoreworCVB5X3NzaXplX3QgY291bnQ9MDsKKwljaGFyICpzdGFydD10YXJnZXQ7CisJY2hhciAqZW5kPXRhcmdldCt0YXJnZXRfbGVuOwogCi0JZm9yIChpaSA9IDA7IGlpIDw9IGxlbjsgaWkrKykgewotCQlpZiAobWVtW2lpXSA9PSBwYXRbMF0gJiYgbWVtY21wKCZtZW1baWldLCBwYXQsIHBhdF9sZW4pID09IDApIHsKLQkJCXJldHVybiBpaTsKLQkJfQorCXdoaWxlICggKHN0YXJ0PWZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGMpKSAhPSBOVUxMICkgeworCQljb3VudCsrOworCQlpZiAoY291bnQgPj0gbWF4Y291bnQpCisJCQlicmVhazsKKwkJc3RhcnQgKz0gMTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitQeV9MT0NBTChQeV9zc2l6ZV90KQorZmluZHN0cmluZyhjaGFyICp0YXJnZXQsIFB5X3NzaXplX3QgdGFyZ2V0X2xlbiwKKwkgICBjaGFyICpwYXR0ZXJuLCBQeV9zc2l6ZV90IHBhdHRlcm5fbGVuLAorCSAgIFB5X3NzaXplX3Qgc3RhcnQsCisJICAgUHlfc3NpemVfdCBlbmQsCisJICAgaW50IGRpcmVjdGlvbikKK3sKKwlpZiAoc3RhcnQgPCAwKSB7CisJCXN0YXJ0ICs9IHRhcmdldF9sZW47CisJCWlmIChzdGFydCA8IDApCisJCQlzdGFydCA9IDA7CisJfQorCWlmIChlbmQgPiB0YXJnZXRfbGVuKSB7CisJCWVuZCA9IHRhcmdldF9sZW47CisJfSBlbHNlIGlmIChlbmQgPCAwKSB7CisJCWVuZCArPSB0YXJnZXRfbGVuOworCQlpZiAoZW5kIDwgMCkKKwkJCWVuZCA9IDA7CisJfQorCisJLyogemVyby1sZW5ndGggc3Vic3RyaW5ncyBhbHdheXMgbWF0Y2ggYXQgdGhlIGZpcnN0IGF0dGVtcHQgKi8KKwlpZiAocGF0dGVybl9sZW4gPT0gMCkKKwkJcmV0dXJuIChkaXJlY3Rpb24gPiAwKSA/IHN0YXJ0IDogZW5kOworCisJZW5kIC09IHBhdHRlcm5fbGVuOworCisJaWYgKGRpcmVjdGlvbiA8IDApIHsKKwkJZm9yICg7IGVuZCA+PSBzdGFydDsgZW5kLS0pCisJCQlpZiAoUHlfU1RSSU5HX01BVENIKHRhcmdldCwgZW5kLCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpCisJCQkJcmV0dXJuIGVuZDsKKwl9IGVsc2UgeworCQlmb3IgKDsgc3RhcnQgPD0gZW5kOyBzdGFydCsrKQorCQkJaWYgKFB5X1NUUklOR19NQVRDSCh0YXJnZXQsIHN0YXJ0LCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpCisJCQkJcmV0dXJuIHN0YXJ0OwogCX0KIAlyZXR1cm4gLTE7CiB9CiAKLS8qCi0gIG15bWVtY250Ci0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHRpbWVzIFBBVCBpcyBmb3VuZCBpbiBNRU0uCi0gICBtZWFuaW5nIG1lbT0xMTExIGFuZCBwYXQ9PTExIHJldHVybnMgMi4KLSAgICAgICAgICAgbWVtPTExMTExIGFuZCBwYXQ9PTExIGFsc28gcmV0dXJuIDIuCi0gKi8KLXN0YXRpYyBQeV9zc2l6ZV90Ci1teW1lbWNudChjb25zdCBjaGFyICptZW0sIFB5X3NzaXplX3QgbGVuLCBjb25zdCBjaGFyICpwYXQsIFB5X3NzaXplX3QgcGF0X2xlbikKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorY291bnRzdHJpbmcoY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sCisJICAgIGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCisJICAgIFB5X3NzaXplX3Qgc3RhcnQsCisJICAgIFB5X3NzaXplX3QgZW5kLAorCSAgICBpbnQgZGlyZWN0aW9uLCBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKLQlQeV9zc2l6ZV90IG5mb3VuZCA9IDA7CisJUHlfc3NpemVfdCBjb3VudD0wOwogCi0Jd2hpbGUgKGxlbiA+PSAwKSB7Ci0JCW9mZnNldCA9IG15bWVtZmluZChtZW0sIGxlbiwgcGF0LCBwYXRfbGVuKTsKKwlpZiAoc3RhcnQgPCAwKSB7CisJCXN0YXJ0ICs9IHRhcmdldF9sZW47CisJCWlmIChzdGFydCA8IDApCisJCQlzdGFydCA9IDA7CisJfQorCWlmIChlbmQgPiB0YXJnZXRfbGVuKSB7CisJCWVuZCA9IHRhcmdldF9sZW47CisJfSBlbHNlIGlmIChlbmQgPCAwKSB7CisJCWVuZCArPSB0YXJnZXRfbGVuOworCQlpZiAoZW5kIDwgMCkKKwkJCWVuZCA9IDA7CisJfQorCisJLyogemVyby1sZW5ndGggc3Vic3RyaW5ncyBtYXRjaCBldmVyeXdoZXJlICovCisJaWYgKHBhdHRlcm5fbGVuID09IDAgfHwgbWF4Y291bnQgPT0gMCkgeworCQlpZiAodGFyZ2V0X2xlbisxIDwgbWF4Y291bnQpCisJCQlyZXR1cm4gdGFyZ2V0X2xlbisxOworCQlyZXR1cm4gbWF4Y291bnQ7CisJfQorCisJZW5kIC09IHBhdHRlcm5fbGVuOworCWlmIChkaXJlY3Rpb24gPCAwKSB7CisJCWZvciAoOyAoZW5kID49IHN0YXJ0KTsgZW5kLS0pCisJCQlpZiAoUHlfU1RSSU5HX01BVENIKHRhcmdldCwgZW5kLCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpIHsKKwkJCQljb3VudCsrOworCQkJCWlmICgtLW1heGNvdW50IDw9IDApIGJyZWFrOworCQkJCWVuZCAtPSBwYXR0ZXJuX2xlbi0xOworCQkJfQorCX0gZWxzZSB7CisJCWZvciAoOyAoc3RhcnQgPD0gZW5kKTsgc3RhcnQrKykKKwkJCWlmIChQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBzdGFydCwgcGF0dGVybiwgcGF0dGVybl9sZW4pKSB7CisJCQkJY291bnQrKzsKKwkJCQlpZiAoLS1tYXhjb3VudCA8PSAwKQorCQkJCQlicmVhazsKKwkJCQlzdGFydCArPSBwYXR0ZXJuX2xlbi0xOworCQkJfQorCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKworLyogQWxnb3JpdGhtcyBmb3IgZGlmZmVyZW50IGNhc2VzIG9mIHN0cmluZyByZXBsYWNlbWVudCAqLworCisvKiBsZW4oc2VsZik+PTEsIGZyb209IiIsIGxlbih0byk+PTEsIG1heGNvdW50Pj0xICovCitQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQorcmVwbGFjZV9pbnRlcmxlYXZlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAorCQkgICBQeVN0cmluZ09iamVjdCAqdG8sCisJCSAgIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisJY2hhciAqc2VsZl9zLCAqdG9fcywgKnJlc3VsdF9zOworCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHRvX2xlbiwgcmVzdWx0X2xlbjsKKwlQeV9zc2l6ZV90IGNvdW50LCBpLCBwcm9kdWN0OworCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisKKwlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKKwkKKwkvKiAxIGF0IHRoZSBlbmQgcGx1cyAxIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlciAqLworCWNvdW50ID0gc2VsZl9sZW4rMTsKKwlpZiAobWF4Y291bnQgPCBjb3VudCkgCisJCWNvdW50ID0gbWF4Y291bnQ7CisJCisJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisJLyogICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsgKi8KKwlwcm9kdWN0ID0gY291bnQgKiB0b19sZW47CisJaWYgKHByb2R1Y3QgLyB0b19sZW4gIT0gY291bnQpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisJCQkJInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXN1bHRfbGVuID0gcHJvZHVjdCArIHNlbGZfbGVuOworCWlmIChyZXN1bHRfbGVuIDwgMCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKwkJCQkicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorICAKKwlpZiAoISAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisJICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgKQorCQlyZXR1cm4gTlVMTDsKKworCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKwl0b19zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRvKTsKKwl0b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0byk7CisJcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKworCS8qIFRPRE86IHNwZWNpYWwgY2FzZSBzaW5nbGUgY2hhcmFjdGVyLCB3aGljaCBkb2Vzbid0IG5lZWQgbWVtY3B5ICovCisKKwkvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KKwltZW1jcHkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisJcmVzdWx0X3MgKz0gdG9fbGVuOworCWNvdW50IC09IDE7CisgIAorCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKKwkJKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7CisJCW1lbWNweShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKwkJcmVzdWx0X3MgKz0gdG9fbGVuOworCX0KKworCS8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyAqLworCW1lbWNweShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbi1pKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFNwZWNpYWwgY2FzZSBmb3IgZGVsZXRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyICovCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgdG89IiIsIG1heGNvdW50Pj0xICovCitQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQorcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcihQeVN0cmluZ09iamVjdCAqc2VsZiwKKwkJCQljaGFyIGZyb21fYywgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKwljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKKwljaGFyICpzdGFydCwgKm5leHQsICplbmQ7CisJUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKwlQeV9zc2l6ZV90IGNvdW50OworCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisKKwlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKworCWNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOworCWlmIChjb3VudCA9PSAwKSB7CisJCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKwl9CisgIAorCXJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIGNvdW50OyAgLyogZnJvbV9sZW4gPT0gMSAqLworCWFzc2VydChyZXN1bHRfbGVuPj0wKTsKKworCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorCSAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKworCXN0YXJ0ID0gc2VsZl9zOworCWVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQluZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKKwkJaWYgKG5leHQgPT0gTlVMTCkKKwkJCWJyZWFrOworCQltZW1jcHkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKKwkJcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOworCQlzdGFydCA9IG5leHQrMTsKKwl9CisJbWVtY3B5KHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKKwkKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgdG89IiIsIG1heGNvdW50Pj0xICovCisKK1B5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCityZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5U3RyaW5nT2JqZWN0ICpmcm9tLAorCQkJIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKKwljaGFyICpzZWxmX3MsICpmcm9tX3MsICpyZXN1bHRfczsKKwljaGFyICpzdGFydCwgKm5leHQsICplbmQ7CisJUHlfc3NpemVfdCBzZWxmX2xlbiwgZnJvbV9sZW4sIHJlc3VsdF9sZW47CisJUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OworCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisKKwlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKwlmcm9tX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyb20pOworCWZyb21fcyA9IFB5U3RyaW5nX0FTX1NUUklORyhmcm9tKTsKKworCWNvdW50ID0gY291bnRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKKwkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAorCQkJICAgIDAsIHNlbGZfbGVuLCAxLAorCQkJICAgIG1heGNvdW50KTsKKworCWlmIChjb3VudCA9PSAwKSB7CisJCS8qIG5vIG1hdGNoZXMgKi8KKwkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworCX0KKworCXJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKKwlhc3NlcnQgKHJlc3VsdF9sZW4+PTApOworCQorCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQorCSAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMICkKKwkJcmV0dXJuIE5VTEw7CisJCisJcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKwkKKwlzdGFydCA9IHNlbGZfczsKKwllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJb2Zmc2V0ID0gZmluZHN0cmluZyhzdGFydCwgZW5kLXN0YXJ0LAorCQkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAorCQkJCSAgICAwLCBlbmQtc3RhcnQsIEZPUldBUkQpOwogCQlpZiAob2Zmc2V0ID09IC0xKQogCQkJYnJlYWs7Ci0JCW1lbSArPSBvZmZzZXQgKyBwYXRfbGVuOwotCQlsZW4gLT0gb2Zmc2V0ICsgcGF0X2xlbjsKLQkJbmZvdW5kKys7CisJCW5leHQgPSBzdGFydCArIG9mZnNldDsKKwkJCisJCW1lbWNweShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOworCQkKKwkJcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOworCQlzdGFydCA9IG5leHQrZnJvbV9sZW47CiAJfQotCXJldHVybiBuZm91bmQ7CisJbWVtY3B5KHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCi0vKgotICAgbXltZW1yZXBsYWNlCi0KLSAgIFJldHVybiBhIHN0cmluZyBpbiB3aGljaCBhbGwgb2NjdXJyZW5jZXMgb2YgUEFUIGluIG1lbW9yeSBTVFIgYXJlCi0gICByZXBsYWNlZCB3aXRoIFNVQi4KLQotICAgSWYgbGVuZ3RoIG9mIFBBVCBpcyBsZXNzIHRoYW4gbGVuZ3RoIG9mIFNUUiBvciB0aGVyZSBhcmUgbm8gb2NjdXJyZW5jZXMKLSAgIG9mIFBBVCBpbiBTVFIsIHRoZW4gdGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIG5ldwotICAgc3RyaW5nIGlzIGFsbG9jYXRlZCBoZXJlIGFuZCByZXR1cm5lZC4KLQotICAgb24gcmV0dXJuLCBvdXRfbGVuIGlzOgotICAgICAgIHRoZSBsZW5ndGggb2Ygb3V0cHV0IHN0cmluZywgb3IKLSAgICAgICAtMSBpZiB0aGUgaW5wdXQgc3RyaW5nIGlzIHJldHVybmVkLCBvcgotICAgICAgIHVuY2hhbmdlZCBpZiBhbiBlcnJvciBvY2N1cnMgKG5vIG1lbW9yeSkuCi0KLSAgIHJldHVybiB2YWx1ZSBpczoKLSAgICAgICB0aGUgbmV3IHN0cmluZyBhbGxvY2F0ZWQgbG9jYWxseSwgb3IKLSAgICAgICBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgotKi8KLXN0YXRpYyBjaGFyICoKLW15bWVtcmVwbGFjZShjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLAkJLyogaW5wdXQgc3RyaW5nICovCi0gICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0LCBQeV9zc2l6ZV90IHBhdF9sZW4sCS8qIHBhdHRlcm4gc3RyaW5nIHRvIGZpbmQgKi8KLSAgICAgICAgICAgICBjb25zdCBjaGFyICpzdWIsIFB5X3NzaXplX3Qgc3ViX2xlbiwJLyogc3Vic3RpdHV0aW9uIHN0cmluZyAqLwotICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQsCQkJCS8qIG51bWJlciBvZiByZXBsYWNlbWVudHMgKi8KLQkgICAgIFB5X3NzaXplX3QgKm91dF9sZW4pCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT09MSwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCityZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsCisJCQkJICBjaGFyIGZyb21fYywgY2hhciB0b19jLAorCQkJCSAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpvdXRfczsKLQljaGFyICpuZXdfczsKLQlQeV9zc2l6ZV90IG5mb3VuZCwgb2Zmc2V0LCBuZXdfbGVuOwotCi0JaWYgKGxlbiA9PSAwIHx8IChwYXRfbGVuID09IDAgJiYgc3ViX2xlbiA9PSAwKSB8fCBwYXRfbGVuID4gbGVuKQotCQlnb3RvIHJldHVybl9zYW1lOwotCi0JLyogZmluZCBsZW5ndGggb2Ygb3V0cHV0IHN0cmluZyAqLwotCW5mb3VuZCA9IChwYXRfbGVuID4gMCkgPyBteW1lbWNudChzdHIsIGxlbiwgcGF0LCBwYXRfbGVuKSA6IGxlbiArIDE7Ci0JaWYgKGNvdW50IDwgMCkKLQkJY291bnQgPSBQWV9TU0laRV9UX01BWDsKLQllbHNlIGlmIChuZm91bmQgPiBjb3VudCkKLQkJbmZvdW5kID0gY291bnQ7Ci0JaWYgKG5mb3VuZCA9PSAwKQotCQlnb3RvIHJldHVybl9zYW1lOwotCi0JbmV3X2xlbiA9IGxlbiArIG5mb3VuZCooc3ViX2xlbiAtIHBhdF9sZW4pOwotCWlmIChuZXdfbGVuID09IDApIHsKLQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcgZm9yIHRoZSBjYWxsZXIgdG8gZnJlZSgpLiAqLwotCQlvdXRfcyA9IChjaGFyICopUHlNZW1fTUFMTE9DKDEpOwotCQlpZiAob3V0X3MgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlvdXRfc1swXSA9ICdcMCc7CisJY2hhciAqc2VsZl9zLCAqcmVzdWx0X3MsICpzdGFydCwgKmVuZCwgKm5leHQ7CisJUHlfc3NpemVfdCBzZWxmX2xlbjsKKwlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworCQorCS8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLworCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKwlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworCQorCW5leHQgPSBmaW5kY2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MpOworCQorCWlmIChuZXh0ID09IE5VTEwpIHsKKwkJLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KKwkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogCX0KLQllbHNlIHsKLQkJYXNzZXJ0KG5ld19sZW4gPiAwKTsKLQkJbmV3X3MgPSAoY2hhciAqKVB5TWVtX01BTExPQyhuZXdfbGVuKTsKLQkJaWYgKG5ld19zID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJb3V0X3MgPSBuZXdfczsKLQotCQlpZiAocGF0X2xlbiA+IDApIHsKLQkJCWZvciAoOyBuZm91bmQgPiAwOyAtLW5mb3VuZCkgewotCQkJCS8qIGZpbmQgaW5kZXggb2YgbmV4dCBpbnN0YW5jZSBvZiBwYXR0ZXJuICovCi0JCQkJb2Zmc2V0ID0gbXltZW1maW5kKHN0ciwgbGVuLCBwYXQsIHBhdF9sZW4pOwotCQkJCWlmIChvZmZzZXQgPT0gLTEpCi0JCQkJCWJyZWFrOwotCi0JCQkJLyogY29weSBub24gbWF0Y2hpbmcgcGFydCBvZiBpbnB1dCBzdHJpbmcgKi8KLQkJCQltZW1jcHkobmV3X3MsIHN0ciwgb2Zmc2V0KTsKLQkJCQlzdHIgKz0gb2Zmc2V0ICsgcGF0X2xlbjsKLQkJCQlsZW4gLT0gb2Zmc2V0ICsgcGF0X2xlbjsKLQotCQkJCS8qIGNvcHkgc3Vic3RpdHV0ZSBpbnRvIHRoZSBvdXRwdXQgc3RyaW5nICovCi0JCQkJbmV3X3MgKz0gb2Zmc2V0OwotCQkJCW1lbWNweShuZXdfcywgc3ViLCBzdWJfbGVuKTsKLQkJCQluZXdfcyArPSBzdWJfbGVuOwotCQkJfQotCQkJLyogY29weSBhbnkgcmVtYWluaW5nIHZhbHVlcyBpbnRvIG91dHB1dCBzdHJpbmcgKi8KLQkJCWlmIChsZW4gPiAwKQotCQkJCW1lbWNweShuZXdfcywgc3RyLCBsZW4pOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yICg7Oysrc3RyLCAtLWxlbikgewotCQkJCW1lbWNweShuZXdfcywgc3ViLCBzdWJfbGVuKTsKLQkJCQluZXdfcyArPSBzdWJfbGVuOwotCQkJCWlmICgtLW5mb3VuZCA8PSAwKSB7Ci0JCQkJCW1lbWNweShuZXdfcywgc3RyLCBsZW4pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJKm5ld19zKysgPSAqc3RyOwotCQkJfQotCQl9CisJCisJLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLworCXJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworCW1lbWNweShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CisJCisJLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KKwlzdGFydCA9ICByZXN1bHRfcyArIChuZXh0LXNlbGZfcyk7CisJKnN0YXJ0ID0gdG9fYzsKKwlzdGFydCsrOworCWVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CisJCisJd2hpbGUgKC0tbWF4Y291bnQgPiAwKSB7CisJCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOworCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJYnJlYWs7CisJCSpuZXh0ID0gdG9fYzsKKwkJc3RhcnQgPSBuZXh0KzE7CiAJfQotCSpvdXRfbGVuID0gbmV3X2xlbjsKLQlyZXR1cm4gb3V0X3M7Ci0KLSAgcmV0dXJuX3NhbWU6Ci0JKm91dF9sZW4gPSAtMTsKLQlyZXR1cm4gKGNoYXIgKilzdHI7IC8qIGNhc3QgYXdheSBjb25zdCAqLworCQorCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKK3JlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAorCQkJICAgUHlTdHJpbmdPYmplY3QgKmZyb20sCisJCQkgICBQeVN0cmluZ09iamVjdCAqdG8sCisJCQkgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworCWNoYXIgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQ7CisJY2hhciAqc2VsZl9zLCAqZnJvbV9zLCAqdG9fczsKKwlQeV9zc2l6ZV90IHNlbGZfbGVuLCBmcm9tX2xlbiwgb2Zmc2V0OworCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisJCisJLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCisJCisJc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisJCisJZnJvbV9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pOworCWZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7CisJdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7CisJCisJb2Zmc2V0ID0gZmluZHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAorCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCisJCQkgICAgMCwgc2VsZl9sZW4sIEZPUldBUkQpOworCQorCWlmIChvZmZzZXQgPT0gLTEpIHsKKwkJLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KKwkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworCX0KKwkKKwkvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCisJcmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisJbWVtY3B5KHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKKworCQorCS8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCisJc3RhcnQgPSAgcmVzdWx0X3MgKyBvZmZzZXQ7CisJbWVtY3B5KHN0YXJ0LCB0b19zLCBmcm9tX2xlbik7CisJc3RhcnQgKz0gZnJvbV9sZW47CisJZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKKwkKKwl3aGlsZSAoIC0tbWF4Y291bnQgPiAwKSB7CisJCW9mZnNldCA9IGZpbmRzdHJpbmcoc3RhcnQsIGVuZC1zdGFydCwKKwkJCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKKwkJCQkgICAgMCwgZW5kLXN0YXJ0LCBGT1JXQVJEKTsKKwkJaWYgKG9mZnNldD09LTEpCisJCQlicmVhazsKKwkJbWVtY3B5KHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOworCQlzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKK3JlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihQeVN0cmluZ09iamVjdCAqc2VsZiwKKwkJCSBjaGFyIGZyb21fYywKKwkJCSBQeVN0cmluZ09iamVjdCAqdG8sCisJCQkgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKwljaGFyICpzZWxmX3MsICp0b19zLCAqcmVzdWx0X3M7CisJY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOworCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHRvX2xlbiwgcmVzdWx0X2xlbjsKKwlQeV9zc2l6ZV90IGNvdW50LCBwcm9kdWN0OworCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisJCisJc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisJCisJY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7CisJCisJaWYgKGNvdW50ID09IDApIHsKKwkJLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLworCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisJfQorCQorCXRvX3MgPSBQeVN0cmluZ19BU19TVFJJTkcodG8pOworCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKKwkKKwkvKiB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBuZXcsIGhlbmNlIHRoZSAiLTEiICovCisJLyogICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tMSkgICovCisJcHJvZHVjdCA9IGNvdW50ICogKHRvX2xlbi0xKTsKKwlpZiAocHJvZHVjdCAvICh0b19sZW4tMSkgIT0gY291bnQpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgcHJvZHVjdDsKKwlpZiAocmVzdWx0X2xlbiA8IDApIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisJICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisJCisJc3RhcnQgPSBzZWxmX3M7CisJZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOworCQlpZiAobmV4dCA9PSBOVUxMKSAKKwkJCWJyZWFrOworCQkKKwkJaWYgKG5leHQgPT0gc3RhcnQpIHsKKwkJCS8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLworCQkJbWVtY3B5KHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworCQkJcmVzdWx0X3MgKz0gdG9fbGVuOworCQkJc3RhcnQgKz0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLworCQkJbWVtY3B5KHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CisJCQlyZXN1bHRfcyArPSAobmV4dC1zdGFydCk7CisJCQltZW1jcHkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisJCQlyZXN1bHRfcyArPSB0b19sZW47CisJCQlzdGFydCA9IG5leHQrMTsKKwkJfQorCX0KKwkvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KKwltZW1jcHkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworCQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKK3JlcGxhY2Vfc3Vic3RyaW5nKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAorCQkgIFB5U3RyaW5nT2JqZWN0ICpmcm9tLAorCQkgIFB5U3RyaW5nT2JqZWN0ICp0bywKKwkJICBQeV9zc2l6ZV90IG1heGNvdW50KSB7CisJY2hhciAqc2VsZl9zLCAqZnJvbV9zLCAqdG9fcywgKnJlc3VsdF9zOworCWNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKKwlQeV9zc2l6ZV90IHNlbGZfbGVuLCBmcm9tX2xlbiwgdG9fbGVuLCByZXN1bHRfbGVuOworCVB5X3NzaXplX3QgY291bnQsIG9mZnNldCwgcHJvZHVjdDsKKwlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworCQorCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKwlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworCWZyb21fcyA9IFB5U3RyaW5nX0FTX1NUUklORyhmcm9tKTsKKwlmcm9tX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyb20pOworCQorCWNvdW50ID0gY291bnRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKKwkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAorCQkJICAgIDAsIHNlbGZfbGVuLCBGT1JXQVJELCBtYXhjb3VudCk7CisJaWYgKGNvdW50ID09IDApIHsKKwkJLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLworCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisJfQorCQorCXRvX3MgPSBQeVN0cmluZ19BU19TVFJJTkcodG8pOworCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKKwkKKwkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKwkvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCisJcHJvZHVjdCA9IGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbik7CisJaWYgKHByb2R1Y3QgLyAodG9fbGVuLWZyb21fbGVuKSAhPSBjb3VudCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBwcm9kdWN0OworCWlmIChyZXN1bHRfbGVuIDwgMCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlpZiAoIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKKwkgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKwkKKwlzdGFydCA9IHNlbGZfczsKKwllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJb2Zmc2V0ID0gZmluZHN0cmluZyhzdGFydCwgZW5kLXN0YXJ0LAorCQkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAorCQkJCSAgICAwLCBlbmQtc3RhcnQsIEZPUldBUkQpOworCQlpZiAob2Zmc2V0ID09IC0xKQorCQkJYnJlYWs7CisJCW5leHQgPSBzdGFydCtvZmZzZXQ7CisJCWlmIChuZXh0ID09IHN0YXJ0KSB7CisJCQkvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KKwkJCW1lbWNweShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKwkJCXJlc3VsdF9zICs9IHRvX2xlbjsKKwkJCXN0YXJ0ICs9IGZyb21fbGVuOworCQl9IGVsc2UgeworCQkJLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCisJCQltZW1jcHkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKKwkJCXJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKKwkJCW1lbWNweShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKwkJCXJlc3VsdF9zICs9IHRvX2xlbjsKKwkJCXN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKKwkJfQorCX0KKwkvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KKwltZW1jcHkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworCQorCXJldHVybiByZXN1bHQ7Cit9CisKKworUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKK3JlcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsCisJUHlTdHJpbmdPYmplY3QgKmZyb20sCisJUHlTdHJpbmdPYmplY3QgKnRvLAorCVB5X3NzaXplX3QgbWF4Y291bnQpCit7CisJUHlfc3NpemVfdCBmcm9tX2xlbiwgdG9fbGVuOworCQorCWlmIChtYXhjb3VudCA8IDApIHsKKwkJbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKKwl9IGVsc2UgaWYgKG1heGNvdW50ID09IDAgfHwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkgeworCQkvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLworCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisJfQorCQorCWZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7CisJdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOworCQorCWlmIChtYXhjb3VudCA9PSAwIHx8CisJICAgIChmcm9tX2xlbiA9PSAwICYmIHRvX2xlbiA9PSAwKSkgeworCQkvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLworCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisJfQorCisJLyogSGFuZGxlIHplcm8tbGVuZ3RoIHNwZWNpYWwgY2FzZXMgKi8KKwkKKwlpZiAoZnJvbV9sZW4gPT0gMCkgeworCQkvKiBpbnNlcnQgdGhlICd0bycgc3RyaW5nIGV2ZXJ5d2hlcmUuICAgKi8KKwkJLyogICAgPj4+ICJQeXRob24iLnJlcGxhY2UoIiIsICIuIikgICAgICovCisJCS8qICAgICcuUC55LnQuaC5vLm4uJyAgICAgICAgICAgICAgICAgICAqLworCQlyZXR1cm4gcmVwbGFjZV9pbnRlcmxlYXZlKHNlbGYsIHRvLCBtYXhjb3VudCk7CisJfQorCisJLyogRXhjZXB0IGZvciAiIi5yZXBsYWNlKCIiLCAiQSIpID09ICJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KKwkvKiBwb2ludCBmb3IgYW4gZW1wdHkgc2VsZiBzdHJpbmcgdG8gZ2VuZXJhdGUgYSBub24tZW1wdHkgc3RyaW5nICovCisJLyogU3BlY2lhbCBjYXNlIHNvIHRoZSByZW1haW5pbmcgY29kZSBhbHdheXMgZ2V0cyBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KKwlpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkgeworCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisJfQorCisJaWYgKHRvX2xlbiA9PSAwKSB7CisJCS8qIGRlbGV0ZSBhbGwgb2NjdXJhbmNlcyBvZiAnZnJvbScgc3RyaW5nICovCisJCWlmIChmcm9tX2xlbiA9PSAxKSB7CisJCQlyZXR1cm4gcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKKwkJCQlzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSlbMF0sIG1heGNvdW50KTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoc2VsZiwgZnJvbSwgbWF4Y291bnQpOworCQl9CisJfQorCisJLyogSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVyZSBib3RoIHN0cmluZ3MgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKi8KKworCWlmIChmcm9tX2xlbiA9PSB0b19sZW4pIHsKKwkJaWYgKGZyb21fbGVuID09IDEpIHsKKwkJCXJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoCisJCQkJc2VsZiwKKwkJCQlQeVN0cmluZ19BU19TVFJJTkcoZnJvbSlbMF0sCisJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHRvKVswXSwKKwkJCQltYXhjb3VudCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoCisJCQkJc2VsZiwgZnJvbSwgdG8sIG1heGNvdW50KTsKKwkJfQorCX0KKworCS8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCisJaWYgKGZyb21fbGVuID09IDEpIHsKKwkJcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSlbMF0sCisJCQkJCQl0bywgbWF4Y291bnQpOworCX0gZWxzZSB7CisJCS8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KKwkJcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nKHNlbGYsIGZyb20sIHRvLCBtYXhjb3VudCk7CisJfQorfQogCiBQeURvY19TVFJWQVIocmVwbGFjZV9fZG9jX18sCiAiUy5yZXBsYWNlIChvbGQsIG5ld1ssIGNvdW50XSkgLT4gc3RyaW5nXG5cCkBAIC0yNTIwLDY2ICszMDYyLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JlcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNvbnN0IGNoYXIgKnN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YiwgKnJlcGw7Ci0JY2hhciAqbmV3X3M7Ci0JY29uc3QgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeV9zc2l6ZV90IHN1Yl9sZW4sIHJlcGxfbGVuLCBvdXRfbGVuOwogCVB5X3NzaXplX3QgY291bnQgPSAtMTsKLQlQeU9iamVjdCAqbmV3b2JqOwotCVB5T2JqZWN0ICpzdWJvYmosICpyZXBsb2JqOworCVB5T2JqZWN0ICpmcm9tLCAqdG87CisJY29uc3QgY2hhciAqdG1wX3M7CisJUHlfc3NpemVfdCB0bXBfbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOnJlcGxhY2UiLAotCQkJICAgICAgJnN1Ym9iaiwgJnJlcGxvYmosICZjb3VudCkpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOnJlcGxhY2UiLCAmZnJvbSwgJnRvLCAmY291bnQpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7Ci0JCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOwotCQlzdWJfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKKwlpZiAoUHlTdHJpbmdfQ2hlY2soZnJvbSkpIHsKKwkgIC8qIENhbiB0aGlzIGJlIG1hZGUgYSAnIWNoZWNrJyBhZnRlciB0aGUgVW5pY29kZSBjaGVjaz8gKi8KIAl9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJvYmopKQorCWlmIChQeVVuaWNvZGVfQ2hlY2soZnJvbSkpCiAJCXJldHVybiBQeVVuaWNvZGVfUmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAotCQkJCQkgc3Vib2JqLCByZXBsb2JqLCBjb3VudCk7CisJCQkJCSBmcm9tLCB0bywgY291bnQpOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Ym9iaiwgJnN1YiwgJnN1Yl9sZW4pKQorCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihmcm9tLCAmdG1wX3MsICZ0bXBfbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2socmVwbG9iaikpIHsKLQkJcmVwbCA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXBsb2JqKTsKLQkJcmVwbF9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShyZXBsb2JqKTsKKwlpZiAoUHlTdHJpbmdfQ2hlY2sodG8pKSB7CisJICAvKiBDYW4gdGhpcyBiZSBtYWRlIGEgJyFjaGVjaycgYWZ0ZXIgdGhlIFVuaWNvZGUgY2hlY2s/ICovCiAJfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socmVwbG9iaikpCisJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHRvKSkKIAkJcmV0dXJuIFB5VW5pY29kZV9SZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCSBzdWJvYmosIHJlcGxvYmosIGNvdW50KTsKKwkJCQkJIGZyb20sIHRvLCBjb3VudCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocmVwbG9iaiwgJnJlcGwsICZyZXBsX2xlbikpCisJZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHRvLCAmdG1wX3MsICZ0bXBfbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQluZXdfcyA9IG15bWVtcmVwbGFjZShzdHIsbGVuLHN1YixzdWJfbGVuLHJlcGwscmVwbF9sZW4sY291bnQsJm91dF9sZW4pOwotCWlmIChuZXdfcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAob3V0X2xlbiA9PSAtMSkgewotCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQkJLyogd2UncmUgcmV0dXJuaW5nIGFub3RoZXIgcmVmZXJlbmNlIHRvIHNlbGYgKi8KLQkJCW5ld29iaiA9IChQeU9iamVjdCopc2VsZjsKLQkJCVB5X0lOQ1JFRihuZXdvYmopOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyLCBsZW4pOwotCQkJaWYgKG5ld29iaiA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuZXdfcywgb3V0X2xlbik7Ci0JCVB5TWVtX0ZSRUUobmV3X3MpOwotCX0KLQlyZXR1cm4gbmV3b2JqOworCXJldHVybiAoUHlPYmplY3QgKilyZXBsYWNlKChQeVN0cmluZ09iamVjdCAqKSBzZWxmLAorCQkJCSAgIChQeVN0cmluZ09iamVjdCAqKSBmcm9tLAorCQkJCSAgIChQeVN0cmluZ09iamVjdCAqKSB0bywgY291bnQpOwogfQogCisvKiogRW5kIERBTEtFICoqLwogCiBQeURvY19TVFJWQVIoc3RhcnRzd2l0aF9fZG9jX18sCiAiUy5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKQEAgLTI4MjAsNyArMzMzOCw3IEBACiAgICAgcmV0dXJuIHU7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCitQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIHBhZChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBsZWZ0LCBQeV9zc2l6ZV90IHJpZ2h0LCBjaGFyIGZpbGwpCiB7CiAgICAgUHlPYmplY3QgKnU7CkBAIC0zMjM3LDYgKzM3NTUsMTQgQEAKICAgICBkYXRhID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogCisgICAgLyogVGhpcyBkb2VzIG5vdCB1c2UgdGhlIHByZWFsbG9jYXRlZCBsaXN0IGJlY2F1c2Ugc3BsaXRsaW5lcyBpcworICAgICAgIHVzdWFsbHkgcnVuIHdpdGggaHVuZHJlZHMgb2YgbmV3bGluZXMuICBUaGUgb3ZlcmhlYWQgb2YKKyAgICAgICBzd2l0Y2hpbmcgYmV0d2VlbiBQeUxpc3RfU0VUX0lURU0gYW5kIGFwcGVuZCBjYXVzZXMgYWJvdXQgYQorICAgICAgIDItMyUgc2xvd2Rvd24gZm9yIHRoYXQgY29tbW9uIGNhc2UuICBBIHNtYXJ0ZXIgaW1wbGVtZW50YXRpb24KKyAgICAgICBjb3VsZCBtb3ZlIHRoZSBpZiBjaGVjayBvdXQsIHNvIHRoZSBTRVRfSVRFTXMgYXJlIGRvbmUgZmlyc3QKKyAgICAgICBhbmQgdGhlIGFwcGVuZHMgb25seSBkb25lIHdoZW4gdGhlIHByZWFsbG9jIGJ1ZmZlciBpcyBmdWxsLgorICAgICAgIFRoYXQncyB0b28gbXVjaCB3b3JrIGZvciBsaXR0bGUgZ2Fpbi4qLworCiAgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICAgaWYgKCFsaXN0KQogICAgICAgICBnb3RvIG9uRXJyb3I7CkBAIC0zMjc0LDYgKzM4MDAsOSBAQAogfQogCiAjdW5kZWYgU1BMSVRfQVBQRU5ECisjdW5kZWYgU1BMSVRfQURECisjdW5kZWYgTUFYX1BSRUFMTE9DCisjdW5kZWYgUFJFQUxMT0NfU0laRQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2dldG5ld2FyZ3MoUHlTdHJpbmdPYmplY3QgKnYpCkBAIC0zMzAzLDYgKzM4MzIsNyBAQAogCXsiY291bnQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2NvdW50LCBNRVRIX1ZBUkFSR1MsIGNvdW50X19kb2NfX30sCiAJeyJlbmRzd2l0aCIsIChQeUNGdW5jdGlvbilzdHJpbmdfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywKIAkgZW5kc3dpdGhfX2RvY19ffSwKKwl7InBhcnRpdGlvbiIsIChQeUNGdW5jdGlvbilzdHJpbmdfcGFydGl0aW9uLCBNRVRIX08sIHBhcnRpdGlvbl9fZG9jX199LAogCXsiZmluZCIsIChQeUNGdW5jdGlvbilzdHJpbmdfZmluZCwgTUVUSF9WQVJBUkdTLCBmaW5kX19kb2NfX30sCiAJeyJpbmRleCIsIChQeUNGdW5jdGlvbilzdHJpbmdfaW5kZXgsIE1FVEhfVkFSQVJHUywgaW5kZXhfX2RvY19ffSwKIAl7ImxzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfbHN0cmlwLCBNRVRIX1ZBUkFSR1MsIGxzdHJpcF9fZG9jX199LApAQCAtMzMxMCw2ICszODQwLDggQEAKIAl7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yZmluZCwgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAogCXsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCiAJeyJyc3RyaXAiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JzdHJpcCwgTUVUSF9WQVJBUkdTLCByc3RyaXBfX2RvY19ffSwKKwl7InJwYXJ0aXRpb24iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JwYXJ0aXRpb24sIE1FVEhfTywKKwkgcnBhcnRpdGlvbl9fZG9jX199LAogCXsic3RhcnRzd2l0aCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RhcnRzd2l0aCwgTUVUSF9WQVJBUkdTLAogCSBzdGFydHN3aXRoX19kb2NfX30sCiAJeyJzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RyaXAsIE1FVEhfVkFSQVJHUywgc3RyaXBfX2RvY19ffSwKQEAgLTM1NjYsNyArNDA5OCw3IEBACiAKIC8qIEhlbHBlcnMgZm9yIGZvcm1hdHN0cmluZyAqLwogCi1zdGF0aWMgUHlPYmplY3QgKgorUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBnZXRuZXh0YXJnKFB5T2JqZWN0ICphcmdzLCBQeV9zc2l6ZV90IGFyZ2xlbiwgUHlfc3NpemVfdCAqcF9hcmdpZHgpCiB7CiAJUHlfc3NpemVfdCBhcmdpZHggPSAqcF9hcmdpZHg7CkBAIC0zNTk1LDcgKzQxMjcsNyBAQAogI2RlZmluZSBGX0FMVAkoMTw8MykKICNkZWZpbmUgRl9aRVJPCSgxPDw0KQogCi1zdGF0aWMgaW50CitQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0ZmxvYXQoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICBpbnQgcHJlYywgaW50IHR5cGUsIFB5T2JqZWN0ICp2KQogewpAQCAtMzc4Miw3ICs0MzE0LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50CitQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0aW50KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzLAogICAgICAgICAgIGludCBwcmVjLCBpbnQgdHlwZSwgUHlPYmplY3QgKnYpCiB7CkBAIC0zODU0LDcgKzQzODYsNyBAQAogCXJldHVybiAoaW50KXN0cmxlbihidWYpOwogfQogCi1zdGF0aWMgaW50CitQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0Y2hhcihjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIFB5T2JqZWN0ICp2KQogewogCS8qIHByZXN1bWUgdGhhdCB0aGUgYnVmZmVyIGlzIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBsb25nICovCmRpZmYgLS1naXQgYS9PYmplY3RzL3R5cGVvYmplY3QuYyBiL09iamVjdHMvdHlwZW9iamVjdC5jCmluZGV4IDM4ODIwZDQuLjAzZjJiMDcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdHlwZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHlwZW9iamVjdC5jCkBAIC00NjM2LDEwICs0NjM2LDEwIEBACiAJICAgICAodm9pZCAqKVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKSkKIAkJcmVzID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoc2VsZiwgbmFtZSk7CiAJZWxzZQotCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZ2V0YXR0cmlidXRlLCAiT08iLCBzZWxmLCBuYW1lKTsKKwkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnZXRhdHRyaWJ1dGUsIHNlbGYsIG5hbWUsIE5VTEwpOwogCWlmIChyZXMgPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgewogCQlQeUVycl9DbGVhcigpOwotCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZ2V0YXR0ciwgIk9PIiwgc2VsZiwgbmFtZSk7CisJCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2V0YXR0ciwgc2VsZiwgbmFtZSwgTlVMTCk7CiAJfQogCXJldHVybiByZXM7CiB9CkBAIC00Nzc2LDcgKzQ3NzYsNyBAQAogCQlvYmogPSBQeV9Ob25lOwogCWlmICh0eXBlID09IE5VTEwpCiAJCXR5cGUgPSBQeV9Ob25lOwotCXJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZ2V0LCAiT09PIiwgc2VsZiwgb2JqLCB0eXBlKTsKKwlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnZXQsIHNlbGYsIG9iaiwgdHlwZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTU3MTcsOCArNTcxNyw4IEBACiAJaWYgKHN1LT5vYl90eXBlICE9ICZQeVN1cGVyX1R5cGUpCiAJCS8qIElmIHN1IGlzIGFuIGluc3RhbmNlIG9mIGEgKHN0cmljdCkgc3ViY2xhc3Mgb2Ygc3VwZXIsCiAJCSAgIGNhbGwgaXRzIHR5cGUgKi8KLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKilzdS0+b2JfdHlwZSwKLQkJCQkJICAgICAiT08iLCBzdS0+dHlwZSwgb2JqKTsKKwkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0ICopc3UtPm9iX3R5cGUsCisJCQkJCSAgICAgICAgICAgIHN1LT50eXBlLCBvYmosIE5VTEwpOwogCWVsc2UgewogCQkvKiBJbmxpbmUgdGhlIGNvbW1vbiBjYXNlICovCiAJCVB5VHlwZU9iamVjdCAqb2JqX3R5cGUgPSBzdXBlcmNoZWNrKHN1LT50eXBlLCBvYmopOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy91bmljb2RlY3R5cGUuYyBiL09iamVjdHMvdW5pY29kZWN0eXBlLmMKaW5kZXggYjQzMjM5OS4uNzNkZWYwOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy91bmljb2RlY3R5cGUuYworKysgYi9PYmplY3RzL3VuaWNvZGVjdHlwZS5jCkBAIC0xNDAsMjAgKzE0MCw0OCBAQAogZG91YmxlIF9QeVVuaWNvZGVfVG9OdW1lcmljKFB5X1VOSUNPREUgY2gpCiB7CiAgICAgc3dpdGNoIChjaCkgeworICAgIGNhc2UgMHgwRjMzOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgLTEgLyAyOworICAgIGNhc2UgMHgxN0YwOgogICAgIGNhc2UgMHgzMDA3OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDE4QToKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSAwOwogICAgIGNhc2UgMHgwOUY0OgorICAgIGNhc2UgMHgxN0YxOgogICAgIGNhc2UgMHgyMTVGOgogICAgIGNhc2UgMHgyMTYwOgogICAgIGNhc2UgMHgyMTcwOgogICAgIGNhc2UgMHgzMDIxOgorICAgIGNhc2UgMHgzMTkyOgorICAgIGNhc2UgMHgzMjIwOgogICAgIGNhc2UgMHgzMjgwOgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEwNzoKKyAgICBjYXNlIDB4MTAxNDI6CisgICAgY2FzZSAweDEwMTU4OgorICAgIGNhc2UgMHgxMDE1OToKKyAgICBjYXNlIDB4MTAxNUE6CisgICAgY2FzZSAweDEwMzIwOgorICAgIGNhc2UgMHgxMDNEMToKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSAxOwogICAgIGNhc2UgMHgwMEJEOgorICAgIGNhc2UgMHgwRjJBOgorICAgIGNhc2UgMHgyQ0ZEOgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDE0MToKKyAgICBjYXNlIDB4MTAxNzU6CisgICAgY2FzZSAweDEwMTc2OgorI2VuZGlmCiAJcmV0dXJuIChkb3VibGUpIDEgLyAyOwogICAgIGNhc2UgMHgyMTUzOgogCXJldHVybiAoZG91YmxlKSAxIC8gMzsKICAgICBjYXNlIDB4MDBCQzoKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxNDA6CisjZW5kaWYKIAlyZXR1cm4gKGRvdWJsZSkgMSAvIDQ7CiAgICAgY2FzZSAweDIxNTU6CiAJcmV0dXJuIChkb3VibGUpIDEgLyA1OwpAQCAtMTY4LDkyICsxOTYsMjAxIEBACiAgICAgY2FzZSAweDI0Njk6CiAgICAgY2FzZSAweDI0N0Q6CiAgICAgY2FzZSAweDI0OTE6CisgICAgY2FzZSAweDI0RkU6CiAgICAgY2FzZSAweDI3N0Y6CiAgICAgY2FzZSAweDI3ODk6CiAgICAgY2FzZSAweDI3OTM6CiAgICAgY2FzZSAweDMwMzg6CisgICAgY2FzZSAweDMyMjk6CiAgICAgY2FzZSAweDMyODk6CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTEwOgorICAgIGNhc2UgMHgxMDE0OToKKyAgICBjYXNlIDB4MTAxNTA6CisgICAgY2FzZSAweDEwMTU3OgorICAgIGNhc2UgMHgxMDE2MDoKKyAgICBjYXNlIDB4MTAxNjE6CisgICAgY2FzZSAweDEwMTYyOgorICAgIGNhc2UgMHgxMDE2MzoKKyAgICBjYXNlIDB4MTAxNjQ6CisgICAgY2FzZSAweDEwMzIyOgorICAgIGNhc2UgMHgxMDNEMzoKKyAgICBjYXNlIDB4MTBBNDQ6CisjZW5kaWYKIAlyZXR1cm4gKGRvdWJsZSkgMTA7CiAgICAgY2FzZSAweDBCRjE6CiAgICAgY2FzZSAweDEzN0I6CiAgICAgY2FzZSAweDIxNkQ6CiAgICAgY2FzZSAweDIxN0Q6CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTE5OgorICAgIGNhc2UgMHgxMDE0QjoKKyAgICBjYXNlIDB4MTAxNTI6CisgICAgY2FzZSAweDEwMTZBOgorICAgIGNhc2UgMHgxMDNENToKKyAgICBjYXNlIDB4MTBBNDY6CisjZW5kaWYKIAlyZXR1cm4gKGRvdWJsZSkgMTAwOwogICAgIGNhc2UgMHgwQkYyOgogICAgIGNhc2UgMHgyMTZGOgogICAgIGNhc2UgMHgyMTdGOgogICAgIGNhc2UgMHgyMTgwOgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEyMjoKKyAgICBjYXNlIDB4MTAxNEQ6CisgICAgY2FzZSAweDEwMTU0OgorICAgIGNhc2UgMHgxMDE3MToKKyAgICBjYXNlIDB4MTBBNDc6CisjZW5kaWYKIAlyZXR1cm4gKGRvdWJsZSkgMTAwMDsKICAgICBjYXNlIDB4MTM3QzoKICAgICBjYXNlIDB4MjE4MjoKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMkI6CisgICAgY2FzZSAweDEwMTU1OgorI2VuZGlmCiAJcmV0dXJuIChkb3VibGUpIDEwMDAwOwogICAgIGNhc2UgMHgyMTZBOgogICAgIGNhc2UgMHgyMTdBOgogICAgIGNhc2UgMHgyNDZBOgogICAgIGNhc2UgMHgyNDdFOgogICAgIGNhc2UgMHgyNDkyOgorICAgIGNhc2UgMHgyNEVCOgogCXJldHVybiAoZG91YmxlKSAxMTsKKyAgICBjYXNlIDB4MEYyRjoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDExIC8gMjsKICAgICBjYXNlIDB4MjE2QjoKICAgICBjYXNlIDB4MjE3QjoKICAgICBjYXNlIDB4MjQ2QjoKICAgICBjYXNlIDB4MjQ3RjoKICAgICBjYXNlIDB4MjQ5MzoKKyAgICBjYXNlIDB4MjRFQzoKIAlyZXR1cm4gKGRvdWJsZSkgMTI7CiAgICAgY2FzZSAweDI0NkM6CiAgICAgY2FzZSAweDI0ODA6CiAgICAgY2FzZSAweDI0OTQ6CisgICAgY2FzZSAweDI0RUQ6CiAJcmV0dXJuIChkb3VibGUpIDEzOworICAgIGNhc2UgMHgwRjMwOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMTMgLyAyOwogICAgIGNhc2UgMHgyNDZEOgogICAgIGNhc2UgMHgyNDgxOgogICAgIGNhc2UgMHgyNDk1OgorICAgIGNhc2UgMHgyNEVFOgogCXJldHVybiAoZG91YmxlKSAxNDsKICAgICBjYXNlIDB4MjQ2RToKICAgICBjYXNlIDB4MjQ4MjoKICAgICBjYXNlIDB4MjQ5NjoKKyAgICBjYXNlIDB4MjRFRjoKIAlyZXR1cm4gKGRvdWJsZSkgMTU7CisgICAgY2FzZSAweDBGMzE6CisgICAgICAgIHJldHVybiAoZG91YmxlKSAxNSAvIDI7CiAgICAgY2FzZSAweDA5Rjk6CiAgICAgY2FzZSAweDI0NkY6CiAgICAgY2FzZSAweDI0ODM6CiAgICAgY2FzZSAweDI0OTc6CisgICAgY2FzZSAweDI0RjA6CiAJcmV0dXJuIChkb3VibGUpIDE2OwogICAgIGNhc2UgMHgxNkVFOgogICAgIGNhc2UgMHgyNDcwOgogICAgIGNhc2UgMHgyNDg0OgogICAgIGNhc2UgMHgyNDk4OgorICAgIGNhc2UgMHgyNEYxOgogCXJldHVybiAoZG91YmxlKSAxNzsKKyAgICBjYXNlIDB4MEYzMjoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDE3IC8gMjsKICAgICBjYXNlIDB4MTZFRjoKICAgICBjYXNlIDB4MjQ3MToKICAgICBjYXNlIDB4MjQ4NToKICAgICBjYXNlIDB4MjQ5OToKKyAgICBjYXNlIDB4MjRGMjoKIAlyZXR1cm4gKGRvdWJsZSkgMTg7CiAgICAgY2FzZSAweDE2RjA6CiAgICAgY2FzZSAweDI0NzI6CiAgICAgY2FzZSAweDI0ODY6CiAgICAgY2FzZSAweDI0OUE6CisgICAgY2FzZSAweDI0RjM6CiAJcmV0dXJuIChkb3VibGUpIDE5OwogICAgIGNhc2UgMHgwOUY1OgorICAgIGNhc2UgMHgxN0YyOgogICAgIGNhc2UgMHgyMTYxOgogICAgIGNhc2UgMHgyMTcxOgogICAgIGNhc2UgMHgzMDIyOgorICAgIGNhc2UgMHgzMTkzOgorICAgIGNhc2UgMHgzMjIxOgogICAgIGNhc2UgMHgzMjgxOgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEwODoKKyAgICBjYXNlIDB4MTAxNUI6CisgICAgY2FzZSAweDEwMTVDOgorICAgIGNhc2UgMHgxMDE1RDoKKyAgICBjYXNlIDB4MTAxNUU6CisgICAgY2FzZSAweDEwM0QyOgorI2VuZGlmCiAJcmV0dXJuIChkb3VibGUpIDI7CiAgICAgY2FzZSAweDIxNTQ6CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTc3OgorI2VuZGlmCiAJcmV0dXJuIChkb3VibGUpIDIgLyAzOwogICAgIGNhc2UgMHgyMTU2OgotCXJldHVybiAoZG91YmxlKSAyIC8gNTsKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDIgLyA1OwogICAgIGNhc2UgMHgxMzczOgogICAgIGNhc2UgMHgyNDczOgogICAgIGNhc2UgMHgyNDg3OgogICAgIGNhc2UgMHgyNDlCOgorICAgIGNhc2UgMHgyNEY0OgogICAgIGNhc2UgMHgzMDM5OgotCXJldHVybiAoZG91YmxlKSAyMDsKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMTE6CisgICAgY2FzZSAweDEwM0Q0OgorICAgIGNhc2UgMHgxMEE0NToKKyNlbmRpZgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjA7CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTFBOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjAwOworICAgIGNhc2UgMHgxMDEyMzoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDIwMDA7CisgICAgY2FzZSAweDEwMTJDOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjAwMDA7CisjZW5kaWYKKyAgICBjYXNlIDB4MzI1MToKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDIxOworICAgIGNhc2UgMHgzMjUyOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjI7CisgICAgY2FzZSAweDMyNTM6CisgICAgICAgIHJldHVybiAoZG91YmxlKSAyMzsKKyAgICBjYXNlIDB4MzI1NDoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDI0OworICAgIGNhc2UgMHgzMjU1OgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjU7CisgICAgY2FzZSAweDMyNTY6CisgICAgICAgIHJldHVybiAoZG91YmxlKSAyNjsKKyAgICBjYXNlIDB4MzI1NzoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDI3OworICAgIGNhc2UgMHgzMjU4OgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjg7CisgICAgY2FzZSAweDMyNTk6CisgICAgICAgIHJldHVybiAoZG91YmxlKSAyOTsKICAgICBjYXNlIDB4MDlGNjoKKyAgICBjYXNlIDB4MTdGMzoKICAgICBjYXNlIDB4MjE2MjoKICAgICBjYXNlIDB4MjE3MjoKICAgICBjYXNlIDB4MzAyMzoKKyAgICBjYXNlIDB4MzE5NDoKKyAgICBjYXNlIDB4MzIyMjoKICAgICBjYXNlIDB4MzI4MjoKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMDk6CisjZW5kaWYKIAlyZXR1cm4gKGRvdWJsZSkgMzsKKyAgICBjYXNlIDB4MEYyQjoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDMgLyAyOwogICAgIGNhc2UgMHgwMEJFOgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDE3ODoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSAzIC8gNDsKICAgICBjYXNlIDB4MjE1NzoKIAlyZXR1cm4gKGRvdWJsZSkgMyAvIDU7CkBAIC0yNjEsMjIgKzM5OCwxMDMgQEAKIAlyZXR1cm4gKGRvdWJsZSkgMyAvIDg7CiAgICAgY2FzZSAweDEzNzQ6CiAgICAgY2FzZSAweDMwM0E6CisgICAgY2FzZSAweDMyNUE6CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTEyOgorICAgIGNhc2UgMHgxMDE2NToKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSAzMDsKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMUI6CisgICAgY2FzZSAweDEwMTZCOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzAwOworICAgIGNhc2UgMHgxMDEyNDoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDMwMDA7CisgICAgY2FzZSAweDEwMTJEOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzAwMDA7CisjZW5kaWYKKyAgICBjYXNlIDB4MzI1QjoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDMxOworICAgIGNhc2UgMHgzMjVDOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzI7CisgICAgY2FzZSAweDMyNUQ6CisgICAgICAgIHJldHVybiAoZG91YmxlKSAzMzsKKyAgICBjYXNlIDB4MzI1RToKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDM0OworICAgIGNhc2UgMHgzMjVGOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzU7CisgICAgY2FzZSAweDMyQjE6CisgICAgICAgIHJldHVybiAoZG91YmxlKSAzNjsKKyAgICBjYXNlIDB4MzJCMjoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDM3OworICAgIGNhc2UgMHgzMkIzOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzg7CisgICAgY2FzZSAweDMyQjQ6CisgICAgICAgIHJldHVybiAoZG91YmxlKSAzOTsKICAgICBjYXNlIDB4MDlGNzoKKyAgICBjYXNlIDB4MTdGNDoKICAgICBjYXNlIDB4MjE2MzoKICAgICBjYXNlIDB4MjE3MzoKICAgICBjYXNlIDB4MzAyNDoKKyAgICBjYXNlIDB4MzE5NToKKyAgICBjYXNlIDB4MzIyMzoKICAgICBjYXNlIDB4MzI4MzoKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMEE6CisjZW5kaWYKIAlyZXR1cm4gKGRvdWJsZSkgNDsKICAgICBjYXNlIDB4MjE1ODoKIAlyZXR1cm4gKGRvdWJsZSkgNCAvIDU7CiAgICAgY2FzZSAweDEzNzU6Ci0JcmV0dXJuIChkb3VibGUpIDQwOworICAgIGNhc2UgMHgzMkI1OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDExMzoKKyNlbmRpZgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDA7CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTFDOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDAwOworICAgIGNhc2UgMHgxMDEyNToKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDQwMDA7CisgICAgY2FzZSAweDEwMTJFOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDAwMDA7CisjZW5kaWYKKyAgICBjYXNlIDB4MzJCNjoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDQxOworICAgIGNhc2UgMHgzMkI3OgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDI7CisgICAgY2FzZSAweDMyQjg6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA0MzsKKyAgICBjYXNlIDB4MzJCOToKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDQ0OworICAgIGNhc2UgMHgzMkJBOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDU7CisgICAgY2FzZSAweDMyQkI6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA0NjsKKyAgICBjYXNlIDB4MzJCQzoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDQ3OworICAgIGNhc2UgMHgzMkJEOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDg7CisgICAgY2FzZSAweDMyQkU6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA0OTsKKyAgICBjYXNlIDB4MTdGNToKICAgICBjYXNlIDB4MjE2NDoKICAgICBjYXNlIDB4MjE3NDoKICAgICBjYXNlIDB4MzAyNToKKyAgICBjYXNlIDB4MzIyNDoKICAgICBjYXNlIDB4MzI4NDoKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMEI6CisgICAgY2FzZSAweDEwMTQzOgorICAgIGNhc2UgMHgxMDE0ODoKKyAgICBjYXNlIDB4MTAxNEY6CisgICAgY2FzZSAweDEwMTVGOgorICAgIGNhc2UgMHgxMDE3MzoKKyAgICBjYXNlIDB4MTAzMjE6CisjZW5kaWYKIAlyZXR1cm4gKGRvdWJsZSkgNTsKKyAgICBjYXNlIDB4MEYyQzoKKyAgICAgICAgcmV0dXJuIChkb3VibGUpIDUgLyAyOwogICAgIGNhc2UgMHgyMTVBOgogCXJldHVybiAoZG91YmxlKSA1IC8gNjsKICAgICBjYXNlIDB4MjE1RDoKQEAgLTI4NCw0MiArNTAyLDE0NyBAQAogICAgIGNhc2UgMHgxMzc2OgogICAgIGNhc2UgMHgyMTZDOgogICAgIGNhc2UgMHgyMTdDOgorICAgIGNhc2UgMHgzMkJGOgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDExNDoKKyAgICBjYXNlIDB4MTAxNDQ6CisgICAgY2FzZSAweDEwMTRBOgorICAgIGNhc2UgMHgxMDE1MToKKyAgICBjYXNlIDB4MTAxNjY6CisgICAgY2FzZSAweDEwMTY3OgorICAgIGNhc2UgMHgxMDE2ODoKKyAgICBjYXNlIDB4MTAxNjk6CisgICAgY2FzZSAweDEwMTc0OgorICAgIGNhc2UgMHgxMDMyMzoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA1MDsKICAgICBjYXNlIDB4MjE2RToKICAgICBjYXNlIDB4MjE3RToKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMUQ6CisgICAgY2FzZSAweDEwMTQ1OgorICAgIGNhc2UgMHgxMDE0QzoKKyAgICBjYXNlIDB4MTAxNTM6CisgICAgY2FzZSAweDEwMTZDOgorICAgIGNhc2UgMHgxMDE2RDoKKyAgICBjYXNlIDB4MTAxNkU6CisgICAgY2FzZSAweDEwMTZGOgorICAgIGNhc2UgMHgxMDE3MDoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA1MDA7CiAgICAgY2FzZSAweDIxODE6CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTI2OgorICAgIGNhc2UgMHgxMDE0NjoKKyAgICBjYXNlIDB4MTAxNEU6CisgICAgY2FzZSAweDEwMTcyOgorI2VuZGlmCiAJcmV0dXJuIChkb3VibGUpIDUwMDA7CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTJGOgorICAgIGNhc2UgMHgxMDE0NzoKKyAgICBjYXNlIDB4MTAxNTY6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA1MDAwMDsKKyNlbmRpZgorICAgIGNhc2UgMHgxN0Y2OgogICAgIGNhc2UgMHgyMTY1OgogICAgIGNhc2UgMHgyMTc1OgogICAgIGNhc2UgMHgzMDI2OgorICAgIGNhc2UgMHgzMjI1OgogICAgIGNhc2UgMHgzMjg1OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEwQzoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA2OwogICAgIGNhc2UgMHgxMzc3OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDExNToKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA2MDsKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMUU6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA2MDA7CisgICAgY2FzZSAweDEwMTI3OgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNjAwMDsKKyAgICBjYXNlIDB4MTAxMzA6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA2MDAwMDsKKyNlbmRpZgorICAgIGNhc2UgMHgxN0Y3OgogICAgIGNhc2UgMHgyMTY2OgogICAgIGNhc2UgMHgyMTc2OgogICAgIGNhc2UgMHgzMDI3OgorICAgIGNhc2UgMHgzMjI2OgogICAgIGNhc2UgMHgzMjg2OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEwRDoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA3OworICAgIGNhc2UgMHgwRjJEOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNyAvIDI7CiAgICAgY2FzZSAweDIxNUU6CiAJcmV0dXJuIChkb3VibGUpIDcgLyA4OwogICAgIGNhc2UgMHgxMzc4OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDExNjoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA3MDsKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMUY6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA3MDA7CisgICAgY2FzZSAweDEwMTI4OgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgNzAwMDsKKyAgICBjYXNlIDB4MTAxMzE6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA3MDAwMDsKKyNlbmRpZgorICAgIGNhc2UgMHgxN0Y4OgogICAgIGNhc2UgMHgyMTY3OgogICAgIGNhc2UgMHgyMTc3OgogICAgIGNhc2UgMHgzMDI4OgorICAgIGNhc2UgMHgzMjI3OgogICAgIGNhc2UgMHgzMjg3OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEwRToKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA4OwogICAgIGNhc2UgMHgxMzc5OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDExNzoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA4MDsKKyNpZmRlZiBQeV9VTklDT0RFX1dJREUKKyAgICBjYXNlIDB4MTAxMjA6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA4MDA7CisgICAgY2FzZSAweDEwMTI5OgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgODAwMDsKKyAgICBjYXNlIDB4MTAxMzI6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA4MDAwMDsKKyNlbmRpZgorICAgIGNhc2UgMHgxN0Y5OgogICAgIGNhc2UgMHgyMTY4OgogICAgIGNhc2UgMHgyMTc4OgogICAgIGNhc2UgMHgzMDI5OgorICAgIGNhc2UgMHgzMjI4OgogICAgIGNhc2UgMHgzMjg4OgorI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEwRjoKKyNlbmRpZgogCXJldHVybiAoZG91YmxlKSA5OworICAgIGNhc2UgMHgwRjJFOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgOSAvIDI7CiAgICAgY2FzZSAweDEzN0E6CisjaWZkZWYgUHlfVU5JQ09ERV9XSURFCisgICAgY2FzZSAweDEwMTE4OgorI2VuZGlmCiAJcmV0dXJuIChkb3VibGUpIDkwOworI2lmZGVmIFB5X1VOSUNPREVfV0lERQorICAgIGNhc2UgMHgxMDEyMToKKyAgICBjYXNlIDB4MTAzNEE6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA5MDA7CisgICAgY2FzZSAweDEwMTJBOgorICAgICAgICByZXR1cm4gKGRvdWJsZSkgOTAwMDsKKyAgICBjYXNlIDB4MTAxMzM6CisgICAgICAgIHJldHVybiAoZG91YmxlKSA5MDAwMDsKKyNlbmRpZgogICAgIGRlZmF1bHQ6CiAJcmV0dXJuIChkb3VibGUpIF9QeVVuaWNvZGVfVG9EaWdpdChjaCk7CiAgICAgfQpAQCAtMzI3LDkgKzY1MCw3IEBACiAKIGludCBfUHlVbmljb2RlX0lzTnVtZXJpYyhQeV9VTklDT0RFIGNoKQogewotICAgIGlmIChfUHlVbmljb2RlX1RvTnVtZXJpYyhjaCkgPCAwLjApCi0JcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIF9QeVVuaWNvZGVfVG9OdW1lcmljKGNoKSAhPSAtMS4wOwogfQogCiAjaWZuZGVmIFdBTlRfV0NUWVBFX0ZVTkNUSU9OUwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwppbmRleCBlNjJjNzc0Li42Y2RiMGZjIDEwMDY0NAotLS0gYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYworKysgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwpAQCAtNCw2ICs0LDkgQEAKIG1vZGlmaWVkIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyA8bWFsQGxlbWJ1cmcuY29tPiBhY2NvcmRpbmcgdG8gdGhlCiBVbmljb2RlIEludGVncmF0aW9uIFByb3Bvc2FsIChzZWUgZmlsZSBNaXNjL3VuaWNvZGUudHh0KS4KIAorTWFqb3Igc3BlZWQgdXBncmFkZXMgdG8gdGhlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMgYXQgdGhlIFJleWtqYXZpaworTmVlZEZvclNwZWVkIHNwcmludCwgYnkgRnJlZHJpayBMdW5kaCBhbmQgQW5kcmV3IERhbGtlLgorCiBDb3B5cmlnaHQgKGMpIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlcy4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEyMSw2ICsxMjQsNTEgQEAKICNlbmRpZgogfQogCisvKiAtLS0gQmxvb20gRmlsdGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzdHVmZiB0byBpbXBsZW1lbnQgc2ltcGxlICJibG9vbSBmaWx0ZXJzIiBmb3IgVW5pY29kZSBjaGFyYWN0ZXJzLgorICAgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCB3ZSB1c2UgYSBzaW5nbGUgYml0bWFzaywgdXNpbmcgdGhlIGxlYXN0IDUKKyAgIGJpdHMgZnJvbSBlYWNoIHVuaWNvZGUgY2hhcmFjdGVycyBhcyB0aGUgYml0IGluZGV4LiAqLworCisvKiB0aGUgbGluZWJyZWFrIG1hc2sgaXMgc2V0IHVwIGJ5IFVuaWNvZGVfSW5pdCBiZWxvdyAqLworCisjZGVmaW5lIEJMT09NX01BU0sgdW5zaWduZWQgbG9uZworCitzdGF0aWMgQkxPT01fTUFTSyBibG9vbV9saW5lYnJlYWs7CisKKyNkZWZpbmUgQkxPT00obWFzaywgY2gpICgobWFzayAmICgxIDw8ICgoY2gpICYgMHgxRikpKSkKKworI2RlZmluZSBCTE9PTV9MSU5FQlJFQUsoY2gpXAorICAgIChCTE9PTShibG9vbV9saW5lYnJlYWssIChjaCkpICYmIFB5X1VOSUNPREVfSVNMSU5FQlJFQUsoKGNoKSkpCisKK1B5X0xPQ0FMX0lOTElORShCTE9PTV9NQVNLKSBtYWtlX2Jsb29tX21hc2soUHlfVU5JQ09ERSogcHRyLCBQeV9zc2l6ZV90IGxlbikKK3sKKyAgICAvKiBjYWxjdWxhdGUgc2ltcGxlIGJsb29tLXN0eWxlIGJpdG1hc2sgZm9yIGEgZ2l2ZW4gdW5pY29kZSBzdHJpbmcgKi8KKworICAgIGxvbmcgbWFzazsKKyAgICBQeV9zc2l6ZV90IGk7CisKKyAgICBtYXNrID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIG1hc2sgfD0gKDEgPDwgKHB0cltpXSAmIDB4MUYpKTsKKworICAgIHJldHVybiBtYXNrOworfQorCitQeV9MT0NBTF9JTkxJTkUoaW50KSB1bmljb2RlX21lbWJlcihQeV9VTklDT0RFIGNociwgUHlfVU5JQ09ERSogc2V0LCBQeV9zc2l6ZV90IHNldGxlbikKK3sKKyAgICBQeV9zc2l6ZV90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2V0bGVuOyBpKyspCisgICAgICAgIGlmIChzZXRbaV0gPT0gY2hyKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBCTE9PTV9NRU1CRVIobWFzaywgY2hyLCBzZXQsIHNldGxlbilcCisgICAgQkxPT00obWFzaywgY2hyKSAmJiB1bmljb2RlX21lbWJlcihjaHIsIHNldCwgc2V0bGVuKQorCiAvKiAtLS0gVW5pY29kZSBPYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljCkBAIC0xMzYsNiArMTg0LDcgQEAKICAgICAvKiBSZXNpemluZyBzaGFyZWQgb2JqZWN0ICh1bmljb2RlX2VtcHR5IG9yIHNpbmdsZSBjaGFyYWN0ZXIKICAgICAgICBvYmplY3RzKSBpbi1wbGFjZSBpcyBub3QgYWxsb3dlZC4gVXNlIFB5VW5pY29kZV9SZXNpemUoKQogICAgICAgIGluc3RlYWQgISAqLworCiAgICAgaWYgKHVuaWNvZGUgPT0gdW5pY29kZV9lbXB0eSB8fCAKIAkodW5pY29kZS0+bGVuZ3RoID09IDEgJiYgCiAJIHVuaWNvZGUtPnN0clswXSA8IDI1NlUgJiYKQEAgLTE0NSw4ICsxOTQsMTEgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIC8qIFdlIGFsbG9jYXRlIG9uZSBtb3JlIGJ5dGUgdG8gbWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMKLSAgICAgICBVeDAwMDAgdGVybWluYXRlZCAtLSBYWFggaXMgdGhpcyBuZWVkZWQgPyAqLworICAgIC8qIFdlIGFsbG9jYXRlIG9uZSBtb3JlIGJ5dGUgdG8gbWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgVXgwMDAwIHRlcm1pbmF0ZWQuCisgICAgICAgVGhlIG92ZXJhbGxvY2F0aW9uIGlzIGFsc28gdXNlZCBieSBmYXN0c2VhcmNoLCB3aGljaCBhc3N1bWVzIHRoYXQgaXQncworICAgICAgIHNhZmUgdG8gbG9vayBhdCBzdHJbbGVuZ3RoXSAod2l0aG91dCBtYWtpbmcgYW55IGFzc3VtcHRpb25zIGFib3V0IHdoYXQKKyAgICAgICBpdCBjb250YWlucykuICovCisKICAgICBvbGRzdHIgPSB1bmljb2RlLT5zdHI7CiAgICAgUHlNZW1fUkVTSVpFKHVuaWNvZGUtPnN0ciwgUHlfVU5JQ09ERSwgbGVuZ3RoICsgMSk7CiAgICAgaWYgKCF1bmljb2RlLT5zdHIpIHsKQEAgLTE4MSw3ICsyMzMsNyBAQAogewogICAgIHJlZ2lzdGVyIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZTsKIAotICAgIC8qIE9wdGltaXphdGlvbiBmbyBlbXB0eSBzdHJpbmdzICovCisgICAgLyogT3B0aW1pemF0aW9uIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKGxlbmd0aCA9PSAwICYmIHVuaWNvZGVfZW1wdHkgIT0gTlVMTCkgewogICAgICAgICBQeV9JTkNSRUYodW5pY29kZV9lbXB0eSk7CiAgICAgICAgIHJldHVybiB1bmljb2RlX2VtcHR5OwpAQCAtMTk2Myw5ICsyMDE1LDIwIEBACiAKICovCiAKLXN0YXRpYyBjb25zdCBQeV9VTklDT0RFICpmaW5kY2hhcihjb25zdCBQeV9VTklDT0RFICpzLAotCQkJCSAgUHlfc3NpemVfdCBzaXplLAotCQkJCSAgUHlfVU5JQ09ERSBjaCk7CitQeV9MT0NBTF9JTkxJTkUoY29uc3QgUHlfVU5JQ09ERSAqKSBmaW5kY2hhcihjb25zdCBQeV9VTklDT0RFICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgY2gpCit7CisgICAgLyogbGlrZSB3Y3NjaHIsIGJ1dCBkb2Vzbid0IHN0b3AgYXQgTlVMTCBjaGFyYWN0ZXJzICovCisKKyAgICB3aGlsZSAoc2l6ZS0tID4gMCkgeworICAgICAgICBpZiAoKnMgPT0gY2gpCisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgcysrOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQogCiBzdGF0aWMKIFB5T2JqZWN0ICp1bmljb2RlZXNjYXBlX3N0cmluZyhjb25zdCBQeV9VTklDT0RFICpzLApAQCAtMjMxMyw3ICsyMzc2LDcgQEAKICAgICBlbmQgPSBzICsgc2l6ZTsKIAogICAgIHdoaWxlIChzIDwgZW5kKSB7Ci0gICAgICAgICpwID0gKihQeV9VTklDT0RFICopczsKKyAgICAgICAgbWVtY3B5KHAsIHMsIHNpemVvZihQeV9VTklDT0RFKSk7CiAgICAgICAgIC8qIFdlIGhhdmUgdG8gc2FuaXR5IGNoZWNrIHRoZSByYXcgZGF0YSwgb3RoZXJ3aXNlIGRvb20gbG9vbXMgZm9yCiAgICAgICAgICAgIHNvbWUgbWFsZm9ybWVkIFVDUy00IGRhdGEuICovCiAgICAgICAgIGlmICgKQEAgLTM3OTEsMTI0ICszODU0LDEwNCBAQAogCiAvKiAtLS0gSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljCi1QeV9zc2l6ZV90IGNvdW50KFB5VW5pY29kZU9iamVjdCAqc2VsZiwKLQkJIFB5X3NzaXplX3Qgc3RhcnQsCi0JCSBQeV9zc2l6ZV90IGVuZCwKLQkJIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nKQorI2RlZmluZSBTVFJJTkdMSUJfQ0hBUiBQeV9VTklDT0RFCisKKyNkZWZpbmUgU1RSSU5HTElCX0xFTiBQeVVuaWNvZGVfR0VUX1NJWkUKKyNkZWZpbmUgU1RSSU5HTElCX05FVyBQeVVuaWNvZGVfRnJvbVVuaWNvZGUKKyNkZWZpbmUgU1RSSU5HTElCX1NUUiBQeVVuaWNvZGVfQVNfVU5JQ09ERQorCitQeV9MT0NBTF9JTkxJTkUoaW50KQorU1RSSU5HTElCX0NNUChjb25zdCBQeV9VTklDT0RFKiBzdHIsIGNvbnN0IFB5X1VOSUNPREUqIG90aGVyLCBQeV9zc2l6ZV90IGxlbikKIHsKLSAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKLQotICAgIGlmIChzdGFydCA8IDApCi0gICAgICAgIHN0YXJ0ICs9IHNlbGYtPmxlbmd0aDsKLSAgICBpZiAoc3RhcnQgPCAwKQotICAgICAgICBzdGFydCA9IDA7Ci0gICAgaWYgKGVuZCA+IHNlbGYtPmxlbmd0aCkKLSAgICAgICAgZW5kID0gc2VsZi0+bGVuZ3RoOwotICAgIGlmIChlbmQgPCAwKQotICAgICAgICBlbmQgKz0gc2VsZi0+bGVuZ3RoOwotICAgIGlmIChlbmQgPCAwKQotICAgICAgICBlbmQgPSAwOwotCi0gICAgaWYgKHN1YnN0cmluZy0+bGVuZ3RoID09IDApCi0JcmV0dXJuIChlbmQgLSBzdGFydCArIDEpOwotCi0gICAgZW5kIC09IHN1YnN0cmluZy0+bGVuZ3RoOwotCi0gICAgd2hpbGUgKHN0YXJ0IDw9IGVuZCkKLSAgICAgICAgaWYgKFB5X1VOSUNPREVfTUFUQ0goc2VsZiwgc3RhcnQsIHN1YnN0cmluZykpIHsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICBzdGFydCArPSBzdWJzdHJpbmctPmxlbmd0aDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdGFydCsrOwotCi0gICAgcmV0dXJuIGNvdW50OworICAgIGlmIChzdHJbMF0gIT0gb3RoZXJbMF0pCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiBtZW1jbXAoKHZvaWQqKSBzdHIsICh2b2lkKikgb3RoZXIsIGxlbiAqIHNpemVvZihQeV9VTklDT0RFKSk7CiB9CiAKKyNkZWZpbmUgU1RSSU5HTElCX0VNUFRZIHVuaWNvZGVfZW1wdHkKKworI2luY2x1ZGUgInN0cmluZ2xpYi9mYXN0c2VhcmNoLmgiCisKKyNpbmNsdWRlICJzdHJpbmdsaWIvY291bnQuaCIKKyNpbmNsdWRlICJzdHJpbmdsaWIvZmluZC5oIgorI2luY2x1ZGUgInN0cmluZ2xpYi9wYXJ0aXRpb24uaCIKKworLyogaGVscGVyIG1hY3JvIHRvIGZpeHVwIHN0YXJ0L2VuZCBzbGljZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRklYX1NUQVJUX0VORChvYmopICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RhcnQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhcnQgKz0gKG9iaiktPmxlbmd0aDsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RhcnQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZW5kID4gKG9iaiktPmxlbmd0aCkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kID0gKG9iaiktPmxlbmd0aDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZW5kIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kICs9IChvYmopLT5sZW5ndGg7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZW5kIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kID0gMDsKKwogUHlfc3NpemVfdCBQeVVuaWNvZGVfQ291bnQoUHlPYmplY3QgKnN0ciwKLQkJICAgIFB5T2JqZWN0ICpzdWJzdHIsCi0JCSAgICBQeV9zc2l6ZV90IHN0YXJ0LAotCQkgICAgUHlfc3NpemVfdCBlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vic3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kKQogewogICAgIFB5X3NzaXplX3QgcmVzdWx0OworICAgIFB5VW5pY29kZU9iamVjdCogc3RyX29iajsKKyAgICBQeVVuaWNvZGVPYmplY3QqIHN1Yl9vYmo7CiAKLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICBzdHJfb2JqID0gKFB5VW5pY29kZU9iamVjdCopIFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CisgICAgaWYgKCFzdHJfb2JqKQogCXJldHVybiAtMTsKLSAgICBzdWJzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWJzdHIpOwotICAgIGlmIChzdWJzdHIgPT0gTlVMTCkgewotCVB5X0RFQ1JFRihzdHIpOworICAgIHN1Yl9vYmogPSAoUHlVbmljb2RlT2JqZWN0KikgUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyKTsKKyAgICBpZiAoIXN1Yl9vYmopIHsKKwlQeV9ERUNSRUYoc3RyX29iaik7CiAJcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJlc3VsdCA9IGNvdW50KChQeVVuaWNvZGVPYmplY3QgKilzdHIsCi0JCSAgIHN0YXJ0LCBlbmQsCi0JCSAgIChQeVVuaWNvZGVPYmplY3QgKilzdWJzdHIpOworICAgIEZJWF9TVEFSVF9FTkQoc3RyX29iaik7CiAKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICBQeV9ERUNSRUYoc3Vic3RyKTsKKyAgICByZXN1bHQgPSBzdHJpbmdsaWJfY291bnQoCisgICAgICAgIHN0cl9vYmotPnN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViX29iai0+c3RyLCBzdWJfb2JqLT5sZW5ndGgKKyAgICAgICAgKTsKKworICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKKyAgICBQeV9ERUNSRUYoc3RyX29iaik7CisKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMKLVB5X3NzaXplX3QgZmluZHN0cmluZyhQeVVuaWNvZGVPYmplY3QgKnNlbGYsCi0JICAgICAgIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nLAotCSAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LAotCSAgICAgICBQeV9zc2l6ZV90IGVuZCwKLQkgICAgICAgaW50IGRpcmVjdGlvbikKLXsKLSAgICBpZiAoc3RhcnQgPCAwKQotICAgICAgICBzdGFydCArPSBzZWxmLT5sZW5ndGg7Ci0gICAgaWYgKHN0YXJ0IDwgMCkKLSAgICAgICAgc3RhcnQgPSAwOwotCi0gICAgaWYgKGVuZCA+IHNlbGYtPmxlbmd0aCkKLSAgICAgICAgZW5kID0gc2VsZi0+bGVuZ3RoOwotICAgIGlmIChlbmQgPCAwKQotICAgICAgICBlbmQgKz0gc2VsZi0+bGVuZ3RoOwotICAgIGlmIChlbmQgPCAwKQotICAgICAgICBlbmQgPSAwOwotCi0gICAgaWYgKHN1YnN0cmluZy0+bGVuZ3RoID09IDApCi0JcmV0dXJuIChkaXJlY3Rpb24gPiAwKSA/IHN0YXJ0IDogZW5kOwotCi0gICAgZW5kIC09IHN1YnN0cmluZy0+bGVuZ3RoOwotCi0gICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKLSAgICAgICAgZm9yICg7IGVuZCA+PSBzdGFydDsgZW5kLS0pCi0gICAgICAgICAgICBpZiAoUHlfVU5JQ09ERV9NQVRDSChzZWxmLCBlbmQsIHN1YnN0cmluZykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZDsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKDsgc3RhcnQgPD0gZW5kOyBzdGFydCsrKQotICAgICAgICAgICAgaWYgKFB5X1VOSUNPREVfTUFUQ0goc2VsZiwgc3RhcnQsIHN1YnN0cmluZykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OwotICAgIH0KLQotICAgIHJldHVybiAtMTsKLX0KLQogUHlfc3NpemVfdCBQeVVuaWNvZGVfRmluZChQeU9iamVjdCAqc3RyLAotCQkgICBQeU9iamVjdCAqc3Vic3RyLAotCQkgICBQeV9zc2l6ZV90IHN0YXJ0LAotCQkgICBQeV9zc2l6ZV90IGVuZCwKLQkJICAgaW50IGRpcmVjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pCiB7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICBpZiAoIXN0cikKIAlyZXR1cm4gLTI7Ci0gICAgc3Vic3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyKTsKLSAgICBpZiAoc3Vic3RyID09IE5VTEwpIHsKKyAgICBzdWIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWIpOworICAgIGlmICghc3ViKSB7CiAJUHlfREVDUkVGKHN0cik7CiAJcmV0dXJuIC0yOwogICAgIH0KIAotICAgIHJlc3VsdCA9IGZpbmRzdHJpbmcoKFB5VW5pY29kZU9iamVjdCAqKXN0ciwKLQkJCShQeVVuaWNvZGVPYmplY3QgKilzdWJzdHIsCi0JCQlzdGFydCwgZW5kLCBkaXJlY3Rpb24pOworICAgIGlmIChkaXJlY3Rpb24gPiAwKQorICAgICAgICByZXN1bHQgPSBzdHJpbmdsaWJfZmluZF9zbGljZSgKKyAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3ViKSwgUHlVbmljb2RlX0dFVF9TSVpFKHN1YiksCisgICAgICAgICAgICBzdGFydCwgZW5kCisgICAgICAgICAgICApOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gc3RyaW5nbGliX3JmaW5kX3NsaWNlKAorICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdWIpLCBQeVVuaWNvZGVfR0VUX1NJWkUoc3ViKSwKKyAgICAgICAgICAgIHN0YXJ0LCBlbmQKKyAgICAgICAgICAgICk7CisKICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICBQeV9ERUNSRUYoc3Vic3RyKTsKKyAgICBQeV9ERUNSRUYoc3ViKTsKKwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM5MTksMjAgKzM5NjIsMTAgQEAKIAkgICAgICBQeV9zc2l6ZV90IGVuZCwKIAkgICAgICBpbnQgZGlyZWN0aW9uKQogewotICAgIGlmIChzdGFydCA8IDApCi0gICAgICAgIHN0YXJ0ICs9IHNlbGYtPmxlbmd0aDsKLSAgICBpZiAoc3RhcnQgPCAwKQotICAgICAgICBzdGFydCA9IDA7Ci0KICAgICBpZiAoc3Vic3RyaW5nLT5sZW5ndGggPT0gMCkKICAgICAgICAgcmV0dXJuIDE7CiAKLSAgICBpZiAoZW5kID4gc2VsZi0+bGVuZ3RoKQotICAgICAgICBlbmQgPSBzZWxmLT5sZW5ndGg7Ci0gICAgaWYgKGVuZCA8IDApCi0gICAgICAgIGVuZCArPSBzZWxmLT5sZW5ndGg7Ci0gICAgaWYgKGVuZCA8IDApCi0gICAgICAgIGVuZCA9IDA7CisgICAgRklYX1NUQVJUX0VORChzZWxmKTsKIAogICAgIGVuZCAtPSBzdWJzdHJpbmctPmxlbmd0aDsKICAgICBpZiAoZW5kIDwgc3RhcnQpCkBAIC0zOTc0LDIyICs0MDA3LDYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMKLWNvbnN0IFB5X1VOSUNPREUgKmZpbmRjaGFyKGNvbnN0IFB5X1VOSUNPREUgKnMsCi0JCSAgICAgUHlfc3NpemVfdCBzaXplLAotCQkgICAgIFB5X1VOSUNPREUgY2gpCi17Ci0gICAgLyogbGlrZSB3Y3NjaHIsIGJ1dCBkb2Vzbid0IHN0b3AgYXQgTlVMTCBjaGFyYWN0ZXJzICovCi0KLSAgICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgICAgICBpZiAoKnMgPT0gY2gpCi0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgcysrOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCiAvKiBBcHBseSBmaXhmY3QgZmlsdGVyIHRvIHRoZSBVbmljb2RlIG9iamVjdCBzZWxmIGFuZCByZXR1cm4gYQogICAgcmVmZXJlbmNlIHRvIHRoZSBtb2RpZmllZCBvYmplY3QgKi8KIApAQCAtNDE0OCwxMCArNDE2NSwxMCBAQAogICAgIFB5T2JqZWN0ICppbnRlcm5hbF9zZXBhcmF0b3IgPSBOVUxMOwogICAgIGNvbnN0IFB5X1VOSUNPREUgYmxhbmsgPSAnICc7CiAgICAgY29uc3QgUHlfVU5JQ09ERSAqc2VwID0gJmJsYW5rOwotICAgIHNpemVfdCBzZXBsZW4gPSAxOworICAgIFB5X3NzaXplX3Qgc2VwbGVuID0gMTsKICAgICBQeVVuaWNvZGVPYmplY3QgKnJlcyA9IE5VTEw7IC8qIHRoZSByZXN1bHQgKi8KLSAgICBzaXplX3QgcmVzX2FsbG9jID0gMTAwOyAgLyogIyBhbGxvY2F0ZWQgYnl0ZXMgZm9yIHN0cmluZyBpbiByZXMgKi8KLSAgICBzaXplX3QgcmVzX3VzZWQ7ICAgICAgICAgLyogIyB1c2VkIGJ5dGVzICovCisgICAgUHlfc3NpemVfdCByZXNfYWxsb2MgPSAxMDA7ICAvKiAjIGFsbG9jYXRlZCBieXRlcyBmb3Igc3RyaW5nIGluIHJlcyAqLworICAgIFB5X3NzaXplX3QgcmVzX3VzZWQ7ICAgICAgICAgLyogIyB1c2VkIGJ5dGVzICovCiAgICAgUHlfVU5JQ09ERSAqcmVzX3A7ICAgICAgIC8qIHBvaW50ZXIgdG8gZnJlZSBieXRlIGluIHJlcydzIHN0cmluZyBhcmVhICovCiAgICAgUHlPYmplY3QgKmZzZXE7ICAgICAgICAgIC8qIFB5U2VxdWVuY2VfRmFzdChzZXEpICovCiAgICAgUHlfc3NpemVfdCBzZXFsZW47ICAgICAgICAgICAgICAvKiBsZW4oZnNlcSkgLS0gbnVtYmVyIG9mIGl0ZW1zIGluIHNlcXVlbmNlICovCkBAIC00MjEyLDggKzQyMjksOCBAQAogICAgIHJlc191c2VkID0gMDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzZXFsZW47ICsraSkgewotCXNpemVfdCBpdGVtbGVuOwotCXNpemVfdCBuZXdfcmVzX3VzZWQ7CisJUHlfc3NpemVfdCBpdGVtbGVuOworCVB5X3NzaXplX3QgbmV3X3Jlc191c2VkOwogCiAJaXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShmc2VxLCBpKTsKIAkvKiBDb252ZXJ0IGl0ZW0gdG8gVW5pY29kZS4gKi8KQEAgLTQyMzUsMTkgKzQyNTIsMTggQEAKICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgc2VwYXJhdG9yIGFuZCB0aGUgaXRlbS4gKi8KIAlpdGVtbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGl0ZW0pOwogCW5ld19yZXNfdXNlZCA9IHJlc191c2VkICsgaXRlbWxlbjsKLQlpZiAobmV3X3Jlc191c2VkIDwgcmVzX3VzZWQgfHwgIG5ld19yZXNfdXNlZCA+IFBZX1NTSVpFX1RfTUFYKQorCWlmIChuZXdfcmVzX3VzZWQgPD0gMCkKIAkgICAgZ290byBPdmVyZmxvdzsKIAlpZiAoaSA8IHNlcWxlbiAtIDEpIHsKIAkgICAgbmV3X3Jlc191c2VkICs9IHNlcGxlbjsKLQkgICAgaWYgKG5ld19yZXNfdXNlZCA8IHJlc191c2VkIHx8ICBuZXdfcmVzX3VzZWQgPiBQWV9TU0laRV9UX01BWCkKKwkgICAgaWYgKG5ld19yZXNfdXNlZCA8PSAwKQogCQlnb3RvIE92ZXJmbG93OwogCX0KIAlpZiAobmV3X3Jlc191c2VkID4gcmVzX2FsbG9jKSB7CiAJICAgIC8qIGRvdWJsZSBhbGxvY2F0ZWQgc2l6ZSB1bnRpbCBpdCdzIGJpZyBlbm91Z2ggKi8KIAkgICAgZG8gewotCSAgICAgICAgc2l6ZV90IG9sZHNpemUgPSByZXNfYWxsb2M7CiAJICAgICAgICByZXNfYWxsb2MgKz0gcmVzX2FsbG9jOwotCSAgICAgICAgaWYgKHJlc19hbGxvYyA8IG9sZHNpemUgfHwgcmVzX2FsbG9jID4gUFlfU1NJWkVfVF9NQVgpCisJICAgICAgICBpZiAocmVzX2FsbG9jIDw9IDApCiAJICAgICAgICAgICAgZ290byBPdmVyZmxvdzsKIAkgICAgfSB3aGlsZSAobmV3X3Jlc191c2VkID4gcmVzX2FsbG9jKTsKIAkgICAgaWYgKF9QeVVuaWNvZGVfUmVzaXplKCZyZXMsIHJlc19hbGxvYykgPCAwKSB7CkBAIC00MzMzLDE3ICs0MzQ5LDYgQEAKICAgICAgICAgZWxzZQkJCQkJCQkJXAogICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CiAKLSNkZWZpbmUgU1BMSVRfSU5TRVJUKGRhdGEsIGxlZnQsIHJpZ2h0KQkJCQkJXAotCXN0ciA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZSgoZGF0YSkgKyAobGVmdCksIChyaWdodCkgLSAobGVmdCkpOwlcCi0JaWYgKCFzdHIpCQkJCQkJCVwKLQkgICAgZ290byBvbkVycm9yOwkJCQkJCVwKLQlpZiAoUHlMaXN0X0luc2VydChsaXN0LCAwLCBzdHIpKSB7CQkJCVwKLQkgICAgUHlfREVDUkVGKHN0cik7CQkJCQkJXAotCSAgICBnb3RvIG9uRXJyb3I7CQkJCQkJXAotCX0JCQkJCQkJCVwKLSAgICAgICAgZWxzZQkJCQkJCQkJXAotICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0KIHN0YXRpYwogUHlPYmplY3QgKnNwbGl0X3doaXRlc3BhY2UoUHlVbmljb2RlT2JqZWN0ICpzZWxmLAogCQkJICAgUHlPYmplY3QgKmxpc3QsCkBAIC00NDA0LDcgKzQ0MDksNyBAQAogCVB5X3NzaXplX3QgZW9sOwogCiAJLyogRmluZCBhIGxpbmUgYW5kIGFwcGVuZCBpdCAqLwotCXdoaWxlIChpIDwgbGVuICYmICFQeV9VTklDT0RFX0lTTElORUJSRUFLKGRhdGFbaV0pKQorCXdoaWxlIChpIDwgbGVuICYmICFCTE9PTV9MSU5FQlJFQUsoZGF0YVtpXSkpCiAJICAgIGkrKzsKIAogCS8qIFNraXAgdGhlIGxpbmUgYnJlYWsgcmVhZGluZyBDUkxGIGFzIG9uZSBsaW5lIGJyZWFrICovCkBAIC00NTE1LDE1ICs0NTIwLDE3IEBACiAJaWYgKGogPiBpKSB7CiAJICAgIGlmIChtYXhjb3VudC0tIDw9IDApCiAJCWJyZWFrOwotCSAgICBTUExJVF9JTlNFUlQoc2VsZi0+c3RyLCBpICsgMSwgaiArIDEpOworCSAgICBTUExJVF9BUFBFTkQoc2VsZi0+c3RyLCBpICsgMSwgaiArIDEpOwogCSAgICB3aGlsZSAoaSA+PSAwICYmIFB5X1VOSUNPREVfSVNTUEFDRShzZWxmLT5zdHJbaV0pKQogCQlpLS07CiAJICAgIGogPSBpOwogCX0KICAgICB9CiAgICAgaWYgKGogPj0gMCkgewotCVNQTElUX0lOU0VSVChzZWxmLT5zdHIsIDAsIGogKyAxKTsKKwlTUExJVF9BUFBFTkQoc2VsZi0+c3RyLCAwLCBqICsgMSk7CiAgICAgfQorICAgIGlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICByZXR1cm4gbGlzdDsKIAogIG9uRXJyb3I6CkBAIC00NTQ2LDE0ICs0NTUzLDE2IEBACiAJaWYgKHNlbGYtPnN0cltpXSA9PSBjaCkgewogCSAgICBpZiAobWF4Y291bnQtLSA8PSAwKQogCQlicmVhazsKLQkgICAgU1BMSVRfSU5TRVJUKHNlbGYtPnN0ciwgaSArIDEsIGogKyAxKTsKKwkgICAgU1BMSVRfQVBQRU5EKHNlbGYtPnN0ciwgaSArIDEsIGogKyAxKTsKIAkgICAgaiA9IGkgPSBpIC0gMTsKIAl9IGVsc2UKIAkgICAgaS0tOwogICAgIH0KICAgICBpZiAoaiA+PSAtMSkgewotCVNQTElUX0lOU0VSVChzZWxmLT5zdHIsIDAsIGogKyAxKTsKKwlTUExJVF9BUFBFTkQoc2VsZi0+c3RyLCAwLCBqICsgMSk7CiAgICAgfQorICAgIGlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICByZXR1cm4gbGlzdDsKIAogIG9uRXJyb3I6CkBAIC00NTc3LDE1ICs0NTg2LDE3IEBACiAJaWYgKFB5X1VOSUNPREVfTUFUQ0goc2VsZiwgaSwgc3Vic3RyaW5nKSkgewogCSAgICBpZiAobWF4Y291bnQtLSA8PSAwKQogCQlicmVhazsKLQkgICAgU1BMSVRfSU5TRVJUKHNlbGYtPnN0ciwgaSArIHN1Ymxlbiwgaik7CisJICAgIFNQTElUX0FQUEVORChzZWxmLT5zdHIsIGkgKyBzdWJsZW4sIGopOwogCSAgICBqID0gaTsKIAkgICAgaSAtPSBzdWJsZW47CiAJfSBlbHNlCiAJICAgIGktLTsKICAgICB9CiAgICAgaWYgKGogPj0gMCkgewotCVNQTElUX0lOU0VSVChzZWxmLT5zdHIsIDAsIGopOworCVNQTElUX0FQUEVORChzZWxmLT5zdHIsIDAsIGopOwogICAgIH0KKyAgICBpZiAoUHlMaXN0X1JldmVyc2UobGlzdCkgPCAwKQorICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgcmV0dXJuIGxpc3Q7CiAKICBvbkVycm9yOgpAQCAtNDU5NCw3ICs0NjA1LDYgQEAKIH0KIAogI3VuZGVmIFNQTElUX0FQUEVORAotI3VuZGVmIFNQTElUX0lOU0VSVAogCiBzdGF0aWMKIFB5T2JqZWN0ICpzcGxpdChQeVVuaWNvZGVPYmplY3QgKnNlbGYsCkBAIC00NjY1LDg4ICs0Njc1LDEyOCBAQAogICAgIGlmIChtYXhjb3VudCA8IDApCiAJbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKIAotICAgIGlmIChzdHIxLT5sZW5ndGggPT0gMSAmJiBzdHIyLT5sZW5ndGggPT0gMSkgeworICAgIGlmIChzdHIxLT5sZW5ndGggPT0gc3RyMi0+bGVuZ3RoKSB7CisgICAgICAgIC8qIHNhbWUgbGVuZ3RoICovCiAgICAgICAgIFB5X3NzaXplX3QgaTsKLQotICAgICAgICAvKiByZXBsYWNlIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgaWYgKCFmaW5kY2hhcihzZWxmLT5zdHIsIHNlbGYtPmxlbmd0aCwgc3RyMS0+c3RyWzBdKSAmJgotICAgICAgICAgICAgUHlVbmljb2RlX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gcmVwbGFjZSwgcmV0dXJuIG9yaWdpbmFsIHN0cmluZyAqLwotICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICAgICAgdSA9IHNlbGY7CisgICAgICAgIGlmIChzdHIxLT5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgLyogcmVwbGFjZSBjaGFyYWN0ZXJzICovCisgICAgICAgICAgICBQeV9VTklDT0RFIHUxLCB1MjsKKyAgICAgICAgICAgIGlmICghZmluZGNoYXIoc2VsZi0+c3RyLCBzZWxmLT5sZW5ndGgsIHN0cjEtPnN0clswXSkpCisgICAgICAgICAgICAgICAgZ290byBub3RoaW5nOworICAgICAgICAgICAgdSA9IChQeVVuaWNvZGVPYmplY3QqKSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgc2VsZi0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICghdSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X1VOSUNPREVfQ09QWSh1LT5zdHIsIHNlbGYtPnN0ciwgc2VsZi0+bGVuZ3RoKTsKKyAgICAgICAgICAgIHUxID0gc3RyMS0+c3RyWzBdOworICAgICAgICAgICAgdTIgPSBzdHIyLT5zdHJbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdS0+bGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHUtPnN0cltpXSA9PSB1MSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoLS1tYXhjb3VudCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgdS0+c3RyW2ldID0gdTI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotCSAgICBQeV9VTklDT0RFIHUxID0gc3RyMS0+c3RyWzBdOwotCSAgICBQeV9VTklDT0RFIHUyID0gc3RyMi0+c3RyWzBdOwotCi0gICAgICAgICAgICB1ID0gKFB5VW5pY29kZU9iamVjdCopIFB5VW5pY29kZV9Gcm9tVW5pY29kZSgKLSAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgIHNlbGYtPmxlbmd0aAorICAgICAgICAgICAgaSA9IGZhc3RzZWFyY2goCisgICAgICAgICAgICAgICAgc2VsZi0+c3RyLCBzZWxmLT5sZW5ndGgsIHN0cjEtPnN0ciwgc3RyMS0+bGVuZ3RoLCBGQVNUX1NFQVJDSAogICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBpZiAodSAhPSBOVUxMKSB7Ci0JCVB5X1VOSUNPREVfQ09QWSh1LT5zdHIsIHNlbGYtPnN0ciwKLQkJCQlzZWxmLT5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1LT5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgaWYgKHUtPnN0cltpXSA9PSB1MSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tbWF4Y291bnQgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgdS0+c3RyW2ldID0gdTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG5vdGhpbmc7CisgICAgICAgICAgICB1ID0gKFB5VW5pY29kZU9iamVjdCopIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzZWxmLT5sZW5ndGgpOworICAgICAgICAgICAgaWYgKCF1KQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlfVU5JQ09ERV9DT1BZKHUtPnN0ciwgc2VsZi0+c3RyLCBzZWxmLT5sZW5ndGgpOworICAgICAgICAgICAgd2hpbGUgKGkgPD0gc2VsZi0+bGVuZ3RoIC0gc3RyMS0+bGVuZ3RoKQorICAgICAgICAgICAgICAgIGlmIChQeV9VTklDT0RFX01BVENIKHNlbGYsIGksIHN0cjEpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgtLW1heGNvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQeV9VTklDT0RFX0NPUFkodS0+c3RyK2ksIHN0cjItPnN0ciwgc3RyMi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSBzdHIxLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICB9IGVsc2UgewotICAgICAgICBQeV9zc2l6ZV90IG4sIGk7CisKKyAgICAgICAgUHlfc3NpemVfdCBuLCBpLCBqLCBlOworICAgICAgICBQeV9zc2l6ZV90IHByb2R1Y3QsIG5ld19zaXplLCBkZWx0YTsKICAgICAgICAgUHlfVU5JQ09ERSAqcDsKIAogICAgICAgICAvKiByZXBsYWNlIHN0cmluZ3MgKi8KLSAgICAgICAgbiA9IGNvdW50KHNlbGYsIDAsIHNlbGYtPmxlbmd0aCwgc3RyMSk7CisgICAgICAgIG4gPSBzdHJpbmdsaWJfY291bnQoc2VsZi0+c3RyLCBzZWxmLT5sZW5ndGgsIHN0cjEtPnN0ciwgc3RyMS0+bGVuZ3RoKTsKICAgICAgICAgaWYgKG4gPiBtYXhjb3VudCkKICAgICAgICAgICAgIG4gPSBtYXhjb3VudDsKLSAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgLyogbm90aGluZyB0byByZXBsYWNlLCByZXR1cm4gb3JpZ2luYWwgc3RyaW5nICovCi0gICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgdSA9IHNlbGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB1ID0gKFB5VW5pY29kZU9iamVjdCAqKQotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc2VsZi0+c3RyLCBzZWxmLT5sZW5ndGgpOwotCSAgICB9CisgICAgICAgIGlmIChuID09IDApCisgICAgICAgICAgICBnb3RvIG5vdGhpbmc7CisgICAgICAgIC8qIG5ld19zaXplID0gc2VsZi0+bGVuZ3RoICsgbiAqIChzdHIyLT5sZW5ndGggLSBzdHIxLT5sZW5ndGgpKTsgKi8KKyAgICAgICAgZGVsdGEgPSAoc3RyMi0+bGVuZ3RoIC0gc3RyMS0+bGVuZ3RoKTsKKyAgICAgICAgaWYgKGRlbHRhID09IDApIHsKKyAgICAgICAgICAgIG5ld19zaXplID0gc2VsZi0+bGVuZ3RoOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdSA9IF9QeVVuaWNvZGVfTmV3KAotICAgICAgICAgICAgICAgIHNlbGYtPmxlbmd0aCArIG4gKiAoc3RyMi0+bGVuZ3RoIC0gc3RyMS0+bGVuZ3RoKSk7Ci0gICAgICAgICAgICBpZiAodSkgewotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgICAgIHAgPSB1LT5zdHI7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cjEtPmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPD0gc2VsZi0+bGVuZ3RoIC0gc3RyMS0+bGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5X1VOSUNPREVfTUFUQ0goc2VsZiwgaSwgc3RyMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBsYWNlIHN0cmluZyBzZWdtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERV9DT1BZKHAsIHN0cjItPnN0ciwgc3RyMi0+bGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IHN0cjItPmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IHN0cjEtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1uIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSByZW1haW5pbmcgcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9VTklDT0RFX0NPUFkocCwgc2VsZi0+c3RyK2ksIHNlbGYtPmxlbmd0aC1pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHNlbGYtPnN0cltpKytdOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERV9DT1BZKHAsIHN0cjItPnN0ciwgc3RyMi0+bGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gc3RyMi0+bGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tbiA8PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHNlbGYtPnN0cltpKytdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFB5X1VOSUNPREVfQ09QWShwLCBzZWxmLT5zdHIraSwgc2VsZi0+bGVuZ3RoLWkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2R1Y3QgPSBuICogKHN0cjItPmxlbmd0aCAtIHN0cjEtPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoKHByb2R1Y3QgLyAoc3RyMi0+bGVuZ3RoIC0gc3RyMS0+bGVuZ3RoKSkgIT0gbikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld19zaXplID0gc2VsZi0+bGVuZ3RoICsgcHJvZHVjdDsKKyAgICAgICAgICAgIGlmIChuZXdfc2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgdSA9IF9QeVVuaWNvZGVfTmV3KG5ld19zaXplKTsKKyAgICAgICAgaWYgKCF1KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGkgPSAwOworICAgICAgICBwID0gdS0+c3RyOworICAgICAgICBlID0gc2VsZi0+bGVuZ3RoIC0gc3RyMS0+bGVuZ3RoOworICAgICAgICBpZiAoc3RyMS0+bGVuZ3RoID4gMCkgeworICAgICAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAvKiBsb29rIGZvciBuZXh0IG1hdGNoICovCisgICAgICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGogPD0gZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoUHlfVU5JQ09ERV9NQVRDSChzZWxmLCBqLCBzdHIxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgfQorCQlpZiAoaiA+IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdW5jaGFuZ2VkIHBhcnQgW2k6al0gKi8KKyAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERV9DT1BZKHAsIHNlbGYtPnN0citpLCBqLWkpOworICAgICAgICAgICAgICAgICAgICBwICs9IGogLSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBjb3B5IHN1YnN0aXR1dGlvbiBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RyMi0+bGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9VTklDT0RFX0NPUFkocCwgc3RyMi0+c3RyLCBzdHIyLT5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBwICs9IHN0cjItPmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IGogKyBzdHIxLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IHNlbGYtPmxlbmd0aCkKKyAgICAgICAgICAgICAgICAvKiBjb3B5IHRhaWwgW2k6XSAqLworICAgICAgICAgICAgICAgIFB5X1VOSUNPREVfQ09QWShwLCBzZWxmLT5zdHIraSwgc2VsZi0+bGVuZ3RoLWkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogaW50ZXJsZWF2ZSAqLworICAgICAgICAgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgUHlfVU5JQ09ERV9DT1BZKHAsIHN0cjItPnN0ciwgc3RyMi0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwICs9IHN0cjItPmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoLS1uIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICpwKysgPSBzZWxmLT5zdHJbaSsrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X1VOSUNPREVfQ09QWShwLCBzZWxmLT5zdHIraSwgc2VsZi0+bGVuZ3RoLWkpOworICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIChQeU9iamVjdCAqKSB1OworCitub3RoaW5nOgorICAgIC8qIG5vdGhpbmcgdG8gcmVwbGFjZTsgcmV0dXJuIG9yaWdpbmFsIHN0cmluZyAod2hlbiBwb3NzaWJsZSkgKi8KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CisgICAgfQorICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc2VsZi0+c3RyLCBzZWxmLT5sZW5ndGgpOwogfQogCiAvKiAtLS0gVW5pY29kZSBPYmplY3QgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ5ODMsNTQgKzUwMzMsMjkgQEAKIGludCBQeVVuaWNvZGVfQ29udGFpbnMoUHlPYmplY3QgKmNvbnRhaW5lciwKIAkJICAgICAgIFB5T2JqZWN0ICplbGVtZW50KQogewotICAgIFB5VW5pY29kZU9iamVjdCAqdSA9IE5VTEwsICp2ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RyLCAqc3ViOwogICAgIGludCByZXN1bHQ7Ci0gICAgUHlfc3NpemVfdCBzaXplOwotICAgIHJlZ2lzdGVyIGNvbnN0IFB5X1VOSUNPREUgKmxocywgKmVuZCwgKnJoczsKIAogICAgIC8qIENvZXJjZSB0aGUgdHdvIGFyZ3VtZW50cyAqLwotICAgIHYgPSAoUHlVbmljb2RlT2JqZWN0ICopUHlVbmljb2RlX0Zyb21PYmplY3QoZWxlbWVudCk7Ci0gICAgaWYgKHYgPT0gTlVMTCkgeworICAgIHN1YiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGVsZW1lbnQpOworICAgIGlmICghc3ViKSB7CiAJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCIpOwotCWdvdG8gb25FcnJvcjsKLSAgICB9Ci0gICAgdSA9IChQeVVuaWNvZGVPYmplY3QgKilQeVVuaWNvZGVfRnJvbU9iamVjdChjb250YWluZXIpOwotICAgIGlmICh1ID09IE5VTEwpCi0JZ290byBvbkVycm9yOwotCi0gICAgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2KTsKLSAgICByaHMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KTsKLSAgICBsaHMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh1KTsKLQotICAgIHJlc3VsdCA9IDA7Ci0gICAgaWYgKHNpemUgPT0gMSkgewotCWVuZCA9IGxocyArIFB5VW5pY29kZV9HRVRfU0laRSh1KTsKLQl3aGlsZSAobGhzIDwgZW5kKSB7Ci0JICAgIGlmICgqbGhzKysgPT0gKnJocykgewotCQlyZXN1bHQgPSAxOwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JZW5kID0gbGhzICsgKFB5VW5pY29kZV9HRVRfU0laRSh1KSAtIHNpemUpOwotCXdoaWxlIChsaHMgPD0gZW5kKSB7Ci0JICAgIGlmIChtZW1jbXAobGhzKyssIHJocywgc2l6ZSAqIHNpemVvZihQeV9VTklDT0RFKSkgPT0gMCkgewotCQlyZXN1bHQgPSAxOwotCQlicmVhazsKLQkgICAgfQotCX0KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRih1KTsKLSAgICBQeV9ERUNSRUYodik7CisgICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3QoY29udGFpbmVyKTsKKyAgICBpZiAoIXN0cikgeworICAgICAgICBQeV9ERUNSRUYoc3ViKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJlc3VsdCA9IHN0cmluZ2xpYl9jb250YWluc19vYmooc3RyLCBzdWIpOworCisgICAgUHlfREVDUkVGKHN0cik7CisgICAgUHlfREVDUkVGKHN1Yik7CisKICAgICByZXR1cm4gcmVzdWx0OwotCi1vbkVycm9yOgotICAgIFB5X1hERUNSRUYodSk7Ci0gICAgUHlfWERFQ1JFRih2KTsKLSAgICByZXR1cm4gLTE7CiB9CiAKIC8qIENvbmNhdCB0byBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QgZ2l2aW5nIGEgbmV3IFVuaWNvZGUgb2JqZWN0LiAqLwpAQCAtNTA3OCw4ICs1MTAzLDggQEAKIFB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCiAiUy5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKIFxuXAotUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nIHN1YiBpbiBVbmljb2RlIHN0cmluZ1xuXAotU1tzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlXG5cCitSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nIHN1YiBpblxuXAorVW5pY29kZSBzdHJpbmcgU1tzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlXG5cCiBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTUwOTUsMjQgKzUxMjAsMTkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdWJzdHJpbmcgPSAoUHlVbmljb2RlT2JqZWN0ICopUHlVbmljb2RlX0Zyb21PYmplY3QoCi0JCQkJCQkoUHlPYmplY3QgKilzdWJzdHJpbmcpOworICAgICAgICAoUHlPYmplY3QgKilzdWJzdHJpbmcpOwogICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkKIAlyZXR1cm4gTlVMTDsKIAotICAgIGlmIChzdGFydCA8IDApCi0gICAgICAgIHN0YXJ0ICs9IHNlbGYtPmxlbmd0aDsKLSAgICBpZiAoc3RhcnQgPCAwKQotICAgICAgICBzdGFydCA9IDA7Ci0gICAgaWYgKGVuZCA+IHNlbGYtPmxlbmd0aCkKLSAgICAgICAgZW5kID0gc2VsZi0+bGVuZ3RoOwotICAgIGlmIChlbmQgPCAwKQotICAgICAgICBlbmQgKz0gc2VsZi0+bGVuZ3RoOwotICAgIGlmIChlbmQgPCAwKQotICAgICAgICBlbmQgPSAwOworICAgIEZJWF9TVEFSVF9FTkQoc2VsZik7CiAKLSAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZygobG9uZykgY291bnQoc2VsZiwgc3RhcnQsIGVuZCwgc3Vic3RyaW5nKSk7CisgICAgcmVzdWx0ID0gUHlJbnRfRnJvbVNzaXplX3QoCisgICAgICAgIHN0cmluZ2xpYl9jb3VudChzZWxmLT5zdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHJpbmctPnN0ciwgc3Vic3RyaW5nLT5sZW5ndGgpCisgICAgICAgICk7CiAKICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTUyNjIsMjMgKzUyODIsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2ZpbmQoUHlVbmljb2RlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKKyAgICBQeU9iamVjdCAqc3Vic3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IHJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmZpbmQiLCAmc3Vic3RyaW5nLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KAotCQkJCQkJKFB5T2JqZWN0ICopc3Vic3RyaW5nKTsKLSAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyaW5nKTsKKyAgICBpZiAoIXN1YnN0cmluZykKIAlyZXR1cm4gTlVMTDsKIAotICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Tc2l6ZV90KGZpbmRzdHJpbmcoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAxKSk7CisgICAgcmVzdWx0ID0gc3RyaW5nbGliX2ZpbmRfc2xpY2UoCisgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHNlbGYpLCBQeVVuaWNvZGVfR0VUX1NJWkUoc2VsZiksCisgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN1YnN0cmluZyksIFB5VW5pY29kZV9HRVRfU0laRShzdWJzdHJpbmcpLAorICAgICAgICBzdGFydCwgZW5kCisgICAgICAgICk7CiAKICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICByZXR1cm4gcmVzdWx0OworCisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC01MzI4LDI2ICs1MzUyLDMwIEBACiB1bmljb2RlX2luZGV4KFB5VW5pY29kZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7Ci0gICAgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmc7CisgICAgUHlPYmplY3QgKnN1YnN0cmluZzsKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKICAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6aW5kZXgiLCAmc3Vic3RyaW5nLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBzdWJzdHJpbmcgPSAoUHlVbmljb2RlT2JqZWN0ICopUHlVbmljb2RlX0Zyb21PYmplY3QoCi0JCQkJCQkoUHlPYmplY3QgKilzdWJzdHJpbmcpOwotICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkKKyAgICBzdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWJzdHJpbmcpOworICAgIGlmICghc3Vic3RyaW5nKQogCXJldHVybiBOVUxMOwogCi0gICAgcmVzdWx0ID0gZmluZHN0cmluZyhzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIDEpOworICAgIHJlc3VsdCA9IHN0cmluZ2xpYl9maW5kX3NsaWNlKAorICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzZWxmKSwgUHlVbmljb2RlX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdWJzdHJpbmcpLCBQeVVuaWNvZGVfR0VUX1NJWkUoc3Vic3RyaW5nKSwKKyAgICAgICAgc3RhcnQsIGVuZAorICAgICAgICApOwogCiAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN1YnN0cmluZyBub3QgZm91bmQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCiAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CiB9CiAKQEAgLTU3MDIsMTYgKzU3MzAsNiBAQAogCiAjZGVmaW5lIFNUUklQTkFNRShpKSAoc3RyaXBmb3JtYXRbaV0rMykKIAotc3RhdGljIGNvbnN0IFB5X1VOSUNPREUgKgotdW5pY29kZV9tZW1jaHIoY29uc3QgUHlfVU5JQ09ERSAqcywgUHlfVU5JQ09ERSBjLCBzaXplX3QgbikKLXsKLQlzaXplX3QgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCQlpZiAoc1tpXSA9PSBjKQotCQkJcmV0dXJuIHMraTsKLQlyZXR1cm4gTlVMTDsKLX0KLQogLyogZXh0ZXJuYWxseSB2aXNpYmxlIGZvciBzdHIuc3RyaXAodW5pY29kZSkgKi8KIFB5T2JqZWN0ICoKIF9QeVVuaWNvZGVfWFN0cmlwKFB5VW5pY29kZU9iamVjdCAqc2VsZiwgaW50IHN0cmlwdHlwZSwgUHlPYmplY3QgKnNlcG9iaikKQEAgLTU3MjIsMjcgKzU3NDAsMjkgQEAKIAlQeV9zc2l6ZV90IHNlcGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShzZXBvYmopOwogCVB5X3NzaXplX3QgaSwgajsKIAorICAgICAgICBCTE9PTV9NQVNLIHNlcG1hc2sgPSBtYWtlX2Jsb29tX21hc2soc2VwLCBzZXBsZW4pOworCiAJaSA9IDA7CiAJaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7Ci0JCXdoaWxlIChpIDwgbGVuICYmIHVuaWNvZGVfbWVtY2hyKHNlcCwgc1tpXSwgc2VwbGVuKSkgewotCQkJaSsrOwotCQl9CisgICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBCTE9PTV9NRU1CRVIoc2VwbWFzaywgc1tpXSwgc2VwLCBzZXBsZW4pKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQogCX0KIAogCWogPSBsZW47CiAJaWYgKHN0cmlwdHlwZSAhPSBMRUZUU1RSSVApIHsKLQkJZG8gewotCQkJai0tOwotCQl9IHdoaWxlIChqID49IGkgJiYgdW5pY29kZV9tZW1jaHIoc2VwLCBzW2pdLCBzZXBsZW4pKTsKLQkJaisrOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGogPj0gaSAmJiBCTE9PTV9NRU1CRVIoc2VwbWFzaywgc1tqXSwgc2VwLCBzZXBsZW4pKTsKKyAgICAgICAgICAgIGorKzsKIAl9CiAKIAlpZiAoaSA9PSAwICYmIGogPT0gbGVuICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KHNlbGYpKSB7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiAJfQogCWVsc2UKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShzK2ksIGotaSk7CisgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHMraSwgai1pKTsKIH0KIAogCkBAIC01ODk4LDkgKzU5MTgsMTkgQEAKIAogICAgIHAgPSB1LT5zdHI7CiAKLSAgICB3aGlsZSAobGVuLS0gPiAwKSB7Ci0gICAgICAgIFB5X1VOSUNPREVfQ09QWShwLCBzdHItPnN0ciwgc3RyLT5sZW5ndGgpOwotICAgICAgICBwICs9IHN0ci0+bGVuZ3RoOworICAgIGlmIChzdHItPmxlbmd0aCA9PSAxICYmIGxlbiA+IDApIHsKKyAgICAgICAgUHlfVU5JQ09ERV9GSUxMKHAsIHN0ci0+c3RyWzBdLCBsZW4pOworICAgIH0gZWxzZSB7CisJUHlfc3NpemVfdCBkb25lID0gMDsgLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIHRoaXMgZmFyICovCisJaWYgKGRvbmUgPCBuY2hhcnMpIHsKKyAgICAgICAgICAgIFB5X1VOSUNPREVfQ09QWShwLCBzdHItPnN0ciwgc3RyLT5sZW5ndGgpOworICAgICAgICAgICAgZG9uZSA9IHN0ci0+bGVuZ3RoOworCX0KKwl3aGlsZSAoZG9uZSA8IG5jaGFycykgeworICAgICAgICAgICAgaW50IG4gPSAoZG9uZSA8PSBuY2hhcnMtZG9uZSkgPyBkb25lIDogbmNoYXJzLWRvbmU7CisgICAgICAgICAgICBQeV9VTklDT0RFX0NPUFkocCtkb25lLCBwLCBuKTsKKyAgICAgICAgICAgIGRvbmUgKz0gbjsKKwl9CiAgICAgfQogCiAgICAgcmV0dXJuIChQeU9iamVjdCopIHU7CkBAIC01OTkzLDIzICs2MDIzLDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9yZmluZChQeVVuaWNvZGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nOworICAgIFB5T2JqZWN0ICpzdWJzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgcmVzdWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6cmZpbmQiLCAmc3Vic3RyaW5nLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KAotCQkJCQkJKFB5T2JqZWN0ICopc3Vic3RyaW5nKTsKLSAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyaW5nKTsKKyAgICBpZiAoIXN1YnN0cmluZykKIAlyZXR1cm4gTlVMTDsKIAotICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Tc2l6ZV90KGZpbmRzdHJpbmcoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSkpOworICAgIHJlc3VsdCA9IHN0cmluZ2xpYl9yZmluZF9zbGljZSgKKyAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc2VsZiksIFB5VW5pY29kZV9HRVRfU0laRShzZWxmKSwKKyAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3Vic3RyaW5nKSwgUHlVbmljb2RlX0dFVF9TSVpFKHN1YnN0cmluZyksCisgICAgICAgIHN0YXJ0LCBlbmQKKyAgICAgICAgKTsKIAogICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgIHJldHVybiByZXN1bHQ7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKIH0KIAogUHlEb2NfU1RSVkFSKHJpbmRleF9fZG9jX18sCkBAIC02MDIwLDIyICs2MDU0LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9yaW5kZXgoUHlVbmljb2RlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdDsKLSAgICBQeVVuaWNvZGVPYmplY3QgKnN1YnN0cmluZzsKKyAgICBQeU9iamVjdCAqc3Vic3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlfc3NpemVfdCByZXN1bHQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpyaW5kZXgiLCAmc3Vic3RyaW5nLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KAotCQkJCQkJKFB5T2JqZWN0ICopc3Vic3RyaW5nKTsKLSAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyaW5nKTsKKyAgICBpZiAoIXN1YnN0cmluZykKIAlyZXR1cm4gTlVMTDsKIAotICAgIHJlc3VsdCA9IGZpbmRzdHJpbmcoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7CisgICAgcmVzdWx0ID0gc3RyaW5nbGliX3JmaW5kX3NsaWNlKAorICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzZWxmKSwgUHlVbmljb2RlX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdWJzdHJpbmcpLCBQeVVuaWNvZGVfR0VUX1NJWkUoc3Vic3RyaW5nKSwKKyAgICAgICAgc3RhcnQsIGVuZAorICAgICAgICApOwogCiAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN1YnN0cmluZyBub3QgZm91bmQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02MTM3LDYgKzYxNzUsODcgQEAKIAlyZXR1cm4gUHlVbmljb2RlX1NwbGl0KChQeU9iamVjdCAqKXNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOwogfQogCitQeU9iamVjdCAqCitQeVVuaWNvZGVfUGFydGl0aW9uKFB5T2JqZWN0ICpzdHJfaW4sIFB5T2JqZWN0ICpzZXBfaW4pCit7CisgICAgUHlPYmplY3QqIHN0cl9vYmo7CisgICAgUHlPYmplY3QqIHNlcF9vYmo7CisgICAgUHlPYmplY3QqIG91dDsKKworICAgIHN0cl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHJfaW4pOworICAgIGlmICghc3RyX29iaikKKwlyZXR1cm4gTlVMTDsKKyAgICBzZXBfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc2VwX2luKTsKKyAgICBpZiAoIXNlcF9vYmopIHsKKyAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBvdXQgPSBzdHJpbmdsaWJfcGFydGl0aW9uKAorICAgICAgICBzdHJfb2JqLCBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHJfb2JqKSwgUHlVbmljb2RlX0dFVF9TSVpFKHN0cl9vYmopLAorICAgICAgICBzZXBfb2JqLCBQeVVuaWNvZGVfQVNfVU5JQ09ERShzZXBfb2JqKSwgUHlVbmljb2RlX0dFVF9TSVpFKHNlcF9vYmopCisgICAgICAgICk7CisKKyAgICBQeV9ERUNSRUYoc2VwX29iaik7CisgICAgUHlfREVDUkVGKHN0cl9vYmopOworCisgICAgcmV0dXJuIG91dDsKK30KKworCitQeU9iamVjdCAqCitQeVVuaWNvZGVfUlBhcnRpdGlvbihQeU9iamVjdCAqc3RyX2luLCBQeU9iamVjdCAqc2VwX2luKQoreworICAgIFB5T2JqZWN0KiBzdHJfb2JqOworICAgIFB5T2JqZWN0KiBzZXBfb2JqOworICAgIFB5T2JqZWN0KiBvdXQ7CisKKyAgICBzdHJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyX2luKTsKKyAgICBpZiAoIXN0cl9vYmopCisJcmV0dXJuIE5VTEw7CisgICAgc2VwX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcF9pbik7CisgICAgaWYgKCFzZXBfb2JqKSB7CisgICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgb3V0ID0gc3RyaW5nbGliX3JwYXJ0aXRpb24oCisgICAgICAgIHN0cl9vYmosIFB5VW5pY29kZV9BU19VTklDT0RFKHN0cl9vYmopLCBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyX29iaiksCisgICAgICAgIHNlcF9vYmosIFB5VW5pY29kZV9BU19VTklDT0RFKHNlcF9vYmopLCBQeVVuaWNvZGVfR0VUX1NJWkUoc2VwX29iaikKKyAgICAgICAgKTsKKworICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKKyAgICBQeV9ERUNSRUYoc3RyX29iaik7CisKKyAgICByZXR1cm4gb3V0OworfQorCitQeURvY19TVFJWQVIocGFydGl0aW9uX19kb2NfXywKKyJTLnBhcnRpdGlvbihzZXApIC0+IChoZWFkLCBzZXAsIHRhaWwpXG5cCitcblwKK1NlYXJjaGVzIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiBTLCBhbmQgcmV0dXJucyB0aGUgcGFydCBiZWZvcmUgaXQsXG5cCit0aGUgc2VwYXJhdG9yIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcblwKK2ZvdW5kLCByZXR1cm5zIFMgYW5kIHR3byBlbXB0eSBzdHJpbmdzLiIpOworCitzdGF0aWMgUHlPYmplY3QqCit1bmljb2RlX3BhcnRpdGlvbihQeVVuaWNvZGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXBhcmF0b3IpCit7CisgICAgcmV0dXJuIFB5VW5pY29kZV9QYXJ0aXRpb24oKFB5T2JqZWN0ICopc2VsZiwgc2VwYXJhdG9yKTsKK30KKworUHlEb2NfU1RSVkFSKHJwYXJ0aXRpb25fX2RvY19fLAorIlMucnBhcnRpdGlvbihzZXApIC0+IChoZWFkLCBzZXAsIHRhaWwpXG5cCitcblwKK1NlYXJjaGVzIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiBTLCBzdGFydGluZyBhdCB0aGUgZW5kIG9mIFMsIGFuZCByZXR1cm5zXG5cCit0aGUgcGFydCBiZWZvcmUgaXQsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuICBJZiB0aGVcblwKK3NlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgUyBhbmQgdHdvIGVtcHR5IHN0cmluZ3MuIik7CisKK3N0YXRpYyBQeU9iamVjdCoKK3VuaWNvZGVfcnBhcnRpdGlvbihQeVVuaWNvZGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXBhcmF0b3IpCit7CisgICAgcmV0dXJuIFB5VW5pY29kZV9SUGFydGl0aW9uKChQeU9iamVjdCAqKXNlbGYsIHNlcGFyYXRvcik7Cit9CisKIFB5T2JqZWN0ICpQeVVuaWNvZGVfUlNwbGl0KFB5T2JqZWN0ICpzLAogCQkJICAgUHlPYmplY3QgKnNlcCwKIAkJCSAgIFB5X3NzaXplX3QgbWF4c3BsaXQpCkBAIC02MzkwLDYgKzY1MDksNyBAQAogICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pIHVuaWNvZGVfY291bnQsIE1FVEhfVkFSQVJHUywgY291bnRfX2RvY19ffSwKICAgICB7ImV4cGFuZHRhYnMiLCAoUHlDRnVuY3Rpb24pIHVuaWNvZGVfZXhwYW5kdGFicywgTUVUSF9WQVJBUkdTLCBleHBhbmR0YWJzX19kb2NfX30sCiAgICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX2ZpbmQsIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAorICAgIHsicGFydGl0aW9uIiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX3BhcnRpdGlvbiwgTUVUSF9PLCBwYXJ0aXRpb25fX2RvY19ffSwKICAgICB7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX2luZGV4LCBNRVRIX1ZBUkFSR1MsIGluZGV4X19kb2NfX30sCiAgICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbikgdW5pY29kZV9sanVzdCwgTUVUSF9WQVJBUkdTLCBsanVzdF9fZG9jX199LAogICAgIHsibG93ZXIiLCAoUHlDRnVuY3Rpb24pIHVuaWNvZGVfbG93ZXIsIE1FVEhfTk9BUkdTLCBsb3dlcl9fZG9jX199LApAQCAtNjQwMCw2ICs2NTIwLDcgQEAKICAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbikgdW5pY29kZV9yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCiAgICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbikgdW5pY29kZV9yanVzdCwgTUVUSF9WQVJBUkdTLCByanVzdF9fZG9jX199LAogICAgIHsicnN0cmlwIiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX3JzdHJpcCwgTUVUSF9WQVJBUkdTLCByc3RyaXBfX2RvY19ffSwKKyAgICB7InJwYXJ0aXRpb24iLCAoUHlDRnVuY3Rpb24pIHVuaWNvZGVfcnBhcnRpdGlvbiwgTUVUSF9PLCBycGFydGl0aW9uX19kb2NfX30sCiAgICAgeyJzcGxpdGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX3NwbGl0bGluZXMsIE1FVEhfVkFSQVJHUywgc3BsaXRsaW5lc19fZG9jX199LAogICAgIHsic3RyaXAiLCAoUHlDRnVuY3Rpb24pIHVuaWNvZGVfc3RyaXAsIE1FVEhfVkFSQVJHUywgc3RyaXBfX2RvY19ffSwKICAgICB7InN3YXBjYXNlIiwgKFB5Q0Z1bmN0aW9uKSB1bmljb2RlX3N3YXBjYXNlLCBNRVRIX05PQVJHUywgc3dhcGNhc2VfX2RvY19ffSwKQEAgLTczNzUsNiArNzQ5NiwxOCBAQAogewogICAgIGludCBpOwogCisgICAgLyogWFhYIC0gbW92ZSB0aGlzIGFycmF5IHRvIHVuaWNvZGVjdHlwZS5jID8gKi8KKyAgICBQeV9VTklDT0RFIGxpbmVicmVha1tdID0geworICAgICAgICAweDAwMEEsIC8qIExJTkUgRkVFRCAqLworICAgICAgICAweDAwMEQsIC8qIENBUlJJQUdFIFJFVFVSTiAqLworICAgICAgICAweDAwMUMsIC8qIEZJTEUgU0VQQVJBVE9SICovCisgICAgICAgIDB4MDAxRCwgLyogR1JPVVAgU0VQQVJBVE9SICovCisgICAgICAgIDB4MDAxRSwgLyogUkVDT1JEIFNFUEFSQVRPUiAqLworICAgICAgICAweDAwODUsIC8qIE5FWFQgTElORSAqLworICAgICAgICAweDIwMjgsIC8qIExJTkUgU0VQQVJBVE9SICovCisgICAgICAgIDB4MjAyOSwgLyogUEFSQUdSQVBIIFNFUEFSQVRPUiAqLworICAgIH07CisKICAgICAvKiBJbml0IHRoZSBpbXBsZW1lbnRhdGlvbiAqLwogICAgIHVuaWNvZGVfZnJlZWxpc3QgPSBOVUxMOwogICAgIHVuaWNvZGVfZnJlZWxpc3Rfc2l6ZSA9IDA7CkBAIC03Mzg0LDYgKzc1MTcsMTEgQEAKIAl1bmljb2RlX2xhdGluMVtpXSA9IE5VTEw7CiAgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlVbmljb2RlX1R5cGUpIDwgMCkKIAlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplICd1bmljb2RlJyIpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbGluZWJyZWFrIGJsb29tIGZpbHRlciAqLworICAgIGJsb29tX2xpbmVicmVhayA9IG1ha2VfYmxvb21fbWFzaygKKyAgICAgICAgbGluZWJyZWFrLCBzaXplb2YobGluZWJyZWFrKSAvIHNpemVvZihsaW5lYnJlYWtbMF0pCisgICAgICAgICk7CiB9CiAKIC8qIEZpbmFsaXplIHRoZSBVbmljb2RlIGltcGxlbWVudGF0aW9uICovCmRpZmYgLS1naXQgYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCmluZGV4IDNmMmMyNjEuLjljMmE2MjYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCisrKyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCkBAIC04NDcsNyArODQ3LDcgQEAKIHN0YXRpYyB2b2lkCiBoYW5kbGVfY2FsbGJhY2soUHlXZWFrUmVmZXJlbmNlICpyZWYsIFB5T2JqZWN0ICpjYWxsYmFjaykKIHsKLSAgICBQeU9iamVjdCAqY2JyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2FsbGJhY2ssICJPIiwgcmVmKTsKKyAgICBQeU9iamVjdCAqY2JyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNhbGxiYWNrLCByZWYsIE5VTEwpOwogCiAgICAgaWYgKGNicmVzdWx0ID09IE5VTEwpCiAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYmFjayk7CmRpZmYgLS1naXQgYS9QQy9jb25maWcuYyBiL1BDL2NvbmZpZy5jCmluZGV4IDc1ZTFhM2MuLmJlMTFkM2YgMTAwNjQ0Ci0tLSBhL1BDL2NvbmZpZy5jCisrKyBiL1BDL2NvbmZpZy5jCkBAIC0yOCw3ICsyOCw2IEBACiBleHRlcm4gdm9pZCBpbml0X3NoYTI1Nih2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfc2hhNTEyKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdHN0cm9wKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdHN0cnVjdCh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXR0aW1lKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdHRocmVhZCh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRjU3RyaW5nSU8odm9pZCk7CkBAIC01Myw2ICs1Miw3IEBACiBleHRlcm4gdm9pZCBpbml0X3NyZSh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRwYXJzZXIodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0X3dpbnJlZyh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfc3RydWN0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdGRhdGV0aW1lKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdGZ1bmN0aW9uYWwodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0emxpYih2b2lkKTsKQEAgLTEwMiw3ICsxMDIsNiBAQAogICAgICAgICB7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCiAgICAgICAgIHsiX3NoYTUxMiIsIGluaXRfc2hhNTEyfSwKICAgICAgICAgeyJzdHJvcCIsIGluaXRzdHJvcH0sCi0gICAgICAgIHsic3RydWN0IiwgaW5pdHN0cnVjdH0sCiAgICAgICAgIHsidGltZSIsIGluaXR0aW1lfSwKICNpZmRlZiBXSVRIX1RIUkVBRAogICAgICAgICB7InRocmVhZCIsIGluaXR0aHJlYWR9LApAQCAtMTMxLDYgKzEzMCw3IEBACiAJeyJfc3JlIiwgaW5pdF9zcmV9LAogCXsicGFyc2VyIiwgaW5pdHBhcnNlcn0sCiAJeyJfd2lucmVnIiwgaW5pdF93aW5yZWd9LAorCXsiX3N0cnVjdCIsIGluaXRfc3RydWN0fSwKIAl7ImRhdGV0aW1lIiwgaW5pdGRhdGV0aW1lfSwKIAl7ImZ1bmN0aW9uYWwiLCBpbml0ZnVuY3Rpb25hbH0sCiAKZGlmZiAtLWdpdCBhL1BDL2Vycm1hcC5oIGIvUEMvZXJybWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhZWVhMQotLS0gL2Rldi9udWxsCisrKyBiL1BDL2Vycm1hcC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIEdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdC4gKi8KK2ludCB3aW5lcnJvcl90b19lcnJubyhpbnQgd2luZXJyb3IpCit7CisJc3dpdGNoKHdpbmVycm9yKSB7CisJCWNhc2UgMjogcmV0dXJuIDI7CisJCWNhc2UgMzogcmV0dXJuIDI7CisJCWNhc2UgNDogcmV0dXJuIDI0OworCQljYXNlIDU6IHJldHVybiAxMzsKKwkJY2FzZSA2OiByZXR1cm4gOTsKKwkJY2FzZSA3OiByZXR1cm4gMTI7CisJCWNhc2UgODogcmV0dXJuIDEyOworCQljYXNlIDk6IHJldHVybiAxMjsKKwkJY2FzZSAxMDogcmV0dXJuIDc7CisJCWNhc2UgMTE6IHJldHVybiA4OworCQljYXNlIDE1OiByZXR1cm4gMjsKKwkJY2FzZSAxNjogcmV0dXJuIDEzOworCQljYXNlIDE3OiByZXR1cm4gMTg7CisJCWNhc2UgMTg6IHJldHVybiAyOworCQljYXNlIDE5OiByZXR1cm4gMTM7CisJCWNhc2UgMjA6IHJldHVybiAxMzsKKwkJY2FzZSAyMTogcmV0dXJuIDEzOworCQljYXNlIDIyOiByZXR1cm4gMTM7CisJCWNhc2UgMjM6IHJldHVybiAxMzsKKwkJY2FzZSAyNDogcmV0dXJuIDEzOworCQljYXNlIDI1OiByZXR1cm4gMTM7CisJCWNhc2UgMjY6IHJldHVybiAxMzsKKwkJY2FzZSAyNzogcmV0dXJuIDEzOworCQljYXNlIDI4OiByZXR1cm4gMTM7CisJCWNhc2UgMjk6IHJldHVybiAxMzsKKwkJY2FzZSAzMDogcmV0dXJuIDEzOworCQljYXNlIDMxOiByZXR1cm4gMTM7CisJCWNhc2UgMzI6IHJldHVybiAxMzsKKwkJY2FzZSAzMzogcmV0dXJuIDEzOworCQljYXNlIDM0OiByZXR1cm4gMTM7CisJCWNhc2UgMzU6IHJldHVybiAxMzsKKwkJY2FzZSAzNjogcmV0dXJuIDEzOworCQljYXNlIDUzOiByZXR1cm4gMjsKKwkJY2FzZSA2NTogcmV0dXJuIDEzOworCQljYXNlIDY3OiByZXR1cm4gMjsKKwkJY2FzZSA4MDogcmV0dXJuIDE3OworCQljYXNlIDgyOiByZXR1cm4gMTM7CisJCWNhc2UgODM6IHJldHVybiAxMzsKKwkJY2FzZSA4OTogcmV0dXJuIDExOworCQljYXNlIDEwODogcmV0dXJuIDEzOworCQljYXNlIDEwOTogcmV0dXJuIDMyOworCQljYXNlIDExMjogcmV0dXJuIDI4OworCQljYXNlIDExNDogcmV0dXJuIDk7CisJCWNhc2UgMTI4OiByZXR1cm4gMTA7CisJCWNhc2UgMTI5OiByZXR1cm4gMTA7CisJCWNhc2UgMTMwOiByZXR1cm4gOTsKKwkJY2FzZSAxMzI6IHJldHVybiAxMzsKKwkJY2FzZSAxNDU6IHJldHVybiA0MTsKKwkJY2FzZSAxNTg6IHJldHVybiAxMzsKKwkJY2FzZSAxNjE6IHJldHVybiAyOworCQljYXNlIDE2NDogcmV0dXJuIDExOworCQljYXNlIDE2NzogcmV0dXJuIDEzOworCQljYXNlIDE4MzogcmV0dXJuIDE3OworCQljYXNlIDE4ODogcmV0dXJuIDg7CisJCWNhc2UgMTg5OiByZXR1cm4gODsKKwkJY2FzZSAxOTA6IHJldHVybiA4OworCQljYXNlIDE5MTogcmV0dXJuIDg7CisJCWNhc2UgMTkyOiByZXR1cm4gODsKKwkJY2FzZSAxOTM6IHJldHVybiA4OworCQljYXNlIDE5NDogcmV0dXJuIDg7CisJCWNhc2UgMTk1OiByZXR1cm4gODsKKwkJY2FzZSAxOTY6IHJldHVybiA4OworCQljYXNlIDE5NzogcmV0dXJuIDg7CisJCWNhc2UgMTk4OiByZXR1cm4gODsKKwkJY2FzZSAxOTk6IHJldHVybiA4OworCQljYXNlIDIwMDogcmV0dXJuIDg7CisJCWNhc2UgMjAxOiByZXR1cm4gODsKKwkJY2FzZSAyMDI6IHJldHVybiA4OworCQljYXNlIDIwNjogcmV0dXJuIDI7CisJCWNhc2UgMjE1OiByZXR1cm4gMTE7CisJCWNhc2UgMTgxNjogcmV0dXJuIDEyOworCQlkZWZhdWx0OiByZXR1cm4gRUlOVkFMOworCX0KK30KZGlmZiAtLWdpdCBhL1BDL2Vycm1hcC5tYWsgYi9QQy9lcnJtYXAubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmJjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9lcnJtYXAubWFrCkBAIC0wLDAgKzEsNSBAQAorZXJybWFwLmg6CWdlbmVycm1hcC5leGUKKwkuXGdlbmVycm1hcC5leGUgPiBlcnJtYXAuaAorCitnZW5lcm1hcC5leGU6CWdlbmVycm1hcC5jCisJY2wgZ2VuZXJybWFwLmMKZGlmZiAtLWdpdCBhL1BDL2V4YW1wbGVfbnQvZXhhbXBsZS5jIGIvUEMvZXhhbXBsZV9udC9leGFtcGxlLmMKaW5kZXggNjM2ODJmMS4uNDZjYjQyOSAxMDA2NDQKLS0tIGEvUEMvZXhhbXBsZV9udC9leGFtcGxlLmMKKysrIGIvUEMvZXhhbXBsZV9udC9leGFtcGxlLmMKQEAgLTEzLDcgKzEzLDcgQEAKIAl7TlVMTCwgTlVMTH0KIH07CiAKLXZvaWQKK1B5TU9ESU5JVF9GVU5DCiBpbml0ZXhhbXBsZSh2b2lkKQogewogCVB5X0luaXRNb2R1bGUoImV4YW1wbGUiLCBleGFtcGxlX21ldGhvZHMpOwpkaWZmIC0tZ2l0IGEvUEMvZXhhbXBsZV9udC9leGFtcGxlLmRlZiBiL1BDL2V4YW1wbGVfbnQvZXhhbXBsZS5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YjY5YTUuLjAwMDAwMDAKLS0tIGEvUEMvZXhhbXBsZV9udC9leGFtcGxlLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotRVhQT1JUUwotCWluaXRleGFtcGxlCmRpZmYgLS1naXQgYS9QQy9leGFtcGxlX250L2V4YW1wbGUudmNwcm9qIGIvUEMvZXhhbXBsZV9udC9leGFtcGxlLnZjcHJvagppbmRleCAwZTY4MzBiLi43YzBkNGJiIDEwMDY0NAotLS0gYS9QQy9leGFtcGxlX250L2V4YW1wbGUudmNwcm9qCisrKyBiL1BDL2V4YW1wbGVfbnQvZXhhbXBsZS52Y3Byb2oKQEAgLTM5LDEyICszOSwxMiBAQAogCQkJPFRvb2wKIAkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCiAJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9leHBvcnQ6aW5pdGV4YW1wbGUiCi0JCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgcHl0aG9uMjQubGliIgotCQkJCU91dHB1dEZpbGU9Ii5cUmVsZWFzZS9leGFtcGxlLmRsbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBweXRob24yNS5saWIiCisJCQkJT3V0cHV0RmlsZT0iLlxSZWxlYXNlL2V4YW1wbGUucHlkIgogCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9IlRSVUUiCiAJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iLi5cUENidWlsZCIKLQkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iLlxleGFtcGxlLmRlZiIKKwkJCQlNb2R1bGVEZWZpbml0aW9uRmlsZT0iIgogCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cUmVsZWFzZS9leGFtcGxlLnBkYiIKIAkJCQlTdWJTeXN0ZW09IjIiCiAJCQkJSW1wb3J0TGlicmFyeT0iLlxSZWxlYXNlL2V4YW1wbGUubGliIgpAQCAtMTA1LDEyICsxMDUsMTIgQEAKIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgogCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvZXhwb3J0OmluaXRleGFtcGxlIgotCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmMzMi5saWIgb2RiY2NwMzIubGliIHB5dGhvbjI0X2QubGliIgotCQkJCU91dHB1dEZpbGU9Ii5cRGVidWcvZXhhbXBsZV9kLmRsbCIKKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBweXRob24yNV9kLmxpYiIKKwkJCQlPdXRwdXRGaWxlPSIuXERlYnVnL2V4YW1wbGVfZC5weWQiCiAJCQkJTGlua0luY3JlbWVudGFsPSIxIgogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0iVFJVRSIKIAkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIuLlxQQ2J1aWxkIgotCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIuXGV4YW1wbGUuZGVmIgorCQkJCU1vZHVsZURlZmluaXRpb25GaWxlPSIiCiAJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJUUlVFIgogCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cRGVidWcvZXhhbXBsZV9kLnBkYiIKIAkJCQlTdWJTeXN0ZW09IjIiCkBAIC0xNzEsOSArMTcxLDYgQEAKIAkJCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1M7JChOb0luaGVyaXQpIi8+CiAJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4KIAkJCTwvRmlsZT4KLQkJCTxGaWxlCi0JCQkJUmVsYXRpdmVQYXRoPSJleGFtcGxlLmRlZiI+Ci0JCQk8L0ZpbGU+CiAJCTwvRmlsdGVyPgogCQk8RmlsdGVyCiAJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCmRpZmYgLS1naXQgYS9QQy9nZW5lcnJtYXAuYyBiL1BDL2dlbmVycm1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjUwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9QQy9nZW5lcnJtYXAuYwpAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiBFeHRyYWN0IHRoZSBtYXBwaW5nIG9mIFdpbjMyIGVycm9yIGNvZGVzIHRvIGVycm5vICovCisKK2ludCBtYWluKCkKK3sKKwlpbnQgaTsKKwlwcmludGYoIi8qIEdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdC4gKi9cbiIpOworCXByaW50ZigiaW50IHdpbmVycm9yX3RvX2Vycm5vKGludCB3aW5lcnJvcilcbiIpOworCXByaW50Zigie1xuXHRzd2l0Y2god2luZXJyb3IpIHtcbiIpOworCWZvcihpPTE7IGkgPCA2NTAwMDsgaSsrKSB7CisJCV9kb3NtYXBlcnIoaSk7CisJCWlmIChlcnJubyA9PSBFSU5WQUwpCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCJcdFx0Y2FzZSAlZDogcmV0dXJuICVkO1xuIiwgaSwgZXJybm8pOworCX0KKwlwcmludGYoIlx0XHRkZWZhdWx0OiByZXR1cm4gRUlOVkFMO1xuIik7CisJcHJpbnRmKCJcdH1cbn1cbiIpOworfQpkaWZmIC0tZ2l0IGEvUEMvcHkuaWNvIGIvUEMvcHkuaWNvCmluZGV4IGY3MTRlZWEuLjExNDg2NGEgMTAwNjQ0Ci0tLSBhL1BDL3B5LmljbworKysgYi9QQy9weS5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvUEMvcHljLmljbyBiL1BDL3B5Yy5pY28KaW5kZXggMmJmMmUxNi4uODE1NWI5OSAxMDA2NDQKLS0tIGEvUEMvcHljLmljbworKysgYi9QQy9weWMuaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL3B5Y29uLmljbyBiL1BDL3B5Y29uLmljbwppbmRleCBhNTQ2ODJkLi43ZmFhN2NlIDEwMDY0NAotLS0gYS9QQy9weWNvbi5pY28KKysrIGIvUEMvcHljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDL3B5Y29uZmlnLmggYi9QQy9weWNvbmZpZy5oCmluZGV4IDZjNzg0NmUuLmNiNDIxMzEgMTAwNjQ0Ci0tLSBhL1BDL3B5Y29uZmlnLmgKKysrIGIvUEMvcHljb25maWcuaApAQCAtMTQsNiArMTQsNyBAQAogTVNfV0lONjQgLSBDb2RlIHNwZWNpZmljIHRvIHRoZSBNUyBXaW42NCBBUEkKIE1TX1dJTjMyIC0gQ29kZSBzcGVjaWZpYyB0byB0aGUgTVMgV2luMzIgKGFuZCBXaW42NCkgQVBJIChvYnNvbGV0ZSwgdGhpcyBjb3ZlcnMgYWxsIHN1cHBvcnRlZCBBUElzKQogTVNfV0lORE9XUyAtIENvZGUgc3BlY2lmaWMgdG8gV2luZG93cywgYnV0IGFsbCB2ZXJzaW9ucy4KK01TX1dJTkNFIC0gQ29kZSBzcGVjaWZpYyB0byBXaW5kb3dzIENFCiBQeV9FTkFCTEVfU0hBUkVEIC0gQ29kZSBpZiB0aGUgUHl0aG9uIGNvcmUgaXMgYnVpbHQgYXMgYSBETEwuCiAKIEFsc28gbm90ZSB0aGF0IG5laXRoZXIgIl9NX0lYODYiIG9yICJfTVNDX1ZFUiIgc2hvdWxkIGJlIHVzZWQgZm9yCkBAIC0yNyw2ICsyOCwxMCBAQAogCiAqLwogCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBNU19XSU5DRQorI2VuZGlmCisKIC8qIFZpc3VhbCBTdHVkaW8gMjAwNSBpbnRyb2R1Y2VzIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZvcgogICAgImluc2VjdXJlIiBhbmQgUE9TSVggZnVuY3Rpb25zLiBUaGUgaW5zZWN1cmUgZnVuY3Rpb25zIHNob3VsZAogICAgYmUgcmVwbGFjZWQgYnkgKl9zIHZlcnNpb25zIChhY2NvcmRpbmcgdG8gTWljcm9zb2Z0KTsgdGhlCkBAIC0zNywxNSArNDIsMjMgQEAKICNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIDEKICNkZWZpbmUgX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSAxCiAKLSNpbmNsdWRlIDxpby5oPgorLyogV2luZG93cyBDRSBkb2VzIG5vdCBoYXZlIHRoZXNlICovCisjaWZuZGVmIE1TX1dJTkNFCisjZGVmaW5lIEhBVkVfSU9fSAogI2RlZmluZSBIQVZFX1NZU19VVElNRV9ICi0jZGVmaW5lIEhBVkVfSFlQT1QKICNkZWZpbmUgSEFWRV9URU1QTkFNCiAjZGVmaW5lIEhBVkVfVE1QRklMRQogI2RlZmluZSBIQVZFX1RNUE5BTQogI2RlZmluZSBIQVZFX0NMT0NLCi0jZGVmaW5lIEhBVkVfU1RSRlRJTUUKICNkZWZpbmUgSEFWRV9TVFJFUlJPUgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lPX0gKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNkZWZpbmUgSEFWRV9IWVBPVAorI2RlZmluZSBIQVZFX1NUUkZUSU1FCiAjZGVmaW5lIERPTlRfSEFWRV9TSUdfQUxBUk0KICNkZWZpbmUgRE9OVF9IQVZFX1NJR19QQVVTRQogI2RlZmluZSBMT05HX0JJVAkzMgpAQCAtNjQsNiArNzcsMTEgQEAKICNkZWZpbmUgVVNFX1NPQ0tFVAogI2VuZGlmCiAKKyNpZmRlZiBNU19XSU5DRQorI2RlZmluZSBET05UX0hBVkVfU1lTX1NUQVRfSAorI2RlZmluZSBET05UX0hBVkVfRVJSTk9fSAorI2VuZGlmCisKIC8qIENvbXBpbGVyIHNwZWNpZmljIGRlZmluZXMgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTExNyw2ICsxMzUsMTEgQEAKICNlbmRpZgogI2VuZGlmIC8qIE1TX1dJTjY0ICovCiAKKy8qIF9XNjQgaXMgbm90IGRlZmluZWQgZm9yIFZDNiBvciBlVkM0ICovCisjaWZuZGVmIF9XNjQKKyNkZWZpbmUgX1c2NAorI2VuZGlmCisKIC8qIERlZmluZSBsaWtlIHNpemVfdCwgb21pdHRpbmcgdGhlICJ1bnNpZ25lZCIgKi8KICNpZmRlZiBNU19XSU42NAogdHlwZWRlZiBfX2ludDY0IHNzaXplX3Q7CkBAIC0xMzksNiArMTYyLDcgQEAKICNpbmNsdWRlIDxmbG9hdC5oPgogI2RlZmluZSBQeV9JU19OQU4gX2lzbmFuCiAjZGVmaW5lIFB5X0lTX0lORklOSVRZKFgpICghX2Zpbml0ZShYKSAmJiAhX2lzbmFuKFgpKQorI2RlZmluZSBQeV9JU19GSU5JVEUoWCkgX2Zpbml0ZShYKQogCiAjZW5kaWYgLyogX01TQ19WRVIgKi8KIApAQCAtMjk1LDE0ICszMTksMjEgQEAKICNkZWZpbmUgU0laRU9GX0lOVCA0CiAjZGVmaW5lIFNJWkVPRl9MT05HIDQKICNkZWZpbmUgU0laRU9GX0xPTkdfTE9ORyA4CisjZGVmaW5lIFNJWkVPRl9ET1VCTEUgOAorI2RlZmluZSBTSVpFT0ZfRkxPQVQgNAogCiAvKiBWQyA3LjEgaGFzIHRoZW0gYW5kIFZDIDYuMCBkb2VzIG5vdC4gIFZDIDYuMCBoYXMgYSB2ZXJzaW9uIG51bWJlciBvZiAxMjAwLgorICAgTWljcm9zb2Z0IGVNYmVkZGVkIFZpc3VhbCBDKysgNC4wIGhhcyBhIHZlcnNpb24gbnVtYmVyIG9mIDEyMDEgYW5kIGRvZXNuJ3QKKyAgIGRlZmluZSB0aGVzZS4KICAgIElmIHNvbWUgY29tcGlsZXIgZG9lcyBub3QgcHJvdmlkZSB0aGVtLCBtb2RpZnkgdGhlICNpZiBhcHByb3ByaWF0ZWx5LiAqLwogI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jaWYgX01TQ19WRVIgPiAxMjAwCisjaWYgX01TQ19WRVIgPiAxMjAxCiAjZGVmaW5lIEhBVkVfVUlOVFBUUl9UIDEKICNkZWZpbmUgSEFWRV9JTlRQVFJfVCAxCi0jZW5kaWYgIC8qIF9NU0NfVkVSID4gMTIwMCAgKi8gCisjZWxzZQorLyogVkM2ICYgZVZDNCBkb24ndCBzdXBwb3J0IHRoZSBDOTkgTEwgc3VmZml4IGZvciA2NC1iaXQgaW50ZWdlciBsaXRlcmFscyAqLworI2RlZmluZSBQeV9MTCh4KSB4IyNJNjQKKyNlbmRpZiAgLyogX01TQ19WRVIgPiAxMjAwICAqLwogI2VuZGlmICAvKiBfTVNDX1ZFUiAqLwogCiAjZW5kaWYKQEAgLTM5Nyw3ICs0MjgsOSBAQAogLyogI2RlZmluZSBIQVZFX0FMVFpPTkUgKi8KIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLworI2lmbmRlZiBNU19XSU5DRQogI2RlZmluZSBIQVZFX1BVVEVOVgorI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KICNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCkBAIC00NDUsNyArNDc4LDkgQEAKICNkZWZpbmUgSEFWRV9EWU5BTUlDX0xPQURJTkcKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIGZ0aW1lLiAgKi8KKyNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9GVElNRQorI2VuZGlmCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSBnZXRwZWVybmFtZS4gICovCiAjZGVmaW5lIEhBVkVfR0VUUEVFUk5BTUUKQEAgLTQ1NCw3ICs0ODksOSBAQAogLyogI3VuZGVmIEhBVkVfR0VUUEdSUCAqLwogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgZ2V0cGlkLiAgKi8KKyNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9HRVRQSUQKKyNlbmRpZgogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgZ2V0dGltZW9mZGF5LiAgKi8KIC8qICN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWSAqLwpAQCAtNTExLDEzICs1NDgsMTcgQEAKIC8qICN1bmRlZiBIQVZFX1dBSVRQSUQgKi8KIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3Y3Njb2xsJyBmdW5jdGlvbi4gKi8KKyNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9XQ1NDT0xMIDEKKyNlbmRpZgogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gICovCiAvKiAjdW5kZWYgSEFWRV9ETEZDTl9IICovCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKyNlbmRpZgogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gcHJvdG90eXBlcy4gICovCiAjZGVmaW5lIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKZGlmZiAtLWdpdCBhL1BDYnVpbGQvX2JzZGRiLnZjcHJvaiBiL1BDYnVpbGQvX2JzZGRiLnZjcHJvagppbmRleCA1ODFjM2ZjLi40YTYxMmE0IDEwMDY0NAotLS0gYS9QQ2J1aWxkL19ic2RkYi52Y3Byb2oKKysrIGIvUENidWlsZC9fYnNkZGIudmNwcm9qCkBAIC0xOTIsNyArMTkyLDcgQEAKIAkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iCiAJCQkJT3B0aW1pemF0aW9uPSIyIgogCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGU7Li5cUEM7JnF1b3Q7Li5cLi5cZGItNC40LjIwXGJ1aWxkX3dpbjMyJnF1b3Q7IgpkaWZmIC0tZ2l0IGEvUENidWlsZC9fZWxlbWVudHRyZWUudmNwcm9qIGIvUENidWlsZC9fZWxlbWVudHRyZWUudmNwcm9qCmluZGV4IDMyNzg4NzQuLmRlYzQ4ZTMgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX2VsZW1lbnR0cmVlLnZjcHJvagorKysgYi9QQ2J1aWxkL19lbGVtZW50dHJlZS52Y3Byb2oKQEAgLTE5MCw3ICsxOTAsNyBAQAogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04gL0dTLSIKIAkJCQlPcHRpbWl6YXRpb249IjIiCiAJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCiAJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlxNb2R1bGVzXGV4cGF0IgpkaWZmIC0tZ2l0IGEvUENidWlsZC9fbXNpLnZjcHJvaiBiL1BDYnVpbGQvX21zaS52Y3Byb2oKaW5kZXggNTAzYzE3NC4uZmI4OTI1ZSAxMDA2NDQKLS0tIGEvUENidWlsZC9fbXNpLnZjcHJvagorKysgYi9QQ2J1aWxkL19tc2kudmNwcm9qCkBAIC0xODksNyArMTg5LDcgQEAKIAkJCUNoYXJhY3RlclNldD0iMiI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iCiAJCQkJT3B0aW1pemF0aW9uPSIyIgogCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgogCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIgotCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImZjaS5saWIgbXNpLmxpYiBycGNydDQubGliIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImZjaS5saWIgbXNpLmxpYiBycGNydDQubGliIGJ1ZmZlcm92ZXJmbG93VS5saWIiCiAJCQkJT3V0cHV0RmlsZT0iLi9fbXNpLnB5ZCIKIAkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgpkaWZmIC0tZ2l0IGEvUENidWlsZC9fc29ja2V0LnZjcHJvaiBiL1BDYnVpbGQvX3NvY2tldC52Y3Byb2oKaW5kZXggYmRmYzlkOS4uMjJmYjQ5MiAxMDA2NDQKLS0tIGEvUENidWlsZC9fc29ja2V0LnZjcHJvagorKysgYi9QQ2J1aWxkL19zb2NrZXQudmNwcm9qCkBAIC0xODksNyArMTg5LDcgQEAKIAkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJGQUxTRSI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iCiAJCQkJT3B0aW1pemF0aW9uPSIyIgogCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiCmRpZmYgLS1naXQgYS9QQ2J1aWxkL19zcWxpdGUzLnZjcHJvaiBiL1BDYnVpbGQvX3NxbGl0ZTMudmNwcm9qCmluZGV4IGU4MWQzYTAuLmEwNDA4YTYgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX3NxbGl0ZTMudmNwcm9qCisrKyBiL1BDYnVpbGQvX3NxbGl0ZTMudmNwcm9qCkBAIC0yNTEsMTggKzI1MSwxMiBAQAogCTwvUmVmZXJlbmNlcz4KIAk8RmlsZXM+CiAJCTxGaWxlCi0JCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxhZGFwdGVycy5jIj4KLQkJPC9GaWxlPgotCQk8RmlsZQogCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcY2FjaGUuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXGNvbm5lY3Rpb24uYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKLQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXGNvbnZlcnRlcnMuYyI+Ci0JCTwvRmlsZT4KLQkJPEZpbGUKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXGN1cnNvci5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQpkaWZmIC0tZ2l0IGEvUENidWlsZC9fdGVzdGNhcGkudmNwcm9qIGIvUENidWlsZC9fdGVzdGNhcGkudmNwcm9qCmluZGV4IGYyODZhMzAuLmM1ODMzMWUgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX3Rlc3RjYXBpLnZjcHJvagorKysgYi9QQ2J1aWxkL190ZXN0Y2FwaS52Y3Byb2oKQEAgLTE4NSw3ICsxODUsNyBAQAogCQkJQ2hhcmFjdGVyU2V0PSIyIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04gL0dTLSIKIAkJCQlPcHRpbWl6YXRpb249IjIiCiAJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCiAJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyIKZGlmZiAtLWdpdCBhL1BDYnVpbGQvX3RraW50ZXIudmNwcm9qIGIvUENidWlsZC9fdGtpbnRlci52Y3Byb2oKaW5kZXggNTdiNzYwNi4uNGZmZWFlNSAxMDA2NDQKLS0tIGEvUENidWlsZC9fdGtpbnRlci52Y3Byb2oKKysrIGIvUENidWlsZC9fdGtpbnRlci52Y3Byb2oKQEAgLTE5Miw3ICsxOTIsNyBAQAogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04gL0dTLSIKIAkJCQlPcHRpbWl6YXRpb249IjIiCiAJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCiAJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cdGNsdGtcaW5jbHVkZSwuLlxJbmNsdWRlLC4uXFBDIgpkaWZmIC0tZ2l0IGEvUENidWlsZC9iejIudmNwcm9qIGIvUENidWlsZC9iejIudmNwcm9qCmluZGV4IDg0MWU5NGQuLjhjYmUxNWEgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvYnoyLnZjcHJvagorKysgYi9QQ2J1aWxkL2J6Mi52Y3Byb2oKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKLQkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04gL0dTLSIKIAkJCQlPcHRpbWl6YXRpb249IjIiCiAJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiCiAJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlwuLlxiemlwMi0xLjAuMyIKZGlmZiAtLWdpdCBhL1BDYnVpbGQvaW5zdGFsbGVyLmJtcCBiL1BDYnVpbGQvaW5zdGFsbGVyLmJtcAppbmRleCA2YzU2NTY5Li4xODc1ZTE5IDEwMDY0NAotLS0gYS9QQ2J1aWxkL2luc3RhbGxlci5ibXAKKysrIGIvUENidWlsZC9pbnN0YWxsZXIuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2ogYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmNwcm9qCmluZGV4IDkxMGRiYjEuLmMzN2U5YjkgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2oKKysrIGIvUENidWlsZC9weXRob25jb3JlLnZjcHJvagpAQCAtMjExLDcgKzIxMSw3IEBACiAJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iRkFMU0UiPgogCQkJPFRvb2wKIAkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgotCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvWm0yMDAgIC9VU0VDTDpNU19PUFRFUk9OIgorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvWm0yMDAgIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iCiAJCQkJT3B0aW1pemF0aW9uPSIyIgogCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiCkBAIC0zNDQsNiArMzQ0LDkgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfYmlzZWN0bW9kdWxlLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3N0cnVjdC5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQogCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNqa2NvZGVjc1xfY29kZWNzX2NuLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCkBAIC00OTEsNyArNDk0LDcgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGVycm9ycy5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQotCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZXhjZXB0aW9ucy5jIj4KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xleGNlcHRpb25zLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcZmlsZW9iamVjdC5jIj4KQEAgLTc0Niw5ICs3NDksNiBAQAogCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cc3RydWN0bWVtYmVyLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCi0JCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcc3RydWN0bW9kdWxlLmMiPgotCQk8L0ZpbGU+Ci0JCTxGaWxlCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcc3RydWN0c2VxLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3VuaWNvZGVkYXRhLnZjcHJvaiBiL1BDYnVpbGQvdW5pY29kZWRhdGEudmNwcm9qCmluZGV4IGU0OGU1MzUuLjQ3MmI2YjcgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvdW5pY29kZWRhdGEudmNwcm9qCisrKyBiL1BDYnVpbGQvdW5pY29kZWRhdGEudmNwcm9qCkBAIC0xODUsNyArMTg1LDcgQEAKIAkJCUNoYXJhY3RlclNldD0iMiI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iCiAJCQkJT3B0aW1pemF0aW9uPSIyIgogCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3dpbnNvdW5kLnZjcHJvaiBiL1BDYnVpbGQvd2luc291bmQudmNwcm9qCmluZGV4IGI2NDVhMjQuLjM0YWFkYmYgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvd2luc291bmQudmNwcm9qCisrKyBiL1BDYnVpbGQvd2luc291bmQudmNwcm9qCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJCUNoYXJhY3RlclNldD0iMiI+CiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCi0JCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiIKKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iCiAJCQkJT3B0aW1pemF0aW9uPSIyIgogCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIgogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9Vbmluc3RhbC53c2UgYi9QQ2J1aWxkOC9Vbmluc3RhbC53c2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2ZjNiYwotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQ4L1VuaW5zdGFsLndzZQpAQCAtMCwwICsxLDUxNCBAQAorRG9jdW1lbnQgVHlwZTogV1NFDQoraXRlbTogR2xvYmFsDQorICBWZXJzaW9uPTguMTQNCisgIEZsYWdzPTAwMDAwMTAwDQorICBTcGxpdD0xNDIwDQorICBMYW5ndWFnZXM9NjUgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDANCisgIENvcHkgRGVmYXVsdD0xDQorICBKYXBhbmVzZSBGb250IE5hbWU9TVMgR290aGljDQorICBKYXBhbmVzZSBGb250IFNpemU9MTANCisgIFN0YXJ0IEdyYWRpZW50PTAgMCAyNTUNCisgIEVuZCBHcmFkaWVudD0wIDAgMA0KKyAgV2luZG93cyBGbGFncz0wMDAwMDAwMDAwMDAwMDAwMDAwMDEwMTAwMDAwMTAwMA0KKyAgTWVzc2FnZSBGb250PU1TIFNhbnMgU2VyaWYNCisgIEZvbnQgU2l6ZT04DQorICBEaXNrIExhYmVsPUdMQlMNCisgIERpc2sgRmlsZW5hbWU9SU5TVEFMTA0KKyAgUGF0Y2ggRmxhZ3M9MDAwMDAwMDAwMDAwMDAwMQ0KKyAgUGF0Y2ggVGhyZXNob2xkPTIwMA0KKyAgUGF0Y2ggTWVtb3J5PTQwOTYNCisgIFBlci1Vc2VyIFZlcnNpb24gSUQ9MQ0KKyAgQ3J5c3RhbCBGb3JtYXQ9MTAxMTExMDAxMDExMDAwMDAwMTAwMDEwMDEwMDEwMDENCisgIFN0ZXAgVmlldz0mUHJvcGVydGllcw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1Ob3RlIGZyb20gVGltOiAgVGhpcyBpcyBhIHZlcmJhdGltIGNvcHkgb2YgV2lzZSdzIFVuaW5zdGFsLndzZSwgYWx0ZXJlZCBhdCB0aGUgZW5kIHRvIHdyaXRlDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PXVuaW5zdGFsbCBpbmZvIHVuZGVyIEhLQ1UgaW5zdGVhZCBvZiBIS0xNIGlmIG91ciBET0FETUlOIHZhciBpcyBmYWxzZS4NCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9ICAgICBJbnN0YWxsIFN1cHBvcnQgZm9yIHVuaW5zdGFsbGluZyB0aGUgYXBwbGljYXRpb24uDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1VTklOU1RBTExfUEFUSA0KKyAgVmFsdWU9JV9MT0dGSUxFX1BBVEhfJQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVVOSU5TVEFMTF9QQVRIDQorICBWYWx1ZT0lVU5JTlNUQUxMX1BBVEglXFVOV0lTRS5FWEUNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFyaWFibGU9X0VYRV9PU19UWVBFXw0KKyAgVmFsdWU9V0lOMzINCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0lX1dJU0VfJVxVTldJU0UzMi5FWEUNCisgIERlc3RpbmF0aW9uPSVVTklOU1RBTExfUEFUSCUNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbHNlDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9JV9XSVNFXyVcVU5XSVNFLkVYRQ0KKyAgRGVzdGluYXRpb249JVVOSU5TVEFMTF9QQVRIJQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD0gICAgIEluc3RhbGwgU3VwcG9ydCBmb3IgbXVsdGlwbGUgbGFuZ3VhZ2VzDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1VTklOU1RBTExfTEFORw0KKyAgVmFsdWU9JVVOSU5TVEFMTF9QQVRIJQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVVOSU5TVEFMTF9MQU5HDQorICBWYWx1ZT0lVU5JTlNUQUxMX0xBTkclXFVOV0lTRS5JTkkNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFyaWFibGU9X0xBTkdfTElTVF8NCisgIFZhbHVlPUMNCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhbHVlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5GUkENCisgIEZsYWdzPTAwMDAwMDExDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1MQU5HDQorICBWYWx1ZT0lX0xBTkdfQ19OQU1FXyUNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuRlJBDQorICBEZXN0aW5hdGlvbj0lVU5JTlNUQUxMX0xBTkclDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhcmlhYmxlPV9MQU5HX0xJU1RfDQorICBWYWx1ZT1EDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYWx1ZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuRlJBDQorICBGbGFncz0wMDAwMDAxMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9TEFORw0KKyAgVmFsdWU9JV9MQU5HX0RfTkFNRV8lDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLkZSQQ0KKyAgRGVzdGluYXRpb249JVVOSU5TVEFMTF9MQU5HJQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYXJpYWJsZT1fTEFOR19MSVNUXw0KKyAgVmFsdWU9RQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFsdWU9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLkRFVQ0KKyAgRmxhZ3M9MDAwMDAwMTENCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUxBTkcNCisgIFZhbHVlPSVfTEFOR19FX05BTUVfJQ0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5ERVUNCisgIERlc3RpbmF0aW9uPSVVTklOU1RBTExfTEFORyUNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFyaWFibGU9X0xBTkdfTElTVF8NCisgIFZhbHVlPUYNCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhbHVlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5QVEcNCisgIEZsYWdzPTAwMDAwMDExDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1MQU5HDQorICBWYWx1ZT0lX0xBTkdfRl9OQU1FXyUNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuUFRHDQorICBEZXN0aW5hdGlvbj0lVU5JTlNUQUxMX0xBTkclDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhcmlhYmxlPV9MQU5HX0xJU1RfDQorICBWYWx1ZT1HDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYWx1ZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuRVNQDQorICBGbGFncz0wMDAwMDAxMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9TEFORw0KKyAgVmFsdWU9JV9MQU5HX0dfTkFNRV8lDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLkVTUA0KKyAgRGVzdGluYXRpb249JVVOSU5TVEFMTF9MQU5HJQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYXJpYWJsZT1fTEFOR19MSVNUXw0KKyAgVmFsdWU9SA0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFsdWU9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLkVTUA0KKyAgRmxhZ3M9MDAwMDAwMTENCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUxBTkcNCisgIFZhbHVlPSVfTEFOR19IX05BTUVfJQ0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5FU1ANCisgIERlc3RpbmF0aW9uPSVVTklOU1RBTExfTEFORyUNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFyaWFibGU9X0xBTkdfTElTVF8NCisgIFZhbHVlPUkNCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhbHVlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5JVEENCisgIEZsYWdzPTAwMDAwMDExDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1MQU5HDQorICBWYWx1ZT0lX0xBTkdfSV9OQU1FXyUNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuSVRBDQorICBEZXN0aW5hdGlvbj0lVU5JTlNUQUxMX0xBTkclDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhcmlhYmxlPV9MQU5HX0xJU1RfDQorICBWYWx1ZT1KDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYWx1ZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuREFODQorICBGbGFncz0wMDAwMDAxMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9TEFORw0KKyAgVmFsdWU9JV9MQU5HX0pfTkFNRV8lDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLkRBTg0KKyAgRGVzdGluYXRpb249JVVOSU5TVEFMTF9MQU5HJQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYXJpYWJsZT1fTEFOR19MSVNUXw0KKyAgVmFsdWU9Sw0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFsdWU9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLkZJTg0KKyAgRmxhZ3M9MDAwMDAwMTENCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUxBTkcNCisgIFZhbHVlPSVfTEFOR19LX05BTUVfJQ0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5GSU4NCisgIERlc3RpbmF0aW9uPSVVTklOU1RBTExfTEFORyUNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFyaWFibGU9X0xBTkdfTElTVF8NCisgIFZhbHVlPUwNCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhbHVlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5JU0wNCisgIEZsYWdzPTAwMDAwMDExDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1MQU5HDQorICBWYWx1ZT0lX0xBTkdfTF9OQU1FXyUNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuSVNMDQorICBEZXN0aW5hdGlvbj0lVU5JTlNUQUxMX0xBTkclDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhcmlhYmxlPV9MQU5HX0xJU1RfDQorICBWYWx1ZT1NDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYWx1ZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuTkxEDQorICBGbGFncz0wMDAwMDAxMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9TEFORw0KKyAgVmFsdWU9JV9MQU5HX01fTkFNRV8lDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLk5MRA0KKyAgRGVzdGluYXRpb249JVVOSU5TVEFMTF9MQU5HJQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYXJpYWJsZT1fTEFOR19MSVNUXw0KKyAgVmFsdWU9Tg0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFsdWU9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLk5PUg0KKyAgRmxhZ3M9MDAwMDAwMTENCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUxBTkcNCisgIFZhbHVlPSVfTEFOR19OX05BTUVfJQ0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5OT1INCisgIERlc3RpbmF0aW9uPSVVTklOU1RBTExfTEFORyUNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBFbmQNCitlbmQNCitpdGVtOiBDb21waWxlciBWYXJpYWJsZSBJZg0KKyAgVmFyaWFibGU9X0xBTkdfTElTVF8NCisgIFZhbHVlPU8NCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhbHVlPSVfV0lTRV8lXExBTkdVQUdFXFVOV0lTRS5TVkUNCisgIEZsYWdzPTAwMDAwMDExDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1MQU5HDQorICBWYWx1ZT0lX0xBTkdfT19OQU1FXyUNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuU1ZFDQorICBEZXN0aW5hdGlvbj0lVU5JTlNUQUxMX0xBTkclDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgRW5kDQorZW5kDQoraXRlbTogQ29tcGlsZXIgVmFyaWFibGUgSWYNCisgIFZhcmlhYmxlPV9MQU5HX0xJU1RfDQorICBWYWx1ZT1QDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIElmDQorICBWYWx1ZT0lX1dJU0VfJVxMQU5HVUFHRVxVTldJU0UuSlBODQorICBGbGFncz0wMDAwMDAxMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9TEFORw0KKyAgVmFsdWU9JV9MQU5HX1BfTkFNRV8lDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9JV9XSVNFXyVcTEFOR1VBR0VcVU5XSVNFLkpQTg0KKyAgRGVzdGluYXRpb249JVVOSU5TVEFMTF9MQU5HJQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IENvbXBpbGVyIFZhcmlhYmxlIEVuZA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD0gICAgIEluc3RhbGwgdGhlIGFkZC9yZW1vdmUgb3IgdW5pbnN0YWxsIGljb24NCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVVOSU5TVEFMTF9QQVRIDQorICBWYWx1ZT0lVU5JTlNUQUxMX1BBVEglDQorICBGbGFncz0wMDAxMDEwMA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9SU5TVF9MT0dfUEFUSA0KKyAgVmFsdWU9JV9MT0dGSUxFX1BBVEhfJQ0KKyAgRmxhZ3M9MDAwMTAxMDANCitlbmQNCitpdGVtOiBDaGVjayBDb25maWd1cmF0aW9uDQorICBGbGFncz0xMDExMTAxMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9RE9BRE1JTg0KKyAgVmFsdWU9MQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1Xcml0ZSB1bmluc3RhbGwgaW5mbyB1bmRlciBIS0xNLiAgVGhpcyBpZi9lbHNlL2VuZCBibG9jayBhZGRlZCBieSBUaW0uDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXCVBUFBUSVRMRSUNCisgIE5ldyBWYWx1ZT0lQVBQVElUTEUlDQorICBWYWx1ZSBOYW1lPURpc3BsYXlOYW1lDQorICBSb290PTINCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcJUFQUFRJVExFJQ0KKyAgTmV3IFZhbHVlPSVVTklOU1RBTExfUEFUSCUgJUlOU1RfTE9HX1BBVEglDQorICBOZXcgVmFsdWU9DQorICBWYWx1ZSBOYW1lPVVuaW5zdGFsbFN0cmluZw0KKyAgUm9vdD0yDQorZW5kDQoraXRlbTogRWxzZSBTdGF0ZW1lbnQNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VGhlIHNhbWUsIGJ1dCB3cml0ZSB1bmRlciBIS0NVIGluc3RlYWQuDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXCVBUFBUSVRMRSUNCisgIE5ldyBWYWx1ZT0lQVBQVElUTEUlDQorICBWYWx1ZSBOYW1lPURpc3BsYXlOYW1lDQorICBSb290PTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcJUFQUFRJVExFJQ0KKyAgTmV3IFZhbHVlPSVVTklOU1RBTExfUEFUSCUgJUlOU1RfTE9HX1BBVEglDQorICBOZXcgVmFsdWU9DQorICBWYWx1ZSBOYW1lPVVuaW5zdGFsbFN0cmluZw0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogRWxzZSBTdGF0ZW1lbnQNCitlbmQNCitpdGVtOiBBZGQgUHJvZ01hbiBJY29uDQorICBHcm91cD0lR1JPVVAlDQorICBJY29uIE5hbWU9VW5pbnN0YWxsICVBUFBUSVRMRSUNCisgIENvbW1hbmQgTGluZT0lVU5JTlNUQUxMX1BBVEglICVJTlNUX0xPR19QQVRIJQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IENoZWNrIENvbmZpZ3VyYXRpb24NCisgIEZsYWdzPTExMTEwMDEwDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1ET0JSQU5EDQorICBWYWx1ZT0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0yDQorICBpdGVtOiBLZXkNCisgICAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwlQVBQVElUTEUlDQorICAgIE5ldyBWYWx1ZT0lQ09NUEFOWSUNCisgICAgVmFsdWUgTmFtZT1SZWdDb21wYW55DQorICAgIFJvb3Q9Mg0KKyAgZW5kDQorICBpdGVtOiBLZXkNCisgICAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwlQVBQVElUTEUlDQorICAgIE5ldyBWYWx1ZT0lTkFNRSUNCisgICAgVmFsdWUgTmFtZT1SZWdPd25lcg0KKyAgICBSb290PTINCisgIGVuZA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L19ic2RkYi52Y3Byb2ogYi9QQ2J1aWxkOC9fYnNkZGIudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2NlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9fYnNkZGIudmNwcm9qCkBAIC0wLDAgKzEsMzg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0iX2JzZGRiIg0KKwlQcm9qZWN0R1VJRD0ie0UxREJCMjIwLUQ2NEItNDIzRC1BNTQ1LTUzOUE1NUFBN0ZFMn0iDQorCVNjY1Byb2plY3ROYW1lPSJfYnNkZGIiDQorCVNjY0xvY2FsUGF0aD0iLi4iDQorCVNjY1Byb3ZpZGVyPSJNU1NDQ0k6UGVyZm9yY2UgU0NNIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcX2JzZGRiIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlOy4uXFBDOyZxdW90Oy4uXC4uXGRiLTQuNC4yMFxidWlsZF93aW4zMiZxdW90OyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfV0lORE9XUyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxkYi00LjQuMjBcYnVpbGRfd2luMzJcRGVidWdcbGliZGI0NHNkLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fYnNkZGJfZC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19ic2RkYl9kLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE4MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19ic2RkYl9kLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxfYnNkZGIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlOy4uXFBDOyZxdW90Oy4uXC4uXGRiLTQuNC4yMFxidWlsZF93aW4zMiZxdW90OyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cZGItNC40LjIwXGJ1aWxkX3dpbjMyXFJlbGVhc2VcbGliZGI0NHMubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19ic2RkYi5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19ic2RkYi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fYnNkZGIubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlSXRhbml1bXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4vLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5caWE2NC10ZW1wLXJlbGVhc2VcX2JzZGRiIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZTsuLlxQQzsmcXVvdDsuLlwuLlxkYi00LjQuMjBcYnVpbGRfd2luMzImcXVvdDsiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cZGItNC40LjIwXGJ1aWxkX3dpbjMyXFJlbGVhc2VfSUE2NFxsaWJkYjQ0cy5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vX2JzZGRiLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX2JzZGRiLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE4MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19ic2RkYi5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJhbWQ2NC10ZW1wLXJlbGVhc2VcX2JzZGRiIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiAvR1MtIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlOy4uXFBDOyZxdW90Oy4uXC4uXGRiLTQuNC4yMFxidWlsZF93aW4zMiZxdW90OyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cZGItNC40LjIwXGJ1aWxkX3dpbjMyXFJlbGVhc2VfQU1ENjRcbGliZGI0NHMubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19ic2RkYi5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19ic2RkYi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fYnNkZGIubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfYnNkZGIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L19jdHlwZXMudmNwcm9qIGIvUENidWlsZDgvX2N0eXBlcy52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0NmY1ZgotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQ4L19jdHlwZXMudmNwcm9qCkBAIC0wLDAgKzEsNDA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOCwwMCINCisJTmFtZT0iX2N0eXBlcyINCisJUHJvamVjdEdVSUQ9IntGMjJGNDBGNC1EMzE4LTQwREMtOTZCMy04OERDODFDRTA4OTR9Ig0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1xfY3R5cGVzIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDLC4uXE1vZHVsZXNcX2N0eXBlc1xsaWJmZmlfbXN2YyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUyINCisJCQkJTWluaW1hbFJlYnVpbGQ9ImZhbHNlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9ImZhbHNlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvRVhQT1JUOkRsbEdldENsYXNzT2JqZWN0LFBSSVZBVEUgL0VYUE9SVDpEbGxDYW5VbmxvYWROb3csUFJJVkFURSINCisJCQkJT3V0cHV0RmlsZT0iLi9fY3R5cGVzX2QucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX2N0eXBlc19kLnBkYiINCisJCQkJU3ViU3lzdGVtPSIwIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDFBMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19jdHlwZXNfZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2VcX2N0eXBlcyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDLC4uXE1vZHVsZXNcX2N0eXBlc1xsaWJmZmlfbXN2YyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9ImZhbHNlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvRVhQT1JUOkRsbEdldENsYXNzT2JqZWN0LFBSSVZBVEUgL0VYUE9SVDpEbGxDYW5VbmxvYWROb3csUFJJVkFURSINCisJCQkJT3V0cHV0RmlsZT0iLi9fY3R5cGVzLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iZmFsc2UiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fY3R5cGVzLnBkYiINCisJCQkJU3ViU3lzdGVtPSIwIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjAiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjAiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMUEwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlcy5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJhbWQ2NC10ZW1wLXJlbGVhc2VcX2N0eXBlcyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04iDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDLC4uXE1vZHVsZXNcX2N0eXBlc1xsaWJmZmlfbXN2YyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpBTUQ2NCAvVVNFTElOSzpNU19TREsgL0VYUE9SVDpEbGxHZXRDbGFzc09iamVjdCxQUklWQVRFIC9FWFBPUlQ6RGxsQ2FuVW5sb2FkTm93LFBSSVZBVEUiDQorCQkJCU91dHB1dEZpbGU9Ii4vX2N0eXBlcy5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249ImZhbHNlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX2N0eXBlcy5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMCINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIwIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIwIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDFBMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19jdHlwZXMubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlSXRhbml1bXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0LXRlbXAtcmVsZWFzZVxfY3R5cGVzIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMsLi5cTW9kdWxlc1xfY3R5cGVzXGxpYmZmaV9tc3ZjIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIC9FWFBPUlQ6RGxsR2V0Q2xhc3NPYmplY3QsUFJJVkFURSAvRVhQT1JUOkRsbENhblVubG9hZE5vdyxQUklWQVRFIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19jdHlwZXMucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJmYWxzZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19jdHlwZXMucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjAiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMCINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMCINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxQTAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fY3R5cGVzLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2N0eXBlc1xfY3R5cGVzLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2N0eXBlc1xjYWxsYmFja3MuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfY3R5cGVzXGNhbGxwcm9jLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2N0eXBlc1xjZmllbGQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfY3R5cGVzXGxpYmZmaV9tc3ZjXGZmaS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9jdHlwZXNcbWFsbG9jX2Nsb3N1cmUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfY3R5cGVzXGxpYmZmaV9tc3ZjXHByZXBfY2lmLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2N0eXBlc1xzdGdkaWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2N0eXBlc1xsaWJmZmlfbXN2Y1x3aW4zMi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvX2N0eXBlc190ZXN0LnZjcHJvaiBiL1BDYnVpbGQ4L19jdHlwZXNfdGVzdC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwZTMwNwotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQ4L19jdHlwZXNfdGVzdC52Y3Byb2oKQEAgLTAsMCArMSwzNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LDAwIg0KKwlOYW1lPSJfY3R5cGVzX3Rlc3QiDQorCVByb2plY3RHVUlEPSJ7OENGMzM0RDktNEY4Mi00MkVCLTk3QUYtODM1OTJDNUFGRDJGfSINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcX2N0eXBlc190ZXN0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTIg0KKwkJCQlNaW5pbWFsUmVidWlsZD0iZmFsc2UiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19jdHlwZXNfdGVzdF9kLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19jdHlwZXNfdGVzdF9kLnBkYiINCisJCQkJU3ViU3lzdGVtPSIwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlc190ZXN0X2QubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1yZWxlYXNlXF9jdHlwZXNfdGVzdCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19jdHlwZXNfdGVzdC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249ImZhbHNlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX2N0eXBlc190ZXN0LnBkYiINCisJCQkJU3ViU3lzdGVtPSIwIg0KKwkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjAiDQorCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fY3R5cGVzX3Rlc3QubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlSXRhbml1bXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJpYTY0LXRlbXAtcmVsZWFzZVxfY3R5cGVzX3Rlc3QiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19JVEFOSVVNIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1MiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJmYWxzZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19jdHlwZXNfdGVzdF9kLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19jdHlwZXNfdGVzdF9kLnBkYiINCisJCQkJU3ViU3lzdGVtPSIwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlc190ZXN0X2QubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlQU1ENjR8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iYW1kNjQtdGVtcC1yZWxlYXNlXF9jdHlwZXNfdGVzdCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04iDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJT3V0cHV0RmlsZT0iLi9fY3R5cGVzX3Rlc3QucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJmYWxzZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19jdHlwZXNfdGVzdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMCINCisJCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIwIg0KKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2N0eXBlc190ZXN0LmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2N0eXBlc1xfY3R5cGVzX3Rlc3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L19lbGVtZW50dHJlZS52Y3Byb2ogYi9QQ2J1aWxkOC9fZWxlbWVudHRyZWUudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZmEyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9fZWxlbWVudHRyZWUudmNwcm9qCkBAIC0wLDAgKzEsMzkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOCwwMCINCisJTmFtZT0iX2VsZW1lbnR0cmVlIg0KKwlQcm9qZWN0R1VJRD0iezE5NjZEREUyLTRBQjctNEU0RS1BQ0M5LUMxMjFFNEQzN0Y4RX0iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1xfZWxlbWVudHRyZWUiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMsLi5cTW9kdWxlc1xleHBhdCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztIQVZFX0VYUEFUX0g7V0lOMzI7X1dJTkRPV1M7WE1MX05TO1hNTF9EVEQ7QllURU9SREVSPTEyMzQ7WE1MX0NPTlRFWFRfQllURVM9MTAyNDtVU0VfUFlFWFBBVF9DQVBJO1hNTF9TVEFUSUM7SEFWRV9NRU1NT1ZFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fZWxlbWVudHRyZWVfZC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fZWxlbWVudHRyZWVfZC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxMDAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fZWxlbWVudHRyZWVfZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2VcX2VsZW1lbnR0cmVlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlxNb2R1bGVzXGV4cGF0Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO1hNTF9OUztYTUxfRFREO0JZVEVPUkRFUj0xMjM0O1hNTF9DT05URVhUX0JZVEVTPTEwMjQ7VVNFX1BZRVhQQVRfQ0FQSTtYTUxfU1RBVElDO0hBVkVfTUVNTU9WRSINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19lbGVtZW50dHJlZS5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fZWxlbWVudHRyZWUucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTAwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2VsZW1lbnR0cmVlLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUl0YW5pdW18V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuLy4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXGlhNjQtdGVtcC1yZWxlYXNlXF9lbGVtZW50dHJlZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX0lUQU5JVU0iDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMsLi5cTW9kdWxlc1xleHBhdCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztYTUxfTlM7WE1MX0RURDtCWVRFT1JERVI9MTIzNDtYTUxfQ09OVEVYVF9CWVRFUz0xMDI0O1VTRV9QWUVYUEFUX0NBUEk7WE1MX1NUQVRJQztIQVZFX01FTU1PVkUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19lbGVtZW50dHJlZS5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fZWxlbWVudHRyZWUucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTAwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX2VsZW1lbnR0cmVlLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0LXRlbXAtcmVsZWFzZVxfZWxlbWVudHRyZWUiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMsLi5cTW9kdWxlc1xleHBhdCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztYTUxfTlM7WE1MX0RURDtCWVRFT1JERVI9MTIzNDtYTUxfQ09OVEVYVF9CWVRFUz0xMDI0O1VTRV9QWUVYUEFUX0NBUEk7WE1MX1NUQVRJQztIQVZFX01FTU1PVkUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpBTUQ2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fZWxlbWVudHRyZWUucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX2VsZW1lbnR0cmVlLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDEwMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19lbGVtZW50dHJlZS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9lbGVtZW50dHJlZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGV4cGF0XHhtbHBhcnNlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcZXhwYXRceG1scm9sZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGV4cGF0XHhtbHRvay5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvX21zaS52Y3Byb2ogYi9QQ2J1aWxkOC9fbXNpLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRmNzdkCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvX21zaS52Y3Byb2oKQEAgLTAsMCArMSwzNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LDAwIg0KKwlOYW1lPSJfbXNpIg0KKwlQcm9qZWN0R1VJRD0iezJDMEJFRkI5LTcwRTItNEY4MC1BQzVCLTRBQjhFRTAyMzU3NH0iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1xfbXNpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfV0lORE9XUztfVVNSRExMIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZmNpLmxpYiBtc2kubGliIHJwY3J0NC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vX21zaS5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fbXNpLnBkYiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxNjAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fbXNpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxfbXNpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iZmNpLmxpYiBtc2kubGliIHJwY3J0NC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vX21zaS5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX21zaS5wZGIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTYwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX21zaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxfbXNpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX0lUQU5JVU0iDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJmY2kubGliIG1zaS5saWIgcnBjcnQ0LmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fbXNpLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fbXNpLnBkYiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxNjAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fbXNpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0LXRlbXAtcmVsZWFzZVxfbXNpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04gL0dTLSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJmY2kubGliIG1zaS5saWIgcnBjcnQ0LmxpYiBidWZmZXJvdmVyZmxvd1UubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19tc2kucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19tc2kucGRiIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDE2MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19tc2kubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcX21zaS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvX3NvY2tldC52Y3Byb2ogYi9QQ2J1aWxkOC9fc29ja2V0LnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTUwN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvX3NvY2tldC52Y3Byb2oKQEAgLTAsMCArMSwzODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJfc29ja2V0Ig0KKwlQcm9qZWN0R1VJRD0iezMyNEY2NkMyLTQ0RDAtNEQ1MC1COTc5LUY5REFFN0ZEMzZEQn0iDQorCVNjY1Byb2plY3ROYW1lPSJfc29ja2V0Ig0KKwlTY2NMb2NhbFBhdGg9Ii4uIg0KKwlTY2NQcm92aWRlcj0iTVNTQ0NJOlBlcmZvcmNlIFNDTSINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLWRlYnVnXF9zb2NrZXQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X1dJTkRPV1MiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id3MyXzMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fc29ja2V0X2QucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3NvY2tldF9kLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTFEMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19zb2NrZXRfZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2VcX3NvY2tldCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9IndzMl8zMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vX3NvY2tldC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fc29ja2V0LnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTFEMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19zb2NrZXQubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlSXRhbml1bXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4vLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5caWE2NC10ZW1wLXJlbGVhc2VcX3NvY2tldCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX0lUQU5JVU0iDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1MiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id3MyXzMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fc29ja2V0LnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19zb2NrZXQucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFlMUQwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3NvY2tldC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJhbWQ2NC10ZW1wLXJlbGVhc2VcX3NvY2tldCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04gL0dTLSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id3MyXzMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fc29ja2V0LnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19zb2NrZXQucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFlMUQwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3NvY2tldC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNvY2tldG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvX3NxbGl0ZTMudmNwcm9qIGIvUENidWlsZDgvX3NxbGl0ZTMudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDEyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9fc3FsaXRlMy52Y3Byb2oKQEAgLTAsMCArMSw0MTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LDAwIg0KKwlOYW1lPSJfc3FsaXRlMyINCisJUHJvamVjdEdVSUQ9InsyRkYwQTMxMi0yMkY5LTRDMzQtQjA3MC04NDI5MTZERTI3QTl9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcX3NxbGl0ZTMiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGU7Li5cUEM7Li5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfV0lORE9XUztNT0RVTEVfTkFNRT1cJnF1b3Q7c3FsaXRlM1wmcXVvdDsiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNFxzcWxpdGUzLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fc3FsaXRlM19kLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3NxbGl0ZTNfZC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fc3FsaXRlM19kLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxfc3FsaXRlMyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGU7Li5cUEM7Li5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztNT0RVTEVfTkFNRT1cJnF1b3Q7c3FsaXRlM1wmcXVvdDsiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXHNxbGl0ZS1zb3VyY2UtMy4zLjRcc3FsaXRlMy5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vX3NxbGl0ZTMucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0iIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fc3FsaXRlMy5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxODAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fc3FsaXRlMy5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLi8uIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxfc3FsaXRlMyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX0lUQU5JVU0iDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGU7Li5cUEM7Li5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztNT0RVTEVfTkFNRT1cJnF1b3Q7c3FsaXRlM1wmcXVvdDsiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNFxpYTY0XHNxbGl0ZTMubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL19zcWxpdGUzLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9IiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3NxbGl0ZTMucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFlMTgwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3NxbGl0ZTMubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlQU1ENjR8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iYW1kNjQtdGVtcC1yZWxlYXNlXF9zcWxpdGUzIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZTsuLlxQQzsuLlwuLlxzcWxpdGUtc291cmNlLTMuMy40Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO01PRFVMRV9OQU1FPVwmcXVvdDtzcWxpdGUzXCZxdW90OyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iLi5cLi5cc3FsaXRlLXNvdXJjZS0zLjMuNFxhbWQ2NFxzcWxpdGUzLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fc3FsaXRlMy5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19zcWxpdGUzLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE4MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19zcWxpdGUzLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxjYWNoZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcY29ubmVjdGlvbi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcY3Vyc29yLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxtaWNyb3Byb3RvY29scy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxwcmVwYXJlX3Byb3RvY29sLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NxbGl0ZVxyb3cuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3FsaXRlXHN0YXRlbWVudC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcWxpdGVcdXRpbC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvX3NzbC5tYWsgYi9QQ2J1aWxkOC9fc3NsLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU0MjVmCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvX3NzbC5tYWsKQEAgLTAsMCArMSwyMSBAQAorDQorIUlGREVGIERFQlVHDQorTU9EVUxFPV9zc2xfZC5weWQNCitURU1QX0RJUj14ODYtdGVtcC1kZWJ1Zy9fc3NsDQorQ0ZMQUdTPS9PZCAvWmkgL01EZCAvTERkIC9EREVCVUcgL0RfREVCVUcgL0RXSU4zMg0KK1NTTF9MSUJfRElSPSQoU1NMX0RJUikvb3V0MzIuZGJnDQorIUVMU0UNCitNT0RVTEU9X3NzbC5weWQNCitURU1QX0RJUj14ODYtdGVtcC1yZWxlYXNlL19zc2wNCitDRkxBR1M9L094IC9NRCAvTEQgL0RXSU4zMg0KK1NTTF9MSUJfRElSPSQoU1NMX0RJUikvb3V0MzINCishRU5ESUYNCisNCitJTkNMVURFUz0tSSAuLi9JbmNsdWRlIC1JIC4uL1BDIC1JICQoU1NMX0RJUikvaW5jMzINCitMSUJTPWdkaTMyLmxpYiB3c29jazMyLmxpYiB1c2VyMzIubGliIGFkdmFwaTMyLmxpYiAvbGlicGF0aDokKFNTTF9MSUJfRElSKSBsaWJlYXkzMi5saWIgc3NsZWF5MzIubGliDQorDQorU09VUkNFPS4uL01vZHVsZXMvX3NzbC5jICQoU1NMX0xJQl9ESVIpL2xpYmVheTMyLmxpYiAkKFNTTF9MSUJfRElSKS9zc2xlYXkzMi5saWINCisNCiskKE1PRFVMRSk6ICQoU09VUkNFKSAuLi9QQy8qLmggLi4vSW5jbHVkZS8qLmgNCisgICAgQGlmIG5vdCBleGlzdCAiJChURU1QX0RJUikvLiIgbWtkaXIgIiQoVEVNUF9ESVIpIg0KKyAgICBjbCAvbm9sb2dvICQoU09VUkNFKSAkKENGTEFHUykgL0ZvJChURU1QX0RJUilcJCoub2JqICQoSU5DTFVERVMpIC9saW5rIC9vdXQ6JChNT0RVTEUpICQoTElCUykNCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9fc3NsLnZjcHJvaiBiL1BDYnVpbGQ4L19zc2wudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzY1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9fc3NsLnZjcHJvagpAQCAtMCwwICsxLDEyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjgsMDAiDQorCU5hbWU9Il9zc2wiDQorCVByb2plY3RHVUlEPSJ7OEU4NUJBNTQtOEE0Ny00QzhCLUI3MkUtOEUxNzU3OUNDNkQ3fSINCisJUm9vdE5hbWVzcGFjZT0iX3NzbCINCisJS2V5d29yZD0iTWFrZUZpbGVQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1yZWxlYXNlXF9zc2wiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjAiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNOTWFrZVRvb2wiDQorCQkJCUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkiDQorCQkJCVJlQnVpbGRDb21tYW5kTGluZT0icHl0aG9uIGJ1aWxkX3NzbC5weSAtYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0iZWNobyBOb3RoaW5nIHRvIGRvIg0KKwkJCQlPdXRwdXQ9Il9zc2wucHlkIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iIg0KKwkJCQlJbmNsdWRlU2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRJbmNsdWRlcz0iIg0KKwkJCQlBc3NlbWJseVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkVXNpbmdBc3NlbWJsaWVzPSIiDQorCQkJCUNvbXBpbGVBc01hbmFnZWQ9IiINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcX3NzbCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMCINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ05NYWtlVG9vbCINCisJCQkJQnVpbGRDb21tYW5kTGluZT0icHl0aG9uX2QgLXUgYnVpbGRfc3NsLnB5IC1kIg0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbl9kIC11IGJ1aWxkX3NzbC5weSAtZCAtYSINCisJCQkJQ2xlYW5Db21tYW5kTGluZT0iZWNobyBOb3RoaW5nIHRvIGRvIg0KKwkJCQlPdXRwdXQ9Il9zc2xfZC5weWQiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSIiDQorCQkJCUluY2x1ZGVTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZEluY2x1ZGVzPSIiDQorCQkJCUFzc2VtYmx5U2VhcmNoUGF0aD0iIg0KKwkJCQlGb3JjZWRVc2luZ0Fzc2VtYmxpZXM9IiINCisJCQkJQ29tcGlsZUFzTWFuYWdlZD0iIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLi8uIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxfc3NsIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJweXRob24gYnVpbGRfc3NsLnB5Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkgLWEiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9IiINCisJCQkJT3V0cHV0PSJfc3NsLnB5ZCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0LXRlbXAtcmVsZWFzZVxfc3NsIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIwIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTk1ha2VUb29sIg0KKwkJCQlCdWlsZENvbW1hbmRMaW5lPSJweXRob24gYnVpbGRfc3NsLnB5Ig0KKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkgLWEiDQorCQkJCUNsZWFuQ29tbWFuZExpbmU9IiINCisJCQkJT3V0cHV0PSJfc3NsLnB5ZCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IiINCisJCQkJSW5jbHVkZVNlYXJjaFBhdGg9IiINCisJCQkJRm9yY2VkSW5jbHVkZXM9IiINCisJCQkJQXNzZW1ibHlTZWFyY2hQYXRoPSIiDQorCQkJCUZvcmNlZFVzaW5nQXNzZW1ibGllcz0iIg0KKwkJCQlDb21waWxlQXNNYW5hZ2VkPSIiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NzbC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvX3Rlc3RjYXBpLnZjcHJvaiBiL1BDYnVpbGQ4L190ZXN0Y2FwaS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2ODFjNgotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQ4L190ZXN0Y2FwaS52Y3Byb2oKQEAgLTAsMCArMSwzNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LjAwIg0KKwlOYW1lPSJfdGVzdGNhcGkiDQorCVByb2plY3RHVUlEPSJ7NTlDQkY0NzQtOUUwNi00QzUwLTkxNDItQzQ0QTExOEJCNDQ3fSINCisJU2NjUHJvamVjdE5hbWU9Il90ZXN0Y2FwaSINCisJU2NjTG9jYWxQYXRoPSIuLiINCisJU2NjUHJvdmlkZXI9Ik1TU0NDSTpQZXJmb3JjZSBTQ00iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2VcX3Rlc3RjYXBpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtNTUFQX0VYUE9SVFMiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii4vX3Rlc3RjYXBpLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fdGVzdGNhcGkucGRiIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTFGMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL190ZXN0Y2FwaS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1xfdGVzdGNhcGkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7TU1BUF9FWFBPUlRTIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLi9fdGVzdGNhcGlfZC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fdGVzdGNhcGlfZC5wZGIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFlMUYwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3Rlc3RjYXBpX2QubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlSXRhbml1bXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4vLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5caWE2NC10ZW1wLXJlbGVhc2VcX3Rlc3RjYXBpIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX0lUQU5JVU0iDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtNTUFQX0VYUE9SVFMiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJT3V0cHV0RmlsZT0iLi9fdGVzdGNhcGkucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL190ZXN0Y2FwaS5wZGIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFlMUYwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vX3Rlc3RjYXBpLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0LXRlbXAtcmVsZWFzZVxfdGVzdGNhcGkiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiAvR1MtIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TU1BUF9FWFBPUlRTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlPdXRwdXRGaWxlPSIuL190ZXN0Y2FwaS5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3Rlc3RjYXBpLnBkYiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxRjAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fdGVzdGNhcGkubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfdGVzdGNhcGltb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L190a2ludGVyLnZjcHJvaiBiL1BDYnVpbGQ4L190a2ludGVyLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJjNThhCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvX3RraW50ZXIudmNwcm9qCkBAIC0wLDAgKzEsMzg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0iX3RraW50ZXIiDQorCVByb2plY3RHVUlEPSJ7NUI1MURGRjctNURDMC00MUY4LTg3OTEtQTRBQjcxMTRBMTUxfSINCisJU2NjUHJvamVjdE5hbWU9Il90a2ludGVyIg0KKwlTY2NMb2NhbFBhdGg9Ii4uXC4uIg0KKwlTY2NQcm92aWRlcj0iTVNTQ0NJOlBlcmZvcmNlIFNDTSINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxfdGtpbnRlciINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHRjbHRrXGluY2x1ZGUsLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztXSVRIX0FQUElOSVQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXHRjbHRrXGxpYlx0azg0LmxpYiAuLlwuLlx0Y2x0a1xsaWJcdGNsODQubGliIG9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fdGtpbnRlci5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL190a2ludGVyLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE5MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL190a2ludGVyLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLWRlYnVnXF90a2ludGVyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlx0Y2x0a1xpbmNsdWRlLC4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X1dJTkRPV1M7V0lUSF9BUFBJTklUIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXHRjbHRrXGxpYlx0azg0LmxpYiAuLlwuLlx0Y2x0a1xsaWJcdGNsODQubGliIG9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fdGtpbnRlcl9kLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM9IiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX3RraW50ZXJfZC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxOTAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fdGtpbnRlcl9kLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUl0YW5pdW18V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuLy4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXGlhNjQtdGVtcC1yZWxlYXNlXF90a2ludGVyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cdGNsdGtcaW5jbHVkZSwuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO1dJVEhfQVBQSU5JVCINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlx0Y2x0a1xsaWJcdGs4NC5saWIgLi5cLi5cdGNsdGtcbGliXHRjbDg0LmxpYiBvZGJjY3AzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vX3RraW50ZXIucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9fdGtpbnRlci5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUxOTAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9fdGtpbnRlci5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJhbWQ2NC10ZW1wLXJlbGVhc2VcX3RraW50ZXIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIC9HUy0iDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXHRjbHRrXGluY2x1ZGUsLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztXSVRIX0FQUElOSVQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpBTUQ2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXHRjbHRrXGxpYlx0azg0LmxpYiAuLlwuLlx0Y2x0a1xsaWJcdGNsODQubGliIG9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9fdGtpbnRlci5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPSIiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL190a2ludGVyLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTE5MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL190a2ludGVyLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3RraW50ZXIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x0a2FwcGluaXQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L2J1aWxkX3NzbC5weSBiL1BDYnVpbGQ4L2J1aWxkX3NzbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ4OGYxCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvYnVpbGRfc3NsLnB5CkBAIC0wLDAgKzEsMTYzIEBACisjIFNjcmlwdCBmb3IgYnVpbGRpbmcgdGhlIF9zc2wgbW9kdWxlIGZvciBXaW5kb3dzLg0KKyMgVXNlcyBQZXJsIHRvIHNldHVwIHRoZSBPcGVuU1NMIGVudmlyb25tZW50IGNvcnJlY3RseQ0KKyMgYW5kIGJ1aWxkIE9wZW5TU0wsIHRoZW4gaW52b2tlcyBhIHNpbXBsZSBubWFrZSBzZXNzaW9uDQorIyBmb3IgX3NzbC5weWQgaXRzZWxmLg0KKw0KKyMgVEhFT1JFVElDQUxMWSwgeW91IGNhbjoNCisjICogVW5wYWNrIHRoZSBsYXRlc3QgU1NMIHJlbGVhc2Ugb25lIGxldmVsIGFib3ZlIHlvdXIgbWFpbiBQeXRob24gc291cmNlDQorIyAgIGRpcmVjdG9yeS4gIEl0IGlzIGxpa2VseSB5b3Ugd2lsbCBhbHJlYWR5IGZpbmQgdGhlIHpsaWIgbGlicmFyeSBhbmQNCisjICAgYW55IG90aGVyIGV4dGVybmFsIHBhY2thZ2VzIHRoZXJlLg0KKyMgKiBJbnN0YWxsIEFjdGl2ZVBlcmwgYW5kIGVuc3VyZSBpdCBpcyBzb21ld2hlcmUgb24geW91ciBwYXRoLg0KKyMgKiBSdW4gdGhpcyBzY3JpcHQgZnJvbSB0aGUgUENCdWlsZCBkaXJlY3RvcnkuDQorIw0KKyMgaXQgc2hvdWxkIGNvbmZpZ3VyZSBhbmQgYnVpbGQgU1NMLCB0aGVuIGJ1aWxkIHRoZSBzc2wgUHl0aG9uIGV4dGVuc2lvbg0KKyMgd2l0aG91dCBpbnRlcnZlbnRpb24uDQorDQoraW1wb3J0IG9zLCBzeXMsIHJlDQorDQorIyBGaW5kIGFsbCAiZm9vLmV4ZSIgZmlsZXMgb24gdGhlIFBBVEguDQorZGVmIGZpbmRfYWxsX29uX3BhdGgoZmlsZW5hbWUsIGV4dHJhcyA9IE5vbmUpOg0KKyAgICBlbnRyaWVzID0gb3MuZW52aXJvblsiUEFUSCJdLnNwbGl0KG9zLnBhdGhzZXApDQorICAgIHJldCA9IFtdDQorICAgIGZvciBwIGluIGVudHJpZXM6DQorICAgICAgICBmbmFtZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ocCwgZmlsZW5hbWUpKQ0KKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm5hbWUpIGFuZCBmbmFtZSBub3QgaW4gcmV0Og0KKyAgICAgICAgICAgIHJldC5hcHBlbmQoZm5hbWUpDQorICAgIGlmIGV4dHJhczoNCisgICAgICAgIGZvciBwIGluIGV4dHJhczoNCisgICAgICAgICAgICBmbmFtZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ocCwgZmlsZW5hbWUpKQ0KKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuYW1lKSBhbmQgZm5hbWUgbm90IGluIHJldDoNCisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChmbmFtZSkNCisgICAgcmV0dXJuIHJldA0KKw0KKyMgRmluZCBhIHN1aXRhYmxlIFBlcmwgaW5zdGFsbGF0aW9uIGZvciBPcGVuU1NMLg0KKyMgY3lnd2luIHBlcmwgZG9lcyAqbm90KiB3b3JrLiAgQWN0aXZlUGVybCBkb2VzLg0KKyMgQmVpbmcgYSBQZXJsIGR1bW15LCB0aGUgc2ltcGxlc3Qgd2F5IEkgY2FuIGNoZWNrIGlzIGlmIHRoZSAiV2luMzIiIHBhY2thZ2UNCisjIGlzIGF2YWlsYWJsZS4NCitkZWYgZmluZF93b3JraW5nX3BlcmwocGVybHMpOg0KKyAgICBmb3IgcGVybCBpbiBwZXJsczoNCisgICAgICAgIGZoID0gb3MucG9wZW4ocGVybCArICcgLWUgInVzZSBXaW4zMjsiJykNCisgICAgICAgIGZoLnJlYWQoKQ0KKyAgICAgICAgcmMgPSBmaC5jbG9zZSgpDQorICAgICAgICBpZiByYzoNCisgICAgICAgICAgICBjb250aW51ZQ0KKyAgICAgICAgcmV0dXJuIHBlcmwNCisgICAgcHJpbnQgIkNhbiBub3QgZmluZCBhIHN1aXRhYmxlIFBFUkw6Ig0KKyAgICBpZiBwZXJsczoNCisgICAgICAgIHByaW50ICIgdGhlIGZvbGxvd2luZyBwZXJsIGludGVycHJldGVycyB3ZXJlIGZvdW5kOiINCisgICAgICAgIGZvciBwIGluIHBlcmxzOg0KKyAgICAgICAgICAgIHByaW50ICIgIiwgcA0KKyAgICAgICAgcHJpbnQgIiBOb25lIG9mIHRoZXNlIHZlcnNpb25zIGFwcGVhciBzdWl0YWJsZSBmb3IgYnVpbGRpbmcgT3BlblNTTCINCisgICAgZWxzZToNCisgICAgICAgIHByaW50ICIgTk8gcGVybCBpbnRlcnByZXRlcnMgd2VyZSBmb3VuZCBvbiB0aGlzIG1hY2hpbmUgYXQgYWxsISINCisgICAgcHJpbnQgIiBQbGVhc2UgaW5zdGFsbCBBY3RpdmVQZXJsIGFuZCBlbnN1cmUgaXQgYXBwZWFycyBvbiB5b3VyIHBhdGgiDQorICAgIHByaW50ICJUaGUgUHl0aG9uIFNTTCBtb2R1bGUgd2FzIG5vdCBidWlsdCINCisgICAgcmV0dXJuIE5vbmUNCisNCisjIExvY2F0ZSB0aGUgYmVzdCBTU0wgZGlyZWN0b3J5IGdpdmVuIGEgZmV3IHJvb3RzIHRvIGxvb2sgaW50by4NCitkZWYgZmluZF9iZXN0X3NzbF9kaXIoc291cmNlcyk6DQorICAgIGNhbmRpZGF0ZXMgPSBbXQ0KKyAgICBmb3IgcyBpbiBzb3VyY2VzOg0KKyAgICAgICAgdHJ5Og0KKyAgICAgICAgICAgIHMgPSBvcy5wYXRoLmFic3BhdGgocykNCisgICAgICAgICAgICBmbmFtZXMgPSBvcy5saXN0ZGlyKHMpDQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6DQorICAgICAgICAgICAgZm5hbWVzID0gW10NCisgICAgICAgIGZvciBmbmFtZSBpbiBmbmFtZXM6DQorICAgICAgICAgICAgZnFuID0gb3MucGF0aC5qb2luKHMsIGZuYW1lKQ0KKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnFuKSBhbmQgZm5hbWUuc3RhcnRzd2l0aCgib3BlbnNzbC0iKToNCisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoZnFuKQ0KKyAgICAjIE5vdyB3ZSBoYXZlIGFsbCB0aGUgY2FuZGlkYXRlcywgbG9jYXRlIHRoZSBiZXN0Lg0KKyAgICBiZXN0X3BhcnRzID0gW10NCisgICAgYmVzdF9uYW1lID0gTm9uZQ0KKyAgICBmb3IgYyBpbiBjYW5kaWRhdGVzOg0KKyAgICAgICAgcGFydHMgPSByZS5zcGxpdCgiWy4tXSIsIG9zLnBhdGguYmFzZW5hbWUoYykpWzE6XQ0KKyAgICAgICAgIyBlZyAtIG9wZW5zc2wtMC45LjctYmV0YTEgLSBpZ25vcmUgYWxsICJiZXRhIiBvciBhbnkgb3RoZXIgcXVhbGlmaWVycw0KKyAgICAgICAgaWYgbGVuKHBhcnRzKSA+PSA0Og0KKyAgICAgICAgICAgIGNvbnRpbnVlDQorICAgICAgICBpZiBwYXJ0cyA+IGJlc3RfcGFydHM6DQorICAgICAgICAgICAgYmVzdF9wYXJ0cyA9IHBhcnRzDQorICAgICAgICAgICAgYmVzdF9uYW1lID0gYw0KKyAgICBpZiBiZXN0X25hbWUgaXMgbm90IE5vbmU6DQorICAgICAgICBwcmludCAiRm91bmQgYW4gU1NMIGRpcmVjdG9yeSBhdCAnJXMnIiAlIChiZXN0X25hbWUsKQ0KKyAgICBlbHNlOg0KKyAgICAgICAgcHJpbnQgIkNvdWxkIG5vdCBmaW5kIGFuIFNTTCBkaXJlY3RvcnkgaW4gJyVzJyIgJSAoc291cmNlcywpDQorICAgIHJldHVybiBiZXN0X25hbWUNCisNCitkZWYgbWFpbigpOg0KKyAgICBkZWJ1ZyA9ICItZCIgaW4gc3lzLmFyZ3YNCisgICAgYnVpbGRfYWxsID0gIi1hIiBpbiBzeXMuYXJndg0KKyAgICBtYWtlX2ZsYWdzID0gIiINCisgICAgaWYgYnVpbGRfYWxsOg0KKyAgICAgICAgbWFrZV9mbGFncyA9ICItYSINCisgICAgIyBwZXJsIHNob3VsZCBiZSBvbiB0aGUgcGF0aCwgYnV0IHdlIGFsc28gbG9vayBpbiAiXHBlcmwiIGFuZCAiYzpcXHBlcmwiDQorICAgICMgYXMgIndlbGwga25vd24iIGxvY2F0aW9ucw0KKyAgICBwZXJscyA9IGZpbmRfYWxsX29uX3BhdGgoInBlcmwuZXhlIiwgWyJcXHBlcmxcXGJpbiIsICJDOlxccGVybFxcYmluIl0pDQorICAgIHBlcmwgPSBmaW5kX3dvcmtpbmdfcGVybChwZXJscykNCisgICAgaWYgcGVybCBpcyBOb25lOg0KKyAgICAgICAgc3lzLmV4aXQoMSkNCisNCisgICAgcHJpbnQgIkZvdW5kIGEgd29ya2luZyBwZXJsIGF0ICclcyciICUgKHBlcmwsKQ0KKyAgICAjIExvb2sgZm9yIFNTTCAyIGxldmVscyB1cCBmcm9tIHBjYnVpbGQgLSBpZSwgc2FtZSBwbGFjZSB6bGliIGV0YyBhbGwgbGl2ZS4NCisgICAgc3NsX2RpciA9IGZpbmRfYmVzdF9zc2xfZGlyKCgiLi4vLi4iLCkpDQorICAgIGlmIHNzbF9kaXIgaXMgTm9uZToNCisgICAgICAgIHN5cy5leGl0KDEpDQorDQorICAgIG9sZF9jZCA9IG9zLmdldGN3ZCgpDQorICAgIHRyeToNCisgICAgICAgIG9zLmNoZGlyKHNzbF9kaXIpDQorICAgICAgICAjIElmIHRoZSBzc2wgbWFrZWZpbGVzIGRvIG5vdCBleGlzdCwgd2UgaW52b2tlIFBlcmwgdG8gZ2VuZXJhdGUgdGhlbS4NCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oc3NsX2RpciwgIjMyLm1hayIpKSBvciBcDQorICAgICAgICAgICBub3Qgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHNzbF9kaXIsICJkMzIubWFrIikpOg0KKyAgICAgICAgICAgIHByaW50ICJDcmVhdGluZyB0aGUgbWFrZWZpbGVzLi4uIg0KKyAgICAgICAgICAgICMgUHV0IG91ciB3b3JraW5nIFBlcmwgYXQgdGhlIGZyb250IG9mIG91ciBwYXRoDQorICAgICAgICAgICAgb3MuZW52aXJvblsiUEFUSCJdID0gb3MucGF0aC5zcGxpdChwZXJsKVswXSArIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoc2VwICsgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb25bIlBBVEgiXQ0KKyAgICAgICAgICAgICMgbXNcMzJhbGwuYmF0IHdpbGwgcmVjb25maWd1cmUgT3BlblNTTCBhbmQgdGhlbiB0cnkgdG8gYnVpbGQNCisgICAgICAgICAgICAjIGFsbCBvdXRwdXRzIChkZWJ1Zy9ub25kZWJ1Zy9kbGwvbGliKS4gIFNvIHdlIGZpbHRlciB0aGUgZmlsZQ0KKyAgICAgICAgICAgICMgdG8gZXhjbHVkZSBhbnkgIm5tYWtlIiBjb21tYW5kcyBhbmQgdGhlbiBleGVjdXRlLg0KKyAgICAgICAgICAgIHRlbXBuYW1lID0gIm1zXFwzMmFsbF9weS5iYXQiDQorDQorICAgICAgICAgICAgaW5fYmF0ICA9IG9wZW4oIm1zXFwzMmFsbC5iYXQiKQ0KKyAgICAgICAgICAgIHRlbXBfYmF0ID0gb3Blbih0ZW1wbmFtZSwidyIpDQorICAgICAgICAgICAgd2hpbGUgMToNCisgICAgICAgICAgICAgICAgY21kID0gaW5fYmF0LnJlYWRsaW5lKCkNCisgICAgICAgICAgICAgICAgcHJpbnQgJ2NtZCcsIHJlcHIoY21kKQ0KKyAgICAgICAgICAgICAgICBpZiBub3QgY21kOiBicmVhaw0KKyAgICAgICAgICAgICAgICBpZiBjbWQuc3RyaXAoKVs6NV0ubG93ZXIoKSA9PSAibm1ha2UiOg0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUNCisgICAgICAgICAgICAgICAgdGVtcF9iYXQud3JpdGUoY21kKQ0KKyAgICAgICAgICAgIGluX2JhdC5jbG9zZSgpDQorICAgICAgICAgICAgdGVtcF9iYXQuY2xvc2UoKQ0KKyAgICAgICAgICAgIG9zLnN5c3RlbSh0ZW1wbmFtZSkNCisgICAgICAgICAgICB0cnk6DQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZW1wbmFtZSkNCisgICAgICAgICAgICBleGNlcHQ6DQorICAgICAgICAgICAgICAgIHBhc3MNCisNCisgICAgICAgICMgTm93IHJ1biBtYWtlLg0KKyAgICAgICAgcHJpbnQgIkV4ZWN1dGluZyBubWFrZSBvdmVyIHRoZSBzc2wgbWFrZWZpbGVzLi4uIg0KKyAgICAgICAgaWYgZGVidWc6DQorICAgICAgICAgICAgcmMgPSBvcy5zeXN0ZW0oIm5tYWtlIC9ub2xvZ28gLWYgZDMyLm1hayIpDQorICAgICAgICAgICAgaWYgcmM6DQorICAgICAgICAgICAgICAgIHByaW50ICJFeGVjdXRpbmcgZDMyLm1hayBmYWlsZWQiDQorICAgICAgICAgICAgICAgIHByaW50IHJjDQorICAgICAgICAgICAgICAgIHN5cy5leGl0KHJjKQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICByYyA9IG9zLnN5c3RlbSgibm1ha2UgL25vbG9nbyAtZiAzMi5tYWsiKQ0KKyAgICAgICAgICAgIGlmIHJjOg0KKyAgICAgICAgICAgICAgICBwcmludCAiRXhlY3V0aW5nIDMyLm1hayBmYWlsZWQiDQorICAgICAgICAgICAgICAgIHByaW50IHJjDQorICAgICAgICAgICAgICAgIHN5cy5leGl0KHJjKQ0KKyAgICBmaW5hbGx5Og0KKyAgICAgICAgb3MuY2hkaXIob2xkX2NkKQ0KKyAgICAjIEFuZCBmaW5hbGx5LCB3ZSBjYW4gYnVpbGQgdGhlIF9zc2wgbW9kdWxlIGl0c2VsZiBmb3IgUHl0aG9uLg0KKyAgICBkZWZzID0gIlNTTF9ESVI9JXMiICUgKHNzbF9kaXIsKQ0KKyAgICBpZiBkZWJ1ZzoNCisgICAgICAgIGRlZnMgPSBkZWZzICsgIiAiICsgIkRFQlVHPTEiDQorICAgIHJjID0gb3Muc3lzdGVtKCdubWFrZSAvbm9sb2dvIC1mIF9zc2wubWFrICcgKyBkZWZzICsgIiAiICsgbWFrZV9mbGFncykNCisgICAgc3lzLmV4aXQocmMpDQorDQoraWYgX19uYW1lX189PSdfX21haW5fXyc6DQorICAgIG1haW4oKQ0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L2J6Mi52Y3Byb2ogYi9QQ2J1aWxkOC9iejIudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmYxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9iejIudmNwcm9qCkBAIC0wLDAgKzEsMzkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0iYnoyIg0KKwlQcm9qZWN0R1VJRD0ie0FDNTU3Nzg4LTYzNTQtNDNGNy1CRTA1LUM5QzhDNTlBMzQ0QX0iDQorCVJvb3ROYW1lc3BhY2U9ImJ6MiINCisJU2NjUHJvamVjdE5hbWU9ImJ6MiINCisJU2NjTG9jYWxQYXRoPSIuLiINCisJU2NjUHJvdmlkZXI9Ik1TU0NDSTpQZXJmb3JjZSBTQ00iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1xiejIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMsLi5cLi5cYnppcDItMS4wLjMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X1dJTkRPV1MiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkJQ29tbWFuZExpbmU9ImNkIC4uXC4uXGJ6aXAyLTEuMC4zJiN4MEQ7JiN4MEE7bm1ha2UgL25vbG9nbyAvZiBtYWtlZmlsZS5tc2MmI3gwRDsmI3gwQTsiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXGJ6aXAyLTEuMC4zXGxpYmJ6Mi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vYnoyX2QucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ibXN2Y3J0LGxpYmMiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL2J6Ml9kLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDE3MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL2J6Ml9kLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxiejIiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDLC4uXC4uXGJ6aXAyLTEuMC4zIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iY2QgLi5cLi5cYnppcDItMS4wLjMmI3gwRDsmI3gwQTtubWFrZSAvbm9sb2dvIC9mIG1ha2VmaWxlLm1zYyBsaWImI3gwRDsmI3gwQTsiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXGJ6aXAyLTEuMC4zXGxpYmJ6Mi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vYnoyLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmMiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL2J6Mi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxNzAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9iejIubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlSXRhbml1bXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4vLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5caWE2NC10ZW1wLXJlbGVhc2VcYnoyIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlwuLlxiemlwMi0xLjAuMyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iY2QgLi5cLi5cYnppcDItMS4wLjMmI3gwRDsmI3gwQTtubWFrZSAvbm9sb2dvIC9mIG1ha2VmaWxlLm1zYyBsaWImI3gwRDsmI3gwQTsiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6SUE2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Ii4uXC4uXGJ6aXAyLTEuMC4zXGxpYmJ6Mi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vYnoyLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmMiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL2J6Mi5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxNzAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9iejIubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlQU1ENjR8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iYW1kNjQtdGVtcC1yZWxlYXNlXGJ6MiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL1VTRUNMOk1TX09QVEVST04gL0dTLSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlwuLlxiemlwMi0xLjAuMyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iY2QgLi5cLi5cYnppcDItMS4wLjMmI3gwRDsmI3gwQTtubWFrZSAvbm9sb2dvIC9mIG1ha2VmaWxlLm1zYyBsaWImI3gwRDsmI3gwQTsiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSIuLlwuLlxiemlwMi0xLjAuM1xsaWJiejIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL2J6Mi5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJsaWJjIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9iejIucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTcwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vYnoyLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcYnoybW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9kYi5idWlsZCBiL1BDYnVpbGQ4L2RiLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Y2FlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9kYi5idWlsZApAQCAtMCwwICsxLDEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8cHJvamVjdD4NCisgPHRhcmdldCBuYW1lPSJhbGwiIGRlc2NyaXB0aW9uPSJCdWlsZCBhbGwgdGFyZ2V0cy4iPg0KKyAgIDxzb2x1dGlvbiBjb25maWd1cmF0aW9uPSJyZWxlYXNlIj4NCisgICAgIDxwcm9qZWN0cz4NCisgICAgICAgPGluY2x1ZGUgbmFtZT0iZGJfc3RhdGljLnZjcHJvaiIgLz4NCisgICAgIDwvcHJvamVjdHM+DQorICAgPC9zb2x1dGlvbj4NCisgPC90YXJnZXQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L2ZpZWxkMy5weSBiL1BDYnVpbGQ4L2ZpZWxkMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQ5NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvZmllbGQzLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMgQW4gYWJzdXJkIHdvcmthcm91bmQgZm9yIHRoZSBsYWNrIG9mIGFyaXRobWV0aWMgaW4gTVMncyByZXNvdXJjZSBjb21waWxlci4NCisjIEFmdGVyIGJ1aWxkaW5nIFB5dGhvbiwgcnVuIHRoaXMsIHRoZW4gcGFzdGUgdGhlIG91dHB1dCBpbnRvIHRoZSBhcHByb3ByaWF0ZQ0KKyMgcGFydCBvZiBQQ1xweXRob25fbnQucmMuDQorIyBFeGFtcGxlIG91dHB1dDoNCisjDQorIyAqIEZvciAyLjNhMCwNCisjICogUFlfTUlDUk9fVkVSU0lPTiA9IDANCisjICogUFlfUkVMRUFTRV9MRVZFTCA9ICdhbHBoYScgPSAweEENCisjICogUFlfUkVMRUFTRV9TRVJJQUwgPSAxDQorIyAqDQorIyAqIGFuZCAwKjEwMDAgKyAxMCoxMCArIDEgPSAxMDEuDQorIyAqLw0KKyMgI2RlZmluZSBGSUVMRDMgMTAxDQorDQoraW1wb3J0IHN5cw0KKw0KK21ham9yLCBtaW5vciwgbWljcm8sIGxldmVsLCBzZXJpYWwgPSBzeXMudmVyc2lvbl9pbmZvDQorbGV2ZWxudW0gPSB7J2FscGhhJzogMHhBLA0KKyAgICAgICAgICAgICdiZXRhJzogMHhCLA0KKyAgICAgICAgICAgICdjYW5kaWRhdGUnOiAweEMsDQorICAgICAgICAgICAgJ2ZpbmFsJzogMHhGLA0KKyAgICAgICAgICAgfVtsZXZlbF0NCitzdHJpbmcgPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdICMgbGlrZSAnMi4zYTAnDQorDQorcHJpbnQgIiAqIEZvciAlcywiICUgc3RyaW5nDQorcHJpbnQgIiAqIFBZX01JQ1JPX1ZFUlNJT04gPSAlZCIgJSBtaWNybw0KK3ByaW50ICIgKiBQWV9SRUxFQVNFX0xFVkVMID0gJXIgPSAlcyIgJSAobGV2ZWwsIGhleChsZXZlbG51bSkpDQorcHJpbnQgIiAqIFBZX1JFTEVBU0VfU0VSSUFMID0gJWQiICUgc2VyaWFsDQorcHJpbnQgIiAqIg0KKw0KK2ZpZWxkMyA9IG1pY3JvICogMTAwMCArIGxldmVsbnVtICogMTAgKyBzZXJpYWwNCisNCitwcmludCAiICogYW5kICVkKjEwMDAgKyAlZCoxMCArICVkID0gJWQiICUgKG1pY3JvLCBsZXZlbG51bSwgc2VyaWFsLCBmaWVsZDMpDQorcHJpbnQgIiAqLyINCitwcmludCAiI2RlZmluZSBGSUVMRDMiLCBmaWVsZDMNCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9pbnN0YWxsZXIuYm1wIGIvUENidWlsZDgvaW5zdGFsbGVyLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc1ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvaW5zdGFsbGVyLmJtcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9tYWtlX2J1aWxkaW5mby5jIGIvUENidWlsZDgvbWFrZV9idWlsZGluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJlN2FmCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvbWFrZV9idWlsZGluZm8uYwpAQCAtMCwwICsxLDkyIEBACisjaW5jbHVkZSA8d2luZG93cy5oPg0KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisNCisvKiBUaGlzIGZpbGUgY3JlYXRlcyB0aGUgZ2V0YnVpbGRpbmZvLm8gb2JqZWN0LCBieSBmaXJzdA0KKyAgIGludm9raW5nIHN1YndjcmV2LmV4ZSAoaWYgZm91bmQpLCBhbmQgdGhlbiBpbnZva2luZyBjbC5leGUuDQorICAgQXMgYSBzaWRlIGVmZmVjdCwgaXQgbWlnaHQgZ2VuZXJhdGUgUENCdWlsZFxnZXRidWlsZGluZm8yLmMNCisgICBhbHNvLiBJZiB0aGlzIGlzbid0IGEgc3VidmVyc2lvbiBjaGVja291dCwgb3Igc3Vid2NyZXYgaXNuJ3QNCisgICBmb3VuZCwgaXQgY29tcGlsZXMgLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIGluc3RlYWQuDQorDQorICAgQ3VycmVudGx5LCBzdWJ3Y3Jldi5leGUgaXMgZm91bmQgZnJvbSB0aGUgcmVnaXN0cnkgZW50cmllcw0KKyAgIG9mIFRvcnRvaXNlU1ZOLg0KKw0KKyAgIE5vIGF0dGVtcHQgaXMgbWFkZSB0byBwbGFjZSBnZXRidWlsZGluZm8ubyBpbnRvIHRoZSBwcm9wZXINCisgICBiaW5hcnkgZGlyZWN0b3J5LiBUaGlzIGlzbid0IG5lY2Vzc2FyeSwgYXMgdGhpcyB0b29sIGlzDQorICAgaW52b2tlZCBhcyBhIHByZS1saW5rIHN0ZXAgZm9yIHB5dGhvbmNvcmUsIHNvIHRoYXQgb3ZlcndyaXRlcw0KKyAgIGFueSBwcmV2aW91cyBnZXRidWlsZGluZm8uby4NCisNCisqLw0KKw0KK2ludCBtYWtlX2J1aWxkaW5mbzIoKQ0KK3sNCisJc3RydWN0IF9zdGF0IHN0Ow0KKwlIS0VZIGhUb3J0b2lzZTsNCisJY2hhciBjb21tYW5kWzUwMF07DQorCURXT1JEIHR5cGUsIHNpemU7DQorCWlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQ0KKwkJcmV0dXJuIDA7DQorCS8qIEFsbG93IHN1cHByZXNzaW9uIG9mIHN1YndjcmV2LmV4ZSBpbnZvY2F0aW9uIGlmIGEgbm9fc3Vid2NyZXYgZmlsZSBpcyBwcmVzZW50LiAqLw0KKwlpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQ0KKwkJcmV0dXJuIDA7DQorCWlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MgJiYNCisJICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQ0KKwkJLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLw0KKwkJcmV0dXJuIDA7DQorCWNvbW1hbmRbMF0gPSAnIic7ICAvKiBxdW90ZSB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSAqLw0KKwlzaXplID0gc2l6ZW9mKGNvbW1hbmQpIC0gMTsNCisJaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoVG9ydG9pc2UsICJEaXJlY3RvcnkiLCAwLCAmdHlwZSwgY29tbWFuZCsxLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUyB8fA0KKwkgICAgdHlwZSAhPSBSRUdfU1opDQorCQkvKiBSZWdpc3RyeSBjb3JydXB0ZWQgKi8NCisJCXJldHVybiAwOw0KKwlzdHJjYXQoY29tbWFuZCwgImJpblxcc3Vid2NyZXYuZXhlIik7DQorCWlmIChfc3RhdChjb21tYW5kKzEsICZzdCkgPCAwKQ0KKwkJLyogc3Vid2NyZXYuZXhlIG5vdCBwYXJ0IG9mIHRoZSByZWxlYXNlICovDQorCQlyZXR1cm4gMDsNCisJc3RyY2F0KGNvbW1hbmQsICJcIiAuLiAuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7DQorCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOw0KKwlpZiAoc3lzdGVtKGNvbW1hbmQpIDwgMCkNCisJCXJldHVybiAwOw0KKwlyZXR1cm4gMTsNCit9DQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIqYXJndltdKQ0KK3sNCisJY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7DQorCWludCBkb191bmxpbmssIHJlc3VsdDsNCisJaWYgKGFyZ2MgIT0gMikgew0KKwkJZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7DQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOw0KKwl9DQorCWlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7DQorCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAiKTsNCisJfQ0KKwllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgew0KKwkJc3RyY2F0KGNvbW1hbmQsICItRF9ERUJVRyAtTURkICIpOw0KKwl9DQorCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7DQorCQlzdHJjYXQoY29tbWFuZCwgIi1NRCAvVVNFQ0w6TVNfSVRBTklVTSAiKTsNCisJfQ0KKwllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsNCisJCXN0cmNhdChjb21tYW5kLCAiLU1EICIpOw0KKwkJc3RyY2F0KGNvbW1hbmQsICItTUQgL1VTRUNMOk1TX09QVEVST04gIik7DQorCX0NCisJZWxzZSB7DQorCQlmcHJpbnRmKHN0ZGVyciwgInVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gJXNcbiIsIGFyZ3ZbMV0pOw0KKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsNCisJfQ0KKw0KKwlpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkNCisJCXN0cmNhdChjb21tYW5kLCAiZ2V0YnVpbGRpbmZvMi5jIC1EU1VCV0NSRVYgIik7DQorCWVsc2UNCisJCXN0cmNhdChjb21tYW5kLCAiLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIik7DQorCXN0cmNhdChjb21tYW5kLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXEluY2x1ZGUgLUkuLlxcUEMiKTsNCisJcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7DQorCXJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsNCisJaWYgKGRvX3VubGluaykNCisJCXVubGluaygiZ2V0YnVpbGRpbmZvMi5jIik7DQorCWlmIChyZXN1bHQgPCAwKQ0KKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsNCisJcmV0dXJuIDA7DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L21ha2VfYnVpbGRpbmZvLnZjcHJvaiBiL1BDYnVpbGQ4L21ha2VfYnVpbGRpbmZvLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTcyNjYzCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvbWFrZV9idWlsZGluZm8udmNwcm9qCkBAIC0wLDAgKzEsMTg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ3aW5kb3dzLTEyNTAiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOCwwMCINCisJTmFtZT0ibWFrZV9idWlsZGluZm8iDQorCVByb2plY3RHVUlEPSJ7QzczRjBFQzEtMzU4Qi00MTc3LTk0MEYtMDg0NkFDOEIwNENEfSINCisJS2V5d29yZD0iV2luMzJQcm9qIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2VcbWFrZV9idWlsZGluZm8iDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9tYWtlX2J1aWxkaW5mby5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIkKE91dERpcikvbWFrZV9idWlsZGluZm8ucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1yZWxlYXNlXG1ha2VfYnVpbGRpbmZvIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ09OU09MRTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9IiQoT3V0RGlyKS9tYWtlX2J1aWxkaW5mby5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiINCisJCQkJRW5hYmxlQ09NREFURm9sZGluZz0iMiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9ImNwcDtjO2N4eDtkZWY7b2RsO2lkbDtocGo7YmF0O2FzbTthc214Ig0KKwkJCVVuaXF1ZUlkZW50aWZpZXI9Ins0RkM3MzdGMS1DN0E1LTQzNzYtQTA2Ni0yQTMyRDc1MkEyRkZ9Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cbWFrZV9idWlsZGluZm8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9tYWtlX3ZlcnNpb25pbmZvLnZjcHJvaiBiL1BDYnVpbGQ4L21ha2VfdmVyc2lvbmluZm8udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MmM0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9tYWtlX3ZlcnNpb25pbmZvLnZjcHJvagpAQCAtMCwwICsxLDIwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjguMDAiDQorCU5hbWU9Im1ha2VfdmVyc2lvbmluZm8iDQorCVByb2plY3RHVUlEPSJ7RjBFMDU0MUUtRjE3RC00MzBCLTk3QzQtOTNBREYwREQyODRFfSINCisJUm9vdE5hbWVzcGFjZT0ibWFrZV92ZXJzaW9uaW5mbyINCisJU2NjUHJvamVjdE5hbWU9Im1ha2VfdmVyc2lvbmluZm8iDQorCVNjY0xvY2FsUGF0aD0iLi4iDQorCVNjY1Byb3ZpZGVyPSJNU1NDQ0k6UGVyZm9yY2UgU0NNIg0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1yZWxlYXNlXG1ha2VfdmVyc2lvbmluZm8iDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkJQ29tbWFuZExpbmU9Ii5cbWFrZV92ZXJzaW9uaW5mby5leGUgJmd0Oy4uXFBDXHB5dGhvbm50X3JjLmgmI3gwRDsmI3gwQTsiDQorCQkJCU91dHB1dHM9Ii4uXFBDXHB5dGhvbm50X3JjLmgiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLlwuL21ha2VfdmVyc2lvbmluZm8uZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vbWFrZV92ZXJzaW9uaW5mby5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWQwMDAwMDAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iJChUYXJnZXRGaWxlTmFtZSkgJmd0OyAuLlxQQ1xweXRob25fbnQuaCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcbWFrZV92ZXJzaW9uaW5mbyINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iLlxtYWtlX3ZlcnNpb25pbmZvX2QuZXhlICZndDsuLlxQQ1xweXRob25udF9yY19kLmgmI3gwRDsmI3gwQTsiDQorCQkJCU91dHB1dHM9Ii4uXFBDXHB5dGhvbm50X3JjX2QuaCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DT05TT0xFIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJvZGJjY3AzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vbWFrZV92ZXJzaW9uaW5mb19kLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL21ha2VfdmVyc2lvbmluZm9fZC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWQwMDAwMDAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCQlDb21tYW5kTGluZT0iJChUYXJnZXRGaWxlTmFtZSkgJmd0OyAuLlxQQ1xweXRob25fbnRfZC5oIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xtYWtlX3ZlcnNpb25pbmZvLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9wY2J1aWxkLnNsbiBiL1BDYnVpbGQ4L3BjYnVpbGQuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTNmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9wY2J1aWxkLnNsbgpAQCAtMCwwICsxLDE4NSBAQAorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMA0KKyMgVmlzdWFsIFN0dWRpbyAyMDA1DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJweXRob25jb3JlIiwgInB5dGhvbmNvcmUudmNwcm9qIiwgIntDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7QzczRjBFQzEtMzU4Qi00MTc3LTk0MEYtMDg0NkFDOEIwNENEfSA9IHtDNzNGMEVDMS0zNThCLTQxNzctOTQwRi0wODQ2QUM4QjA0Q0R9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAicHl0aG9udyIsICJweXRob253LnZjcHJvaiIsICJ7RjQyMjlDQzMtODczQy00OUFFLTk3MjktREQzMDhFRDRDRDRBfSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJe0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0gPSB7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gInNlbGVjdCIsICJzZWxlY3QudmNwcm9qIiwgIns5NzIzOUE1Ni1EQkMwLTQxRDItQkMxNC1DODdEOUI5N0Q2M0J9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fSA9IHtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidW5pY29kZWRhdGEiLCAidW5pY29kZWRhdGEudmNwcm9qIiwgIntGQTVGQzdFQi1DNzJGLTQxNUYtQUU0Mi05MURENjA1QUJEREF9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fSA9IHtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAidzl4cG9wZW4iLCAidzl4cG9wZW4udmNwcm9qIiwgIntFOUUwQTFGNi0wMDA5LTRFOEMtQjhGOC0xQjhGNUQ0OUEwNTh9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIndpbnNvdW5kIiwgIndpbnNvdW5kLnZjcHJvaiIsICJ7NTFGMzVGQUUtRkI5Mi00QjJDLTkxODctMTU0MkMwNjVBRDc3fSINCisJUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdA0KKwkJe0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0gPSB7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fQ0KKwlFbmRQcm9qZWN0U2VjdGlvbg0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIl9lbGVtZW50dHJlZSIsICJfZWxlbWVudHRyZWUudmNwcm9qIiwgInsxOTY2RERFMi00QUI3LTRFNEUtQUNDOS1DMTIxRTREMzdGOEV9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fSA9IHtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAibWFrZV9idWlsZGluZm8iLCAibWFrZV9idWlsZGluZm8udmNwcm9qIiwgIntDNzNGMEVDMS0zNThCLTQxNzctOTQwRi0wODQ2QUM4QjA0Q0R9Ig0KK0VuZFByb2plY3QNCitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIl9tc2kiLCAiX21zaS52Y3Byb2oiLCAiezJDMEJFRkI5LTcwRTItNEY4MC1BQzVCLTRBQjhFRTAyMzU3NH0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9ID0ge0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJfY3R5cGVzIiwgIl9jdHlwZXMudmNwcm9qIiwgIntGMjJGNDBGNC1EMzE4LTQwREMtOTZCMy04OERDODFDRTA4OTR9Ig0KKwlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fSA9IHtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9DQorCUVuZFByb2plY3RTZWN0aW9uDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiX2N0eXBlc190ZXN0IiwgIl9jdHlwZXNfdGVzdC52Y3Byb2oiLCAiezhDRjMzNEQ5LTRGODItNDJFQi05N0FGLTgzNTkyQzVBRkQyRn0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXtGMjJGNDBGNC1EMzE4LTQwREMtOTZCMy04OERDODFDRTA4OTR9ID0ge0YyMkY0MEY0LUQzMTgtNDBEQy05NkIzLTg4REM4MUNFMDg5NH0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJfc3FsaXRlMyIsICJfc3FsaXRlMy52Y3Byb2oiLCAiezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0iDQorCVByb2plY3RTZWN0aW9uKFByb2plY3REZXBlbmRlbmNpZXMpID0gcG9zdFByb2plY3QNCisJCXtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9ID0ge0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0NCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJTb2x1dGlvbiBJdGVtcyIsICJTb2x1dGlvbiBJdGVtcyIsICJ7OEIxNzIyNjUtMUYzMS00ODgwLUEyOUMtMTFBNEI3QTgwMTcyfSINCisJUHJvamVjdFNlY3Rpb24oU29sdXRpb25JdGVtcykgPSBwcmVQcm9qZWN0DQorCQkuLlxNb2R1bGVzXGdldGJ1aWxkaW5mby5jID0gLi5cTW9kdWxlc1xnZXRidWlsZGluZm8uYw0KKwkJcmVhZG1lLnR4dCA9IHJlYWRtZS50eHQNCisJRW5kUHJvamVjdFNlY3Rpb24NCitFbmRQcm9qZWN0DQorUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJweXRob25jb3JlX3BnbyIsICJweXRob25jb3JlX3Bnby52Y3Byb2oiLCAiezhCNTlDMUZGLTI0MzktNEJFOS05RjI0LTg0RDQ5ODJEMjhENH0iDQorRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAicHl0aG9uIiwgInB5dGhvbi52Y3Byb2oiLCAie0IxMUQ3NTBGLUNEMUYtNEE5Ni04NUNFLUU2OUE1QzUyNTlGOX0iDQorRW5kUHJvamVjdA0KK0dsb2JhbA0KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KKwkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCisJCVJlbGVhc2VBTUQ2NHxXaW4zMiA9IFJlbGVhc2VBTUQ2NHxXaW4zMg0KKwkJUmVsZWFzZUl0YW5pdW18V2luMzIgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXtDRjdBQzNEMS1FMkRGLTQxRDItQkVBNi0xRTI1NTZDREVBMjZ9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7Q0Y3QUMzRDEtRTJERi00MUQyLUJFQTYtMUUyNTU2Q0RFQTI2fS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJe0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7RjQyMjlDQzMtODczQy00OUFFLTk3MjktREQzMDhFRDRDRDRBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0Y0MjI5Q0MzLTg3M0MtNDlBRS05NzI5LUREMzA4RUQ0Q0Q0QX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7RjQyMjlDQzMtODczQy00OUFFLTk3MjktREQzMDhFRDRDRDRBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtGNDIyOUNDMy04NzNDLTQ5QUUtOTcyOS1ERDMwOEVENENENEF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtGNDIyOUNDMy04NzNDLTQ5QUUtOTcyOS1ERDMwOEVENENENEF9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXtGNDIyOUNDMy04NzNDLTQ5QUUtOTcyOS1ERDMwOEVENENENEF9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7RjQyMjlDQzMtODczQy00OUFFLTk3MjktREQzMDhFRDRDRDRBfS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJe0Y0MjI5Q0MzLTg3M0MtNDlBRS05NzI5LUREMzA4RUQ0Q0Q0QX0uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7OTcyMzlBNTYtREJDMC00MUQyLUJDMTQtQzg3RDlCOTdENjNCfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezk3MjM5QTU2LURCQzAtNDFEMi1CQzE0LUM4N0Q5Qjk3RDYzQn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7OTcyMzlBNTYtREJDMC00MUQyLUJDMTQtQzg3RDlCOTdENjNCfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs5NzIzOUE1Ni1EQkMwLTQxRDItQkMxNC1DODdEOUI5N0Q2M0J9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs5NzIzOUE1Ni1EQkMwLTQxRDItQkMxNC1DODdEOUI5N0Q2M0J9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXs5NzIzOUE1Ni1EQkMwLTQxRDItQkMxNC1DODdEOUI5N0Q2M0J9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7OTcyMzlBNTYtREJDMC00MUQyLUJDMTQtQzg3RDlCOTdENjNCfS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJezk3MjM5QTU2LURCQzAtNDFEMi1CQzE0LUM4N0Q5Qjk3RDYzQn0uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7RkE1RkM3RUItQzcyRi00MTVGLUFFNDItOTFERDYwNUFCRERBfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0ZBNUZDN0VCLUM3MkYtNDE1Ri1BRTQyLTkxREQ2MDVBQkREQX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7RkE1RkM3RUItQzcyRi00MTVGLUFFNDItOTFERDYwNUFCRERBfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtGQTVGQzdFQi1DNzJGLTQxNUYtQUU0Mi05MURENjA1QUJEREF9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtGQTVGQzdFQi1DNzJGLTQxNUYtQUU0Mi05MURENjA1QUJEREF9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXtGQTVGQzdFQi1DNzJGLTQxNUYtQUU0Mi05MURENjA1QUJEREF9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7RkE1RkM3RUItQzcyRi00MTVGLUFFNDItOTFERDYwNUFCRERBfS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJe0ZBNUZDN0VCLUM3MkYtNDE1Ri1BRTQyLTkxREQ2MDVBQkREQX0uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7RTlFMEExRjYtMDAwOS00RThDLUI4RjgtMUI4RjVENDlBMDU4fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0U5RTBBMUY2LTAwMDktNEU4Qy1COEY4LTFCOEY1RDQ5QTA1OH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7RTlFMEExRjYtMDAwOS00RThDLUI4RjgtMUI4RjVENDlBMDU4fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtFOUUwQTFGNi0wMDA5LTRFOEMtQjhGOC0xQjhGNUQ0OUEwNTh9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtFOUUwQTFGNi0wMDA5LTRFOEMtQjhGOC0xQjhGNUQ0OUEwNTh9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7RTlFMEExRjYtMDAwOS00RThDLUI4RjgtMUI4RjVENDlBMDU4fS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7NTFGMzVGQUUtRkI5Mi00QjJDLTkxODctMTU0MkMwNjVBRDc3fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezUxRjM1RkFFLUZCOTItNEIyQy05MTg3LTE1NDJDMDY1QUQ3N30uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7NTFGMzVGQUUtRkI5Mi00QjJDLTkxODctMTU0MkMwNjVBRDc3fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs1MUYzNUZBRS1GQjkyLTRCMkMtOTE4Ny0xNTQyQzA2NUFENzd9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs1MUYzNUZBRS1GQjkyLTRCMkMtOTE4Ny0xNTQyQzA2NUFENzd9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXs1MUYzNUZBRS1GQjkyLTRCMkMtOTE4Ny0xNTQyQzA2NUFENzd9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7NTFGMzVGQUUtRkI5Mi00QjJDLTkxODctMTU0MkMwNjVBRDc3fS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJezUxRjM1RkFFLUZCOTItNEIyQy05MTg3LTE1NDJDMDY1QUQ3N30uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7MTk2NkRERTItNEFCNy00RTRFLUFDQzktQzEyMUU0RDM3RjhFfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezE5NjZEREUyLTRBQjctNEU0RS1BQ0M5LUMxMjFFNEQzN0Y4RX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MTk2NkRERTItNEFCNy00RTRFLUFDQzktQzEyMUU0RDM3RjhFfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsxOTY2RERFMi00QUI3LTRFNEUtQUNDOS1DMTIxRTREMzdGOEV9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsxOTY2RERFMi00QUI3LTRFNEUtQUNDOS1DMTIxRTREMzdGOEV9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXsxOTY2RERFMi00QUI3LTRFNEUtQUNDOS1DMTIxRTREMzdGOEV9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7MTk2NkRERTItNEFCNy00RTRFLUFDQzktQzEyMUU0RDM3RjhFfS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJezE5NjZEREUyLTRBQjctNEU0RS1BQ0M5LUMxMjFFNEQzN0Y4RX0uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7QzczRjBFQzEtMzU4Qi00MTc3LTk0MEYtMDg0NkFDOEIwNENEfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0M3M0YwRUMxLTM1OEItNDE3Ny05NDBGLTA4NDZBQzhCMDRDRH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7QzczRjBFQzEtMzU4Qi00MTc3LTk0MEYtMDg0NkFDOEIwNENEfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNzNGMEVDMS0zNThCLTQxNzctOTQwRi0wODQ2QUM4QjA0Q0R9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNzNGMEVDMS0zNThCLTQxNzctOTQwRi0wODQ2QUM4QjA0Q0R9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QzczRjBFQzEtMzU4Qi00MTc3LTk0MEYtMDg0NkFDOEIwNENEfS5SZWxlYXNlQU1ENjR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtDNzNGMEVDMS0zNThCLTQxNzctOTQwRi0wODQ2QUM4QjA0Q0R9LlJlbGVhc2VJdGFuaXVtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtDNzNGMEVDMS0zNThCLTQxNzctOTQwRi0wODQ2QUM4QjA0Q0R9LlJlbGVhc2VJdGFuaXVtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7MkMwQkVGQjktNzBFMi00RjgwLUFDNUItNEFCOEVFMDIzNTc0fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezJDMEJFRkI5LTcwRTItNEY4MC1BQzVCLTRBQjhFRTAyMzU3NH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MkMwQkVGQjktNzBFMi00RjgwLUFDNUItNEFCOEVFMDIzNTc0fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyQzBCRUZCOS03MEUyLTRGODAtQUM1Qi00QUI4RUUwMjM1NzR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyQzBCRUZCOS03MEUyLTRGODAtQUM1Qi00QUI4RUUwMjM1NzR9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXsyQzBCRUZCOS03MEUyLTRGODAtQUM1Qi00QUI4RUUwMjM1NzR9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7MkMwQkVGQjktNzBFMi00RjgwLUFDNUItNEFCOEVFMDIzNTc0fS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJezJDMEJFRkI5LTcwRTItNEY4MC1BQzVCLTRBQjhFRTAyMzU3NH0uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7RjIyRjQwRjQtRDMxOC00MERDLTk2QjMtODhEQzgxQ0UwODk0fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJe0YyMkY0MEY0LUQzMTgtNDBEQy05NkIzLTg4REM4MUNFMDg5NH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7RjIyRjQwRjQtRDMxOC00MERDLTk2QjMtODhEQzgxQ0UwODk0fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXtGMjJGNDBGNC1EMzE4LTQwREMtOTZCMy04OERDODFDRTA4OTR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXtGMjJGNDBGNC1EMzE4LTQwREMtOTZCMy04OERDODFDRTA4OTR9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXtGMjJGNDBGNC1EMzE4LTQwREMtOTZCMy04OERDODFDRTA4OTR9LlJlbGVhc2VJdGFuaXVtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7OENGMzM0RDktNEY4Mi00MkVCLTk3QUYtODM1OTJDNUFGRDJGfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezhDRjMzNEQ5LTRGODItNDJFQi05N0FGLTgzNTkyQzVBRkQyRn0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7OENGMzM0RDktNEY4Mi00MkVCLTk3QUYtODM1OTJDNUFGRDJGfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXs4Q0YzMzREOS00RjgyLTQyRUItOTdBRi04MzU5MkM1QUZEMkZ9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXs4Q0YzMzREOS00RjgyLTQyRUItOTdBRi04MzU5MkM1QUZEMkZ9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXs4Q0YzMzREOS00RjgyLTQyRUItOTdBRi04MzU5MkM1QUZEMkZ9LlJlbGVhc2VJdGFuaXVtfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCisJCXsyRkYwQTMxMi0yMkY5LTRDMzQtQjA3MC04NDI5MTZERTI3QTl9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCisJCXsyRkYwQTMxMi0yMkY5LTRDMzQtQjA3MC04NDI5MTZERTI3QTl9LlJlbGVhc2VBTUQ2NHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlQU1ENjR8V2luMzINCisJCXsyRkYwQTMxMi0yMkY5LTRDMzQtQjA3MC04NDI5MTZERTI3QTl9LlJlbGVhc2VBTUQ2NHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7MkZGMEEzMTItMjJGOS00QzM0LUIwNzAtODQyOTE2REUyN0E5fS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwkJezJGRjBBMzEyLTIyRjktNEMzNC1CMDcwLTg0MjkxNkRFMjdBOX0uUmVsZWFzZUl0YW5pdW18V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VJdGFuaXVtfFdpbjMyDQorCQl7OEI1OUMxRkYtMjQzOS00QkU5LTlGMjQtODRENDk4MkQyOEQ0fS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEI1OUMxRkYtMjQzOS00QkU5LTlGMjQtODRENDk4MkQyOEQ0fS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJezhCNTlDMUZGLTI0MzktNEJFOS05RjI0LTg0RDQ5ODJEMjhENH0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEI1OUMxRkYtMjQzOS00QkU5LTlGMjQtODRENDk4MkQyOEQ0fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEI1OUMxRkYtMjQzOS00QkU5LTlGMjQtODRENDk4MkQyOEQ0fS5SZWxlYXNlQU1ENjR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJezhCNTlDMUZGLTI0MzktNEJFOS05RjI0LTg0RDQ5ODJEMjhENH0uUmVsZWFzZUFNRDY0fFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEI1OUMxRkYtMjQzOS00QkU5LTlGMjQtODRENDk4MkQyOEQ0fS5SZWxlYXNlSXRhbml1bXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7OEI1OUMxRkYtMjQzOS00QkU5LTlGMjQtODRENDk4MkQyOEQ0fS5SZWxlYXNlSXRhbml1bXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0IxMUQ3NTBGLUNEMUYtNEE5Ni04NUNFLUU2OUE1QzUyNTlGOX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtCMTFENzUwRi1DRDFGLTRBOTYtODVDRS1FNjlBNUM1MjU5Rjl9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0IxMUQ3NTBGLUNEMUYtNEE5Ni04NUNFLUU2OUE1QzUyNTlGOX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQorCQl7QjExRDc1MEYtQ0QxRi00QTk2LTg1Q0UtRTY5QTVDNTI1OUY5fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQorCQl7QjExRDc1MEYtQ0QxRi00QTk2LTg1Q0UtRTY5QTVDNTI1OUY5fS5SZWxlYXNlQU1ENjR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZUFNRDY0fFdpbjMyDQorCQl7QjExRDc1MEYtQ0QxRi00QTk2LTg1Q0UtRTY5QTVDNTI1OUY5fS5SZWxlYXNlQU1ENjR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2VBTUQ2NHxXaW4zMg0KKwkJe0IxMUQ3NTBGLUNEMUYtNEE5Ni04NUNFLUU2OUE1QzUyNTlGOX0uUmVsZWFzZUl0YW5pdW18V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZUl0YW5pdW18V2luMzINCisJCXtCMTFENzUwRi1DRDFGLTRBOTYtODVDRS1FNjlBNUM1MjU5Rjl9LlJlbGVhc2VJdGFuaXVtfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlSXRhbml1bXxXaW4zMg0KKwlFbmRHbG9iYWxTZWN0aW9uDQorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCisJRW5kR2xvYmFsU2VjdGlvbg0KK0VuZEdsb2JhbA0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L3B5ZXhwYXQudmNwcm9qIGIvUENidWlsZDgvcHlleHBhdC52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhMjA3YgotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQ4L3B5ZXhwYXQudmNwcm9qCkBAIC0wLDAgKzEsMzkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOC4wMCINCisJTmFtZT0icHlleHBhdCINCisJUHJvamVjdEdVSUQ9Ins3RTU1MTM5My0zQzQzLTQ3RjgtOUYzRi01QkMzNjhBNkM0ODd9Ig0KKwlTY2NQcm9qZWN0TmFtZT0icHlleHBhdCINCisJU2NjTG9jYWxQYXRoPSIuLiINCisJU2NjUHJvdmlkZXI9Ik1TU0NDSTpQZXJmb3JjZSBTQ00iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1xweWV4cGF0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDLC4uXE1vZHVsZXNcZXhwYXQiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7SEFWRV9FWFBBVF9IO1dJTjMyO19XSU5ET1dTO1hNTF9OUztYTUxfRFREO0JZVEVPUkRFUj0xMjM0O1hNTF9DT05URVhUX0JZVEVTPTEwMjQ7WE1MX1NUQVRJQztIQVZFX01FTU1PVkUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3B5ZXhwYXRfZC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9weWV4cGF0X2QucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTAwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vcHlleHBhdF9kLmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxweWV4cGF0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlxNb2R1bGVzXGV4cGF0Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO1hNTF9OUztYTUxfRFREO0JZVEVPUkRFUj0xMjM0O1hNTF9DT05URVhUX0JZVEVTPTEwMjQ7WE1MX1NUQVRJQztIQVZFX01FTU1PVkUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9weWV4cGF0LnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3B5ZXhwYXQucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTAwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vcHlleHBhdC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLi8uIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxweWV4cGF0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlxNb2R1bGVzXGV4cGF0Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO1hNTF9OUztYTUxfRFREO0JZVEVPUkRFUj0xMjM0O1hNTF9DT05URVhUX0JZVEVTPTEwMjQ7WE1MX1NUQVRJQztIQVZFX01FTU1PVkUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0ib2RiY2NwMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3B5ZXhwYXQucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vcHlleHBhdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxMDAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9weWV4cGF0LmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0LXRlbXAtcmVsZWFzZVxweWV4cGF0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQywuLlxNb2R1bGVzXGV4cGF0Ig0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO1hNTF9OUztYTUxfRFREO0JZVEVPUkRFUj0xMjM0O1hNTF9DT05URVhUX0JZVEVTPTEwMjQ7WE1MX1NUQVRJQztIQVZFX01FTU1PVkUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpBTUQ2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9weWV4cGF0LnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3B5ZXhwYXQucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTAwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vcHlleHBhdC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHB5ZXhwYXQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xleHBhdFx4bWxwYXJzZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGV4cGF0XHhtbHJvbGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xleHBhdFx4bWx0b2suYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L3B5dGhvbi5idWlsZCBiL1BDYnVpbGQ4L3B5dGhvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFmY2MwCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvcHl0aG9uLmJ1aWxkCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/Pg0KKzxwcm9qZWN0Pg0KKyA8dGFyZ2V0IG5hbWU9ImFsbCIgZGVzY3JpcHRpb249IkJ1aWxkIGFsbCB0YXJnZXRzLiI+DQorICAgPHNvbHV0aW9uIGNvbmZpZ3VyYXRpb249InJlbGVhc2UiPg0KKyAgICAgPHByb2plY3RzPg0KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJtYWtlX3ZlcnNpb25pbmZvLnZjcHJvaiIgLz4NCisgICAgIDwvcHJvamVjdHM+DQorICAgPC9zb2x1dGlvbj4NCisgICA8ZXhlYyBwcm9ncmFtPSJtYWtlX3ZlcnNpb25pbmZvIiBvdXRwdXQ9InB5dGhvbm50X3JjLmgiIC8+DQorDQorICAgPHNvbHV0aW9uIGNvbmZpZ3VyYXRpb249InJlbGVhc2UiIHNvbHV0aW9uZmlsZT0icGNidWlsZC5zbG4iPg0KKyAgICAgPGV4Y2x1ZGVwcm9qZWN0cz4NCisgICAgICAgPGluY2x1ZGUgbmFtZT0iX3RraW50ZXIudmNwcm9qIiAvPg0KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJiejIudmNwcm9qIiAvPg0KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJfYnNkZGIudmNwcm9qIiAvPg0KKyAgICAgICA8aW5jbHVkZSBuYW1lPSJfc3FsaXRlMy52Y3Byb2oiIC8+DQorICAgICAgIDxpbmNsdWRlIG5hbWU9Il9zc2wudmNwcm9qIiAvPg0KKyAgICAgPC9leGNsdWRlcHJvamVjdHM+DQorICAgPC9zb2x1dGlvbj4NCisgPC90YXJnZXQ+DQorPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L3B5dGhvbi5pc3MgYi9QQ2J1aWxkOC9weXRob24uaXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWQ2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9weXRob24uaXNzCkBAIC0wLDAgKzEsMzQ2IEBACis7IFNjcmlwdCBnZW5lcmF0ZWQgYnkgdGhlIElubm8gU2V0dXAgU2NyaXB0IFdpemFyZC4NCis7IFNFRSBUSEUgRE9DVU1FTlRBVElPTiBGT1IgREVUQUlMUyBPTiBDUkVBVElORyBJTk5PIFNFVFVQIFNDUklQVCBGSUxFUyENCisNCis7IFRoaXMgaXMgdGhlIHdob2xlIGJhbGwgb2Ygd2F4IGZvciBhbiBJbm5vIGluc3RhbGxlciBmb3IgUHl0aG9uLg0KKzsgVG8gdXNlLCBkb3dubG9hZCBJbm5vIFNldHVwIGZyb20gaHR0cDovL3d3dy5qcnNvZnR3YXJlLm9yZy9pc2RsLmh0bS8sDQorOyBpbnN0YWxsIGl0LCBhbmQgZG91YmxlLWNsaWNrIG9uIHRoaXMgZmlsZS4gIFRoYXQgbGF1bmNoZXMgdGhlIElubm8NCis7IHNjcmlwdCBjb21waWxlci4gIFRoZSBHVUkgaXMgZXh0ZW1lbHkgc2ltcGxlLCBhbmQgaGFzIG9ubHkgb25lIGJ1dHRvbg0KKzsgeW91IG1heSBub3QgcmVjb2duaXplIGluc3RhbnRseTogIGNsaWNrIGl0LiAgWW91J3JlIGRvbmUuICBJdCBidWlsZHMNCis7IHRoZSBpbnN0YWxsZXIgaW50byBQQ0J1aWxkL1B5dGhvbi0yLjJhMS5leGUuICBTaXplIGFuZCBzcGVlZCBvZiB0aGUNCis7IGluc3RhbGxlciBhcmUgY29tcGV0aXRpdmUgd2l0aCB0aGUgV2lzZSBpbnN0YWxsZXI7IElubm8gdW5pbnN0YWxsDQorOyBzZWVtcyBtdWNoIHF1aWNrZXIgdGhhbiBXaXNlIChidXQgYWxzbyBmZWVibGVyLCBhbmQgdGhlIHVuaW5zdGFsbA0KKzsgbG9nIGlzIGluIHNvbWUgdW4oaHVtYW4pcmVhZGFibGUgYmluYXJ5IGZvcm1hdCkuDQorOw0KKzsgV2hhdCdzIERvbmUNCis7IC0tLS0tLS0tLS0tDQorOyBBbGwgdGhlIHVzdWFsIFdpbmRvd3MgUHl0aG9uIGZpbGVzIGFyZSBpbnN0YWxsZWQgYnkgdGhpcyBub3cuDQorOyBBbGwgdGhlIHVzdWFsIFdpbmRvd3MgUHl0aG9uIFN0YXJ0IG1lbnUgZW50cmllcyBhcmUgY3JlYXRlZCBhbmQNCis7IHdvcmsgZmluZS4NCis7IC5weSwgLnB5dywgLnB5YyBhbmQgLnB5byBleHRlbnNpb25zIGFyZSByZWdpc3RlcmVkLg0KKzsgICAgIFBST0JMRU06ICBJbm5vIHVuaW5zdGFsbCBkb2VzIG5vdCByZXN0b3JlIHRoZWlyIHByZXZpb3VzIHJlZ2lzdHJ5DQorOyAgICAgICAgICAgICAgIGFzc29jaWF0aW9ucyAoaWYgYW55KS4gIFdpc2UgZGlkLiAgVGhpcyB3aWxsIG1ha2UgbGlmZQ0KKzsgICAgICAgICAgICAgICBkaWZmaWN1bHQgZm9yIGFscGhhIChldGMpIHRlc3RlcnMuDQorOyBUaGUgUHl0aG9uIGluc3RhbGwgaXMgZnVsbHkgZnVuY3Rpb25hbCBmb3IgInR5cGljYWwiIHVzZXMuDQorOw0KKzsgV2hhdCdzIE5vdCBEb25lDQorOyAtLS0tLS0tLS0tLS0tLS0NCis7IE5vbmUgb2YgIk1hcmsgSGFtbW9uZCdzIiByZWdpc3RyeSBlbnRyaWVzIGFyZSB3cml0dGVuLg0KKzsgTm8gaW5zdGFsbGF0aW9uIG9mIGZpbGVzIGlzIGRvbmUgaW50byB0aGUgc3lzdGVtIGRpcjoNCis7ICAgICBUaGUgTVMgRExMcyBhcmVuJ3QgaGFuZGxlZCBhdCBhbGwgYnkgdGhpcyB5ZXQuDQorOyAgICAgUHl0aG9uMjIuZGxsIGlzIHVucGFja2VkIGludG8gdGhlIG1haW4gUHl0aG9uIGRpci4NCis7DQorOyBJbm5vIGNhbid0IGRvIGRpZmZlcmVudCB0aGluZ3Mgb24gTlQvMjAwMCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdXNlcg0KKzsgaGFzIEFkbWluIHByaXZpbGVnZXMsIHNvIEkgZG9uJ3Qga25vdyBob3cgdG8gInNvbHZlIiBlaXRoZXIgb2YgdGhvc2UsDQorOyBzaG9ydCBvZiBidWlsZGluZyB0d28gaW5zdGFsbGVycyAob25lICpyZXF1aXJpbmcqIEFkbWluIHByaXZzLCB0aGUNCis7IG90aGVyIG5vdCBkb2luZyBhbnl0aGluZyB0aGF0IG5lZWRzIEFkbWluIHByaXZzKS4NCis7DQorOyBJbm5vIGhhcyBubyBjb25jZXB0IG9mIHZhcmlhYmxlcywgc28gbG90cyBvZiBsaW5lcyBpbiB0aGlzIGZpbGUgbmVlZA0KKzsgdG8gYmUgZmlkZGxlZCBieSBoYW5kIGFjcm9zcyByZWxlYXNlcy4gIFNpbXBsZXN0IHdheSBvdXQ6ICBzdGljayB0aGlzDQorOyBmaWxlIGluIGEgZ2lhbnQgdHJpcGxlLXF1b3RlZCByLXN0cmluZyAobm90ZSB0aGF0IGJhY2tzbGFzaGVzIGFyZQ0KKzsgcmVxdWlyZWQgYWxsIG92ZXIgdGhlIHBsYWNlIGhlcmUgLS0gZm9yd2FyZCBzbGFzaGVzIERPTidUIFdPUksgaW4NCis7IElubm8pLCBhbmQgdXNlICUoeWFkZGEpcyBzdHJpbmcgaW50ZXJwb2xhdGlvbiB0byBkbyBzdWJzdGl0dXRpb25zOyBpLmUuLA0KKzsgd3JpdGUgYSB2ZXJ5IHNpbXBsZSBQeXRob24gcHJvZ3JhbSB0byAqcHJvZHVjZSogdGhpcyBzY3JpcHQuDQorDQorW1NldHVwXQ0KK0FwcE5hbWU9UHl0aG9uIGFuZCBjb21iaW5lZCBXaW4zMiBFeHRlbnNpb25zDQorQXBwVmVyTmFtZT1QeXRob24gMi4yLjIgYW5kIGNvbWJpbmVkIFdpbjMyIEV4dGVuc2lvbnMgMTUwDQorQXBwSWQ9UHl0aG9uIDIuMi4yLjE1MA0KK0FwcFZlcnNpb249Mi4yLjIuMTUwDQorQXBwQ29weXJpZ2h0PVB5dGhvbiBpcyBDb3B5cmlnaHQgqSAyMDAxIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBXaW4zMiBFeHRlbnNpb25zIGFyZSBDb3B5cmlnaHQgqSAxOTk2LTIwMDEgR3JlZyBTdGVpbiBhbmQgTWFyayBIYW1tb25kLg0KKw0KKzsgRGVmYXVsdCBpbnN0YWxsIGRpcjsgdmFsdWUgb2Yge2FwcH0gbGF0ZXIgKHVubGVzcyB1c2VyIG92ZXJyaWRlcykuDQorOyB7c2R9ID0gc3lzdGVtIHJvb3QgZHJpdmUsIHByb2JhYmx5ICJDOiIuDQorRGVmYXVsdERpck5hbWU9e3NkfVxQeXRob24yMg0KKztEZWZhdWx0RGlyTmFtZT17cGZ9XFB5dGhvbg0KKw0KKzsgU3RhcnQgbWVudSBmb2xkZXIgbmFtZTsgdmFsdWUgb2Yge2dyb3VwfSBsYXRlciAodW5sZXNzIHVzZXIgb3ZlcnJpZGVzKS4NCitEZWZhdWx0R3JvdXBOYW1lPVB5dGhvbiAyLjINCisNCis7IFBvaW50IFNvdXJjZURpciB0byBvbmUgYWJvdmUgUENCdWlsZCA9IHNyYy4NCis7IG1lYW5zIHRoaXMgc2NyaXB0IGNhbiBydW4gdW5jaGFuZ2VkIGZyb20gYW55b25lJ3MgQ1ZTIHRyZWUsIG5vIG1hdHRlcg0KKzsgd2hhdCB0aGV5IGNhbGxlZCB0aGUgdG9wLWxldmVsIGRpcmVjdG9yaWVzLg0KK1NvdXJjZURpcj0uDQorT3V0cHV0RGlyPS4uDQorT3V0cHV0QmFzZUZpbGVuYW1lPVB5dGhvbi0yLjIuMi1XaW4zMi0xNTAtU2V0dXANCisNCitBcHBQdWJsaXNoZXI9UHl0aG9uTGFicyBhdCBEaWdpdGFsIENyZWF0aW9ucw0KK0FwcFB1Ymxpc2hlclVSTD1odHRwOi8vd3d3LnB5dGhvbi5vcmcNCitBcHBTdXBwb3J0VVJMPWh0dHA6Ly93d3cucHl0aG9uLm9yZw0KK0FwcFVwZGF0ZXNVUkw9aHR0cDovL3d3dy5weXRob24ub3JnDQorDQorQWx3YXlzQ3JlYXRlVW5pbnN0YWxsSWNvbj10cnVlDQorQ2hhbmdlc0Fzc29jaWF0aW9ucz10cnVlDQorVW5pbnN0YWxsTG9nTW9kZT1uZXcNCitBbGxvd05vSWNvbnM9dHJ1ZQ0KK0FkbWluUHJpdmlsZWdlc1JlcXVpcmVkPXRydWUNCitVbmluc3RhbGxEaXNwbGF5SWNvbj17YXBwfVxweWMuaWNvDQorV2l6YXJkRGVidWc9ZmFsc2UNCisNCis7IFRoZSBmZXdlciBzY3JlZW5zIHRoZSBiZXR0ZXI7IGxlYXZlIHRoZXNlIGNvbW1lbnRlZC4NCisNCitDb21wcmVzc2lvbj1iemlwDQorSW5mb0JlZm9yZUZpbGU9TElDRU5TRS50eHQNCis7SW5mb0JlZm9yZUZpbGU9TWlzY1xORVdTDQorDQorOyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHlvdSB3YW50IHlvdXIgaW5zdGFsbGF0aW9uIHRvIHJ1biBvbiBOVCAzLjUxIHRvby4NCis7IE1pblZlcnNpb249NCwzLjUxDQorDQorW1R5cGVzXQ0KK05hbWU6IG5vcm1hbDsgRGVzY3JpcHRpb246IFNlbGVjdCBkZXNpcmVkIGNvbXBvbmVudHM7IEZsYWdzOiBpc2N1c3RvbQ0KKw0KK1tDb21wb25lbnRzXQ0KK05hbWU6IG1haW47IERlc2NyaXB0aW9uOiBQeXRob24gYW5kIFdpbjMyIEV4dGVuc2lvbnM7IFR5cGVzOiBub3JtYWwNCitOYW1lOiBkb2NzOyBEZXNjcmlwdGlvbjogUHl0aG9uIGRvY3VtZW50YXRpb24gKEhUTUwpOyBUeXBlczogbm9ybWFsDQorTmFtZTogdGs7IERlc2NyaXB0aW9uOiBUQ0wvVEssIHRraW50ZXIsIGFuZCBJZGxlOyBUeXBlczogbm9ybWFsDQorTmFtZTogdG9vbHM7IERlc2NyaXB0aW9uOiBQeXRob24gdXRpbGl0eSBzY3JpcHRzIChUb29sc1wpOyBUeXBlczogbm9ybWFsDQorTmFtZTogdGVzdDsgRGVzY3JpcHRpb246IFB5dGhvbiB0ZXN0IHN1aXRlIChMaWJcdGVzdFwpOyBUeXBlczogbm9ybWFsDQorDQorW1Rhc2tzXQ0KK05hbWU6IGV4dGVuc2lvbnM7IERlc2NyaXB0aW9uOiBSZWdpc3RlciBmaWxlIGFzc29jaWF0aW9ucyAoLnB5LCAucHl3LCAucHljLCAucHlvKTsgQ29tcG9uZW50czogbWFpbjsgQ2hlY2s6IElzQWRtaW5Mb2dnZWRPbg0KKw0KK1tGaWxlc10NCis7IENhdXRpb246ICBVc2luZyBmb3J3YXJkIHNsYXNoZXMgaW5zdGVhZCBzY3Jld3MgdXAgaW4gYW1hemluZyB3YXlzLg0KKzsgVW5rbm93bjogIEJ5IHRoZSB0aW1lIENvbXBvbmVudHMgKGFuZCBvdGhlciBhdHRycykgYXJlIGFkZGVkIHRvIHRoZXNlIGxpbmVzLCB0aGV5J3JlDQorOyBnb2luZyB0byBnZXQgYXdmdWxseSBsb25nLiAgQnV0IGRvbid0IHNlZSBhIHdheSB0byBjb250aW51ZSBsb2dpY2FsIGxpbmVzIGFjcm9zcw0KKzsgcGh5c2ljYWwgbGluZXMuDQorDQorU291cmNlOiBMSUNFTlNFLnR4dDsgRGVzdERpcjoge2FwcH07IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGUNCitTb3VyY2U6IFJFQURNRS50eHQ7IERlc3REaXI6IHthcHB9OyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlDQorU291cmNlOiBOZXdzLnR4dDsgRGVzdERpcjoge2FwcH07IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGUNCitTb3VyY2U6ICouaWNvOyBEZXN0RGlyOiB7YXBwfTsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogcHl0aG9uLmV4ZTsgRGVzdERpcjoge2FwcH07IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCitTb3VyY2U6IHB5dGhvbncuZXhlOyBEZXN0RGlyOiB7YXBwfTsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KK1NvdXJjZTogdzl4cG9wZW4uZXhlOyBEZXN0RGlyOiB7YXBwfTsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KKw0KK1NvdXJjZTogRExMc1x0Y2w4My5kbGw7IERlc3REaXI6IHthcHB9XERMTHM7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IHRrDQorU291cmNlOiBETExzXHRrODMuZGxsOyBEZXN0RGlyOiB7YXBwfVxETExzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiB0aw0KK1NvdXJjZTogdGNsXCouKjsgRGVzdERpcjoge2FwcH1cdGNsOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiB0azsgRmxhZ3M6IHJlY3Vyc2VzdWJkaXJzDQorDQorU291cmNlOiBzeXNkaXJccHl0aG9uMjIuZGxsOyBEZXN0RGlyOiB7c3lzfTsgQ29weU1vZGU6IGFsd2F5c3NraXBpZnNhbWVvcm9sZGVyOyBDb21wb25lbnRzOiBtYWluOyBGbGFnczogc2hhcmVkZmlsZSByZXN0YXJ0cmVwbGFjZQ0KK1NvdXJjZTogc3lzZGlyXFB5V2luVHlwZXMyMi5kbGw7IERlc3REaXI6IHtzeXN9OyBDb3B5TW9kZTogYWx3YXlzc2tpcGlmc2FtZW9yb2xkZXI7IENvbXBvbmVudHM6IG1haW47IEZsYWdzOiByZXN0YXJ0cmVwbGFjZSBzaGFyZWRmaWxlDQorU291cmNlOiBzeXNkaXJccHl0aG9uY29tMjIuZGxsOyBEZXN0RGlyOiB7c3lzfTsgQ29weU1vZGU6IGFsd2F5c3NraXBpZnNhbWVvcm9sZGVyOyBDb21wb25lbnRzOiBtYWluOyBGbGFnczogcmVzdGFydHJlcGxhY2Ugc2hhcmVkZmlsZQ0KKw0KK1NvdXJjZTogRExMc1xfc29ja2V0LnB5ZDsgRGVzdERpcjoge2FwcH1cRExMczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KK1NvdXJjZTogbGlic1xfc29ja2V0LmxpYjsgRGVzdERpcjoge2FwcH1cbGliczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogRExMc1xfc3JlLnB5ZDsgRGVzdERpcjoge2FwcH1cRExMczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KK1NvdXJjZTogbGlic1xfc3JlLmxpYjsgRGVzdERpcjoge2FwcH1cbGliczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogRExMc1xfc3ltdGFibGUucHlkOyBEZXN0RGlyOiB7YXBwfVxETExzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorU291cmNlOiBsaWJzXF9zeW10YWJsZS5saWI7IERlc3REaXI6IHthcHB9XGxpYnM7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCisNCitTb3VyY2U6IERMTHNcX3Rlc3RjYXBpLnB5ZDsgRGVzdERpcjoge2FwcH1cRExMczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KK1NvdXJjZTogbGlic1xfdGVzdGNhcGkubGliOyBEZXN0RGlyOiB7YXBwfVxsaWJzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorDQorU291cmNlOiBETExzXF90a2ludGVyLnB5ZDsgRGVzdERpcjoge2FwcH1cRExMczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogdGsNCitTb3VyY2U6IGxpYnNcX3RraW50ZXIubGliOyBEZXN0RGlyOiB7YXBwfVxsaWJzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiB0aw0KKw0KK1NvdXJjZTogRExMc1xic2RkYi5weWQ7IERlc3REaXI6IHthcHB9XERMTHM7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCitTb3VyY2U6IGxpYnNcYnNkZGIubGliOyBEZXN0RGlyOiB7YXBwfVxsaWJzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorDQorU291cmNlOiBETExzXG1tYXAucHlkOyBEZXN0RGlyOiB7YXBwfVxETExzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorU291cmNlOiBsaWJzXG1tYXAubGliOyBEZXN0RGlyOiB7YXBwfVxsaWJzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorDQorU291cmNlOiBETExzXHBhcnNlci5weWQ7IERlc3REaXI6IHthcHB9XERMTHM7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCitTb3VyY2U6IGxpYnNccGFyc2VyLmxpYjsgRGVzdERpcjoge2FwcH1cbGliczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogRExMc1xweWV4cGF0LnB5ZDsgRGVzdERpcjoge2FwcH1cRExMczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KK1NvdXJjZTogbGlic1xweWV4cGF0LmxpYjsgRGVzdERpcjoge2FwcH1cbGliczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogRExMc1xzZWxlY3QucHlkOyBEZXN0RGlyOiB7YXBwfVxETExzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorU291cmNlOiBsaWJzXHNlbGVjdC5saWI7IERlc3REaXI6IHthcHB9XGxpYnM7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCisNCitTb3VyY2U6IERMTHNcdW5pY29kZWRhdGEucHlkOyBEZXN0RGlyOiB7YXBwfVxETExzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorU291cmNlOiBsaWJzXHVuaWNvZGVkYXRhLmxpYjsgRGVzdERpcjoge2FwcH1cbGliczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogRExMc1xfd2lucmVnLnB5ZDsgRGVzdERpcjoge2FwcH1cRExMczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KK1NvdXJjZTogbGlic1xfd2lucmVnLmxpYjsgRGVzdERpcjoge2FwcH1cbGliczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogRExMc1x3aW5zb3VuZC5weWQ7IERlc3REaXI6IHthcHB9XERMTHM7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCitTb3VyY2U6IGxpYnNcd2luc291bmQubGliOyBEZXN0RGlyOiB7YXBwfVxsaWJzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorDQorU291cmNlOiBETExzXHpsaWIucHlkOyBEZXN0RGlyOiB7YXBwfVxETExzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorU291cmNlOiBsaWJzXHpsaWIubGliOyBEZXN0RGlyOiB7YXBwfVxsaWJzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorDQorU291cmNlOiBsaWJzXHB5dGhvbjIyLmxpYjsgRGVzdERpcjoge2FwcH1cbGliczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogRExMc1xleHBhdC5kbGw7IERlc3REaXI6IHthcHB9XERMTHM7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCisNCisNCisNCitTb3VyY2U6IExpYlwqLnB5OyBEZXN0RGlyOiB7YXBwfVxMaWI7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW4NCitTb3VyY2U6IExpYlxjb21waWxlclwqLio7IERlc3REaXI6IHthcHB9XExpYlxjb21waWxlcjsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbjsgRmxhZ3M6IHJlY3Vyc2VzdWJkaXJzDQorU291cmNlOiBMaWJcZGlzdHV0aWxzXCouKjsgRGVzdERpcjoge2FwcH1cTGliXGRpc3R1dGlsczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbjsgRmxhZ3M6IHJlY3Vyc2VzdWJkaXJzDQorU291cmNlOiBMaWJcZW1haWxcKi4qOyBEZXN0RGlyOiB7YXBwfVxMaWJcZW1haWw7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW47IEZsYWdzOiByZWN1cnNlc3ViZGlycw0KK1NvdXJjZTogTGliXGVuY29kaW5nc1wqLio7IERlc3REaXI6IHthcHB9XExpYlxlbmNvZGluZ3M7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW47IEZsYWdzOiByZWN1cnNlc3ViZGlycw0KK1NvdXJjZTogTGliXGhvdHNob3RcKi4qOyBEZXN0RGlyOiB7YXBwfVxMaWJcaG90c2hvdDsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbjsgRmxhZ3M6IHJlY3Vyc2VzdWJkaXJzDQorU291cmNlOiBMaWJcbGliLW9sZFwqLio7IERlc3REaXI6IHthcHB9XExpYlxsaWItb2xkOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluOyBGbGFnczogcmVjdXJzZXN1YmRpcnMNCitTb3VyY2U6IExpYlx4bWxcKi4qOyBEZXN0RGlyOiB7YXBwfVxMaWJceG1sOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluOyBGbGFnczogcmVjdXJzZXN1YmRpcnMNCitTb3VyY2U6IExpYlxob3RzaG90XCouKjsgRGVzdERpcjoge2FwcH1cTGliXGhvdHNob3Q7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW47IEZsYWdzOiByZWN1cnNlc3ViZGlycw0KK1NvdXJjZTogTGliXHRlc3RcKi4qOyBEZXN0RGlyOiB7YXBwfVxMaWJcdGVzdDsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogdGVzdDsgRmxhZ3M6IHJlY3Vyc2VzdWJkaXJzDQorDQorU291cmNlOiBMaWJcc2l0ZS1wYWNrYWdlc1xSRUFETUUudHh0OyBEZXN0RGlyOiB7YXBwfVxMaWJcc2l0ZS1wYWNrYWdlczsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbg0KKw0KK1NvdXJjZTogTGliXHNpdGUtcGFja2FnZXNcUHlXaW4zMi5jaG07IERlc3REaXI6IHthcHB9XExpYlxzaXRlLXBhY2thZ2VzOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBkb2NzDQorU291cmNlOiBMaWJcc2l0ZS1wYWNrYWdlc1x3aW4zMlwqLio7IERlc3REaXI6IHthcHB9XExpYlxzaXRlLXBhY2thZ2VzXHdpbjMyOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluOyBGbGFnczogcmVjdXJzZXN1YmRpcnMNCitTb3VyY2U6IExpYlxzaXRlLXBhY2thZ2VzXHdpbjMyY29tXCouKjsgRGVzdERpcjoge2FwcH1cTGliXHNpdGUtcGFja2FnZXNcd2luMzJjb207IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IG1haW47IEZsYWdzOiByZWN1cnNlc3ViZGlycw0KK1NvdXJjZTogTGliXHNpdGUtcGFja2FnZXNcd2luMzJjb21leHRcKi4qOyBEZXN0RGlyOiB7YXBwfVxMaWJcc2l0ZS1wYWNrYWdlc1x3aW4zMmNvbWV4dDsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogbWFpbjsgRmxhZ3M6IHJlY3Vyc2VzdWJkaXJzDQorDQorU291cmNlOiBMaWJcbGliLXRrXCoucHk7IERlc3REaXI6IHthcHB9XExpYlxsaWItdGs7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IHRrOyBGbGFnczogcmVjdXJzZXN1YmRpcnMNCisNCitTb3VyY2U6IGluY2x1ZGVcKi5oOyBEZXN0RGlyOiB7YXBwfVxpbmNsdWRlOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiBtYWluDQorDQorU291cmNlOiBUb29sc1xpZGxlXCouKjsgRGVzdERpcjoge2FwcH1cVG9vbHNcaWRsZTsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogdGs7IEZsYWdzOiByZWN1cnNlc3ViZGlycw0KKw0KK1NvdXJjZTogVG9vbHNccHluY2hlXCouKjsgRGVzdERpcjoge2FwcH1cVG9vbHNccHluY2hlOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBDb21wb25lbnRzOiB0b29sczsgRmxhZ3M6IHJlY3Vyc2VzdWJkaXJzDQorU291cmNlOiBUb29sc1xzY3JpcHRzXCouKjsgRGVzdERpcjoge2FwcH1cVG9vbHNcU2NyaXB0czsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogdG9vbHM7IEZsYWdzOiByZWN1cnNlc3ViZGlycw0KK1NvdXJjZTogVG9vbHNcd2ViY2hlY2tlclwqLio7IERlc3REaXI6IHthcHB9XFRvb2xzXHdlYmNoZWNrZXI7IENvcHlNb2RlOiBhbHdheXNvdmVyd3JpdGU7IENvbXBvbmVudHM6IHRvb2xzOyBGbGFnczogcmVjdXJzZXN1YmRpcnMNCitTb3VyY2U6IFRvb2xzXHZlcnNpb25jaGVja1wqLio7IERlc3REaXI6IHthcHB9XFRvb2xzXHZlcnNpb25jaGVjazsgQ29weU1vZGU6IGFsd2F5c292ZXJ3cml0ZTsgQ29tcG9uZW50czogdG9vbHM7IEZsYWdzOiByZWN1cnNlc3ViZGlycw0KKw0KK1NvdXJjZTogRG9jXCouKjsgRGVzdERpcjoge2FwcH1cRG9jOyBDb3B5TW9kZTogYWx3YXlzb3ZlcndyaXRlOyBGbGFnczogcmVjdXJzZXN1YmRpcnM7IENvbXBvbmVudHM6IGRvY3MNCisNCisNCitbSWNvbnNdDQorTmFtZToge2dyb3VwfVxQeXRob24gKGNvbW1hbmQgbGluZSk7IEZpbGVuYW1lOiB7YXBwfVxweXRob24uZXhlOyBXb3JraW5nRGlyOiB7YXBwfTsgQ29tcG9uZW50czogbWFpbg0KK05hbWU6IHtncm91cH1cUHl0aG9uIE1hbnVhbHM7IEZpbGVuYW1lOiB7YXBwfVxEb2NcaW5kZXguaHRtbDsgV29ya2luZ0Rpcjoge2FwcH07IENvbXBvbmVudHM6IGRvY3MNCitOYW1lOiB7Z3JvdXB9XFdpbjMyIEV4dGVuc2lvbnMgSGVscDsgRmlsZW5hbWU6IHthcHB9XExpYlxzaXRlLXBhY2thZ2VzXFB5V2luMzIuY2htOyBXb3JraW5nRGlyOiB7YXBwfVxMaWJcc2l0ZS1wYWNrYWdlczsgQ29tcG9uZW50czogZG9jcw0KK05hbWU6IHtncm91cH1cTW9kdWxlIERvY3M7IEZpbGVuYW1lOiB7YXBwfVxweXRob253LmV4ZTsgV29ya2luZ0Rpcjoge2FwcH07IFBhcmFtZXRlcnM6ICIiInthcHB9XFRvb2xzXFNjcmlwdHNccHlkb2MucHl3IiIiOyBDb21wb25lbnRzOiB0b29scw0KK05hbWU6IHtncm91cH1cSURMRSAoUHl0aG9uIEdVSSk7IEZpbGVuYW1lOiB7YXBwfVxweXRob253LmV4ZTsgV29ya2luZ0Rpcjoge2FwcH07IFBhcmFtZXRlcnM6ICIiInthcHB9XFRvb2xzXGlkbGVcaWRsZS5weXciIiI7IENvbXBvbmVudHM6IHRvb2xzDQorDQorW1JlZ2lzdHJ5XQ0KKzsgUmVnaXN0ZXIgLnB5DQorVGFza3M6IGV4dGVuc2lvbnM7IFJvb3Q6IEhLQ1I7IFN1YmtleTogLnB5OyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiA7IFZhbHVlRGF0YTogUHl0aG9uIEZpbGU7IEZsYWdzOiB1bmluc2RlbGV0ZXZhbHVlDQorVGFza3M6IGV4dGVuc2lvbnM7IFJvb3Q6IEhLQ1I7IFN1YmtleTogLnB5OyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiBDb250ZW50IFR5cGU7IFZhbHVlRGF0YTogdGV4dC9wbGFpbjsgRmxhZ3M6IHVuaW5zZGVsZXRldmFsdWUNCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiBQeXRob24gRmlsZTsgVmFsdWVUeXBlOiBzdHJpbmc7IFZhbHVlTmFtZTogOyBWYWx1ZURhdGE6IFB5dGhvbiBGaWxlOyBGbGFnczogdW5pbnNkZWxldGVrZXkNCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiBQeXRob24gRmlsZVxEZWZhdWx0SWNvbjsgVmFsdWVUeXBlOiBzdHJpbmc7IFZhbHVlTmFtZTogOyBWYWx1ZURhdGE6IHthcHB9XFB5Lmljbw0KK1Rhc2tzOiBleHRlbnNpb25zOyBSb290OiBIS0NSOyBTdWJrZXk6IFB5dGhvbiBGaWxlXHNoZWxsXG9wZW5cY29tbWFuZDsgVmFsdWVUeXBlOiBzdHJpbmc7IFZhbHVlTmFtZTogOyBWYWx1ZURhdGE6ICIiInthcHB9XHB5dGhvbi5leGUiIiAiIiUxIiIgJSoiDQorDQorOyBSZWdpc3RlciAucHljDQorVGFza3M6IGV4dGVuc2lvbnM7IFJvb3Q6IEhLQ1I7IFN1YmtleTogLnB5YzsgVmFsdWVUeXBlOiBzdHJpbmc7IFZhbHVlTmFtZTogOyBWYWx1ZURhdGE6IFB5dGhvbiBDb21waWxlZEZpbGU7IEZsYWdzOiB1bmluc2RlbGV0ZXZhbHVlDQorVGFza3M6IGV4dGVuc2lvbnM7IFJvb3Q6IEhLQ1I7IFN1YmtleTogUHl0aG9uIENvbXBpbGVkRmlsZTsgVmFsdWVUeXBlOiBzdHJpbmc7IFZhbHVlTmFtZTogOyBWYWx1ZURhdGE6IENvbXBpbGVkIFB5dGhvbiBGaWxlOyBGbGFnczogdW5pbnNkZWxldGVrZXkNCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiBQeXRob24gQ29tcGlsZWRGaWxlXERlZmF1bHRJY29uOyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiA7IFZhbHVlRGF0YToge2FwcH1ccHljLmljbw0KK1Rhc2tzOiBleHRlbnNpb25zOyBSb290OiBIS0NSOyBTdWJrZXk6IFB5dGhvbiBDb21waWxlZEZpbGVcc2hlbGxcb3Blblxjb21tYW5kOyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiA7IFZhbHVlRGF0YTogIiIie2FwcH1ccHl0aG9uLmV4ZSIiICIiJTEiIiAlKiINCisNCis7IFJlZ2lzdGVyIC5weW8NCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiAucHlvOyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiA7IFZhbHVlRGF0YTogUHl0aG9uIENvbXBpbGVkRmlsZTsgRmxhZ3M6IHVuaW5zZGVsZXRldmFsdWUNCisNCis7IFJlZ2lzdGVyIC5weXcNCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiAucHl3OyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiA7IFZhbHVlRGF0YTogUHl0aG9uIE5vQ29uRmlsZTsgRmxhZ3M6IHVuaW5zZGVsZXRldmFsdWUNCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiAucHl3OyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiBDb250ZW50IFR5cGU7IFZhbHVlRGF0YTogdGV4dC9wbGFpbjsgRmxhZ3M6IHVuaW5zZGVsZXRldmFsdWUNCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiBQeXRob24gTm9Db25GaWxlOyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiA7IFZhbHVlRGF0YTogUHl0aG9uIEZpbGUgKG5vIGNvbnNvbGUpOyBGbGFnczogdW5pbnNkZWxldGVrZXkNCitUYXNrczogZXh0ZW5zaW9uczsgUm9vdDogSEtDUjsgU3Via2V5OiBQeXRob24gTm9Db25GaWxlXERlZmF1bHRJY29uOyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVOYW1lOiA7IFZhbHVlRGF0YToge2FwcH1cUHkuaWNvDQorVGFza3M6IGV4dGVuc2lvbnM7IFJvb3Q6IEhLQ1I7IFN1YmtleTogUHl0aG9uIE5vQ29uRmlsZVxzaGVsbFxvcGVuXGNvbW1hbmQ7IFZhbHVlVHlwZTogc3RyaW5nOyBWYWx1ZU5hbWU6IDsgVmFsdWVEYXRhOiAiIiJ7YXBwfVxweXRob253LmV4ZSIiICIiJTEiIiAlKiINCisNCisNCis7IFB5dGhvbiBSZWdpc3RyeSBLZXlzDQorUm9vdDogSEtMTTsgU3Via2V5OiBTT0ZUV0FSRVxQeXRob247IEZsYWdzOiB1bmluc2RlbGV0ZWtleWlmZW1wdHk7IENoZWNrOiBJc0FkbWluTG9nZ2VkT24NCitSb290OiBIS0xNOyBTdWJrZXk6IFNPRlRXQVJFXFB5dGhvblxQeXRob25Db3JlOyBGbGFnczogdW5pbnNkZWxldGVrZXlpZmVtcHR5DQorUm9vdDogSEtMTTsgU3Via2V5OiBTT0ZUV0FSRVxQeXRob25cUHl0aG9uQ29yZVwyLjI7IEZsYWdzOiB1bmluc2RlbGV0ZWtleWlmZW1wdHkNCitSb290OiBIS0xNOyBTdWJrZXk6IFNPRlRXQVJFXFB5dGhvblxQeXRob25Db3JlXDIuMlxQeXRob25QYXRoOyBWYWx1ZURhdGE6ICJ7YXBwfVxMaWI7e2FwcH1cRExMcyI7IEZsYWdzOiB1bmluc2RlbGV0ZWtleWlmZW1wdHkNCitSb290OiBIS0xNOyBTdWJrZXk6IFNPRlRXQVJFXFB5dGhvblxQeXRob25Db3JlXDIuMlxQeXRob25QYXRoXHRrOyBWYWx1ZURhdGE6IHthcHB9XExpYlxsaWItdGs7IEZsYWdzOiB1bmluc2RlbGV0ZWtleTsgQ29tcG9uZW50czogdGsNCitSb290OiBIS0xNOyBTdWJrZXk6IFNPRlRXQVJFXFB5dGhvblxQeXRob25Db3JlXDIuMlxQeXRob25QYXRoXHdpbjMyOyBWYWx1ZURhdGE6ICJ7YXBwfVxsaWJcc2l0ZS1wYWNrYWdlc1x3aW4zMjt7YXBwfVxsaWJcc2l0ZS1wYWNrYWdlc1x3aW4zMlxsaWIiOyBGbGFnczogdW5pbnNkZWxldGVrZXkNCitSb290OiBIS0xNOyBTdWJrZXk6IFNPRlRXQVJFXFB5dGhvblxQeXRob25Db3JlXDIuMlxQeXRob25QYXRoXHdpbjMyY29tOyBWYWx1ZURhdGE6IEM6XFB5dGhvblxsaWJcc2l0ZS1wYWNrYWdlczsgRmxhZ3M6IHVuaW5zZGVsZXRla2V5DQorUm9vdDogSEtMTTsgU3Via2V5OiBTT0ZUV0FSRVxQeXRob25cUHl0aG9uQ29yZVwyLjJcTW9kdWxlczsgRmxhZ3M6IHVuaW5zZGVsZXRla2V5aWZlbXB0eQ0KK1Jvb3Q6IEhLTE07IFN1YmtleTogU09GVFdBUkVcUHl0aG9uXFB5dGhvbkNvcmVcMi4yXE1vZHVsZXNccHl0aG9uY29tOyBWYWx1ZURhdGE6IHtzeXN9XHB5dGhvbmNvbTIyLmRsbDsgRmxhZ3M6IHVuaW5zZGVsZXRla2V5DQorUm9vdDogSEtMTTsgU3Via2V5OiBTT0ZUV0FSRVxQeXRob25cUHl0aG9uQ29yZVwyLjJcTW9kdWxlc1xweXdpbnR5cGVzOyBWYWx1ZURhdGE6IHtzeXN9XFB5V2luVHlwZXMyMi5kbGw7IEZsYWdzOiB1bmluc2RlbGV0ZWtleQ0KK1Jvb3Q6IEhLTE07IFN1YmtleTogU09GVFdBUkVcUHl0aG9uXFB5dGhvbkNvcmVcMi4yXEluc3RhbGxQYXRoOyBWYWx1ZURhdGE6IHthcHB9OyBGbGFnczogdW5pbnNkZWxldGVrZXlpZmVtcHR5OyBWYWx1ZVR5cGU6IHN0cmluZw0KK1Jvb3Q6IEhLTE07IFN1YmtleTogU09GVFdBUkVcUHl0aG9uXFB5dGhvbkNvcmVcMi4yXEluc3RhbGxQYXRoXEluc3RhbGxHcm91cDsgVmFsdWVEYXRhOiB7Z3JvdXB9OyBGbGFnczogdW5pbnNkZWxldGVrZXkNCitSb290OiBIS0xNOyBTdWJrZXk6IFNPRlRXQVJFXFB5dGhvblxQeXRob25Db3JlXDIuMlxIZWxwOyBGbGFnczogdW5pbnNkZWxldGVrZXlpZmVtcHR5DQorUm9vdDogSEtMTTsgU3Via2V5OiBTT0ZUV0FSRVxQeXRob25cUHl0aG9uQ29yZVwyLjJcSGVscFxNYWluIFB5dGhvbiBEb2N1bWVudGF0aW9uOyBWYWx1ZVR5cGU6IHN0cmluZzsgVmFsdWVEYXRhOiB7YXBwfVxEb2NcaW5kZXguaHRtbDsgRmxhZ3M6IHVuaW5zZGVsZXRla2V5OyBDb21wb25lbnRzOiBkb2NzDQorUm9vdDogSEtMTTsgU3Via2V5OiBTT0ZUV0FSRVxQeXRob25cUHl0aG9uQ29yZVwyLjJcSGVscFxQeXRob24gV2luMzIgRG9jdW1lbnRhdGlvbjsgVmFsdWVUeXBlOiBzdHJpbmc7IFZhbHVlRGF0YToge2FwcH1cbGliXHNpdGUtcGFja2FnZXNcUHlXaW4zMi5jaG07IEZsYWdzOiB1bmluc2RlbGV0ZWtleTsgQ29tcG9uZW50czogZG9jcw0KKw0KK1tfSVNUb29sXQ0KK0VuYWJsZUlTWD10cnVlDQorDQorDQorW0NvZGVdDQorUHJvZ3JhbSBTZXR1cDsNCisNCitGdW5jdGlvbiBJc0FkbWluTm90TG9nZ2VkT24oKTogQm9vbGVhbjsNCitiZWdpbg0KKyAgUmVzdWx0IDo9IE5vdCBJc0FkbWluTG9nZ2VkT24oKTsNCitlbmQ7DQorDQorYmVnaW4NCitlbmQuDQorDQorDQorDQorDQorW1VuaW5zdGFsbERlbGV0ZV0NCitOYW1lOiB7YXBwfVxMaWJcY29tcGlsZXJcKi5weWM7IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cTGliXGNvbXBpbGVyXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlxjb21waWxlcjsgVHlwZTogZGlyaWZlbXB0eQ0KK05hbWU6IHthcHB9XExpYlxkaXN0dXRpbHNcY29tbWFuZFwqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcZGlzdHV0aWxzXGNvbW1hbmRcKi5weW87IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cTGliXGRpc3R1dGlsc1xjb21tYW5kOyBUeXBlOiBkaXJpZmVtcHR5DQorTmFtZToge2FwcH1cTGliXGRpc3R1dGlsc1wqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcZGlzdHV0aWxzXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlxkaXN0dXRpbHM7IFR5cGU6IGRpcmlmZW1wdHkNCitOYW1lOiB7YXBwfVxMaWJcZW1haWxcdGVzdFwqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcZW1haWxcdGVzdFwqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcZW1haWxcdGVzdDsgVHlwZTogZGlyaWZlbXB0eQ0KK05hbWU6IHthcHB9XExpYlxlbWFpbFwqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcZW1haWxcKi5weW87IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cTGliXGVtYWlsOyBUeXBlOiBkaXJpZmVtcHR5DQorTmFtZToge2FwcH1cTGliXGVuY29kaW5nc1wqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcZW5jb2RpbmdzXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlxlbmNvZGluZ3M7IFR5cGU6IGRpcmlmZW1wdHkNCitOYW1lOiB7YXBwfVxMaWJcaG90c2hvdFwqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcaG90c2hvdFwqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcaG90c2hvdDsgVHlwZTogZGlyaWZlbXB0eQ0KK05hbWU6IHthcHB9XExpYlxsaWItb2xkXCoucHljOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlxsaWItb2xkXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlxsaWItb2xkOyBUeXBlOiBkaXJpZmVtcHR5DQorTmFtZToge2FwcH1cTGliXGxpYi10a1wqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcbGliLXRrXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlxsaWItdGs7IFR5cGU6IGRpcmlmZW1wdHkNCitOYW1lOiB7YXBwfVxMaWJcdGVzdFwqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcdGVzdFwqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcdGVzdDsgVHlwZTogZGlyaWZlbXB0eQ0KK05hbWU6IHthcHB9XExpYlx4bWxcZG9tXCoucHljOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlx4bWxcZG9tXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlx4bWxcZG9tOyBUeXBlOiBkaXJpZmVtcHR5DQorTmFtZToge2FwcH1cTGliXHhtbFxwYXJzZXJzXCoucHljOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XExpYlx4bWxccGFyc2Vyc1wqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJceG1sXHBhcnNlcnM7IFR5cGU6IGRpcmlmZW1wdHkNCitOYW1lOiB7YXBwfVxMaWJceG1sXHNheFwqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJceG1sXHNheFwqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJceG1sXHNheDsgVHlwZTogZGlyaWZlbXB0eQ0KK05hbWU6IHthcHB9XExpYlx4bWxcKi5weWM7IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cTGliXHhtbFwqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJceG1sOyBUeXBlOiBkaXJpZmVtcHR5DQorDQorTmFtZToge2FwcH1cTGliXHNpdGUtcGFja2FnZXNcd2luMzI7IFR5cGU6IGZpbGVzYW5kb3JkaXJzDQorTmFtZToge2FwcH1cTGliXHNpdGUtcGFja2FnZXNcd2luMzJjb207IFR5cGU6IGZpbGVzYW5kb3JkaXJzDQorTmFtZToge2FwcH1cTGliXHNpdGUtcGFja2FnZXNcd2luMzJjb21leHQ7IFR5cGU6IGZpbGVzYW5kb3JkaXJzDQorTmFtZToge2FwcH1cTGliXHNpdGUtcGFja2FnZXNccHl0aG9uY29tLnB5KjsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWJcc2l0ZS1wYWNrYWdlczsgVHlwZTogZGlyaWZlbXB0eQ0KKw0KK05hbWU6IHthcHB9XExpYlwqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxMaWI7IFR5cGU6IGRpcmlmZW1wdHkNCisNCitOYW1lOiB7YXBwfVxUb29sc1xweW5jaGVcKi5weWM7IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cVG9vbHNccHluY2hlXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XFRvb2xzXHB5bmNoZTsgVHlwZTogZGlyaWZlbXB0eQ0KKw0KK05hbWU6IHthcHB9XFRvb2xzXGlkbGVcKi5weWM7IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cVG9vbHNcaWRsZVwqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxUb29sc1xpZGxlOyBUeXBlOiBkaXJpZmVtcHR5DQorDQorTmFtZToge2FwcH1cVG9vbHNcc2NyaXB0c1wqLnB5YzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxUb29sc1xzY3JpcHRzXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XFRvb2xzXHNjcmlwdHM7IFR5cGU6IGRpcmlmZW1wdHkNCisNCitOYW1lOiB7YXBwfVxUb29sc1x2ZXJzaW9uY2hlY2tcKi5weWM7IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cVG9vbHNcdmVyc2lvbmNoZWNrXCoucHlvOyBUeXBlOiBmaWxlcw0KK05hbWU6IHthcHB9XFRvb2xzXHZlcnNpb25jaGVjazsgVHlwZTogZGlyaWZlbXB0eQ0KKw0KK05hbWU6IHthcHB9XFRvb2xzXHdlYmNoZWNrZXJcKi5weWM7IFR5cGU6IGZpbGVzDQorTmFtZToge2FwcH1cVG9vbHNcd2ViY2hlY2tlclwqLnB5bzsgVHlwZTogZmlsZXMNCitOYW1lOiB7YXBwfVxUb29sc1x3ZWJjaGVja2VyOyBUeXBlOiBkaXJpZmVtcHR5DQorDQorTmFtZToge2FwcH1cVG9vbHM7IFR5cGU6IGRpcmlmZW1wdHkNCisNCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9weXRob24udmNwcm9qIGIvUENidWlsZDgvcHl0aG9uLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGJjYzhmCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvcHl0aG9uLnZjcHJvagpAQCAtMCwwICsxLDQwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjgsMDAiDQorCU5hbWU9InB5dGhvbiINCisJUHJvamVjdEdVSUQ9IntCMTFENzUwRi1DRDFGLTRBOTYtODVDRS1FNjlBNUM1MjU5Rjl9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJvZGJjY3AzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii5cLi9weXRob24uZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vcHl0aG9uLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlTdGFja1Jlc2VydmVTaXplPSIyMDAwMDAwIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZDAwMDAwMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLWRlYnVnXHB5dGhvbiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NPTlNPTEUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9weXRob25fZC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9weXRob25fZC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMSINCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iMjAwMDAwMCINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWQwMDAwMDAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxweXRob24iDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSAvVlNFWFRDT01QX1ZFUkJPU0UiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NPTlNPTEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpJQTY0IC9VU0VMSU5LOk1TX1NESyAvVlNFWFRDT01QX1ZFUkJPU0UiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Im9kYmNjcDMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLlwuL3B5dGhvbi5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9weXRob24ucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjEiDQorCQkJCVN0YWNrUmVzZXJ2ZVNpemU9IjIwMDAwMDAiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFkMDAwMDAwIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlQU1ENjR8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iYW1kNjQtdGVtcC1yZWxlYXNlXHB5dGhvbiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DT05TT0xFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJvZGJjY3AzMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii5cLi9weXRob24uZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vcHl0aG9uLnBkYiINCisJCQkJU3ViU3lzdGVtPSIxIg0KKwkJCQlTdGFja1Jlc2VydmVTaXplPSIyMDAwMDAwIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZDAwMDAwMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBDXHB5Y29uLmljbyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xweXRob24uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENccHl0aG9uX2V4ZS5yYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L3B5dGhvbjIwLndzZSBiL1BDYnVpbGQ4L3B5dGhvbjIwLndzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2EzNDkxCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvcHl0aG9uMjAud3NlCkBAIC0wLDAgKzEsMzEzNSBAQAorRG9jdW1lbnQgVHlwZTogV1NFDQoraXRlbTogR2xvYmFsDQorICBWZXJzaW9uPTkuMA0KKyAgVGl0bGU9UHl0aG9uIDIuNGExDQorICBGbGFncz0wMDAxMDEwMA0KKyAgTGFuZ3VhZ2VzPTY1IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwDQorICBKYXBhbmVzZSBGb250IE5hbWU9TVMgR290aGljDQorICBKYXBhbmVzZSBGb250IFNpemU9MTANCisgIFN0YXJ0IEdyYWRpZW50PTAgMjU1IDANCisgIEVuZCBHcmFkaWVudD0wIDEyOCAwDQorICBXaW5kb3dzIEZsYWdzPTAwMDAwMTAwMDAwMDExMDEwMDEwMDEwMTAwMDAxMDEwDQorICBMb2cgUGF0aG5hbWU9JU1BSU5ESVIlXElOU1RBTEwuTE9HDQorICBNZXNzYWdlIEZvbnQ9TVMgU2FucyBTZXJpZg0KKyAgRm9udCBTaXplPTgNCisgIFBhZ2VzIE1vZGlmaWVkPTAwMDEwMDAwMDExMTAxMDAwMDAwMDAwMTAwMDAwMTExDQorICBFeHRyYSBQYWdlcz0wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDExMDAxMA0KKyAgRGlzayBGaWxlbmFtZT1TRVRVUA0KKyAgUGF0Y2ggRmxhZ3M9MDAwMDAwMDAwMDAwMTAwMQ0KKyAgUGF0Y2ggVGhyZXNob2xkPTg1DQorICBQYXRjaCBNZW1vcnk9NDAwMA0KKyAgTUlGIFBERiBWZXJzaW9uPTEuMA0KKyAgTUlGIFNNUyBWZXJzaW9uPTIuMA0KKyAgRVhFIEZpbGVuYW1lPVB5dGhvbi0yLjRhMS5leGUNCisgIERpYWxvZ3MgVmVyc2lvbj04DQorICBWZXJzaW9uIEZpbGU9Mi40YTENCisgIFZlcnNpb24gRGVzY3JpcHRpb249UHl0aG9uIFByb2dyYW1taW5nIExhbmd1YWdlDQorICBWZXJzaW9uIENvcHlyaWdodD2pMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uDQorICBWZXJzaW9uIENvbXBhbnk9UHl0aG9uTGFicyBhdCBab3BlIENvcnBvcmF0aW9uDQorICBDcnlzdGFsIEZvcm1hdD0xMDExMTEwMDEwMTEwMDAwMDAxMDAwMTAwMTAwMTAwMQ0KKyAgU3RlcCBWaWV3PSZBbGwNCisgIFZhcmlhYmxlIE5hbWUxPV9XSVNFXw0KKyAgVmFyaWFibGUgRGVzY3JpcHRpb24xPVdJU0Ugcm9vdCBkaXJlY3RvcnkNCisgIFZhcmlhYmxlIERlZmF1bHQxPUM6XFByb2dyYW1tZVxXaXNlIEluc3RhbGxhdGlvbiBTeXN0ZW0NCisgIFZhcmlhYmxlIEZsYWdzMT0wMDAwMTAwMA0KKyAgVmFyaWFibGUgTmFtZTI9X1RDTERJUl8NCisgIFZhcmlhYmxlIERlc2NyaXB0aW9uMj1UaGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBUY2wvVGsgaW5zdGFsbGF0aW9uDQorICBWYXJpYWJsZSBEZXNjcmlwdGlvbjI9bGl2ZXMuICBUaGlzIG11c3QgYmUgYSBzaWJsaW5nIG9mIHRoZSBQeXRob24NCisgIFZhcmlhYmxlIERlc2NyaXB0aW9uMj1kaXJlY3RvcnkuDQorICBWYXJpYWJsZSBEZWZhdWx0Mj10Y2w4NA0KKyAgVmFyaWFibGUgRmxhZ3MyPTAwMDAxMDAwDQorICBWYXJpYWJsZSBOYW1lMz1fRE9DXw0KKyAgVmFyaWFibGUgRGVzY3JpcHRpb24zPVRoZSB1bnBhY2tlZCBIVE1MIGRvYyBkaXJlY3RvcnkuDQorICBWYXJpYWJsZSBEZWZhdWx0Mz0uLlxodG1sDQorICBWYXJpYWJsZSBGbGFnczM9MDAwMDEwMDENCisgIFZhcmlhYmxlIE5hbWU0PV9TWVNfDQorICBWYXJpYWJsZSBEZXNjcmlwdGlvbjQ9U3lzdGVtIGRpcmVjdG9yeSAod2hlcmUgdG8gZmluZCBNU1ZDUlQuRExMKQ0KKyAgVmFyaWFibGUgRGVmYXVsdDQ9QzpcV2luZG93c1xTeXN0ZW0NCisgIFZhcmlhYmxlIFZhbHVlczQ9QzpcV2luZG93c1xTeXN0ZW0NCisgIFZhcmlhYmxlIFZhbHVlczQ9QzpcV0lOTlRcU3lzdGVtMzINCisgIFZhcmlhYmxlIFZhbHVlczQ9QzpcQ29kZVxNU0RMTHMNCisgIFZhcmlhYmxlIFZhbHVlczQ9QzpcV2luZG93c1xTeXN0ZW0zMg0KKyAgVmFyaWFibGUgRmxhZ3M0PTAwMDAwMDEwDQorICBWYXJpYWJsZSBOYW1lNT1fUFlNQUpPUl8NCisgIFZhcmlhYmxlIERlc2NyaXB0aW9uNT1QeXRob24gbWFqb3IgdmVyc2lvbiBudW1iZXI7IHRoZSAyIGluIDIuMy4NCisgIFZhcmlhYmxlIERlZmF1bHQ1PTINCisgIFZhcmlhYmxlIEZsYWdzNT0wMDAwMTAwMA0KKyAgVmFyaWFibGUgTmFtZTY9X1BZTUlOT1JfDQorICBWYXJpYWJsZSBEZXNjcmlwdGlvbjY9UHl0aG9uIG1pbm9yIHZlcnNpb24gbnVtYmVyOyB0aGUgMyBpbiAyLjMNCisgIFZhcmlhYmxlIERlZmF1bHQ2PTMNCisgIFZhcmlhYmxlIEZsYWdzNj0wMDAwMTAwMA0KKyAgVmFyaWFibGUgTmFtZTc9X0RPQURNSU5fDQorICBWYXJpYWJsZSBEZXNjcmlwdGlvbjc9VGhlIGluaXRpYWwgdmFsdWUgZm9yICVET0FETUlOJS4NCisgIFZhcmlhYmxlIERlc2NyaXB0aW9uNz1XaGVuIDAsIHdlIG5ldmVyIHRyeSB0byB3cml0ZSB1bmRlciBIS0xNLA0KKyAgVmFyaWFibGUgRGVzY3JpcHRpb243PWFuZCBpbnN0YWxsIHRoZSBQeXRob24gKyBNUyBydW50aW1lIERMTHMgaW4NCisgIFZhcmlhYmxlIERlc2NyaXB0aW9uNz10aGUgUHl0aG9uIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0gZGlyLg0KKyAgVmFyaWFibGUgRGVmYXVsdDc9MQ0KKyAgVmFyaWFibGUgVmFsdWVzNz0xDQorICBWYXJpYWJsZSBWYWx1ZXM3PTANCisgIFZhcmlhYmxlIEZsYWdzNz0wMDAwMTAxMA0KKyAgVmFyaWFibGUgTmFtZTg9X0FMSUFTTkFNRV8NCisgIFZhcmlhYmxlIEZsYWdzOD0wMDAwMTAwMA0KKyAgVmFyaWFibGUgTmFtZTk9X0FMSUFTUEFUSF8NCisgIFZhcmlhYmxlIEZsYWdzOT0wMDAwMTAwMA0KKyAgVmFyaWFibGUgTmFtZTEwPV9BTElBU1RZUEVfDQorICBWYXJpYWJsZSBGbGFnczEwPTAwMDAxMDAwDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1QWVZFUl9TVFJJTkcNCisgIFZhbHVlPTIuMw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1XaGVuIHRoZSB2ZXJzaW9uIG51bWJlciBjaGFuZ2VzLCBzZXQgdGhlIGNvbXBpbGVyDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PXZyYmxzIF9QWU1BSk9SXyBhbmQgIF9QWU1JTk9SXy4NCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9Tm90aGluZyBpbiB0aGUgc2NyaXB0IGJlbG93IHNob3VsZCBuZWVkIGZpZGRsaW5nIHRoZW4uDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PU90aGVyIHRoaW5ncyB0aGF0IG5lZWQgZmlkZGxpbmc6DQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PSAgICBQWVZFUl9TVFJJTkcgYWJvdmUuDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PSAgICBUaGUgIlRpdGxlOiIgaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBHVUkuDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PSAgICBCdWlsZCBTZXR0aW5ncyBhbmQgVmVyc2lvbiBSZXNvdXJjZSBvbiBzdGVwIDYgKEZpbmlzaCkgb2YgdGhlIEluc3RhbGxhdGlvbiBFeHBlcnQNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9ICAgICAgICBCZSBzdXJlIHRvIHNlbGVjdCBTdGVwcy0+QWxsIG9yIHlvdSBtYXkgbm90IHNlZSB0aGVzZSENCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9V2hlbiB0aGUgdmVyc2lvbiBvZiBUY2wvVGsgY2hhbmdlcywgdGhlIGNvbXBpbGVyIHZyYmwNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9X1RDTERJUl8gbWF5IGFsc28gbmVlZCB0byBiZSBjaGFuZ2VkLg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9QVBQVElUTEUNCisgIFZhbHVlPVB5dGhvbiAlUFlWRVJfU1RSSU5HJQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1QWV9WRVJTSU9OIHNob3VsZCBiZSBtYWpvci5taW5vciBvbmx5OyB1c2VkIHRvIGNyZWF0ZSB0aGUgcmVnaXN0cnkga2V5OyBtdXN0IG1hdGNoIE1TX0RMTF9JRCBpbiBweXRob25fbnQucmMNCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVBZX1ZFUlNJT04NCisgIFZhbHVlPSVfUFlNQUpPUl8lLiVfUFlNSU5PUl8lDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUdST1VQIGlzIHRoZSBTdGFydCBtZW51IGdyb3VwIG5hbWU7IHVzZXIgY2FuIG92ZXJyaWRlLg0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9R1JPVVANCisgIFZhbHVlPVB5dGhvbiAlUFlfVkVSU0lPTiUNCisgIEZsYWdzPTEwMDAwMDAwDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PU1BSU5ESVIgaXMgdGhlIGFwcCBkaXJlY3Rvcnk7IHVzZXIgY2FuIG92ZXJyaWRlLg0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9TUFJTkRJUg0KKyAgVmFsdWU9UHl0aG9uJV9QWU1BSk9SXyUlX1BZTUlOT1JfJQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9RE9BRE1JTg0KKyAgVmFsdWU9JV9ET0FETUlOXyUNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9R2l2ZSBub24tYWRtaW4gdXNlcnMgYSBjaGFuY2UgdG8gYWJvcnQuDQorZW5kDQoraXRlbTogQ2hlY2sgQ29uZmlndXJhdGlvbg0KKyAgRmxhZ3M9MTAwMTExMTENCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPURPQURNSU4NCisgIFZhbHVlPTANCitlbmQNCitpdGVtOiBEaXNwbGF5IE1lc3NhZ2UNCisgIFRpdGxlPURvaW5nIG5vbi1hZG1pbiBpbnN0YWxsDQorICBUZXh0PVRoZSBjdXJyZW50IGxvZ2luIGRvZXMgbm90IGhhdmUgQWRtaW5pc3RyYXRvciBQcml2aWxlZ2VzIG9uIHRoaXMgbWFjaGluZS4gIFB5dGhvbiB3aWxsIGluc3RhbGwgaXRzIHJlZ2lzdHJ5IGluZm9ybWF0aW9uIGludG8gdGhlIHBlci11c2VyIGFyZWEgb25seSBmb3IgdGhlIGN1cnJlbnQgbG9naW4sIGluc3RlYWQgb2YgaW50byB0aGUgcGVyLW1hY2hpbmUgYXJlYSBmb3IgZXZlcnkgYWNjb3VudCBvbiB0aGlzIG1hY2hpbmUuICBTb21lIGFkdmFuY2VkIHVzZXMgb2YgUHl0aG9uIG1heSBub3Qgd29yayBhcyBhIHJlc3VsdCAoZm9yIGV4YW1wbGUsIHJ1bm5pbmcgYSBQeXRob24gc2NyaXB0IGFzIGEgc2VydmljZSkuDQorICBUZXh0PQ0KKyAgVGV4dD1JZiB0aGlzIGlzIG5vdCB3aGF0IHlvdSB3YW50LCBwbGVhc2UgY2xpY2sgQ2FuY2VsIHRvIGFib3J0IHRoaXMgaW5zdGFsbGF0aW9uLCBsb2cgb24gYXMgYW4gQWRtaW5pc3RyYXRvciwgYW5kIHN0YXJ0IHRoZSBpbnN0YWxsYXRpb24gYWdhaW4uDQorICBGbGFncz0wMDAwMTAwMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1CRUdJTiBXSVpBUkQgU1RVRkYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9Tm90ZSBmcm9tIFRpbTogdGhlICJzdG9wIiBvbiB0aGUgbmV4dCBsaW5lIGlzIGFjdHVhbGx5ICJwYXVzZSIuDQorZW5kDQoraXRlbTogT3Blbi9DbG9zZSBJTlNUQUxMLkxPRw0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9SWYgdGhlIGRlc3RpbmF0aW9uIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgd3JpdGFibGUgV2luZG93c1xTeXN0ZW0gZGlyZWN0b3J5LCBzeXN0ZW0gZmlsZXMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBXaW5kb3dzXCBkaXJlY3RvcnkNCitlbmQNCitpdGVtOiBDaGVjayBpZiBGaWxlL0RpciBFeGlzdHMNCisgIFBhdGhuYW1lPSVTWVMlDQorICBGbGFncz0xMDAwMDEwMA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9U1lTDQorICBWYWx1ZT0lV0lOJQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IENoZWNrIENvbmZpZ3VyYXRpb24NCisgIEZsYWdzPTEwMTExMDExDQorZW5kDQoraXRlbTogR2V0IFJlZ2lzdHJ5IEtleSBWYWx1ZQ0KKyAgVmFyaWFibGU9Q09NTU9ODQorICBLZXk9U09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb24NCisgIERlZmF1bHQ9QzpcUHJvZ3JhbSBGaWxlc1xDb21tb24gRmlsZXMNCisgIFZhbHVlIE5hbWU9Q29tbW9uRmlsZXNEaXINCisgIEZsYWdzPTAwMDAwMTAwDQorZW5kDQoraXRlbTogR2V0IFJlZ2lzdHJ5IEtleSBWYWx1ZQ0KKyAgVmFyaWFibGU9UFJPR1JBTV9GSUxFUw0KKyAgS2V5PVNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uDQorICBEZWZhdWx0PUM6XFByb2dyYW0gRmlsZXMNCisgIFZhbHVlIE5hbWU9UHJvZ3JhbUZpbGVzRGlyDQorICBGbGFncz0wMDAwMDEwMA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9RVhQTE9SRVINCisgIFZhbHVlPTENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9Tm90ZSBmcm9tIFRpbTogIFRoZSBXaXphcmQgaGFyZGNvZCAiQzoiIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBmb3IgTUFJTkRJUi4NCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VGhhdCdzIG5vdCBhcHByb3ByaWF0ZSBpZiB0aGUgc3lzdGVtIGRyaXZlIGRvZXNuJ3QgaGFwcGVuIHRvIGJlIEM6Lg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1JIHJlbW92ZWQgdGhlICJDOiIsIGFuZCB0aGF0IGRpZCB0aGUgcmlnaHQgdGhpbmcgZm9yIHR3byBwZW9wbGUgd2hvIHRlc3RlZCBpdCBvbiBub24tQzogbWFjaGluZXMsDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PWJ1dCBpdCdzIHVuY2xlYXIgd2hldGhlciBpdCB3aWxsIGFsd2F5cyBkbyB0aGUgcmlnaHQgdGhpbmcuDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1NQUlORElSDQorICBWYWx1ZT1cJU1BSU5ESVIlDQorICBGbGFncz0wMDAwMTEwMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1CQUNLVVAgaXMgdGhlIHZhcmlhYmxlIHRoYXQgaG9sZHMgdGhlIHBhdGggdGhhdCBhbGwgYmFja3VwIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHdoZW4gb3ZlcndyaXR0ZW4NCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPUJBQ0tVUA0KKyAgVmFsdWU9JU1BSU5ESVIlXEJBQ0tVUA0KKyAgRmxhZ3M9MTAwMDAwMDANCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9RE9CQUNLVVAgZGV0ZXJtaW5lcyBpZiBhIGJhY2t1cCB3aWxsIGJlIHBlcmZvcm1lZC4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIEEgKGRvIGJhY2t1cCkgb3IgQiAoZG8gbm90IGRvIGJhY2t1cCkNCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPURPQkFDS1VQDQorICBWYWx1ZT1BDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUJSQU5ESU5HIGRldGVybWluZXMgaWYgdGhlIGluc3RhbGxhdGlvbiB3aWxsIGJlIGJyYW5kZWQgd2l0aCBhIG5hbWUgYW5kIGNvbXBhbnkuICBCeSBkZWZhdWx0LCB0aGlzIGlzIHdyaXR0ZW4gdG8gdGhlIElOU1QgZGlyZWN0b3J5IChpbnN0YWxsYXRpb24gbWVkaWEpLg0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9QlJBTkRJTkcNCisgIFZhbHVlPTANCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUJSQU5ESU5HDQorICBWYWx1ZT0xDQorZW5kDQoraXRlbTogUmVhZCBJTkkgVmFsdWUNCisgIFZhcmlhYmxlPU5BTUUNCisgIFBhdGhuYW1lPSVJTlNUJVxDVVNUREFUQS5JTkkNCisgIFNlY3Rpb249UmVnaXN0cmF0aW9uDQorICBJdGVtPU5hbWUNCitlbmQNCitpdGVtOiBSZWFkIElOSSBWYWx1ZQ0KKyAgVmFyaWFibGU9Q09NUEFOWQ0KKyAgUGF0aG5hbWU9JUlOU1QlXENVU1REQVRBLklOSQ0KKyAgU2VjdGlvbj1SZWdpc3RyYXRpb24NCisgIEl0ZW09Q29tcGFueQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9TkFNRQ0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9RE9CUkFORA0KKyAgVmFsdWU9MQ0KK2VuZA0KK2l0ZW06IEdldCBTeXN0ZW0gSW5mb3JtYXRpb24NCisgIFZhcmlhYmxlPU5BTUUNCisgIEZsYWdzPTAwMDAwMTEwDQorZW5kDQoraXRlbTogR2V0IFN5c3RlbSBJbmZvcm1hdGlvbg0KKyAgVmFyaWFibGU9Q09NUEFOWQ0KKyAgRmxhZ3M9MDAwMDAxMTENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9RU5EIFdJWkFSRCBTVFVGRiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1TZXQgdnJibHMgZm9yIHRoZSAiQWR2YW5jZWQgT3B0aW9ucyIgc3ViZGlhbG9nIG9mIENvbXBvbmVudHMuDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1TRUxFQ1RfQURNSU4NCisgIFZhbHVlPUENCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPURPQURNSU4NCisgIFZhbHVlPTANCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVNFTEVDVF9BRE1JTg0KKyAgVmFsdWU9Qg0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1UQVNLUyB2YWx1ZXM6DQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUE6IFJlZ2lzdGVyIGZpbGUgZXh0ZW5zaW9ucw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1COiBDcmVhdGUgU3RhcnQgTWVudSBzaG9ydGN1dHMNCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVRBU0tTDQorICBWYWx1ZT1BQg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1DT01QT05FTlRTIHZhbHVlczoNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9QTogaW50ZXJwcmV0ZXIgYW5kIGxpYnJhcmllcw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1COiBUY2wvVGsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9QzogZG9jcw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1EOiB0b29scw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1FOiB0ZXN0IHN1aXRlDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1DT01QT05FTlRTDQorICBWYWx1ZT1BQkNERQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1NYXJjaCB0aHJ1IHRoZSB1c2VyIEdVSS4NCitlbmQNCitpdGVtOiBXaXphcmQgQmxvY2sNCisgIERpcmVjdGlvbiBWYXJpYWJsZT1ESVJFQ1RJT04NCisgIERpc3BsYXkgVmFyaWFibGU9RElTUExBWQ0KKyAgQml0bWFwIFBhdGhuYW1lPS5caW5zdGFsbGVyLmJtcA0KKyAgWCBQb3NpdGlvbj05DQorICBZIFBvc2l0aW9uPTEwDQorICBGaWxsZXIgQ29sb3I9MTExNzM3NTkNCisgIERpYWxvZz1TZWxlY3QgRGVzdGluYXRpb24gRGlyZWN0b3J5DQorICBEaWFsb2c9QmFja3VwIFJlcGxhY2VkIEZpbGVzDQorICBEaWFsb2c9U2VsZWN0IENvbXBvbmVudHMNCisgIERpYWxvZz1TZWxlY3QgUHJvZ3JhbSBNYW5hZ2VyIEdyb3VwDQorICBWYXJpYWJsZT0NCisgIFZhcmlhYmxlPQ0KKyAgVmFyaWFibGU9DQorICBWYXJpYWJsZT1UQVNLUw0KKyAgVmFsdWU9DQorICBWYWx1ZT0NCisgIFZhbHVlPQ0KKyAgVmFsdWU9Qg0KKyAgQ29tcGFyZT0wDQorICBDb21wYXJlPTANCisgIENvbXBhcmU9MA0KKyAgQ29tcGFyZT0zDQorICBGbGFncz0wMDAwMDAxMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9RElTUExBWQ0KKyAgVmFsdWU9U3RhcnQgSW5zdGFsbGF0aW9uDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1TVU1NQVJZDQorICBWYWx1ZT1JbnN0YWxsIGRpcmVjdG9yeTogICVNQUlORElSJSVDUkxGJQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9U0VMRUNUX0FETUlODQorICBWYWx1ZT1BDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1TVU1NQVJZDQorICBWYWx1ZT0lQ1JMRiVEb2luZyBhZG1pbiBpbnN0YWxsLiVDUkxGJQ0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBFbHNlIFN0YXRlbWVudA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9U1VNTUFSWQ0KKyAgVmFsdWU9JUNSTEYlRG9pbmcgbm9uLWFkbWluIGluc3RhbGwuJUNSTEYlDQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9RE9CQUNLVVANCisgIFZhbHVlPUENCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVNVTU1BUlkNCisgIFZhbHVlPSVDUkxGJU1ha2UgYmFja3VwcywgaW50byAlQkFDS1VQJSVDUkxGJQ0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBFbHNlIFN0YXRlbWVudA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9U1VNTUFSWQ0KKyAgVmFsdWU9JUNSTEYlRG9uJ3QgbWFrZSBiYWNrdXBzLiVDUkxGJQ0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVNVTU1BUlkNCisgIFZhbHVlPSVDUkxGJUNvbXBvbmVudHM6JUNSTEYlDQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9Q09NUE9ORU5UUw0KKyAgVmFsdWU9QQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVNVTU1BUlkNCisgIFZhbHVlPSAgICBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIGxpYnJhcmllcyVDUkxGJQ0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUNPTVBPTkVOVFMNCisgIFZhbHVlPUINCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1TVU1NQVJZDQorICBWYWx1ZT0gICAgVGNsL1RrIChUa2ludGVyLCBJRExFLCBweWRvYyklQ1JMRiUNCisgIEZsYWdzPTAwMDAwMDAxDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1DT01QT05FTlRTDQorICBWYWx1ZT1DDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9U1VNTUFSWQ0KKyAgVmFsdWU9ICAgIFB5dGhvbiBkb2N1bWVudGF0aW9uJUNSTEYlDQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9Q09NUE9ORU5UUw0KKyAgVmFsdWU9RA0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPVNVTU1BUlkNCisgIFZhbHVlPSAgICBUb29sIGFuZCB1dGlsaXR5IHNjcmlwdHMlQ1JMRiUNCisgIEZsYWdzPTAwMDAwMDAxDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1DT01QT05FTlRTDQorICBWYWx1ZT1FDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9U1VNTUFSWQ0KKyAgVmFsdWU9ICAgIFB5dGhvbiB0ZXN0IHN1aXRlJUNSTEYlDQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9VEFTS1MNCisgIFZhbHVlPUENCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1TVU1NQVJZDQorICBWYWx1ZT0lQ1JMRiVSZWdpc3RlciBmaWxlIGV4dGVuc2lvbnMuJUNSTEYlDQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IEVsc2UgU3RhdGVtZW50DQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1TVU1NQVJZDQorICBWYWx1ZT0lQ1JMRiVEb24ndCByZWdpc3RlciBmaWxlIGV4dGVuc2lvbnMuJUNSTEYlDQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9VEFTS1MNCisgIFZhbHVlPUINCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1TVU1NQVJZDQorICBWYWx1ZT0lQ1JMRiVTdGFydCBNZW51IGdyb3VwOiAgJUdST1VQJSVDUkxGJQ0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBFbHNlIFN0YXRlbWVudA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9U1VNTUFSWQ0KKyAgVmFsdWU9JUNSTEYlTm8gU3RhcnQgTWVudSBzaG9ydGN1dHMuJUNSTEYlDQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEN1c3RvbSBEaWFsb2cgU2V0DQorICBOYW1lPVNlbGVjdCBEZXN0aW5hdGlvbiBEaXJlY3RvcnkNCisgIERpc3BsYXkgVmFyaWFibGU9RElTUExBWQ0KKyAgaXRlbTogRGlhbG9nDQorICAgIFRpdGxlPSVBUFBUSVRMRSUgSW5zdGFsbGF0aW9uDQorICAgIFRpdGxlIEZyZW5jaD1JbnN0YWxsYXRpb24gZGUgJUFQUFRJVExFJQ0KKyAgICBUaXRsZSBHZXJtYW49SW5zdGFsbGF0aW9uIHZvbiAlQVBQVElUTEUlDQorICAgIFRpdGxlIFNwYW5pc2g9SW5zdGFsYWNp824gZGUgJUFQUFRJVExFJQ0KKyAgICBUaXRsZSBJdGFsaWFuPUluc3RhbGxhemlvbmUgZGkgJUFQUFRJVExFJQ0KKyAgICBXaWR0aD0zMzkNCisgICAgSGVpZ2h0PTI4MA0KKyAgICBGb250IE5hbWU9SGVsdg0KKyAgICBGb250IFNpemU9OA0KKyAgICBpdGVtOiBQdXNoIEJ1dHRvbg0KKyAgICAgIFJlY3RhbmdsZT0xODggMjM0IDI0NCAyNTMNCisgICAgICBWYXJpYWJsZT1ESVJFQ1RJT04NCisgICAgICBWYWx1ZT1ODQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAxDQorICAgICAgVGV4dD0mTmV4dCA+DQorICAgICAgVGV4dCBGcmVuY2g9JlN1aXRlID4NCisgICAgICBUZXh0IEdlcm1hbj0mV2VpdGVyID4NCisgICAgICBUZXh0IFNwYW5pc2g9JlNpZ3VpZW50ZSA+DQorICAgICAgVGV4dCBJdGFsaWFuPSZBdmFudGkgPg0KKyAgICBlbmQNCisgICAgaXRlbTogUHVzaCBCdXR0b24NCisgICAgICBSZWN0YW5nbGU9MjY0IDIzNCAzMjAgMjUzDQorICAgICAgQWN0aW9uPTMNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PSZDYW5jZWwNCisgICAgICBUZXh0IEZyZW5jaD0mQW5udWxlcg0KKyAgICAgIFRleHQgR2VybWFuPSZBYmJyZWNoZW4NCisgICAgICBUZXh0IFNwYW5pc2g9JkNhbmNlbGFyDQorICAgICAgVGV4dCBJdGFsaWFuPSZBbm51bGxhDQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9MTAgMjI1IDMyMCAyMjYNCisgICAgICBBY3Rpb249Mw0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwOCAxMSAzMjMgMzMNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBGbGFncz0wMDAwMDAwMDAwMDAwMDAxDQorICAgICAgTmFtZT1UaW1lcyBOZXcgUm9tYW4NCisgICAgICBGb250IFN0eWxlPS0yNCAwIDAgMCA3MDAgMjU1IDAgMCAwIDMgMiAxIDE4DQorICAgICAgVGV4dD1TZWxlY3QgRGVzdGluYXRpb24gRGlyZWN0b3J5DQorICAgICAgVGV4dCBGcmVuY2g9U+lsZWN0aW9ubmVyIGxlIHLpcGVydG9pcmUgZGUgZGVzdGluYXRpb24NCisgICAgICBUZXh0IEdlcm1hbj1aaWVsdmVyemVpY2huaXMgd+RobGVuDQorICAgICAgVGV4dCBTcGFuaXNoPVNlbGVjY2lvbmUgZWwgZGlyZWN0b3JpbyBkZSBkZXN0aW5vDQorICAgICAgVGV4dCBJdGFsaWFuPVNlbGV6aW9uYXJlIERpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUNCisgICAgZW5kDQorICAgIGl0ZW06IExpc3Rib3gNCisgICAgICBSZWN0YW5nbGU9MTA4IDU4IDMyMSAyMTkNCisgICAgICBWYXJpYWJsZT1NQUlORElSDQorICAgICAgRW5hYmxlZCBDb2xvcj0wMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExMQ0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDEwMDAwMDAxMDAwMDAwMDEwMTAwMDAwMQ0KKyAgICAgIEZsYWdzPTAwMDAxMTAwMDAwMDEwMTANCisgICAgICBUZXh0PSVNQUlORElSJQ0KKyAgICAgIFRleHQ9DQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9MTA4IDQwIDMxMyA1OA0KKyAgICAgIEVuYWJsZWQgQ29sb3I9MDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTExMTENCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PVBsZWFzZSBzZWxlY3QgYSBkaXJlY3RvcnkgZm9yIHRoZSAlQVBQVElUTEUlIGZpbGVzLg0KKyAgICBlbmQNCisgIGVuZA0KKyAgaXRlbTogRGlhbG9nDQorICAgIFRpdGxlPVNlbGVjdCBEZXN0aW5hdGlvbiBEaXJlY3RvcnkNCisgICAgVGl0bGUgRnJlbmNoPVPpbGVjdGlvbm5lciBsZSBy6XBlcnRvaXJlIGRlIGRlc3RpbmF0aW9uDQorICAgIFRpdGxlIEdlcm1hbj1aaWVsdmVyemVpY2huaXMgd+RobGVuDQorICAgIFRpdGxlIFNwYW5pc2g9U2VsZWNjaW9uZSBlbCBkaXJlY3RvcmlvIGRlIGRlc3Rpbm8NCisgICAgVGl0bGUgSXRhbGlhbj1TZWxlemlvbmFyZSBEaXJlY3RvcnkgZGkgZGVzdGluYXppb25lDQorICAgIFdpZHRoPTI3Ng0KKyAgICBIZWlnaHQ9MjE2DQorICAgIEZvbnQgTmFtZT1IZWx2DQorICAgIEZvbnQgU2l6ZT04DQorICAgIGl0ZW06IExpc3Rib3gNCisgICAgICBSZWN0YW5nbGU9NiA2IDIwNCAxODYNCisgICAgICBWYXJpYWJsZT1NQUlORElSDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMTAwMDAwMDEwMDAwMDAwMTAxMDAwMDAwDQorICAgICAgRmxhZ3M9MDAwMDExMDAwMDEwMDAxMA0KKyAgICAgIFRleHQ9JU1BSU5ESVIlDQorICAgICAgVGV4dCBGcmVuY2g9JU1BSU5ESVIlDQorICAgICAgVGV4dCBHZXJtYW49JU1BSU5ESVIlDQorICAgICAgVGV4dCBTcGFuaXNoPSVNQUlORElSJQ0KKyAgICAgIFRleHQgSXRhbGlhbj0lTUFJTkRJUiUNCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTIwOSA4IDI2NSAyNg0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMQ0KKyAgICAgIFRleHQ9T0sNCisgICAgICBUZXh0IEZyZW5jaD1PSw0KKyAgICAgIFRleHQgR2VybWFuPU9LDQorICAgICAgVGV4dCBTcGFuaXNoPUFjZXB0YXINCisgICAgICBUZXh0IEl0YWxpYW49T0sNCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTIwOSAzMSAyNjUgNTANCisgICAgICBWYXJpYWJsZT1NQUlORElSDQorICAgICAgVmFsdWU9JU1BSU5ESVJfU0FWRSUNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDANCisgICAgICBGbGFncz0wMDAwMDAwMDAwMDAwMDAxDQorICAgICAgVGV4dD1DYW5jZWwNCisgICAgICBUZXh0IEZyZW5jaD1Bbm51bGVyDQorICAgICAgVGV4dCBHZXJtYW49QWJicmVjaGVuDQorICAgICAgVGV4dCBTcGFuaXNoPUNhbmNlbGFyDQorICAgICAgVGV4dCBJdGFsaWFuPUFubnVsbGENCisgICAgZW5kDQorICBlbmQNCitlbmQNCitpdGVtOiBDdXN0b20gRGlhbG9nIFNldA0KKyAgTmFtZT1CYWNrdXAgUmVwbGFjZWQgRmlsZXMNCisgIERpc3BsYXkgVmFyaWFibGU9RElTUExBWQ0KKyAgaXRlbTogRGlhbG9nDQorICAgIFRpdGxlPSVBUFBUSVRMRSUgSW5zdGFsbGF0aW9uDQorICAgIFRpdGxlIEZyZW5jaD1GaWNoaWVycyBkZSBTYXV2ZWdhcmRlIFJlbXBsYWPpcw0KKyAgICBUaXRsZSBHZXJtYW49U2ljaGVydW5nc2tvcGllIHZvbiBlcnNldHp0ZW4gRGF0ZWllbiBlcnN0ZWxsZW4NCisgICAgVGl0bGUgUG9ydHVndWVzZT1GaWNoZWlyb3Mgc3Vic3RpdHXtZG9zIGRlIHNlZ3VyYW7nYQ0KKyAgICBUaXRsZSBTcGFuaXNoPUNvcGlhcyBkZSBzZWd1cmlkYWQgZGUgbG9zIGFyY2hpdm9zIHJlZW1wbGF6YWRvcw0KKyAgICBUaXRsZSBJdGFsaWFuPUJhY2t1cCBmaWxlIHNvc3RpdHVpdGkNCisgICAgVGl0bGUgRGFuaXNoPVNpa2tlcmhlZHNrb3BpZXJpbmcgYWYgZXJzdGF0dGVkZSBmaWxlcg0KKyAgICBUaXRsZSBEdXRjaD1WZXJ2YW5nZW4gYmVzdGFuZGVuIGtvcGnrcmVuDQorICAgIFRpdGxlIE5vcndlZ2lhbj1TaWtrZXJoZXRza29waWVyZSBlcnN0YXR0ZWRlIGZpbGVyDQorICAgIFRpdGxlIFN3ZWRpc2g9U+RrZXJoZXRza29waWVyYSB1dGJ5dHRhIGZpbGVyDQorICAgIFdpZHRoPTM1MA0KKyAgICBIZWlnaHQ9MjgwDQorICAgIEZvbnQgTmFtZT1IZWx2DQorICAgIEZvbnQgU2l6ZT04DQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTE4OCAyMzQgMjQ0IDI1MQ0KKyAgICAgIFZhcmlhYmxlPURJUkVDVElPTg0KKyAgICAgIFZhbHVlPU4NCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDENCisgICAgICBUZXh0PSZOZXh0ID4NCisgICAgICBUZXh0IEZyZW5jaD0mU3VpdmFudD4NCisgICAgICBUZXh0IEdlcm1hbj0mV2VpdGVyPg0KKyAgICAgIFRleHQgUG9ydHVndWVzZT0mUHLzeGltbz4NCisgICAgICBUZXh0IFNwYW5pc2g9JlNpZ3VpZW50ZSA+DQorICAgICAgVGV4dCBJdGFsaWFuPSZBdmFudGkgPg0KKyAgICAgIFRleHQgRGFuaXNoPSZO5nN0ZT4NCisgICAgICBUZXh0IER1dGNoPSZWb2xnZW5kZT4NCisgICAgICBUZXh0IE5vcndlZ2lhbj0mTmVzdGU+DQorICAgICAgVGV4dCBTd2VkaXNoPSZO5HN0YSA+DQorICAgIGVuZA0KKyAgICBpdGVtOiBQdXNoIEJ1dHRvbg0KKyAgICAgIFJlY3RhbmdsZT0xMzEgMjM0IDE4OCAyNTENCisgICAgICBWYXJpYWJsZT1ESVJFQ1RJT04NCisgICAgICBWYWx1ZT1CDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD08ICZCYWNrDQorICAgICAgVGV4dCBGcmVuY2g9PCZSZXRvdXINCisgICAgICBUZXh0IEdlcm1hbj08Jlp1cvxjaw0KKyAgICAgIFRleHQgUG9ydHVndWVzZT08JlJldG9ybmFyDQorICAgICAgVGV4dCBTcGFuaXNoPTwmUmV0cm9jZWRlcg0KKyAgICAgIFRleHQgSXRhbGlhbj08ICZJbmRpZXRybw0KKyAgICAgIFRleHQgRGFuaXNoPTwmVGlsYmFnZQ0KKyAgICAgIFRleHQgRHV0Y2g9PCZUZXJ1Zw0KKyAgICAgIFRleHQgTm9yd2VnaWFuPTwmVGlsYmFrZQ0KKyAgICAgIFRleHQgU3dlZGlzaD08ICZUaWxsYmFrYQ0KKyAgICBlbmQNCisgICAgaXRlbTogUHVzaCBCdXR0b24NCisgICAgICBSZWN0YW5nbGU9Mjc4IDIzNCAzMzAgMjUxDQorICAgICAgQWN0aW9uPTMNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PUNhbmNlbA0KKyAgICAgIFRleHQgRnJlbmNoPUFubnVsZXINCisgICAgICBUZXh0IEdlcm1hbj1BYmJyZWNoZW4NCisgICAgICBUZXh0IFBvcnR1Z3Vlc2U9Q2FuY2VsYXINCisgICAgICBUZXh0IFNwYW5pc2g9Q2FuY2VsYXINCisgICAgICBUZXh0IEl0YWxpYW49QW5udWxsYQ0KKyAgICAgIFRleHQgRGFuaXNoPUFubnVsbGVyDQorICAgICAgVGV4dCBEdXRjaD1Bbm51bGVyZW4NCisgICAgICBUZXh0IE5vcndlZ2lhbj1BdmJyeXQNCisgICAgICBUZXh0IFN3ZWRpc2g9QXZicnl0DQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9MTEgMjIxIDMyOSAyMjMNCisgICAgICBBY3Rpb249Mw0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwOCA0NiAzMjAgOTgNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PVRoaXMgaW5zdGFsbGF0aW9uIHByb2dyYW0gY2FuIGNyZWF0ZSBiYWNrdXAgY29waWVzIG9mIGFsbCBmaWxlcyByZXBsYWNlZCBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbi4gVGhlc2UgZmlsZXMgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHNvZnR3YXJlIGlzIHVuaW5zdGFsbGVkIGFuZCBhIHJvbGxiYWNrIGlzIHJlcXVlc3RlZC4gIElmIGJhY2t1cCBjb3BpZXMgYXJlIG5vdCBjcmVhdGVkLCB5b3Ugd2lsbCBvbmx5IGJlIGFibGUgdG8gdW5pbnN0YWxsIHRoZSBzb2Z0d2FyZSBhbmQgbm90IHJvbGwgdGhlIHN5c3RlbSBiYWNrIHRvIGEgcHJldmlvdXMgc3RhdGUuDQorICAgICAgVGV4dD0NCisgICAgICBUZXh0PURvIHlvdSB3YW50IHRvIGNyZWF0ZSBiYWNrdXBzIG9mIHJlcGxhY2VkIGZpbGVzPw0KKyAgICAgIFRleHQgRnJlbmNoPUxlIHByb2dyYW1tZSBkJ2luc3RhbGxhdGlvbiBwZXV0IGNy6WVyIGRlcyBjb3BpZXMgZGUgc2F1dmVnYXJkZSBkZSB0b3VzIGxlcyBmaWNoaWVycyByZW1wbGFj6XMgcGVuZGFudCBsJ2luc3RhbGxhdGlvbi4gQ2VzIGZpY2hpZXJzIHNvbnQgdXRpbGlz6XMgYXUgY2FzIG/5IGxlIGxvZ2ljaWVsIGVzdCBk6XNpbnN0YWxs6SBldCBxdWUgbCdvbiBwcm9j6GRlIOAgbGEgcmVwcmlzZSBkdSBzeXN06G1lLiBTaSBsZXMgY29waWVzIGRlIHNhdXZlZ2FyZGUgbmUgc29udCBwYXMgY3Lp6WVzLCBvbiBuZSBwb3VycmEgcXVlIGTpc2luc3RhbGxlciBsZSBsb2dpY2llbCBzYW5zIHJlcHJlbmRyZSBsZSBzeXN06G1lIOAgdW4g6XRhdCBwculj6WRlbnQuIFZvdWxlei12b3VzIGNy6WVyIHVuZSBzYXV2ZWdhcmRlIGRlcyBmaWNoaWVycyByZW1wbGFj6XMgPw0KKyAgICAgIFRleHQgR2VybWFuPURpZXNlcyBJbnN0YWxsYXRpb25zcHJvZ3JhbW0ga2FubiBTaWNoZXJ1bmdza29waWVuIHZvbiBhbGxlbiB35GhyZW5kIGRlciBJbnN0YWxsYXRpb24gZXJzZXR6dGVuIERhdGVpZW4gZXJzdGVsbGVuLiBEaWVzZSBEYXRlaWVuIHdlcmRlbiB6dXIgUvxja2fkbmdpZ21hY2h1bmcgZGVyIEluc3RhbGxhdGlvbiB1bmQgYmVpIEFuZm9yZGVydW5nIGVpbmVzIFJvbGxiYWNrcyB2ZXJ3ZW5kZXQuIE9obmUgU2ljaGVydW5nc2tvcGllbiBpc3QgbnVyIGVpbmUgUvxja2fkbmdpZ21hY2h1bmcgZGVyIEluc3RhbGxhdGlvbiBt9mdsaWNoLCBuaWNodCBhYmVyIGVpbiBSb2xsYmFjayBkZXMgU3lzdGVtcy4gU2ljaGVydW5nc2tvcGllbiBkZXIgZXJzZXR6dGVuIERhdGVpZW4gZXJzdGVsbGVuPw0KKyAgICAgIFRleHQgUG9ydHVndWVzZT1Fc3RlIHByb2dyYW1hIGRlIGluc3RhbGHn428gcG9kZSBjcmlhciBj83BpYXMgZGUgc2VndXJhbudhIGRlIHRvZG9zIG9zIGZpY2hlaXJvcyBzdWJzdGl0de1kb3MgZHVyYW50ZSBhIGluc3RhbGHn428uIEVzdGVzIGZpY2hlaXJvcyBzZXLjbyB1dGlsaXphZG9zIHF1YW5kbyBvIHByb2dyYW1hIGZvciBkZXNpbnN0YWxhZG8gIGUgZm9yIHJlcXVpc2l0YWRhIHVtYSByZXRvbWFkYS4gU2UgYXMgY/NwaWFzIGRlIHNlZ3VyYW7nYSBu428gZm9yZW0gY3JpYWRhcywgc/MgcG9kZXLhIGRlc2luc3RhbGFyIG8gcHJvZ3JhbWEgZSBu428gcG9kZSByZXRvbWFyICB1bSBlc3RhZG8gYW50ZXJpb3IgZG8gc2lzdGVtYS4gRGVzZWphIGNyaWFyIGPzcGlhcyBkZSBzZWd1cmFu52EgZG9zIGZpY2hlaXJvcyBzdWJzdGl0de1kb3M/DQorICAgICAgVGV4dCBTcGFuaXNoPUVzdGUgcHJvZ3JhbWEgZGUgaW5zdGFsYWNp824gcHVlZGUgY3JlYXIgY29waWFzIGRlIHNlZ3VyaWRhZCBkZSB0b2RvcyBsb3MgYXJjaGl2b3MgcmVlbXBsYXphZG9zIGR1cmFudGUgbGEgaW5zdGFsYWNp824uIEVzdG9zIGFyY2hpdm9zIHNlIHV0aWxpemFy4W4gY3VhbmRvIHNlIGRlc2luc3RhbGUgZWwgc29mdHdhcmUgeSBzZSBzb2xpY2l0ZSB2b2x2ZXIgYWwgZXN0YWRvIGFudGVyaW9yLiBTaSBubyBzZSBjcmVhbiBjb3BpYXMgZGUgc2VndXJpZGFkLCD6bmljYW1lbnRlIHBvZHLhIGRlc2luc3RhbGFyIGVsIHNvZnR3YXJlIHkgbm8gcG9kcuEgZGV2b2x2ZXIgZWwgc2lzdGVtYSBhbCBlc3RhZG8gYW50ZXJpb3IuIL9EZXNlYSBjcmVhciBhcmNoaXZvcyBkZSBzZWd1cmlkYWQgZGUgbG9zIGFyY2hpdm9zIHJlZW1wbGF6YWRvcz8NCisgICAgICBUZXh0IEl0YWxpYW49UXVlc3RvIHByb2dyYW1tYSBkaSBpbnN0YWxsYXppb25lIHB18iBjcmVhcmUgY29waWUgZGkgYmFja3VwIGRpIHR1dHRpIGkgZmlsZSBzb3N0aXR1aXRpIGR1cmFudGUgbJJpbnN0YWxsYXppb25lLiBRdWVzdGkgZmlsZSBzYXJhbm5vIHVzYXRpIHF1YW5kbyBpbCBzb2Z0d2FyZSBzYXLgIGRpc2luc3RhbGxhdG8gZSBzYXLgIHJpY2hpZXN0byB1biByaXRvcm5vIGFsbG8gc3RhdG8gcHJlY2VkZW50ZS4gU2Ugbm9uIGNyZWkgbGUgY29waWUgZGkgYmFja3VwLCBwb3RyYWkgc29sbyBkaXNpbnN0YWxsYXJlIGlsIHNvZnR3YXJlLCBtYSBub24gcG90cmFpIHJpcG9ydGFyZSBpbCBzaXN0ZW1hIGFsbG8gc3RhdG8gcHJlY2VkZW50ZS4gVnVvaSBjcmVhcmUgaSBmaWxlIGRpIGJhY2t1cCBkZWkgZmlsZSBzb3N0aXR1aXRpPw0KKyAgICAgIFRleHQgRGFuaXNoPURldHRlIGluc3RhbGxhdGlvbnNwcm9ncmFtIGthbiBvcHJldHRlIHNpa2tlcmhlZHNrb3BpZXIgYWYgYWxsZSBmaWxlciwgc29tIGVyc3RhdHRlcyB1bmRlciBpbnN0YWxsYXRpb25lbi4gRGlzc2UgZmlsZXIgYmVueXR0ZXMsIG7lciBzb2Z0d2FyZW4gZmplcm5lcywgb2cgZGVuIHRpZGxpZ2VyZSBzeXN0ZW1rb25maWd1cmF0aW9uIGdlbmV0YWJsZXJlcy4gSHZpcyBkZXIgaWtrZSBvcHJldHRlcyBzaWtrZXJoZWRza29waWVyLCBrYW4gZHUga3VuIGZqZXJuZSBkZW4gaW5zdGFsbGVyZWRlIHNvZnR3YXJlIG9nIGlra2UgZ2VuZXRhYmxlcmUgZGVuIHRpZGxpZ2VyZSBzeXN0ZW1rb25maWd1cmF0aW9uLiBWaWwgZHUgb3ByZXR0ZSBzaWtrZXJoZWRza29waWVyIGFmIGZpbGVyLCBzb20gZXJzdGF0dGVzPw0KKyAgICAgIFRleHQgRHV0Y2g9RGl0IGluc3RhbGxhdGllcHJvZ3JhbW1hIGthbiBrb3BpZetuIG1ha2VuIHZhbiBhbGxlIGJlc3RhbmRlbiBkaWUgdGlqZGVucyBkZSBpbnN0YWxsYXRpZSB3b3JkZW4gdmVydmFuZ2VuLiBEZXplIHdvcmRlbiBkYW4gZ2VicnVpa3QgYWxzIGRlIHNvZnR3YXJlLWluc3RhbGxhdGllIG9uZ2VkYWFuIHdvcmR0IGdlbWFha3QgZW4gdSBoZXQgc3lzdGVlbSB3aWx0IGxhdGVuIHRlcnVna2VyZW4gbmFhciBkZSBvb3JzcHJvbmtlbGlqa2Ugc3RhYXQuIEFscyBlciBnZWVuIGJhY2stdXAga29waWXrbiB3b3JkZW4gZ2VtYWFrdCwga3VudCB1IGRlIHNvZnR3YXJlIGVua2VsIHZlcndpamRlcmVuIG1hYXIgaGV0IHN5c3RlZW0gbmlldCBpbiBkZSBvb3JzcHJvbmtlbGlqa2Ugc3RhYXQgdGVydWdicmVuZ2VuLiBXaWx0IHUgZWVuIGJhY2stdXAgbWFrZW4gdmFuIGRlIHZlcnZhbmdlbiBiZXN0YW5kZW4/DQorICAgICAgVGV4dCBOb3J3ZWdpYW49RGV0dGUgaW5zdGFsbGFzam9uc3Byb2dyYW1tZXQga2FuIGxhZ2Ugc2lra2VyaGV0c2tvcGllciBhdiBhbGxlIGZpbGVyIHNvbSBibGlyIGVyc3RhdHRldCB1bmRlciBpbnN0YWxsYXNqb25lbi4gRGlzc2UgZmlsZW5lIHZpbCB0YXMgaSBicnVrIG7lciBwcm9ncmFtdmFyZW4gZXIgYXZpbnN0YWxsZXJ0IG9nIGRldCBlciBiZWhvdiBmb3IgdGlsYmFrZXN0aWxsaW5nLiBIdmlzIGRldCBpa2tlIGVyIGxhZ2V0IHNpa2tlcmhldHNrb3BpZXIsIGthbiBkdSBrdW4gYXZpbnN0YWxsZXJlIHByb2dyYW12YXJlbiBvZyBpa2tlIHN0aWxsZSBzeXN0ZW1ldCB0aWxiYWtlIHRpbCB0aWRsaWdlcmUgc3RhdHVzLiDYbnNrZXIgZHUg5SBsYWdlIHNpa2tlcmhldHNrb3BpZXIgYXYgZGUgZmlsZW5lIHNvbSBibGlyIGVyc3RhdHRldCBu5T8NCisgICAgICBUZXh0IFN3ZWRpc2g9SW5zdGFsbGF0aW9uc3Byb2dyYW1tZXQga2FuIHNrYXBhIHPka2VyaGV0c2tvcGlvciBhdiBhbGxhIGZpbGVyIHNvbSBieXRzIHV0IHVuZGVyIGluc3RhbGxhdGlvbmVuLiBEZXNzYSBmaWxlciBrYW4gc2VkYW4gYW525G5kYXMgbuRyIHByb2dyYW12YXJhbiBhdmluc3RhbGxlcmFzIG9jaCBkdSBiZWfkciByb2xsYmFjay4gT20gZHUgZOUgaW50ZSBoYXIgbuVncmEgc+RrZXJoZXRza29waW9yIGthbiBkdSBiYXJhIGF2aW5zdGFsbGVyYSBwcm9ncmFtdmFyYW4sIGludGUg5XRlcnNrYXBhIHN5c3RlbWV0IGkgZGVzcyB0aWRpZ2FyZSBza2ljay4gVmlsbCBkdSBn9nJhIHPka2VyaGV0c2tvcGlvciBhdiBkZSBlcnNhdHRhIGZpbGVybmE/DQorICAgIGVuZA0KKyAgICBpdGVtOiBSYWRpbyBCdXR0b24NCisgICAgICBSZWN0YW5nbGU9MTQxIDEwNiAyNjUgMTM2DQorICAgICAgVmFyaWFibGU9RE9CQUNLVVANCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDEwMDENCisgICAgICBUZXh0PSZZZXMsIG1ha2UgYmFja3Vwcw0KKyAgICAgIFRleHQ9TiZvLCBkbyBub3QgbWFrZSBiYWNrdXBzDQorICAgICAgVGV4dD0NCisgICAgICBUZXh0IEZyZW5jaD0mT3VpDQorICAgICAgVGV4dCBGcmVuY2g9TiZvbg0KKyAgICAgIFRleHQgRnJlbmNoPQ0KKyAgICAgIFRleHQgR2VybWFuPSZKYQ0KKyAgICAgIFRleHQgR2VybWFuPU4mZWluDQorICAgICAgVGV4dCBHZXJtYW49DQorICAgICAgVGV4dCBQb3J0dWd1ZXNlPSZTaW0NCisgICAgICBUZXh0IFBvcnR1Z3Vlc2U9TuMmbw0KKyAgICAgIFRleHQgUG9ydHVndWVzZT0NCisgICAgICBUZXh0IFNwYW5pc2g9JlPtDQorICAgICAgVGV4dCBTcGFuaXNoPU4mbw0KKyAgICAgIFRleHQgU3BhbmlzaD0NCisgICAgICBUZXh0IEl0YWxpYW49JlPsDQorICAgICAgVGV4dCBJdGFsaWFuPU4mbw0KKyAgICAgIFRleHQgSXRhbGlhbj0NCisgICAgICBUZXh0IERhbmlzaD0mSmENCisgICAgICBUZXh0IERhbmlzaD0mTmVqDQorICAgICAgVGV4dCBEYW5pc2g9DQorICAgICAgVGV4dCBEdXRjaD0mSmENCisgICAgICBUZXh0IER1dGNoPU4mZWUNCisgICAgICBUZXh0IER1dGNoPQ0KKyAgICAgIFRleHQgTm9yd2VnaWFuPSZKYQ0KKyAgICAgIFRleHQgTm9yd2VnaWFuPSZOZWkNCisgICAgICBUZXh0IE5vcndlZ2lhbj0NCisgICAgICBUZXh0IFN3ZWRpc2g9JkphDQorICAgICAgVGV4dCBTd2VkaXNoPU4mZWoNCisgICAgICBUZXh0IFN3ZWRpc2g9DQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBDb250cm9sIE5hbWU9QkFDSzINCisgICAgICBSZWN0YW5nbGU9MTA4IDE3MyAzMjAgMjA4DQorICAgICAgQWN0aW9uPTENCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTENCisgICAgICBUZXh0PUJhY2t1cCBGaWxlIERlc3RpbmF0aW9uIERpcmVjdG9yeQ0KKyAgICAgIFRleHQgRnJlbmNoPVLpcGVydG9pcmUgZGUgZGVzdGluYXRpb24gZGVzIGZpY2hpZXJzIGRlIHNhdXZlZ2FyZGUNCisgICAgICBUZXh0IEdlcm1hbj1aaWVsdmVyemVpY2huaXMgZvxyIGRpZSBTaWNoZXJ1bmdzZGF0ZWkNCisgICAgICBUZXh0IFBvcnR1Z3Vlc2U9RGlyZWN083JpbyBkZSBkZXN0aW5vIGRlIGZpY2hlaXJvIGRlIHNlZ3VyYW7nYQ0KKyAgICAgIFRleHQgU3BhbmlzaD1EaXJlY3RvcmlvIGRlIERlc3Rpbm8gZGUgbG9zIEFyY2hpdm9zIGRlIFNlZ3VyaWRhZA0KKyAgICAgIFRleHQgSXRhbGlhbj1EaXJlY3RvcnkgZGkgZGVzdGluYXppb25lIGRlaSBmaWxlIGRpIGJhY2t1cA0KKyAgICAgIFRleHQgRGFuaXNoPURlc3RpbmF0aW9uc2JpYmxpb3RlayB0aWwgc2lra2VyaGVkc2tvcGllcg0KKyAgICAgIFRleHQgRHV0Y2g9RG9lbGRpcmVjdG9yeSBiYWNrdXAtYmVzdGFuZA0KKyAgICAgIFRleHQgTm9yd2VnaWFuPU3lbGthdGFsb2cgZm9yIHNpa2tlcmhldHNrb3BpZXINCisgICAgICBUZXh0IFN3ZWRpc2g9S2F0YWxvZyBm9nIgc+RrZXJoZXRza29waWVyYWRlIGZpbGVyDQorICAgIGVuZA0KKyAgICBpdGVtOiBQdXNoIEJ1dHRvbg0KKyAgICAgIENvbnRyb2wgTmFtZT1CQUNLMw0KKyAgICAgIFJlY3RhbmdsZT0yNjUgMTg1IDMxOCAyMDMNCisgICAgICBWYXJpYWJsZT1CQUNLVVBfU0FWRQ0KKyAgICAgIFZhbHVlPSVCQUNLVVAlDQorICAgICAgRGVzdGluYXRpb24gRGlhbG9nPTENCisgICAgICBBY3Rpb249Mg0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMA0KKyAgICAgIFRleHQ9QiZyb3dzZS4uLg0KKyAgICAgIFRleHQgRnJlbmNoPVAmYXJjb3VyaXINCisgICAgICBUZXh0IEdlcm1hbj1CJmzkdHRlcm4uLi4NCisgICAgICBUZXh0IFBvcnR1Z3Vlc2U9UCZyb2N1cmFyDQorICAgICAgVGV4dCBTcGFuaXNoPVYmaXN1YWxpemFyLi4uDQorICAgICAgVGV4dCBJdGFsaWFuPVNmb2dsaWEuLi4NCisgICAgICBUZXh0IERhbmlzaD0mR2VubmVtc2UuLi4NCisgICAgICBUZXh0IER1dGNoPUImbGFkZXJlbi4uLg0KKyAgICAgIFRleHQgTm9yd2VnaWFuPUJsYSBpZ2plbm5vbQ0KKyAgICAgIFRleHQgU3dlZGlzaD0mQmzkZGRyYQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgQ29udHJvbCBOYW1lPUJBQ0s0DQorICAgICAgUmVjdGFuZ2xlPTEyOSAxODggMjU0IDIwMA0KKyAgICAgIERlc3RpbmF0aW9uIERpYWxvZz0yDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD0lQkFDS1VQJQ0KKyAgICAgIFRleHQgRnJlbmNoPSVCQUNLVVAlDQorICAgICAgVGV4dCBHZXJtYW49JUJBQ0tVUCUNCisgICAgICBUZXh0IFBvcnR1Z3Vlc2U9JUJBQ0tVUCUNCisgICAgICBUZXh0IFNwYW5pc2g9JUJBQ0tVUCUNCisgICAgICBUZXh0IEl0YWxpYW49JUJBQ0tVUCUNCisgICAgICBUZXh0IERhbmlzaD0lQkFDS1VQJQ0KKyAgICAgIFRleHQgRHV0Y2g9JUJBQ0tVUCUNCisgICAgICBUZXh0IE5vcndlZ2lhbj0lQkFDS1VQJQ0KKyAgICAgIFRleHQgU3dlZGlzaD0lQkFDS1VQJQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwOCAxMSAzMjMgMzYNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBGbGFncz0wMDAwMDAwMDAwMDAwMDAxDQorICAgICAgTmFtZT1UaW1lcyBOZXcgUm9tYW4NCisgICAgICBGb250IFN0eWxlPS0yNCAwIDAgMCA3MDAgMjU1IDAgMCAwIDMgMiAxIDE4DQorICAgICAgVGV4dD1CYWNrdXAgUmVwbGFjZWQgRmlsZXMNCisgICAgICBUZXh0IEZyZW5jaD1T6WxlY3Rpb25uZXIgbGVzIGNvbXBvc2FudHMNCisgICAgICBUZXh0IEdlcm1hbj1Lb21wb25lbnRlbiBhdXN35GhsZW4NCisgICAgICBUZXh0IFNwYW5pc2g9U2VsZWNjaW9uZSBjb21wb25lbnRlcw0KKyAgICAgIFRleHQgSXRhbGlhbj1TZWxlemlvbmFyZSBpIGNvbXBvbmVudGkNCisgICAgZW5kDQorICAgIGl0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgICAgIFZhcmlhYmxlPURPQkFDS1VQDQorICAgICAgVmFsdWU9Qg0KKyAgICBlbmQNCisgICAgaXRlbTogU2V0IENvbnRyb2wgQXR0cmlidXRlDQorICAgICAgQ29udHJvbCBOYW1lPUJBQ0szDQorICAgICAgT3BlcmF0aW9uPTENCisgICAgZW5kDQorICAgIGl0ZW06IFNldCBDb250cm9sIEF0dHJpYnV0ZQ0KKyAgICAgIENvbnRyb2wgTmFtZT1CQUNLNA0KKyAgICAgIE9wZXJhdGlvbj0xDQorICAgIGVuZA0KKyAgICBpdGVtOiBFbHNlIFN0YXRlbWVudA0KKyAgICBlbmQNCisgICAgaXRlbTogU2V0IENvbnRyb2wgQXR0cmlidXRlDQorICAgICAgQ29udHJvbCBOYW1lPUJBQ0szDQorICAgIGVuZA0KKyAgICBpdGVtOiBTZXQgQ29udHJvbCBBdHRyaWJ1dGUNCisgICAgICBDb250cm9sIE5hbWU9QkFDSzQNCisgICAgZW5kDQorICAgIGl0ZW06IEVuZCBCbG9jaw0KKyAgICBlbmQNCisgIGVuZA0KKyAgaXRlbTogRGlhbG9nDQorICAgIFRpdGxlPVNlbGVjdCBEZXN0aW5hdGlvbiBEaXJlY3RvcnkNCisgICAgVGl0bGUgRnJlbmNoPUNob2lzaXNzZXogbGUgculwZXJ0b2lyZSBkZSBkZXN0aW5hdGlvbg0KKyAgICBUaXRsZSBHZXJtYW49WmllbHZlcnplaWNobmlzIHfkaGxlbg0KKyAgICBUaXRsZSBQb3J0dWd1ZXNlPVNlbGVjY2lvbmFyIERpcmVjdPNyaW8gZGUgRGVzdGlubw0KKyAgICBUaXRsZSBTcGFuaXNoPVNlbGVjY2lvbmUgZWwgRGlyZWN0b3JpbyBkZSBEZXN0aW5vDQorICAgIFRpdGxlIEl0YWxpYW49U2VsZXppb25hIERpcmVjdG9yeSBkaSBkZXN0aW5hemlvbmUNCisgICAgVGl0bGUgRGFuaXNoPVbmbGcgRGVzdGluYXRpb25zYmlibGlvdGVrDQorICAgIFRpdGxlIER1dGNoPUtpZXMgRG9lbGRpcmVjdG9yeQ0KKyAgICBUaXRsZSBOb3J3ZWdpYW49VmVsZyBt5WxrYXRhbG9nDQorICAgIFRpdGxlIFN3ZWRpc2g9VuRsaiBkZXN0aW5hdGlvbnNrYWxhdG9nDQorICAgIFdpZHRoPTI3Ng0KKyAgICBIZWlnaHQ9MjE2DQorICAgIEZvbnQgTmFtZT1IZWx2DQorICAgIEZvbnQgU2l6ZT04DQorICAgIGl0ZW06IExpc3Rib3gNCisgICAgICBSZWN0YW5nbGU9NiAzIDIwMCAxODYNCisgICAgICBWYXJpYWJsZT1CQUNLVVANCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAxMDAwMDAwMTAwMDAwMDAxMDEwMDAwMDANCisgICAgICBGbGFncz0wMDAwMTEwMDAwMTAwMDEwDQorICAgICAgVGV4dD0lQkFDS1VQJQ0KKyAgICAgIFRleHQ9DQorICAgICAgVGV4dCBGcmVuY2g9JUJBQ0tVUCUNCisgICAgICBUZXh0IEZyZW5jaD0NCisgICAgICBUZXh0IEdlcm1hbj0lQkFDS1VQJQ0KKyAgICAgIFRleHQgR2VybWFuPQ0KKyAgICAgIFRleHQgUG9ydHVndWVzZT0lQkFDS1VQJQ0KKyAgICAgIFRleHQgUG9ydHVndWVzZT0NCisgICAgICBUZXh0IFNwYW5pc2g9JUJBQ0tVUCUNCisgICAgICBUZXh0IFNwYW5pc2g9DQorICAgICAgVGV4dCBJdGFsaWFuPSVCQUNLVVAlDQorICAgICAgVGV4dCBJdGFsaWFuPQ0KKyAgICAgIFRleHQgRGFuaXNoPSVCQUNLVVAlDQorICAgICAgVGV4dCBEYW5pc2g9DQorICAgICAgVGV4dCBEdXRjaD0lQkFDS1VQJQ0KKyAgICAgIFRleHQgRHV0Y2g9DQorICAgICAgVGV4dCBOb3J3ZWdpYW49JUJBQ0tVUCUNCisgICAgICBUZXh0IE5vcndlZ2lhbj0NCisgICAgICBUZXh0IFN3ZWRpc2g9JUJBQ0tVUCUNCisgICAgICBUZXh0IFN3ZWRpc2g9DQorICAgIGVuZA0KKyAgICBpdGVtOiBQdXNoIEJ1dHRvbg0KKyAgICAgIFJlY3RhbmdsZT0yMDkgOCAyNjUgMjYNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDENCisgICAgICBUZXh0PU9LDQorICAgICAgVGV4dCBGcmVuY2g9T0sNCisgICAgICBUZXh0IEdlcm1hbj1PSw0KKyAgICAgIFRleHQgUG9ydHVndWVzZT1PSw0KKyAgICAgIFRleHQgU3BhbmlzaD1BQ0VQVEFSDQorICAgICAgVGV4dCBJdGFsaWFuPU9LDQorICAgICAgVGV4dCBEYW5pc2g9T0sNCisgICAgICBUZXh0IER1dGNoPU9LDQorICAgICAgVGV4dCBOb3J3ZWdpYW49T0sNCisgICAgICBUZXh0IFN3ZWRpc2g9T0sNCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTIwOSAzMSAyNjUgNTANCisgICAgICBWYXJpYWJsZT1CQUNLVVANCisgICAgICBWYWx1ZT0lQkFDS1VQX1NBVkUlDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAwMQ0KKyAgICAgIFRleHQ9Q2FuY2VsDQorICAgICAgVGV4dCBGcmVuY2g9QW5udWxlcg0KKyAgICAgIFRleHQgR2VybWFuPUFiYnJlY2hlbg0KKyAgICAgIFRleHQgUG9ydHVndWVzZT1DYW5jZWxhcg0KKyAgICAgIFRleHQgU3BhbmlzaD1DYW5jZWxhcg0KKyAgICAgIFRleHQgSXRhbGlhbj1Bbm51bGxhDQorICAgICAgVGV4dCBEYW5pc2g9U2xldA0KKyAgICAgIFRleHQgRHV0Y2g9QW5udWxlcmVuDQorICAgICAgVGV4dCBOb3J3ZWdpYW49QXZicnl0DQorICAgICAgVGV4dCBTd2VkaXNoPUF2YnJ5dA0KKyAgICBlbmQNCisgIGVuZA0KK2VuZA0KK2l0ZW06IEN1c3RvbSBEaWFsb2cgU2V0DQorICBOYW1lPVNlbGVjdCBDb21wb25lbnRzDQorICBEaXNwbGF5IFZhcmlhYmxlPURJU1BMQVkNCisgIGl0ZW06IERpYWxvZw0KKyAgICBUaXRsZT0lQVBQVElUTEUlIEluc3RhbGxhdGlvbg0KKyAgICBUaXRsZSBGcmVuY2g9SW5zdGFsbGF0aW9uIGRlICVBUFBUSVRMRSUNCisgICAgVGl0bGUgR2VybWFuPUluc3RhbGxhdGlvbiB2b24gJUFQUFRJVExFJQ0KKyAgICBUaXRsZSBTcGFuaXNoPUluc3RhbGFjafNuIGRlICVBUFBUSVRMRSUNCisgICAgVGl0bGUgSXRhbGlhbj1JbnN0YWxsYXppb25lIGRpICVBUFBUSVRMRSUNCisgICAgV2lkdGg9MzM5DQorICAgIEhlaWdodD0yODANCisgICAgRm9udCBOYW1lPUhlbHYNCisgICAgRm9udCBTaXplPTgNCisgICAgaXRlbTogUHVzaCBCdXR0b24NCisgICAgICBSZWN0YW5nbGU9MTg4IDIzNCAyNDQgMjUzDQorICAgICAgVmFyaWFibGU9RElSRUNUSU9ODQorICAgICAgVmFsdWU9Tg0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMQ0KKyAgICAgIFRleHQ9Jk5leHQgPg0KKyAgICAgIFRleHQgRnJlbmNoPSZTdWl0ZSA+DQorICAgICAgVGV4dCBHZXJtYW49JldlaXRlciA+DQorICAgICAgVGV4dCBTcGFuaXNoPSZTaWd1aWVudGUgPg0KKyAgICAgIFRleHQgSXRhbGlhbj0mQXZhbnRpID4NCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTEzMSAyMzQgMTg4IDI1Mw0KKyAgICAgIFZhcmlhYmxlPURJUkVDVElPTg0KKyAgICAgIFZhbHVlPUINCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PTwgJkJhY2sNCisgICAgICBUZXh0IEZyZW5jaD08ICZSZXRvdXINCisgICAgICBUZXh0IEdlcm1hbj08ICZadXL8Y2sNCisgICAgICBUZXh0IFNwYW5pc2g9PCAmQXRy4XMNCisgICAgICBUZXh0IEl0YWxpYW49PCAmSW5kaWV0cm8NCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTI2NCAyMzQgMzIwIDI1Mw0KKyAgICAgIEFjdGlvbj0zDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD0mQ2FuY2VsDQorICAgICAgVGV4dCBGcmVuY2g9JkFubnVsZXINCisgICAgICBUZXh0IEdlcm1hbj0mQWJicmVjaGVuDQorICAgICAgVGV4dCBTcGFuaXNoPSZDYW5jZWxhcg0KKyAgICAgIFRleHQgSXRhbGlhbj0mQW5udWxsYQ0KKyAgICBlbmQNCisgICAgaXRlbTogQ2hlY2tib3gNCisgICAgICBSZWN0YW5nbGU9MTA4IDY2IDMxMyAxNTYNCisgICAgICBWYXJpYWJsZT1DT01QT05FTlRTDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDExDQorICAgICAgRmxhZ3M9MDAwMDAwMDAwMDAwMDExMA0KKyAgICAgIFRleHQ9UHl0aG9uIGludGVycHJldGVyIGFuZCBsaWJyYXJpZXMNCisgICAgICBUZXh0PVRjbC9UayAoVGtpbnRlciwgSURMRSwgcHlkb2MpDQorICAgICAgVGV4dD1QeXRob24gSFRNTCBkb2NzDQorICAgICAgVGV4dD1QeXRob24gdXRpbGl0eSBzY3JpcHRzIChUb29scy8pDQorICAgICAgVGV4dD1QeXRob24gdGVzdCBzdWl0ZSAoTGliL3Rlc3QvKQ0KKyAgICAgIFRleHQ9DQorICAgICAgVGV4dCBGcmVuY2g9UHl0aG9uIGludGVycHJldGVyLCBsaWJyYXJ5IGFuZCBJRExFDQorICAgICAgVGV4dCBGcmVuY2g9UHl0aG9uIEhUTUwgZG9jcw0KKyAgICAgIFRleHQgRnJlbmNoPVB5dGhvbiB1dGlsaXR5IHNjcmlwdHMgKFRvb2xzLykNCisgICAgICBUZXh0IEZyZW5jaD1QeXRob24gdGVzdCBzdWl0ZSAoTGliL3Rlc3QvKQ0KKyAgICAgIFRleHQgRnJlbmNoPQ0KKyAgICAgIFRleHQgR2VybWFuPVB5dGhvbiBpbnRlcnByZXRlciwgbGlicmFyeSBhbmQgSURMRQ0KKyAgICAgIFRleHQgR2VybWFuPVB5dGhvbiBIVE1MIGRvY3MNCisgICAgICBUZXh0IEdlcm1hbj1QeXRob24gdXRpbGl0eSBzY3JpcHRzIChUb29scy8pDQorICAgICAgVGV4dCBHZXJtYW49UHl0aG9uIHRlc3Qgc3VpdGUgKExpYi90ZXN0LykNCisgICAgICBUZXh0IEdlcm1hbj0NCisgICAgICBUZXh0IFNwYW5pc2g9UHl0aG9uIGludGVycHJldGVyLCBsaWJyYXJ5IGFuZCBJRExFDQorICAgICAgVGV4dCBTcGFuaXNoPVB5dGhvbiBIVE1MIGRvY3MNCisgICAgICBUZXh0IFNwYW5pc2g9UHl0aG9uIHV0aWxpdHkgc2NyaXB0cyAoVG9vbHMvKQ0KKyAgICAgIFRleHQgU3BhbmlzaD1QeXRob24gdGVzdCBzdWl0ZSAoTGliL3Rlc3QvKQ0KKyAgICAgIFRleHQgU3BhbmlzaD0NCisgICAgICBUZXh0IEl0YWxpYW49UHl0aG9uIGludGVycHJldGVyLCBsaWJyYXJ5IGFuZCBJRExFDQorICAgICAgVGV4dCBJdGFsaWFuPVB5dGhvbiBIVE1MIGRvY3MNCisgICAgICBUZXh0IEl0YWxpYW49UHl0aG9uIHV0aWxpdHkgc2NyaXB0cyAoVG9vbHMvKQ0KKyAgICAgIFRleHQgSXRhbGlhbj1QeXRob24gdGVzdCBzdWl0ZSAoTGliL3Rlc3QvKQ0KKyAgICAgIFRleHQgSXRhbGlhbj0NCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMDggNDUgMzIwIDYzDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD1DaG9vc2Ugd2hpY2ggY29tcG9uZW50cyB0byBpbnN0YWxsIGJ5IGNoZWNraW5nIHRoZSBib3hlcyBiZWxvdy4NCisgICAgICBUZXh0IEZyZW5jaD1DaG9pc2lzc2V6IGxlcyBjb21wb3NhbnRzIHF1ZSB2b3VzIHZvdWxleiBpbnN0YWxsZXIgZW4gY29jaGFudCBsZXMgY2FzZXMgY2ktZGVzc291cy4NCisgICAgICBUZXh0IEdlcm1hbj1X5GhsZW4gU2llIGRpZSB6dSBpbnN0YWxsaWVyZW5kZW4gS29tcG9uZW50ZW4sIGluZGVtIFNpZSBpbiBkaWUgZW50c3ByZWNoZW5kZW4gS+RzdGNoZW4ga2xpY2tlbi4NCisgICAgICBUZXh0IFNwYW5pc2g9RWxpamEgbG9zIGNvbXBvbmVudGVzIHF1ZSBkZXNlZSBpbnN0YWxhciBtYXJjYW5kbyBsb3MgY3VhZHJvcyBkZSBhYmFqby4NCisgICAgICBUZXh0IEl0YWxpYW49U2NlZ2xpZXJlIHF1YWxpIGNvbXBvbmVudGkgaW5zdGFsbGFyZSBzZWxlemlvbmFuZG8gbGUgY2FzZWxsZSBzb3R0b3N0YW50aS4NCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTE4OCAyMDMgMjY5IDIyMA0KKyAgICAgIERlc3RpbmF0aW9uIERpYWxvZz0xDQorICAgICAgQWN0aW9uPTINCisgICAgICBFbmFibGVkIENvbG9yPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD1BZHZhbmNlZCBPcHRpb25zIC4uLg0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwIDIyNSAzMjAgMjI2DQorICAgICAgQWN0aW9uPTMNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTENCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMDggMTAgMzIzIDQzDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAwMQ0KKyAgICAgIE5hbWU9VGltZXMgTmV3IFJvbWFuDQorICAgICAgRm9udCBTdHlsZT0tMjQgMCAwIDAgNzAwIDI1NSAwIDAgMCAzIDIgMSAxOA0KKyAgICAgIFRleHQ9U2VsZWN0IENvbXBvbmVudHMNCisgICAgICBUZXh0IEZyZW5jaD1T6WxlY3Rpb25uZXIgbGVzIGNvbXBvc2FudHMNCisgICAgICBUZXh0IEdlcm1hbj1Lb21wb25lbnRlbiBhdXN35GhsZW4NCisgICAgICBUZXh0IFNwYW5pc2g9U2VsZWNjaW9uZSBjb21wb25lbnRlcw0KKyAgICAgIFRleHQgSXRhbGlhbj1TZWxlemlvbmFyZSBpIGNvbXBvbmVudGkNCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0yNTEgMTgwIDMxMSAxOTMNCisgICAgICBWYXJpYWJsZT1DT01QT05FTlRTDQorICAgICAgVmFsdWU9TUFJTkRJUg0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMA0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTI1MSAxNjggMzExIDE3OQ0KKyAgICAgIFZhcmlhYmxlPUNPTVBPTkVOVFMNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTANCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMjMgMTY4IDIzNCAxODENCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PURpc2sgU3BhY2UgUmVxdWlyZWQ6DQorICAgICAgVGV4dCBGcmVuY2g9RXNwYWNlIGRpc3F1ZSByZXF1aXMgOg0KKyAgICAgIFRleHQgR2VybWFuPU5vdHdlbmRpZ2VyIFNwZWljaGVycGxhdHo6DQorICAgICAgVGV4dCBTcGFuaXNoPUVzcGFjaW8gcmVxdWVyaWRvIGVuIGVsIGRpc2NvOg0KKyAgICAgIFRleHQgSXRhbGlhbj1TcGF6aW8gc3UgZGlzY28gbmVjZXNzYXJpbzoNCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMjMgMTgwIDIzNCAxOTMNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PURpc2sgU3BhY2UgUmVtYWluaW5nOg0KKyAgICAgIFRleHQgRnJlbmNoPUVzcGFjZSBkaXNxdWUgZGlzcG9uaWJsZSA6DQorICAgICAgVGV4dCBHZXJtYW49VmVyYmxlaWJlbmRlciBTcGVpY2hlcnBsYXR6Og0KKyAgICAgIFRleHQgU3BhbmlzaD1Fc3BhY2lvIGVuIGRpc2NvIGRpc3BvbmlibGU6DQorICAgICAgVGV4dCBJdGFsaWFuPVNwYXppbyBzdSBkaXNjbyBkaXNwb25pYmlsZToNCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMDggMTU4IDMyMCAxOTYNCisgICAgICBBY3Rpb249MQ0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMQ0KKyAgICBlbmQNCisgICAgaXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICAgICAgVmFyaWFibGU9RExHX0VWRU5UX1RZUEUNCisgICAgICBWYWx1ZT1WRVJJRlkNCisgICAgZW5kDQorICAgIGl0ZW06IFJlbWFyaw0KKyAgICAgIFRleHQ9SWYgdGhleSdyZSBpbnN0YWxsaW5nIFRjbC9UaywgVG9vbHMsIG9yIHRoZSB0ZXN0IHN1aXRlLCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB1bmxlc3MgdGhleSdyZSBpbnN0YWxsaW5nIFB5dGhvbiB0b28uDQorICAgIGVuZA0KKyAgICBpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgICAgICBWYXJpYWJsZT1DT01QT05FTlRTDQorICAgICAgVmFsdWU9QkRFDQorICAgICAgRmxhZ3M9MDAwMDEwMTANCisgICAgZW5kDQorICAgIGl0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgICAgIFZhcmlhYmxlPUNPTVBPTkVOVFMNCisgICAgICBWYWx1ZT1BDQorICAgICAgRmxhZ3M9MDAwMDAwMTENCisgICAgZW5kDQorICAgIGl0ZW06IERpc3BsYXkgTWVzc2FnZQ0KKyAgICAgIFRpdGxlPUFyZSB5b3Ugc3VyZT8NCisgICAgICBUZXh0PUluc3RhbGxpbmcgVGNsL1RrLCBUb29scyBvciB0aGUgdGVzdCBzdWl0ZSBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB1bmxlc3MgeW91IGluc3RhbGwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgbGlicmFyaWVzIHRvby4NCisgICAgICBUZXh0PQ0KKyAgICAgIFRleHQ9Q2xpY2sgWWVzIGlmIHRoYXQncyByZWFsbHkgd2hhdCB5b3Ugd2FudC4NCisgICAgICBGbGFncz0wMDEwMTEwMQ0KKyAgICBlbmQNCisgICAgaXRlbTogUmVtYXJrDQorICAgICAgVGV4dD1Ob3RoaW5nIC0tIGp1c3QgcHJvY2VlZCB0byB0aGUgbmV4dCBkaWFsb2cuDQorICAgIGVuZA0KKyAgICBpdGVtOiBFbHNlIFN0YXRlbWVudA0KKyAgICBlbmQNCisgICAgaXRlbTogUmVtYXJrDQorICAgICAgVGV4dD1SZXR1cm4gdG8gdGhlIGRpYWxvZy4NCisgICAgZW5kDQorICAgIGl0ZW06IFNldCBWYXJpYWJsZQ0KKyAgICAgIFZhcmlhYmxlPURMR19FVkVOVF9UWVBFDQorICAgIGVuZA0KKyAgICBpdGVtOiBFbmQgQmxvY2sNCisgICAgZW5kDQorICAgIGl0ZW06IEVuZCBCbG9jaw0KKyAgICBlbmQNCisgICAgaXRlbTogRW5kIEJsb2NrDQorICAgIGVuZA0KKyAgICBpdGVtOiBFbmQgQmxvY2sNCisgICAgZW5kDQorICBlbmQNCisgIGl0ZW06IERpYWxvZw0KKyAgICBUaXRsZT1BZHZhbmNlZCBPcHRpb25zDQorICAgIFdpZHRoPTMzOQ0KKyAgICBIZWlnaHQ9MjEzDQorICAgIEZvbnQgTmFtZT1IZWx2DQorICAgIEZvbnQgU2l6ZT04DQorICAgIGl0ZW06IFJhZGlvIEJ1dHRvbg0KKyAgICAgIENvbnRyb2wgTmFtZT1BRE1JTjINCisgICAgICBSZWN0YW5nbGU9MTEgNDYgOTAgNzYNCisgICAgICBWYXJpYWJsZT1TRUxFQ1RfQURNSU4NCisgICAgICBFbmFibGVkIENvbG9yPTAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTExDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAxDQorICAgICAgVGV4dD1BZG1pbiBpbnN0YWxsDQorICAgICAgVGV4dD1Ob24tQWRtaW4gaW5zdGFsbGwNCisgICAgICBUZXh0PQ0KKyAgICBlbmQNCisgICAgaXRlbTogUHVzaCBCdXR0b24NCisgICAgICBSZWN0YW5nbGU9MTg4IDE3MCAyNDQgMTg5DQorICAgICAgVmFyaWFibGU9RElSRUNUSU9ODQorICAgICAgVmFsdWU9Tg0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMQ0KKyAgICAgIFRleHQ9T0sNCisgICAgICBUZXh0IEZyZW5jaD0mU3VpdGUgPg0KKyAgICAgIFRleHQgR2VybWFuPSZXZWl0ZXIgPg0KKyAgICAgIFRleHQgU3BhbmlzaD0mU2lndWllbnRlID4NCisgICAgICBUZXh0IEl0YWxpYW49JkF2YW50aSA+DQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9NSAzIDMyNiA4Mw0KKyAgICAgIEFjdGlvbj0xDQorICAgICAgRW5hYmxlZCBDb2xvcj0wMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExMQ0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgQ29udHJvbCBOYW1lPUFETUlOMQ0KKyAgICAgIFJlY3RhbmdsZT0xMSAxMSAzMjEgNDUNCisgICAgICBFbmFibGVkIENvbG9yPTAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTExDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD1CeSBkZWZhdWx0LCB0aGUgaW5zdGFsbCByZWNvcmRzIHNldHRpbmdzIGluIHRoZSBwZXItbWFjaGluZSBhcmVhIG9mIHRoZSByZWdpc3RyeSAoSEtMTSksIGFuZCBpbnN0YWxscyB0aGUgUHl0aG9uIGFuZCBDIHJ1bnRpbWUgRExMcyB0byAlU1lTMzIlLiAgQ2hvb3NlICJOb24tQWRtaW4gaW5zdGFsbCIgaWYgeW91IHdvdWxkIHByZWZlciBzZXR0aW5ncyBtYWRlIGluIHRoZSBwZXItdXNlciByZWdpc3RyeSAoSEtDVSksIGFuZCBETExzIGluc3RhbGxlZCBpbiAlTUFJTkRJUiUuDQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9NSA5MCAzMjYgMTU3DQorICAgICAgQWN0aW9uPTENCisgICAgICBFbmFibGVkIENvbG9yPTAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTExDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExDQorICAgIGVuZA0KKyAgICBpdGVtOiBDaGVja2JveA0KKyAgICAgIFJlY3RhbmdsZT0xMSAxMjEgMjQzIDE1MQ0KKyAgICAgIFZhcmlhYmxlPVRBU0tTDQorICAgICAgRW5hYmxlZCBDb2xvcj0wMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExMQ0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMQ0KKyAgICAgIFRleHQ9UmVnaXN0ZXIgZmlsZSBleHRlbnNpb25zICgucHksIC5weXcsIC5weWMsIC5weW8pDQorICAgICAgVGV4dD1DcmVhdGUgU3RhcnQgTWVudSBzaG9ydGN1dHMNCisgICAgICBUZXh0PQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTExIDEwMyAzMjAgMTIxDQorICAgICAgRW5hYmxlZCBDb2xvcj0wMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExMQ0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA0KKyAgICAgIFRleHQ9Q2hvb3NlIHRhc2tzIHRvIHBlcmZvcm0gYnkgY2hlY2tpbmcgdGhlIGJveGVzIGJlbG93Lg0KKyAgICBlbmQNCisgICAgaXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICAgICAgVmFyaWFibGU9RExHX0VWRU5UX1RZUEUNCisgICAgICBWYWx1ZT1JTklUDQorICAgIGVuZA0KKyAgICBpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgICAgICBWYXJpYWJsZT1ET0FETUlODQorICAgICAgVmFsdWU9MQ0KKyAgICBlbmQNCisgICAgaXRlbTogU2V0IENvbnRyb2wgQXR0cmlidXRlDQorICAgICAgQ29udHJvbCBOYW1lPUFETUlOMg0KKyAgICBlbmQNCisgICAgaXRlbTogRWxzZSBTdGF0ZW1lbnQNCisgICAgZW5kDQorICAgIGl0ZW06IFNldCBDb250cm9sIFRleHQNCisgICAgICBDb250cm9sIE5hbWU9QURNSU4xDQorICAgICAgQ29udHJvbCBUZXh0PVRoaXMgc2VjdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiBsb2dnZWQgaW4gdG8gYW4gYWNjb3VudCB3aXRoIEFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcy4NCisgICAgZW5kDQorICAgIGl0ZW06IFNldCBDb250cm9sIEF0dHJpYnV0ZQ0KKyAgICAgIENvbnRyb2wgTmFtZT1BRE1JTjINCisgICAgICBPcGVyYXRpb249MQ0KKyAgICBlbmQNCisgICAgaXRlbTogRW5kIEJsb2NrDQorICAgIGVuZA0KKyAgICBpdGVtOiBFbmQgQmxvY2sNCisgICAgZW5kDQorICBlbmQNCitlbmQNCitpdGVtOiBDdXN0b20gRGlhbG9nIFNldA0KKyAgTmFtZT1TZWxlY3QgUHJvZ3JhbSBNYW5hZ2VyIEdyb3VwDQorICBEaXNwbGF5IFZhcmlhYmxlPURJU1BMQVkNCisgIGl0ZW06IERpYWxvZw0KKyAgICBUaXRsZT0lQVBQVElUTEUlIEluc3RhbGxhdGlvbg0KKyAgICBUaXRsZSBGcmVuY2g9SW5zdGFsbGF0aW9uIGRlICVBUFBUSVRMRSUNCisgICAgVGl0bGUgR2VybWFuPUluc3RhbGxhdGlvbiB2b24gJUFQUFRJVExFJQ0KKyAgICBUaXRsZSBTcGFuaXNoPUluc3RhbGFjafNuIGRlICVBUFBUSVRMRSUNCisgICAgVGl0bGUgSXRhbGlhbj1JbnN0YWxsYXppb25lIGRpICVBUFBUSVRMRSUNCisgICAgV2lkdGg9MzM5DQorICAgIEhlaWdodD0yODANCisgICAgRm9udCBOYW1lPUhlbHYNCisgICAgRm9udCBTaXplPTgNCisgICAgaXRlbTogUHVzaCBCdXR0b24NCisgICAgICBSZWN0YW5nbGU9MTg4IDIzNCAyNDQgMjUzDQorICAgICAgVmFyaWFibGU9RElSRUNUSU9ODQorICAgICAgVmFsdWU9Tg0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMQ0KKyAgICAgIFRleHQ9Jk5leHQgPg0KKyAgICAgIFRleHQgRnJlbmNoPSZTdWl0ZSA+DQorICAgICAgVGV4dCBHZXJtYW49JldlaXRlciA+DQorICAgICAgVGV4dCBTcGFuaXNoPSZTaWd1aWVudGUgPg0KKyAgICAgIFRleHQgSXRhbGlhbj0mQXZhbnRpID4NCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTEzMSAyMzQgMTg4IDI1Mw0KKyAgICAgIFZhcmlhYmxlPURJUkVDVElPTg0KKyAgICAgIFZhbHVlPUINCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDANCisgICAgICBGbGFncz0wMDAwMDAwMDAwMDAwMDAxDQorICAgICAgVGV4dD08ICZCYWNrDQorICAgICAgVGV4dCBGcmVuY2g9PCAmUmV0b3VyDQorICAgICAgVGV4dCBHZXJtYW49PCAmWnVy/GNrDQorICAgICAgVGV4dCBTcGFuaXNoPTwgJkF0cuFzDQorICAgICAgVGV4dCBJdGFsaWFuPTwgJkluZGlldHJvDQorICAgIGVuZA0KKyAgICBpdGVtOiBQdXNoIEJ1dHRvbg0KKyAgICAgIFJlY3RhbmdsZT0yNjQgMjM0IDMyMCAyNTMNCisgICAgICBBY3Rpb249Mw0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMA0KKyAgICAgIFRleHQ9JkNhbmNlbA0KKyAgICAgIFRleHQgRnJlbmNoPSZBbm51bGVyDQorICAgICAgVGV4dCBHZXJtYW49JkFiYnJlY2hlbg0KKyAgICAgIFRleHQgU3BhbmlzaD0mQ2FuY2VsYXINCisgICAgICBUZXh0IEl0YWxpYW49JkFubnVsbGENCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMCAyMjUgMzIwIDIyNg0KKyAgICAgIEFjdGlvbj0zDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExDQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9MTA4IDEwIDMyMyA1Mw0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA0KKyAgICAgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMDENCisgICAgICBOYW1lPVRpbWVzIE5ldyBSb21hbg0KKyAgICAgIEZvbnQgU3R5bGU9LTI0IDAgMCAwIDcwMCAyNTUgMCAwIDAgMyAyIDEgMTgNCisgICAgICBUZXh0PVNlbGVjdCBTdGFydCBNZW51IEdyb3VwDQorICAgICAgVGV4dCBGcmVuY2g9U+lsZWN0aW9ubmVyIGxlIGdyb3VwZSBkdSBHZXN0aW9ubmFpcmUgZGUgcHJvZ3JhbW1lDQorICAgICAgVGV4dCBHZXJtYW49QmVzdGltbXVuZyBkZXIgUHJvZ3JhbW0tTWFuYWdlcmdydXBwZQ0KKyAgICAgIFRleHQgU3BhbmlzaD1TZWxlY2Npb25lIGdydXBvIGRlbCBBZG1pbmlzdHJhZG9yIGRlIHByb2dyYW1hcw0KKyAgICAgIFRleHQgSXRhbGlhbj1TZWxlemlvbmFyZSBpbCBncnVwcG8gUHJvZ01hbg0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwOCAzNSAzMjAgNjUNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PUVudGVyIHRoZSBuYW1lIG9mIHRoZSBTdGFydCBNZW51IHByb2dyYW0gZ3JvdXAgdG8gd2hpY2ggdG8gYWRkIHRoZSAlQVBQVElUTEUlIGljb25zOg0KKyAgICAgIFRleHQgRnJlbmNoPUVudHJleiBsZSBub20gZHUgZ3JvdXBlIGR1IEdlc3Rpb25uYWlyZSBkZSBwcm9ncmFtbWUgZGFucyBsZXF1ZWwgdm91cyBzb3VoYWl0ZXogYWpvdXRlciBsZXMgaWP0bmVzIGRlICVBUFBUSVRMRSUgOg0KKyAgICAgIFRleHQgR2VybWFuPUdlYmVuIFNpZSBkZW4gTmFtZW4gZGVyIFByb2dyYW1tZ3J1cHBlIGVpbiwgZGVyIGRhcyBTeW1ib2wgJUFQUFRJVExFJSBoaW56dWdlZvxndCB3ZXJkZW4gc29sbDoNCisgICAgICBUZXh0IFNwYW5pc2g9RXNjcmliYSBlbCBub21icmUgZGVsIGdydXBvIGRlbCBBZG1pbmlzdHJhZG9yIGRlIHByb2dyYW1hcyBlbiBlbCBxdWUgZGVzZWEgYWdyZWdhciBsb3MgaWNvbm9zIGRlICVBUFBUSVRMRSU6DQorICAgICAgVGV4dCBJdGFsaWFuPUluc2VyaXJlIGlsIG5vbWUgZGVsIGdydXBwbyBQcm9ncmFtIE1hbmFnZXIgcGVyIGFnZ2l1bmdlcmUgbGUgaWNvbmUgJUFQUFRJVExFJSBhOg0KKyAgICBlbmQNCisgICAgaXRlbTogQ29tYm9ib3gNCisgICAgICBSZWN0YW5nbGU9MTA4IDU2IDMyMCAyMTkNCisgICAgICBWYXJpYWJsZT1HUk9VUA0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMTAwMDAxMDAwMDAwMTEwMDAwMDAwMQ0KKyAgICAgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMDENCisgICAgICBUZXh0PSVHUk9VUCUNCisgICAgICBUZXh0PQ0KKyAgICAgIFRleHQgRnJlbmNoPSVHUk9VUCUNCisgICAgICBUZXh0IEdlcm1hbj0lR1JPVVAlDQorICAgICAgVGV4dCBTcGFuaXNoPSVHUk9VUCUNCisgICAgICBUZXh0IEl0YWxpYW49JUdST1VQJQ0KKyAgICBlbmQNCisgIGVuZA0KK2VuZA0KK2l0ZW06IEN1c3RvbSBEaWFsb2cgU2V0DQorICBOYW1lPVN0YXJ0IEluc3RhbGxhdGlvbg0KKyAgRGlzcGxheSBWYXJpYWJsZT1ESVNQTEFZDQorICBpdGVtOiBEaWFsb2cNCisgICAgVGl0bGU9JUFQUFRJVExFJSBJbnN0YWxsYXRpb24NCisgICAgVGl0bGUgRnJlbmNoPUluc3RhbGxhdGlvbiBkZSAlQVBQVElUTEUlDQorICAgIFRpdGxlIEdlcm1hbj1JbnN0YWxsYXRpb24gdm9uICVBUFBUSVRMRSUNCisgICAgVGl0bGUgU3BhbmlzaD1JbnN0YWxhY2nzbiBkZSAlQVBQVElUTEUlDQorICAgIFRpdGxlIEl0YWxpYW49SW5zdGFsbGF6aW9uZSBkaSAlQVBQVElUTEUlDQorICAgIFdpZHRoPTMzOQ0KKyAgICBIZWlnaHQ9MjgwDQorICAgIEZvbnQgTmFtZT1IZWx2DQorICAgIEZvbnQgU2l6ZT04DQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTE4OCAyMzQgMjQ0IDI1Mw0KKyAgICAgIFZhcmlhYmxlPURJUkVDVElPTg0KKyAgICAgIFZhbHVlPU4NCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDENCisgICAgICBUZXh0PSZOZXh0ID4NCisgICAgICBUZXh0IEZyZW5jaD0mU3VpdGUgPg0KKyAgICAgIFRleHQgR2VybWFuPSZXZWl0ZXIgPg0KKyAgICAgIFRleHQgU3BhbmlzaD0mU2lndWllbnRlID4NCisgICAgICBUZXh0IEl0YWxpYW49JkF2YW50aSA+DQorICAgIGVuZA0KKyAgICBpdGVtOiBQdXNoIEJ1dHRvbg0KKyAgICAgIFJlY3RhbmdsZT0xMzEgMjM0IDE4OCAyNTMNCisgICAgICBWYXJpYWJsZT1ESVJFQ1RJT04NCisgICAgICBWYWx1ZT1CDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD08ICZCYWNrDQorICAgICAgVGV4dCBGcmVuY2g9PCAmUmV0b3VyDQorICAgICAgVGV4dCBHZXJtYW49PCAmWnVy/GNrDQorICAgICAgVGV4dCBTcGFuaXNoPTwgJkF0cuFzDQorICAgICAgVGV4dCBJdGFsaWFuPTwgJkluZGlldHJvDQorICAgIGVuZA0KKyAgICBpdGVtOiBQdXNoIEJ1dHRvbg0KKyAgICAgIFJlY3RhbmdsZT0yNjQgMjM0IDMyMCAyNTMNCisgICAgICBBY3Rpb249Mw0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMA0KKyAgICAgIFRleHQ9JkNhbmNlbA0KKyAgICAgIFRleHQgRnJlbmNoPSZBbm51bGVyDQorICAgICAgVGV4dCBHZXJtYW49JkFiYnJlY2hlbg0KKyAgICAgIFRleHQgU3BhbmlzaD0mQ2FuY2VsYXINCisgICAgICBUZXh0IEl0YWxpYW49JkFubnVsbGENCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMCAyMjUgMzIwIDIyNg0KKyAgICAgIEFjdGlvbj0zDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTExDQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9MTA4IDEwIDMyMyA1Mw0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA0KKyAgICAgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMDENCisgICAgICBOYW1lPVRpbWVzIE5ldyBSb21hbg0KKyAgICAgIEZvbnQgU3R5bGU9LTI0IDAgMCAwIDcwMCAyNTUgMCAwIDAgMyAyIDEgMTgNCisgICAgICBUZXh0PVJlYWR5IHRvIEluc3RhbGwhDQorICAgICAgVGV4dCBGcmVuY2g9UHLqdCDgIGluc3RhbGxlciAhDQorICAgICAgVGV4dCBHZXJtYW49SW5zdGFsbGF0aW9uc2JlcmVpdCENCisgICAgICBUZXh0IFNwYW5pc2g9oVByZXBhcmFkbyBwYXJhIGxhIGluc3RhbGFjafNuIQ0KKyAgICAgIFRleHQgSXRhbGlhbj1Qcm9udG8gcGVyIGwnaW5zdGFsbGF6aW9uZSENCisgICAgZW5kDQorICAgIGl0ZW06IFN0YXRpYw0KKyAgICAgIFJlY3RhbmdsZT0xMDggNDAgMzIwIDYyDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD1DbGljayB0aGUgTmV4dCBidXR0b24gdG8gaW5zdGFsbCAlQVBQVElUTEUlLCBvciB0aGUgQmFjayBidXR0b24gdG8gY2hhbmdlIGNob2ljZXM6DQorICAgICAgVGV4dCBGcmVuY2g9Vm91cyDqdGVzIG1haW50ZW5hbnQgcHLqdCDgIGluc3RhbGxlciBsZXMgZmljaGllcnMgJUFQUFRJVExFJS4NCisgICAgICBUZXh0IEZyZW5jaD0NCisgICAgICBUZXh0IEZyZW5jaD1DbGlxdWV6IHN1ciBsZSBib3V0b24gU3VpdGUgcG91ciBjb21tZW5jZXIgbCdpbnN0YWxsYXRpb24gb3Ugc3VyIGxlIGJvdXRvbiBSZXRvdXIgcG91ciBlbnRyZXIgbGVzIGluZm9ybWF0aW9ucyBkJ2luc3RhbGxhdGlvbiDgIG5vdXZlYXUuDQorICAgICAgVGV4dCBHZXJtYW49U2llIGv2bm5lbiAlQVBQVElUTEUlIG51biBpbnN0YWxsaWVyZW4uDQorICAgICAgVGV4dCBHZXJtYW49DQorICAgICAgVGV4dCBHZXJtYW49S2xpY2tlbiBTaWUgYXVmICJXZWl0ZXIiLCB1bSBtaXQgZGVyIEluc3RhbGxhdGlvbiB6dSBiZWdpbm5lbi4gS2xpY2tlbiBTaWUgYXVmICJadXL8Y2siLCB1bSBkaWUgSW5zdGFsbGF0aW9uc2luZm9ybWF0aW9uZW4gbmV1IGVpbnp1Z2ViZW4uDQorICAgICAgVGV4dCBTcGFuaXNoPVlhIGVzdOEgbGlzdG8gcGFyYSBpbnN0YWxhciAlQVBQVElUTEUlLg0KKyAgICAgIFRleHQgU3BhbmlzaD0NCisgICAgICBUZXh0IFNwYW5pc2g9UHJlc2lvbmUgZWwgYm90824gU2lndWllbnRlIHBhcmEgY29tZW56YXIgbGEgaW5zdGFsYWNp824gbyBwcmVzaW9uZSBBdHLhcyBwYXJhIHZvbHZlciBhIGluZ3Jlc2FyIGxhIGluZm9ybWFjafNuIHBhcmEgbGEgaW5zdGFsYWNp824uDQorICAgICAgVGV4dCBJdGFsaWFuPU9yYSDoIHBvc3NpYmlsZSBpbnN0YWxsYXJlICVBUFBUSVRMRSUuDQorICAgICAgVGV4dCBJdGFsaWFuPQ0KKyAgICAgIFRleHQgSXRhbGlhbj1QcmVtZXJlIGlsIHB1bHNhbnRlIEF2YW50aSBwZXIgYXZ2aWFyZSBsJ2luc3RhbGxhemlvbmUgbyBpbCBwdWxzYW50ZSBJbmRpZXRybyBwZXIgcmVpbnNlcmlyZSBsZSBpbmZvcm1hemlvbmkgZGkgaW5zdGFsbGF6aW9uZS4NCisgICAgZW5kDQorICAgIGl0ZW06IEVkaXRib3gNCisgICAgICBSZWN0YW5nbGU9MTA4IDY2IDMyNCAyMTkNCisgICAgICBIZWxwIENvbnRleHQ9MTY3MTE2ODENCisgICAgICBFbmFibGVkIENvbG9yPTAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTExDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMTAwMDAwMDAwMDAxMTAwMDExMDAwMTAwDQorICAgICAgVGV4dD0lU1VNTUFSWSUNCisgICAgZW5kDQorICBlbmQNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPURJU1BMQVkNCisgIFZhbHVlPVNlbGVjdCBEZXN0aW5hdGlvbiBEaXJlY3RvcnkNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VXNlciBtYXkgaGF2ZSBjaGFuZ2VkIE1BSU5ESVIsIHNvIHJlc2V0IEJBQ0tVUCB0byBtYXRjaC4NCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPUJBQ0tVUA0KKyAgVmFsdWU9JU1BSU5ESVIlXEJBQ0tVUA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1CRUdJTiBXSVpBUkQgU1RVRkYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9V2hlbiB0aGUgQkFDS1VQIGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlIEJBQ0tVUERJUiBpcyBpbml0aWFsaXplZA0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9RE9CQUNLVVANCisgIFZhbHVlPUENCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPUJBQ0tVUERJUg0KKyAgVmFsdWU9JUJBQ0tVUCUNCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VGhlIEJSQU5ESU5HIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gdG8gdGhlIElOSSBmaWxlIG9uIHRoZSBpbnN0YWxsYXRpb24gbWVkaWEuDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1CUkFORElORw0KKyAgVmFsdWU9MQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9RE9CUkFORA0KKyAgVmFsdWU9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgSU5JIEZpbGUNCisgIFBhdGhuYW1lPSVJTlNUJVxDVVNUREFUQS5JTkkNCisgIFNldHRpbmdzPVtSZWdpc3RyYXRpb25dDQorICBTZXR0aW5ncz1OQU1FPSVOQU1FJQ0KKyAgU2V0dGluZ3M9Q09NUEFOWT0lQ09NUEFOWSUNCisgIFNldHRpbmdzPQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1CZWdpbiB3cml0aW5nIHRvIHRoZSBJTlNUQUxMLkxPRw0KK2VuZA0KK2l0ZW06IE9wZW4vQ2xvc2UgSU5TVEFMTC5MT0cNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9Q2hlY2sgZnJlZSBkaXNrIHNwYWNlIGNhbGN1bGF0ZXMgZnJlZSBkaXNrIHNwYWNlIGFzIHdlbGwgYXMgY29tcG9uZW50IHNpemVzLg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1JdCBzaG91bGQgYmUgbG9jYXRlZCBiZWZvcmUgYWxsIEluc3RhbGwgRmlsZSBhY3Rpb25zLg0KK2VuZA0KK2l0ZW06IENoZWNrIERpc2sgU3BhY2UNCisgIENvbXBvbmVudD1DT01QT05FTlRTDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVRoaXMgaW5jbHVkZSBzY3JpcHQgYWxsb3dzIHVuaW5zdGFsbCBzdXBwb3J0DQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PU5vdGUgZnJvbSBUaW06ICB0aGlzIGlzIG91ciBvd24gVW5pbnN0YWwud3NlLCBhIGNvcHkgb2YgV2lzZSdzIGV4Y2VwdA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1pdCB3cml0ZXMgdG8gSEtDVSAoaW5zdGVhZCBvZiBIS0xNKSBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgYWRtaW4gcHJpdnMuDQorZW5kDQoraXRlbTogSW5jbHVkZSBTY3JpcHQNCisgIFBhdGhuYW1lPS5cVW5pbnN0YWwud3NlDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PU5vdGUgZnJvbSBUaW06IHRoZXNlIHNlZW1pbmcgbm8tb3BzIGFjdHVhbGx5IGNvbnZlcnQgdG8gc2hvcnQgZmlsZW5hbWVzLg0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9Q09NTU9ODQorICBWYWx1ZT0lQ09NTU9OJQ0KKyAgRmxhZ3M9MDAwMTAxMDANCitlbmQNCitpdGVtOiBTZXQgVmFyaWFibGUNCisgIFZhcmlhYmxlPU1BSU5ESVINCisgIFZhbHVlPSVNQUlORElSJQ0KKyAgRmxhZ3M9MDAwMTAxMDANCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VGhpcyBJRi9USEVOL0VMU0UgcmVhZHMgdGhlIGNvcnJlY3QgcmVnaXN0cnkgZW50cmllcyBmb3Igc2hvcnRjdXQvaWNvbiBwbGFjZW1lbnQNCitlbmQNCitpdGVtOiBDaGVjayBDb25maWd1cmF0aW9uDQorICBGbGFncz0xMDExMTAxMQ0KK2VuZA0KK2l0ZW06IEdldCBSZWdpc3RyeSBLZXkgVmFsdWUNCisgIFZhcmlhYmxlPVNUQVJUVVBESVINCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzDQorICBEZWZhdWx0PSVXSU4lXFN0YXJ0IE1lbnVcUHJvZ3JhbXNcU3RhcnRVcA0KKyAgVmFsdWUgTmFtZT1TdGFydFVwDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEdldCBSZWdpc3RyeSBLZXkgVmFsdWUNCisgIFZhcmlhYmxlPURFU0tUT1BESVINCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzDQorICBEZWZhdWx0PSVXSU4lXERlc2t0b3ANCisgIFZhbHVlIE5hbWU9RGVza3RvcA0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBHZXQgUmVnaXN0cnkgS2V5IFZhbHVlDQorICBWYXJpYWJsZT1TVEFSVE1FTlVESVINCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzDQorICBEZWZhdWx0PSVXSU4lXFN0YXJ0IE1lbnUNCisgIFZhbHVlIE5hbWU9U3RhcnQgTWVudQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBHZXQgUmVnaXN0cnkgS2V5IFZhbHVlDQorICBWYXJpYWJsZT1HUk9VUERJUg0KKyAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMNCisgIERlZmF1bHQ9JVdJTiVcU3RhcnQgTWVudVxQcm9ncmFtcw0KKyAgVmFsdWUgTmFtZT1Qcm9ncmFtcw0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBHZXQgUmVnaXN0cnkgS2V5IFZhbHVlDQorICBWYXJpYWJsZT1DU1RBUlRVUERJUg0KKyAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMNCisgIERlZmF1bHQ9JVNUQVJUVVBESVIlDQorICBWYWx1ZSBOYW1lPUNvbW1vbiBTdGFydHVwDQorICBGbGFncz0wMDAwMDEwMA0KK2VuZA0KK2l0ZW06IEdldCBSZWdpc3RyeSBLZXkgVmFsdWUNCisgIFZhcmlhYmxlPUNERVNLVE9QRElSDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycw0KKyAgRGVmYXVsdD0lREVTS1RPUERJUiUNCisgIFZhbHVlIE5hbWU9Q29tbW9uIERlc2t0b3ANCisgIEZsYWdzPTAwMDAwMTAwDQorZW5kDQoraXRlbTogR2V0IFJlZ2lzdHJ5IEtleSBWYWx1ZQ0KKyAgVmFyaWFibGU9Q1NUQVJUTUVOVURJUg0KKyAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMNCisgIERlZmF1bHQ9JVNUQVJUTUVOVURJUiUNCisgIFZhbHVlIE5hbWU9Q29tbW9uIFN0YXJ0IE1lbnUNCisgIEZsYWdzPTAwMDAwMTAwDQorZW5kDQoraXRlbTogR2V0IFJlZ2lzdHJ5IEtleSBWYWx1ZQ0KKyAgVmFyaWFibGU9Q0dST1VQRElSDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cRXhwbG9yZXJcU2hlbGwgRm9sZGVycw0KKyAgRGVmYXVsdD0lR1JPVVBESVIlDQorICBWYWx1ZSBOYW1lPUNvbW1vbiBQcm9ncmFtcw0KKyAgRmxhZ3M9MDAwMDAxMDANCitlbmQNCitpdGVtOiBFbHNlIFN0YXRlbWVudA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1Ob3RlIGZyb20gVGltOiAgdGhlIFdpemFyZCBsZWZ0IHRoaXMgYmxvY2sgZW1wdHkhDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVBlcmhhcHMgaXQncyBvbmx5IHJlbGV2YW50IG9uIFdpbmRvd3MgMy4xLg0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1FTkQgV0laQVJEIFNUVUZGIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1TRUxFQ1RfQURNSU4NCisgIFZhbHVlPUINCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VGhlIHVzZXIgY2hvc2UgYSBub24tYWRtaW4gaW5zdGFsbCBpbiAiQWR2YW5jZWQgT3B0aW9ucyIuDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVRoaXMgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlIGluY2x1ZGUgb2YgVW5pbnN0YWwud3NlIGFib3ZlLCBiZWNhdXNlDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PXdyaXRpbmcgdW5pbnN0YWxsIGluZm8gdG8gSEtDVSBpcyBpbmVmZmVjdGl2ZSBleGNlcHQgdW5kZXIgV2luMksuDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1ET0FETUlODQorICBWYWx1ZT0wDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1DR1JPVVBfU0FWRQ0KKyAgVmFsdWU9JUdST1VQJQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9VEFTS1MNCisgIFZhbHVlPUINCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1ET0FETUlODQorICBWYWx1ZT0xDQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1HUk9VUA0KKyAgVmFsdWU9JUNHUk9VUERJUiVcJUdST1VQJQ0KK2VuZA0KK2l0ZW06IEVsc2UgU3RhdGVtZW50DQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1HUk9VUA0KKyAgVmFsdWU9JUdST1VQRElSJVwlR1JPVVAlDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUxvbmcgc2VjdGlvbiB0byBpbnN0YWxsIGZpbGVzLg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9RE9BRE1JTg0KKyAgVmFsdWU9MQ0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9RExMREVTVA0KKyAgVmFsdWU9JVNZUzMyJQ0KK2VuZA0KK2l0ZW06IEVsc2UgU3RhdGVtZW50DQorZW5kDQoraXRlbTogU2V0IFZhcmlhYmxlDQorICBWYXJpYWJsZT1ETExERVNUDQorICBWYWx1ZT0lTUFJTkRJUiUNCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9SW5zdGFsbCB0aGUgbGljZW5zZSBldmVuIGlmIHRoZXkgZGVzZWxlY3QgZXZlcnl0aGluZyA8d2luaz4uDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGljZW5zZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExJQ0VOU0UudHh0DQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5ccmVhZG1lDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcUkVBRE1FLnR4dA0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXG1pc2NcbmV3cw0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXE5FV1MudHh0DQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUljb25zIC0tIGFsd2F5cyBpbnN0YWxsIHNvIHRoYXQgdGhlIHVuaW5zdGFsbGVyIGNhbiB1c2UgdGhlbSBmb3IgaXRzIG93biBkaXNwbGF5Lg0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXHBjXHB5Y29uLmljbw0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXHB5Y29uLmljbw0KKyAgRmxhZ3M9MDAwMDAwMDAxMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXHBjXHB5Yy5pY28NCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxweWMuaWNvDQorICBGbGFncz0wMDAwMDAwMDEwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5ccGNccHkuaWNvDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVccHkuaWNvDQorICBGbGFncz0wMDAwMDAwMDEwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVRoZXNlIGFycmFuZ2UgdG8gKHJlY3Vyc2l2ZWx5ISkgZGVsZXRlIGFsbCAucHljIGFuZCAucHlvIGZpbGVzIGF0IHVuaW5zdGFsbCB0aW1lLg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1UaGlzICJkb2VzIHRoZSByaWdodCB0aGluZyI6ICBhbnkgZGlyZWN0b3JpZXMgbGVmdCBlbXB0eSBhdCB0aGUgZW5kIGFyZSByZW1vdmVkLg0KK2VuZA0KK2l0ZW06IEFkZCBUZXh0IHRvIElOU1RBTEwuTE9HDQorICBUZXh0PUZpbGUgVHJlZTogJU1BSU5ESVIlXCoucHljDQorZW5kDQoraXRlbTogQWRkIFRleHQgdG8gSU5TVEFMTC5MT0cNCisgIFRleHQ9RmlsZSBUcmVlOiAlTUFJTkRJUiVcKi5weW8NCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9QTogaW50ZXJwcmV0ZXIgYW5kIGxpYnJhcmllcw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9Q09NUE9ORU5UUw0KKyAgVmFsdWU9QQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9RXhlY3V0YWJsZXMNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXHB5dGhvbi5leGUNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxweXRob24uZXhlDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9LlxweXRob253LmV4ZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXHB5dGhvbncuZXhlDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Llx3OXhwb3Blbi5leGUNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVx3OXhwb3Blbi5leGUNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9RXh0ZW5zaW9uIG1vZHVsZSBETExzICgucHlkKTsga2VlcCBpbiBzeW5jaCB3aXRoIGxpYnMgZGlyZWN0b3J5IG5leHQNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF93aW5yZWcucHlkDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcRExMc1xfd2lucmVnLnB5ZA0KKyAgRGVzY3JpcHRpb249RXh0ZW5zaW9uIG1vZHVsZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF9jc3YucHlkDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcRExMc1xfY3N2LnB5ZA0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cX3NyZS5weWQNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxETExzXF9zcmUucHlkDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Llxfc3NsLnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcX3NzbC5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF9zeW10YWJsZS5weWQNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxETExzXF9zeW10YWJsZS5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF90ZXN0Y2FwaS5weWQNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxETExzXF90ZXN0Y2FwaS5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF90a2ludGVyLnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcX3RraW50ZXIucHlkDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Llxfc29ja2V0LnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcX3NvY2tldC5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF9ic2RkYi5weWQNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxETExzXF9ic2RkYi5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXGJ6Mi5weWQNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxETExzXGJ6Mi5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXGRhdGV0aW1lLnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcZGF0ZXRpbWUucHlkDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9LlxtbWFwLnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcbW1hcC5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXHBhcnNlci5weWQNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxETExzXHBhcnNlci5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXHB5ZXhwYXQucHlkDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcRExMc1xweWV4cGF0LnB5ZA0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cc2VsZWN0LnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcc2VsZWN0LnB5ZA0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cdW5pY29kZWRhdGEucHlkDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcRExMc1x1bmljb2RlZGF0YS5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXHdpbnNvdW5kLnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcd2luc291bmQucHlkDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Llx6bGliLnB5ZA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXERMTHNcemxpYi5weWQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9TGluayBsaWJyYXJpZXMgKC5saWIpOyBrZWVwIGluIHN5bmNoIHdpdGggRExMcyBhYm92ZSwgZXhjZXB0IHRoYXQgdGhlIFB5dGhvbiBsaWIgbGl2ZXMgaGVyZS4NCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF93aW5yZWcubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xfd2lucmVnLmxpYg0KKyAgRGVzY3JpcHRpb249TGluayBsaWJyYXJ5IGZpbGVzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9LlxfY3N2LmxpYg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXGxpYnNcX2Nzdi5saWINCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF9zcmUubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xfc3JlLmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cX3NzbC5saWINCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxsaWJzXF9zc2wubGliDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Llxfc3ltdGFibGUubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xfc3ltdGFibGUubGliDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9LlxfdGVzdGNhcGkubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xfdGVzdGNhcGkubGliDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9LlxfdGtpbnRlci5saWINCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxsaWJzXF90a2ludGVyLmxpYg0KKyAgRGVzY3JpcHRpb249RXh0ZW5zaW9uIG1vZHVsZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXF9zb2NrZXQubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xfc29ja2V0LmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cX2JzZGRiLmxpYg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXGxpYnNcX2JzZGRiLmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cYnoyLmxpYg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXGxpYnNcYnoyLmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cZGF0ZXRpbWUubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xkYXRldGltZS5saWINCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXG1tYXAubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xtbWFwLmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5ccGFyc2VyLmxpYg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXGxpYnNccGFyc2VyLmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5ccHlleHBhdC5saWINCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxsaWJzXHB5ZXhwYXQubGliDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9LlxzZWxlY3QubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1xzZWxlY3QubGliDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Llx1bmljb2RlZGF0YS5saWINCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxsaWJzXHVuaWNvZGVkYXRhLmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5cd2luc291bmQubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1x3aW5zb3VuZC5saWINCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uXHpsaWIubGliDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcbGlic1x6bGliLmxpYg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS5ccHl0aG9uJV9weW1ham9yXyUlX3B5bWlub3JfJS5saWINCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxsaWJzXHB5dGhvbiVfUFlNQUpPUl8lJV9QWU1JTk9SXyUubGliDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PU1haW4gUHl0aG9uIERMTA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1UZWxsIFdpc2UgaXQncyBPSyB0byBkZWxldGUgdGhlIFB5dGhvbiBETEwgYXQgdW5pbnN0YWxsIHRpbWUsDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PWRlc3BpdGUgdGhhdCB3ZSAobWF5KSB3cml0ZSBpdCBpbnRvIGEgc3lzdGVtIGRpcmVjdG9yeS4NCitlbmQNCitpdGVtOiBBZGQgVGV4dCB0byBJTlNUQUxMLkxPRw0KKyAgVGV4dD1Ob24tU3lzdGVtIEZpbGU6DQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9LlxweXRob24lX3B5bWFqb3JfJSVfcHltaW5vcl8lLmRsbA0KKyAgRGVzdGluYXRpb249JURMTERFU1QlXHB5dGhvbiVfUFlNQUpPUl8lJV9QWU1JTk9SXyUuZGxsDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUxpYnJhcmllcyAoTGliLykNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYg0KKyAgRGVzY3JpcHRpb249TGlicmFyeSBNb2R1bGVzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXGJzZGRiXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcYnNkZGINCisgIERlc2NyaXB0aW9uPUJlcmtlbGV5IGRhdGFiYXNlIHBhY2thZ2UNCisgIEZsYWdzPTAwMDAwMDAxMDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcY29tcGlsZXJcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxjb21waWxlcg0KKyAgRGVzY3JpcHRpb249UHl0aG9uIGNvbXBpbGVyIHdyaXR0ZW4gaW4gUHl0aG9uDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXGRpc3R1dGlsc1wqLnB5DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcTGliXGRpc3R1dGlscw0KKyAgRGVzY3JpcHRpb249RGlzdHJpYnV0aW9uIHV0aWxpdHkgbW9kdWxlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlxkaXN0dXRpbHNccmVhZG1lDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcTGliXGRpc3R1dGlsc1xSRUFETUUudHh0DQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXGRpc3R1dGlsc1xjb21tYW5kXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcZGlzdHV0aWxzXGNvbW1hbmQNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcZGlzdHV0aWxzXGNvbW1hbmRcd2luaW5zdC5leGUNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcZGlzdHV0aWxzXGNvbW1hbmRcd2luaW5zdC5leGUNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcZGlzdHV0aWxzXGNvbW1hbmRcY29tbWFuZF90ZW1wbGF0ZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxkaXN0dXRpbHNcY29tbWFuZFxjb21tYW5kX3RlbXBsYXRlDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXGVtYWlsXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcZW1haWwNCisgIERlc2NyaXB0aW9uPUxpYnJhcnkgZW1haWwgcGFja2FnZQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlxlbWFpbFx0ZXN0XCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcZW1haWxcdGVzdA0KKyAgRGVzY3JpcHRpb249ZW1haWwgdGVzdHMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcZW1haWxcdGVzdFxkYXRhXCoudHh0DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcTGliXGVtYWlsXHRlc3RcZGF0YQ0KKyAgRGVzY3JpcHRpb249ZW1haWwgdGVzdCBkYXRhDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXGVtYWlsXHRlc3RcZGF0YVwqLmdpZg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxlbWFpbFx0ZXN0XGRhdGENCisgIERlc2NyaXB0aW9uPWVtYWlsIHRlc3QgZGF0YQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlxlbWFpbFx0ZXN0XGRhdGFcKi5hdQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxlbWFpbFx0ZXN0XGRhdGENCisgIERlc2NyaXB0aW9uPWVtYWlsIHRlc3QgZGF0YQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlxlbmNvZGluZ3NcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxlbmNvZGluZ3MNCisgIERlc2NyaXB0aW9uPVVuaWNvZGUgZW5jb2RpbmcgdGFibGVzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXGhvdHNob3RcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxob3RzaG90DQorICBEZXNjcmlwdGlvbj1GYXN0IFB5dGhvbiBwcm9maWxlcg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlxsaWItb2xkXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcbGliLW9sZA0KKyAgRGVzY3JpcHRpb249T2Jzb2xldGUgbW9kdWxlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlxsaWItdGtcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxsaWItdGsNCisgIERlc2NyaXB0aW9uPVRraW50ZXIgcmVsYXRlZCBsaWJyYXJ5IG1vZHVsZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcbG9nZ2luZ1wqLnB5DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcTGliXGxvZ2dpbmcNCisgIERlc2NyaXB0aW9uPUxvZ2dpbmcgcGFja2FnZQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlxzaXRlLXBhY2thZ2VzXHJlYWRtZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxzaXRlLXBhY2thZ2VzXFJFQURNRS50eHQNCisgIERlc2NyaXB0aW9uPVNpdGUgcGFja2FnZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJceG1sXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJceG1sDQorICBEZXNjcmlwdGlvbj1YTUwgc3VwcG9ydCBwYWNrYWdlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlx4bWxcZG9tXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJceG1sXGRvbQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlx4bWxccGFyc2Vyc1wqLnB5DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcTGliXHhtbFxwYXJzZXJzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXHhtbFxzYXhcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlx4bWxcc2F4DQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUMgSW5jbHVkZSBmaWxlcw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGluY2x1ZGVcKi5oDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcaW5jbHVkZQ0KKyAgRGVzY3JpcHRpb249SGVhZGVyIGZpbGVzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5ccGNccHljb25maWcuaA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXGluY2x1ZGVccHljb25maWcuaA0KKyAgRGVzY3JpcHRpb249SGVhZGVyIGZpbGVzIChweWNvbmZpZy5oKQ0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1NaWNyb3NvZnQgQyBydW50aW1lIGxpYnJhcmllcw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPSVfU1lTXyVcTVNWQ0lSVC5ETEwNCisgIERlc3RpbmF0aW9uPSVETExERVNUJVxNU1ZDSVJULkRMTA0KKyAgRGVzY3JpcHRpb249VmlzdWFsIEMrKyBSdW50aW1lIERMTHMNCisgIEZsYWdzPTAwMDAwMTEwMDAwMTAwMTENCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0lX1NZU18lXE1TVkNSVC5ETEwNCisgIERlc3RpbmF0aW9uPSVETExERVNUJVxNU1ZDUlQuRExMDQorICBEZXNjcmlwdGlvbj1WaXN1YWwgQysrIFJ1bnRpbWUgRExMcw0KKyAgRmxhZ3M9MDAwMDAxMTAwMDAxMDAxMQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1COiBUY2wvVGsgKFRraW50ZXIsIElETEUsIHB5ZG9jKQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9Q09NUE9ORU5UUw0KKyAgVmFsdWU9Qg0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VGNsL1RrDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cLi5cJV90Y2xkaXJfJVxiaW5cKi5kbGwNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxETExzDQorICBEZXNjcmlwdGlvbj1UY2wvVGsgYmluYXJpZXMgYW5kIGxpYnJhcmllcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXC4uXCVfdGNsZGlyXyVcbGliXCouKg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXHRjbA0KKyAgRGVzY3JpcHRpb249VGNsL1RrIGJpbmFyaWVzIGFuZCBsaWJyYXJpZXMNCisgIEZsYWdzPTAwMDAwMDAxMDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9SURMRQ0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXExpYlxpZGxlbGliXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcaWRsZWxpYg0KKyAgRGVzY3JpcHRpb249SW50ZWdyYXRlZCBEZXZlTG9wbWVudCBFbnZpcm9ubWVudCBmb3IgUHl0aG9uDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cTGliXGlkbGVsaWJcKi50eHQNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcaWRsZWxpYg0KKyAgRGVzY3JpcHRpb249SW50ZWdyYXRlZCBEZXZlTG9wbWVudCBFbnZpcm9ubWVudCBmb3IgUHl0aG9uDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cTGliXGlkbGVsaWJcKi5kZWYNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcaWRsZWxpYg0KKyAgRGVzY3JpcHRpb249SW50ZWdyYXRlZCBEZXZlTG9wbWVudCBFbnZpcm9ubWVudCBmb3IgUHl0aG9uDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cTGliXGlkbGVsaWJcSWNvbnNcKg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlxpZGxlbGliXEljb25zDQorICBEZXNjcmlwdGlvbj1JbnRlZ3JhdGVkIERldmVMb3BtZW50IEVudmlyb25tZW50IGZvciBQeXRob24NCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxUb29sc1xzY3JpcHRzXGlkbGUNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcaWRsZWxpYlxpZGxlLnB5dw0KKyAgRGVzY3JpcHRpb249SURMRSBib290c3RyYXAgc2NyaXB0DQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVdpbmRvd3MgcHlkb2MgZHJpdmVyDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cdG9vbHNcc2NyaXB0c1wqLnB5dw0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXFRvb2xzXFNjcmlwdHMNCisgIERlc2NyaXB0aW9uPVdpbmRvd3MgcHlkb2MgZHJpdmVyDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUM6IGRvY3MNCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUNPTVBPTkVOVFMNCisgIFZhbHVlPUMNCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9JV9ET0NfJVwqLioNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxEb2MNCisgIERlc2NyaXB0aW9uPVB5dGhvbiBEb2N1bWVudGF0aW9uIChIVE1MKQ0KKyAgRmxhZ3M9MDAwMDAwMDEwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1EOiB0b29scw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9Q09NUE9ORU5UUw0KKyAgVmFsdWU9RA0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlx0b29sc1xzY3JpcHRzXCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxUb29sc1xTY3JpcHRzDQorICBEZXNjcmlwdGlvbj1VdGlsaXR5IFNjcmlwdHMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlx0b29sc1xzY3JpcHRzXCouZG9jDQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcVG9vbHNcU2NyaXB0cw0KKyAgRGVzY3JpcHRpb249VXRpbGl0eSBTY3JpcHRzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cdG9vbHNcc2NyaXB0c1xyZWFkbWUNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxUb29sc1xTY3JpcHRzXFJFQURNRS50eHQNCisgIERlc2NyaXB0aW9uPVV0aWxpdHkgU2NyaXB0cw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXHRvb2xzXHdlYmNoZWNrZXJcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXFRvb2xzXHdlYmNoZWNrZXINCisgIERlc2NyaXB0aW9uPVdlYiBjaGVja2VyIHRvb2wNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlx0b29sc1x3ZWJjaGVja2VyXHJlYWRtZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXFRvb2xzXHdlYmNoZWNrZXJcUkVBRE1FLnR4dA0KKyAgRGVzY3JpcHRpb249V2ViIGNoZWNrZXIgdG9vbA0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXHRvb2xzXHZlcnNpb25jaGVja1wqLnB5DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcVG9vbHNcdmVyc2lvbmNoZWNrDQorICBEZXNjcmlwdGlvbj1WZXJzaW9uIGNoZWNrZXIgdG9vbA0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXHRvb2xzXHZlcnNpb25jaGVja1xyZWFkbWUNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxUb29sc1x2ZXJzaW9uY2hlY2tcUkVBRE1FLnR4dA0KKyAgRGVzY3JpcHRpb249VmVyc2lvbiBjaGVja2VyIHRvb2wNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlx0b29sc1xweW5jaGVcKi5weQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXFRvb2xzXHB5bmNoZQ0KKyAgRGVzY3JpcHRpb249cHluY2hlIGNvbG9yIGVkaXRvcg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXHRvb2xzXHB5bmNoZVwqLnR4dA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXFRvb2xzXHB5bmNoZQ0KKyAgRGVzY3JpcHRpb249cHluY2hlIGNvbG9yIGVkaXRvcg0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXHRvb2xzXHB5bmNoZVx4XCoudHh0DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcVG9vbHNccHluY2hlXFgNCisgIERlc2NyaXB0aW9uPXB5bmNoZSBjb2xvciBlZGl0b3IgLSBYIGZpbGVzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cdG9vbHNccHluY2hlXHJlYWRtZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXFRvb2xzXHB5bmNoZVxSRUFETUUudHh0DQorICBEZXNjcmlwdGlvbj1weW5jaGUgY29sb3IgZWRpdG9yIC0gUkVBRE1FDQorICBGbGFncz0wMDAwMDAwMTAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cdG9vbHNccHluY2hlXHB5bmNoZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXFRvb2xzXHB5bmNoZVxweW5jaGUucHkNCisgIERlc2NyaXB0aW9uPXB5bmNoZSBjb2xvciBlZGl0b3IgLSBtYWluDQorICBGbGFncz0wMDAwMDAwMTAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cdG9vbHNccHluY2hlXHB5bmNoZS5weXcNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxUb29sc1xweW5jaGVccHluY2hlLnB5dw0KKyAgRGVzY3JpcHRpb249cHluY2hlIGNvbG9yIGVkaXRvciAtIG5vY29uc29sZSBtYWluDQorICBGbGFncz0wMDAwMDAwMTAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cdG9vbHNcaTE4blwqLnB5DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcVG9vbHNcaTE4bg0KKyAgRGVzY3JpcHRpb249SW50ZXJuYXRpb25hbGl6YXRpb24gaGVscGVycw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1FOiB0ZXN0IHN1aXRlDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1DT01QT05FTlRTDQorICBWYWx1ZT1FDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlx0ZXN0XGF1ZGlvdGVzdC5hdQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlx0ZXN0XGF1ZGlvdGVzdC5hdQ0KKyAgRGVzY3JpcHRpb249UHl0aG9uIFRlc3QgZmlsZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcdGVzdFwqLnV1ZQ0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlx0ZXN0DQorICBEZXNjcmlwdGlvbj1QeXRob24gVGVzdCBmaWxlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlx0ZXN0XCoucHkNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcdGVzdA0KKyAgRGVzY3JpcHRpb249UHl0aG9uIFRlc3QgZmlsZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcdGVzdFwqLnhtbA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlx0ZXN0DQorICBEZXNjcmlwdGlvbj1QeXRob24gVGVzdCBmaWxlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlx0ZXN0XCoub3V0DQorICBEZXN0aW5hdGlvbj0lTUFJTkRJUiVcTGliXHRlc3QNCisgIERlc2NyaXB0aW9uPVB5dGhvbiBUZXN0IGZpbGVzDQorICBGbGFncz0wMDAwMDAwMDAwMDAwMDEwDQorZW5kDQoraXRlbTogSW5zdGFsbCBGaWxlDQorICBTb3VyY2U9Li5cbGliXHRlc3RcKi5iejINCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcdGVzdA0KKyAgRGVzY3JpcHRpb249UHl0aG9uIFRlc3QgZmlsZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcdGVzdFwqLnRhcg0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlx0ZXN0DQorICBEZXNjcmlwdGlvbj1QeXRob24gVGVzdCBmaWxlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlx0ZXN0XCouZ3oNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcdGVzdA0KKyAgRGVzY3JpcHRpb249UHl0aG9uIFRlc3QgZmlsZXMNCisgIEZsYWdzPTAwMDAwMDAwMDAwMDAwMTANCitlbmQNCitpdGVtOiBJbnN0YWxsIEZpbGUNCisgIFNvdXJjZT0uLlxsaWJcdGVzdFwqLnR4dA0KKyAgRGVzdGluYXRpb249JU1BSU5ESVIlXExpYlx0ZXN0DQorICBEZXNjcmlwdGlvbj1QeXRob24gVGVzdCBmaWxlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEluc3RhbGwgRmlsZQ0KKyAgU291cmNlPS4uXGxpYlx0ZXN0XG91dHB1dFwqLioNCisgIERlc3RpbmF0aW9uPSVNQUlORElSJVxMaWJcdGVzdFxvdXRwdXQNCisgIERlc2NyaXB0aW9uPVB5dGhvbiBUZXN0IG91dHB1dCBmaWxlcw0KKyAgRmxhZ3M9MDAwMDAwMDAwMDAwMDAxMA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1ET05FIHdpdGggZmlsZSBjb3B5aW5nLg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1UaGUgcmVzdCBpcyByZWdpc3RyeSBhbmQgU3RhcnQgTWVudSBmaWRkbGluZy4NCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUNPTVBPTkVOVFMNCisgIFZhbHVlPUENCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1UQVNLUw0KKyAgVmFsdWU9QQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9UmVnaXN0ZXIgZmlsZSBleHRlbnNpb25zLiAgQXMgdXN1YWwsIEFkbWluIHByaXZzIGdldCBpbiB0aGUgd2F5LCBidXQgd2l0aCBhIHR3aXN0Og0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1Zb3UgZG9uJ3QgbmVlZCBhZG1pbiBwcml2cyB0byB3cml0ZSB0byBIS0VZX0NMQVNTRVNfUk9PVCAqZXhjZXB0KiB1bmRlciBXaW4ySy4NCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9T24gV2luMkssIGEgdXNlciB3aXRob3V0IEFkbWluIHByaXZzIGhhcyB0byByZWdpc3RlciBleHRlbnNpb25zIHVuZGVyIEhLQ1VcU29mdHdhcmVcQ0xBU1NFUyBpbnN0ZWFkLg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1CdXQgd2hpbGUgeW91IGNhbiAqZG8qIHRoYXQgdW5kZXIgb3RoZXIgZmxhdm9ycyBvZiBXaW5kb3dzIHRvbywgaXQgaGFzIG5vIHVzZWZ1bCBlZmZlY3QgZXhjZXB0IGluIFdpbjJLLg0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9VVNFX0hLQ1INCisgIFZhbHVlPTENCitlbmQNCitpdGVtOiBDaGVjayBDb25maWd1cmF0aW9uDQorICBGbGFncz0xMTExMDAxMA0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9RE9BRE1JTg0KKyAgVmFsdWU9MA0KK2VuZA0KK2l0ZW06IFNldCBWYXJpYWJsZQ0KKyAgVmFyaWFibGU9VVNFX0hLQ1INCisgIFZhbHVlPTANCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPVVTRV9IS0NSDQorICBWYWx1ZT0xDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUZpbGUgdHlwZXMuDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9UHl0aG9uLkZpbGUNCisgIE5ldyBWYWx1ZT1QeXRob24gRmlsZQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVB5dGhvbi5GaWxlXHNoZWxsXG9wZW5cY29tbWFuZA0KKyAgTmV3IFZhbHVlPSVNQUlORElSJVxweXRob24uZXhlICIlJTEiICUlKg0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVB5dGhvbi5GaWxlXERlZmF1bHRJY29uDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXFB5Lmljbw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVB5dGhvbi5Ob0NvbkZpbGUNCisgIE5ldyBWYWx1ZT1QeXRob24gRmlsZSAobm8gY29uc29sZSkNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1QeXRob24uTm9Db25GaWxlXHNoZWxsXG9wZW5cY29tbWFuZA0KKyAgTmV3IFZhbHVlPSVNQUlORElSJVxweXRob253LmV4ZSAiJSUxIiAlJSoNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1QeXRob24uTm9Db25GaWxlXERlZmF1bHRJY29uDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXFB5Lmljbw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVB5dGhvbi5Db21waWxlZEZpbGUNCisgIE5ldyBWYWx1ZT1Db21waWxlZCBQeXRob24gRmlsZQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVB5dGhvbi5Db21waWxlZEZpbGVcc2hlbGxcb3Blblxjb21tYW5kDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXHB5dGhvbi5leGUgIiUlMSIgJSUqDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9UHl0aG9uLkNvbXBpbGVkRmlsZVxEZWZhdWx0SWNvbg0KKyAgTmV3IFZhbHVlPSVNQUlORElSJVxweWMuaWNvDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUZpbGUgZXh0ZW5zaW9ucy4NCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT0ucHkNCisgIE5ldyBWYWx1ZT1QeXRob24uRmlsZQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PS5weQ0KKyAgTmV3IFZhbHVlPXRleHQvcGxhaW4NCisgIFZhbHVlIE5hbWU9Q29udGVudCBUeXBlDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9LnB5dw0KKyAgTmV3IFZhbHVlPVB5dGhvbi5Ob0NvbkZpbGUNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT0ucHl3DQorICBOZXcgVmFsdWU9dGV4dC9wbGFpbg0KKyAgVmFsdWUgTmFtZT1Db250ZW50IFR5cGUNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT0ucHljDQorICBOZXcgVmFsdWU9UHl0aG9uLkNvbXBpbGVkRmlsZQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PS5weW8NCisgIE5ldyBWYWx1ZT1QeXRob24uQ29tcGlsZWRGaWxlDQorZW5kDQoraXRlbTogRWxzZSBTdGF0ZW1lbnQNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9RmlsZSB0eXBlcy4NCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxDTEFTU0VTXFB5dGhvbi5GaWxlDQorICBOZXcgVmFsdWU9UHl0aG9uIEZpbGUNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcUHl0aG9uLkZpbGVcc2hlbGxcb3Blblxjb21tYW5kDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXHB5dGhvbi5leGUgIiUlMSIgJSUqDQorICBSb290PTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxDTEFTU0VTXFB5dGhvbi5GaWxlXERlZmF1bHRJY29uDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXFB5Lmljbw0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcQ0xBU1NFU1xQeXRob24uTm9Db25GaWxlDQorICBOZXcgVmFsdWU9UHl0aG9uIEZpbGUgKG5vIGNvbnNvbGUpDQorICBSb290PTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxDTEFTU0VTXFB5dGhvbi5Ob0NvbkZpbGVcc2hlbGxcb3Blblxjb21tYW5kDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXHB5dGhvbncuZXhlICIlJTEiICUlKg0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcQ0xBU1NFU1xQeXRob24uTm9Db25GaWxlXERlZmF1bHRJY29uDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXFB5Lmljbw0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcQ0xBU1NFU1xQeXRob24uQ29tcGlsZWRGaWxlDQorICBOZXcgVmFsdWU9Q29tcGlsZWQgUHl0aG9uIEZpbGUNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcUHl0aG9uLkNvbXBpbGVkRmlsZVxzaGVsbFxvcGVuXGNvbW1hbmQNCisgIE5ldyBWYWx1ZT0lTUFJTkRJUiVccHl0aG9uLmV4ZSAiJSUxIiAlJSoNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcUHl0aG9uLkNvbXBpbGVkRmlsZVxEZWZhdWx0SWNvbg0KKyAgTmV3IFZhbHVlPSVNQUlORElSJVxweWMuaWNvDQorICBSb290PTENCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9RmlsZSBleHRlbnNpb25zLg0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcLnB5DQorICBOZXcgVmFsdWU9UHl0aG9uLkZpbGUNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcLnB5DQorICBOZXcgVmFsdWU9dGV4dC9wbGFpbg0KKyAgVmFsdWUgTmFtZT1Db250ZW50IFR5cGUNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcLnB5dw0KKyAgTmV3IFZhbHVlPVB5dGhvbi5Ob0NvbkZpbGUNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcLnB5dw0KKyAgTmV3IFZhbHVlPXRleHQvcGxhaW4NCisgIFZhbHVlIE5hbWU9Q29udGVudCBUeXBlDQorICBSb290PTENCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxDTEFTU0VTXC5weWMNCisgIE5ldyBWYWx1ZT1QeXRob24uQ29tcGlsZWRGaWxlDQorICBSb290PTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxDTEFTU0VTXC5weW8NCisgIE5ldyBWYWx1ZT1QeXRob24uQ29tcGlsZWRGaWxlDQorICBSb290PTENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9SWYgd2UncmUgaW5zdGFsbGluZyBJRExFLCBhbHNvIHNldCBhbiBFZGl0IGNvbnRleHQgbWVudSBhY3Rpb24gdG8gdXNlIElETEUsIGZvciAucHkgYW5kIC5weXcgZmlsZXMuDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1DT01QT05FTlRTDQorICBWYWx1ZT1CDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9VVNFX0hLQ1INCisgIFZhbHVlPTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1QeXRob24uTm9Db25GaWxlXHNoZWxsXEVkaXQgd2l0aCBJRExFXGNvbW1hbmQNCisgIE5ldyBWYWx1ZT0lTUFJTkRJUiVccHl0aG9udy5leGUgJU1BSU5ESVIlXExpYlxpZGxlbGliXGlkbGUucHl3IC1uIC1lICIlJTEiDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9UHl0aG9uLkZpbGVcc2hlbGxcRWRpdCB3aXRoIElETEVcY29tbWFuZA0KKyAgTmV3IFZhbHVlPSVNQUlORElSJVxweXRob253LmV4ZSAlTUFJTkRJUiVcTGliXGlkbGVsaWJcaWRsZS5weXcgLW4gLWUgIiUlMSINCitlbmQNCitpdGVtOiBFbHNlIFN0YXRlbWVudA0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXENMQVNTRVNcUHl0aG9uLk5vQ29uRmlsZVxzaGVsbFxFZGl0IHdpdGggSURMRVxjb21tYW5kDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXHB5dGhvbncuZXhlICVNQUlORElSJVxMaWJcaWRsZWxpYlxpZGxlLnB5dyAtbiAtZSAiJSUxIg0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcQ0xBU1NFU1xQeXRob24uRmlsZVxzaGVsbFxFZGl0IHdpdGggSURMRVxjb21tYW5kDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXHB5dGhvbncuZXhlICVNQUlORElSJVxMaWJcaWRsZWxpYlxpZGxlLnB5dyAtbiAtZSAiJSUxIg0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVJlZ2lzdGVyIFB5dGhvbiBwYXRocy4NCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9V3JpdGUgdG8gSEtMTSBmb3IgYWRtaW4sIGVsc2UgSEtDVS4gIEtlZXAgdGhlc2UgYmxvY2tzIG90aGVyd2lzZSBpZGVudGljYWwhDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1ET0FETUlODQorICBWYWx1ZT0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcUHl0aG9uXFB5dGhvbkNvcmVcQ3VycmVudFZlcnNpb24NCisgIFJvb3Q9MTMwDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcUHl0aG9uXFB5dGhvbkNvcmVcJVBZX1ZFUlNJT04lXEluc3RhbGxQYXRoDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlDQorICBSb290PTINCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZVwlUFlfVkVSU0lPTiVcSW5zdGFsbFBhdGhcSW5zdGFsbEdyb3VwDQorICBOZXcgVmFsdWU9JUNHUk9VUF9TQVZFJQ0KKyAgTmV3IFZhbHVlPQ0KKyAgUm9vdD0yDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcUHl0aG9uXFB5dGhvbkNvcmVcJVBZX1ZFUlNJT04lXFB5dGhvblBhdGgNCisgIE5ldyBWYWx1ZT0lTUFJTkRJUiVcTGliOyVNQUlORElSJVxETExzOyVNQUlORElSJVxMaWJcbGliLXRrDQorICBOZXcgVmFsdWU9DQorICBSb290PTINCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZVwlUFlfVkVSU0lPTiVcTW9kdWxlcw0KKyAgUm9vdD0yDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cQXBwIFBhdGhzXFB5dGhvbi5leGUNCisgIE5ldyBWYWx1ZT0lTUFJTkRJUiVcUHl0aG9uLmV4ZQ0KKyAgUm9vdD0yDQorZW5kDQoraXRlbTogRWxzZSBTdGF0ZW1lbnQNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZVxDdXJyZW50VmVyc2lvbg0KKyAgUm9vdD0xMjkNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZVwlUFlfVkVSU0lPTiVcSW5zdGFsbFBhdGgNCisgIE5ldyBWYWx1ZT0lTUFJTkRJUiUNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXFB5dGhvblxQeXRob25Db3JlXCVQWV9WRVJTSU9OJVxJbnN0YWxsUGF0aFxJbnN0YWxsR3JvdXANCisgIE5ldyBWYWx1ZT0lQ0dST1VQX1NBVkUlDQorICBOZXcgVmFsdWU9DQorICBSb290PTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZVwlUFlfVkVSU0lPTiVcUHl0aG9uUGF0aA0KKyAgTmV3IFZhbHVlPSVNQUlORElSJVxMaWI7JU1BSU5ESVIlXERMTHM7JU1BSU5ESVIlXExpYlxsaWItdGsNCisgIE5ldyBWYWx1ZT0NCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXFB5dGhvblxQeXRob25Db3JlXCVQWV9WRVJTSU9OJVxNb2R1bGVzDQorICBSb290PTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxBcHAgUGF0aHNcUHl0aG9uLmV4ZQ0KKyAgTmV3IFZhbHVlPSVNQUlORElSJVxQeXRob24uZXhlDQorICBSb290PTENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9UmVnaXN0cnkgZmlkZGxpbmcgZm9yIGRvY3MuDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVdyaXRlIHRvIEhLTE0gZm9yIGFkbWluLCBlbHNlIEhLQ1UuICBLZWVwIHRoZXNlIGJsb2NrcyBvdGhlcndpc2UgaWRlbnRpY2FsIQ0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9Q09NUE9ORU5UUw0KKyAgVmFsdWU9Qw0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPURPQURNSU4NCisgIFZhbHVlPTENCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxQeXRob25cUHl0aG9uQ29yZVwlUFlfVkVSU0lPTiVcSGVscFxNYWluIFB5dGhvbiBEb2N1bWVudGF0aW9uDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXERvY1xpbmRleC5odG1sDQorICBSb290PTINCitlbmQNCitpdGVtOiBFbHNlIFN0YXRlbWVudA0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXFB5dGhvblxQeXRob25Db3JlXCVQWV9WRVJTSU9OJVxIZWxwXE1haW4gUHl0aG9uIERvY3VtZW50YXRpb24NCisgIE5ldyBWYWx1ZT0lTUFJTkRJUiVcRG9jXGluZGV4Lmh0bWwNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1TZXQgdGhlIGFwcCBwdWJsaXNoZXIgYW5kIFVSTCBlbnRyaWVzIGZvciBXaW4ySyBhZGQvcmVtb3ZlLg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KKyAgVGV4dD1JdCBkb2Vzbid0IGh1cnQgb24gb3RoZXIgc3lzdGVtcy4NCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9QXMgdXN1YWwsIHdyaXRlIHRvIEhLTE0gb3IgSEtDVSBkZXBlbmRpbmcgb24gQWRtaW4gcHJpdnMuDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PUNBVVRJT046ICBJZiB5b3Ugc2V0IHRoaXMgaW5mbyBvbiB0aGUgIldpbmRvd3MgMjAwMCIgcGFnZSAoc3RlcCA2KSBvZiB0aGUNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9SW5zdGFsbGF0aW9uIEV4cGVydCwgaXQgb25seSBzaG93cyB1cCBpbiB0aGUgIklmIiBibG9jayBiZWxvdy4gIEtlZXAgaW4gc3luY2ghDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1ET0FETUlODQorICBWYWx1ZT0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXCVBUFBUSVRMRSUNCisgIE5ldyBWYWx1ZT1odHRwOi8vd3d3LnB5dGhvbi5vcmcvDQorICBWYWx1ZSBOYW1lPUhlbHBMaW5rDQorICBSb290PTINCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcJUFQUFRJVExFJQ0KKyAgTmV3IFZhbHVlPVB5dGhvbkxhYnMgYXQgWm9wZSBDb3Jwb3JhdGlvbg0KKyAgVmFsdWUgTmFtZT1QdWJsaXNoZXINCisgIFJvb3Q9Mg0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwlQVBQVElUTEUlDQorICBOZXcgVmFsdWU9aHR0cDovL3d3dy5weXRob24ub3JnLw0KKyAgVmFsdWUgTmFtZT1VUkxJbmZvQWJvdXQNCisgIFJvb3Q9Mg0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwlQVBQVElUTEUlDQorICBOZXcgVmFsdWU9JVBZVkVSX1NUUklORyUNCisgIFZhbHVlIE5hbWU9RGlzcGxheVZlcnNpb24NCisgIFJvb3Q9Mg0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwlQVBQVElUTEUlDQorICBOZXcgVmFsdWU9JU1BSU5ESVIlXHB5LmljbywtMA0KKyAgVmFsdWUgTmFtZT1EaXNwbGF5SWNvbg0KKyAgUm9vdD0yDQorZW5kDQoraXRlbTogRWxzZSBTdGF0ZW1lbnQNCitlbmQNCitpdGVtOiBFZGl0IFJlZ2lzdHJ5DQorICBUb3RhbCBLZXlzPTENCisgIEtleT1Tb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxVbmluc3RhbGxcJUFQUFRJVExFJQ0KKyAgTmV3IFZhbHVlPWh0dHA6Ly93d3cucHl0aG9uLm9yZy8NCisgIFZhbHVlIE5hbWU9SGVscExpbmsNCisgIFJvb3Q9MQ0KK2VuZA0KK2l0ZW06IEVkaXQgUmVnaXN0cnkNCisgIFRvdGFsIEtleXM9MQ0KKyAgS2V5PVNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXFVuaW5zdGFsbFwlQVBQVElUTEUlDQorICBOZXcgVmFsdWU9UHl0aG9uTGFicyBhdCBab3BlIENvcnBvcmF0aW9uDQorICBWYWx1ZSBOYW1lPVB1Ymxpc2hlcg0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXCVBUFBUSVRMRSUNCisgIE5ldyBWYWx1ZT1odHRwOi8vd3d3LnB5dGhvbi5vcmcvDQorICBWYWx1ZSBOYW1lPVVSTEluZm9BYm91dA0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXCVBUFBUSVRMRSUNCisgIE5ldyBWYWx1ZT0lUFlWRVJfU1RSSU5HJQ0KKyAgVmFsdWUgTmFtZT1EaXNwbGF5VmVyc2lvbg0KKyAgUm9vdD0xDQorZW5kDQoraXRlbTogRWRpdCBSZWdpc3RyeQ0KKyAgVG90YWwgS2V5cz0xDQorICBLZXk9U29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cVW5pbnN0YWxsXCVBUFBUSVRMRSUNCisgIE5ldyBWYWx1ZT0lTUFJTkRJUiVccHkuaWNvLC0wDQorICBWYWx1ZSBOYW1lPURpc3BsYXlJY29uDQorICBSb290PTENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9UG9wdWxhdGUgU3RhcnQgTWVudSBncm91cA0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9VEFTS1MNCisgIFZhbHVlPUINCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogUmVtYXJrDQorICBUZXh0PVNob3J0Y3V0IHRvIGluc3RhbGxlciBubyBtYXR0ZXIgd2hhdC4NCitlbmQNCitpdGVtOiBDcmVhdGUgU2hvcnRjdXQNCisgIFNvdXJjZT0lTUFJTkRJUiVcdW53aXNlLmV4ZQ0KKyAgRGVzdGluYXRpb249JUdST1VQJVxVbmluc3RhbGwgUHl0aG9uLmxuaw0KKyAgV29ya2luZyBEaXJlY3Rvcnk9JU1BSU5ESVIlDQorICBLZXkgVHlwZT0xNTM2DQorICBGbGFncz0wMDAwMDAwMQ0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IElmL1doaWxlIFN0YXRlbWVudA0KKyAgVmFyaWFibGU9Q09NUE9ORU5UUw0KKyAgVmFsdWU9QQ0KKyAgRmxhZ3M9MDAwMDAwMTANCitlbmQNCitpdGVtOiBDcmVhdGUgU2hvcnRjdXQNCisgIFNvdXJjZT0lTUFJTkRJUiVccHl0aG9uLmV4ZQ0KKyAgRGVzdGluYXRpb249JUdST1VQJVxQeXRob24gKGNvbW1hbmQgbGluZSkubG5rDQorICBXb3JraW5nIERpcmVjdG9yeT0lTUFJTkRJUiUNCisgIEljb24gUGF0aG5hbWU9JU1BSU5ESVIlXHB5Y29uLmljbw0KKyAgS2V5IFR5cGU9MTUzNg0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBJZi9XaGlsZSBTdGF0ZW1lbnQNCisgIFZhcmlhYmxlPUNPTVBPTkVOVFMNCisgIFZhbHVlPUINCisgIEZsYWdzPTAwMDAwMDEwDQorZW5kDQoraXRlbTogQ3JlYXRlIFNob3J0Y3V0DQorICBTb3VyY2U9JU1BSU5ESVIlXHB5dGhvbncuZXhlDQorICBEZXN0aW5hdGlvbj0lR1JPVVAlXElETEUgKFB5dGhvbiBHVUkpLmxuaw0KKyAgQ29tbWFuZCBPcHRpb25zPSIlTUFJTkRJUiVcTGliXGlkbGVsaWJcaWRsZS5weXciDQorICBXb3JraW5nIERpcmVjdG9yeT0lTUFJTkRJUiUNCisgIEtleSBUeXBlPTE1MzYNCisgIEZsYWdzPTAwMDAwMDAxDQorZW5kDQoraXRlbTogQ3JlYXRlIFNob3J0Y3V0DQorICBTb3VyY2U9JU1BSU5ESVIlXHB5dGhvbncuZXhlDQorICBEZXN0aW5hdGlvbj0lR1JPVVAlXE1vZHVsZSBEb2NzLmxuaw0KKyAgQ29tbWFuZCBPcHRpb25zPSIlTUFJTkRJUiVcVG9vbHNcU2NyaXB0c1xweWRvY2d1aS5weXciDQorICBXb3JraW5nIERpcmVjdG9yeT0lTUFJTkRJUiUNCisgIEtleSBUeXBlPTE1MzYNCisgIEZsYWdzPTAwMDAwMDAxDQorZW5kDQoraXRlbTogRW5kIEJsb2NrDQorZW5kDQoraXRlbTogUmVtYXJrDQorZW5kDQoraXRlbTogSWYvV2hpbGUgU3RhdGVtZW50DQorICBWYXJpYWJsZT1DT01QT05FTlRTDQorICBWYWx1ZT1DDQorICBGbGFncz0wMDAwMDAxMA0KK2VuZA0KK2l0ZW06IENyZWF0ZSBTaG9ydGN1dA0KKyAgU291cmNlPSVNQUlORElSJVxEb2NcaW5kZXguaHRtbA0KKyAgRGVzdGluYXRpb249JUdST1VQJVxQeXRob24gTWFudWFscy5sbmsNCisgIFdvcmtpbmcgRGlyZWN0b3J5PSVNQUlORElSJQ0KKyAgS2V5IFR5cGU9MTUzNg0KKyAgRmxhZ3M9MDAwMDAwMDENCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBFbmQgQmxvY2sNCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9SSBkb24ndCB0aGluayB3ZSBuZWVkIHRoaXMsIGJ1dCBoYXZlIGFsd2F5cyBkb25lIGl0Lg0KK2VuZA0KK2l0ZW06IFNlbGYtUmVnaXN0ZXIgT0NYcy9ETExzDQorICBEZXNjcmlwdGlvbj1VcGRhdGluZyBTeXN0ZW0gQ29uZmlndXJhdGlvbiwgUGxlYXNlIFdhaXQuLi4NCitlbmQNCitpdGVtOiBSZW1hcmsNCitlbmQNCityZW1hcmtlZCBpdGVtOiBSZW1hcmsNCisgIFRleHQ9RG9uJ3QgZW5hYmxlICJEZWxldGUgaW4tdXNlIGZpbGVzIi4gIEhlcmUncyB3aGF0IGhhcHBlbnM6DQorZW5kDQorcmVtYXJrZWQgaXRlbTogUmVtYXJrDQorICBUZXh0PUluc3RhbGwgUHl0aG9uOyB1bmluc3RhbGwgUHl0aG9uOyBpbnN0YWxsIFB5dGhvbiBhZ2Fpbi4gIFJlYm9vdCB0aGUgbWFjaGluZS4NCitlbmQNCityZW1hcmtlZCBpdGVtOiBSZW1hcmsNCisgIFRleHQ9Tm93IFVOV0lTRS5FWEUgaXMgbWlzc2luZy4gIEkgdGhpbmsgdGhpcyBpcyBhIFdpc2UgYnVnLCBidXQgc28gaXQgZ29lcy4NCitlbmQNCityZW1hcmtlZCBpdGVtOiBBZGQgVGV4dCB0byBJTlNUQUxMLkxPRw0KKyAgVGV4dD1EZWxldGUgaW4tdXNlIGZpbGVzOiBPbg0KK2VuZA0KK2l0ZW06IFJlbWFyaw0KK2VuZA0KK2l0ZW06IFdpemFyZCBCbG9jaw0KKyAgRGlyZWN0aW9uIFZhcmlhYmxlPURJUkVDVElPTg0KKyAgRGlzcGxheSBWYXJpYWJsZT1ESVNQTEFZDQorICBCaXRtYXAgUGF0aG5hbWU9LlxpbnN0YWxsZXIuYm1wDQorICBYIFBvc2l0aW9uPTkNCisgIFkgUG9zaXRpb249MTANCisgIEZpbGxlciBDb2xvcj0xMTE3Mzc1OQ0KKyAgRmxhZ3M9MDAwMDAwMTENCitlbmQNCitpdGVtOiBDdXN0b20gRGlhbG9nIFNldA0KKyAgTmFtZT1GaW5pc2hlZA0KKyAgRGlzcGxheSBWYXJpYWJsZT1ESVNQTEFZDQorICBpdGVtOiBEaWFsb2cNCisgICAgVGl0bGU9JUFQUFRJVExFJSBJbnN0YWxsYXRpb24NCisgICAgVGl0bGUgRnJlbmNoPUluc3RhbGxhdGlvbiBkZSAlQVBQVElUTEUlDQorICAgIFRpdGxlIEdlcm1hbj1JbnN0YWxsYXRpb24gdm9uICVBUFBUSVRMRSUNCisgICAgVGl0bGUgU3BhbmlzaD1JbnN0YWxhY2nzbiBkZSAlQVBQVElUTEUlDQorICAgIFRpdGxlIEl0YWxpYW49SW5zdGFsbGF6aW9uZSBkaSAlQVBQVElUTEUlDQorICAgIFdpZHRoPTMzOQ0KKyAgICBIZWlnaHQ9MjgwDQorICAgIEZvbnQgTmFtZT1IZWx2DQorICAgIEZvbnQgU2l6ZT04DQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTE4OCAyMzQgMjQ0IDI1Mw0KKyAgICAgIFZhcmlhYmxlPURJUkVDVElPTg0KKyAgICAgIFZhbHVlPU4NCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDENCisgICAgICBUZXh0PSZGaW5pc2gNCisgICAgICBUZXh0IEZyZW5jaD0mRmluDQorICAgICAgVGV4dCBHZXJtYW49JldlaXRlcg0KKyAgICAgIFRleHQgU3BhbmlzaD0mVGVybWluYXINCisgICAgICBUZXh0IEl0YWxpYW49JkZpbmUNCisgICAgZW5kDQorICAgIGl0ZW06IFB1c2ggQnV0dG9uDQorICAgICAgUmVjdGFuZ2xlPTI2NCAyMzQgMzIwIDI1Mw0KKyAgICAgIFZhcmlhYmxlPURJU0FCTEVEDQorICAgICAgVmFsdWU9IQ0KKyAgICAgIEFjdGlvbj0zDQorICAgICAgQ3JlYXRlIEZsYWdzPTAxMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwDQorICAgICAgVGV4dD0mQ2FuY2VsDQorICAgICAgVGV4dCBGcmVuY2g9JkFubnVsZXINCisgICAgICBUZXh0IEdlcm1hbj0mQWJicmVjaGVuDQorICAgICAgVGV4dCBTcGFuaXNoPSZDYW5jZWxhcg0KKyAgICAgIFRleHQgSXRhbGlhbj0mQW5udWxsYQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwOCAxMCAzMjMgNDgNCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBGbGFncz0wMDAwMDAwMDAwMDAwMDAxDQorICAgICAgTmFtZT1UaW1lcyBOZXcgUm9tYW4NCisgICAgICBGb250IFN0eWxlPS0yNCAwIDAgMCA3MDAgMjU1IDAgMCAwIDMgMiAxIDE4DQorICAgICAgVGV4dD1JbnN0YWxsYXRpb24gQ29tcGxldGVkIQ0KKyAgICAgIFRleHQgRnJlbmNoPUluc3RhbGxhdGlvbiB0ZXJtaW7pZSAhDQorICAgICAgVGV4dCBHZXJtYW49RGllIEluc3RhbGxhdGlvbiBpc3QgYWJnZXNjaGxvc3NlbiENCisgICAgICBUZXh0IFNwYW5pc2g9oUluc3RhbGFjafNuIHRlcm1pbmFkYSENCisgICAgICBUZXh0IEl0YWxpYW49SW5zdGFsbGF6aW9uZSBjb21wbGV0YXRhIQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwOCA0NCAzMjAgODINCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PSVBUFBUSVRMRSUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4NCisgICAgICBUZXh0PQ0KKyAgICAgIFRleHQ9UHJlc3MgdGhlIEZpbmlzaCBidXR0b24gdG8gZXhpdCB0aGlzIGluc3RhbGxhdGlvbi4NCisgICAgICBUZXh0IEZyZW5jaD0lQVBQVElUTEUlIGVzdCBtYWludGVuYW50IGluc3RhbGzpLg0KKyAgICAgIFRleHQgRnJlbmNoPQ0KKyAgICAgIFRleHQgRnJlbmNoPUNsaXF1ZXogc3VyIGxlIGJvdXRvbiBGaW4gcG91ciBxdWl0dGVyIGwnaW5zdGFsbGF0aW9uLg0KKyAgICAgIFRleHQgR2VybWFuPSVBUFBUSVRMRSUgd3VyZGUgZXJmb2xncmVpY2ggaW5zdGFsbGllcnQuDQorICAgICAgVGV4dCBHZXJtYW49DQorICAgICAgVGV4dCBHZXJtYW49S2xpY2tlbiBTaWUgYXVmICJXZWl0ZXIiLCB1bSBkaWUgSW5zdGFsbGF0aW9uIHp1IGJlZW5kZW4uDQorICAgICAgVGV4dCBTcGFuaXNoPSVBUFBUSVRMRSUgc2UgaGEgaW5zdGFsYWRvIGNvbiDpeGl0by4NCisgICAgICBUZXh0IFNwYW5pc2g9DQorICAgICAgVGV4dCBTcGFuaXNoPVByZXNpb25lIGVsIGJvdPNuIFRlcm1pbmFyIHBhcmEgc2FsaXIgZGUgZXN0YSBpbnN0YWxhY2nzbi4NCisgICAgICBUZXh0IEl0YWxpYW49TCdpbnN0YWxsYXppb25lICVBUFBUSVRMRSUg6CBzdGF0YSBwb3J0YXRhIGEgdGVybWluZSBjb24gc3VjY2Vzc28uDQorICAgICAgVGV4dCBJdGFsaWFuPQ0KKyAgICAgIFRleHQgSXRhbGlhbj1QcmVtZXJlIGlsIHB1bHNhbnRlIEZpbmUgcGVyIHVzY2lyZSBkYWxsJ2luc3RhbGxhemlvbmUuDQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9MTAgMjI1IDMyMCAyMjYNCisgICAgICBBY3Rpb249Mw0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMQ0KKyAgICBlbmQNCisgICAgaXRlbTogU3RhdGljDQorICAgICAgUmVjdGFuZ2xlPTEwNiAxMDUgMzEyIDIxMA0KKyAgICAgIEVuYWJsZWQgQ29sb3I9MDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTExMTENCisgICAgICBDcmVhdGUgRmxhZ3M9MDEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDANCisgICAgICBUZXh0PVNwZWNpYWwgV2luZG93cyB0aGFua3MgdG86DQorICAgICAgVGV4dD0NCisgICAgICBUZXh0PVdpc2UgU29sdXRpb25zLCBmb3IgdGhlIHVzZSBvZiBJbnN0YWxsTWFzdGVyIDguMS4NCisgICAgICBUZXh0PSAgICBodHRwOi8vd3d3Lndpc2Vzb2x1dGlvbnMuY29tLw0KKyAgICAgIFRleHQ9DQorICAgICAgVGV4dD0NCisgICAgICBUZXh0PUxldHRFcnJvciwgRXJpayB2YW4gQmxva2xhbmQsIGZvciB0aGUgUHl0aG9uIGZvciBXaW5kb3dzIGdyYXBoaWMuDQorICAgICAgVGV4dD0gICAgaHR0cDovL3d3dy5sZXR0ZXJyb3IuY29tLw0KKyAgICAgIFRleHQ9DQorICAgICAgVGV4dD0NCisgICAgICBUZXh0PU1hcmsgSGFtbW9uZCwgd2l0aG91dCB3aG9zZSB5ZWFycyBvZiBmcmVlbHkgc2hhcmVkIFdpbmRvd3MgZXhwZXJ0aXNlLCBQeXRob24gZm9yIFdpbmRvd3Mgd291bGQgc3RpbGwgYmUgUHl0aG9uIGZvciBET1MuDQorICAgIGVuZA0KKyAgICBpdGVtOiBTdGF0aWMNCisgICAgICBSZWN0YW5nbGU9MTA2IDk1IDMxMiA5Ng0KKyAgICAgIEFjdGlvbj0zDQorICAgICAgRW5hYmxlZCBDb2xvcj0wMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExMQ0KKyAgICAgIENyZWF0ZSBGbGFncz0wMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMQ0KKyAgICBlbmQNCisgIGVuZA0KK2VuZA0KK2l0ZW06IEVuZCBCbG9jaw0KK2VuZA0KK2l0ZW06IE5ldyBFdmVudA0KKyAgTmFtZT1DYW5jZWwNCitlbmQNCitpdGVtOiBSZW1hcmsNCisgIFRleHQ9VGhpcyBpbmNsdWRlIHNjcmlwdCBzdXBwb3J0cyBhIHJvbGxiYWNrIHRvIHByZWluc3RhbGxhdGlvbiBzdGF0ZSBpZiB0aGUgdXNlciBjaG9vc2VzIHRvIGNhbmNlbCBiZWZvcmUgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZS4NCitlbmQNCitpdGVtOiBJbmNsdWRlIFNjcmlwdA0KKyAgUGF0aG5hbWU9JV9XSVNFXyVcSU5DTFVERVxyb2xsYmFjay53c2UNCitlbmQNCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9weXRob25jb3JlLnZjcHJvaiBiL1BDYnVpbGQ4L3B5dGhvbmNvcmUudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NmZhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9weXRob25jb3JlLnZjcHJvagpAQCAtMCwwICsxLDExMDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LDAwIg0KKwlOYW1lPSJweXRob25jb3JlIg0KKwlQcm9qZWN0R1VJRD0ie0NGN0FDM0QxLUUyREYtNDFEMi1CRUE2LTFFMjU1NkNERUEyNn0iDQorCVJvb3ROYW1lc3BhY2U9InB5dGhvbmNvcmUiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvWm0yMDAgIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249ImZhbHNlIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO1VTRV9ETF9FWFBPUlQ7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCQlEZXNjcmlwdGlvbj0iZ2VuZXJhdGUgYnVpbGRpbmZvIg0KKwkJCQlDb21tYW5kTGluZT0ibWFrZV9idWlsZGluZm8uZXhlICQoQ29uZmlndXJhdGlvbk5hbWUpJiN4MEQ7JiN4MEE7Ig0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJnZXRidWlsZGluZm8ubyINCisJCQkJT3V0cHV0RmlsZT0iLi9weXRob24yNS5kbGwiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJsaWJjIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9weXRob24yNS5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJTGlua1RpbWVDb2RlR2VuZXJhdGlvbj0iMCINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUwMDAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9weXRob24yNS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1xweXRob25jb3JlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9Ii9abTIwMCAiDQorCQkJCU9wdGltaXphdGlvbj0iMCINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztVU0VfRExfRVhQT1JUO1dJTjMyO19XSU5ET1dTO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCQlEZXNjcmlwdGlvbj0iZ2VuZXJhdGUgYnVpbGRpbmZvIg0KKwkJCQlDb21tYW5kTGluZT0ibWFrZV9idWlsZGluZm8uZXhlICQoQ29uZmlndXJhdGlvbk5hbWUpIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJnZXRidWlsZGluZm8ubyINCisJCQkJT3V0cHV0RmlsZT0iLi9weXRob24yNV9kLmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmMiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3B5dGhvbjI1X2QucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFlMDAwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vcHl0aG9uMjVfZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLi8uIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxweXRob25jb3JlIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUztVU0VfRExfRVhQT1JUIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJCURlc2NyaXB0aW9uPSJnZW5lcmF0ZSBidWlsZGluZm8iDQorCQkJCUNvbW1hbmRMaW5lPSJtYWtlX2J1aWxkaW5mby5leGUgJChDb25maWd1cmF0aW9uTmFtZSkiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6SUE2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImdldGJ1aWxkaW5mby5vIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3B5dGhvbjI1LmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9ImZhbHNlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJsaWJjIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9weXRob24yNS5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWUwMDAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9weXRob24yNS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4vLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cYW1kNjQtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmUiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iL1ptMjAwICAvVVNFQ0w6TVNfT1BURVJPTiAvR1MtIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTO1VTRV9ETF9FWFBPUlQiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMCINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9ImZhbHNlIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkJRGVzY3JpcHRpb249ImdlbmVyYXRlIGJ1aWxkaW5mbyINCisJCQkJQ29tbWFuZExpbmU9Im1ha2VfYnVpbGRpbmZvLmV4ZSAkKENvbmZpZ3VyYXRpb25OYW1lKSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvTUFDSElORTpBTUQ2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImdldGJ1aWxkaW5mby5vIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3B5dGhvbjI1LmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmMiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3B5dGhvbjI1LnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTAwMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL3B5dGhvbjI1LmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9InpsaWIiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGFkbGVyMzIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcemxpYlxjb21wcmVzcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGNyYzMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHpsaWJcZGVmbGF0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGd6aW8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcemxpYlxpbmZiYWNrLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHpsaWJcaW5mZmFzdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGluZmxhdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcemxpYlxpbmZ0cmVlcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXHRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHpsaWJcdW5jb21wci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGlibW9kdWxlLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXE1vZHVsZXNcemxpYiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cTW9kdWxlc1x6bGliIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlSXRhbml1bXxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxNb2R1bGVzXHpsaWIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQkJCT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxNb2R1bGVzXHpsaWIiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcemxpYlx6dXRpbC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfYmlzZWN0bW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY2prY29kZWNzXF9jb2RlY3NfY24uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjamtjb2RlY3NcX2NvZGVjc19oay5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNqa2NvZGVjc1xfY29kZWNzX2lzbzIwMjIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjamtjb2RlY3NcX2NvZGVjc19qcC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNqa2NvZGVjc1xfY29kZWNzX2tyLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY2prY29kZWNzXF9jb2RlY3NfdHcuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfY29kZWNzbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2Nzdi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9oZWFwcW1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9ob3RzaG90LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2xvY2FsZW1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9sc3Byb2YuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfcmFuZG9tbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3NyZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zdHJ1Y3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUGNcX3N1YnByb2Nlc3MuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfd2Vha3JlZi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQY1xfd2lucmVnLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcYWJzdHJhY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUGFyc2VyXGFjY2VsZXIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xhcnJheW1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cYXNkbC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cYXN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcYXVkaW9vcC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGJpbmFzY2lpLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxiaXRzZXQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGJsdGlubW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcYm9vbG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGJ1ZmZlcm9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGNlbGxvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGNldmFsLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcY2xhc3NvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjbWF0aG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGNvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGNvZGVjcy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGNvZGVvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjb2xsZWN0aW9uc21vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cY29tcGlsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGNvbXBsZXhvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcY29uZmlnLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY1BpY2tsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNTdHJpbmdJTy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGRhdGV0aW1lbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcZGVzY3JvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xkaWN0b2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBDXGRsX250LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxkeW5sb2FkX3dpbi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGVudW1vYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xlcnJub21vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZXJyb3JzLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxleGNlcHRpb25zLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcZmlsZW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQYXJzZXJcZmlyc3RzZXRzLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcZmxvYXRvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xmcmFtZW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZnJvemVuLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcZnVuY29iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGZ1bmN0aW9uYWxtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xmdW5jdGlvbmFsbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxmdXR1cmUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xnY21vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGdlbm9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZ2V0YXJncy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZ2V0Y29tcGlsZXIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdldGNvcHlyaWdodC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZ2V0bXRpbWUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdldG9wdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xnZXRwYXRocC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZ2V0cGxhdGZvcm0uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdldHZlcnNpb24uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdyYW1pbml0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxncmFtbWFyLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxncmFtbWFyMS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGltYWdlb3AuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGltcG9ydC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xpbXBvcnRfbnQuYyINCisJCQk+DQorCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJCT4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxQeXRob24iDQorCQkJCS8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJCT4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxQeXRob24iDQorCQkJCS8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iUmVsZWFzZUl0YW5pdW18V2luMzIiDQorCQkJCT4NCisJCQkJPFRvb2wNCisJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxQeXRob24iDQorCQkJCS8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCQk+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cUHl0aG9uIg0KKwkJCQkvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGltcG9ydGRsLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcaW50b2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcaXRlcm9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGl0ZXJ0b29sc21vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQYXJzZXJcbGlzdG5vZGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xsaXN0b2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcbG9uZ29iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXG1haW4uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXG1hcnNoYWwuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xtYXRobW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWQ1LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWQ1bW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxtZXRhZ3JhbW1hci5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXG1ldGhvZG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXG1tYXBtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXG1vZHN1cHBvcnQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xtb2R1bGVvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcbXN2Y3J0bW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY2prY29kZWNzXG11bHRpYnl0ZWNvZGVjLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxteXJlYWRsaW5lLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxteXNucHJpbnRmLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxteXN0cnRvdWwuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUGFyc2VyXG5vZGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xvYm1hbGxvYy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXG9wZXJhdG9yLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxwYXJzZXIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xwYXJzZXJtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUGFyc2VyXHBhcnNldG9rLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNccG9zaXhtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHB5YXJlbmEuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHB5ZnBlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxweXN0YXRlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxweXN0cnRvZC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cUHl0aG9uLWFzdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xweXRob25fbnQucmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxweXRob25ydW4uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xyYW5nZW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHJnYmltZ21vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHJvdGF0aW5ndHJlZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHNldG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYTI1Nm1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYTUxMm1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYTUxMm1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYW1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNpZ25hbG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNpZ25hbG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHNsaWNlb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcc3RyaW5nb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcc3Ryb3Btb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHN0cnVjdG1lbWJlci5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHN0cnVjdHNlcS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cc3ltdGFibGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xzeW10YWJsZW1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cc3lzbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblx0aHJlYWQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x0aHJlYWRtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x0aW1lbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclx0b2tlbml6ZXIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHRyYWNlYmFjay5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHR1cGxlb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcdHlwZW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHVuaWNvZGVjdHlwZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHVuaWNvZGVvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1x3ZWFrcmVmb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNceHhzdWJ0eXBlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNceXV2Y29udmVydC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHppcGltcG9ydC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvcHl0aG9uY29yZV9saW5rLnR4dCBiL1BDYnVpbGQ4L3B5dGhvbmNvcmVfbGluay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmZGY3MQotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQ4L3B5dGhvbmNvcmVfbGluay50eHQKQEAgLTAsMCArMSwzMTEgQEAKKy9PVVQ6Ii4vcHl0aG9uMjUuZGxsIiAvSU5DUkVNRU5UQUw6Tk8gL0RMTCAvTUFOSUZFU1QgL01BTklGRVNURklMRToiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVccHl0aG9uMjUuZGxsLmludGVybWVkaWF0ZS5tYW5pZmVzdCIgL05PREVGQVVMVExJQjoibGliYyIgL0RFQlVHIC9QREI6Ii5cLi9weXRob24yNS5wZGIiIC9TVUJTWVNURU06V0lORE9XUyAvTFRDRzpQR0lOU1RSVU1FTlQgL1BHRDoiYzpccHlkZXZcUENidWlsZFxweXRob24yNS5wZ2QiIC9CQVNFOiIweDFlMDAwMDAwIiAvSU1QTElCOiIuXC4vcHl0aG9uMjUubGliIiAvTUFDSElORTpYODYgZ2V0YnVpbGRpbmZvLm8ga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcYWRsZXIzMi5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGNvbXByZXNzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcY3JjMzIub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxkZWZsYXRlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZ3ppby5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGluZmJhY2sub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxpbmZmYXN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcaW5mbGF0ZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGluZnRyZWVzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcdHJlZXMub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVx1bmNvbXByLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcemxpYm1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHp1dGlsLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcX2Jpc2VjdG1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXF9jb2RlY3NfY24ub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxfY29kZWNzX2hrLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcX2NvZGVjc19pc28yMDIyLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcX2NvZGVjc19qcC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXF9jb2RlY3Nfa3Iub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxfY29kZWNzX3R3Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcX2NvZGVjc21vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXF9jc3Yub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxfaGVhcHFtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxfaG90c2hvdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXF9sb2NhbGVtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxfbHNwcm9mLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcX3JhbmRvbW1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXF9zcmUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxfc3VicHJvY2Vzcy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXF93ZWFrcmVmLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcX3dpbnJlZy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGFic3RyYWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcYWNjZWxlci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGFycmF5bW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcYXNkbC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGFzdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGF1ZGlvb3Aub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxiaW5hc2NpaS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGJpdHNldC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGJsdGlubW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcYm9vbG9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGJ1ZmZlcm9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGNlbGxvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxjZXZhbC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGNsYXNzb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcY21hdGhtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxjb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcY29kZWNzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcY29kZW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGNvbGxlY3Rpb25zbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcY29tcGlsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGNvbXBsZXhvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxjb25maWcub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxjUGlja2xlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcY1N0cmluZ0lPLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZGF0ZXRpbWVtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxkZXNjcm9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGRpY3RvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxkbF9udC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGR5bmxvYWRfd2luLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZW51bW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGVycm5vbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZXJyb3JzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZXhjZXB0aW9ucy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGZpbGVvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxmaXJzdHNldHMub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxmbG9hdG9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGZyYW1lb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZnJvemVuLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZnVuY29iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGZ1bmN0aW9uYWxtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxmdXR1cmUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxnY21vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGdlbm9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGdldGFyZ3Mub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxnZXRjb21waWxlci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGdldGNvcHlyaWdodC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGdldG10aW1lLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZ2V0b3B0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcZ2V0cGF0aHAub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxnZXRwbGF0Zm9ybS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGdldHZlcnNpb24ub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxncmFtaW5pdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGdyYW1tYXIub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxncmFtbWFyMS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGltYWdlb3Aub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxpbXBvcnQub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxpbXBvcnRfbnQub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxpbXBvcnRkbC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGludG9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGl0ZXJvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxpdGVydG9vbHNtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxsaXN0bm9kZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXGxpc3RvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxsb25nb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcbWFpbi5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXG1hcnNoYWwub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxtYXRobW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcbWQ1Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcbWQ1bW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcbWV0YWdyYW1tYXIub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxtZXRob2RvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxtbWFwbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcbW9kc3VwcG9ydC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXG1vZHVsZW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXG1zdmNydG1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXG11bHRpYnl0ZWNvZGVjLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcbXlyZWFkbGluZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXG15c25wcmludGYub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxteXN0cnRvdWwub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxub2RlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcb2JtYWxsb2Mub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxvcGVyYXRvci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHBhcnNlci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHBhcnNlcm1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHBhcnNldG9rLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVccG9zaXhtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxweWFyZW5hLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVccHlmcGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxweXN0YXRlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVccHlzdHJ0b2Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxQeXRob24tYXN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVccHl0aG9uX250LnJlcyINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVccHl0aG9ucnVuLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVccmFuZ2VvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxyZ2JpbWdtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxyb3RhdGluZ3RyZWUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxzZXRvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxzaGEyNTZtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxzaGE1MTJtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxzaGFtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxzaWduYWxtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxzbGljZW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHN0cmluZ29iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHN0cm9wbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcc3RydWN0bWVtYmVyLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcX3N0cnVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHN0cnVjdHNlcS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHN5bXRhYmxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcc3ltdGFibGVtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVxzeXNtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVx0aHJlYWQub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVx0aHJlYWRtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVx0aW1lbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcdG9rZW5pemVyLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcdHJhY2ViYWNrLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcdHVwbGVvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVx0eXBlb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcdW5pY29kZWN0eXBlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcdW5pY29kZW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlXHdlYWtyZWZvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVx4eHN1YnR5cGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZVx5dXZjb252ZXJ0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVcemlwaW1wb3J0Lm9iaiIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9weXRob25jb3JlX3Bnby52Y3Byb2ogYi9QQ2J1aWxkOC9weXRob25jb3JlX3Bnby52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1M2JiOQotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQ4L3B5dGhvbmNvcmVfcGdvLnZjcHJvagpAQCAtMCwwICsxLDc4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjgsMDAiDQorCU5hbWU9InB5dGhvbmNvcmVfcGdvIg0KKwlQcm9qZWN0R1VJRD0iezhCNTlDMUZGLTI0MzktNEJFOS05RjI0LTg0RDQ5ODJEMjhENH0iDQorCVJvb3ROYW1lc3BhY2U9InB5dGhvbmNvcmVfcGdvIg0KKwlLZXl3b3JkPSJXaW4zMlByb2oiDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFByb2plY3ROYW1lKSINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVwkKFByb2plY3ROYW1lKSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIvWm0yMDAgIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlXaG9sZVByb2dyYW1PcHRpbWl6YXRpb249InRydWUiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X1dJTkRPV1M7VVNFX0RMX0VYUE9SVDtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCUN1bHR1cmU9IjEwMzMiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJCURlc2NyaXB0aW9uPSJHZW5lcmF0ZSBidWlsZGluZm8gJmFtcDsgcHJvZmlsZSBndWlkZWQgb3B0aW1pemF0aW9ucyAocGxlYXNlIGJlIHBhdGllbnQpIg0KKwkJCQlDb21tYW5kTGluZT0ibWFrZV9idWlsZGluZm8uZXhlICQoQ29uZmlndXJhdGlvbk5hbWUpJiN4MEQ7JiN4MEE7bGluayBAJChQcm9qZWN0TmFtZSlfbGluay50eHQmI3gwRDsmI3gwQTskKE91dERpcilccHl0aG9uIC4uL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weSAtbiAxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJnZXRidWlsZGluZm8ubyINCisJCQkJT3V0cHV0RmlsZT0iJChPdXREaXIpL3B5dGhvbjI1LmRsbCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmMiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iJChPdXREaXIpL3B5dGhvbjI1LnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlMaW5rVGltZUNvZGVHZW5lcmF0aW9uPSIzIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZTAwMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iJChPdXREaXIpL3B5dGhvbjI1LmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJPC9Db25maWd1cmF0aW9ucz4NCisJPFJlZmVyZW5jZXM+DQorCTwvUmVmZXJlbmNlcz4NCisJPEZpbGVzPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9InpsaWIiDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGFkbGVyMzIuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcemxpYlxjb21wcmVzcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGNyYzMyLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHpsaWJcZGVmbGF0ZS5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGd6aW8uYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcemxpYlxpbmZiYWNrLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHpsaWJcaW5mZmFzdC5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXGluZmxhdGUuYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcemxpYlxpbmZ0cmVlcy5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXHRyZWVzLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHpsaWJcdW5jb21wci5jIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGlibW9kdWxlLmMiDQorCQkJCT4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXE1vZHVsZXNcemxpYiINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x6bGliXHp1dGlsLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9iaXNlY3Rtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjamtjb2RlY3NcX2NvZGVjc19jbi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNqa2NvZGVjc1xfY29kZWNzX2hrLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY2prY29kZWNzXF9jb2RlY3NfaXNvMjAyMi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNqa2NvZGVjc1xfY29kZWNzX2pwLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY2prY29kZWNzXF9jb2RlY3Nfa3IuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjamtjb2RlY3NcX2NvZGVjc190dy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9jb2RlY3Ntb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfY3N2LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2hlYXBxbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2hvdHNob3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfbG9jYWxlbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2xzcHJvZi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9yYW5kb21tb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3JlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3N0cnVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQY1xfc3VicHJvY2Vzcy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF93ZWFrcmVmLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBjXF93aW5yZWcuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xhYnN0cmFjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQYXJzZXJcYWNjZWxlci5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGFycmF5bW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxhc2RsLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxhc3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xhdWRpb29wLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcYmluYXNjaWkuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUGFyc2VyXGJpdHNldC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cYmx0aW5tb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xib29sb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcYnVmZmVyb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcY2VsbG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cY2V2YWwuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xjbGFzc29iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNtYXRobW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcY29iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cY29kZWNzLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcY29kZW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNvbGxlY3Rpb25zbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxjb21waWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcY29tcGxleG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xjb25maWcuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xjUGlja2xlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY1N0cmluZ0lPLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcZGF0ZXRpbWVtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xkZXNjcm9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGRpY3RvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcZGxfbnQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGR5bmxvYWRfd2luLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcZW51bW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGVycm5vbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxlcnJvcnMuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGV4Y2VwdGlvbnMuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xmaWxlb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxmaXJzdHNldHMuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xmbG9hdG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGZyYW1lb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxmcm96ZW4uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xmdW5jb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcZnVuY3Rpb25hbG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cZnV0dXJlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcZ2Ntb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xnZW5vYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdldGFyZ3MuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdldGNvbXBpbGVyLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxnZXRjb3B5cmlnaHQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdldG10aW1lLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxnZXRvcHQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcZ2V0cGF0aHAuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGdldHBsYXRmb3JtLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxnZXR2ZXJzaW9uLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxncmFtaW5pdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQYXJzZXJcZ3JhbW1hci5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQYXJzZXJcZ3JhbW1hcjEuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xpbWFnZW9wLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxpbXBvcnQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcaW1wb3J0X250LmMiDQorCQkJPg0KKwkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCQk+DQorCQkJCTxUb29sDQorCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cUHl0aG9uIg0KKwkJCQkvPg0KKwkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXGltcG9ydGRsLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcaW50b2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcaXRlcm9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGl0ZXJ0b29sc21vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQYXJzZXJcbGlzdG5vZGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xsaXN0b2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcbG9uZ29iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXG1haW4uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXG1hcnNoYWwuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xtYXRobW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWQ1LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcbWQ1bW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxtZXRhZ3JhbW1hci5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXG1ldGhvZG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXG1tYXBtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXG1vZHN1cHBvcnQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xtb2R1bGVvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcbXN2Y3J0bW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcY2prY29kZWNzXG11bHRpYnl0ZWNvZGVjLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxteXJlYWRsaW5lLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxteXNucHJpbnRmLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxteXN0cnRvdWwuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUGFyc2VyXG5vZGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xvYm1hbGxvYy5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXG9wZXJhdG9yLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclxwYXJzZXIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xwYXJzZXJtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUGFyc2VyXHBhcnNldG9rLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNccG9zaXhtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHB5YXJlbmEuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHB5ZnBlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxweXN0YXRlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxweXN0cnRvZC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cUHl0aG9uLWFzdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ2J1aWxkOFxweXRob24uZXhlIg0KKwkJCT4NCisJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJPg0KKwkJCQk8VG9vbA0KKwkJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJCQlDb21tYW5kTGluZT0ieGNvcHkgJChJbnB1dEZpbGVOYW1lKSogJChPdXREaXIpIC9GIC9JIC9ZIg0KKwkJCQkJT3V0cHV0cz0iJChPdXREaXIpXCQoSW5wdXRGaWxlTmFtZSkiDQorCQkJCS8+DQorCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xweXRob25fbnQucmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxweXRob25ydW4uYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1xyYW5nZW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHJnYmltZ21vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHJvdGF0aW5ndHJlZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHNldG9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYTI1Nm1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYTUxMm1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYTUxMm1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNoYW1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNpZ25hbG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNpZ25hbG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHNsaWNlb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcc3RyaW5nb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcc3Ryb3Btb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHN0cnVjdG1lbWJlci5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHN0cnVjdHNlcS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cc3ltdGFibGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xzeW10YWJsZW1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQeXRob25cc3lzbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblx0aHJlYWQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x0aHJlYWRtb2R1bGUuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x0aW1lbW9kdWxlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBhcnNlclx0b2tlbml6ZXIuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUHl0aG9uXHRyYWNlYmFjay5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHR1cGxlb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE9iamVjdHNcdHlwZW9iamVjdC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHVuaWNvZGVjdHlwZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXHVuaWNvZGVvYmplY3QuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cT2JqZWN0c1x3ZWFrcmVmb2JqZWN0LmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNceHhzdWJ0eXBlLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNceXV2Y29udmVydC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHppcGltcG9ydC5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvcHl0aG9uY29yZV9wZ29fbGluay50eHQgYi9QQ2J1aWxkOC9weXRob25jb3JlX3Bnb19saW5rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTlkNzBiCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvcHl0aG9uY29yZV9wZ29fbGluay50eHQKQEAgLTAsMCArMSwzMTEgQEAKKy9PVVQ6Ii5ccHl0aG9uY29yZV9wZ28vcHl0aG9uMjUuZGxsIiAvSU5DUkVNRU5UQUw6Tk8gL0RMTCAvTUFOSUZFU1QgL01BTklGRVNURklMRToiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHB5dGhvbjI1LmRsbC5pbnRlcm1lZGlhdGUubWFuaWZlc3QiIC9OT0RFRkFVTFRMSUI6ImxpYmMiIC9ERUJVRyAvUERCOiIuXHB5dGhvbmNvcmVfcGdvL3B5dGhvbjI1LnBkYiIgL1NVQlNZU1RFTTpXSU5ET1dTIC9MVENHOlBHSU5TVFJVTUVOVCAvUEdEOiJjOlxweWRldlxQQ2J1aWxkXHB5dGhvbmNvcmVfcGdvXHB5dGhvbjI1LnBnZCIgL0JBU0U6IjB4MWUwMDAwMDAiIC9JTVBMSUI6InB5dGhvbmNvcmVfcGdvL3B5dGhvbjI1LmxpYiIgL01BQ0hJTkU6WDg2IGdldGJ1aWxkaW5mby5vIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xhZGxlcjMyLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNvbXByZXNzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNyYzMyLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGRlZmxhdGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZ3ppby5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xpbmZiYWNrLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGluZmZhc3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29caW5mbGF0ZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xpbmZ0cmVlcy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1x0cmVlcy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1x1bmNvbXByLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHpsaWJtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cenV0aWwub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cX2Jpc2VjdG1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xfY29kZWNzX2NuLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXF9jb2RlY3NfaGsub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cX2NvZGVjc19pc28yMDIyLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXF9jb2RlY3NfanAub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cX2NvZGVjc19rci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xfY29kZWNzX3R3Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXF9jb2RlY3Ntb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cX2Nzdi5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xfaGVhcHFtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cX2hvdHNob3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cX2xvY2FsZW1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xfbHNwcm9mLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXF9yYW5kb21tb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cX3NyZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xfc3RydWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXF9zdWJwcm9jZXNzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXF93ZWFrcmVmLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXF93aW5yZWcub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cYWJzdHJhY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cYWNjZWxlci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xhcnJheW1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xhc2RsLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGFzdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xhdWRpb29wLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGJpbmFzY2lpLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGJpdHNldC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xibHRpbm1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xib29sb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGJ1ZmZlcm9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xjZWxsb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNldmFsLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNsYXNzb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNtYXRobW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cY29kZWNzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNvZGVvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cY29sbGVjdGlvbnNtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cY29tcGlsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xjb21wbGV4b2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNvbmZpZy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xjUGlja2xlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGNTdHJpbmdJTy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xkYXRldGltZW1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xkZXNjcm9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xkaWN0b2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGRsX250Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGR5bmxvYWRfd2luLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGVudW1vYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZXJybm9tb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZXJyb3JzLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGV4Y2VwdGlvbnMub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZmlsZW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xmaXJzdHNldHMub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZmxvYXRvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZnJhbWVvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZnJvemVuLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGZ1bmNvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZnVuY3Rpb25hbG1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xmdXR1cmUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZ2Ntb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZ2Vub2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGdldGFyZ3Mub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZ2V0Y29tcGlsZXIub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZ2V0Y29weXJpZ2h0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGdldG10aW1lLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGdldG9wdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xnZXRwYXRocC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xnZXRwbGF0Zm9ybS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xnZXR2ZXJzaW9uLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGdyYW1pbml0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGdyYW1tYXIub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cZ3JhbW1hcjEub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29caW1hZ2VvcC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xpbXBvcnQub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29caW1wb3J0X250Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGltcG9ydGRsLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGludG9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xpdGVyb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGl0ZXJ0b29sc21vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xsaXN0bm9kZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xsaXN0b2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXGxvbmdvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cbWFpbi5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xtYXJzaGFsLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXG1hdGhtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cbWQ1Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXG1kNW1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xtZXRhZ3JhbW1hci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xtZXRob2RvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cbW1hcG1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xtb2RzdXBwb3J0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXG1vZHVsZW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xtc3ZjcnRtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cbXVsdGlieXRlY29kZWMub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cbXlyZWFkbGluZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xteXNucHJpbnRmLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXG15c3RydG91bC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xub2RlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXG9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xvYm1hbGxvYy5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xvcGVyYXRvci5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xwYXJzZXIub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29ccGFyc2VybW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHBhcnNldG9rLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHBvc2l4bW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHB5YXJlbmEub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29ccHlmcGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29ccHlzdGF0ZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xweXN0cnRvZC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xQeXRob24tYXN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHB5dGhvbl9udC5yZXMiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xweXRob25ydW4ub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29ccmFuZ2VvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29ccmdiaW1nbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHJvdGF0aW5ndHJlZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xzZXRvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cc2hhMjU2bW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHNoYTUxMm1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xzaGFtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cc2lnbmFsbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHNsaWNlb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHN0cmluZ29iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xzdHJvcG1vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1xzdHJ1Y3RtZW1iZXIub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cc3RydWN0c2VxLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHN5bXRhYmxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHN5bXRhYmxlbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHN5c21vZHVsZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1x0aHJlYWQub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cdGhyZWFkbW9kdWxlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHRpbWVtb2R1bGUub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cdG9rZW5pemVyLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHRyYWNlYmFjay5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1x0dXBsZW9iamVjdC5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1x0eXBlb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHVuaWNvZGVjdHlwZS5vYmoiDQorDQorIi5ceDg2LXRlbXAtcmVsZWFzZVxweXRob25jb3JlX3Bnb1x1bmljb2Rlb2JqZWN0Lm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHdlYWtyZWZvYmplY3Qub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29ceHhzdWJ0eXBlLm9iaiINCisNCisiLlx4ODYtdGVtcC1yZWxlYXNlXHB5dGhvbmNvcmVfcGdvXHl1dmNvbnZlcnQub2JqIg0KKw0KKyIuXHg4Ni10ZW1wLXJlbGVhc2VccHl0aG9uY29yZV9wZ29cemlwaW1wb3J0Lm9iaiINCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9weXRob253LnZjcHJvaiBiL1BDYnVpbGQ4L3B5dGhvbncudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNWU5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9weXRob253LnZjcHJvagpAQCAtMCwwICsxLDM4NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+DQorPFZpc3VhbFN0dWRpb1Byb2plY3QNCisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiDQorCVZlcnNpb249IjgsMDAiDQorCU5hbWU9InB5dGhvbnciDQorCVByb2plY3RHVUlEPSJ7RjQyMjlDQzMtODczQy00OUFFLTk3MjktREQzMDhFRDRDRDRBfSINCisJPg0KKwk8UGxhdGZvcm1zPg0KKwkJPFBsYXRmb3JtDQorCQkJTmFtZT0iV2luMzIiDQorCQkvPg0KKwk8L1BsYXRmb3Jtcz4NCisJPFRvb2xGaWxlcz4NCisJPC9Ub29sRmlsZXM+DQorCTxDb25maWd1cmF0aW9ucz4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iRGVidWd8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLWRlYnVnXHB5dGhvbnciDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1MiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLi9weXRob253X2QuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vcHl0aG9ud19kLnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlTdGFja1Jlc2VydmVTaXplPSIyMDAwMDAwIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZDAwMDAwMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVxweXRob253Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCisJCQkJQ3VsdHVyZT0iMTAzMyINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlwuL3B5dGhvbncuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vcHl0aG9udy5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iMjAwMDAwMCINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWQwMDAwMDAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxweXRob253Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfSVRBTklVTSINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlPdXRwdXRGaWxlPSIuXC4vcHl0aG9udy5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9weXRob253LnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlTdGFja1Jlc2VydmVTaXplPSIyMDAwMDAwIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxZDAwMDAwMCINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0LXRlbXAtcmVsZWFzZVxweXRob253Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KKwkJCQlDdWx0dXJlPSIxMDMzIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJT3V0cHV0RmlsZT0iLlwuL3B5dGhvbncuZXhlIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vcHl0aG9udy5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJU3RhY2tSZXNlcnZlU2l6ZT0iMjAwMDAwMCINCisJCQkJQmFzZUFkZHJlc3M9IjB4MWQwMDAwMDAiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xweXRob25fZXhlLnJjIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1xXaW5NYWluLmMiDQorCQkJPg0KKwkJPC9GaWxlPg0KKwk8L0ZpbGVzPg0KKwk8R2xvYmFscz4NCisJPC9HbG9iYWxzPg0KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9yZWFkbWUudHh0IGIvUENidWlsZDgvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU4NDNiCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvcmVhZG1lLnR4dApAQCAtMCwwICsxLDQyMyBAQAorQnVpbGRpbmcgUHl0aG9uIHVzaW5nIFZDKysgOC4wDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KK1RoaXMgZGlyZWN0b3J5IGlzIHVzZWQgdG8gYnVpbGQgUHl0aG9uIGZvciBXaW4zMiBwbGF0Zm9ybXMsIGUuZy4gV2luZG93cw0KKzk1LCA5OCBhbmQgTlQuICBJdCByZXF1aXJlcyBNaWNyb3NvZnQgVmlzdWFsIEMrKyA4LjANCisoYS5rLmEuIFZpc3VhbCBTdHVkaW8gMjAwNSkuDQorKEZvciBvdGhlciBXaW5kb3dzIHBsYXRmb3JtcyBhbmQgY29tcGlsZXJzLCBzZWUgLi4vUEMvcmVhZG1lLnR4dC4pDQorDQorQWxsIHlvdSBuZWVkIHRvIGRvIGlzIG9wZW4gdGhlIHdvcmtzcGFjZSAicGNidWlsZC5zbG4iIGluIE1TVkMrKywgc2VsZWN0DQordGhlIERlYnVnIG9yIFJlbGVhc2Ugc2V0dGluZyAodXNpbmcgIlNvbHV0aW9uIENvbmZpZ3VyYXRpb24iIGZyb20NCit0aGUgIlN0YW5kYXJkIiB0b29sYmFyIiksIGFuZCBidWlsZCB0aGUgcHJvamVjdHMuDQorDQorVGhlIHByb3BlciBvcmRlciB0byBidWlsZCBzdWJwcm9qZWN0czoNCisNCisxKSBweXRob25jb3JlICh0aGlzIGJ1aWxkcyB0aGUgbWFpbiBQeXRob24gRExMIGFuZCBsaWJyYXJ5IGZpbGVzLA0KKyAgICAgICAgICAgICAgIHB5dGhvbjI1LntkbGwsIGxpYn0gaW4gUmVsZWFzZSBtb2RlKQ0KKyAgICAgICAgICAgICAgTk9URTogIGluIHByZXZpb3VzIHJlbGVhc2VzLCB0aGlzIHN1YnByb2plY3Qgd2FzDQorICAgICAgICAgICAgICBuYW1lZCBhZnRlciB0aGUgcmVsZWFzZSBudW1iZXIsIGUuZy4gcHl0aG9uMjAuDQorDQorMikgcHl0aG9uICh0aGlzIGJ1aWxkcyB0aGUgbWFpbiBQeXRob24gZXhlY3V0YWJsZSwNCisgICAgICAgICAgIHB5dGhvbi5leGUgaW4gUmVsZWFzZSBtb2RlKQ0KKw0KKzMpIHRoZSBvdGhlciBzdWJwcm9qZWN0cywgYXMgZGVzaXJlZCBvciBuZWVkZWQgKG5vdGU6ICB5b3UgcHJvYmFibHkgZG9uJ3QNCisgICB3YW50IHRvIGJ1aWxkIG1vc3Qgb2YgdGhlIG90aGVyIHN1YnByb2plY3RzLCB1bmxlc3MgeW91J3JlIGJ1aWxkaW5nIGFuDQorICAgZW50aXJlIFB5dGhvbiBkaXN0cmlidXRpb24gZnJvbSBzY3JhdGNoLCBvciBzcGVjaWZpY2FsbHkgbWFraW5nIGNoYW5nZXMNCisgICB0byB0aGUgc3Vic3lzdGVtcyB0aGV5IGltcGxlbWVudCwgb3IgYXJlIHJ1bm5pbmcgYSBQeXRob24gY29yZSBidWlsZGJvdA0KKyAgIHRlc3Qgc2xhdmU7IHNlZSBTVUJQUk9KRUNUUyBiZWxvdykNCisNCitXaGVuIHVzaW5nIHRoZSBEZWJ1ZyBzZXR0aW5nLCB0aGUgb3V0cHV0IGZpbGVzIGhhdmUgYSBfZCBhZGRlZCB0bw0KK3RoZWlyIG5hbWU6ICBweXRob24yNV9kLmRsbCwgcHl0aG9uX2QuZXhlLCBwYXJzZXJfZC5weWQsIGFuZCBzbyBvbi4NCisNCitTVUJQUk9KRUNUUw0KKy0tLS0tLS0tLS0tDQorVGhlc2Ugc3VicHJvamVjdHMgc2hvdWxkIGJ1aWxkIG91dCBvZiB0aGUgYm94LiAgU3VicHJvamVjdHMgb3RoZXIgdGhhbiB0aGUNCittYWluIG9uZXMgKHB5dGhvbmNvcmUsIHB5dGhvbiwgcHl0aG9udykgZ2VuZXJhbGx5IGJ1aWxkIGEgRExMIChyZW5hbWVkIHRvDQorLnB5ZCkgZnJvbSBhIHNwZWNpZmljIG1vZHVsZSBzbyB0aGF0IHVzZXJzIGRvbid0IGhhdmUgdG8gbG9hZCB0aGUgY29kZQ0KK3N1cHBvcnRpbmcgdGhhdCBtb2R1bGUgdW5sZXNzIHRoZXkgaW1wb3J0IHRoZSBtb2R1bGUuDQorDQorcHl0aG9uY29yZQ0KKyAgICAuZGxsIGFuZCAubGliDQorcHl0aG9uY29yZV9wZ28NCisJLmRsbCBhbmQgLmxpYiwgYSB2YXJpYW50IG9mIHB5dGhvbmNvcmUgdGhhdCBpcyBvcHRpbWl6ZWQgdGhyb3VnaCBhIA0KKwlQcm9maWxlIEd1aWRlZCBPcHRpbWl6YXRpb24gKFBHTyksIGVtcGxveWluZyBweWJlbmNoIGFzIHRoZSBwcm9maWxlDQorCWNhc2UgdG8gb3B0aW1pemUgZm9yLiBUaGUgcmVzdWx0cyBhcmUgcHJvZHVjZWQgYXMgYSBweXRob24yNS57ZGxsLGxpYn0NCisJaW4gdGhlIHN1YmZvbGRlciAncHl0aG9uY29yZV9wZ28nLiBUbyB1c2UgdGhpcyBpbnN0ZWFkIG9mIHRoZSANCisJc3RhbmRhcmQgUHl0aG9uIGRsbCBwbGFjZSB0aGlzIGRsbCB3aXRoIHRoZSBweXRob24uZXhlLg0KK3B5dGhvbg0KKyAgICAuZXhlDQorcHl0aG9udw0KKyAgICBweXRob253LmV4ZSwgYSB2YXJpYW50IG9mIHB5dGhvbi5leGUgdGhhdCBkb2Vzbid0IHBvcCB1cCBhIERPUyBib3gNCitfc29ja2V0DQorICAgIHNvY2tldG1vZHVsZS5jDQorX3Rlc3RjYXBpDQorICAgIHRlc3RzIG9mIHRoZSBQeXRob24gQyBBUEksIHJ1biB2aWEgTGliL3Rlc3QvdGVzdF9jYXBpLnB5LCBhbmQNCisgICAgaW1wbGVtZW50ZWQgYnkgbW9kdWxlIE1vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMNCitweWV4cGF0DQorICAgIFB5dGhvbiB3cmFwcGVyIGZvciBhY2NlbGVyYXRlZCBYTUwgcGFyc2luZywgd2hpY2ggaW5jb3Jwb3JhdGVzIHN0YWJsZQ0KKyAgICBjb2RlIGZyb20gdGhlIEV4cGF0IHByb2plY3Q6ICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2V4cGF0Lw0KK3NlbGVjdA0KKyAgICBzZWxlY3Rtb2R1bGUuYw0KK3VuaWNvZGVkYXRhDQorICAgIGxhcmdlIHRhYmxlcyBvZiBVbmljb2RlIGRhdGENCit3aW5zb3VuZA0KKyAgICBwbGF5IHNvdW5kcyAodHlwaWNhbGx5IC53YXYgZmlsZXMpIHVuZGVyIFdpbmRvd3MNCisNCitUaGUgZm9sbG93aW5nIHN1YnByb2plY3RzIHdpbGwgZ2VuZXJhbGx5IE5PVCBidWlsZCBvdXQgb2YgdGhlIGJveC4gIFRoZXkNCit3cmFwIGNvZGUgUHl0aG9uIGRvZXNuJ3QgY29udHJvbCwgYW5kIHlvdSdsbCBuZWVkIHRvIGRvd25sb2FkIHRoZSBiYXNlDQorcGFja2FnZXMgZmlyc3QgYW5kIHVucGFjayB0aGVtIGludG8gc2libGluZ3Mgb2YgUENidWlsZHMncyBwYXJlbnQNCitkaXJlY3Rvcnk7IGZvciBleGFtcGxlLCBpZiB5b3VyIFBDYnVpbGQgaXMgIC4uLi4uLi5cZGlzdFxzcmNcUENidWlsZFwsDQordW5wYWNrIGludG8gbmV3IHN1YmRpcmVjdG9yaWVzIG9mIGRpc3RcLg0KKw0KK190a2ludGVyDQorICAgIFB5dGhvbiB3cmFwcGVyIGZvciB0aGUgVGsgd2luZG93aW5nIHN5c3RlbS4gIFJlcXVpcmVzIGJ1aWxkaW5nDQorICAgIFRjbC9UayBmaXJzdC4gIEZvbGxvd2luZyBhcmUgaW5zdHJ1Y3Rpb25zIGZvciBUY2wvVGsgOC40LjEyLg0KKw0KKyAgICBHZXQgc291cmNlDQorICAgIC0tLS0tLS0tLS0NCisgICAgSW4gdGhlIGRpc3QgZGlyZWN0b3J5LCBydW4NCisgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvdGNsOC40LjEyDQorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL3RrOC40LjEyDQorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL3RpeC04LjQuMA0KKw0KKyAgICBCdWlsZCBUY2wgZmlyc3QgKGRvbmUgaGVyZSB3LyBNU1ZDIDcuMSBvbiBXaW5kb3dzIFhQKQ0KKyAgICAtLS0tLS0tLS0tLS0tLS0NCisgICAgVXNlICJTdGFydCAtPiBBbGwgUHJvZ3JhbXMgLT4gTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzDQorICAgICAgICAgLT4gVmlzdWFsIFN0dWRpbyAuTkVUIFRvb2xzIC0+IFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzIENvbW1hbmQgUHJvbXB0Ig0KKyAgICB0byBnZXQgYSBzaGVsbCB3aW5kb3cgd2l0aCB0aGUgY29ycmVjdCBlbnZpcm9ubWVudCBzZXR0aW5ncw0KKyAgICBjZCBkaXN0XHRjbDguNC4xMlx3aW4NCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMNCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgSU5TVEFMTERJUj0uLlwuLlx0Y2x0ayBpbnN0YWxsDQorDQorICAgIFhYWCBTaG91bGQgd2UgY29tcGlsZSB3aXRoIE9QVFM9dGhyZWFkcz8NCisNCisgICAgT3B0aW9uYWw6ICBydW4gdGVzdHMsIHZpYQ0KKyAgICAgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgdGVzdA0KKw0KKyAgICAgICAgT24gV2luWFAgUHJvLCB3aG9sbHkgdXAgdG8gZGF0ZSBhcyBvZiAzMC1BdWctMjAwNDoNCisgICAgICAgIGFsbC50Y2w6ICAgICAgICBUb3RhbCAgIDEwNjc4ICAgUGFzc2VkICA5OTY5ICAgIFNraXBwZWQgNzA5ICAgICBGYWlsZWQgIDANCisgICAgICAgIFNvdXJjZWQgMTI5IFRlc3QgRmlsZXMuDQorDQorICAgIEJ1aWxkIFRrDQorICAgIC0tLS0tLS0tDQorICAgIGNkIGRpc3RcdGs4LjQuMTJcd2luDQorICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuMTINCisgICAgbm1ha2UgLWYgbWFrZWZpbGUudmMgVENMRElSPS4uXC4uXHRjbDguNC4xMiBJTlNUQUxMRElSPS4uXC4uXHRjbHRrIGluc3RhbGwNCisNCisgICAgWFhYIFNob3VsZCB3ZSBjb21waWxlIHdpdGggT1BUUz10aHJlYWRzPw0KKw0KKyAgICBYWFggT3VyIGluc3RhbGxlciBjb3BpZXMgYSBsb3Qgb2Ygc3R1ZmYgb3V0IG9mIHRoZSBUY2wvVGsgaW5zdGFsbA0KKyAgICBYWFggZGlyZWN0b3J5LiAgSXMgYWxsIG9mIHRoYXQgcmVhbGx5IG5lZWRlZCBmb3IgUHl0aG9uIHVzZSBvZiBUY2wvVGs/DQorDQorICAgIE9wdGlvbmFsOiAgcnVuIHRlc3RzLCB2aWENCisgICAgICAgIG5tYWtlIC1mIG1ha2VmaWxlLnZjIFRDTERJUj0uLlwuLlx0Y2w4LjQuMTIgdGVzdA0KKw0KKyAgICAgICAgT24gV2luWFAgUHJvLCB3aG9sbHkgdXAgdG8gZGF0ZSBhcyBvZiAzMC1BdWctMjAwNDoNCisgICAgICAgIGFsbC50Y2w6ICAgICAgICBUb3RhbCAgIDg0MjAgICAgUGFzc2VkICA2ODI2ICAgIFNraXBwZWQgMTU4MSAgICBGYWlsZWQgIDEzDQorICAgICAgICBTb3VyY2VkIDkxIFRlc3QgRmlsZXMuDQorICAgICAgICBGaWxlcyB3aXRoIGZhaWxpbmcgdGVzdHM6IGNhbnZJbWcudGVzdCBzY3JvbGxiYXIudGVzdCB0ZXh0V2luZC50ZXN0IHdpbldtLnRlc3QNCisNCisgICBCdWlsdCBUaXgNCisgICAtLS0tLS0tLS0NCisgICBjZCBkaXN0XHRpeC04LjQuMFx3aW4NCisgICBubWFrZSAtZiBweXRob24ubWFrDQorICAgbm1ha2UgLWYgcHl0aG9uLm1hayBpbnN0YWxsDQorDQorYnoyDQorICAgIFB5dGhvbiB3cmFwcGVyIGZvciB0aGUgbGliYnoyIGNvbXByZXNzaW9uIGxpYnJhcnkuICBIb21lcGFnZQ0KKyAgICAgICAgaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9iemlwMi8NCisgICAgRG93bmxvYWQgdGhlIHNvdXJjZSBmcm9tIHRoZSBweXRob24ub3JnIGNvcHkgaW50byB0aGUgZGlzdA0KKyAgICBkaXJlY3Rvcnk6DQorDQorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL2J6aXAyLTEuMC4zDQorDQorICAgIEEgY3VzdG9tIHByZS1saW5rIHN0ZXAgaW4gdGhlIGJ6MiBwcm9qZWN0IHNldHRpbmdzIHNob3VsZCBtYW5hZ2UgdG8NCisgICAgYnVpbGQgYnppcDItMS4wLjNcbGliYnoyLmxpYiBieSBtYWdpYyBiZWZvcmUgYnoyLnB5ZCAob3IgYnoyX2QucHlkKSBpcw0KKyAgICBsaW5rZWQgaW4gUENidWlsZFwuDQorICAgIEhvd2V2ZXIsIHRoZSBiejIgcHJvamVjdCBpcyBub3Qgc21hcnQgZW5vdWdoIHRvIHJlbW92ZSBhbnl0aGluZyB1bmRlcg0KKyAgICBiemlwMi0xLjAuM1wgd2hlbiB5b3UgZG8gYSBjbGVhbiwgc28gaWYgeW91IHdhbnQgdG8gcmVidWlsZCBiemlwMi5saWINCisgICAgeW91IG5lZWQgdG8gY2xlYW4gdXAgYnppcDItMS4wLjNcIGJ5IGhhbmQuDQorDQorICAgIFRoZSBidWlsZCBzdGVwIHNob3VsZG4ndCB5aWVsZCBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzLCBhbmQgc2hvdWxkIGVuZA0KKyAgICBieSBkaXNwbGF5aW5nIDYgYmxvY2tzIGVhY2ggdGVybWluYXRlZCB3aXRoDQorICAgICAgICBGQzogbm8gZGlmZmVyZW5jZXMgZW5jb3VudGVyZWQNCisNCisgICAgQWxsIG9mIHRoaXMgbWFuYWdlZCB0byBidWlsZCBiemlwMi0xLjAuM1xsaWJiejIubGliLCB3aGljaCB0aGUgUHl0aG9uDQorICAgIHByb2plY3QgbGlua3MgaW4uDQorDQorDQorX2JzZGRiDQorICAgIFRvIHVzZSB0aGUgdmVyc2lvbiBvZiBic2RkYiB0aGF0IFB5dGhvbiBpcyBidWlsdCB3aXRoIGJ5IGRlZmF1bHQsIGludm9rZQ0KKyAgICAoaW4gdGhlIGRpc3QgZGlyZWN0b3J5KQ0KKw0KKyAgICAgc3ZuIGV4cG9ydCBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvZXh0ZXJuYWwvZGItNC40LjIwDQorDQorDQorICAgIFRoZW4gb3BlbiBhIFZTLk5FVCAyMDAzIHNoZWxsLCBhbmQgaW52b2tlOg0KKw0KKyAgICAgICBkZXZlbnYgZGItNC40LjIwXGJ1aWxkX3dpbjMyXEJlcmtlbGV5X0RCLnNsbiAvYnVpbGQgUmVsZWFzZSAvcHJvamVjdCBkYl9zdGF0aWMNCisNCisgICAgYW5kIGRvIHRoYXQgYSBzZWNvbmQgdGltZSBmb3IgYSBEZWJ1ZyBidWlsZCB0b286DQorDQorICAgICAgIGRldmVudiBkYi00LjQuMjBcYnVpbGRfd2luMzJcQmVya2VsZXlfREIuc2xuIC9idWlsZCBEZWJ1ZyAvcHJvamVjdCBkYl9zdGF0aWMNCisNCisgICAgQWx0ZXJuYXRpdmVseSwgaWYgeW91IHdhbnQgdG8gc3RhcnQgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlcywNCisgICAgZ28gdG8gU2xlZXB5Y2F0J3MgZG93bmxvYWQgcGFnZToNCisgICAgICAgIGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS9kb3dubG9hZHMvcmVsZWFzZWhpc3RvcnliZGIuaHRtbA0KKw0KKyAgICBhbmQgZG93bmxvYWQgdmVyc2lvbiA0LjQuMjAuDQorDQorICAgIFdpdGggb3Igd2l0aG91dCBzdHJvbmcgY3J5cHRvZ3JhcGh5PyBZb3UgY2FuIGNob29zZSBlaXRoZXIgd2l0aCBvcg0KKyAgICB3aXRob3V0IHN0cm9uZyBjcnlwdG9ncmFwaHksIGFzIHBlciB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93LiAgQnkNCisgICAgZGVmYXVsdCwgUHl0aG9uIGlzIGJ1aWx0IGFuZCBkaXN0cmlidXRlZCBXSVRIT1VUIHN0cm9uZyBjcnlwdG8uDQorDQorICAgIFVucGFjayB0aGUgc291cmNlczsgaWYgeW91IGRvd25sb2FkZWQgdGhlIG5vbi1jcnlwdG8gdmVyc2lvbiwgcmVuYW1lDQorICAgIHRoZSBkaXJlY3RvcnkgZnJvbSBkYi00LjQuMjAuTkMgdG8gZGItNC40LjIwLg0KKw0KKyAgICBOb3cgYXBwbHkgYW55IHBhdGNoZXMgdGhhdCBhcHBseSB0byB5b3VyIHZlcnNpb24uDQorDQorICAgIE9wZW4NCisgICAgICAgIGRpc3RcZGItNC40LjIwXGRvY3NcaW5kZXguaHRtbA0KKw0KKyAgICBhbmQgZm9sbG93IHRoZSAiV2luZG93cy0+QnVpbGRpbmcgQmVya2VsZXkgREIgd2l0aCBWaXN1YWwgQysrIC5ORVQiDQorICAgIGluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIFNsZWVweWNhdA0KKyAgICBzb2Z0d2FyZS4gIE5vdGUgdGhhdCBCZXJrZWxleV9EQi5kc3cgaXMgaW4gdGhlIGJ1aWxkX3dpbjMyIHN1YmRpcmVjdG9yeS4NCisgICAgQnVpbGQgdGhlICJkYl9zdGF0aWMiIHByb2plY3QsIGZvciAiUmVsZWFzZSIgbW9kZS4NCisNCisgICAgVG8gcnVuIGV4dGVuc2l2ZSB0ZXN0cywgcGFzcyAiLXUgYnNkZGIiIHRvIHJlZ3J0ZXN0LnB5LiAgdGVzdF9ic2RkYjMucHkNCisgICAgaXMgdGhlbiBlbmFibGVkLiAgUnVubmluZyBpbiB2ZXJib3NlIG1vZGUgbWF5IGJlIGhlbHBmdWwuDQorDQorICAgIFhYWCBUaGUgdGVzdF9ic2RkYjMgdGVzdHMgZG9uJ3QgYWx3YXlzIHBhc3MsIG9uIFdpbmRvd3MgKGFjY29yZGluZyB0bw0KKyAgICBYWFggbWUpIG9yIG9uIExpbnV4IChhY2NvcmRpbmcgdG8gQmFycnkpLiAgKEkgaGFkIG11Y2ggYmV0dGVyIGx1Y2sNCisgICAgWFhYIG9uIFdpbjJLIHRoYW4gb24gV2luOThTRS4pICBUaGUgY29tbW9uIGZhaWx1cmUgbW9kZSBhY3Jvc3MgcGxhdGZvcm1zDQorICAgIFhYWCBpcw0KKyAgICBYWFggICAgIERCQWdhaW5FcnJvcjogKDExLCAnUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgLS0gdW5hYmxlDQorICAgIFhYWCAgICAgICAgICAgICAgICAgICAgICAgICB0byBqb2luIHRoZSBlbnZpcm9ubWVudCcpDQorICAgIFhYWA0KKyAgICBYWFggYW5kIGl0IGFwcGVhcnMgdGltaW5nLWRlcGVuZGVudC4gIE9uIFdpbjJLIEkgYWxzbyBzYXcgdGhpcyBvbmNlOg0KKyAgICBYWFgNCisgICAgWFhYIHRlc3QwMl9TaW1wbGVMb2NrcyAoYnNkZGIudGVzdC50ZXN0X3RocmVhZC5IYXNoU2ltcGxlVGhyZWFkZWQpIC4uLg0KKyAgICBYWFggRXhjZXB0aW9uIGluIHRocmVhZCByZWFkZXIgMToNCisgICAgWFhYIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToNCisgICAgWFhYIEZpbGUgIkM6XENvZGVccHl0aG9uXGxpYlx0aHJlYWRpbmcucHkiLCBsaW5lIDQxMSwgaW4gX19ib290c3RyYXANCisgICAgWFhYICAgIHNlbGYucnVuKCkNCisgICAgWFhYIEZpbGUgIkM6XENvZGVccHl0aG9uXGxpYlx0aHJlYWRpbmcucHkiLCBsaW5lIDM5OSwgaW4gcnVuDQorICAgIFhYWCAgICBhcHBseShzZWxmLl9fdGFyZ2V0LCBzZWxmLl9fYXJncywgc2VsZi5fX2t3YXJncykNCisgICAgWFhYIEZpbGUgIkM6XENvZGVccHl0aG9uXGxpYlxic2RkYlx0ZXN0XHRlc3RfdGhyZWFkLnB5IiwgbGluZSAyNjgsIGluDQorICAgIFhYWCAgICAgICAgICAgICAgICAgIHJlYWRlclRocmVhZA0KKyAgICBYWFggICAgcmVjID0gYy5uZXh0KCkNCisgICAgWFhYIERCTG9ja0RlYWRsb2NrRXJyb3I6ICgtMzA5OTYsICdEQl9MT0NLX0RFQURMT0NLOiBMb2NrZXIga2lsbGVkDQorICAgIFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVzb2x2ZSBhIGRlYWRsb2NrJykNCisgICAgWFhYDQorICAgIFhYWCBJJ20gdG9sZCB0aGF0IERCTG9ja0RlYWRsb2NrRXJyb3IgaXMgZXhwZWN0ZWQgYXQgdGltZXMuICBJdA0KKyAgICBYWFggZG9lc24ndCBjYXVzZSBhIHRlc3QgdG8gZmFpbCB3aGVuIGl0IGhhcHBlbnMgKGV4Y2VwdGlvbnMgaW4NCisgICAgWFhYIHRocmVhZHMgYXJlIGludmlzaWJsZSB0byB1bml0dGVzdCkuDQorDQorICAgIEJ1aWxkaW5nIGZvciBXaW42NDoNCisgICAgLSBvcGVuIGEgVlMuTkVUIDIwMDMgY29tbWFuZCBwcm9tcHQNCisgICAgLSBydW4gdGhlIFNESyBzZXRlbnYuY21kIHNjcmlwdCwgcGFzc2luZyAvUkVUQUlMIGFuZCB0aGUgdGFyZ2V0DQorICAgICAgYXJjaGl0ZWN0dXJlICgvU1JWNjQgZm9yIEl0YW5pdW0sIC9YNjQgZm9yIEFNRDY0KQ0KKyAgICAtIGJ1aWxkIEJlcmtlbGV5REIgd2l0aCB0aGUgc29sdXRpb24gY29uZmlndXJhdGlvbiBtYXRjaGluZyB0aGUNCisgICAgICB0YXJnZXQgKCJSZWxlYXNlIElBNjQiIGZvciBJdGFuaXVtLCAiUmVsZWFzZSBBTUQ2NCIgZm9yIEFNRDY0KSwgZS5nLg0KKyAgICBkZXZlbnYgZGItNC40LjIwXGJ1aWxkX3dpbjMyXEJlcmtlbGV5X0RCLnNsbiAvYnVpbGQgIlJlbGVhc2UgQU1ENjQiIC9wcm9qZWN0IGRiX3N0YXRpYyAvdXNlZW52DQorDQorX3NxbGl0ZTMNCisgICAgUHl0aG9uIHdyYXBwZXIgZm9yIFNRTGl0ZSBsaWJyYXJ5Lg0KKyAgICANCisgICAgR2V0IHRoZSBzb3VyY2UgY29kZSB0aHJvdWdoDQorICAgIA0KKyAgICBzdm4gZXhwb3J0IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9leHRlcm5hbC9zcWxpdGUtc291cmNlLTMuMy40DQorICAgIA0KKyAgICBUbyB1c2UgdGhlIGV4dGVuc2lvbiBtb2R1bGUgaW4gYSBQeXRob24gYnVpbGQgdHJlZSwgY29weSBzcWxpdGUzLmRsbCBpbnRvDQorICAgIHRoZSBQQ2J1aWxkIGZvbGRlci4NCisNCitfc3NsDQorICAgIFB5dGhvbiB3cmFwcGVyIGZvciB0aGUgc2VjdXJlIHNvY2tldHMgbGlicmFyeS4NCisNCisgICAgR2V0IHRoZSBzb3VyY2UgY29kZSB0aHJvdWdoDQorDQorICAgIHN2biBleHBvcnQgaHR0cDovL3N2bi5weXRob24ub3JnL3Byb2plY3RzL2V4dGVybmFsL29wZW5zc2wtMC45LjhhDQorDQorICAgIEFsdGVybmF0aXZlbHksIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnLg0KKyAgICBZb3UgY2FuICh0aGVvcmV0aWNhbGx5KSB1c2UgYW55IHZlcnNpb24gb2YgT3BlblNTTCB5b3UgbGlrZSAtIHRoZQ0KKyAgICBidWlsZCBwcm9jZXNzIHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgdGhlIGxhdGVzdCB2ZXJzaW9uLg0KKw0KKyAgICBZb3UgbXVzdCBhbHNvIGluc3RhbGwgQWN0aXZlUGVybCBmcm9tDQorICAgICAgICBodHRwOi8vd3d3LmFjdGl2ZXN0YXRlLmNvbS9Qcm9kdWN0cy9BY3RpdmVQZXJsLw0KKyAgICBhcyB0aGlzIGlzIHVzZWQgYnkgdGhlIE9wZW5TU0wgYnVpbGQgcHJvY2Vzcy4gIENvbXBsYWluIHRvIHRoZW0gPHdpbms+Lg0KKw0KKyAgICBUaGUgTVNWQyBwcm9qZWN0IHNpbXBseSBpbnZva2VzIFBDQnVpbGQvYnVpbGRfc3NsLnB5IHRvIHBlcmZvcm0NCisgICAgdGhlIGJ1aWxkLiAgVGhpcyBQeXRob24gc2NyaXB0IGxvY2F0ZXMgYW5kIGJ1aWxkcyB5b3VyIE9wZW5TU0wNCisgICAgaW5zdGFsbGF0aW9uLCB0aGVuIGludm9rZXMgYSBzaW1wbGUgbWFrZWZpbGUgdG8gYnVpbGQgdGhlIGZpbmFsIC5weWQuDQorDQorICAgIGJ1aWxkX3NzbC5weSBhdHRlbXB0cyB0byBjYXRjaCB0aGUgbW9zdCBjb21tb24gZXJyb3JzIChzdWNoIGFzIG5vdA0KKyAgICBiZWluZyBhYmxlIHRvIGZpbmQgT3BlblNTTCBzb3VyY2VzLCBvciBub3QgYmVpbmcgYWJsZSB0byBmaW5kIGEgUGVybA0KKyAgICB0aGF0IHdvcmtzIHdpdGggT3BlblNTTCkgYW5kIGdpdmUgYSByZWFzb25hYmxlIGVycm9yIG1lc3NhZ2UuDQorICAgIElmIHlvdSBoYXZlIGEgcHJvYmxlbSB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBiZSBoYW5kbGVkIGNvcnJlY3RseQ0KKyAgICAoZWcsIHlvdSBrbm93IHlvdSBoYXZlIEFjdGl2ZVBlcmwgYnV0IHdlIGNhbid0IGZpbmQgaXQpLCBwbGVhc2UgdGFrZQ0KKyAgICBhIHBlZWsgYXQgYnVpbGRfc3NsLnB5IGFuZCBzdWdnZXN0IHBhdGNoZXMuICBOb3RlIHRoYXQgYnVpbGRfc3NsLnB5DQorICAgIHNob3VsZCBiZSBhYmxlIHRvIGJlIHJ1biBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kLWxpbmUuDQorDQorICAgIGJ1aWxkX3NzbC5weS9NU1ZDIGlzbid0IGNsZXZlciBlbm91Z2ggdG8gY2xlYW4gT3BlblNTTCAtIHlvdSBtdXN0IGRvDQorICAgIHRoaXMgYnkgaGFuZC4NCisNCitCdWlsZGluZyBmb3IgSXRhbml1bQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIHByb2plY3QgZmlsZXMgc3VwcG9ydCBhIFJlbGVhc2VJdGFuaXVtIGNvbmZpZ3VyYXRpb24gd2hpY2ggY3JlYXRlcw0KK1dpbjY0L0l0YW5pdW0gYmluYXJpZXMuIEZvciB0aGlzIHRvIHdvcmssIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIFBsYXRmb3JtDQorU0RLLCBpbiBwYXJ0aWN1bGFyIHRoZSA2NC1iaXQgc3VwcG9ydC4gVGhpcyBpbmNsdWRlcyBhbiBJdGFuaXVtIGNvbXBpbGVyDQorKGZ1dHVyZSByZWxlYXNlcyBvZiB0aGUgU0RLIGxpa2VseSBpbmNsdWRlIGFuIEFNRDY0IGNvbXBpbGVyIGFzIHdlbGwpLg0KK0luIGFkZGl0aW9uLCB5b3UgbmVlZCB0aGUgVmlzdWFsIFN0dWRpbyBwbHVnaW4gZm9yIGV4dGVybmFsIEMgY29tcGlsZXJzLA0KK2Zyb20gaHR0cDovL3NmLm5ldC9wcm9qZWN0cy92c2V4dGNvbXAuIFRoZSBwbHVnaW4gd2lsbCB3cmFwIGNsLmV4ZSwgdG8NCitsb2NhdGUgdGhlIHByb3BlciB0YXJnZXQgY29tcGlsZXIsIGFuZCBjb252ZXJ0IGNvbXBpbGVyIG9wdGlvbnMNCithY2NvcmRpbmdseS4gVGhlIHByb2plY3QgZmlsZXMgcmVxdWlyZSBhdGxlYXN0IHZlcnNpb24gMC44Lg0KKw0KK0J1aWxkaW5nIGZvciBBTUQ2NA0KKy0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoZSBidWlsZCBwcm9jZXNzIGZvciB0aGUgUmVsZWFzZUFNRDY0IGNvbmZpZ3VyYXRpb24gaXMgdmVyeSBzaW1pbGFyDQordG8gdGhlIEl0YW5pdW0gY29uZmlndXJhdGlvbjsgbWFrZSBzdXJlIHlvdSB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mDQordnNleHRjb21wLg0KKw0KK0J1aWxkaW5nIFB5dGhvbiBVc2luZyB0aGUgZnJlZSBNUyBUb29sa2l0IENvbXBpbGVyDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGUgYnVpbGQgcHJvY2VzcyBmb3IgVmlzdWFsIEMrKyBjYW4gYmUgdXNlZCBhbG1vc3QgdW5jaGFuZ2VkIHdpdGggdGhlIGZyZWUgTVMNCitUb29sa2l0IENvbXBpbGVyLiBUaGlzIHByb3ZpZGVzIGEgd2F5IG9mIGJ1aWxkaW5nIFB5dGhvbiB1c2luZyBmcmVlbHkNCithdmFpbGFibGUgc29mdHdhcmUuDQorDQorUmVxdWlyZW1lbnRzDQorDQorICAgIFRvIGJ1aWxkIFB5dGhvbiwgdGhlIGZvbGxvd2luZyB0b29scyBhcmUgcmVxdWlyZWQ6DQorDQorICAgICogVGhlIFZpc3VhbCBDKysgVG9vbGtpdCBDb21waWxlcg0KKyAgICAgICAgZnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3Zpc3VhbGMvdmN0b29sa2l0MjAwMy8NCisgICAgKiBBIHJlY2VudCBQbGF0Zm9ybSBTREsNCisgICAgICAgIGZyb20gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy9kZXRhaWxzLmFzcHg/RmFtaWx5SUQ9NDg0MjY5ZTItM2I4OS00N2UzLThlYjctMWYyYmU2ZDcxMjNhDQorICAgICogVGhlIC5ORVQgMS4xIFNESw0KKyAgICAgICAgZnJvbSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZG93bmxvYWRzL2RldGFpbHMuYXNweD9GYW1pbHlJRD05YjNhMmNhNi0zNjQ3LTQwNzAtOWY0MS1hMzMzYzZiOTE4MWQNCisNCisgICAgW0RvZXMgYW55b25lIGhhdmUgYmV0dGVyIFVSTHMgZm9yIHRoZSBsYXN0IDIgb2YgdGhlc2U/XQ0KKw0KKyAgICBUaGUgdG9vbGtpdCBjb21waWxlciBpcyBuZWVkZWQgYXMgaXQgaXMgYW4gb3B0aW1pc2luZyBjb21waWxlciAodGhlDQorICAgIGNvbXBpbGVyIHN1cHBsaWVkIHdpdGggdGhlIC5ORVQgU0RLIGlzIGEgbm9uLW9wdGltaXNpbmcgdmVyc2lvbikuIFRoZQ0KKyAgICBwbGF0Zm9ybSBTREsgaXMgbmVlZGVkIHRvIHByb3ZpZGUgdGhlIFdpbmRvd3MgaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXMNCisgICAgKHRoZSBXaW5kb3dzIDIwMDMgU2VydmVyIFNQMSBlZGl0aW9uLCB0eXBpY2FsIGluc3RhbGwsIGlzIGtub3duIHRvIHdvcmsgLQ0KKyAgICBvdGhlciBjb25maWd1cmF0aW9ucyBvciB2ZXJzaW9ucyBhcmUgcHJvYmFibHkgZmluZSBhcyB3ZWxsKS4gVGhlIC5ORVQgMS4xDQorICAgIFNESyBpcyBuZWVkZWQgYmVjYXVzZSBpdCBjb250YWlucyBhIHZlcnNpb24gb2YgbXN2Y3J0LmRsbCB3aGljaCBsaW5rcyB0bw0KKyAgICB0aGUgbXN2Y3I3MS5kbGwgQ1JULiBOb3RlIHRoYXQgdGhlIC5ORVQgMi4wIFNESyBpcyBOT1QgYWNjZXB0YWJsZSwgYXMgaXQNCisgICAgcmVmZXJlbmNlcyBtc3ZjcjgwLmRsbC4NCisNCisgICAgQWxsIG9mIHRoZSBhYm92ZSBpdGVtcyBzaG91bGQgYmUgaW5zdGFsbGVkIGFzIG5vcm1hbC4NCisNCisgICAgSWYgeW91IGludGVuZCB0byBidWlsZCB0aGUgb3BlbnNzbCAobmVlZGVkIGZvciB0aGUgX3NzbCBleHRlbnNpb24pIHlvdQ0KKyAgICB3aWxsIG5lZWQgdGhlIEMgcnVudGltZSBzb3VyY2VzIGluc3RhbGxlZCBhcyBwYXJ0IG9mIHRoZSBwbGF0Zm9ybSBTREsuDQorDQorICAgIEluIGFkZGl0aW9uLCB5b3Ugd2lsbCBuZWVkIE5hbnQsIGF2YWlsYWJsZSBmcm9tDQorICAgIGh0dHA6Ly9uYW50LnNvdXJjZWZvcmdlLm5ldC4gVGhlIDAuODUgcmVsZWFzZSBjYW5kaWRhdGUgMyB2ZXJzaW9uIGlzIGtub3duDQorICAgIHRvIHdvcmsuIFRoaXMgaXMgdGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcuIExhdGVyDQorICAgICJuaWdodGx5IGJ1aWxkIiB2ZXJzaW9ucyBhcmUga25vd24gTk9UIHRvIHdvcmsgLSBpdCBpcyBub3QgY2xlYXIgYXQNCisgICAgcHJlc2VudCB3aGV0aGVyIGZ1dHVyZSByZWxlYXNlZCB2ZXJzaW9ucyB3aWxsIHdvcmsuDQorDQorU2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnQNCisNCisgICAgU3RhcnQgYSBwbGF0Zm9ybSBTREsgImJ1aWxkIGVudmlyb25tZW50IHdpbmRvdyIgZnJvbSB0aGUgc3RhcnQgbWVudS4gVGhlDQorICAgICJXaW5kb3dzIFhQIDMyLWJpdCByZXRhaWwiIHZlcnNpb24gaXMga25vd24gdG8gd29yay4NCisNCisgICAgQWRkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMgdG8geW91ciBQQVRIOg0KKyAgICAgICAgKiBUaGUgdG9vbGtpdCBjb21waWxlciBkaXJlY3RvcnkNCisgICAgICAgICogVGhlIFNESyAiV2luNjQiIGJpbmFyaWVzIGRpcmVjdG9yeQ0KKwkqIFRoZSBOYW50IGRpcmVjdG9yeQ0KKyAgICBBZGQgdG8geW91ciBJTkNMVURFIGVudmlyb25tZW50IHZhcmlhYmxlOg0KKyAgICAgICAgKiBUaGUgdG9vbGtpdCBjb21waWxlciBJTkNMVURFIGRpcmVjdG9yeQ0KKyAgICBBZGQgdG8geW91ciBMSUIgZW52aXJvbm1lbnQgdmFyaWFibGU6DQorICAgICAgICAqIFRoZSB0b29sa2l0IGNvbXBpbGVyIExJQiBkaXJlY3RvcnkNCisJKiBUaGUgLk5FVCBTREsgVmlzdWFsIFN0dWRpbyAyMDAzIFZDN1xsaWIgZGlyZWN0b3J5DQorDQorICAgIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgc2hvdWxkIHNldCB0aGluZ3MgdXAgYXMgeW91IG5lZWQgdGhlbToNCisNCisgICAgICAgIHJlbSBTZXQgdGhlc2UgdmFsdWVzIGFjY29yZGluZyB0byB3aGVyZSB5b3UgaW5zdGFsbGVkIHRoZSBzb2Z0d2FyZQ0KKyAgICAgICAgc2V0IFRPT0xLSVQ9QzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgVmlzdWFsIEMrKyBUb29sa2l0IDIwMDMNCisgICAgICAgIHNldCBTREs9QzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgUGxhdGZvcm0gU0RLDQorICAgICAgICBzZXQgTkVUPUM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzDQorICAgICAgICBzZXQgTkFOVD1DOlxVdGlsc1xOYW50DQorDQorICAgICAgICBzZXQgUEFUSD0lVE9PTEtJVCVcYmluOyVQQVRIJTslU0RLJVxCaW5cd2luNjQ7JU5BTlQlXGJpbg0KKyAgICAgICAgc2V0IElOQ0xVREU9JVRPT0xLSVQlXGluY2x1ZGU7JUlOQ0xVREUlDQorICAgICAgICBzZXQgTElCPSVUT09MS0lUJVxsaWI7JU5FVCVcVkM3XGxpYjslTElCJQ0KKw0KKyAgICBUaGUgIndpbjY0IiBkaXJlY3RvcnkgZnJvbSB0aGUgU0RLIGlzIGFkZGVkIHRvIHN1cHBseSBleGVjdXRhYmxlcyBzdWNoIGFzDQorICAgICJjdnRyZXMiIGFuZCAibGliIiwgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgZWxzZXdoZXJlLiBUaGUgdmVyc2lvbnMgaW4gdGhlDQorICAgICJ3aW42NCIgZGlyZWN0b3J5IGFyZSAzMi1iaXQgcHJvZ3JhbXMsIHNvIHRoZXkgYXJlIGZpbmUgdG8gdXNlIGhlcmUuDQorDQorICAgIFRoYXQncyBpdC4gVG8gYnVpbGQgUHl0aG9uICh0aGUgY29yZSBvbmx5LCBubyBiaW5hcnkgZXh0ZW5zaW9ucyB3aGljaA0KKyAgICBkZXBlbmQgb24gZXh0ZXJuYWwgbGlicmFyaWVzKSB5b3UganVzdCBuZWVkIHRvIGlzc3VlIHRoZSBjb21tYW5kDQorDQorICAgICAgICBuYW50IC1idWlsZGZpbGU6cHl0aG9uLmJ1aWxkIGFsbA0KKw0KKyAgICBmcm9tIHdpdGhpbiB0aGUgUENCdWlsZCBkaXJlY3RvcnkuDQorDQorRXh0ZW5zaW9uIG1vZHVsZXMNCisNCisgICAgVG8gYnVpbGQgdGhvc2UgZXh0ZW5zaW9uIG1vZHVsZXMgd2hpY2ggcmVxdWlyZSBleHRlcm5hbCBsaWJyYXJpZXMNCisgICAgKF90a2ludGVyLCBiejIsIF9ic2RkYiwgX3NxbGl0ZTMsIF9zc2wpIHlvdSBjYW4gZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMNCisgICAgZm9yIHRoZSBWaXN1YWwgU3R1ZGlvIGJ1aWxkIGFib3ZlLCB3aXRoIGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMuIFRoZXNlDQorICAgIGluc3RydWN0aW9ucyBoYXZlIG9ubHkgYmVlbiB0ZXN0ZWQgdXNpbmcgdGhlIHNvdXJjZXMgaW4gdGhlIFB5dGhvbg0KKyAgICBzdWJ2ZXJzaW9uIHJlcG9zaXRvcnkgLSBidWlsZGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZXMgc2hvdWxkIHdvcmssIGJ1dA0KKyAgICBoYXMgbm90IGJlZW4gdGVzdGVkLg0KKw0KKyAgICBGb3IgZWFjaCBleHRlbnNpb24gbW9kdWxlIHlvdSB3aXNoIHRvIGJ1aWxkLCB5b3Ugc2hvdWxkIHJlbW92ZSB0aGUNCisgICAgYXNzb2NpYXRlZCBpbmNsdWRlIGxpbmUgZnJvbSB0aGUgZXhjbHVkZXByb2plY3RzIHNlY3Rpb24gb2YgcGMuYnVpbGQuDQorDQorICAgIFRoZSBjaGFuZ2VzIHJlcXVpcmVkIGFyZToNCisNCisgICAgX3RraW50ZXINCisgICAgICAgIFRoZSB0aXggbWFrZWZpbGUgKHRpeC04LjQuMFx3aW5cbWFrZWZpbGUudmMpIG11c3QgYmUgbW9kaWZpZWQgdG8NCisJcmVtb3ZlIHJlZmVyZW5jZXMgdG8gVE9PTFMzMi4gVGhlIHJlbGV2YW50IGxpbmVzIHNob3VsZCBiZSBjaGFuZ2VkIHRvDQorCXJlYWQ6DQorICAgICAgICAgICAgY2MzMiA9IGNsLmV4ZQ0KKyAgICAgICAgICAgIGxpbmszMiA9IGxpbmsuZXhlDQorICAgICAgICAgICAgaW5jbHVkZTMyID0gDQorCVRoZSByZW1haW5kZXIgb2YgdGhlIGJ1aWxkIGluc3RydWN0aW9ucyB3aWxsIHdvcmsgYXMgZ2l2ZW4uDQorDQorICAgIGJ6Mg0KKyAgICAgICAgTm8gY2hhbmdlcyBhcmUgbmVlZGVkDQorDQorICAgIF9ic2RkYg0KKyAgICAgICAgVGhlIGZpbGUgZGIuYnVpbGQgc2hvdWxkIGJlIGNvcGllZCBmcm9tIHRoZSBQeXRob24gUENCdWlsZCBkaXJlY3RvcnkNCisJdG8gdGhlIGRpcmVjdG9yeSBkYi00LjQuMjBcYnVpbGRfd2luMzIuDQorDQorCVRoZSBmaWxlIGRiX3N0YXRpYy52Y3Byb2ogaW4gZGItNC40LjIwXGJ1aWxkX3dpbjMyIHNob3VsZCBiZSBlZGl0ZWQgdG8NCisJcmVtb3ZlIHRoZSBzdHJpbmcgIiQoU29sdXRpb25EaXIpIiAtIHRoaXMgb2NjdXJzIGluIDIgcGxhY2VzLCBvbmx5DQorCXJlbGV2YW50IGZvciA2NC1iaXQgYnVpbGRzLiAoVGhlIGVkaXQgaXMgcmVxdWlyZWQgYXMgb3RoZXJ3aXNlLCBuYW50DQorCXdhbnRzIHRvIHJlYWQgdGhlIHNvbHV0aW9uIGZpbGUsIHdoaWNoIGlzIG5vdCBpbiBhIHN1aXRhYmxlIGZvcm0pLg0KKw0KKwlUaGUgYnNkZGIgbGlicmFyeSBjYW4gdGhlbiBiZSBidWlsZCB3aXRoIHRoZSBjb21tYW5kDQorCSAgICBuYW50IC1idWlsZGZpbGU6ZGIuYnVpbGQgYWxsDQorCXJ1biBmcm9tIHRoZSBkYi00LjQuMjBcYnVpbGRfd2luMzIgZGlyZWN0b3J5Lg0KKw0KKyAgICBfc3FsaXRlMw0KKyAgICAgICAgTm8gY2hhbmdlcyBhcmUgbmVlZGVkLiBIb3dldmVyLCBpbiBvcmRlciBmb3IgdGhlIHRlc3RzIHRvIHN1Y2NlZWQsIGENCisJY29weSBvZiBzcWxpdGUzLmRsbCBtdXN0IGJlIGRvd25sb2FkZWQsIGFuZCBwbGFjZWQgYWxvbmdzaWRlDQorCXB5dGhvbi5leGUuDQorDQorICAgIF9zc2wNCisgICAgICAgIFRoZSBkb2N1bWVudGVkIGJ1aWxkIHByb2Nlc3Mgd29ya3MgYXMgd3JpdHRlbi4gSG93ZXZlciwgaXQgbmVlZHMgYQ0KKwljb3B5IG9mIHRoZSBmaWxlIHNldGFyZ3Yub2JqLCB3aGljaCBpcyBub3Qgc3VwcGxpZWQgaW4gdGhlIHBsYXRmb3JtDQorCVNESy4gSG93ZXZlciwgdGhlIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSAoaW4gdGhlIGNydCBzb3VyY2UgY29kZSkuIFRvDQorCWJ1aWxkIHNldGFyZ3Yub2JqLCBwcm9jZWVkIGFzIGZvbGxvd3M6DQorDQorICAgICAgICBDb3B5IHNldGFyZ3YuYywgY3J1bnRpbWUuaCBhbmQgaW50ZXJuYWwuaCBmcm9tICVTREslXHNyY1xjcnQgdG8gYQ0KKwl0ZW1wb3JhcnkgZGlyZWN0b3J5Lg0KKwlDb21waWxlIHVzaW5nICJjbCAvYyAvSS4gL01EIC9EX0NSVEJMRCBzZXRhcmd2LmMiDQorCUNvcHkgdGhlIHJlc3VsdGluZyBzZXRhcmd2Lm9iaiB0byBzb21ld2hlcmUgb24geW91ciBMSUIgZW52aXJvbm1lbnQNCisJKCVTREslXGxpYiBpcyBhIHJlYXNvbmFibGUgcGxhY2UpLg0KKw0KKwlXaXRoIHNldGFyZ3Yub2JqIGluIHBsYWNlLCB0aGUgc3RhbmRhcmQgYnVpbGQgcHJvY2VzcyBzaG91bGQgd29yaw0KKwlmaW5lLg0KKw0KK1lPVVIgT1dOIEVYVEVOU0lPTiBETExzDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitJZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gZXh0ZW5zaW9uIG1vZHVsZSBETEwsIHRoZXJlJ3MgYW4gZXhhbXBsZQ0KK3dpdGggZWFzeS10by1mb2xsb3cgaW5zdHJ1Y3Rpb25zIGluIC4uL1BDL2V4YW1wbGUvOyByZWFkIHRoZSBmaWxlDQorcmVhZG1lLnR4dCB0aGVyZSBmaXJzdC4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkOC9ybXB5Yy5weSBiL1BDYnVpbGQ4L3JtcHljLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZGUwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9ybXB5Yy5weQpAQCAtMCwwICsxLDI1IEBACisjIFJlbW92ZSBhbGwgdGhlIC5weWMgYW5kIC5weW8gZmlsZXMgdW5kZXIgLi4vTGliLg0KKw0KKw0KK2RlZiBkZWx0cmVlKHJvb3QpOg0KKyAgICBpbXBvcnQgb3MNCisgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBqb2luDQorDQorICAgIG5weWMgPSBucHlvID0gMA0KKyAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayhyb290KToNCisgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOg0KKyAgICAgICAgICAgIGRlbGV0ZSA9IEZhbHNlDQorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5YycpOg0KKyAgICAgICAgICAgICAgICBkZWxldGUgPSBUcnVlDQorICAgICAgICAgICAgICAgIG5weWMgKz0gMQ0KKyAgICAgICAgICAgIGVsaWYgbmFtZS5lbmRzd2l0aCgnLnB5bycpOg0KKyAgICAgICAgICAgICAgICBkZWxldGUgPSBUcnVlDQorICAgICAgICAgICAgICAgIG5weW8gKz0gMQ0KKw0KKyAgICAgICAgICAgIGlmIGRlbGV0ZToNCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGpvaW4ocm9vdCwgbmFtZSkpDQorDQorICAgIHJldHVybiBucHljLCBucHlvDQorDQorbnB5YywgbnB5byA9IGRlbHRyZWUoIi4uL0xpYiIpDQorcHJpbnQgbnB5YywgIi5weWMgZGVsZXRlZCwiLCBucHlvLCAiLnB5byBkZWxldGVkIg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L3J0LmJhdCBiL1BDYnVpbGQ4L3J0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTBhYmEzCi0tLSAvZGV2L251bGwKKysrIGIvUENidWlsZDgvcnQuYmF0CkBAIC0wLDAgKzEsNTIgQEAKK0BlY2hvIG9mZg0KK3JlbSBSdW4gVGVzdHMuICBSdW4gdGhlIHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZS4NCityZW0gVXNhZ2U6ICBydCBbLWRdIFstT10gWy1xXSByZWdydGVzdF9hcmdzDQorcmVtIC1kICAgUnVuIERlYnVnIGJ1aWxkIChweXRob25fZC5leGUpLiAgRWxzZSByZWxlYXNlIGJ1aWxkLg0KK3JlbSAtTyAgIFJ1biBweXRob24uZXhlIG9yIHB5dGhvbl9kLmV4ZSAoc2VlIC1kKSB3aXRoIC1PLg0KK3JlbSAtcSAgICJxdWljayIgLS0gbm9ybWFsbHkgdGhlIHRlc3RzIGFyZSBydW4gdHdpY2UsIHRoZSBmaXJzdCB0aW1lDQorcmVtICAgICAgYWZ0ZXIgZGVsZXRpbmcgYWxsIHRoZSAucHlbY29dIGZpbGVzIHJlYWNoYWJsZSBmcm9tIExpYi8uDQorcmVtICAgICAgLXEgcnVucyB0aGUgdGVzdHMganVzdCBvbmNlLCBhbmQgd2l0aG91dCBkZWxldGluZyAucHlbY29dIGZpbGVzLg0KK3JlbSBBbGwgbGVhZGluZyBpbnN0YW5jZXMgb2YgdGhlc2Ugc3dpdGNoZXMgYXJlIHNoaWZ0ZWQgb2ZmLCBhbmQNCityZW0gd2hhdGV2ZXIgcmVtYWlucyBpcyBwYXNzZWQgdG8gcmVncnRlc3QucHkuICBGb3IgZXhhbXBsZSwNCityZW0gICAgIHJ0IC1PIC1kIC14IHRlc3RfdGhyZWFkDQorcmVtIHJ1bnMNCityZW0gICAgIHB5dGhvbl9kIC1PIC4uL2xpYi90ZXN0L3JlZ3J0ZXN0LnB5IC14IHRlc3RfdGhyZWFkDQorcmVtIHR3aWNlLCBhbmQNCityZW0gICAgIHJ0IC1xIC1nIHRlc3RfYmluYXNjaWkNCityZW0gcnVucw0KK3JlbSAgICAgcHl0aG9uX2QgLi4vbGliL3Rlc3QvcmVncnRlc3QucHkgLWcgdGVzdF9iaW5hc2NpaQ0KK3JlbSB0byBnZW5lcmF0ZSB0aGUgZXhwZWN0ZWQtb3V0cHV0IGZpbGUgZm9yIGJpbmFzY2lpIHF1aWNrbHkuDQorcmVtDQorcmVtIENvbmZ1c2luZzogIGlmIHlvdSB3YW50IHRvIHBhc3MgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgbGlrZQ0KK3JlbSAgICAgLXUgbmV0d29yayxsYXJnZWZpbGUNCityZW0gdGhlbiB5b3UgaGF2ZSB0byBxdW90ZSBpdCBvbiB0aGUgcnQgbGluZSwgbGlrZQ0KK3JlbSAgICAgcnQgLXUgIm5ldHdvcmssbGFyZ2VmaWxlIg0KKw0KK3NldGxvY2FsDQorDQorc2V0IGV4ZT1weXRob24NCitzZXQgcW1vZGU9DQorc2V0IGRhc2hPPQ0KK1BBVEggJVBBVEglOy4uXC4uXHRjbHRrXGJpbg0KKw0KKzpDaGVja09wdHMNCitpZiAiJTEiPT0iLU8iIChzZXQgZGFzaE89LU8pICAgICAmIHNoaWZ0ICYgZ290byBDaGVja09wdHMNCitpZiAiJTEiPT0iLXEiIChzZXQgcW1vZGU9eWVzKSAgICAmIHNoaWZ0ICYgZ290byBDaGVja09wdHMNCitpZiAiJTEiPT0iLWQiIChzZXQgZXhlPXB5dGhvbl9kKSAmIHNoaWZ0ICYgZ290byBDaGVja09wdHMNCisNCitzZXQgY21kPSVleGUlICVkYXNoTyUgLUUgLXR0IC4uL2xpYi90ZXN0L3JlZ3J0ZXN0LnB5ICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQoraWYgZGVmaW5lZCBxbW9kZSBnb3RvIFFtb2RlDQorDQorZWNobyBEZWxldGluZyAucHljLy5weW8gZmlsZXMgLi4uDQorJWV4ZSUgcm1weWMucHkNCisNCitlY2hvIG9uDQorJWNtZCUNCitAZWNobyBvZmYNCisNCitlY2hvIEFib3V0IHRvIHJ1biBhZ2FpbiB3aXRob3V0IGRlbGV0aW5nIC5weWMvLnB5byBmaXJzdDoNCitwYXVzZQ0KKw0KKzpRbW9kZQ0KK2VjaG8gb24NCislY21kJQ0KZGlmZiAtLWdpdCBhL1BDYnVpbGQ4L3NlbGVjdC52Y3Byb2ogYi9QQ2J1aWxkOC9zZWxlY3QudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMDVjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC9zZWxlY3QudmNwcm9qCkBAIC0wLDAgKzEsMzgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCis8VmlzdWFsU3R1ZGlvUHJvamVjdA0KKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCisJVmVyc2lvbj0iOCwwMCINCisJTmFtZT0ic2VsZWN0Ig0KKwlQcm9qZWN0R1VJRD0iezk3MjM5QTU2LURCQzAtNDFEMi1CQzE0LUM4N0Q5Qjk3RDYzQn0iDQorCT4NCisJPFBsYXRmb3Jtcz4NCisJCTxQbGF0Zm9ybQ0KKwkJCU5hbWU9IldpbjMyIg0KKwkJLz4NCisJPC9QbGF0Zm9ybXM+DQorCTxUb29sRmlsZXM+DQorCTwvVG9vbEZpbGVzPg0KKwk8Q29uZmlndXJhdGlvbnM+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4Ni10ZW1wLXJlbGVhc2Vcc2VsZWN0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIyIg0KKwkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cSW5jbHVkZSwuLlxQQyINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfV0lORE9XUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJUnVudGltZUxpYnJhcnk9IjIiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJCUNvbXBpbGVBcz0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id3NvY2szMi5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vc2VsZWN0LnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmMiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3NlbGVjdC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxMTAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9zZWxlY3QubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcc2VsZWN0Ig0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19XSU5ET1dTIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Indzb2NrMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3NlbGVjdF9kLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUlnbm9yZURlZmF1bHRMaWJyYXJ5TmFtZXM9ImxpYmMsbXN2Y3J0Ig0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9zZWxlY3RfZC5wZGIiDQorCQkJCVN1YlN5c3RlbT0iMiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxMTAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi9zZWxlY3RfZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVxzZWxlY3QiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19JVEFOSVVNIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6SUE2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Indzb2NrMzIubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3NlbGVjdC5weWQiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlJZ25vcmVEZWZhdWx0TGlicmFyeU5hbWVzPSJsaWJjIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi9zZWxlY3QucGRiIg0KKwkJCQlTdWJTeXN0ZW09IjIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTEwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vc2VsZWN0LmxpYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZUFNRDY0fFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9ImFtZDY0LXRlbXAtcmVsZWFzZVxzZWxlY3QiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19PUFRFUk9OIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3c29jazMyLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi9zZWxlY3QucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJSWdub3JlRGVmYXVsdExpYnJhcnlOYW1lcz0ibGliYyINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vc2VsZWN0LnBkYiINCisJCQkJU3ViU3lzdGVtPSIyIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDExMDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL3NlbGVjdC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXHNlbGVjdG1vZHVsZS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvdW5pY29kZWRhdGEudmNwcm9qIGIvUENidWlsZDgvdW5pY29kZWRhdGEudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDQxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC91bmljb2RlZGF0YS52Y3Byb2oKQEAgLTAsMCArMSwzNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LDAwIg0KKwlOYW1lPSJ1bmljb2RlZGF0YSINCisJUHJvamVjdEdVSUQ9IntGQTVGQzdFQi1DNzJGLTQxNUYtQUU0Mi05MURENjA1QUJEREF9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1yZWxlYXNlXHVuaWNvZGVkYXRhIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtNTUFQX0VYUE9SVFMiDQorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii4vdW5pY29kZWRhdGEucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3VuaWNvZGVkYXRhLnBkYiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxMjAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi91bmljb2RlZGF0YS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1kZWJ1Z1x1bmljb2RlZGF0YSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjAiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtNTUFQX0VYUE9SVFMiDQorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCisJCQkJUnVudGltZUxpYnJhcnk9IjMiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3VuaWNvZGVkYXRhX2QucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vdW5pY29kZWRhdGFfZC5wZGIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTIwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vdW5pY29kZWRhdGFfZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVx1bmljb2RlZGF0YSINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19JVEFOSVVNIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TU1BUF9FWFBPUlRTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6SUE2NCAvVVNFTElOSzpNU19TREsiDQorCQkJCU91dHB1dEZpbGU9Ii4vdW5pY29kZWRhdGEucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3VuaWNvZGVkYXRhLnBkYiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxMjAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi91bmljb2RlZGF0YS5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJhbWQ2NC10ZW1wLXJlbGVhc2VcdW5pY29kZWRhdGEiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiAvR1MtIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7TU1BUF9FWFBPUlRTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjAiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJmYWxzZSINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxPcHRpb25zPSIgL01BQ0hJTkU6QU1ENjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3VuaWNvZGVkYXRhLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi91bmljb2RlZGF0YS5wZGIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTIwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vdW5pY29kZWRhdGEubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1x1bmljb2RlZGF0YS5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvdzl4cG9wZW4udmNwcm9qIGIvUENidWlsZDgvdzl4cG9wZW4udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjZiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC93OXhwb3Blbi52Y3Byb2oKQEAgLTAsMCArMSwxODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LDAwIg0KKwlOYW1lPSJ3OXhwb3BlbiINCisJUHJvamVjdEdVSUQ9IntFOUUwQTFGNi0wMDA5LTRFOEMtQjhGOC0xQjhGNUQ0OUEwNTh9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcdzl4cG9wZW4iDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTIg0KKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCU91dHB1dEZpbGU9Ii4vdzl4cG9wZW5fZC5leGUiDQorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi93OXhwb3Blbl9kLnBkYiINCisJCQkJVGFyZ2V0TWFjaGluZT0iMSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCTwvQ29uZmlndXJhdGlvbj4NCisJCTxDb25maWd1cmF0aW9uDQorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtcmVsZWFzZVx3OXhwb3BlbiINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCINCisJCQkJT3V0cHV0RmlsZT0iLlwuL3c5eHBvcGVuLmV4ZSINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi93OXhwb3Blbi5wZGIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCTwvQ29uZmlndXJhdGlvbnM+DQorCTxSZWZlcmVuY2VzPg0KKwk8L1JlZmVyZW5jZXM+DQorCTxGaWxlcz4NCisJCTxGaWxlDQorCQkJUmVsYXRpdmVQYXRoPSIuLlxQQ1x3OXhwb3Blbi5jIg0KKwkJCT4NCisJCTwvRmlsZT4NCisJPC9GaWxlcz4NCisJPEdsb2JhbHM+DQorCTwvR2xvYmFscz4NCis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvUENidWlsZDgvd2luc291bmQudmNwcm9qIGIvUENidWlsZDgvd2luc291bmQudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MGU4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9QQ2J1aWxkOC93aW5zb3VuZC52Y3Byb2oKQEAgLTAsMCArMSwzNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0DQorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KKwlWZXJzaW9uPSI4LDAwIg0KKwlOYW1lPSJ3aW5zb3VuZCINCisJUHJvamVjdEdVSUQ9Ins1MUYzNUZBRS1GQjkyLTRCMkMtOTE4Ny0xNTQyQzA2NUFENzd9Ig0KKwk+DQorCTxQbGF0Zm9ybXM+DQorCQk8UGxhdGZvcm0NCisJCQlOYW1lPSJXaW4zMiINCisJCS8+DQorCTwvUGxhdGZvcm1zPg0KKwk8VG9vbEZpbGVzPg0KKwk8L1Rvb2xGaWxlcz4NCisJPENvbmZpZ3VyYXRpb25zPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLiINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2LXRlbXAtZGVidWdcd2luc291bmQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJT3B0aW1pemF0aW9uPSIwIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7V0lOU09VTkRfRVhQT1JUUyINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMyINCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiDQorCQkJCVdhcm5pbmdMZXZlbD0iMyINCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KKwkJCQlDb21waWxlQXM9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9Indpbm1tLmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi93aW5zb3VuZF9kLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3dpbnNvdW5kX2QucGRiIg0KKwkJCQlCYXNlQWRkcmVzcz0iMHgxRDE2MDAwMCINCisJCQkJSW1wb3J0TGlicmFyeT0iLlwuL3dpbnNvdW5kX2QubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwkJPENvbmZpZ3VyYXRpb24NCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODYtdGVtcC1yZWxlYXNlXHdpbnNvdW5kIg0KKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCisJCQlVc2VPZk1GQz0iMCINCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQorCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCT4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNSURMVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCU9wdGltaXphdGlvbj0iMiINCisJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXEluY2x1ZGUsLi5cUEMiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtXSU5TT1VORF9FWFBPUlRTIg0KKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIg0KKwkJCQlXYXJuaW5nTGV2ZWw9IjMiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3aW5tbS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vd2luc291bmQucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3dpbnNvdW5kLnBkYiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxNjAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi93aW5zb3VuZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjEiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VJdGFuaXVtfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLlwuIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlxpYTY0LXRlbXAtcmVsZWFzZVx3aW5zb3VuZCINCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJVXNlT2ZNRkM9IjAiDQorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KKwkJCUNoYXJhY3RlclNldD0iMiINCisJCQk+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTUlETFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9VU0VDTDpNU19JVEFOSVVNIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7V0lOU09VTkRfRVhQT1JUUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOklBNjQgL1VTRUxJTks6TVNfU0RLIg0KKwkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3aW5tbS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4vd2luc291bmQucHlkIg0KKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL3dpbnNvdW5kLnBkYiINCisJCQkJQmFzZUFkZHJlc3M9IjB4MUQxNjAwMDAiDQorCQkJCUltcG9ydExpYnJhcnk9Ii5cLi93aW5zb3VuZC5saWIiDQorCQkJCVRhcmdldE1hY2hpbmU9IjAiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KKwkJCS8+DQorCQk8L0NvbmZpZ3VyYXRpb24+DQorCQk8Q29uZmlndXJhdGlvbg0KKwkJCU5hbWU9IlJlbGVhc2VBTUQ2NHxXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4iDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSJhbWQ2NC10ZW1wLXJlbGVhc2Vcd2luc291bmQiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KKwkJCVVzZU9mTUZDPSIwIg0KKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCisJCQlDaGFyYWN0ZXJTZXQ9IjIiDQorCQkJPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01JRExUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJQWRkaXRpb25hbE9wdGlvbnM9IiAvVVNFQ0w6TVNfT1BURVJPTiAvR1MtIg0KKwkJCQlPcHRpbWl6YXRpb249IjIiDQorCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlxJbmNsdWRlLC4uXFBDIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7V0lOU09VTkRfRVhQT1JUUyINCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIwIg0KKwkJCQlSdW50aW1lTGlicmFyeT0iMiINCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0iZmFsc2UiDQorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KKwkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMCINCisJCQkJV2FybmluZ0xldmVsPSIzIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCURldGVjdDY0Qml0UG9ydGFiaWxpdHlQcm9ibGVtcz0idHJ1ZSINCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCisJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KKwkJCQlBZGRpdGlvbmFsT3B0aW9ucz0iIC9NQUNISU5FOkFNRDY0IC9VU0VMSU5LOk1TX1NESyINCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0id2lubW0ubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuL3dpbnNvdW5kLnB5ZCINCisJCQkJTGlua0luY3JlbWVudGFsPSIxIg0KKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5cLi93aW5zb3VuZC5wZGIiDQorCQkJCUJhc2VBZGRyZXNzPSIweDFEMTYwMDAwIg0KKwkJCQlJbXBvcnRMaWJyYXJ5PSIuXC4vd2luc291bmQubGliIg0KKwkJCQlUYXJnZXRNYWNoaW5lPSIwIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KKwkJCS8+DQorCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCisJCQkvPg0KKwkJPC9Db25maWd1cmF0aW9uPg0KKwk8L0NvbmZpZ3VyYXRpb25zPg0KKwk8UmVmZXJlbmNlcz4NCisJPC9SZWZlcmVuY2VzPg0KKwk8RmlsZXM+DQorCQk8RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cUENcd2luc291bmQuYyINCisJCQk+DQorCQk8L0ZpbGU+DQorCTwvRmlsZXM+DQorCTxHbG9iYWxzPg0KKwk8L0dsb2JhbHM+DQorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXRvay5jIGIvUGFyc2VyL3BhcnNldG9rLmMKaW5kZXggZGJhYzZlMy4uYTI3NTc1YyAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNldG9rLmMKKysrIGIvUGFyc2VyL3BhcnNldG9rLmMKQEAgLTE5MCw4ICsxOTAsMTAgQEAKIAkJICAgICBQeVBhcnNlcl9BZGRUb2tlbihwcywgKGludCl0eXBlLCBzdHIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5saW5lbm8sIGNvbF9vZmZzZXQsCiAJCQkJICAgICAgICYoZXJyX3JldC0+ZXhwZWN0ZWQpKSkgIT0gRV9PSykgewotCQkJaWYgKGVycl9yZXQtPmVycm9yICE9IEVfRE9ORSkKKwkJCWlmIChlcnJfcmV0LT5lcnJvciAhPSBFX0RPTkUpIHsKIAkJCQlQeU9iamVjdF9GUkVFKHN0cik7CisJCQkJZXJyX3JldC0+dG9rZW4gPSB0eXBlOworCQkJfQkJCQkKIAkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2FzdC5jIGIvUHl0aG9uL2FzdC5jCmluZGV4IDBiM2I0ODUuLmYzZTYxMWIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9hc3QuYworKysgYi9QeXRob24vYXN0LmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCVB5X0RFQ1JFRihlcnJzdHIpOwogCXJldHVybjsKICAgICB9Ci0gICAgdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCIoT08pIiwgZXJyc3RyLCB0bXApOworICAgIHZhbHVlID0gUHlUdXBsZV9QYWNrKDIsIGVycnN0ciwgdG1wKTsKICAgICBQeV9ERUNSRUYoZXJyc3RyKTsKICAgICBQeV9ERUNSRUYodG1wKTsKICAgICBpZiAoIXZhbHVlKQpAQCAtNDAxLDYgKzQwMSw5IEBACiAgICAgICAgIGNhc2UgUmVwcl9raW5kOgogICAgICAgICAgICAgZXhwcl9uYW1lID0gInJlcHIiOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSWZFeHBfa2luZDoKKyAgICAgICAgICAgIGV4cHJfbmFtZSA9ICJjb25kaXRpb25hbCBleHByZXNzaW9uIjsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnQgJWQgKGxpbmUgJWQpIiwgCkBAIC0xNzQ3LDYgKzE3NTAsMTEgQEAKIAlpZiAoVFlQRShjaCkgPT0gYXJndW1lbnQpIHsKIAkgICAgZXhwcl90eSBlOwogCSAgICBpZiAoTkNIKGNoKSA9PSAxKSB7CisJCWlmIChua2V5d29yZHMpIHsKKwkJICAgIGFzdF9lcnJvcihDSElMRChjaCwgMCksCisJCQkgICAgICAibm9uLWtleXdvcmQgYXJnIGFmdGVyIGtleXdvcmQgYXJnIik7CisJCSAgICByZXR1cm4gTlVMTDsKKwkJfQogCQllID0gYXN0X2Zvcl9leHByKGMsIENISUxEKGNoLCAwKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTMwMzQsNyArMzA0Miw3IEBACiAJCQlpZiAoKnMgJiAweDgwKSB7IC8qIFhYWCBpbmVmZmljaWVudCAqLwogCQkJCVB5T2JqZWN0ICp3OwogCQkJCWNoYXIgKnI7Ci0JCQkJaW50IHJuLCBpOworCQkJCVB5X3NzaXplX3Qgcm4sIGk7CiAJCQkJdyA9IGRlY29kZV91dGY4KCZzLCBlbmQsICJ1dGYtMTYtYmUiKTsKIAkJCQlpZiAodyA9PSBOVUxMKSB7CiAJCQkJCVB5X0RFQ1JFRih1KTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKaW5kZXggNTRlOGZlOC4uOGYxZjQ2NCAxMDA2NDQKLS0tIGEvUHl0aG9uL2JsdGlubW9kdWxlLmMKKysrIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKQEAgLTEyNjAsNiArMTI2MCwxOCBAQAogCiAKIHN0YXRpYyBQeU9iamVjdCAqCitidWlsdGluX29wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlyZXR1cm4gUHlPYmplY3RfQ2FsbCgoUHlPYmplY3QqKSZQeUZpbGVfVHlwZSwgYXJncywga3dkcyk7Cit9CisKK1B5RG9jX1NUUlZBUihvcGVuX2RvYywKKyJvcGVuKG5hbWVbLCBtb2RlWywgYnVmZmVyaW5nXV0pIC0+IGZpbGUgb2JqZWN0XG5cCitcblwKK09wZW4gYSBmaWxlIHVzaW5nIHRoZSBmaWxlKCkgdHlwZSwgcmV0dXJucyBhIGZpbGUgb2JqZWN0LiIpOworCisKK3N0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX29yZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QqIG9iaikKIHsKIAlsb25nIG9yZDsKQEAgLTIwODAsNiArMjA5Miw3IEBACiAgCXsibWF4IiwJCShQeUNGdW5jdGlvbilidWlsdGluX21heCwgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG1heF9kb2N9LAogIAl7Im1pbiIsCQkoUHlDRnVuY3Rpb24pYnVpbHRpbl9taW4sICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtaW5fZG9jfSwKICAJeyJvY3QiLAkJYnVpbHRpbl9vY3QsICAgICAgICBNRVRIX08sIG9jdF9kb2N9LAorIAl7Im9wZW4iLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9vcGVuLCAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBvcGVuX2RvY30sCiAgCXsib3JkIiwJCWJ1aWx0aW5fb3JkLCAgICAgICAgTUVUSF9PLCBvcmRfZG9jfSwKICAJeyJwb3ciLAkJYnVpbHRpbl9wb3csICAgICAgICBNRVRIX1ZBUkFSR1MsIHBvd19kb2N9LAogIAl7InJhbmdlIiwJYnVpbHRpbl9yYW5nZSwgICAgICBNRVRIX1ZBUkFSR1MsIHJhbmdlX2RvY30sCkBAIC0yMTQ2LDYgKzIxNTksNyBAQAogI2VuZGlmCiAJU0VUQlVJTFRJTigiZGljdCIsCQkmUHlEaWN0X1R5cGUpOwogIAlTRVRCVUlMVElOKCJlbnVtZXJhdGUiLAkJJlB5RW51bV9UeXBlKTsKKwlTRVRCVUlMVElOKCJmaWxlIiwJCSZQeUZpbGVfVHlwZSk7CiAJU0VUQlVJTFRJTigiZmxvYXQiLAkJJlB5RmxvYXRfVHlwZSk7CiAJU0VUQlVJTFRJTigiZnJvemVuc2V0IiwJCSZQeUZyb3plblNldF9UeXBlKTsKIAlTRVRCVUlMVElOKCJwcm9wZXJ0eSIsCQkmUHlQcm9wZXJ0eV9UeXBlKTsKQEAgLTIxNjIsMTAgKzIxNzYsNiBAQAogCVNFVEJVSUxUSU4oInR1cGxlIiwJCSZQeVR1cGxlX1R5cGUpOwogCVNFVEJVSUxUSU4oInR5cGUiLAkJJlB5VHlwZV9UeXBlKTsKIAlTRVRCVUlMVElOKCJ4cmFuZ2UiLAkJJlB5UmFuZ2VfVHlwZSk7Ci0KLQkvKiBOb3RlIHRoYXQgb3BlbigpIGlzIGp1c3QgYW4gYWxpYXMgb2YgZmlsZSgpLiAqLwotCVNFVEJVSUxUSU4oIm9wZW4iLAkJJlB5RmlsZV9UeXBlKTsKLQlTRVRCVUlMVElOKCJmaWxlIiwJCSZQeUZpbGVfVHlwZSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogCVNFVEJVSUxUSU4oInVuaWNvZGUiLAkJJlB5VW5pY29kZV9UeXBlKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCA2YzhhZmJhLi44MGFkYzMwIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtNiw2ICs2LDkgQEAKICAgIFhYWCBkb2N1bWVudCBpdCEKICAgICovCiAKKy8qIGVuYWJsZSBtb3JlIGFnZ3Jlc3NpdmUgaW50cmEtbW9kdWxlIG9wdGltaXphdGlvbnMsIHdoZXJlIGF2YWlsYWJsZSAqLworI2RlZmluZSBQWV9MT0NBTF9BR0dSRVNTSVZFCisKICNpbmNsdWRlICJQeXRob24uaCIKIAogI2luY2x1ZGUgImNvZGUuaCIKQEAgLTE2LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKLSNpZm5kZWYgV0lUSF9UU0MgCisjaWZuZGVmIFdJVEhfVFNDCiAKICNkZWZpbmUgUkVBRF9USU1FU1RBTVAodmFyKQogCkBAIC00MSw3ICs0NCw3IEBACiAJYXNtIHZvbGF0aWxlICgibWZ0YnUgJTAiIDogIj1yIiAodGJ1MikpOwogCWlmIChfX2J1aWx0aW5fZXhwZWN0KHRidSAhPSB0YnUyLCAwKSkgZ290byBsb29wOwogCi0JLyogVGhlIHNsaWdodGx5IHBlY3VsaWFyIHdheSBvZiB3cml0aW5nIHRoZSBuZXh0IGxpbmVzIGlzIAorCS8qIFRoZSBzbGlnaHRseSBwZWN1bGlhciB3YXkgb2Ygd3JpdGluZyB0aGUgbmV4dCBsaW5lcyBpcwogCSAgIGNvbXBpbGVkIGJldHRlciBieSBHQ0MgdGhhbiBhbnkgb3RoZXIgd2F5IEkgdHJpZWQuICovCiAJKChsb25nKikodikpWzBdID0gdGJ1OwogCSgobG9uZyopKHYpKVsxXSA9IHRiOwpAQCAtNTQsNyArNTcsNyBAQAogCiAjZW5kaWYKIAotdm9pZCBkdW1wX3RzYyhpbnQgb3Bjb2RlLCBpbnQgdGlja2VkLCB1aW50NjQgaW5zdDAsIHVpbnQ2NCBpbnN0MSwgCit2b2lkIGR1bXBfdHNjKGludCBvcGNvZGUsIGludCB0aWNrZWQsIHVpbnQ2NCBpbnN0MCwgdWludDY0IGluc3QxLAogCSAgICAgIHVpbnQ2NCBsb29wMCwgdWludDY0IGxvb3AxLCB1aW50NjQgaW50cjAsIHVpbnQ2NCBpbnRyMSkKIHsKIAl1aW50NjQgaW50ciwgaW5zdCwgbG9vcDsKQEAgLTgzLDE2ICs4NiwxNiBAQAogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogI2lmZGVmIFdJVEhfVFNDCi1zdGF0aWMgUHlPYmplY3QgKmNhbGxfZnVuY3Rpb24oUHlPYmplY3QgKioqLCBpbnQsIHVpbnQ2NCosIHVpbnQ2NCopOworc3RhdGljIFB5T2JqZWN0ICogY2FsbF9mdW5jdGlvbihQeU9iamVjdCAqKiosIGludCwgdWludDY0KiwgdWludDY0Kik7CiAjZWxzZQotc3RhdGljIFB5T2JqZWN0ICpjYWxsX2Z1bmN0aW9uKFB5T2JqZWN0ICoqKiwgaW50KTsKK3N0YXRpYyBQeU9iamVjdCAqIGNhbGxfZnVuY3Rpb24oUHlPYmplY3QgKioqLCBpbnQpOwogI2VuZGlmCi1zdGF0aWMgUHlPYmplY3QgKmZhc3RfZnVuY3Rpb24oUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBpbnQsIGludCwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqZXh0X2RvX2NhbGwoUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBpbnQsIGludCwgaW50KTsKLXN0YXRpYyBQeU9iamVjdCAqdXBkYXRlX2tleXdvcmRfYXJncyhQeU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICoqKixQeU9iamVjdCAqKTsKLXN0YXRpYyBQeU9iamVjdCAqdXBkYXRlX3N0YXJfYXJncyhpbnQsIGludCwgUHlPYmplY3QgKiwgUHlPYmplY3QgKioqKTsKLXN0YXRpYyBQeU9iamVjdCAqbG9hZF9hcmdzKFB5T2JqZWN0ICoqKiwgaW50KTsKK3N0YXRpYyBQeU9iamVjdCAqIGZhc3RfZnVuY3Rpb24oUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyBQeU9iamVjdCAqIGRvX2NhbGwoUHlPYmplY3QgKiwgUHlPYmplY3QgKioqLCBpbnQsIGludCk7CitzdGF0aWMgUHlPYmplY3QgKiBleHRfZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50LCBpbnQpOworc3RhdGljIFB5T2JqZWN0ICogdXBkYXRlX2tleXdvcmRfYXJncyhQeU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICoqKixQeU9iamVjdCAqKTsKK3N0YXRpYyBQeU9iamVjdCAqIHVwZGF0ZV9zdGFyX2FyZ3MoaW50LCBpbnQsIFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqKik7CitzdGF0aWMgUHlPYmplY3QgKiBsb2FkX2FyZ3MoUHlPYmplY3QgKioqLCBpbnQpOwogI2RlZmluZSBDQUxMX0ZMQUdfVkFSIDEKICNkZWZpbmUgQ0FMTF9GTEFHX0tXIDIKIApAQCAtMTA4LDE5ICsxMTEsMTkgQEAKIHN0YXRpYyBpbnQgbWF5YmVfY2FsbF9saW5lX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwKIAkJCQkgIFB5RnJhbWVPYmplY3QgKiwgaW50ICosIGludCAqLCBpbnQgKik7CiAKLXN0YXRpYyBQeU9iamVjdCAqYXBwbHlfc2xpY2UoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QgKiBhcHBseV9zbGljZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgYXNzaWduX3NsaWNlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAJCQlQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKLXN0YXRpYyBQeU9iamVjdCAqY21wX291dGNvbWUoaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKLXN0YXRpYyBQeU9iamVjdCAqaW1wb3J0X2Zyb20oUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QgKiBjbXBfb3V0Y29tZShpbnQsIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworc3RhdGljIFB5T2JqZWN0ICogaW1wb3J0X2Zyb20oUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGltcG9ydF9hbGxfZnJvbShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKLXN0YXRpYyBQeU9iamVjdCAqYnVpbGRfY2xhc3MoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitzdGF0aWMgUHlPYmplY3QgKiBidWlsZF9jbGFzcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgZXhlY19zdGF0ZW1lbnQoUHlGcmFtZU9iamVjdCAqLAogCQkJICBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyB2b2lkIHNldF9leGNfaW5mbyhQeVRocmVhZFN0YXRlICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIHZvaWQgcmVzZXRfZXhjX2luZm8oUHlUaHJlYWRTdGF0ZSAqKTsKIHN0YXRpYyB2b2lkIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5T2JqZWN0ICosIGNoYXIgKiwgUHlPYmplY3QgKik7Ci1zdGF0aWMgUHlPYmplY3QgKnN0cmluZ19jb25jYXRlbmF0ZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorc3RhdGljIFB5T2JqZWN0ICogc3RyaW5nX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAJCQkJICAgIFB5RnJhbWVPYmplY3QgKiwgdW5zaWduZWQgY2hhciAqKTsKIAogI2RlZmluZSBOQU1FX0VSUk9SX01TRyBcCkBAIC01NTksNyArNTYyLDcgQEAKICAgIGluc3QwIC0tIGJlZ2lubmluZyBvZiBzd2l0Y2ggc3RhdGVtZW50IGZvciBvcGNvZGUgZGlzcGF0Y2gKICAgIGluc3QxIC0tIGVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50IChtYXkgYmUgc2tpcHBlZCkKICAgIGxvb3AwIC0tIHRoZSB0b3Agb2YgdGhlIG1haW5sb29wCi0gICBsb29wMSAtLSBwbGFjZSB3aGVyZSBjb250cm9sIHJldHVybnMgYWdhaW4gdG8gdG9wIG9mIG1haW5sb29wIAorICAgbG9vcDEgLS0gcGxhY2Ugd2hlcmUgY29udHJvbCByZXR1cm5zIGFnYWluIHRvIHRvcCBvZiBtYWlubG9vcAogICAgICAgICAgICAgKG1heSBiZSBza2lwcGVkKQogICAgaW50cjEgLS0gYmVnaW5uaW5nIG9mIGxvbmcgaW50ZXJydXB0aW9uCiAgICBpbnRyMiAtLSBlbmQgb2YgbG9uZyBpbnRlcnJ1cHRpb24KQEAgLTY1NCwxMSArNjU3LDExIEBACiAjaWZkZWYgTExUUkFDRQogI2RlZmluZSBQVVNIKHYpCQl7ICh2b2lkKShCQVNJQ19QVVNIKHYpLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAicHVzaCIpKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpIDw9IGYtPmZfc3RhY2tzaXplKTsgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpIDw9IGNvLT5jb19zdGFja3NpemUpOyB9CiAjZGVmaW5lIFBPUCgpCQkoKHZvaWQpKGxsdHJhY2UgJiYgcHJ0cmFjZShUT1AoKSwgInBvcCIpKSwgQkFTSUNfUE9QKCkpCiAjZGVmaW5lIFNUQUNLQURKKG4pCXsgKHZvaWQpKEJBU0lDX1NUQUNLQURKKG4pLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAic3RhY2thZGoiKSk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBmLT5mX3N0YWNrc2l6ZSk7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgfQogI2RlZmluZSBFWFRfUE9QKFNUQUNLX1BPSU5URVIpIChsbHRyYWNlICYmIHBydHJhY2UoKihTVEFDS19QT0lOVEVSKSwgImV4dF9wb3AiKSwgKi0tKFNUQUNLX1BPSU5URVIpKQogI2Vsc2UKICNkZWZpbmUgUFVTSCh2KQkJQkFTSUNfUFVTSCh2KQpAQCAtNzI5LDcgKzczMiw3IEBACiAJbmFtZXMgPSBjby0+Y29fbmFtZXM7CiAJY29uc3RzID0gY28tPmNvX2NvbnN0czsKIAlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCWZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgZi0+Zl9ubG9jYWxzOworCWZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7CiAJZmlyc3RfaW5zdHIgPSAodW5zaWduZWQgY2hhciopIFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fY29kZSk7CiAJLyogQW4gZXhwbGFuYXRpb24gaXMgaW4gb3JkZXIgZm9yIHRoZSBuZXh0IGxpbmUuCiAKQEAgLTc2MCw3ICs3NjMsNyBAQAogCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwogCQlnb3RvIG9uX2Vycm9yOwogCX0KLQkJCisKIAlmb3IgKDs7KSB7CiAjaWZkZWYgV0lUSF9UU0MKIAkJaWYgKGluc3QxID09IDApIHsKQEAgLTc4MCw3ICs3ODMsNyBAQAogCQlSRUFEX1RJTUVTVEFNUChsb29wMCk7CiAjZW5kaWYKIAkJYXNzZXJ0KHN0YWNrX3BvaW50ZXIgPj0gZi0+Zl92YWx1ZXN0YWNrKTsgLyogZWxzZSB1bmRlcmZsb3cgKi8KLQkJYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gZi0+Zl9zdGFja3NpemUpOyAgLyogZWxzZSBvdmVyZmxvdyAqLworCQlhc3NlcnQoU1RBQ0tfTEVWRUwoKSA8PSBjby0+Y29fc3RhY2tzaXplKTsgIC8qIGVsc2Ugb3ZlcmZsb3cgKi8KIAogCQkvKiBEbyBwZXJpb2RpYyB0aGluZ3MuICBEb2luZyB0aGlzIGV2ZXJ5IHRpbWUgdGhyb3VnaAogCQkgICB0aGUgbG9vcCB3b3VsZCBhZGQgdG9vIG11Y2ggb3ZlcmhlYWQsIHNvIHdlIGRvIGl0CkBAIC0xNTM0LDcgKzE1MzcsNyBAQAogCQkJICAgIC8qIFhYWCBtb3ZlIGludG8gd3JpdGVvYmplY3QoKSA/ICovCiAJCQkgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CiAJCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKLQkJCQlpbnQgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisJCQkJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKIAkJCQlpZiAobGVuID09IDAgfHwKIAkJCQkgICAgIWlzc3BhY2UoUHlfQ0hBUk1BU0soc1tsZW4tMV0pKSB8fAogCQkJCSAgICBzW2xlbi0xXSA9PSAnICcpCkBAIC0xNTQzLDcgKzE1NDYsNyBAQAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIAkJCSAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKIAkJCQlQeV9VTklDT0RFICpzID0gUHlVbmljb2RlX0FTX1VOSUNPREUodik7Ci0JCQkJaW50IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh2KTsKKwkJCQlQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh2KTsKIAkJCQlpZiAobGVuID09IDAgfHwKIAkJCQkgICAgIVB5X1VOSUNPREVfSVNTUEFDRShzW2xlbi0xXSkgfHwKIAkJCQkgICAgc1tsZW4tMV0gPT0gJyAnKQpAQCAtMTg5MCwxNyArMTg5MywxNyBAQAogCQkJLyogRG9uJ3Qgc3RvbXAgZXhpc3RpbmcgZXhjZXB0aW9uICovCiAJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKIAkJCQlicmVhazsKLQkJCWlmIChvcGFyZyA8IGYtPmZfbmNlbGxzKSB7Ci0JCQkJdiA9IFB5VHVwbGVfR2V0SXRlbShjby0+Y29fY2VsbHZhcnMsCisJCQlpZiAob3BhcmcgPCBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykpIHsKKwkJCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fY2VsbHZhcnMsCiAJCQkJCQkgICAgICAgb3BhcmcpOwogCQkJICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKAogCQkJCSAgICAgICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwKIAkJCQkgICAgICAgVU5CT1VORExPQ0FMX0VSUk9SX01TRywKIAkJCQkgICAgICAgdik7CiAJCQl9IGVsc2UgewotCQkJICAgICAgIHYgPSBQeVR1cGxlX0dldEl0ZW0oCisJCQkgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oCiAJCQkJCSAgICAgIGNvLT5jb19mcmVldmFycywKLQkJCQkJICAgICAgb3BhcmcgLSBmLT5mX25jZWxscyk7CisJCQkJCSAgICAgIG9wYXJnIC0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKTsKIAkJCSAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZygKIAkJCQkgICAgICAgUHlFeGNfTmFtZUVycm9yLAogCQkJCSAgICAgICBVTkJPVU5ERlJFRV9FUlJPUl9NU0csCkBAIC0yMTQ3LDYgKzIxNTAsMTAgQEAKIAogCQljYXNlIENPTlRJTlVFX0xPT1A6CiAJCQlyZXR2YWwgPSBQeUludF9Gcm9tTG9uZyhvcGFyZyk7CisJCQlpZiAoIXJldHZhbCkgeworCQkJCXggPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQogCQkJd2h5ID0gV0hZX0NPTlRJTlVFOwogCQkJZ290byBmYXN0X2Jsb2NrX2VuZDsKIApAQCAtMjE4MCw3ICsyMTg3LDcgQEAKIAkJCSAgIHJlLXJhaXNpbmcgdGhlIGV4Y2VwdGlvbi4gIChCdXQgbm9uLWxvY2FsIGdvdG9zCiAJCQkgICBzaG91bGQgc3RpbGwgYmUgcmVzdW1lZC4pCiAJCQkqLwotCQkJCisKIAkJCXggPSBUT1AoKTsKIAkJCXUgPSBTRUNPTkQoKTsKIAkJCWlmIChQeUludF9DaGVjayh1KSB8fCB1ID09IFB5X05vbmUpIHsKQEAgLTI1NDMsNyArMjU1MCwxMiBAQAogCQl9CiAJfQogCi0JcmVzZXRfZXhjX2luZm8odHN0YXRlKTsKKwlpZiAodHN0YXRlLT5mcmFtZS0+Zl9leGNfdHlwZSAhPSBOVUxMKQorCQlyZXNldF9leGNfaW5mbyh0c3RhdGUpOworCWVsc2UgeworCQlhc3NlcnQodHN0YXRlLT5mcmFtZS0+Zl9leGNfdmFsdWUgPT0gTlVMTCk7CisJCWFzc2VydCh0c3RhdGUtPmZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPT0gTlVMTCk7CisJfQogCiAJLyogcG9wIGZyYW1lICovCiAgICAgZXhpdF9ldmFsX2ZyYW1lOgpAQCAtMjU4MCw3ICsyNTkyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCWZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgZi0+Zl9ubG9jYWxzOworCWZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7CiAKIAlpZiAoY28tPmNvX2FyZ2NvdW50ID4gMCB8fAogCSAgICBjby0+Y29fZmxhZ3MgJiAoQ09fVkFSQVJHUyB8IENPX1ZBUktFWVdPUkRTKSkgewpAQCAtMjcxNiw3ICsyNzI4LDcgQEAKIAl9CiAJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3RvcmFnZSBmb3IgY2VsbCB2YXJzLCBhbmQgY29weSBmcmVlCiAJICAgdmFycyBpbnRvIGZyYW1lLiAgVGhpcyBpc24ndCB0b28gZWZmaWNpZW50IHJpZ2h0IG5vdy4gKi8KLQlpZiAoZi0+Zl9uY2VsbHMpIHsKKwlpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKSB7CiAJCWludCBpID0gMCwgaiA9IDAsIG5hcmdzLCBmb3VuZDsKIAkJY2hhciAqY2VsbG5hbWUsICphcmduYW1lOwogCQlQeU9iamVjdCAqYzsKQEAgLTI3MzQsNyArMjc0Niw3IEBACiAJCSAgIHRoYXQgYXJlIGFyZ3VtZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZWxsdmFycwogCQkgICBsaXN0IHNvIHRoYXQgd2UgY2FuIG1hcmNoIG92ZXIgaXQgbW9yZSBlZmZpY2llbnRseT8KIAkJKi8KLQkJZm9yIChpID0gMDsgaSA8IGYtPmZfbmNlbGxzOyArK2kpIHsKKwkJZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKTsgKytpKSB7CiAJCQljZWxsbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKIAkJCQlQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19jZWxsdmFycywgaSkpOwogCQkJZm91bmQgPSAwOwpAQCAtMjc0NSw3ICsyNzU3LDcgQEAKIAkJCQkJYyA9IFB5Q2VsbF9OZXcoR0VUTE9DQUwoaikpOwogCQkJCQlpZiAoYyA9PSBOVUxMKQogCQkJCQkJZ290byBmYWlsOwotCQkJCQlHRVRMT0NBTChmLT5mX25sb2NhbHMgKyBpKSA9IGM7CisJCQkJCUdFVExPQ0FMKGNvLT5jb19ubG9jYWxzICsgaSkgPSBjOwogCQkJCQlmb3VuZCA9IDE7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTI3NTQsMTYgKzI3NjYsMTYgQEAKIAkJCQljID0gUHlDZWxsX05ldyhOVUxMKTsKIAkJCQlpZiAoYyA9PSBOVUxMKQogCQkJCQlnb3RvIGZhaWw7Ci0JCQkJU0VUTE9DQUwoZi0+Zl9ubG9jYWxzICsgaSwgYyk7CisJCQkJU0VUTE9DQUwoY28tPmNvX25sb2NhbHMgKyBpLCBjKTsKIAkJCX0KIAkJfQogCX0KLQlpZiAoZi0+Zl9uZnJlZXZhcnMpIHsKKwlpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpKSB7CiAJCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgZi0+Zl9uZnJlZXZhcnM7ICsraSkgeworCQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOyArK2kpIHsKIAkJCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShjbG9zdXJlLCBpKTsKIAkJCVB5X0lOQ1JFRihvKTsKLQkJCWZyZWV2YXJzW2YtPmZfbmNlbGxzICsgaV0gPSBvOworCQkJZnJlZXZhcnNbUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpICsgaV0gPSBvOwogCQl9CiAJfQogCkBAIC0yODA4LDYgKzI4MjAsNyBAQAogLSBPbmNlIGFuIGV4Y2VwdGlvbiBpcyBjYXVnaHQgYnkgYW4gZXhjZXB0IGNsYXVzZSwgaXQgaXMgdHJhbnNmZXJyZWQKICAgZnJvbSB0c3RhdGUtPmN1cmV4Y19aWlogdG8gdHN0YXRlLT5leGNfWlpaLCBmcm9tIHdoaWNoIHN5cy5leGNfaW5mbygpCiAgIGNhbiBwaWNrIGl0IHVwLiAgVGhpcyBpcyB0aGUgcHJpbWFyeSB0YXNrIG9mIHNldF9leGNfaW5mbygpLgorICBYWFggVGhhdCBjYW4ndCBiZSByaWdodDogIHNldF9leGNfaW5mbygpIGRvZXNuJ3QgbG9vayBhdCB0c3RhdGUtPmN1cmV4Y19aWlouCiAKIC0gTm93IGxldCBtZSBleHBsYWluIHRoZSBjb21wbGljYXRlZCBkYW5jZSB3aXRoIGZyYW1lLT5mX2V4Y19aWlouCiAKQEAgLTI4NjIsMzUgKzI4NzUsMzMgQEAKIHNldF9leGNfaW5mbyhQeVRocmVhZFN0YXRlICp0c3RhdGUsCiAJICAgICBQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIpCiB7Ci0JUHlGcmFtZU9iamVjdCAqZnJhbWU7CisJUHlGcmFtZU9iamVjdCAqZnJhbWUgPSB0c3RhdGUtPmZyYW1lOwogCVB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKIAotCWZyYW1lID0gdHN0YXRlLT5mcmFtZTsKKwlhc3NlcnQodHlwZSAhPSBOVUxMKTsKKwlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CiAJaWYgKGZyYW1lLT5mX2V4Y190eXBlID09IE5VTEwpIHsKLQkJLyogVGhpcyBmcmFtZSBkaWRuJ3QgY2F0Y2ggYW4gZXhjZXB0aW9uIGJlZm9yZSAqLwotCQkvKiBTYXZlIHByZXZpb3VzIGV4Y2VwdGlvbiBvZiB0aGlzIHRocmVhZCBpbiB0aGlzIGZyYW1lICovCisJCWFzc2VydChmcmFtZS0+Zl9leGNfdmFsdWUgPT0gTlVMTCk7CisJCWFzc2VydChmcmFtZS0+Zl9leGNfdHJhY2ViYWNrID09IE5VTEwpOworCQkvKiBUaGlzIGZyYW1lIGRpZG4ndCBjYXRjaCBhbiBleGNlcHRpb24gYmVmb3JlLiAqLworCQkvKiBTYXZlIHByZXZpb3VzIGV4Y2VwdGlvbiBvZiB0aGlzIHRocmVhZCBpbiB0aGlzIGZyYW1lLiAqLwogCQlpZiAodHN0YXRlLT5leGNfdHlwZSA9PSBOVUxMKSB7CisJCQkvKiBYWFggV2h5IGlzIHRoaXMgc2V0IHRvIFB5X05vbmU/ICovCiAJCQlQeV9JTkNSRUYoUHlfTm9uZSk7CiAJCQl0c3RhdGUtPmV4Y190eXBlID0gUHlfTm9uZTsKIAkJfQotCQl0bXBfdHlwZSA9IGZyYW1lLT5mX2V4Y190eXBlOwotCQl0bXBfdmFsdWUgPSBmcmFtZS0+Zl9leGNfdmFsdWU7Ci0JCXRtcF90YiA9IGZyYW1lLT5mX2V4Y190cmFjZWJhY2s7Ci0JCVB5X1hJTkNSRUYodHN0YXRlLT5leGNfdHlwZSk7CisJCVB5X0lOQ1JFRih0c3RhdGUtPmV4Y190eXBlKTsKIAkJUHlfWElOQ1JFRih0c3RhdGUtPmV4Y192YWx1ZSk7CiAJCVB5X1hJTkNSRUYodHN0YXRlLT5leGNfdHJhY2ViYWNrKTsKIAkJZnJhbWUtPmZfZXhjX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwogCQlmcmFtZS0+Zl9leGNfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKIAkJZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQkJUHlfWERFQ1JFRih0bXBfdHlwZSk7Ci0JCVB5X1hERUNSRUYodG1wX3ZhbHVlKTsKLQkJUHlfWERFQ1JFRih0bXBfdGIpOwogCX0KLQkvKiBTZXQgbmV3IGV4Y2VwdGlvbiBmb3IgdGhpcyB0aHJlYWQgKi8KKwkvKiBTZXQgbmV3IGV4Y2VwdGlvbiBmb3IgdGhpcyB0aHJlYWQuICovCiAJdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwogCXRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOwogCXRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQlQeV9YSU5DUkVGKHR5cGUpOworCVB5X0lOQ1JFRih0eXBlKTsKIAlQeV9YSU5DUkVGKHZhbHVlKTsKIAlQeV9YSU5DUkVGKHRiKTsKIAl0c3RhdGUtPmV4Y190eXBlID0gdHlwZTsKQEAgLTI5MTAsMzMgKzI5MjEsNDIgQEAKIHsKIAlQeUZyYW1lT2JqZWN0ICpmcmFtZTsKIAlQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CisKKwkvKiBJdCdzIGEgcHJlY29uZGl0aW9uIHRoYXQgdGhlIHRocmVhZCBzdGF0ZSdzIGZyYW1lIGNhdWdodCBhbgorCSAqIGV4Y2VwdGlvbiAtLSB2ZXJpZnkgaW4gYSBkZWJ1ZyBidWlsZC4KKwkgKi8KKwlhc3NlcnQodHN0YXRlICE9IE5VTEwpOwogCWZyYW1lID0gdHN0YXRlLT5mcmFtZTsKLQlpZiAoZnJhbWUtPmZfZXhjX3R5cGUgIT0gTlVMTCkgewotCQkvKiBUaGlzIGZyYW1lIGNhdWdodCBhbiBleGNlcHRpb24gKi8KLQkJdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwotCQl0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQkJdG1wX3RiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOwotCQlQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y190eXBlKTsKLQkJUHlfWElOQ1JFRihmcmFtZS0+Zl9leGNfdmFsdWUpOwotCQlQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y190cmFjZWJhY2spOwotCQl0c3RhdGUtPmV4Y190eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7Ci0JCXRzdGF0ZS0+ZXhjX3ZhbHVlID0gZnJhbWUtPmZfZXhjX3ZhbHVlOwotCQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOwotCQlQeV9YREVDUkVGKHRtcF90eXBlKTsKLQkJUHlfWERFQ1JFRih0bXBfdmFsdWUpOwotCQlQeV9YREVDUkVGKHRtcF90Yik7Ci0JCS8qIEZvciBiL3cgY29tcGF0aWJpbGl0eSAqLwotCQlQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgZnJhbWUtPmZfZXhjX3R5cGUpOwotCQlQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIGZyYW1lLT5mX2V4Y192YWx1ZSk7Ci0JCVB5U3lzX1NldE9iamVjdCgiZXhjX3RyYWNlYmFjayIsIGZyYW1lLT5mX2V4Y190cmFjZWJhY2spOwotCX0KKwlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisJYXNzZXJ0KGZyYW1lLT5mX2V4Y190eXBlICE9IE5VTEwpOworCisJLyogQ29weSB0aGUgZnJhbWUncyBleGNlcHRpb24gaW5mbyBiYWNrIHRvIHRoZSB0aHJlYWQgc3RhdGUuICovCisJdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOworCXRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOworCXRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKKwlQeV9JTkNSRUYoZnJhbWUtPmZfZXhjX3R5cGUpOworCVB5X1hJTkNSRUYoZnJhbWUtPmZfZXhjX3ZhbHVlKTsKKwlQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y190cmFjZWJhY2spOworCXRzdGF0ZS0+ZXhjX3R5cGUgPSBmcmFtZS0+Zl9leGNfdHlwZTsKKwl0c3RhdGUtPmV4Y192YWx1ZSA9IGZyYW1lLT5mX2V4Y192YWx1ZTsKKwl0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOworCVB5X1hERUNSRUYodG1wX3R5cGUpOworCVB5X1hERUNSRUYodG1wX3ZhbHVlKTsKKwlQeV9YREVDUkVGKHRtcF90Yik7CisKKwkvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KKwlQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgZnJhbWUtPmZfZXhjX3R5cGUpOworCVB5U3lzX1NldE9iamVjdCgiZXhjX3ZhbHVlIiwgZnJhbWUtPmZfZXhjX3ZhbHVlKTsKKwlQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrKTsKKworCS8qIENsZWFyIHRoZSBmcmFtZSdzIGV4Y2VwdGlvbiBpbmZvLiAqLwogCXRtcF90eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7CiAJdG1wX3ZhbHVlID0gZnJhbWUtPmZfZXhjX3ZhbHVlOwogCXRtcF90YiA9IGZyYW1lLT5mX2V4Y190cmFjZWJhY2s7CiAJZnJhbWUtPmZfZXhjX3R5cGUgPSBOVUxMOwogCWZyYW1lLT5mX2V4Y192YWx1ZSA9IE5VTEw7CiAJZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7Ci0JUHlfWERFQ1JFRih0bXBfdHlwZSk7CisJUHlfREVDUkVGKHRtcF90eXBlKTsKIAlQeV9YREVDUkVGKHRtcF92YWx1ZSk7CiAJUHlfWERFQ1JFRih0bXBfdGIpOwogfQpAQCAtMzgwMCw3ICszODIwLDcgQEAKIAkJUHlfc3NpemVfdCB4OwogCQlpZiAoUHlJbnRfQ2hlY2sodikpIHsKIAkJCXggPSBQeUludF9Bc1NzaXplX3Qodik7Ci0JCX0gCisJCX0KIAkJZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmCiAJCQkgUHlUeXBlX0hhc0ZlYXR1cmUodi0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOREVYKQogCQkJICYmIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5kZXgpIHsKQEAgLTQwMTUsMTAgKzQwMzUsMTAgQEAKIAkJCW1ldGFjbGFzcyA9IChQeU9iamVjdCAqKSAmUHlUeXBlX1R5cGU7CiAJCVB5X0lOQ1JFRihtZXRhY2xhc3MpOwogCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0YWNsYXNzLCAiT09PIiwgbmFtZSwgYmFzZXMsIG1ldGhvZHMpOworCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobWV0YWNsYXNzLCBuYW1lLCBiYXNlcywgbWV0aG9kcywgTlVMTCk7CiAJUHlfREVDUkVGKG1ldGFjbGFzcyk7CiAJaWYgKHJlc3VsdCA9PSBOVUxMICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgewotCQkvKiBBIHR5cGUgZXJyb3IgaGVyZSBsaWtlbHkgbWVhbnMgdGhhdCB0aGUgdXNlciBwYXNzZWQgCisJCS8qIEEgdHlwZSBlcnJvciBoZXJlIGxpa2VseSBtZWFucyB0aGF0IHRoZSB1c2VyIHBhc3NlZAogCQkgICBpbiBhIGJhc2UgdGhhdCB3YXMgbm90IGEgY2xhc3MgKHN1Y2ggdGhlIHJhbmRvbSBtb2R1bGUKIAkJICAgaW5zdGVhZCBvZiB0aGUgcmFuZG9tLnJhbmRvbSB0eXBlKS4gIEhlbHAgdGhlbSBvdXQgd2l0aAogCQkgICBieSBhdWdtZW50aW5nIHRoZSBlcnJvciBtZXNzYWdlIHdpdGggbW9yZSBpbmZvcm1hdGlvbi4qLwpAQCAtNDE1OCw3ICs0MTc4LDcgQEAKIHsKIAkvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgJ3ZhcmlhYmxlICs9IGV4cHInIHdoZW4gYm90aCBhcmd1bWVudHMKIAkgICBhcmUgc3RyaW5ncy4gKi8KLQkKKwogCWlmICh2LT5vYl9yZWZjbnQgPT0gMikgewogCQkvKiBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZXJlIGFyZSAyIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlCiAJCSAqIHN0b3JlZCBpbiAndmFyaWFibGUnIHdoZW4gdGhlICs9IGlzIHBlcmZvcm1lZDogb25lIG9uIHRoZQpAQCAtNDE3Niw3ICs0MTk2LDcgQEAKIAkJfQogCQljYXNlIFNUT1JFX0RFUkVGOgogCQl7Ci0JCQlQeU9iamVjdCAqKmZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgZi0+Zl9ubG9jYWxzOworCQkJUHlPYmplY3QgKipmcmVldmFycyA9IGYtPmZfbG9jYWxzcGx1cyArIGYtPmZfY29kZS0+Y29fbmxvY2FsczsKIAkJCVB5T2JqZWN0ICpjID0gZnJlZXZhcnNbUEVFS0FSRygpXTsKIAkJCWlmIChQeUNlbGxfR0VUKGMpID09IHYpCiAJCQkJUHlDZWxsX1NldChjLCBOVUxMKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb2RlY3MuYyBiL1B5dGhvbi9jb2RlY3MuYwppbmRleCAyMTI0ODI0Li4wNDZhYmUzIDEwMDY0NAotLS0gYS9QeXRob24vY29kZWNzLmMKKysrIGIvUHl0aG9uL2NvZGVjcy5jCkBAIC03MCw3ICs3MCw3IEBACiAgICAgICAgIGlmIChjaCA9PSAnICcpCiAgICAgICAgICAgICBjaCA9ICctJzsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgY2ggPSB0b2xvd2VyKGNoKTsKKyAgICAgICAgICAgIGNoID0gdG9sb3dlcihQeV9DSEFSTUFTSyhjaCkpOwogCXBbaV0gPSBjaDsKICAgICB9CiAgICAgcmV0dXJuIHY7CkBAIC05NSw3ICs5NSw3IEBACiB7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7CiAgICAgUHlPYmplY3QgKnJlc3VsdCwgKmFyZ3MgPSBOVUxMLCAqdjsKLSAgICBpbnQgaSwgbGVuOworICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKIAlQeUVycl9CYWRBcmd1bWVudCgpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvbXBpbGUuYyBiL1B5dGhvbi9jb21waWxlLmMKaW5kZXggMTJiMTkwYS4uMTk5Y2FjNSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NvbXBpbGUuYworKysgYi9QeXRob24vY29tcGlsZS5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWsgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCWsgPSBQeV9CdWlsZFZhbHVlKCIoT08pIiwgaywgay0+b2JfdHlwZSk7CisJCWsgPSBQeVR1cGxlX1BhY2soMiwgaywgay0+b2JfdHlwZSk7CiAJCWlmIChrID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW0oZGljdCwgaywgdikgPCAwKSB7CiAJCQlQeV9YREVDUkVGKGspOwogCQkJUHlfREVDUkVGKHYpOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCQlpKys7Ci0JCQl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPTykiLCBrLCBrLT5vYl90eXBlKTsKKwkJCXR1cGxlID0gUHlUdXBsZV9QYWNrKDIsIGssIGstPm9iX3R5cGUpOwogCQkJaWYgKCF0dXBsZSB8fCBQeURpY3RfU2V0SXRlbShkZXN0LCB0dXBsZSwgaXRlbSkgPCAwKSB7CiAJCQkJUHlfREVDUkVGKGl0ZW0pOwogCQkJCVB5X0RFQ1JFRihkZXN0KTsKQEAgLTE4MzQsNyArMTgzNCw3IEBACiBjb21waWxlcl9sb29rdXBfYXJnKFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqbmFtZSkKIHsKICAgICBQeU9iamVjdCAqaywgKnY7Ci0gICAgayA9IFB5X0J1aWxkVmFsdWUoIihPTykiLCBuYW1lLCBuYW1lLT5vYl90eXBlKTsKKyAgICBrID0gUHlUdXBsZV9QYWNrKDIsIG5hbWUsIG5hbWUtPm9iX3R5cGUpOwogICAgIGlmIChrID09IE5VTEwpCiAJcmV0dXJuIC0xOwogICAgIHYgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBrKTsKQEAgLTMzNDksNyArMzM0OSw3IEBACiAgIAogICAgSXQgaXMgaW1wbGVtZW50ZWQgcm91Z2hseSBhczoKICAgCi0gICBjb250ZXh0ID0gKEVYUFIpLl9fY29udGV4dF9fKCkKKyAgIGNvbnRleHQgPSBFWFBSCiAgICBleGl0ID0gY29udGV4dC5fX2V4aXRfXyAgIyBub3QgY2FsbGluZyBpdAogICAgdmFsdWUgPSBjb250ZXh0Ll9fZW50ZXJfXygpCiAgICB0cnk6CkBAIC0zMzY1LDE3ICszMzY1LDEyIEBACiBzdGF0aWMgaW50CiBjb21waWxlcl93aXRoKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotICAgIHN0YXRpYyBpZGVudGlmaWVyIGNvbnRleHRfYXR0ciwgZW50ZXJfYXR0ciwgZXhpdF9hdHRyOworICAgIHN0YXRpYyBpZGVudGlmaWVyIGVudGVyX2F0dHIsIGV4aXRfYXR0cjsKICAgICBiYXNpY2Jsb2NrICpibG9jaywgKmZpbmFsbHk7CiAgICAgaWRlbnRpZmllciB0bXBleGl0LCB0bXB2YWx1ZSA9IE5VTEw7CiAKICAgICBhc3NlcnQocy0+a2luZCA9PSBXaXRoX2tpbmQpOwogCi0gICAgaWYgKCFjb250ZXh0X2F0dHIpIHsKLQljb250ZXh0X2F0dHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbnRleHRfXyIpOwotCWlmICghY29udGV4dF9hdHRyKQotCSAgICByZXR1cm4gMDsKLSAgICB9CiAgICAgaWYgKCFlbnRlcl9hdHRyKSB7CiAJZW50ZXJfYXR0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZW50ZXJfXyIpOwogCWlmICghZW50ZXJfYXR0cikKQEAgLTM0MTQsMTAgKzM0MDksOCBAQAogCVB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgdG1wdmFsdWUpOwogICAgIH0KIAotICAgIC8qIEV2YWx1YXRlIChFWFBSKS5fX2NvbnRleHRfXygpICovCisgICAgLyogRXZhbHVhdGUgRVhQUiAqLwogICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuV2l0aC5jb250ZXh0X2V4cHIpOwotICAgIEFERE9QX08oYywgTE9BRF9BVFRSLCBjb250ZXh0X2F0dHIsIG5hbWVzKTsKLSAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDApOwogCiAgICAgLyogU3F1aXJyZWwgYXdheSBjb250ZXh0Ll9fZXhpdF9fICAqLwogICAgIEFERE9QKGMsIERVUF9UT1ApOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfaHB1eC5jIGIvUHl0aG9uL2R5bmxvYWRfaHB1eC5jCmluZGV4IGI0ZGUwODE0Li5mZWMwODI2IDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF9ocHV4LmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfaHB1eC5jCkBAIC0xNCw4ICsxNCw4IEBACiAjZW5kaWYKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKLQl7Ii5zbCIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Im1vZHVsZS5zbCIsICJyYiIsIENfRVhURU5TSU9OfSwKKwl7U0hMSUJfRVhULCAicmIiLCBDX0VYVEVOU0lPTn0sCisJeyJtb2R1bGUiU0hMSUJfRVhULCAicmIiLCBDX0VYVEVOU0lPTn0sCiAJezAsIDB9CiB9OwogCmRpZmYgLS1naXQgYS9QeXRob24vZXJyb3JzLmMgYi9QeXRob24vZXJyb3JzLmMKaW5kZXggMmFlMDYyZi4uYzM5MWQzMyAxMDA2NDQKLS0tIGEvUHl0aG9uL2Vycm9ycy5jCisrKyBiL1B5dGhvbi9lcnJvcnMuYwpAQCAtNTM2LDYgKzUzNiw3IEBACiB9CiAKIAorCiBQeU9iamVjdCAqCiBQeUVycl9OZXdFeGNlcHRpb24oY2hhciAqbmFtZSwgUHlPYmplY3QgKmJhc2UsIFB5T2JqZWN0ICpkaWN0KQogewpAQCAtNTY1LDE0ICs1NjYsMTggQEAKIAkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIiwgbW9kdWxlbmFtZSkgIT0gMCkKIAkJCWdvdG8gZmFpbHVyZTsKIAl9Ci0JY2xhc3NuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhkb3QrMSk7Ci0JaWYgKGNsYXNzbmFtZSA9PSBOVUxMKQotCQlnb3RvIGZhaWx1cmU7Ci0JYmFzZXMgPSBQeVR1cGxlX1BhY2soMSwgYmFzZSk7Ci0JaWYgKGJhc2VzID09IE5VTEwpCi0JCWdvdG8gZmFpbHVyZTsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopIChiYXNlLT5vYl90eXBlKSwKLQkJCQkgICAgICAgIk9PTyIsIGNsYXNzbmFtZSwgYmFzZXMsIGRpY3QpOworCWlmIChQeVR1cGxlX0NoZWNrKGJhc2UpKSB7CisJCWJhc2VzID0gYmFzZTsKKwkJLyogSU5DUkVGIGFzIHdlIGNyZWF0ZSBhIG5ldyByZWYgaW4gdGhlIGVsc2UgYnJhbmNoICovCisJCVB5X0lOQ1JFRihiYXNlcyk7CisJfSBlbHNlIHsKKwkJYmFzZXMgPSBQeVR1cGxlX1BhY2soMSwgYmFzZSk7CisJCWlmIChiYXNlcyA9PSBOVUxMKQorCQkJZ290byBmYWlsdXJlOworCX0KKwkvKiBDcmVhdGUgYSByZWFsIG5ldy1zdHlsZSBjbGFzcy4gKi8KKwlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5VHlwZV9UeXBlLCAic09PIiwKKwkJCQkgICAgICAgZG90KzEsIGJhc2VzLCBkaWN0KTsKICAgZmFpbHVyZToKIAlQeV9YREVDUkVGKGJhc2VzKTsKIAlQeV9YREVDUkVGKG15ZGljdCk7CkBAIC01OTMsOCArNTk4LDExIEBACiAJCVB5RmlsZV9Xcml0ZVN0cmluZygiRXhjZXB0aW9uICIsIGYpOwogCQlpZiAodCkgewogCQkJY2hhciogY2xhc3NOYW1lID0gUHlFeGNlcHRpb25DbGFzc19OYW1lKHQpOwotCQkJUHlPYmplY3QqIG1vZHVsZU5hbWUgPQotCQkJICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyh0LCAiX19tb2R1bGVfXyIpOworCQkJUHlPYmplY3QqIG1vZHVsZU5hbWU7CisJCQljaGFyICpkb3QgPSBzdHJyY2hyKGNsYXNzTmFtZSwgJy4nKTsKKwkJCWlmIChkb3QgIT0gTlVMTCkKKwkJCQljbGFzc05hbWUgPSBkb3QrMTsKKwkJCW1vZHVsZU5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHQsICJfX21vZHVsZV9fIik7CiAKIAkJCWlmIChtb2R1bGVOYW1lID09IE5VTEwpCiAJCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCI8dW5rbm93bj4iLCBmKTsKQEAgLTY0NCwxNSArNjUyLDExIEBACiAJCXJldHVybiAwOwogCX0KIAllbHNlIHsKLQkJUHlPYmplY3QgKmFyZ3MsICpyZXM7CisJCVB5T2JqZWN0ICpyZXM7CiAKIAkJaWYgKGNhdGVnb3J5ID09IE5VTEwpCiAJCQljYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwotCQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKHNPKSIsIG1lc3NhZ2UsIGNhdGVnb3J5KTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKKwkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICJzTyIsIG1lc3NhZ2UsIGNhdGVnb3J5KTsKIAkJaWYgKHJlcyA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwogCQlQeV9ERUNSRUYocmVzKTsKQEAgLTY4MCwxOCArNjg0LDE0IEBACiAJCXJldHVybiAwOwogCX0KIAllbHNlIHsKLQkJUHlPYmplY3QgKmFyZ3MsICpyZXM7CisJCVB5T2JqZWN0ICpyZXM7CiAKIAkJaWYgKGNhdGVnb3J5ID09IE5VTEwpCiAJCQljYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogCQlpZiAocmVnaXN0cnkgPT0gTlVMTCkKIAkJCXJlZ2lzdHJ5ID0gUHlfTm9uZTsKLQkJYXJncyA9IFB5X0J1aWxkVmFsdWUoIihzT3Npek8pIiwgbWVzc2FnZSwgY2F0ZWdvcnksCi0JCQkJICAgICBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsIHJlZ2lzdHJ5KTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKKwkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICJzT3Npek8iLCBtZXNzYWdlLCBjYXRlZ29yeSwKKwkJCQkJICAgIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnkpOwogCQlpZiAocmVzID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7CiAJCVB5X0RFQ1JFRihyZXMpOwpAQCAtNzEyLDcgKzcxMiw4IEBACiAJLyogYWRkIGF0dHJpYnV0ZXMgZm9yIHRoZSBsaW5lIG51bWJlciBhbmQgZmlsZW5hbWUgZm9yIHRoZSBlcnJvciAqLwogCVB5RXJyX0ZldGNoKCZleGMsICZ2LCAmdGIpOwogCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjLCAmdiwgJnRiKTsKLQkvKiBYWFggY2hlY2sgdGhhdCBpdCBpcywgaW5kZWVkLCBhIHN5bnRheCBlcnJvciAqLworCS8qIFhYWCBjaGVjayB0aGF0IGl0IGlzLCBpbmRlZWQsIGEgc3ludGF4IGVycm9yLiBJdCBtaWdodCBub3QKKwkgKiBiZSwgdGhvdWdoLiAqLwogCXRtcCA9IFB5SW50X0Zyb21Mb25nKGxpbmVubyk7CiAJaWYgKHRtcCA9PSBOVUxMKQogCQlQeUVycl9DbGVhcigpOwpAQCAtNzg4LDcgKzc4OSw3IEBACiAJCQkJYnJlYWs7CiAJCQkvKiBmZ2V0cyByZWFkICpzb21ldGhpbmcqOyBpZiBpdCBkaWRuJ3QgZ2V0IGFzCiAJCQkgICBmYXIgYXMgcExhc3RDaGFyLCBpdCBtdXN0IGhhdmUgZm91bmQgYSBuZXdsaW5lCi0JCQkgICBvciBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsJaWYgcExhc3RDaGFyIGlzIFxuLAorCQkJICAgb3IgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGU7IGlmIHBMYXN0Q2hhciBpcyBcbiwKIAkJCSAgIGl0IG9idmlvdXNseSBmb3VuZCBhIG5ld2xpbmU7IGVsc2Ugd2UgaGF2ZW4ndAogCQkJICAgeWV0IHNlZW4gYSBuZXdsaW5lLCBzbyBtdXN0IGNvbnRpbnVlICovCiAJCX0gd2hpbGUgKCpwTGFzdENoYXIgIT0gJ1wwJyAmJiAqcExhc3RDaGFyICE9ICdcbicpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2V4Y2VwdGlvbnMuYyBiL1B5dGhvbi9leGNlcHRpb25zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODI0ZTYuLjAwMDAwMDAKLS0tIGEvUHl0aG9uL2V4Y2VwdGlvbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NDMgKzAsMCBAQAotLyogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIHN1aXRlIG9mIHN0YW5kYXJkIGNsYXNzLWJhc2VkIGV4Y2VwdGlvbnMgZm9yCi0gKiBQeXRob24ncyBidWlsdGluIG1vZHVsZS4gIFRoaXMgaXMgYSBjb21wbGV0ZSBDIGltcGxlbWVudGF0aW9uIG9mIHdoYXQsCi0gKiBpbiBQeXRob24gMS41LjIsIHdhcyBjb250YWluZWQgaW4gdGhlIGV4Y2VwdGlvbnMucHkgbW9kdWxlLiAgVGhlIHByb2JsZW0KLSAqIHRoZXJlIHdhcyB0aGF0IGlmIGV4Y2VwdGlvbnMucHkgY291bGQgbm90IGJlIGltcG9ydGVkIGZvciBzb21lIHJlYXNvbiwKLSAqIHRoZSBlbnRpcmUgaW50ZXJwcmV0ZXIgd291bGQgYWJvcnQuCi0gKgotICogQnkgbW92aW5nIHRoZSBleGNlcHRpb25zIGludG8gQyBhbmQgc3RhdGljYWxseSBsaW5raW5nLCB3ZSBjYW4gZ3VhcmFudGVlCi0gKiB0aGF0IHRoZSBzdGFuZGFyZCBleGNlcHRpb25zIHdpbGwgYWx3YXlzIGJlIGF2YWlsYWJsZS4KLSAqCi0gKgotICogd3JpdHRlbiBieSBGcmVkcmlrIEx1bmRoCi0gKiBtb2RpZmljYXRpb25zLCBhZGRpdGlvbnMsIGNsZWFudXBzLCBhbmQgcHJvb2ZyZWFkaW5nIGJ5IEJhcnJ5IFdhcnNhdwotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0jZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KLSNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlICJvc2RlZnMuaCIKLQotLyogQ2F1dGlvbjogIE1TIFZpc3VhbCBDKysgNiBlcnJvcnMgaWYgYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwgZXhjZWVkcwotICogMktiLiAgU28gdGhlIG1vZHVsZSBkb2NzdHJpbmcgaGFzIGJlZW4gYnJva2VuIHJvdWdobHkgaW4gaGFsZiwgdXNpbmcKLSAqIGNvbXBpbGUtdGltZSBsaXRlcmFsIGNvbmNhdGVuYXRpb24uCi0gKi8KLQotLyogTk9URTogSWYgdGhlIGV4Y2VwdGlvbiBjbGFzcyBoaWVyYXJjaHkgY2hhbmdlcywgZG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZQotICogRG9jL2xpYi9saWJleGNzLnRleCEKLSAqLwotCi1QeURvY19TVFJWQVIobW9kdWxlX19kb2NfXywKLSJQeXRob24ncyBzdGFuZGFyZCBleGNlcHRpb24gY2xhc3MgaGllcmFyY2h5LlxuXAotXG5cCi1FeGNlcHRpb25zIGZvdW5kIGhlcmUgYXJlIGRlZmluZWQgYm90aCBpbiB0aGUgZXhjZXB0aW9ucyBtb2R1bGUgYW5kIHRoZSBcblwKLWJ1aWx0LWluIG5hbWVzcGFjZS4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMgaW5oZXJpdCBcblwKLWZyb20gRXhjZXB0aW9uLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZXhjZXB0aW9uIGluaGVyaXRhbmNlIGhpZXJhcmNoeS5cblwKLSIKLQotCS8qIGtlZXAgc3RyaW5nIHBpZWNlcyAic21hbGwiICovCi0vKiBYWFgoYmNhbm5vbik6IGV4Y2VwdGlvbiBoaWVyYXJjaHkgaW4gTGliL3Rlc3QvZXhjZXB0aW9uX2hpZXJhcmNoeS50eHQgKi8KLSk7Ci0KLQwKLS8qIEhlbHBlciBmdW5jdGlvbiBmb3IgcG9wdWxhdGluZyBhIGRpY3Rpb25hcnkgd2l0aCBtZXRob2Qgd3JhcHBlcnMuICovCi1zdGF0aWMgaW50Ci1wb3B1bGF0ZV9tZXRob2RzKFB5T2JqZWN0ICprbGFzcywgUHlNZXRob2REZWYgKm1ldGhvZHMpCi17Ci0gICAgUHlPYmplY3QgKm1vZHVsZTsKLSAgICBpbnQgc3RhdHVzID0gLTE7Ci0KLSAgICBpZiAoIW1ldGhvZHMpCi0JcmV0dXJuIDA7Ci0KLSAgICBtb2R1bGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJleGNlcHRpb25zIik7Ci0gICAgaWYgKCFtb2R1bGUpCi0JcmV0dXJuIDA7Ci0gICAgd2hpbGUgKG1ldGhvZHMtPm1sX25hbWUpIHsKLQkvKiBnZXQgYSB3cmFwcGVyIGZvciB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gKi8KLQlQeU9iamVjdCAqZnVuYyA9IFB5Q0Z1bmN0aW9uX05ld0V4KG1ldGhvZHMsIE5VTEwsIG1vZHVsZSk7Ci0JUHlPYmplY3QgKm1ldGg7Ci0KLQlpZiAoIWZ1bmMpCi0JICAgIGdvdG8gc3RhdHVzOwotCi0JLyogdHVybiB0aGUgZnVuY3Rpb24gaW50byBhbiB1bmJvdW5kIG1ldGhvZCAqLwotCWlmICghKG1ldGggPSBQeU1ldGhvZF9OZXcoZnVuYywgTlVMTCwga2xhc3MpKSkgewotCSAgICBQeV9ERUNSRUYoZnVuYyk7Ci0JICAgIGdvdG8gc3RhdHVzOwotCX0KLQotCS8qIGFkZCBtZXRob2QgdG8gZGljdGlvbmFyeSAqLwotCXN0YXR1cyA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoa2xhc3MsIG1ldGhvZHMtPm1sX25hbWUsIG1ldGgpOwotCVB5X0RFQ1JFRihtZXRoKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0KLQkvKiBzdG9wIG5vdyBpZiBhbiBlcnJvciBvY2N1cnJlZCwgb3RoZXJ3aXNlIGRvIHRoZSBuZXh0IG1ldGhvZCAqLwotCWlmIChzdGF0dXMpCi0JICAgIGdvdG8gc3RhdHVzOwotCi0JbWV0aG9kcysrOwotICAgIH0KLSAgICBzdGF0dXMgPSAwOwotIHN0YXR1czoKLSAgICBQeV9ERUNSRUYobW9kdWxlKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYWxsIHN1YnNlcXVlbnQgZXhjZXB0aW9uIGNsYXNzZXMuICovCi1zdGF0aWMgaW50Ci1tYWtlX2NsYXNzKFB5T2JqZWN0ICoqa2xhc3MsIFB5T2JqZWN0ICpiYXNlLAotCSAgIGNoYXIgKm5hbWUsIFB5TWV0aG9kRGVmICptZXRob2RzLAotCSAgIGNoYXIgKmRvY3N0cikKLXsKLSAgICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKLSAgICBQeU9iamVjdCAqc3RyID0gTlVMTDsKLSAgICBpbnQgc3RhdHVzID0gLTE7Ci0KLSAgICBpZiAoIWRpY3QpCi0JcmV0dXJuIC0xOwotCi0gICAgLyogSWYgYW4gZXJyb3Igb2NjdXJzIGZyb20gaGVyZSBvbiwgZ290byBmaW5hbGx5IGluc3RlYWQgb2YgZXhwbGljaXRseQotICAgICAqIHJldHVybmluZyBOVUxMLgotICAgICAqLwotCi0gICAgaWYgKGRvY3N0cikgewotCWlmICghKHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jc3RyKSkpCi0JICAgIGdvdG8gZmluYWxseTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBzdHIpKQotCSAgICBnb3RvIGZpbmFsbHk7Ci0gICAgfQotCi0gICAgaWYgKCEoKmtsYXNzID0gUHlFcnJfTmV3RXhjZXB0aW9uKG5hbWUsIGJhc2UsIGRpY3QpKSkKLQlnb3RvIGZpbmFsbHk7Ci0KLSAgICBpZiAocG9wdWxhdGVfbWV0aG9kcygqa2xhc3MsIG1ldGhvZHMpKSB7Ci0JUHlfREVDUkVGKCprbGFzcyk7Ci0JKmtsYXNzID0gTlVMTDsKLQlnb3RvIGZpbmFsbHk7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gMDsKLQotICBmaW5hbGx5OgotICAgIFB5X1hERUNSRUYoZGljdCk7Ci0gICAgUHlfWERFQ1JFRihzdHIpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotLyogVXNlIHRoaXMgZm9yICphcmdzIHNpZ25hdHVyZXMsIG90aGVyd2lzZSBqdXN0IHVzZSBQeUFyZ19QYXJzZVR1cGxlKCkgKi8KLXN0YXRpYyBQeU9iamVjdCAqCi1nZXRfc2VsZihQeU9iamVjdCAqYXJncykKLXsKLSAgICBQeU9iamVjdCAqc2VsZiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLSAgICBpZiAoIXNlbGYpIHsKLQkvKiBXYXRjaCBvdXQgZm9yIGJlaW5nIGNhbGxlZCB0byBlYXJseSBpbiB0aGUgYm9vdHN0cmFwcGluZyBwcm9jZXNzICovCi0JaWYgKFB5RXhjX1R5cGVFcnJvcikgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCSAgICAgInVuYm91bmQgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHdpdGggaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQiKTsKLQl9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gc2VsZjsKLX0KLQotCi0MCi0vKiBOb3RlcyBvbiBib290c3RyYXBwaW5nIHRoZSBleGNlcHRpb24gY2xhc3Nlcy4KLSAqCi0gKiBGaXJzdCB0aGluZyB3ZSBjcmVhdGUgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zLCBjYWxsZWQKLSAqIGFwcHJvcHJpYXRlbHkgQmFzZUV4Y2VwdGlvbi4gIENyZWF0aW9uIG9mIHRoaXMgY2xhc3MgbWFrZXMgbm8KLSAqIGFzc3VtcHRpb25zIGFib3V0IHRoZSBleGlzdGVuY2Ugb2YgYW55IG90aGVyIGV4Y2VwdGlvbiBjbGFzcyAtLSBleGNlcHQKLSAqIGZvciBUeXBlRXJyb3IsIHdoaWNoIGNhbiBjb25kaXRpb25hbGx5IGV4aXN0LgotICoKLSAqIE5leHQsIEV4Y2VwdGlvbiBpcyBjcmVhdGVkIHNpbmNlIGl0IGlzIHRoZSBjb21tb24gc3ViY2xhc3MgZm9yIHRoZSByZXN0IG9mCi0gKiB0aGUgbmVlZGVkIGV4Y2VwdGlvbnMgZm9yIHRoaXMgYm9vdHN0cmFwcGluZyB0byB3b3JrLiAgU3RhbmRhcmRFcnJvciBpcwotICogY3JlYXRlZCAod2hpY2ggaXMgcXVpdGUgc2ltcGxlKSBmb2xsb3dlZCBieQotICogVHlwZUVycm9yLCBiZWNhdXNlIHRoZSBpbnN0YW50aWF0aW9uIG9mIG90aGVyIGV4Y2VwdGlvbnMgY2FuIHBvdGVudGlhbGx5Ci0gKiB0aHJvdyBhIFR5cGVFcnJvci4gIE9uY2UgdGhlc2UgZXhjZXB0aW9ucyBhcmUgY3JlYXRlZCwgYWxsIHRoZSBvdGhlcnMKLSAqIGNhbiBiZSBjcmVhdGVkIGluIGFueSBvcmRlci4gIFNlZSB0aGUgc3RhdGljIGV4Y3RhYmxlIGJlbG93IGZvciB0aGUKLSAqIGV4cGxpY2l0IGJvb3RzdHJhcCBvcmRlci4KLSAqCi0gKiBBbGwgY2xhc3NlcyBhZnRlciBCYXNlRXhjZXB0aW9uIGNhbiBiZSBjcmVhdGVkIHVzaW5nIFB5RXJyX05ld0V4Y2VwdGlvbigpLgotICovCi0KLVB5RG9jX1NUUlZBUihCYXNlRXhjZXB0aW9uX19kb2NfXywgIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyIpOwotCi0vKgotICAgU2V0IGFyZ3MgYW5kIG1lc3NhZ2UgYXR0cmlidXRlcy4KLQotICAgQXNzdW1lcyBzZWxmIGFuZCBhcmdzIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBwcm9wZXJseSB3aXRoIHNldF9zZWxmLCBldGMuCi0qLwotc3RhdGljIGludAotc2V0X2FyZ3NfYW5kX21lc3NhZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICptZXNzYWdlX3ZhbDsKLSAgICBQeV9zc2l6ZV90IGFyZ3NfbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7Ci0KLSAgICBpZiAoYXJnc19sZW4gPCAwKQotCSAgICByZXR1cm4gMDsKLQotICAgIC8qIHNldCBhcmdzICovCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiLCBhcmdzKSA8IDApCi0JICAgIHJldHVybiAwOwotCi0gICAgLyogc2V0IG1lc3NhZ2UgKi8KLSAgICBpZiAoYXJnc19sZW4gPT0gMSkKLQkgICAgbWVzc2FnZV92YWwgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJncywgMCk7Ci0gICAgZWxzZQotCSAgICBtZXNzYWdlX3ZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotICAgIGlmICghbWVzc2FnZV92YWwpCi0JICAgIHJldHVybiAwOwotCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgIm1lc3NhZ2UiLCBtZXNzYWdlX3ZhbCkgPCAwKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYobWVzc2FnZV92YWwpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUHlfREVDUkVGKG1lc3NhZ2VfdmFsKTsKLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLUJhc2VFeGNlcHRpb25fX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgaWYgKCEoc2VsZiA9IGdldF9zZWxmKGFyZ3MpKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIC8qIHNldCBhcmdzIGFuZCBtZXNzYWdlIGF0dHJpYnV0ZSAqLwotICAgIGFyZ3MgPSBQeVNlcXVlbmNlX0dldFNsaWNlKGFyZ3MsIDEsIFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpKTsKLSAgICBpZiAoIWFyZ3MpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFzZXRfYXJnc19hbmRfbWVzc2FnZShzZWxmLCBhcmdzKSkgewotCSAgICBQeV9ERUNSRUYoYXJncyk7Ci0JICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QgKgotQmFzZUV4Y2VwdGlvbl9fc3RyX18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICpvdXQ7Ci0KLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19zdHJfXyIsICZzZWxmKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBhcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiYXJncyIpOwotICAgIGlmICghYXJncykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBzd2l0Y2ggKFB5U2VxdWVuY2VfU2l6ZShhcmdzKSkgewotICAgIGNhc2UgMDoKLSAgICAgICAgb3V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICB7Ci0JUHlPYmplY3QgKnRtcCA9IFB5U2VxdWVuY2VfR2V0SXRlbShhcmdzLCAwKTsKLQlpZiAodG1wKSB7Ci0JICAgIG91dCA9IFB5T2JqZWN0X1N0cih0bXApOwotCSAgICBQeV9ERUNSRUYodG1wKTsKLQl9Ci0JZWxzZQotCSAgICBvdXQgPSBOVUxMOwotCWJyZWFrOwotICAgIH0KLSAgICBjYXNlIC0xOgotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KLSAgICBkZWZhdWx0OgotICAgICAgICBvdXQgPSBQeU9iamVjdF9TdHIoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICByZXR1cm4gb3V0OwotfQotCi0jaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotc3RhdGljIFB5T2JqZWN0ICoKLUJhc2VFeGNlcHRpb25fX3VuaWNvZGVfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JUHlfc3NpemVfdCBhcmdzX2xlbjsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX3VuaWNvZGVfXyIsICZzZWxmKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlhcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiYXJncyIpOwotCWlmICghYXJncykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlhcmdzX2xlbiA9IFB5U2VxdWVuY2VfU2l6ZShhcmdzKTsKLQlpZiAoYXJnc19sZW4gPCAwKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGFyZ3NfbGVuID09IDApIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOwotCX0KLQllbHNlIGlmIChhcmdzX2xlbiA9PSAxKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlQeU9iamVjdCAqdW5pY29kZV9vYmo7Ci0KLQkJaWYgKCF0ZW1wKSB7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCXVuaWNvZGVfb2JqID0gUHlPYmplY3RfVW5pY29kZSh0ZW1wKTsKLQkJUHlfREVDUkVGKHRlbXApOwotCQlyZXR1cm4gdW5pY29kZV9vYmo7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqdW5pY29kZV9vYmogPSBQeU9iamVjdF9Vbmljb2RlKGFyZ3MpOwotCi0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJcmV0dXJuIHVuaWNvZGVfb2JqOwotCX0KLX0KLSNlbmRpZiAvKiBQeV9VU0lOR19VTklDT0RFICovCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1CYXNlRXhjZXB0aW9uX19yZXByX18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotCVB5T2JqZWN0ICphcmdzX2F0dHI7Ci0JUHlfc3NpemVfdCBhcmdzX2xlbjsKLQlQeU9iamVjdCAqcmVwcl9zdWZmaXg7Ci0JUHlPYmplY3QgKnJlcHI7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fcmVwcl9fIiwgJnNlbGYpKQotCQlyZXR1cm4gTlVMTDsKLQotCWFyZ3NfYXR0ciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiKTsKLQlpZiAoIWFyZ3NfYXR0cikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlhcmdzX2xlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3NfYXR0cik7Ci0JaWYgKGFyZ3NfbGVuIDwgMCkgewotCQlQeV9ERUNSRUYoYXJnc19hdHRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGFyZ3NfbGVuID09IDApIHsKLQkJUHlfREVDUkVGKGFyZ3NfYXR0cik7Ci0JCXJlcHJfc3VmZml4ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiKCkiKTsKLQkJaWYgKCFyZXByX3N1ZmZpeCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKmFyZ3NfcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJnc19hdHRyKTsKLQkJUHlfREVDUkVGKGFyZ3NfYXR0cik7Ci0JCWlmICghYXJnc19yZXByKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJcmVwcl9zdWZmaXggPSBhcmdzX3JlcHI7Ci0JfQotCi0JcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JaWYgKCFyZXByKSB7Ci0JCVB5X0RFQ1JFRihyZXByX3N1ZmZpeCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwciwgcmVwcl9zdWZmaXgpOwotCXJldHVybiByZXByOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotQmFzZUV4Y2VwdGlvbl9fZ2V0aXRlbV9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBQeU9iamVjdCAqb3V0OwotICAgIFB5T2JqZWN0ICppbmRleDsKLQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086X19nZXRpdGVtX18iLCAmc2VsZiwgJmluZGV4KSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBhcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiYXJncyIpOwotICAgIGlmICghYXJncykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBvdXQgPSBQeU9iamVjdF9HZXRJdGVtKGFyZ3MsIGluZGV4KTsKLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgcmV0dXJuIG91dDsKLX0KLQotCi1zdGF0aWMgUHlNZXRob2REZWYKLUJhc2VFeGNlcHRpb25fbWV0aG9kc1tdID0gewotICAgIC8qIG1ldGhvZHMgZm9yIHRoZSBCYXNlRXhjZXB0aW9uIGNsYXNzICovCi0gICAgeyJfX2dldGl0ZW1fXyIsIEJhc2VFeGNlcHRpb25fX2dldGl0ZW1fXywgTUVUSF9WQVJBUkdTfSwKLSAgICB7Il9fcmVwcl9fIiwgQmFzZUV4Y2VwdGlvbl9fcmVwcl9fLCBNRVRIX1ZBUkFSR1N9LAotICAgIHsiX19zdHJfXyIsICAgICBCYXNlRXhjZXB0aW9uX19zdHJfXywgTUVUSF9WQVJBUkdTfSwKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gICAgeyJfX3VuaWNvZGVfXyIsICBCYXNlRXhjZXB0aW9uX191bmljb2RlX18sIE1FVEhfVkFSQVJHU30sCi0jZW5kaWYgLyogUHlfVVNJTkdfVU5JQ09ERSAqLwotICAgIHsiX19pbml0X18iLCAgICBCYXNlRXhjZXB0aW9uX19pbml0X18sIE1FVEhfVkFSQVJHU30sCi0gICAge05VTEwsIE5VTEwgfQotfTsKLQotCi1zdGF0aWMgaW50Ci1tYWtlX0Jhc2VFeGNlcHRpb24oY2hhciAqbW9kdWxlbmFtZSkKLXsKLSAgICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKLSAgICBQeU9iamVjdCAqc3RyID0gTlVMTDsKLSAgICBQeU9iamVjdCAqbmFtZSA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKmVtcHR5dHVwbGUgPSBOVUxMOwotICAgIFB5T2JqZWN0ICphcmdzdHVwbGUgPSBOVUxMOwotICAgIGludCBzdGF0dXMgPSAtMTsKLQotICAgIGlmICghZGljdCkKLQlyZXR1cm4gLTE7Ci0KLSAgICAvKiBJZiBhbiBlcnJvciBvY2N1cnMgZnJvbSBoZXJlIG9uLCBnb3RvIGZpbmFsbHkgaW5zdGVhZCBvZiBleHBsaWNpdGx5Ci0gICAgICogcmV0dXJuaW5nIE5VTEwuCi0gICAgICovCi0KLSAgICBpZiAoIShzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1vZHVsZW5hbWUpKSkKLQlnb3RvIGZpbmFsbHk7Ci0gICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIiwgc3RyKSkKLQlnb3RvIGZpbmFsbHk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0KLSAgICBpZiAoIShzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKEJhc2VFeGNlcHRpb25fX2RvY19fKSkpCi0JZ290byBmaW5hbGx5OwotICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19kb2NfXyIsIHN0cikpCi0JZ290byBmaW5hbGx5OwotCi0gICAgaWYgKCEobmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIkJhc2VFeGNlcHRpb24iKSkpCi0JZ290byBmaW5hbGx5OwotCi0gICAgaWYgKCEoZW1wdHl0dXBsZSA9IFB5VHVwbGVfTmV3KDApKSkKLQlnb3RvIGZpbmFsbHk7Ci0gICAgICAgIAotICAgIGlmICghKGFyZ3N0dXBsZSA9IFB5VHVwbGVfUGFjaygzLCBuYW1lLCBlbXB0eXR1cGxlLCBkaWN0KSkpCi0JZ290byBmaW5hbGx5OwotICAgICAgIAotICAgIGlmICghKFB5RXhjX0Jhc2VFeGNlcHRpb24gPSBQeVR5cGVfVHlwZS50cF9uZXcoJlB5VHlwZV9UeXBlLCBhcmdzdHVwbGUsCi0JCQkJCQkgICAgICAgCU5VTEwpKSkKLQlnb3RvIGZpbmFsbHk7Ci0KLSAgICAvKiBOb3cgcG9wdWxhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUgbWV0aG9kIHN1aXRlICovCi0gICAgaWYgKHBvcHVsYXRlX21ldGhvZHMoUHlFeGNfQmFzZUV4Y2VwdGlvbiwgQmFzZUV4Y2VwdGlvbl9tZXRob2RzKSkKLQkvKiBEb24ndCBuZWVkIHRvIHJlY2xhaW0gUHlFeGNfQmFzZUV4Y2VwdGlvbiBoZXJlIGJlY2F1c2UgdGhhdCdsbAotCSAqIGhhcHBlbiBkdXJpbmcgaW50ZXJwcmV0ZXIgc2h1dGRvd24uCi0JICovCi0JZ290byBmaW5hbGx5OwotCi0gICAgc3RhdHVzID0gMDsKLQotICBmaW5hbGx5OgotICAgIFB5X1hERUNSRUYoZGljdCk7Ci0gICAgUHlfWERFQ1JFRihzdHIpOwotICAgIFB5X1hERUNSRUYobmFtZSk7Ci0gICAgUHlfWERFQ1JFRihlbXB0eXR1cGxlKTsKLSAgICBQeV9YREVDUkVGKGFyZ3N0dXBsZSk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotCi0MCi1QeURvY19TVFJWQVIoRXhjZXB0aW9uX19kb2NfXywgIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgbm9uLWV4aXQgZXhjZXB0aW9ucy4iKTsKLQotUHlEb2NfU1RSVkFSKFN0YW5kYXJkRXJyb3JfX2RvY19fLAotIkJhc2UgY2xhc3MgZm9yIGFsbCBzdGFuZGFyZCBQeXRob24gZXhjZXB0aW9ucyB0aGF0IGRvIG5vdCByZXByZXNlbnQiCi0iaW50ZXJwcmV0ZXIgZXhpdGluZy4iKTsKLQotUHlEb2NfU1RSVkFSKFR5cGVFcnJvcl9fZG9jX18sICJJbmFwcHJvcHJpYXRlIGFyZ3VtZW50IHR5cGUuIik7Ci0KLVB5RG9jX1NUUlZBUihTdG9wSXRlcmF0aW9uX19kb2NfXywgIlNpZ25hbCB0aGUgZW5kIGZyb20gaXRlcmF0b3IubmV4dCgpLiIpOwotUHlEb2NfU1RSVkFSKEdlbmVyYXRvckV4aXRfX2RvY19fLCAiUmVxdWVzdCB0aGF0IGEgZ2VuZXJhdG9yIGV4aXQuIik7Ci0KLQotDAotUHlEb2NfU1RSVkFSKFN5c3RlbUV4aXRfX2RvY19fLCAiUmVxdWVzdCB0byBleGl0IGZyb20gdGhlIGludGVycHJldGVyLiIpOwotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1TeXN0ZW1FeGl0X19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICpjb2RlOwotICAgIGludCBzdGF0dXM7Ci0KLSAgICBpZiAoIShzZWxmID0gZ2V0X3NlbGYoYXJncykpKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKCEoYXJncyA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKSkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFzZXRfYXJnc19hbmRfbWVzc2FnZShzZWxmLCBhcmdzKSkgewotCSAgICBQeV9ERUNSRUYoYXJncyk7Ci0JICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qIHNldCBjb2RlIGF0dHJpYnV0ZSAqLwotICAgIHN3aXRjaCAoUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKSB7Ci0gICAgY2FzZSAwOgotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIGNvZGUgPSBQeV9Ob25lOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGNvZGUgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJncywgMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgLTE6Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKLSAgICAgICAgY29kZSA9IGFyZ3M7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN0YXR1cyA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImNvZGUiLCBjb2RlKTsKLSAgICBQeV9ERUNSRUYoY29kZSk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIGlmIChzdGF0dXMgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIFB5X1JFVFVSTl9OT05FOwotfQotCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBTeXN0ZW1FeGl0X21ldGhvZHNbXSA9IHsKLSAgICB7ICJfX2luaXRfXyIsIFN5c3RlbUV4aXRfX2luaXRfXywgTUVUSF9WQVJBUkdTfSwKLSAgICB7TlVMTCwgTlVMTH0KLX07Ci0KLQotDAotUHlEb2NfU1RSVkFSKEtleWJvYXJkSW50ZXJydXB0X19kb2NfXywgIlByb2dyYW0gaW50ZXJydXB0ZWQgYnkgdXNlci4iKTsKLQotUHlEb2NfU1RSVkFSKEltcG9ydEVycm9yX19kb2NfXywKLSJJbXBvcnQgY2FuJ3QgZmluZCBtb2R1bGUsIG9yIGNhbid0IGZpbmQgbmFtZSBpbiBtb2R1bGUuIik7Ci0KLQotDAotUHlEb2NfU1RSVkFSKEVudmlyb25tZW50RXJyb3JfX2RvY19fLCAiQmFzZSBjbGFzcyBmb3IgSS9PIHJlbGF0ZWQgZXJyb3JzLiIpOwotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1FbnZpcm9ubWVudEVycm9yX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICppdGVtMCA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKml0ZW0xID0gTlVMTDsKLSAgICBQeU9iamVjdCAqaXRlbTIgPSBOVUxMOwotICAgIFB5T2JqZWN0ICpzdWJzbGljZSA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKnJ0bnZhbCA9IE5VTEw7Ci0KLSAgICBpZiAoIShzZWxmID0gZ2V0X3NlbGYoYXJncykpKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKCEoYXJncyA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKSkpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoIXNldF9hcmdzX2FuZF9tZXNzYWdlKHNlbGYsIGFyZ3MpKSB7Ci0JICAgIFB5X0RFQ1JFRihhcmdzKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImVycm5vIiwgUHlfTm9uZSkgfHwKLQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJzdHJlcnJvciIsIFB5X05vbmUpIHx8Ci0JUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiZmlsZW5hbWUiLCBQeV9Ob25lKSkKLSAgICB7Ci0JZ290byBmaW5hbGx5OwotICAgIH0KLQotICAgIHN3aXRjaCAoUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKSB7Ci0gICAgY2FzZSAzOgotCS8qIFdoZXJlIGEgZnVuY3Rpb24gaGFzIGEgc2luZ2xlIGZpbGVuYW1lLCBzdWNoIGFzIG9wZW4oKSBvciBzb21lCi0JICogb2YgdGhlIG9zIG1vZHVsZSBmdW5jdGlvbnMsIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZSgpIGlzCi0JICogY2FsbGVkLCBnaXZpbmcgYSB0aGlyZCBhcmd1bWVudCB3aGljaCBpcyB0aGUgZmlsZW5hbWUuICBCdXQsIHNvCi0JICogdGhhdCBvbGQgY29kZSB1c2luZyBpbi1wbGFjZSB1bnBhY2tpbmcgZG9lc24ndCBicmVhaywgZS5nLjoKLQkgKgotCSAqIGV4Y2VwdCBJT0Vycm9yLCAoZXJybm8sIHN0cmVycm9yKToKLQkgKgotCSAqIHdlIGhhY2sgYXJncyBzbyB0aGF0IGl0IG9ubHkgY29udGFpbnMgdHdvIGl0ZW1zLiAgVGhpcyBhbHNvCi0JICogbWVhbnMgd2UgbmVlZCBvdXIgb3duIF9fc3RyX18oKSB3aGljaCBwcmludHMgb3V0IHRoZSBmaWxlbmFtZQotCSAqIHdoZW4gaXQgd2FzIHN1cHBsaWVkLgotCSAqLwotCWl0ZW0wID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZ3MsIDApOwotCWl0ZW0xID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZ3MsIDEpOwotCWl0ZW0yID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZ3MsIDIpOwotCWlmICghaXRlbTAgfHwgIWl0ZW0xIHx8ICFpdGVtMikKLQkgICAgZ290byBmaW5hbGx5OwotCi0JaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImVycm5vIiwgaXRlbTApIHx8Ci0JICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgInN0cmVycm9yIiwgaXRlbTEpIHx8Ci0JICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImZpbGVuYW1lIiwgaXRlbTIpKQotCXsKLQkgICAgZ290byBmaW5hbGx5OwotCX0KLQotCXN1YnNsaWNlID0gUHlTZXF1ZW5jZV9HZXRTbGljZShhcmdzLCAwLCAyKTsKLQlpZiAoIXN1YnNsaWNlIHx8IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiLCBzdWJzbGljZSkpCi0JICAgIGdvdG8gZmluYWxseTsKLQlicmVhazsKLQotICAgIGNhc2UgMjoKLQkvKiBVc2VkIHdoZW4gUHlFcnJfU2V0RnJvbUVycm5vKCkgaXMgY2FsbGVkIGFuZCBubyBmaWxlbmFtZQotCSAqIGFyZ3VtZW50IGlzIGdpdmVuLgotCSAqLwotCWl0ZW0wID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZ3MsIDApOwotCWl0ZW0xID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZ3MsIDEpOwotCWlmICghaXRlbTAgfHwgIWl0ZW0xKQotCSAgICBnb3RvIGZpbmFsbHk7Ci0KLQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiZXJybm8iLCBpdGVtMCkgfHwKLQkgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAic3RyZXJyb3IiLCBpdGVtMSkpCi0JewotCSAgICBnb3RvIGZpbmFsbHk7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSAtMToKLQlQeUVycl9DbGVhcigpOwotCWJyZWFrOwotICAgIH0KLQotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICBydG52YWwgPSBQeV9Ob25lOwotCi0gIGZpbmFsbHk6Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIFB5X1hERUNSRUYoaXRlbTApOwotICAgIFB5X1hERUNSRUYoaXRlbTEpOwotICAgIFB5X1hERUNSRUYoaXRlbTIpOwotICAgIFB5X1hERUNSRUYoc3Vic2xpY2UpOwotICAgIHJldHVybiBydG52YWw7Ci19Ci0KLQotc3RhdGljIFB5T2JqZWN0ICoKLUVudmlyb25tZW50RXJyb3JfX3N0cl9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICBQeU9iamVjdCAqb3JpZ2luYWxzZWxmID0gc2VsZjsKLSAgICBQeU9iamVjdCAqZmlsZW5hbWU7Ci0gICAgUHlPYmplY3QgKnNlcnJubzsKLSAgICBQeU9iamVjdCAqc3RyZXJyb3I7Ci0gICAgUHlPYmplY3QgKnJ0bnZhbCA9IE5VTEw7Ci0KLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19zdHJfXyIsICZzZWxmKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGZpbGVuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiZmlsZW5hbWUiKTsKLSAgICBzZXJybm8gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJlcnJubyIpOwotICAgIHN0cmVycm9yID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAic3RyZXJyb3IiKTsKLSAgICBpZiAoIWZpbGVuYW1lIHx8ICFzZXJybm8gfHwgIXN0cmVycm9yKQotCWdvdG8gZmluYWxseTsKLQotICAgIGlmIChmaWxlbmFtZSAhPSBQeV9Ob25lKSB7Ci0JUHlPYmplY3QgKmZtdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIltFcnJubyAlc10gJXM6ICVzIik7Ci0JUHlPYmplY3QgKnJlcHIgPSBQeU9iamVjdF9SZXByKGZpbGVuYW1lKTsKLQlQeU9iamVjdCAqdHVwbGUgPSBQeVR1cGxlX05ldygzKTsKLQotCWlmICghZm10IHx8ICFyZXByIHx8ICF0dXBsZSkgewotCSAgICBQeV9YREVDUkVGKGZtdCk7Ci0JICAgIFB5X1hERUNSRUYocmVwcik7Ci0JICAgIFB5X1hERUNSRUYodHVwbGUpOwotCSAgICBnb3RvIGZpbmFsbHk7Ci0JfQotCi0JUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgc2Vycm5vKTsKLQlQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAxLCBzdHJlcnJvcik7Ci0JUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMiwgcmVwcik7Ci0KLQlydG52YWwgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCB0dXBsZSk7Ci0KLQlQeV9ERUNSRUYoZm10KTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCS8qIGFscmVhZHkgZnJlZWQgYmVjYXVzZSB0dXBsZSBvd25lZCBvbmx5IHJlZmVyZW5jZSAqLwotCXNlcnJubyA9IE5VTEw7Ci0Jc3RyZXJyb3IgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIGlmIChQeU9iamVjdF9Jc1RydWUoc2Vycm5vKSAmJiBQeU9iamVjdF9Jc1RydWUoc3RyZXJyb3IpKSB7Ci0JUHlPYmplY3QgKmZtdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIltFcnJubyAlc10gJXMiKTsKLQlQeU9iamVjdCAqdHVwbGUgPSBQeVR1cGxlX05ldygyKTsKLQotCWlmICghZm10IHx8ICF0dXBsZSkgewotCSAgICBQeV9YREVDUkVGKGZtdCk7Ci0JICAgIFB5X1hERUNSRUYodHVwbGUpOwotCSAgICBnb3RvIGZpbmFsbHk7Ci0JfQotCi0JUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgc2Vycm5vKTsKLQlQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAxLCBzdHJlcnJvcik7Ci0KLQlydG52YWwgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCB0dXBsZSk7Ci0KLQlQeV9ERUNSRUYoZm10KTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCS8qIGFscmVhZHkgZnJlZWQgYmVjYXVzZSB0dXBsZSBvd25lZCBvbmx5IHJlZmVyZW5jZSAqLwotCXNlcnJubyA9IE5VTEw7Ci0Jc3RyZXJyb3IgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlCi0JLyogVGhlIG9yaWdpbmFsIFB5dGhvbiBjb2RlIHNhaWQ6Ci0JICoKLQkgKiAgIHJldHVybiBTdGFuZGFyZEVycm9yLl9fc3RyX18oc2VsZikKLQkgKgotCSAqIGJ1dCB0aGVyZSBpcyBubyBTdGFuZGFyZEVycm9yX19zdHJfXygpIGZ1bmN0aW9uOyB3ZSBoYXBwZW4gdG8KLQkgKiBrbm93IHRoYXQncyBqdXN0IGEgcGFzcyB0aHJvdWdoIHRvIEJhc2VFeGNlcHRpb25fX3N0cl9fKCkuCi0JICovCi0JcnRudmFsID0gQmFzZUV4Y2VwdGlvbl9fc3RyX18ob3JpZ2luYWxzZWxmLCBhcmdzKTsKLQotICBmaW5hbGx5OgotICAgIFB5X1hERUNSRUYoZmlsZW5hbWUpOwotICAgIFB5X1hERUNSRUYoc2Vycm5vKTsKLSAgICBQeV9YREVDUkVGKHN0cmVycm9yKTsKLSAgICByZXR1cm4gcnRudmFsOwotfQotCi0KLXN0YXRpYwotUHlNZXRob2REZWYgRW52aXJvbm1lbnRFcnJvcl9tZXRob2RzW10gPSB7Ci0gICAgeyJfX2luaXRfXyIsIEVudmlyb25tZW50RXJyb3JfX2luaXRfXywgTUVUSF9WQVJBUkdTfSwKLSAgICB7Il9fc3RyX18iLCAgRW52aXJvbm1lbnRFcnJvcl9fc3RyX18sIE1FVEhfVkFSQVJHU30sCi0gICAge05VTEwsIE5VTEx9Ci19OwotCi0KLQotDAotUHlEb2NfU1RSVkFSKElPRXJyb3JfX2RvY19fLCAiSS9PIG9wZXJhdGlvbiBmYWlsZWQuIik7Ci0KLVB5RG9jX1NUUlZBUihPU0Vycm9yX19kb2NfXywgIk9TIHN5c3RlbSBjYWxsIGZhaWxlZC4iKTsKLQotI2lmZGVmIE1TX1dJTkRPV1MKLVB5RG9jX1NUUlZBUihXaW5kb3dzRXJyb3JfX2RvY19fLCAiTVMtV2luZG93cyBPUyBzeXN0ZW0gY2FsbCBmYWlsZWQuIik7Ci0jZW5kaWYgLyogTVNfV0lORE9XUyAqLwotCi0jaWZkZWYgX19WTVMKLXN0YXRpYyBjaGFyCi1WTVNFcnJvcl9fZG9jX19bXSA9ICJPcGVuVk1TIE9TIHN5c3RlbSBjYWxsIGZhaWxlZC4iOwotI2VuZGlmCi0KLVB5RG9jX1NUUlZBUihFT0ZFcnJvcl9fZG9jX18sICJSZWFkIGJleW9uZCBlbmQgb2YgZmlsZS4iKTsKLQotUHlEb2NfU1RSVkFSKFJ1bnRpbWVFcnJvcl9fZG9jX18sICJVbnNwZWNpZmllZCBydW4tdGltZSBlcnJvci4iKTsKLQotUHlEb2NfU1RSVkFSKE5vdEltcGxlbWVudGVkRXJyb3JfX2RvY19fLAotIk1ldGhvZCBvciBmdW5jdGlvbiBoYXNuJ3QgYmVlbiBpbXBsZW1lbnRlZCB5ZXQuIik7Ci0KLVB5RG9jX1NUUlZBUihOYW1lRXJyb3JfX2RvY19fLCAiTmFtZSBub3QgZm91bmQgZ2xvYmFsbHkuIik7Ci0KLVB5RG9jX1NUUlZBUihVbmJvdW5kTG9jYWxFcnJvcl9fZG9jX18sCi0iTG9jYWwgbmFtZSByZWZlcmVuY2VkIGJ1dCBub3QgYm91bmQgdG8gYSB2YWx1ZS4iKTsKLQotUHlEb2NfU1RSVkFSKEF0dHJpYnV0ZUVycm9yX19kb2NfXywgIkF0dHJpYnV0ZSBub3QgZm91bmQuIik7Ci0KLQotDAotUHlEb2NfU1RSVkFSKFN5bnRheEVycm9yX19kb2NfXywgIkludmFsaWQgc3ludGF4LiIpOwotCi0KLXN0YXRpYyBpbnQKLVN5bnRheEVycm9yX19jbGFzc2luaXRfXyhQeU9iamVjdCAqa2xhc3MpCi17Ci0gICAgaW50IHJldHZhbCA9IDA7Ci0gICAgUHlPYmplY3QgKmVtcHR5c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0KLSAgICAvKiBBZGRpdGlvbmFsIGNsYXNzLWNyZWF0aW9uIHRpbWUgaW5pdGlhbGl6YXRpb25zICovCi0gICAgaWYgKCFlbXB0eXN0cmluZyB8fAotCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoa2xhc3MsICJtc2ciLCBlbXB0eXN0cmluZykgfHwKLQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGtsYXNzLCAiZmlsZW5hbWUiLCBQeV9Ob25lKSB8fAotCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoa2xhc3MsICJsaW5lbm8iLCBQeV9Ob25lKSB8fAotCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoa2xhc3MsICJvZmZzZXQiLCBQeV9Ob25lKSB8fAotCVB5T2JqZWN0X1NldEF0dHJTdHJpbmcoa2xhc3MsICJ0ZXh0IiwgUHlfTm9uZSkgfHwKLQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGtsYXNzLCAicHJpbnRfZmlsZV9hbmRfbGluZSIsIFB5X05vbmUpKQotICAgIHsKLQlyZXR2YWwgPSAtMTsKLSAgICB9Ci0gICAgUHlfWERFQ1JFRihlbXB0eXN0cmluZyk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QgKgotU3ludGF4RXJyb3JfX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKnJ0bnZhbCA9IE5VTEw7Ci0gICAgUHlfc3NpemVfdCBsZW5hcmdzOwotCi0gICAgaWYgKCEoc2VsZiA9IGdldF9zZWxmKGFyZ3MpKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGlmICghKGFyZ3MgPSBQeVNlcXVlbmNlX0dldFNsaWNlKGFyZ3MsIDEsIFB5U2VxdWVuY2VfU2l6ZShhcmdzKSkpKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKCFzZXRfYXJnc19hbmRfbWVzc2FnZShzZWxmLCBhcmdzKSkgewotCSAgICBQeV9ERUNSRUYoYXJncyk7Ci0JICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGxlbmFyZ3MgPSBQeVNlcXVlbmNlX1NpemUoYXJncyk7Ci0gICAgaWYgKGxlbmFyZ3MgPj0gMSkgewotCVB5T2JqZWN0ICppdGVtMCA9IFB5U2VxdWVuY2VfR2V0SXRlbShhcmdzLCAwKTsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCFpdGVtMCkKLQkgICAgZ290byBmaW5hbGx5OwotCXN0YXR1cyA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgIm1zZyIsIGl0ZW0wKTsKLQlQeV9ERUNSRUYoaXRlbTApOwotCWlmIChzdGF0dXMpCi0JICAgIGdvdG8gZmluYWxseTsKLSAgICB9Ci0gICAgaWYgKGxlbmFyZ3MgPT0gMikgewotCVB5T2JqZWN0ICppbmZvID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZ3MsIDEpOwotCVB5T2JqZWN0ICpmaWxlbmFtZSA9IE5VTEwsICpsaW5lbm8gPSBOVUxMOwotCVB5T2JqZWN0ICpvZmZzZXQgPSBOVUxMLCAqdGV4dCA9IE5VTEw7Ci0JaW50IHN0YXR1cyA9IDE7Ci0KLQlpZiAoIWluZm8pCi0JICAgIGdvdG8gZmluYWxseTsKLQotCWZpbGVuYW1lID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGluZm8sIDApOwotCWlmIChmaWxlbmFtZSAhPSBOVUxMKSB7Ci0JICAgIGxpbmVubyA9IFB5U2VxdWVuY2VfR2V0SXRlbShpbmZvLCAxKTsKLQkgICAgaWYgKGxpbmVubyAhPSBOVUxMKSB7Ci0JCW9mZnNldCA9IFB5U2VxdWVuY2VfR2V0SXRlbShpbmZvLCAyKTsKLQkJaWYgKG9mZnNldCAhPSBOVUxMKSB7Ci0JCSAgICB0ZXh0ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGluZm8sIDMpOwotCQkgICAgaWYgKHRleHQgIT0gTlVMTCkgewotCQkJc3RhdHVzID0KLQkJCSAgICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJmaWxlbmFtZSIsIGZpbGVuYW1lKQotCQkJICAgIHx8IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImxpbmVubyIsIGxpbmVubykKLQkJCSAgICB8fCBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJvZmZzZXQiLCBvZmZzZXQpCi0JCQkgICAgfHwgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAidGV4dCIsIHRleHQpOwotCQkJUHlfREVDUkVGKHRleHQpOwotCQkgICAgfQotCQkgICAgUHlfREVDUkVGKG9mZnNldCk7Ci0JCX0KLQkJUHlfREVDUkVGKGxpbmVubyk7Ci0JICAgIH0KLQkgICAgUHlfREVDUkVGKGZpbGVuYW1lKTsKLQl9Ci0JUHlfREVDUkVGKGluZm8pOwotCi0JaWYgKHN0YXR1cykKLQkgICAgZ290byBmaW5hbGx5OwotICAgIH0KLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcnRudmFsID0gUHlfTm9uZTsKLQotICBmaW5hbGx5OgotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICByZXR1cm4gcnRudmFsOwotfQotCi0KLS8qIFRoaXMgaXMgY2FsbGVkICJteV9iYXNlbmFtZSIgaW5zdGVhZCBvZiBqdXN0ICJiYXNlbmFtZSIgdG8gYXZvaWQgbmFtZQotICAgY29uZmxpY3RzIHdpdGggZ2xpYmM7IGJhc2VuYW1lIGlzIGFscmVhZHkgcHJvdG90eXBlZCBpZiBfR05VX1NPVVJDRSBpcwotICAgZGVmaW5lZCwgYW5kIFB5dGhvbiBkb2VzIGRlZmluZSB0aGF0LiAqLwotc3RhdGljIGNoYXIgKgotbXlfYmFzZW5hbWUoY2hhciAqbmFtZSkKLXsKLQljaGFyICpjcCA9IG5hbWU7Ci0JY2hhciAqcmVzdWx0ID0gbmFtZTsKLQotCWlmIChuYW1lID09IE5VTEwpCi0JCXJldHVybiAiPz8/IjsKLQl3aGlsZSAoKmNwICE9ICdcMCcpIHsKLQkJaWYgKCpjcCA9PSBTRVApCi0JCQlyZXN1bHQgPSBjcCArIDE7Ci0JCSsrY3A7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIFB5T2JqZWN0ICoKLVN5bnRheEVycm9yX19zdHJfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKm1zZzsKLSAgICBQeU9iamVjdCAqc3RyOwotICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgKmxpbmVubywgKnJlc3VsdDsKLQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX3N0cl9fIiwgJnNlbGYpKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKCEobXNnID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAibXNnIikpKQotCXJldHVybiBOVUxMOwotCi0gICAgc3RyID0gUHlPYmplY3RfU3RyKG1zZyk7Ci0gICAgUHlfREVDUkVGKG1zZyk7Ci0gICAgcmVzdWx0ID0gc3RyOwotCi0gICAgLyogWFhYIC0tIGRvIGFsbCB0aGUgYWRkaXRpb25hbCBmb3JtYXR0aW5nIHdpdGggZmlsZW5hbWUgYW5kCi0gICAgICAgbGluZW5vIGhlcmUgKi8KLQotICAgIGlmIChzdHIgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhzdHIpKSB7Ci0JaW50IGhhdmVfZmlsZW5hbWUgPSAwOwotCWludCBoYXZlX2xpbmVubyA9IDA7Ci0JY2hhciAqYnVmZmVyID0gTlVMTDsKLQotCWlmICgoZmlsZW5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJmaWxlbmFtZSIpKSAhPSBOVUxMKQotCSAgICBoYXZlX2ZpbGVuYW1lID0gUHlTdHJpbmdfQ2hlY2soZmlsZW5hbWUpOwotCWVsc2UKLQkgICAgUHlFcnJfQ2xlYXIoKTsKLQotCWlmICgobGluZW5vID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAibGluZW5vIikpICE9IE5VTEwpCi0JICAgIGhhdmVfbGluZW5vID0gUHlJbnRfQ2hlY2sobGluZW5vKTsKLQllbHNlCi0JICAgIFB5RXJyX0NsZWFyKCk7Ci0KLQlpZiAoaGF2ZV9maWxlbmFtZSB8fCBoYXZlX2xpbmVubykgewotCSAgICBQeV9zc2l6ZV90IGJ1ZnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShzdHIpICsgNjQ7Ci0JICAgIGlmIChoYXZlX2ZpbGVuYW1lKQotCQlidWZzaXplICs9IFB5U3RyaW5nX0dFVF9TSVpFKGZpbGVuYW1lKTsKLQotCSAgICBidWZmZXIgPSAoY2hhciAqKVB5TWVtX01BTExPQyhidWZzaXplKTsKLQkgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0JCWlmIChoYXZlX2ZpbGVuYW1lICYmIGhhdmVfbGluZW5vKQotCQkgICAgUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZnNpemUsICIlcyAoJXMsIGxpbmUgJWxkKSIsCi0JCQkJICBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSwKLQkJCQkgIG15X2Jhc2VuYW1lKFB5U3RyaW5nX0FTX1NUUklORyhmaWxlbmFtZSkpLAotCQkJCSAgUHlJbnRfQXNMb25nKGxpbmVubykpOwotCQllbHNlIGlmIChoYXZlX2ZpbGVuYW1lKQotCQkgICAgUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZnNpemUsICIlcyAoJXMpIiwKLQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhzdHIpLAotCQkJCSAgbXlfYmFzZW5hbWUoUHlTdHJpbmdfQVNfU1RSSU5HKGZpbGVuYW1lKSkpOwotCQllbHNlIGlmIChoYXZlX2xpbmVubykKLQkJICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZzaXplLCAiJXMgKGxpbmUgJWxkKSIsCi0JCQkJICBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSwKLQkJCQkgIFB5SW50X0FzTG9uZyhsaW5lbm8pKTsKLQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7Ci0JCVB5TWVtX0ZSRUUoYnVmZmVyKTsKLQotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCSAgICByZXN1bHQgPSBzdHI7Ci0JCWVsc2UKLQkJICAgIFB5X0RFQ1JFRihzdHIpOwotCSAgICB9Ci0JfQotCVB5X1hERUNSRUYoZmlsZW5hbWUpOwotCVB5X1hERUNSRUYobGluZW5vKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgUHlNZXRob2REZWYgU3ludGF4RXJyb3JfbWV0aG9kc1tdID0gewotICAgIHsiX19pbml0X18iLCBTeW50YXhFcnJvcl9faW5pdF9fLCBNRVRIX1ZBUkFSR1N9LAotICAgIHsiX19zdHJfXyIsICBTeW50YXhFcnJvcl9fc3RyX18sIE1FVEhfVkFSQVJHU30sCi0gICAge05VTEwsIE5VTEx9Ci19OwotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1LZXlFcnJvcl9fc3RyX18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICphcmdzYXR0cjsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fc3RyX18iLCAmc2VsZikpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBhcmdzYXR0ciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiKTsKLSAgICBpZiAoIWFyZ3NhdHRyKQotCSAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIElmIGFyZ3MgaXMgYSB0dXBsZSBvZiBleGFjdGx5IG9uZSBpdGVtLCBhcHBseSByZXByIHRvIGFyZ3NbMF0uCi0gICAgICAgVGhpcyBpcyBkb25lIHNvIHRoYXQgZS5nLiB0aGUgZXhjZXB0aW9uIHJhaXNlZCBieSB7fVsnJ10gcHJpbnRzCi0gICAgICAgICBLZXlFcnJvcjogJycKLSAgICAgICByYXRoZXIgdGhhbiB0aGUgY29uZnVzaW5nCi0gICAgICAgICBLZXlFcnJvcgotICAgICAgIGFsb25lLiAgVGhlIGRvd25zaWRlIGlzIHRoYXQgaWYgS2V5RXJyb3IgaXMgcmFpc2VkIHdpdGggYW4gZXhwbGFuYXRvcnkKLSAgICAgICBzdHJpbmcsIHRoYXQgc3RyaW5nIHdpbGwgYmUgZGlzcGxheWVkIGluIHF1b3Rlcy4gIFRvbyBiYWQuCi0gICAgICAgSWYgYXJncyBpcyBhbnl0aGluZyBlbHNlLCB1c2UgdGhlIGRlZmF1bHQgQmFzZUV4Y2VwdGlvbl9fc3RyX18oKS4KLSAgICAqLwotICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZ3NhdHRyKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3NhdHRyKSA9PSAxKSB7Ci0JUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0oYXJnc2F0dHIsIDApOwotCXJlc3VsdCA9IFB5T2JqZWN0X1JlcHIoa2V5KTsKLSAgICB9Ci0gICAgZWxzZQotCXJlc3VsdCA9IEJhc2VFeGNlcHRpb25fX3N0cl9fKHNlbGYsIGFyZ3MpOwotCi0gICAgUHlfREVDUkVGKGFyZ3NhdHRyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgS2V5RXJyb3JfbWV0aG9kc1tdID0gewotICAgIHsiX19zdHJfXyIsICBLZXlFcnJvcl9fc3RyX18sIE1FVEhfVkFSQVJHU30sCi0gICAge05VTEwsIE5VTEx9Ci19OwotCi0KLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi1zdGF0aWMKLWludCBnZXRfaW50KFB5T2JqZWN0ICpleGMsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgKnZhbHVlKQotewotICAgIFB5T2JqZWN0ICphdHRyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGMsIChjaGFyICopbmFtZSk7Ci0KLSAgICBpZiAoIWF0dHIpCi0JcmV0dXJuIC0xOwotICAgIGlmIChQeUludF9DaGVjayhhdHRyKSkgewotICAgICAgICAqdmFsdWUgPSBQeUludF9BU19MT05HKGF0dHIpOwotICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKGF0dHIpKSB7Ci0JKnZhbHVlID0gKHNpemVfdClQeUxvbmdfQXNMb25nTG9uZyhhdHRyKTsKLQlpZiAoKnZhbHVlID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihhdHRyKTsKLQkJcmV0dXJuIC0xOwotCX0KLSAgICB9IGVsc2UgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlLjIwMHMgYXR0cmlidXRlIG11c3QgYmUgaW50IiwgbmFtZSk7Ci0JUHlfREVDUkVGKGF0dHIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgUHlfREVDUkVGKGF0dHIpOwotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYwotaW50IHNldF9zc2l6ZV90KFB5T2JqZWN0ICpleGMsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgdmFsdWUpCi17Ci0gICAgUHlPYmplY3QgKm9iaiA9IFB5SW50X0Zyb21Tc2l6ZV90KHZhbHVlKTsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFvYmopCi0JcmV0dXJuIC0xOwotICAgIHJlc3VsdCA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoZXhjLCAoY2hhciAqKW5hbWUsIG9iaik7Ci0gICAgUHlfREVDUkVGKG9iaik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljCi1QeU9iamVjdCAqZ2V0X3N0cmluZyhQeU9iamVjdCAqZXhjLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIFB5T2JqZWN0ICphdHRyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGMsIChjaGFyICopbmFtZSk7Ci0KLSAgICBpZiAoIWF0dHIpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFQeVN0cmluZ19DaGVjayhhdHRyKSkgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlLjIwMHMgYXR0cmlidXRlIG11c3QgYmUgc3RyIiwgbmFtZSk7Ci0JUHlfREVDUkVGKGF0dHIpOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gYXR0cjsKLX0KLQotCi1zdGF0aWMKLWludCBzZXRfc3RyaW5nKFB5T2JqZWN0ICpleGMsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIFB5T2JqZWN0ICpvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKTsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFvYmopCi0JcmV0dXJuIC0xOwotICAgIHJlc3VsdCA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoZXhjLCAoY2hhciAqKW5hbWUsIG9iaik7Ci0gICAgUHlfREVDUkVGKG9iaik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMKLVB5T2JqZWN0ICpnZXRfdW5pY29kZShQeU9iamVjdCAqZXhjLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIFB5T2JqZWN0ICphdHRyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGMsIChjaGFyICopbmFtZSk7Ci0KLSAgICBpZiAoIWF0dHIpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soYXR0cikpIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJS4yMDBzIGF0dHJpYnV0ZSBtdXN0IGJlIHVuaWNvZGUiLCBuYW1lKTsKLQlQeV9ERUNSRUYoYXR0cik7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBhdHRyOwotfQotCi1QeU9iamVjdCAqIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICpleGMpCi17Ci0gICAgcmV0dXJuIGdldF9zdHJpbmcoZXhjLCAiZW5jb2RpbmciKTsKLX0KLQotUHlPYmplY3QgKiBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZyhQeU9iamVjdCAqZXhjKQotewotICAgIHJldHVybiBnZXRfc3RyaW5nKGV4YywgImVuY29kaW5nIik7Ci19Ci0KLVB5T2JqZWN0ICpQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKmV4YykKLXsKLSAgICByZXR1cm4gZ2V0X3VuaWNvZGUoZXhjLCAib2JqZWN0Iik7Ci19Ci0KLVB5T2JqZWN0ICpQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKmV4YykKLXsKLSAgICByZXR1cm4gZ2V0X3N0cmluZyhleGMsICJvYmplY3QiKTsKLX0KLQotUHlPYmplY3QgKlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdChQeU9iamVjdCAqZXhjKQotewotICAgIHJldHVybiBnZXRfdW5pY29kZShleGMsICJvYmplY3QiKTsKLX0KLQotaW50IFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgKnN0YXJ0KQotewotICAgIGlmICghZ2V0X2ludChleGMsICJzdGFydCIsIHN0YXJ0KSkgewotCVB5T2JqZWN0ICpvYmplY3QgPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoZXhjKTsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFvYmplY3QpCi0JICAgIHJldHVybiAtMTsKLQlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKG9iamVjdCk7Ci0JaWYgKCpzdGFydDwwKQotCSAgICAqc3RhcnQgPSAwOyAvKlhYWCBjaGVjayBmb3IgdmFsdWVzIDwwKi8KLQlpZiAoKnN0YXJ0Pj1zaXplKQotCSAgICAqc3RhcnQgPSBzaXplLTE7Ci0JUHlfREVDUkVGKG9iamVjdCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotCi1pbnQgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqc3RhcnQpCi17Ci0gICAgaWYgKCFnZXRfaW50KGV4YywgInN0YXJ0Iiwgc3RhcnQpKSB7Ci0JUHlPYmplY3QgKm9iamVjdCA9IFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdChleGMpOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIW9iamVjdCkKLQkgICAgcmV0dXJuIC0xOwotCXNpemUgPSBQeVN0cmluZ19HRVRfU0laRShvYmplY3QpOwotCWlmICgqc3RhcnQ8MCkKLQkgICAgKnN0YXJ0ID0gMDsKLQlpZiAoKnN0YXJ0Pj1zaXplKQotCSAgICAqc3RhcnQgPSBzaXplLTE7Ci0JUHlfREVDUkVGKG9iamVjdCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQotCi1pbnQgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqc3RhcnQpCi17Ci0gICAgcmV0dXJuIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4Yywgc3RhcnQpOwotfQotCi0KLWludCBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90IHN0YXJ0KQotewotICAgIHJldHVybiBzZXRfc3NpemVfdChleGMsICJzdGFydCIsIHN0YXJ0KTsKLX0KLQotCi1pbnQgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCBzdGFydCkKLXsKLSAgICByZXR1cm4gc2V0X3NzaXplX3QoZXhjLCAic3RhcnQiLCBzdGFydCk7Ci19Ci0KLQotaW50IFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3Qgc3RhcnQpCi17Ci0gICAgcmV0dXJuIHNldF9zc2l6ZV90KGV4YywgInN0YXJ0Iiwgc3RhcnQpOwotfQotCi0KLWludCBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqZW5kKQotewotICAgIGlmICghZ2V0X2ludChleGMsICJlbmQiLCBlbmQpKSB7Ci0JUHlPYmplY3QgKm9iamVjdCA9IFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdChleGMpOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIW9iamVjdCkKLQkgICAgcmV0dXJuIC0xOwotCXNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUob2JqZWN0KTsKLQlpZiAoKmVuZDwxKQotCSAgICAqZW5kID0gMTsKLQlpZiAoKmVuZD5zaXplKQotCSAgICAqZW5kID0gc2l6ZTsKLQlQeV9ERUNSRUYob2JqZWN0KTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi0KLWludCBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCAqZW5kKQotewotICAgIGlmICghZ2V0X2ludChleGMsICJlbmQiLCBlbmQpKSB7Ci0JUHlPYmplY3QgKm9iamVjdCA9IFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdChleGMpOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIW9iamVjdCkKLQkgICAgcmV0dXJuIC0xOwotCXNpemUgPSBQeVN0cmluZ19HRVRfU0laRShvYmplY3QpOwotCWlmICgqZW5kPDEpCi0JICAgICplbmQgPSAxOwotCWlmICgqZW5kPnNpemUpCi0JICAgICplbmQgPSBzaXplOwotCVB5X0RFQ1JFRihvYmplY3QpOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotaW50IFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90ICpzdGFydCkKLXsKLSAgICByZXR1cm4gUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKGV4Yywgc3RhcnQpOwotfQotCi0KLWludCBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQoUHlPYmplY3QgKmV4YywgUHlfc3NpemVfdCBlbmQpCi17Ci0gICAgcmV0dXJuIHNldF9zc2l6ZV90KGV4YywgImVuZCIsIGVuZCk7Ci19Ci0KLQotaW50IFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZChQeU9iamVjdCAqZXhjLCBQeV9zc2l6ZV90IGVuZCkKLXsKLSAgICByZXR1cm4gc2V0X3NzaXplX3QoZXhjLCAiZW5kIiwgZW5kKTsKLX0KLQotCi1pbnQgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kKFB5T2JqZWN0ICpleGMsIFB5X3NzaXplX3QgZW5kKQotewotICAgIHJldHVybiBzZXRfc3NpemVfdChleGMsICJlbmQiLCBlbmQpOwotfQotCi0KLVB5T2JqZWN0ICpQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb24oUHlPYmplY3QgKmV4YykKLXsKLSAgICByZXR1cm4gZ2V0X3N0cmluZyhleGMsICJyZWFzb24iKTsKLX0KLQotCi1QeU9iamVjdCAqUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uKFB5T2JqZWN0ICpleGMpCi17Ci0gICAgcmV0dXJuIGdldF9zdHJpbmcoZXhjLCAicmVhc29uIik7Ci19Ci0KLQotUHlPYmplY3QgKlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbihQeU9iamVjdCAqZXhjKQotewotICAgIHJldHVybiBnZXRfc3RyaW5nKGV4YywgInJlYXNvbiIpOwotfQotCi0KLWludCBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24oUHlPYmplY3QgKmV4YywgY29uc3QgY2hhciAqcmVhc29uKQotewotICAgIHJldHVybiBzZXRfc3RyaW5nKGV4YywgInJlYXNvbiIsIHJlYXNvbik7Ci19Ci0KLQotaW50IFB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbihQeU9iamVjdCAqZXhjLCBjb25zdCBjaGFyICpyZWFzb24pCi17Ci0gICAgcmV0dXJuIHNldF9zdHJpbmcoZXhjLCAicmVhc29uIiwgcmVhc29uKTsKLX0KLQotCi1pbnQgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uKFB5T2JqZWN0ICpleGMsIGNvbnN0IGNoYXIgKnJlYXNvbikKLXsKLSAgICByZXR1cm4gc2V0X3N0cmluZyhleGMsICJyZWFzb24iLCByZWFzb24pOwotfQotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1Vbmljb2RlRXJyb3JfX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5VHlwZU9iamVjdCAqb2JqZWN0dHlwZSkKLXsKLSAgICBQeU9iamVjdCAqcnRudmFsID0gTlVMTDsKLSAgICBQeU9iamVjdCAqZW5jb2Rpbmc7Ci0gICAgUHlPYmplY3QgKm9iamVjdDsKLSAgICBQeU9iamVjdCAqc3RhcnQ7Ci0gICAgUHlPYmplY3QgKmVuZDsKLSAgICBQeU9iamVjdCAqcmVhc29uOwotCi0gICAgaWYgKCEoc2VsZiA9IGdldF9zZWxmKGFyZ3MpKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGlmICghKGFyZ3MgPSBQeVNlcXVlbmNlX0dldFNsaWNlKGFyZ3MsIDEsIFB5U2VxdWVuY2VfU2l6ZShhcmdzKSkpKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKCFzZXRfYXJnc19hbmRfbWVzc2FnZShzZWxmLCBhcmdzKSkgewotCSAgICBQeV9ERUNSRUYoYXJncyk7Ci0JICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFPIU8hTyFPISIsCi0JJlB5U3RyaW5nX1R5cGUsICZlbmNvZGluZywKLQlvYmplY3R0eXBlLCAmb2JqZWN0LAotCSZQeUludF9UeXBlLCAmc3RhcnQsCi0JJlB5SW50X1R5cGUsICZlbmQsCi0JJlB5U3RyaW5nX1R5cGUsICZyZWFzb24pKQotCWdvdG8gZmluYWxseTsKLQotICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJlbmNvZGluZyIsIGVuY29kaW5nKSkKLQlnb3RvIGZpbmFsbHk7Ci0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgIm9iamVjdCIsIG9iamVjdCkpCi0JZ290byBmaW5hbGx5OwotICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJzdGFydCIsIHN0YXJ0KSkKLQlnb3RvIGZpbmFsbHk7Ci0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImVuZCIsIGVuZCkpCi0JZ290byBmaW5hbGx5OwotICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJyZWFzb24iLCByZWFzb24pKQotCWdvdG8gZmluYWxseTsKLQotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICBydG52YWwgPSBQeV9Ob25lOwotCi0gIGZpbmFsbHk6Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIHJldHVybiBydG52YWw7Ci19Ci0KLQotc3RhdGljIFB5T2JqZWN0ICoKLVVuaWNvZGVFbmNvZGVFcnJvcl9faW5pdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLSAgICByZXR1cm4gVW5pY29kZUVycm9yX19pbml0X18oc2VsZiwgYXJncywgJlB5VW5pY29kZV9UeXBlKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLVVuaWNvZGVFbmNvZGVFcnJvcl9fc3RyX18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCi17Ci0gICAgUHlPYmplY3QgKmVuY29kaW5nT2JqID0gTlVMTDsKLSAgICBQeU9iamVjdCAqb2JqZWN0T2JqID0gTlVMTDsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0OwotICAgIFB5X3NzaXplX3QgZW5kOwotICAgIFB5T2JqZWN0ICpyZWFzb25PYmogPSBOVUxMOwotICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCi0gICAgc2VsZiA9IGFyZzsKLQotICAgIGlmICghKGVuY29kaW5nT2JqID0gUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2Rpbmcoc2VsZikpKQotCWdvdG8gZXJyb3I7Ci0KLSAgICBpZiAoIShvYmplY3RPYmogPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3Qoc2VsZikpKQotCWdvdG8gZXJyb3I7Ci0KLSAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoc2VsZiwgJnN0YXJ0KSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChzZWxmLCAmZW5kKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKCEocmVhc29uT2JqID0gUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uKHNlbGYpKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKGVuZD09c3RhcnQrMSkgewotCWludCBiYWRjaGFyID0gKGludClQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmplY3RPYmopW3N0YXJ0XTsKLQljaGFyIGJhZGNoYXJfc3RyWzIwXTsKLQlpZiAoYmFkY2hhciA8PSAweGZmKQotCSAgICBQeU9TX3NucHJpbnRmKGJhZGNoYXJfc3RyLCBzaXplb2YoYmFkY2hhcl9zdHIpLCAieCUwMngiLCBiYWRjaGFyKTsKLQllbHNlIGlmIChiYWRjaGFyIDw9IDB4ZmZmZikKLQkgICAgUHlPU19zbnByaW50ZihiYWRjaGFyX3N0ciwgc2l6ZW9mKGJhZGNoYXJfc3RyKSwgInUlMDR4IiwgYmFkY2hhcik7Ci0JZWxzZQotCSAgICBQeU9TX3NucHJpbnRmKGJhZGNoYXJfc3RyLCBzaXplb2YoYmFkY2hhcl9zdHIpLCAiVSUwOHgiLCBiYWRjaGFyKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAotCSAgICAiJyUuNDAwcycgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciB1J1xcJXMnIGluIHBvc2l0aW9uICV6ZDogJS40MDBzIiwKLQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGVuY29kaW5nT2JqKSwKLQkgICAgYmFkY2hhcl9zdHIsCi0JICAgIHN0YXJ0LAotCSAgICBQeVN0cmluZ19BU19TVFJJTkcocmVhc29uT2JqKQotCSk7Ci0gICAgfQotICAgIGVsc2UgewotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCi0JICAgICInJS40MDBzJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAlemQtJXpkOiAlLjQwMHMiLAotCSAgICBQeVN0cmluZ19BU19TVFJJTkcoZW5jb2RpbmdPYmopLAotCSAgICBzdGFydCwKLQkgICAgKGVuZC0xKSwKLQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHJlYXNvbk9iaikKLQkpOwotICAgIH0KLQotZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZWFzb25PYmopOwotICAgIFB5X1hERUNSRUYob2JqZWN0T2JqKTsKLSAgICBQeV9YREVDUkVGKGVuY29kaW5nT2JqKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgVW5pY29kZUVuY29kZUVycm9yX21ldGhvZHNbXSA9IHsKLSAgICB7Il9faW5pdF9fIiwgVW5pY29kZUVuY29kZUVycm9yX19pbml0X18sIE1FVEhfVkFSQVJHU30sCi0gICAgeyJfX3N0cl9fIiwgIFVuaWNvZGVFbmNvZGVFcnJvcl9fc3RyX18sIE1FVEhfT30sCi0gICAge05VTEwsIE5VTEx9Ci19OwotCi0KLVB5T2JqZWN0ICogUHlVbmljb2RlRW5jb2RlRXJyb3JfQ3JlYXRlKAotCWNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBQeV9VTklDT0RFICpvYmplY3QsIFB5X3NzaXplX3QgbGVuZ3RoLAotCVB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBjb25zdCBjaGFyICpyZWFzb24pCi17Ci0gICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IsICJzdSNubnMiLAotCWVuY29kaW5nLCBvYmplY3QsIGxlbmd0aCwgc3RhcnQsIGVuZCwgcmVhc29uKTsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QgKgotVW5pY29kZURlY29kZUVycm9yX19pbml0X18oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIHJldHVybiBVbmljb2RlRXJyb3JfX2luaXRfXyhzZWxmLCBhcmdzLCAmUHlTdHJpbmdfVHlwZSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1Vbmljb2RlRGVjb2RlRXJyb3JfX3N0cl9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQotewotICAgIFB5T2JqZWN0ICplbmNvZGluZ09iaiA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKm9iamVjdE9iaiA9IE5VTEw7Ci0gICAgUHlfc3NpemVfdCBzdGFydDsKLSAgICBQeV9zc2l6ZV90IGVuZDsKLSAgICBQeU9iamVjdCAqcmVhc29uT2JqID0gTlVMTDsKLSAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQotICAgIHNlbGYgPSBhcmc7Ci0KLSAgICBpZiAoIShlbmNvZGluZ09iaiA9IFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nKHNlbGYpKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKCEob2JqZWN0T2JqID0gUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0KHNlbGYpKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKFB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0KHNlbGYsICZzdGFydCkpCi0JZ290byBlcnJvcjsKLQotICAgIGlmIChQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoc2VsZiwgJmVuZCkpCi0JZ290byBlcnJvcjsKLQotICAgIGlmICghKHJlYXNvbk9iaiA9IFB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbihzZWxmKSkpCi0JZ290byBlcnJvcjsKLQotICAgIGlmIChlbmQ9PXN0YXJ0KzEpIHsKLQkvKiBGcm9tRm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgJTAyeCwgc28gZm9ybWF0IHRoYXQgc2VwYXJhdGVseSAqLwotCWNoYXIgYnl0ZVs0XTsKLQlQeU9TX3NucHJpbnRmKGJ5dGUsIHNpemVvZihieXRlKSwgIiUwMngiLCAKLQkJICAgICAgKChpbnQpUHlTdHJpbmdfQVNfU1RSSU5HKG9iamVjdE9iailbc3RhcnRdKSYweGZmKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAkJCQkgICAgIAotCSAgICAiJyUuNDAwcycgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGUgMHglcyBpbiBwb3NpdGlvbiAlemQ6ICUuNDAwcyIsCi0JICAgIFB5U3RyaW5nX0FTX1NUUklORyhlbmNvZGluZ09iaiksCi0JICAgIGJ5dGUsCi0JICAgIHN0YXJ0LAotCSAgICBQeVN0cmluZ19BU19TVFJJTkcocmVhc29uT2JqKQotCSk7Ci0gICAgfQotICAgIGVsc2UgewotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCi0JICAgICInJS40MDBzJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZXMgaW4gcG9zaXRpb24gJXpkLSV6ZDogJS40MDBzIiwKLQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGVuY29kaW5nT2JqKSwKLQkgICAgc3RhcnQsCi0JICAgIChlbmQtMSksCi0JICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZWFzb25PYmopCi0JKTsKLSAgICB9Ci0KLQotZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZWFzb25PYmopOwotICAgIFB5X1hERUNSRUYob2JqZWN0T2JqKTsKLSAgICBQeV9YREVDUkVGKGVuY29kaW5nT2JqKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgVW5pY29kZURlY29kZUVycm9yX21ldGhvZHNbXSA9IHsKLSAgICB7Il9faW5pdF9fIiwgVW5pY29kZURlY29kZUVycm9yX19pbml0X18sIE1FVEhfVkFSQVJHU30sCi0gICAgeyJfX3N0cl9fIiwgIFVuaWNvZGVEZWNvZGVFcnJvcl9fc3RyX18sIE1FVEhfT30sCi0gICAge05VTEwsIE5VTEx9Ci19OwotCi0KLVB5T2JqZWN0ICogUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlKAotCWNvbnN0IGNoYXIgKmVuY29kaW5nLCBjb25zdCBjaGFyICpvYmplY3QsIFB5X3NzaXplX3QgbGVuZ3RoLAotCVB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBjb25zdCBjaGFyICpyZWFzb24pCi17Ci0JYXNzZXJ0KGxlbmd0aCA8IElOVF9NQVgpOwotCWFzc2VydChzdGFydCA8IElOVF9NQVgpOwotCWFzc2VydChlbmQgPCBJTlRfTUFYKTsKLSAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciwgInNzI25ucyIsCi0JZW5jb2RpbmcsIG9iamVjdCwgbGVuZ3RoLCBzdGFydCwgZW5kLCByZWFzb24pOwotfQotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1Vbmljb2RlVHJhbnNsYXRlRXJyb3JfX2luaXRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKnJ0bnZhbCA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKm9iamVjdDsKLSAgICBQeU9iamVjdCAqc3RhcnQ7Ci0gICAgUHlPYmplY3QgKmVuZDsKLSAgICBQeU9iamVjdCAqcmVhc29uOwotCi0gICAgaWYgKCEoc2VsZiA9IGdldF9zZWxmKGFyZ3MpKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGlmICghKGFyZ3MgPSBQeVNlcXVlbmNlX0dldFNsaWNlKGFyZ3MsIDEsIFB5U2VxdWVuY2VfU2l6ZShhcmdzKSkpKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKCFzZXRfYXJnc19hbmRfbWVzc2FnZShzZWxmLCBhcmdzKSkgewotCSAgICBQeV9ERUNSRUYoYXJncyk7Ci0JICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFPIU8hTyEiLAotCSZQeVVuaWNvZGVfVHlwZSwgJm9iamVjdCwKLQkmUHlJbnRfVHlwZSwgJnN0YXJ0LAotCSZQeUludF9UeXBlLCAmZW5kLAotCSZQeVN0cmluZ19UeXBlLCAmcmVhc29uKSkKLQlnb3RvIGZpbmFsbHk7Ci0KLSAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAib2JqZWN0Iiwgb2JqZWN0KSkKLQlnb3RvIGZpbmFsbHk7Ci0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgInN0YXJ0Iiwgc3RhcnQpKQotCWdvdG8gZmluYWxseTsKLSAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiZW5kIiwgZW5kKSkKLQlnb3RvIGZpbmFsbHk7Ci0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgInJlYXNvbiIsIHJlYXNvbikpCi0JZ290byBmaW5hbGx5OwotCi0gICAgcnRudmFsID0gUHlfTm9uZTsKLSAgICBQeV9JTkNSRUYocnRudmFsKTsKLQotICBmaW5hbGx5OgotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICByZXR1cm4gcnRudmFsOwotfQotCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1Vbmljb2RlVHJhbnNsYXRlRXJyb3JfX3N0cl9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQotewotICAgIFB5T2JqZWN0ICpvYmplY3RPYmogPSBOVUxMOwotICAgIFB5X3NzaXplX3Qgc3RhcnQ7Ci0gICAgUHlfc3NpemVfdCBlbmQ7Ci0gICAgUHlPYmplY3QgKnJlYXNvbk9iaiA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0KLSAgICBzZWxmID0gYXJnOwotCi0gICAgaWYgKCEob2JqZWN0T2JqID0gUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0KHNlbGYpKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0KHNlbGYsICZzdGFydCkpCi0JZ290byBlcnJvcjsKLQotICAgIGlmIChQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQoc2VsZiwgJmVuZCkpCi0JZ290byBlcnJvcjsKLQotICAgIGlmICghKHJlYXNvbk9iaiA9IFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbihzZWxmKSkpCi0JZ290byBlcnJvcjsKLQotICAgIGlmIChlbmQ9PXN0YXJ0KzEpIHsKLQlpbnQgYmFkY2hhciA9IChpbnQpUHlVbmljb2RlX0FTX1VOSUNPREUob2JqZWN0T2JqKVtzdGFydF07Ci0JY2hhciBiYWRjaGFyX3N0clsyMF07Ci0JaWYgKGJhZGNoYXIgPD0gMHhmZikKLQkgICAgUHlPU19zbnByaW50ZihiYWRjaGFyX3N0ciwgc2l6ZW9mKGJhZGNoYXJfc3RyKSwgInglMDJ4IiwgYmFkY2hhcik7Ci0JZWxzZSBpZiAoYmFkY2hhciA8PSAweGZmZmYpCi0JICAgIFB5T1Nfc25wcmludGYoYmFkY2hhcl9zdHIsIHNpemVvZihiYWRjaGFyX3N0ciksICJ1JTA0eCIsIGJhZGNoYXIpOwotCWVsc2UKLQkgICAgUHlPU19zbnByaW50ZihiYWRjaGFyX3N0ciwgc2l6ZW9mKGJhZGNoYXJfc3RyKSwgIlUlMDh4IiwgYmFkY2hhcik7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKLSAgICAgICAgICAgICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVyIHUnXFwlcycgaW4gcG9zaXRpb24gJXpkOiAlLjQwMHMiLAotCSAgICBiYWRjaGFyX3N0ciwKLQkgICAgc3RhcnQsCi0JICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZWFzb25PYmopCi0JKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKLQkgICAgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uICV6ZC0lemQ6ICUuNDAwcyIsCi0JICAgIHN0YXJ0LAotCSAgICAoZW5kLTEpLAotCSAgICBQeVN0cmluZ19BU19TVFJJTkcocmVhc29uT2JqKQotCSk7Ci0gICAgfQotCi1lcnJvcjoKLSAgICBQeV9YREVDUkVGKHJlYXNvbk9iaik7Ci0gICAgUHlfWERFQ1JFRihvYmplY3RPYmopOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBVbmljb2RlVHJhbnNsYXRlRXJyb3JfbWV0aG9kc1tdID0gewotICAgIHsiX19pbml0X18iLCBVbmljb2RlVHJhbnNsYXRlRXJyb3JfX2luaXRfXywgTUVUSF9WQVJBUkdTfSwKLSAgICB7Il9fc3RyX18iLCAgVW5pY29kZVRyYW5zbGF0ZUVycm9yX19zdHJfXywgTUVUSF9PfSwKLSAgICB7TlVMTCwgTlVMTH0KLX07Ci0KLQotUHlPYmplY3QgKiBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9DcmVhdGUoCi0JY29uc3QgUHlfVU5JQ09ERSAqb2JqZWN0LCBQeV9zc2l6ZV90IGxlbmd0aCwKLQlQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCwgY29uc3QgY2hhciAqcmVhc29uKQotewotICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yLCAidSNubnMiLAotCW9iamVjdCwgbGVuZ3RoLCBzdGFydCwgZW5kLCByZWFzb24pOwotfQotI2VuZGlmCi0KLQotDAotLyogRXhjZXB0aW9uIGRvYyBzdHJpbmdzICovCi0KLVB5RG9jX1NUUlZBUihBc3NlcnRpb25FcnJvcl9fZG9jX18sICJBc3NlcnRpb24gZmFpbGVkLiIpOwotCi1QeURvY19TVFJWQVIoTG9va3VwRXJyb3JfX2RvY19fLCAiQmFzZSBjbGFzcyBmb3IgbG9va3VwIGVycm9ycy4iKTsKLQotUHlEb2NfU1RSVkFSKEluZGV4RXJyb3JfX2RvY19fLCAiU2VxdWVuY2UgaW5kZXggb3V0IG9mIHJhbmdlLiIpOwotCi1QeURvY19TVFJWQVIoS2V5RXJyb3JfX2RvY19fLCAiTWFwcGluZyBrZXkgbm90IGZvdW5kLiIpOwotCi1QeURvY19TVFJWQVIoQXJpdGhtZXRpY0Vycm9yX19kb2NfXywgIkJhc2UgY2xhc3MgZm9yIGFyaXRobWV0aWMgZXJyb3JzLiIpOwotCi1QeURvY19TVFJWQVIoT3ZlcmZsb3dFcnJvcl9fZG9jX18sICJSZXN1bHQgdG9vIGxhcmdlIHRvIGJlIHJlcHJlc2VudGVkLiIpOwotCi1QeURvY19TVFJWQVIoWmVyb0RpdmlzaW9uRXJyb3JfX2RvY19fLAotIlNlY29uZCBhcmd1bWVudCB0byBhIGRpdmlzaW9uIG9yIG1vZHVsbyBvcGVyYXRpb24gd2FzIHplcm8uIik7Ci0KLVB5RG9jX1NUUlZBUihGbG9hdGluZ1BvaW50RXJyb3JfX2RvY19fLCAiRmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uIGZhaWxlZC4iKTsKLQotUHlEb2NfU1RSVkFSKFZhbHVlRXJyb3JfX2RvY19fLAotIkluYXBwcm9wcmlhdGUgYXJndW1lbnQgdmFsdWUgKG9mIGNvcnJlY3QgdHlwZSkuIik7Ci0KLVB5RG9jX1NUUlZBUihVbmljb2RlRXJyb3JfX2RvY19fLCAiVW5pY29kZSByZWxhdGVkIGVycm9yLiIpOwotCi0jaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotUHlEb2NfU1RSVkFSKFVuaWNvZGVFbmNvZGVFcnJvcl9fZG9jX18sICJVbmljb2RlIGVuY29kaW5nIGVycm9yLiIpOwotCi1QeURvY19TVFJWQVIoVW5pY29kZURlY29kZUVycm9yX19kb2NfXywgIlVuaWNvZGUgZGVjb2RpbmcgZXJyb3IuIik7Ci0KLVB5RG9jX1NUUlZBUihVbmljb2RlVHJhbnNsYXRlRXJyb3JfX2RvY19fLCAiVW5pY29kZSB0cmFuc2xhdGlvbiBlcnJvci4iKTsKLSNlbmRpZgotCi1QeURvY19TVFJWQVIoU3lzdGVtRXJyb3JfX2RvY19fLAotIkludGVybmFsIGVycm9yIGluIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuXG5cCi1cblwKLVBsZWFzZSByZXBvcnQgdGhpcyB0byB0aGUgUHl0aG9uIG1haW50YWluZXIsIGFsb25nIHdpdGggdGhlIHRyYWNlYmFjayxcblwKLXRoZSBQeXRob24gdmVyc2lvbiwgYW5kIHRoZSBoYXJkd2FyZS9PUyBwbGF0Zm9ybSBhbmQgdmVyc2lvbi4iKTsKLQotUHlEb2NfU1RSVkFSKFJlZmVyZW5jZUVycm9yX19kb2NfXywKLSJXZWFrIHJlZiBwcm94eSB1c2VkIGFmdGVyIHJlZmVyZW50IHdlbnQgYXdheS4iKTsKLQotUHlEb2NfU1RSVkFSKE1lbW9yeUVycm9yX19kb2NfXywgIk91dCBvZiBtZW1vcnkuIik7Ci0KLVB5RG9jX1NUUlZBUihJbmRlbnRhdGlvbkVycm9yX19kb2NfXywgIkltcHJvcGVyIGluZGVudGF0aW9uLiIpOwotCi1QeURvY19TVFJWQVIoVGFiRXJyb3JfX2RvY19fLCAiSW1wcm9wZXIgbWl4dHVyZSBvZiBzcGFjZXMgYW5kIHRhYnMuIik7Ci0KLS8qIFdhcm5pbmcgY2F0ZWdvcnkgZG9jc3RyaW5ncyAqLwotCi1QeURvY19TVFJWQVIoV2FybmluZ19fZG9jX18sICJCYXNlIGNsYXNzIGZvciB3YXJuaW5nIGNhdGVnb3JpZXMuIik7Ci0KLVB5RG9jX1NUUlZBUihVc2VyV2FybmluZ19fZG9jX18sCi0iQmFzZSBjbGFzcyBmb3Igd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IHVzZXIgY29kZS4iKTsKLQotUHlEb2NfU1RSVkFSKERlcHJlY2F0aW9uV2FybmluZ19fZG9jX18sCi0iQmFzZSBjbGFzcyBmb3Igd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBmZWF0dXJlcy4iKTsKLQotUHlEb2NfU1RSVkFSKFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmdfX2RvY19fLAotIkJhc2UgY2xhc3MgZm9yIHdhcm5pbmdzIGFib3V0IGZlYXR1cmVzIHdoaWNoIHdpbGwgYmUgZGVwcmVjYXRlZCAiCi0iaW4gdGhlIGZ1dHVyZS4iKTsKLQotUHlEb2NfU1RSVkFSKFN5bnRheFdhcm5pbmdfX2RvY19fLAotIkJhc2UgY2xhc3MgZm9yIHdhcm5pbmdzIGFib3V0IGR1YmlvdXMgc3ludGF4LiIpOwotCi1QeURvY19TVFJWQVIoT3ZlcmZsb3dXYXJuaW5nX19kb2NfXywKLSJCYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBudW1lcmljIG92ZXJmbG93LiAgV29uJ3QgZXhpc3QgaW4gUHl0aG9uIDIuNS4iKTsKLQotUHlEb2NfU1RSVkFSKFJ1bnRpbWVXYXJuaW5nX19kb2NfXywKLSJCYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBkdWJpb3VzIHJ1bnRpbWUgYmVoYXZpb3IuIik7Ci0KLVB5RG9jX1NUUlZBUihGdXR1cmVXYXJuaW5nX19kb2NfXywKLSJCYXNlIGNsYXNzIGZvciB3YXJuaW5ncyBhYm91dCBjb25zdHJ1Y3RzIHRoYXQgd2lsbCBjaGFuZ2Ugc2VtYW50aWNhbGx5ICIKLSJpbiB0aGUgZnV0dXJlLiIpOwotCi0KLQwKLS8qIG1vZHVsZSBnbG9iYWwgZnVuY3Rpb25zICovCi1zdGF0aWMgUHlNZXRob2REZWYgZnVuY3Rpb25zW10gPSB7Ci0gICAgLyogU2VudGluZWwgKi8KLSAgICB7TlVMTCwgTlVMTH0KLX07Ci0KLQotDAotLyogR2xvYmFsIEMgQVBJIGRlZmluZWQgZXhjZXB0aW9ucyAqLwotCi1QeU9iamVjdCAqUHlFeGNfQmFzZUV4Y2VwdGlvbjsKLVB5T2JqZWN0ICpQeUV4Y19FeGNlcHRpb247Ci1QeU9iamVjdCAqUHlFeGNfU3RvcEl0ZXJhdGlvbjsKLVB5T2JqZWN0ICpQeUV4Y19HZW5lcmF0b3JFeGl0OwotUHlPYmplY3QgKlB5RXhjX1N0YW5kYXJkRXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfQXJpdGhtZXRpY0Vycm9yOwotUHlPYmplY3QgKlB5RXhjX0xvb2t1cEVycm9yOwotCi1QeU9iamVjdCAqUHlFeGNfQXNzZXJ0aW9uRXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfQXR0cmlidXRlRXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfRU9GRXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yOwotUHlPYmplY3QgKlB5RXhjX0Vudmlyb25tZW50RXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfSU9FcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19PU0Vycm9yOwotUHlPYmplY3QgKlB5RXhjX0ltcG9ydEVycm9yOwotUHlPYmplY3QgKlB5RXhjX0luZGV4RXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfS2V5RXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQ7Ci1QeU9iamVjdCAqUHlFeGNfTWVtb3J5RXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfTmFtZUVycm9yOwotUHlPYmplY3QgKlB5RXhjX092ZXJmbG93RXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfUnVudGltZUVycm9yOwotUHlPYmplY3QgKlB5RXhjX05vdEltcGxlbWVudGVkRXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfU3ludGF4RXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19UYWJFcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19SZWZlcmVuY2VFcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19TeXN0ZW1FcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19TeXN0ZW1FeGl0OwotUHlPYmplY3QgKlB5RXhjX1VuYm91bmRMb2NhbEVycm9yOwotUHlPYmplY3QgKlB5RXhjX1VuaWNvZGVFcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfVW5pY29kZURlY29kZUVycm9yOwotUHlPYmplY3QgKlB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19UeXBlRXJyb3I7Ci1QeU9iamVjdCAqUHlFeGNfVmFsdWVFcnJvcjsKLVB5T2JqZWN0ICpQeUV4Y19aZXJvRGl2aXNpb25FcnJvcjsKLSNpZmRlZiBNU19XSU5ET1dTCi1QeU9iamVjdCAqUHlFeGNfV2luZG93c0Vycm9yOwotI2VuZGlmCi0jaWZkZWYgX19WTVMKLVB5T2JqZWN0ICpQeUV4Y19WTVNFcnJvcjsKLSNlbmRpZgotCi0vKiBQcmUtY29tcHV0ZWQgTWVtb3J5RXJyb3IgaW5zdGFuY2UuICBCZXN0IHRvIGNyZWF0ZSB0aGlzIGFzIGVhcmx5IGFzCi0gKiBwb3NzaWJsZSBhbmQgbm90IHdhaXQgdW50aWwgYSBNZW1vcnlFcnJvciBpcyBhY3R1YWxseSByYWlzZWQhCi0gKi8KLVB5T2JqZWN0ICpQeUV4Y19NZW1vcnlFcnJvckluc3Q7Ci0KLS8qIFByZWRlZmluZWQgd2FybmluZyBjYXRlZ29yaWVzICovCi1QeU9iamVjdCAqUHlFeGNfV2FybmluZzsKLVB5T2JqZWN0ICpQeUV4Y19Vc2VyV2FybmluZzsKLVB5T2JqZWN0ICpQeUV4Y19EZXByZWNhdGlvbldhcm5pbmc7Ci1QeU9iamVjdCAqUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZzsKLVB5T2JqZWN0ICpQeUV4Y19TeW50YXhXYXJuaW5nOwotLyogUHlFeGNfT3ZlcmZsb3dXYXJuaW5nIHNob3VsZCBiZSByZW1vdmVkIGZvciBQeXRob24gMi41ICovCi1QeU9iamVjdCAqUHlFeGNfT3ZlcmZsb3dXYXJuaW5nOwotUHlPYmplY3QgKlB5RXhjX1J1bnRpbWVXYXJuaW5nOwotUHlPYmplY3QgKlB5RXhjX0Z1dHVyZVdhcm5pbmc7Ci0KLQotDAotLyogbWFwcGluZyBiZXR3ZWVuIGV4Y2VwdGlvbiBuYW1lcyBhbmQgdGhlaXIgUHlPYmplY3QgKiogKi8KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgUHlPYmplY3QgKipleGM7Ci0gICAgUHlPYmplY3QgKipiYXNlOwkJCSAgICAgLyogTlVMTCA9PSBQeUV4Y19TdGFuZGFyZEVycm9yICovCi0gICAgY2hhciAqZG9jc3RyOwotICAgIFB5TWV0aG9kRGVmICptZXRob2RzOwotICAgIGludCAoKmNsYXNzaW5pdCkoUHlPYmplY3QgKik7Ci19IGV4Y3RhYmxlW10gPSB7Ci0gLyoKLSAgKiBUaGUgZmlyc3QgZm91ciBjbGFzc2VzIE1VU1QgYXBwZWFyIGluIGV4YWN0bHkgdGhpcyBvcmRlcgotICAqLwotIHsiQmFzZUV4Y2VwdGlvbiIsICZQeUV4Y19CYXNlRXhjZXB0aW9ufSwKLSB7IkV4Y2VwdGlvbiIsICZQeUV4Y19FeGNlcHRpb24sICZQeUV4Y19CYXNlRXhjZXB0aW9uLCBFeGNlcHRpb25fX2RvY19ffSwKLSB7IlN0b3BJdGVyYXRpb24iLCAmUHlFeGNfU3RvcEl0ZXJhdGlvbiwgJlB5RXhjX0V4Y2VwdGlvbiwKLSAgU3RvcEl0ZXJhdGlvbl9fZG9jX199LAotIHsiR2VuZXJhdG9yRXhpdCIsICZQeUV4Y19HZW5lcmF0b3JFeGl0LCAmUHlFeGNfRXhjZXB0aW9uLAotICBHZW5lcmF0b3JFeGl0X19kb2NfX30sCi0geyJTdGFuZGFyZEVycm9yIiwgJlB5RXhjX1N0YW5kYXJkRXJyb3IsICZQeUV4Y19FeGNlcHRpb24sCi0gIFN0YW5kYXJkRXJyb3JfX2RvY19ffSwKLSB7IlR5cGVFcnJvciIsICZQeUV4Y19UeXBlRXJyb3IsIDAsIFR5cGVFcnJvcl9fZG9jX199LAotIC8qCi0gICogVGhlIHJlc3QgYXBwZWFyIGluIGRlcHRoLWZpcnN0IG9yZGVyIG9mIHRoZSBoaWVyYXJjaHkKLSAgKi8KLSB7IlN5c3RlbUV4aXQiLCAmUHlFeGNfU3lzdGVtRXhpdCwgJlB5RXhjX0Jhc2VFeGNlcHRpb24sIFN5c3RlbUV4aXRfX2RvY19fLAotICBTeXN0ZW1FeGl0X21ldGhvZHN9LAotIHsiS2V5Ym9hcmRJbnRlcnJ1cHQiLCAgJlB5RXhjX0tleWJvYXJkSW50ZXJydXB0LCAmUHlFeGNfQmFzZUV4Y2VwdGlvbiwKLQkgS2V5Ym9hcmRJbnRlcnJ1cHRfX2RvY19ffSwKLSB7IkltcG9ydEVycm9yIiwgICAgICAgICZQeUV4Y19JbXBvcnRFcnJvciwgICAgICAgMCwgSW1wb3J0RXJyb3JfX2RvY19ffSwKLSB7IkVudmlyb25tZW50RXJyb3IiLCAgICZQeUV4Y19FbnZpcm9ubWVudEVycm9yLCAgMCwgRW52aXJvbm1lbnRFcnJvcl9fZG9jX18sCi0gIEVudmlyb25tZW50RXJyb3JfbWV0aG9kc30sCi0geyJJT0Vycm9yIiwgJlB5RXhjX0lPRXJyb3IsICZQeUV4Y19FbnZpcm9ubWVudEVycm9yLCBJT0Vycm9yX19kb2NfX30sCi0geyJPU0Vycm9yIiwgJlB5RXhjX09TRXJyb3IsICZQeUV4Y19FbnZpcm9ubWVudEVycm9yLCBPU0Vycm9yX19kb2NfX30sCi0jaWZkZWYgTVNfV0lORE9XUwotIHsiV2luZG93c0Vycm9yIiwgJlB5RXhjX1dpbmRvd3NFcnJvciwgJlB5RXhjX09TRXJyb3IsCi0gIFdpbmRvd3NFcnJvcl9fZG9jX199LAotI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLSNpZmRlZiBfX1ZNUwotIHsiVk1TRXJyb3IiLCAmUHlFeGNfVk1TRXJyb3IsICZQeUV4Y19PU0Vycm9yLAotICBWTVNFcnJvcl9fZG9jX199LAotI2VuZGlmCi0geyJFT0ZFcnJvciIsICAgICAmUHlFeGNfRU9GRXJyb3IsICAgICAwLCBFT0ZFcnJvcl9fZG9jX199LAotIHsiUnVudGltZUVycm9yIiwgJlB5RXhjX1J1bnRpbWVFcnJvciwgMCwgUnVudGltZUVycm9yX19kb2NfX30sCi0geyJOb3RJbXBsZW1lbnRlZEVycm9yIiwgJlB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0gICZQeUV4Y19SdW50aW1lRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3JfX2RvY19ffSwKLSB7Ik5hbWVFcnJvciIsICAgICZQeUV4Y19OYW1lRXJyb3IsICAgIDAsIE5hbWVFcnJvcl9fZG9jX199LAotIHsiVW5ib3VuZExvY2FsRXJyb3IiLCAmUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsICZQeUV4Y19OYW1lRXJyb3IsCi0gIFVuYm91bmRMb2NhbEVycm9yX19kb2NfX30sCi0geyJBdHRyaWJ1dGVFcnJvciIsICAgICAmUHlFeGNfQXR0cmlidXRlRXJyb3IsIDAsIEF0dHJpYnV0ZUVycm9yX19kb2NfX30sCi0geyJTeW50YXhFcnJvciIsICAgICAgICAmUHlFeGNfU3ludGF4RXJyb3IsICAgIDAsIFN5bnRheEVycm9yX19kb2NfXywKLSAgU3ludGF4RXJyb3JfbWV0aG9kcywgU3ludGF4RXJyb3JfX2NsYXNzaW5pdF9ffSwKLSB7IkluZGVudGF0aW9uRXJyb3IiLCAgICZQeUV4Y19JbmRlbnRhdGlvbkVycm9yLCAmUHlFeGNfU3ludGF4RXJyb3IsCi0gIEluZGVudGF0aW9uRXJyb3JfX2RvY19ffSwKLSB7IlRhYkVycm9yIiwgICAmUHlFeGNfVGFiRXJyb3IsICZQeUV4Y19JbmRlbnRhdGlvbkVycm9yLAotICBUYWJFcnJvcl9fZG9jX199LAotIHsiQXNzZXJ0aW9uRXJyb3IiLCAgICAgJlB5RXhjX0Fzc2VydGlvbkVycm9yLCAwLCBBc3NlcnRpb25FcnJvcl9fZG9jX199LAotIHsiTG9va3VwRXJyb3IiLCAgICAgICAgJlB5RXhjX0xvb2t1cEVycm9yLCAgICAwLCBMb29rdXBFcnJvcl9fZG9jX199LAotIHsiSW5kZXhFcnJvciIsICAgICAgICAgJlB5RXhjX0luZGV4RXJyb3IsICAgICAmUHlFeGNfTG9va3VwRXJyb3IsCi0gIEluZGV4RXJyb3JfX2RvY19ffSwKLSB7IktleUVycm9yIiwgICAgICAgICAgICZQeUV4Y19LZXlFcnJvciwgICAgICAgJlB5RXhjX0xvb2t1cEVycm9yLAotICBLZXlFcnJvcl9fZG9jX18sIEtleUVycm9yX21ldGhvZHN9LAotIHsiQXJpdGhtZXRpY0Vycm9yIiwgICAgJlB5RXhjX0FyaXRobWV0aWNFcnJvciwgMCwgQXJpdGhtZXRpY0Vycm9yX19kb2NfX30sCi0geyJPdmVyZmxvd0Vycm9yIiwgICAgICAmUHlFeGNfT3ZlcmZsb3dFcnJvciwgICAgICZQeUV4Y19Bcml0aG1ldGljRXJyb3IsCi0gIE92ZXJmbG93RXJyb3JfX2RvY19ffSwKLSB7Ilplcm9EaXZpc2lvbkVycm9yIiwgICZQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwgICZQeUV4Y19Bcml0aG1ldGljRXJyb3IsCi0gIFplcm9EaXZpc2lvbkVycm9yX19kb2NfX30sCi0geyJGbG9hdGluZ1BvaW50RXJyb3IiLCAmUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yLCAmUHlFeGNfQXJpdGhtZXRpY0Vycm9yLAotICBGbG9hdGluZ1BvaW50RXJyb3JfX2RvY19ffSwKLSB7IlZhbHVlRXJyb3IiLCAgICZQeUV4Y19WYWx1ZUVycm9yLCAgMCwgVmFsdWVFcnJvcl9fZG9jX199LAotIHsiVW5pY29kZUVycm9yIiwgJlB5RXhjX1VuaWNvZGVFcnJvciwgJlB5RXhjX1ZhbHVlRXJyb3IsIFVuaWNvZGVFcnJvcl9fZG9jX199LAotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSB7IlVuaWNvZGVFbmNvZGVFcnJvciIsICZQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IsICZQeUV4Y19Vbmljb2RlRXJyb3IsCi0gIFVuaWNvZGVFbmNvZGVFcnJvcl9fZG9jX18sIFVuaWNvZGVFbmNvZGVFcnJvcl9tZXRob2RzfSwKLSB7IlVuaWNvZGVEZWNvZGVFcnJvciIsICZQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IsICZQeUV4Y19Vbmljb2RlRXJyb3IsCi0gIFVuaWNvZGVEZWNvZGVFcnJvcl9fZG9jX18sIFVuaWNvZGVEZWNvZGVFcnJvcl9tZXRob2RzfSwKLSB7IlVuaWNvZGVUcmFuc2xhdGVFcnJvciIsICZQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IsICZQeUV4Y19Vbmljb2RlRXJyb3IsCi0gIFVuaWNvZGVUcmFuc2xhdGVFcnJvcl9fZG9jX18sIFVuaWNvZGVUcmFuc2xhdGVFcnJvcl9tZXRob2RzfSwKLSNlbmRpZgotIHsiUmVmZXJlbmNlRXJyb3IiLCAgJlB5RXhjX1JlZmVyZW5jZUVycm9yLCAwLCBSZWZlcmVuY2VFcnJvcl9fZG9jX199LAotIHsiU3lzdGVtRXJyb3IiLCAgJlB5RXhjX1N5c3RlbUVycm9yLCAwLCBTeXN0ZW1FcnJvcl9fZG9jX199LAotIHsiTWVtb3J5RXJyb3IiLCAgJlB5RXhjX01lbW9yeUVycm9yLCAwLCBNZW1vcnlFcnJvcl9fZG9jX199LAotIC8qIFdhcm5pbmcgY2F0ZWdvcmllcyAqLwotIHsiV2FybmluZyIsICZQeUV4Y19XYXJuaW5nLCAmUHlFeGNfRXhjZXB0aW9uLCBXYXJuaW5nX19kb2NfX30sCi0geyJVc2VyV2FybmluZyIsICZQeUV4Y19Vc2VyV2FybmluZywgJlB5RXhjX1dhcm5pbmcsIFVzZXJXYXJuaW5nX19kb2NfX30sCi0geyJEZXByZWNhdGlvbldhcm5pbmciLCAmUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAmUHlFeGNfV2FybmluZywKLSAgRGVwcmVjYXRpb25XYXJuaW5nX19kb2NfX30sCi0geyJQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIiwgJlB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICZQeUV4Y19XYXJuaW5nLAotICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nX19kb2NfX30sCi0geyJTeW50YXhXYXJuaW5nIiwgJlB5RXhjX1N5bnRheFdhcm5pbmcsICZQeUV4Y19XYXJuaW5nLCBTeW50YXhXYXJuaW5nX19kb2NfX30sCi0gLyogT3ZlcmZsb3dXYXJuaW5nIHNob3VsZCBiZSByZW1vdmVkIGZvciBQeXRob24gMi41ICovCi0geyJPdmVyZmxvd1dhcm5pbmciLCAmUHlFeGNfT3ZlcmZsb3dXYXJuaW5nLCAmUHlFeGNfV2FybmluZywKLSAgT3ZlcmZsb3dXYXJuaW5nX19kb2NfX30sCi0geyJSdW50aW1lV2FybmluZyIsICZQeUV4Y19SdW50aW1lV2FybmluZywgJlB5RXhjX1dhcm5pbmcsCi0gIFJ1bnRpbWVXYXJuaW5nX19kb2NfX30sCi0geyJGdXR1cmVXYXJuaW5nIiwgJlB5RXhjX0Z1dHVyZVdhcm5pbmcsICZQeUV4Y19XYXJuaW5nLAotICBGdXR1cmVXYXJuaW5nX19kb2NfX30sCi0gLyogU2VudGluZWwgKi8KLSB7TlVMTH0KLX07Ci0KLQwKLQotdm9pZAotX1B5RXhjX0luaXQodm9pZCkKLXsKLSAgICBjaGFyICptb2R1bGVuYW1lID0gImV4Y2VwdGlvbnMiOwotICAgIFB5X3NzaXplX3QgbW9kbmFtZXN6ID0gc3RybGVuKG1vZHVsZW5hbWUpOwotICAgIGludCBpOwotICAgIFB5T2JqZWN0ICptZSwgKm15ZGljdCwgKmJsdGlubW9kLCAqYmRpY3QsICpkb2MsICphcmdzOwotCi0gICAgbWUgPSBQeV9Jbml0TW9kdWxlKG1vZHVsZW5hbWUsIGZ1bmN0aW9ucyk7Ci0gICAgaWYgKG1lID09IE5VTEwpCi0JZ290byBlcnI7Ci0gICAgbXlkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtZSk7Ci0gICAgaWYgKG15ZGljdCA9PSBOVUxMKQotCWdvdG8gZXJyOwotICAgIGJsdGlubW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpOwotICAgIGlmIChibHRpbm1vZCA9PSBOVUxMKQotCWdvdG8gZXJyOwotICAgIGJkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChibHRpbm1vZCk7Ci0gICAgaWYgKGJkaWN0ID09IE5VTEwpCi0JZ290byBlcnI7Ci0gICAgZG9jID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtb2R1bGVfX2RvY19fKTsKLSAgICBpZiAoZG9jID09IE5VTEwpCi0JZ290byBlcnI7Ci0KLSAgICBpID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcobXlkaWN0LCAiX19kb2NfXyIsIGRvYyk7Ci0gICAgUHlfREVDUkVGKGRvYyk7Ci0gICAgaWYgKGkgPCAwKSB7Ci0gZXJyOgotCVB5X0ZhdGFsRXJyb3IoImV4Y2VwdGlvbnMgYm9vdHN0cmFwcGluZyBlcnJvci4iKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBvZiBhbGwgZXhjZXB0aW9ucywgc28gbWFrZSBpdCBmaXJzdC4gKi8KLSAgICBpZiAobWFrZV9CYXNlRXhjZXB0aW9uKG1vZHVsZW5hbWUpIHx8Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcobXlkaWN0LCAiQmFzZUV4Y2VwdGlvbiIsIFB5RXhjX0Jhc2VFeGNlcHRpb24pIHx8Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoYmRpY3QsICJCYXNlRXhjZXB0aW9uIiwgUHlFeGNfQmFzZUV4Y2VwdGlvbikpCi0gICAgewotCVB5X0ZhdGFsRXJyb3IoIkJhc2UgY2xhc3MgYEJhc2VFeGNlcHRpb24nIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpOwotICAgIH0KLQotICAgIC8qIE5vdyB3ZSBjYW4gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgYWxsIHRoZSByZW1haW5pbmcgZXhjZXB0aW9ucy4KLSAgICAgKiBSZW1lbWJlciB0byBzdGFydCB0aGUgbG9vcCBhdCAxIHRvIHNraXAgRXhjZXB0aW9ucy4KLSAgICAgKi8KLSAgICBmb3IgKGk9MTsgZXhjdGFibGVbaV0ubmFtZTsgaSsrKSB7Ci0JaW50IHN0YXR1czsKLQljaGFyICpjbmFtZSA9IFB5TWVtX05FVyhjaGFyLCBtb2RuYW1lc3orc3RybGVuKGV4Y3RhYmxlW2ldLm5hbWUpKzIpOwotCVB5T2JqZWN0ICpiYXNlOwotCi0JKHZvaWQpc3RyY3B5KGNuYW1lLCBtb2R1bGVuYW1lKTsKLQkodm9pZClzdHJjYXQoY25hbWUsICIuIik7Ci0JKHZvaWQpc3RyY2F0KGNuYW1lLCBleGN0YWJsZVtpXS5uYW1lKTsKLQotCWlmIChleGN0YWJsZVtpXS5iYXNlID09IDApCi0JICAgIGJhc2UgPSBQeUV4Y19TdGFuZGFyZEVycm9yOwotCWVsc2UKLQkgICAgYmFzZSA9ICpleGN0YWJsZVtpXS5iYXNlOwotCi0Jc3RhdHVzID0gbWFrZV9jbGFzcyhleGN0YWJsZVtpXS5leGMsIGJhc2UsIGNuYW1lLAotCQkJICAgIGV4Y3RhYmxlW2ldLm1ldGhvZHMsCi0JCQkgICAgZXhjdGFibGVbaV0uZG9jc3RyKTsKLQotCVB5TWVtX0RFTChjbmFtZSk7Ci0KLQlpZiAoc3RhdHVzKQotCSAgICBQeV9GYXRhbEVycm9yKCJTdGFuZGFyZCBleGNlcHRpb24gY2xhc3NlcyBjb3VsZCBub3QgYmUgY3JlYXRlZC4iKTsKLQotCWlmIChleGN0YWJsZVtpXS5jbGFzc2luaXQpIHsKLQkgICAgc3RhdHVzID0gKCpleGN0YWJsZVtpXS5jbGFzc2luaXQpKCpleGN0YWJsZVtpXS5leGMpOwotCSAgICBpZiAoc3RhdHVzKQotCQlQeV9GYXRhbEVycm9yKCJBbiBleGNlcHRpb24gY2xhc3MgY291bGQgbm90IGJlIGluaXRpYWxpemVkLiIpOwotCX0KLQotCS8qIE5vdyBpbnNlcnQgdGhlIGNsYXNzIGludG8gYm90aCB0aGlzIG1vZHVsZSBhbmQgdGhlIF9fYnVpbHRpbl9fCi0JICogbW9kdWxlLgotCSAqLwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhteWRpY3QsIGV4Y3RhYmxlW2ldLm5hbWUsICpleGN0YWJsZVtpXS5leGMpIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGJkaWN0LCBleGN0YWJsZVtpXS5uYW1lLCAqZXhjdGFibGVbaV0uZXhjKSkKLQl7Ci0JICAgIFB5X0ZhdGFsRXJyb3IoIk1vZHVsZSBkaWN0aW9uYXJ5IGluc2VydGlvbiBwcm9ibGVtLiIpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBOb3cgd2UgbmVlZCB0byBwcmUtYWxsb2NhdGUgYSBNZW1vcnlFcnJvciBpbnN0YW5jZSAqLwotICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLSAgICBpZiAoIWFyZ3MgfHwKLQkhKFB5RXhjX01lbW9yeUVycm9ySW5zdCA9IFB5RXZhbF9DYWxsT2JqZWN0KFB5RXhjX01lbW9yeUVycm9yLCBhcmdzKSkpCi0gICAgewotCVB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBwcmUtYWxsb2NhdGUgTWVtb3J5RXJyb3IgaW5zdGFuY2VcbiIpOwotICAgIH0KLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0KLSAgICAvKiBXZSdyZSBkb25lIHdpdGggX19idWlsdGluX18gKi8KLSAgICBQeV9ERUNSRUYoYmx0aW5tb2QpOwotfQotCi0KLXZvaWQKLV9QeUV4Y19GaW5pKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBQeV9YREVDUkVGKFB5RXhjX01lbW9yeUVycm9ySW5zdCk7Ci0gICAgUHlFeGNfTWVtb3J5RXJyb3JJbnN0ID0gTlVMTDsKLQotICAgIGZvciAoaT0wOyBleGN0YWJsZVtpXS5uYW1lOyBpKyspIHsKLQkvKiBjbGVhciB0aGUgY2xhc3MncyBkaWN0aW9uYXJ5LCBmcmVlaW5nIHVwIGNpcmN1bGFyIHJlZmVyZW5jZXMKLQkgKiBiZXR3ZWVuIHRoZSBjbGFzcyBhbmQgaXRzIG1ldGhvZHMuCi0JICovCi0JUHlPYmplY3QqIGNkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygqZXhjdGFibGVbaV0uZXhjLCAiX19kaWN0X18iKTsKLQlQeURpY3RfQ2xlYXIoY2RpY3QpOwotCVB5X0RFQ1JFRihjZGljdCk7Ci0KLQkvKiBOb3cgZGVjcmVmIHRoZSBleGNlcHRpb24gY2xhc3MgKi8KLQlQeV9YREVDUkVGKCpleGN0YWJsZVtpXS5leGMpOwotCSpleGN0YWJsZVtpXS5leGMgPSBOVUxMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRjd2QuYyBiL1B5dGhvbi9nZXRjd2QuYwppbmRleCA1YzU3MjkxLi45NjdkNDg0IDEwMDY0NAotLS0gYS9QeXRob24vZ2V0Y3dkLmMKKysrIGIvUHl0aG9uL2dldGN3ZC5jCkBAIC0xNCw4ICsxNCwxMiBAQAogI2VuZGlmCiAKICNpZm5kZWYgTUFYUEFUSExFTgorI2lmIGRlZmluZWQoUEFUSF9NQVgpICYmIFBBVEhfTUFYID4gMTAyNAorI2RlZmluZSBNQVhQQVRITEVOIFBBVEhfTUFYCisjZWxzZQogI2RlZmluZSBNQVhQQVRITEVOIDEwMjQKICNlbmRpZgorI2VuZGlmCiAKIGV4dGVybiBjaGFyICpnZXR3ZChjaGFyICopOwogCmRpZmYgLS1naXQgYS9QeXRob24vZ3JhbWluaXQuYyBiL1B5dGhvbi9ncmFtaW5pdC5jCmluZGV4IGE2YWMxMjQuLjMzZWY2NGIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9ncmFtaW5pdC5jCisrKyBiL1B5dGhvbi9ncmFtaW5pdC5jCkBAIC01MTcsNDEgKzUxNywzNiBAQAogCXsxMiwgM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzI2XzJbM10gPSB7Ci0Jezc1LCA0fSwKKwl7NzUsIDJ9LAogCXsxMiwgM30sCi0JezcyLCA1fSwKKwl7NzIsIDR9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18yNl8zWzFdID0gewotCXs3MiwgNX0sCisJezcyLCA0fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMjZfNFsyXSA9IHsKLQl7NzUsIDR9LAotCXsxMiwgM30sCitzdGF0aWMgYXJjIGFyY3NfMjZfNFszXSA9IHsKKwl7MjgsIDV9LAorCXsxMywgNn0sCisJezc2LCA1fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMjZfNVszXSA9IHsKLQl7MjgsIDZ9LAotCXsxMywgN30sCi0Jezc2LCA2fSwKK3N0YXRpYyBhcmMgYXJjc18yNl81WzFdID0geworCXswLCA1fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjZfNlsxXSA9IHsKLQl7MCwgNn0sCisJezc2LCA3fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjZfN1sxXSA9IHsKLQl7NzYsIDh9LAorCXsxNSwgNX0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzI2XzhbMV0gPSB7Ci0JezE1LCA2fSwKLX07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzI2WzldID0geworc3RhdGljIHN0YXRlIHN0YXRlc18yNls4XSA9IHsKIAl7MSwgYXJjc18yNl8wfSwKIAl7MiwgYXJjc18yNl8xfSwKIAl7MywgYXJjc18yNl8yfSwKIAl7MSwgYXJjc18yNl8zfSwKLQl7MiwgYXJjc18yNl80fSwKLQl7MywgYXJjc18yNl81fSwKKwl7MywgYXJjc18yNl80fSwKKwl7MSwgYXJjc18yNl81fSwKIAl7MSwgYXJjc18yNl82fSwKIAl7MSwgYXJjc18yNl83fSwKLQl7MSwgYXJjc18yNl84fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMjdfMFsxXSA9IHsKIAl7MTksIDF9LApAQCAtMTgzNiw3ICsxODMxLDcgQEAKIAkgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDVcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogCXsyODEsICJpbXBvcnRfbmFtZSIsIDAsIDMsIHN0YXRlc18yNSwKIAkgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDFcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotCXsyODIsICJpbXBvcnRfZnJvbSIsIDAsIDksIHN0YXRlc18yNiwKKwl7MjgyLCAiaW1wb3J0X2Zyb20iLCAwLCA4LCBzdGF0ZXNfMjYsCiAJICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKIAl7MjgzLCAiaW1wb3J0X2FzX25hbWUiLCAwLCA0LCBzdGF0ZXNfMjcsCiAJICJcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCBkYWFlMTVmLi4wOTRlNGZkIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogCQlQeU9iamVjdCAqaG9vayA9IFB5TGlzdF9HZXRJdGVtKHBhdGhfaG9va3MsIGopOwogCQlpZiAoaG9vayA9PSBOVUxMKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWltcG9ydGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGhvb2ssICJPIiwgcCk7CisJCWltcG9ydGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhob29rLCBwLCBOVUxMKTsKIAkJaWYgKGltcG9ydGVyICE9IE5VTEwpCiAJCQlicmVhazsKIApAQCAtMTI0MSw3ICsxMjQxLDMzIEBACiAJCQlpZiAoaW1wb3J0ZXIgPT0gTlVMTCkKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCS8qIE5vdGU6IGltcG9ydGVyIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCi0JCQlpZiAoaW1wb3J0ZXIgIT0gUHlfTm9uZSkgeworCQkJaWYgKGltcG9ydGVyID09IFB5X0ZhbHNlKSB7CisJCQkJLyogQ2FjaGVkIGFzIG5vdCBiZWluZyBhIHZhbGlkIGRpci4gKi8KKwkJCQlQeV9YREVDUkVGKGNvcHkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxzZSBpZiAoaW1wb3J0ZXIgPT0gUHlfVHJ1ZSkgeworCQkJCS8qIENhY2hlZCBhcyBiZWluZyBhIHZhbGlkIGRpciwgc28ganVzdAorCQkJCSAqIGNvbnRpbnVlIGJlbG93LiAqLworCQkJfQorCQkJZWxzZSBpZiAoaW1wb3J0ZXIgPT0gUHlfTm9uZSkgeworCQkJCS8qIE5vIGltcG9ydGVyIHdhcyBmb3VuZCwgc28gaXQgaGFzIHRvIGJlIGEgZmlsZS4KKwkJCQkgKiBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIHZhbGlkLiAqLworI2lmZGVmIEhBVkVfU1RBVAorCQkJCWlmIChzdGF0KGJ1ZiwgJnN0YXRidWYpICE9IDApIHsKKwkJCQkJLyogRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiAqLworCQkJCQlQeURpY3RfU2V0SXRlbShwYXRoX2ltcG9ydGVyX2NhY2hlLAorCQkJCQkgICAgICAgICAgICAgICB2LCBQeV9GYWxzZSk7CisJCQkJCVB5X1hERUNSRUYoY29weSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisJCQkJCVB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsCisJCQkJCSAgICAgICAgICAgICAgIHYsIFB5X1RydWUpOworCQkJCX0KKyNlbmRpZgorCQkJfQorCQkJZWxzZSB7CisJCQkJLyogQSByZWFsIGltcG9ydCBob29rIGltcG9ydGVyIHdhcyBmb3VuZC4gKi8KIAkJCQlQeU9iamVjdCAqbG9hZGVyOwogCQkJCWxvYWRlciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoaW1wb3J0ZXIsCiAJCQkJCQkJICAgICAiZmluZF9tb2R1bGUiLApAQCAtMTI1NCw5ICsxMjgwLDExIEBACiAJCQkJCXJldHVybiAmaW1wb3J0aG9va2Rlc2NyOwogCQkJCX0KIAkJCQlQeV9ERUNSRUYobG9hZGVyKTsKKwkJCQlQeV9YREVDUkVGKGNvcHkpOworCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJLyogbm8gaG9vayB3YXMgc3VjY2Vzc2Z1bCwgdXNlIGJ1aWx0aW4gaW1wb3J0ICovCiAJCX0KKwkJLyogbm8gaG9vayB3YXMgZm91bmQsIHVzZSBidWlsdGluIGltcG9ydCAqLwogCiAJCWlmIChsZW4gPiAwICYmIGJ1ZltsZW4tMV0gIT0gU0VQCiAjaWZkZWYgQUxUU0VQCkBAIC0xMjcyLDE5ICsxMzAwLDQyIEBACiAjaWZkZWYgSEFWRV9TVEFUCiAJCWlmIChzdGF0KGJ1ZiwgJnN0YXRidWYpID09IDAgJiYgICAgICAgICAvKiBpdCBleGlzdHMgKi8KIAkJICAgIFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSAmJiAgICAgICAgIC8qIGl0J3MgYSBkaXJlY3RvcnkgKi8KLQkJICAgIGZpbmRfaW5pdF9tb2R1bGUoYnVmKSAmJiAgICAgICAgICAgIC8qIGl0IGhhcyBfX2luaXRfXy5weSAqLwotCQkgICAgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpIHsgLyogYW5kIGNhc2UgbWF0Y2hlcyAqLwotCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCXJldHVybiAmZmRfcGFja2FnZTsKKwkJICAgIGNhc2Vfb2soYnVmLCBsZW4sIG5hbWVsZW4sIG5hbWUpKSB7IC8qIGNhc2UgbWF0Y2hlcyAqLworCQkJaWYgKGZpbmRfaW5pdF9tb2R1bGUoYnVmKSkgeyAvKiBhbmQgaGFzIF9faW5pdF9fLnB5ICovCisJCQkJUHlfWERFQ1JFRihjb3B5KTsKKwkJCQlyZXR1cm4gJmZkX3BhY2thZ2U7CisJCQl9CisJCQllbHNlIHsKKwkJCQljaGFyIHdhcm5zdHJbTUFYUEFUSExFTis4MF07CisJCQkJc3ByaW50Zih3YXJuc3RyLCAiTm90IGltcG9ydGluZyBkaXJlY3RvcnkgIgorCQkJCQkiJyUuKnMnOiBtaXNzaW5nIF9faW5pdF9fLnB5IiwgCisJCQkJCU1BWFBBVEhMRU4sIGJ1Zik7CisJCQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfSW1wb3J0V2FybmluZywKKwkJCQkJICAgICAgIHdhcm5zdHIpKSB7CisJCQkJCVB5X1hERUNSRUYoY29weSk7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCX0KIAkJfQogI2Vsc2UKIAkJLyogWFhYIEhvdyBhcmUgeW91IGdvaW5nIHRvIHRlc3QgZm9yIGRpcmVjdG9yaWVzPyAqLwogI2lmZGVmIFJJU0NPUwogCQlpZiAoaXNkaXIoYnVmKSAmJgotCQkgICAgZmluZF9pbml0X21vZHVsZShidWYpICYmCiAJCSAgICBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkgewotCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCXJldHVybiAmZmRfcGFja2FnZTsKKwkJCWlmIChmaW5kX2luaXRfbW9kdWxlKGJ1ZikpIHsKKwkJCQlQeV9YREVDUkVGKGNvcHkpOworCQkJCXJldHVybiAmZmRfcGFja2FnZTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWNoYXIgd2FybnN0cltNQVhQQVRITEVOKzgwXTsKKwkJCQlzcHJpbnRmKHdhcm5zdHIsICJOb3QgaW1wb3J0aW5nIGRpcmVjdG9yeSAiCisJCQkJCSInJS4qcyc6IG1pc3NpbmcgX19pbml0X18ucHkiLCAKKwkJCQkJTUFYUEFUSExFTiwgYnVmKTsKKwkJCQlpZiAoUHlFcnJfV2FybihQeUV4Y19JbXBvcnRXYXJuaW5nLAorCQkJCQkgICAgICAgd2FybnN0cikpIHsKKwkJCQkJUHlfWERFQ1JFRihjb3B5KTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQogCQl9CiAjZW5kaWYKICNlbmRpZgpAQCAtMjQ3Nyw4ICsyNTI4LDggQEAKIAkJZ290byBlcnI7CiAKIAkvKiBDYWxsIHRoZSBfaW1wb3J0X18gZnVuY3Rpb24gd2l0aCB0aGUgcHJvcGVyIGFyZ3VtZW50IGxpc3QgKi8KLQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGltcG9ydCwgIk9PT08iLAotCQkJCSAgbW9kdWxlX25hbWUsIGdsb2JhbHMsIGdsb2JhbHMsIHNpbGx5X2xpc3QpOworCXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGltcG9ydCwgbW9kdWxlX25hbWUsIGdsb2JhbHMsCisJCQkJCSBnbG9iYWxzLCBzaWxseV9saXN0LCBOVUxMKTsKIAogICBlcnI6CiAJUHlfWERFQ1JFRihnbG9iYWxzKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9teXN0cnRvdWwuYyBiL1B5dGhvbi9teXN0cnRvdWwuYwppbmRleCA4ZTYwYzBjLi4zODBiMzdkIDEwMDY0NAotLS0gYS9QeXRob24vbXlzdHJ0b3VsLmMKKysrIGIvUHl0aG9uL215c3RydG91bC5jCkBAIC0xNSw2ICsxNSw2NiBAQAogCiAvKiBzdHJ0b2wgYW5kIHN0cnRvdWwsIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzICovCiAKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZuZGVmIERPTlRfSEFWRV9FUlJOT19ICisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisvKiBTdGF0aWMgb3ZlcmZsb3cgY2hlY2sgdmFsdWVzIGZvciBiYXNlcyAyIHRocm91Z2ggMzYuCisgKiBzbWFsbG1heFtiYXNlXSBpcyB0aGUgbGFyZ2VzdCB1bnNpZ25lZCBsb25nIGkgc3VjaCB0aGF0CisgKiBpICogYmFzZSBkb2Vzbid0IG92ZXJmbG93IHVuc2lnbmVkIGxvbmcuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtYWxsbWF4W10gPSB7CisJMCwgLyogYmFzZXMgMCBhbmQgMSBhcmUgaW52YWxpZCAqLworCTAsCisJVUxPTkdfTUFYIC8gMiwKKwlVTE9OR19NQVggLyAzLAorCVVMT05HX01BWCAvIDQsCisJVUxPTkdfTUFYIC8gNSwKKwlVTE9OR19NQVggLyA2LAorCVVMT05HX01BWCAvIDcsCisJVUxPTkdfTUFYIC8gOCwKKwlVTE9OR19NQVggLyA5LAorCVVMT05HX01BWCAvIDEwLAorCVVMT05HX01BWCAvIDExLAorCVVMT05HX01BWCAvIDEyLAorCVVMT05HX01BWCAvIDEzLAorCVVMT05HX01BWCAvIDE0LAorCVVMT05HX01BWCAvIDE1LAorCVVMT05HX01BWCAvIDE2LAorCVVMT05HX01BWCAvIDE3LAorCVVMT05HX01BWCAvIDE4LAorCVVMT05HX01BWCAvIDE5LAorCVVMT05HX01BWCAvIDIwLAorCVVMT05HX01BWCAvIDIxLAorCVVMT05HX01BWCAvIDIyLAorCVVMT05HX01BWCAvIDIzLAorCVVMT05HX01BWCAvIDI0LAorCVVMT05HX01BWCAvIDI1LAorCVVMT05HX01BWCAvIDI2LAorCVVMT05HX01BWCAvIDI3LAorCVVMT05HX01BWCAvIDI4LAorCVVMT05HX01BWCAvIDI5LAorCVVMT05HX01BWCAvIDMwLAorCVVMT05HX01BWCAvIDMxLAorCVVMT05HX01BWCAvIDMyLAorCVVMT05HX01BWCAvIDMzLAorCVVMT05HX01BWCAvIDM0LAorCVVMT05HX01BWCAvIDM1LAorCVVMT05HX01BWCAvIDM2LAorfTsKKworLyogbWF4aW11bSBkaWdpdHMgdGhhdCBjYW4ndCBldmVyIG92ZXJmbG93IGZvciBiYXNlcyAyIHRocm91Z2ggMzYsCisgKiBjYWxjdWxhdGVkIGJ5IFtpbnQobWF0aC5mbG9vcihtYXRoLmxvZygyKiozMiwgaSkpKSBmb3IgaSBpbiByYW5nZSgyLCAzNyldLgorICogTm90ZSB0aGF0IHRoaXMgaXMgcGVzc2ltaXN0aWMgaWYgc2l6ZW9mKGxvbmcpID4gNC4KKyAqLworc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7CisJMCwgIDAsIDMyLCAyMCwgMTYsIDEzLCAxMiwgMTEsIDEwLCAxMCwgIC8qICAwIC0gIDkgKi8KKwk5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgLyogMTAgLSAxOSAqLworCTcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICAvKiAyMCAtIDI5ICovCisJNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KKwogLyoKICoqCXN0cnRvdWwKICoqCQlUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHJvdXRpbmUgZm9yIGNvbnZlcnRpbmcKQEAgLTI4LDk4ICs4OCwxMDAgQEAKICoqCQlFcnJvcnMgZHVlIHRvIGJhZCBwb2ludGVycyB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbgogKioJCWV4Y2VwdGlvbnMgLSB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbS4KICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2lmbmRlZiBET05UX0hBVkVfRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLQogdW5zaWduZWQgbG9uZwogUHlPU19zdHJ0b3VsKHJlZ2lzdGVyIGNoYXIgKnN0ciwgY2hhciAqKnB0ciwgaW50IGJhc2UpCiB7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZwlyZXN1bHQ7CS8qIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gKi8KLSAgICByZWdpc3RlciBpbnQJCWM7CS8qIGN1cnJlbnQgaW5wdXQgY2hhcmFjdGVyICovCi0gICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZwl0ZW1wOwkvKiB1c2VkIGluIG92ZXJmbG93IHRlc3RpbmcgKi8KLSAgICBpbnQJCQkJb3ZmOwkvKiB0cnVlIGlmIG92ZXJmbG93IG9jY3VycmVkICovCisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOyAvKiByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uICovCisJcmVnaXN0ZXIgaW50IGM7CSAJLyogY3VycmVudCBpbnB1dCBjaGFyYWN0ZXIgKi8KKwlyZWdpc3RlciBpbnQgb3ZsaW1pdDsgCS8qIHJlcXVpcmVkIGRpZ2l0cyB0byBvdmVyZmxvdyAqLwogCi0gICAgcmVzdWx0ID0gMDsKLSAgICBvdmYgPSAwOworCS8qIHNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLworCXdoaWxlICgqc3RyICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQorCQkrK3N0cjsKIAotLyogY2F0Y2ggc2lsbHkgYmFzZXMgKi8KLSAgICBpZiAoYmFzZSAhPSAwICYmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpKQotICAgIHsKKwkvKiBjaGVjayBmb3IgbGVhZGluZyAwIG9yIDB4IGZvciBhdXRvLWJhc2Ugb3IgYmFzZSAxNiAqLworCXN3aXRjaCAoYmFzZSkgeworCQljYXNlIDA6CQkvKiBsb29rIGZvciBsZWFkaW5nIDAsIDB4IG9yIDBYICovCisJCQlpZiAoKnN0ciA9PSAnMCcpIHsKKwkJCQkrK3N0cjsKKwkJCQlpZiAoKnN0ciA9PSAneCcgfHwgKnN0ciA9PSAnWCcpIHsKKwkJCQkJKytzdHI7CisJCQkJCWJhc2UgPSAxNjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQliYXNlID0gODsKKwkJCX0KKwkJCWVsc2UKKwkJCQliYXNlID0gMTA7CisJCQlicmVhazsKKworCQljYXNlIDE2OgkvKiBza2lwIGxlYWRpbmcgMHggb3IgMFggKi8KKwkJCWlmICgqc3RyID09ICcwJykgeworCQkJCSsrc3RyOworCQkJCWlmICgqc3RyID09ICd4JyB8fCAqc3RyID09ICdYJykKKwkJCQkJKytzdHI7CisJCQl9CisJCQlicmVhazsKKwl9CisKKwkvKiBjYXRjaCBzaWxseSBiYXNlcyAqLworCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpIHsKKwkJaWYgKHB0cikKKwkJCSpwdHIgPSBzdHI7CisJCXJldHVybiAwOworCX0KKworCS8qIHNraXAgbGVhZGluZyB6ZXJvZXMgKi8KKwl3aGlsZSAoKnN0ciA9PSAnMCcpCisJCSsrc3RyOworCisJLyogYmFzZSBpcyBndWFyYW50ZWVkIHRvIGJlIGluIFsyLCAzNl0gYXQgdGhpcyBwb2ludCAqLworCW92bGltaXQgPSBkaWdpdGxpbWl0W2Jhc2VdOworCisJLyogZG8gdGhlIGNvbnZlcnNpb24gdW50aWwgbm9uLWRpZ2l0IGNoYXJhY3RlciBlbmNvdW50ZXJlZCAqLworCXdoaWxlICgoYyA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0pIDwgYmFzZSkgeworCQlpZiAob3ZsaW1pdCA+IDApIC8qIG5vIG92ZXJmbG93IGNoZWNrIHJlcXVpcmVkICovCisJCQlyZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgYzsKKwkJZWxzZSB7IC8qIHJlcXVpcmVzIG92ZXJmbG93IGNoZWNrICovCisJCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRlbXBfcmVzdWx0OworCisJCQlpZiAob3ZsaW1pdCA8IDApIC8qIGd1YXJhbnRlZWQgb3ZlcmZsb3cgKi8KKwkJCQlnb3RvIG92ZXJmbG93ZWQ7CisKKwkJCS8qIHRoZXJlIGNvdWxkIGJlIGFuIG92ZXJmbG93ICovCisJCQkvKiBjaGVjayBvdmVyZmxvdyBqdXN0IGZyb20gc2hpZnRpbmcgKi8KKwkJCWlmIChyZXN1bHQgPiBzbWFsbG1heFtiYXNlXSkKKwkJCQlnb3RvIG92ZXJmbG93ZWQ7CisKKwkJCXJlc3VsdCAqPSBiYXNlOworCisJCQkvKiBjaGVjayBvdmVyZmxvdyBmcm9tIHRoZSBkaWdpdCdzIHZhbHVlICovCisJCQl0ZW1wX3Jlc3VsdCA9IHJlc3VsdCArIGM7CisJCQlpZiAodGVtcF9yZXN1bHQgPCByZXN1bHQpCisJCQkJZ290byBvdmVyZmxvd2VkOworCisJCQlyZXN1bHQgPSB0ZW1wX3Jlc3VsdDsKKwkJfQorCisJCSsrc3RyOworCQktLW92bGltaXQ7CisJfQorCisJLyogc2V0IHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIHNjYW5uZWQgKi8KIAlpZiAocHRyKQotCSAgICAqcHRyID0gc3RyOwotCXJldHVybiAwOwotICAgIH0KKwkJKnB0ciA9IHN0cjsKIAotLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCi0gICAgd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCi0Jc3RyKys7CisJcmV0dXJuIHJlc3VsdDsKIAotLyogY2hlY2sgZm9yIGxlYWRpbmcgMCBvciAweCBmb3IgYXV0by1iYXNlIG9yIGJhc2UgMTYgKi8KLSAgICBzd2l0Y2ggKGJhc2UpCi0gICAgewotICAgIGNhc2UgMDoJCS8qIGxvb2sgZm9yIGxlYWRpbmcgMCwgMHggb3IgMFggKi8KLQlpZiAoKnN0ciA9PSAnMCcpCi0JewotCSAgICBzdHIrKzsKLQkgICAgaWYgKCpzdHIgPT0gJ3gnIHx8ICpzdHIgPT0gJ1gnKQotCSAgICB7Ci0JCXN0cisrOwotCQliYXNlID0gMTY7Ci0JICAgIH0KLQkgICAgZWxzZQotCQliYXNlID0gODsKK292ZXJmbG93ZWQ6CisJaWYgKHB0cikgeworCQkvKiBzcG9vbCB0aHJvdWdoIHJlbWFpbmluZyBkaWdpdCBjaGFyYWN0ZXJzICovCisJCXdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildIDwgYmFzZSkKKwkJCSsrc3RyOworCQkqcHRyID0gc3RyOwogCX0KLQllbHNlCi0JICAgIGJhc2UgPSAxMDsKLQlicmVhazsKLQotICAgIGNhc2UgMTY6CS8qIHNraXAgbGVhZGluZyAweCBvciAwWCAqLwotCWlmICgqc3RyID09ICcwJyAmJiAoKihzdHIrMSkgPT0gJ3gnIHx8ICooc3RyKzEpID09ICdYJykpCi0JICAgIHN0ciArPSAyOwotCWJyZWFrOwotICAgIH0KLQotLyogZG8gdGhlIGNvbnZlcnNpb24gKi8KLSAgICB3aGlsZSAoKGMgPSBQeV9DSEFSTUFTSygqc3RyKSkgIT0gJ1wwJykKLSAgICB7Ci0JaWYgKGlzZGlnaXQoYykgJiYgYyAtICcwJyA8IGJhc2UpCi0JICAgIGMgLT0gJzAnOwotCWVsc2UKLQl7Ci0JICAgIGlmIChpc3VwcGVyKGMpKQotCQljID0gdG9sb3dlcihjKTsKLQkgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQotCQljIC09ICdhJyAtIDEwOwotCSAgICBlbHNlCS8qIG5vbi0iZGlnaXQiIGNoYXJhY3RlciAqLwotCQlicmVhazsKLQkgICAgaWYgKGMgPj0gYmFzZSkJLyogbm9uLSJkaWdpdCIgY2hhcmFjdGVyICovCi0JCWJyZWFrOwotCX0KLQl0ZW1wID0gcmVzdWx0OwotCXJlc3VsdCA9IHJlc3VsdCAqIGJhc2UgKyBjOwotCWlmKGJhc2UgPT0gMTApIHsKLQkJaWYoKChsb25nKShyZXN1bHQgLSBjKSAvIGJhc2UgIT0gKGxvbmcpdGVtcCkpCS8qIG92ZXJmbG93ICovCi0JCQlvdmYgPSAxOwotCX0KLQllbHNlIHsKLQkJaWYgKChyZXN1bHQgLSBjKSAvIGJhc2UgIT0gdGVtcCkJLyogb3ZlcmZsb3cgKi8KLQkJCW92ZiA9IDE7Ci0JfQotCXN0cisrOwotICAgIH0KLQotLyogc2V0IHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIHNjYW5uZWQgKi8KLSAgICBpZiAocHRyKQotCSpwdHIgPSBzdHI7Ci0gICAgaWYgKG92ZikKLSAgICB7Ci0JcmVzdWx0ID0gKHVuc2lnbmVkIGxvbmcpIH4wTDsKIAllcnJubyA9IEVSQU5HRTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiB9CiAKIGxvbmcKQEAgLTEyNywyNSArMTg5LDI1IEBACiB7CiAJbG9uZyByZXN1bHQ7CiAJY2hhciBzaWduOwotCQorCiAJd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCiAJCXN0cisrOwotCQorCiAJc2lnbiA9ICpzdHI7CiAJaWYgKHNpZ24gPT0gJysnIHx8IHNpZ24gPT0gJy0nKQogCQlzdHIrKzsKLQkKKwogCXJlc3VsdCA9IChsb25nKSBQeU9TX3N0cnRvdWwoc3RyLCBwdHIsIGJhc2UpOwotCQorCiAJLyogU2lnbmFsIG92ZXJmbG93IGlmIHRoZSByZXN1bHQgYXBwZWFycyBuZWdhdGl2ZSwKIAkgICBleGNlcHQgZm9yIHRoZSBsYXJnZXN0IG5lZ2F0aXZlIGludGVnZXIgKi8KIAlpZiAocmVzdWx0IDwgMCAmJiAhKHNpZ24gPT0gJy0nICYmIHJlc3VsdCA9PSAtcmVzdWx0KSkgewogCQllcnJubyA9IEVSQU5HRTsKIAkJcmVzdWx0ID0gMHg3ZmZmZmZmZjsKIAl9Ci0JCisKIAlpZiAoc2lnbiA9PSAnLScpCiAJCXJlc3VsdCA9IC1yZXN1bHQ7Ci0JCisKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RydG9kLmMgYi9QeXRob24vcHlzdHJ0b2QuYwppbmRleCBkYjRjYWQxLi44YTcxYzI4IDEwMDY0NAotLS0gYS9QeXRob24vcHlzdHJ0b2QuYworKysgYi9QeXRob24vcHlzdHJ0b2QuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCWNoYXIgKmNvcHksICpjOwogCiAJCS8qIFdlIG5lZWQgdG8gY29udmVydCB0aGUgJy4nIHRvIHRoZSBsb2NhbGUgc3BlY2lmaWMgZGVjaW1hbCBwb2ludCAqLwotCQljb3B5ID0gKGNoYXIgKiltYWxsb2MoZW5kIC0gbnB0ciArIDEgKyBkZWNpbWFsX3BvaW50X2xlbik7CisJCWNvcHkgPSAoY2hhciAqKVB5TWVtX01BTExPQyhlbmQgLSBucHRyICsgMSArIGRlY2ltYWxfcG9pbnRfbGVuKTsKIAogCQljID0gY29weTsKIAkJbWVtY3B5KGMsIG5wdHIsIGRlY2ltYWxfcG9pbnRfcG9zIC0gbnB0cik7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJCQlmYWlsX3BvcyA9IChjaGFyICopbnB0ciArIChmYWlsX3BvcyAtIGNvcHkpOwogCQl9CiAKLQkJZnJlZShjb3B5KTsKKwkJUHlNZW1fRlJFRShjb3B5KTsKIAogCX0KIAllbHNlIHsKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRob25ydW4uYyBiL1B5dGhvbi9weXRob25ydW4uYwppbmRleCA5OWQ2ZDlkLi44MjgzZmM1IDEwMDY0NAotLS0gYS9QeXRob24vcHl0aG9ucnVuLmMKKysrIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCkBAIC0xMDc4LDcgKzEwNzgsOCBAQAogCVB5X1hERUNSRUYodGIpOwogfQogCi12b2lkIFB5RXJyX0Rpc3BsYXkoUHlPYmplY3QgKmV4Y2VwdGlvbiwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIpCit2b2lkCitQeUVycl9EaXNwbGF5KFB5T2JqZWN0ICpleGNlcHRpb24sIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQogewogCWludCBlcnIgPSAwOwogCVB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKQEAgLTExMjYsMTkgKzExMjcsMjIgQEAKIAkJfQogCQllbHNlIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4Y2VwdGlvbikpIHsKIAkJCWNoYXIqIGNsYXNzTmFtZSA9IFB5RXhjZXB0aW9uQ2xhc3NfTmFtZShleGNlcHRpb24pOwotCQkJUHlPYmplY3QqIG1vZHVsZU5hbWUgPQotCQkJICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGNlcHRpb24sICJfX21vZHVsZV9fIik7CisJCQljaGFyICpkb3QgPSBzdHJyY2hyKGNsYXNzTmFtZSwgJy4nKTsKKwkJCVB5T2JqZWN0KiBtb2R1bGVOYW1lOworCQkJaWYgKGRvdCAhPSBOVUxMKQorCQkJCWNsYXNzTmFtZSA9IGRvdCsxOworCQkJbW9kdWxlTmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXhjZXB0aW9uLCAiX19tb2R1bGVfXyIpOwogCiAJCQlpZiAobW9kdWxlTmFtZSA9PSBOVUxMKQogCQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7CiAJCQllbHNlIHsKIAkJCQljaGFyKiBtb2RzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhtb2R1bGVOYW1lKTsKLQkJCQlQeV9ERUNSRUYobW9kdWxlTmFtZSk7CiAJCQkJaWYgKG1vZHN0ciAmJiBzdHJjbXAobW9kc3RyLCAiZXhjZXB0aW9ucyIpKQogCQkJCXsKIAkJCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKG1vZHN0ciwgZik7CiAJCQkJCWVyciArPSBQeUZpbGVfV3JpdGVTdHJpbmcoIi4iLCBmKTsKIAkJCQl9CisJCQkJUHlfREVDUkVGKG1vZHVsZU5hbWUpOwogCQkJfQogCQkJaWYgKGVyciA9PSAwKSB7CiAJCQkJaWYgKGNsYXNzTmFtZSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N0cnVjdG1lbWJlci5jIGIvUHl0aG9uL3N0cnVjdG1lbWJlci5jCmluZGV4IDBhMjRkOWQuLjU0ZWIwNTUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zdHJ1Y3RtZW1iZXIuYworKysgYi9QeXRob24vc3RydWN0bWVtYmVyLmMKQEAgLTI2MCw4ICsyNjAsOSBAQAogCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKIAkJCXJldHVybiAtMTsKIAkJfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICooUFlfTE9OR19MT05HKilhZGRyID0gUHlMb25nX0FzTG9uZ0xvbmcodik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCphZGRyID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAqKFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yNzEsOCArMjcyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCphZGRyID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSkgJiYKKwkJCSAgICBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX250LmggYi9QeXRob24vdGhyZWFkX250LmgKaW5kZXggZTUyZDI4OC4uNTE0MTA1MyAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9udC5oCisrKyBiL1B5dGhvbi90aHJlYWRfbnQuaApAQCAtMTcwLDcgKzE3MCw3IEBACiBsb25nCiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JdWludHB0cl90IHJ2OworCVB5X3VpbnRwdHJfdCBydjsKIAljYWxsb2JqIG9iajsKIAogCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iLApAQCAtMTg2LDcgKzE4Niw3IEBACiAJCXJldHVybiAtMTsKIAogCXJ2ID0gX2JlZ2ludGhyZWFkKGJvb3RzdHJhcCwgMCwgJm9iaik7IC8qIHVzZSBkZWZhdWx0IHN0YWNrIHNpemUgKi8KLQlpZiAocnYgPT0gKHVpbnRwdHJfdCktMSkgeworCWlmIChydiA9PSAoUHlfdWludHB0cl90KS0xKSB7CiAJCS8qIEkndmUgc2VlbiBlcnJubyA9PSBFQUdBSU4gaGVyZSwgd2hpY2ggbWVhbnMgInRoZXJlIGFyZQogCQkgKiB0b28gbWFueSB0aHJlYWRzIi4KIAkJICovCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggMWRhNTQzMC4uYjNmNzJlNyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtNTc5LDcgKzU3OSwxMiBAQAogICAgICAgICB3YW50IHRvIHVzZSBhbnkgQXF1YS1iYXNlZCBHVUkgdG9vbGtpdCAod2hldGhlciBUa2ludGVyLCB3eFB5dGhvbiwKICAgICAgICAgQ2FyYm9uLCBDb2NvYSBvciBhbnl0aGluZyBlbHNlKS4KIAotICAgICAgICBTZWUgTWFjL09TWC9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZnJhbWV3b3JrIGJ1aWxkcy4KKwlZb3UgbWF5IGFsc28gd2FudCB0byB0cnkgdGhlIGNvbmZpZ3VyZSBvcHRpb24gIi0tZW5hYmxlLXVuaXZlcnNhbHNkayIKKwl3aGljaCBidWlsZHMgUHl0aG9uIGFzIGEgdW5pdmVyc2FsIGJpbmFyeSB3aXRoIHN1cHBvcnQgZm9yIHRoZSAKKwlpMzg2IGFuZCBQUEMgYXJjaGl0ZXR1cmVzLiBUaGlzIHJlcXVpcmVzIFhjb2RlIDIuMSBvciBsYXRlciB0byBidWlsZC4KKworICAgICAgICBTZWUgTWFjL09TWC9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZnJhbWV3b3JrIGFuZCAKKwl1bml2ZXJzYWwgYnVpbGRzLgogCiBDeWd3aW46IFdpdGggcmVjZW50IChyZWxhdGl2ZSB0byB0aGUgdGltZSBvZiB3cml0aW5nLCAyMDAxLTEyLTE5KQogICAgICAgICBDeWd3aW4gaW5zdGFsbGF0aW9ucywgdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIGludGVyYWN0aW9uCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbXNpLnB5IGIvVG9vbHMvbXNpL21zaS5weQppbmRleCBmN2QzODRhLi4zM2Q3YmZhIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvbXNpLnB5CisrKyBiL1Rvb2xzL21zaS9tc2kucHkKQEAgLTg0Niw4ICs4NDYsNiBAQAogICAgIGRlZmF1bHRfZmVhdHVyZS5zZXRfY3VycmVudCgpCiAgICAgaWYgbm90IG1zaWxpYi5XaW42NDoKICAgICAgICAgcm9vdC5hZGRfZmlsZSgiUENCdWlsZC93OXhwb3Blbi5leGUiKQotICAgIHJvb3QuYWRkX2ZpbGUoIlBDL3B5LmljbyIpCi0gICAgcm9vdC5hZGRfZmlsZSgiUEMvcHljLmljbyIpCiAgICAgcm9vdC5hZGRfZmlsZSgiUkVBRE1FLnR4dCIsIHNyYz0iUkVBRE1FIikKICAgICByb290LmFkZF9maWxlKCJORVdTLnR4dCIsIHNyYz0iTWlzYy9ORVdTIikKICAgICByb290LmFkZF9maWxlKCJMSUNFTlNFLnR4dCIsIHNyYz0iTElDRU5TRSIpCkBAIC05NTYsNiArOTU0LDggQEAKICAgICAjIEFkZCBETExzCiAgICAgZGVmYXVsdF9mZWF0dXJlLnNldF9jdXJyZW50KCkKICAgICBsaWIgPSBQeURpcmVjdG9yeShkYiwgY2FiLCByb290LCBzcmNkaXIrIi9QQ0J1aWxkIiwgIkRMTHMiLCAiRExMU3xETExzIikKKyAgICBsaWIuYWRkX2ZpbGUoInB5LmljbyIsIHNyYz0iLi4vUEMvcHkuaWNvIikKKyAgICBsaWIuYWRkX2ZpbGUoInB5Yy5pY28iLCBzcmM9Ii4uL1BDL3B5Yy5pY28iKQogICAgIGRsbHMgPSBbXQogICAgIHRjbGZpbGVzID0gW10KICAgICBmb3IgZiBpbiBleHRlbnNpb25zOgpAQCAtMTEyNCwxMSArMTEyNCwxMSBAQAogICAgICAgICAgICAgIF0gKyB0Y2xfdmVyYnMgKyBbCiAgICAgICAgICAgICAgI0ljb25zCiAgICAgICAgICAgICAgKCJweS5pY29uIiwgLTEsIHBhdDIgJSAodGVzdHByZWZpeCwgIiIpLCAiIiwKLSAgICAgICAgICAgICAgcidbVEFSR0VURElSXXB5LmljbycsICJSRUdJU1RSWS5kZWYiKSwKKyAgICAgICAgICAgICAgcidbRExMc11weS5pY28nLCAiUkVHSVNUUlkuZGVmIiksCiAgICAgICAgICAgICAgKCJweXcuaWNvbiIsIC0xLCBwYXQyICUgKHRlc3RwcmVmaXgsICJOb0NvbiIpLCAiIiwKLSAgICAgICAgICAgICAgcidbVEFSR0VURElSXXB5LmljbycsICJSRUdJU1RSWS5kZWYiKSwKKyAgICAgICAgICAgICAgcidbRExMc11weS5pY28nLCAiUkVHSVNUUlkuZGVmIiksCiAgICAgICAgICAgICAgKCJweWMuaWNvbiIsIC0xLCBwYXQyICUgKHRlc3RwcmVmaXgsICJDb21waWxlZCIpLCAiIiwKLSAgICAgICAgICAgICAgcidbVEFSR0VURElSXXB5Yy5pY28nLCAiUkVHSVNUUlkuZGVmIiksCisgICAgICAgICAgICAgIHInW0RMTHNdcHljLmljbycsICJSRUdJU1RSWS5kZWYiKSwKICAgICAgICAgICAgICAjIERlc2NyaXB0aW9ucwogICAgICAgICAgICAgICgicHkudHh0IiwgLTEsIHBhdDMgJSAodGVzdHByZWZpeCwgIiIpLCAiIiwKICAgICAgICAgICAgICAgIlB5dGhvbiBGaWxlIiwgIlJFR0lTVFJZLmRlZiIpLApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Bcml0aG1ldGljLnB5IGIvVG9vbHMvcHliZW5jaC9Bcml0aG1ldGljLnB5CmluZGV4IGU5NWMzMGEuLjRlZDYyMTkgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weQorKysgYi9Ub29scy9weWJlbmNoL0FyaXRobWV0aWMucHkKQEAgLTc3NSw0ICs3NzUsMyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQ2FsbHMucHkgYi9Ub29scy9weWJlbmNoL0NhbGxzLnB5CmluZGV4IDgyZTdhOTEuLmUyOTUyNDMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvQ2FsbHMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9DYWxscy5weQpAQCAtNDA3LDQgKzQwNywzIEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weSBiL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKaW5kZXggZmI3ZTA3Yi4uMTNlNGY5YiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weQorKysgYi9Ub29scy9weWJlbmNoL0NvbW1hbmRMaW5lLnB5CkBAIC03LDcgKzcsNyBAQAogICAgIFRPRE86CiAKICAgICAqIEluY29ycG9yYXRlIHRoZSBjaGFuZ2VzIG1hZGUgYnkgKHNlZSBJbmJveCkKLSAgICAqIEFkZCBudW1iZXIgcmFuZ2Ugb3B0aW9uIHVzaW5nIHNyYW5nZSgpIAorICAgICogQWRkIG51bWJlciByYW5nZSBvcHRpb24gdXNpbmcgc3JhbmdlKCkKIAogIiIiCiAKQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgICIiIiBPcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudC4KIAogICAgICAgICBBbiBvcHRpb25hbCBkZWZhdWx0IGFyZ3VtZW50IGNhbiBiZSBnaXZlbi4KLSAgICAgICAgCisKICAgICAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZixuYW1lLGhlbHA9Tm9uZSxkZWZhdWx0PU5vbmUpOgogCkBAIC0yOTksNyArMjk5LDcgQEAKICAgICB2YWx1ZXMgPSBOb25lICAgICAgICMgRGljdGlvbmFyeSBvZiBwYXNzZWQgb3B0aW9ucyAob3IgZGVmYXVsdCB2YWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4ZWQgYnkgdGhlIG9wdGlvbnMgbmFtZSwgZS5nLiAnLWgnCiAgICAgZmlsZXMgPSBOb25lICAgICAgICAjIExpc3Qgb2YgcGFzc2VkIGZpbGVuYW1lcwotICAgIG9wdGlvbmxpc3QgPSBOb25lCSMgTGlzdCBvZiBwYXNzZWQgb3B0aW9ucworICAgIG9wdGlvbmxpc3QgPSBOb25lICAgIyBMaXN0IG9mIHBhc3NlZCBvcHRpb25zCiAKICAgICBkZWYgX19pbml0X18oc2VsZixhcmd2PU5vbmUpOgogCkBAIC0zMTgsMTUgKzMxOCwxNSBAQAogCiAgICAgICAgICMgSW5pdCAuYXJndW1lbnRzIGxpc3QKICAgICAgICAgc2VsZi5hcmd1bWVudHMgPSBhcmd2WzE6XQotICAgICAgICAKKwogICAgICAgICAjIFNldHVwIE9wdGlvbiBtYXBwaW5nCiAgICAgICAgIHNlbGYub3B0aW9uX21hcCA9IG9wdGlvbl9kaWN0KHNlbGYub3B0aW9ucykKLSAgICAgICAgCisKICAgICAgICAgIyBBcHBlbmQgcHJlc2V0IG9wdGlvbnMKICAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLnByZXNldF9vcHRpb25zOgogICAgICAgICAgICAgaWYgbm90IHNlbGYub3B0aW9uX21hcC5oYXNfa2V5KG9wdGlvbi5uYW1lKToKICAgICAgICAgICAgICAgICBzZWxmLmFkZF9vcHRpb24ob3B0aW9uKQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICMgSW5pdCAuZmlsZXMgbGlzdAogICAgICAgICBzZWxmLmZpbGVzID0gW10KIApAQCAtMzM2LDEyICszMzYsMTIgQEAKICAgICAgICAgICAgIHJjID0gc2VsZi5zdGFydHVwKCkKICAgICAgICAgICAgIGlmIHJjIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQscmMKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAjIFBhcnNlIGNvbW1hbmQgbGluZQogICAgICAgICAgICAgcmMgPSBzZWxmLnBhcnNlKCkKICAgICAgICAgICAgIGlmIHJjIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQscmMKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAjIFN0YXJ0IGFwcGxpY2F0aW9uCiAgICAgICAgICAgICByYyA9IHNlbGYubWFpbigpCiAgICAgICAgICAgICBpZiByYyBpcyBOb25lOgpAQCAtMzc1LDcgKzM3NSw3IEBACiAKICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGhhcyB0byBiZSBkb25lICpiZWZvcmUqIC5wYXJzZSgpIGlzIGJlaW5nCiAgICAgICAgICAgICBleGVjdXRlZC4KLSAgICAgICAgCisKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYub3B0aW9ucy5hcHBlbmQob3B0aW9uKQogICAgICAgICBzZWxmLm9wdGlvbl9tYXBbb3B0aW9uLm5hbWVdID0gb3B0aW9uCkBAIC00ODEsMTAgKzQ4MSwxMCBAQAogCiAgICAgICAgICAgICBUaGlzIG1heSBtb2RpZnkgZmlsZWxpc3QgaW4gcGxhY2UuIEEgdHlwaWNhbCBhcHBsaWNhdGlvbgogICAgICAgICAgICAgaXMgY2hlY2tpbmcgdGhhdCBhdCBsZWFzdCBuIGZpbGVzIGFyZSBnaXZlbi4KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGFueXRoaW5nIG90aGVyIHRoYW4gTm9uZSwgdGhlCiAgICAgICAgICAgICBwcm9jZXNzIGlzIHRlcm1pbmF0ZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGFzIGV4aXQgY29kZS4KLSAgICAgICAgICAgIAorCiAgICAgICAgICIiIgogICAgICAgICByZXR1cm4gTm9uZQogCkBAIC01NTQsMTkgKzU1NCwxOSBAQAogICAgICAgICAiIiIgVGhpcyBtYXkgcHJvY2VzcyB0aGUgZmlsZXMgbGlzdCBpbiBwbGFjZS4KICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIAorCiAgICAgIyBTaG9ydCBvcHRpb24gaGFuZGxlcgogICAgIGRlZiBoYW5kbGVfaChzZWxmLGFyZyk6CiAKICAgICAgICAgc2VsZi5oZWxwKCkKICAgICAgICAgcmV0dXJuIDAKLSAgICAKKwogICAgIGRlZiBoYW5kbGVfdihzZWxmLCB2YWx1ZSk6CiAKICAgICAgICAgIiIiIFR1cm4gb24gdmVyYm9zZSBvdXRwdXQuCiAgICAgICAgICIiIgogICAgICAgICBzZWxmLnZlcmJvc2UgPSAxCi0gICAgICAgIAorCiAgICAgIyBIYW5kbGVycyBmb3IgbG9uZyBvcHRpb25zIGhhdmUgdHdvIHVuZGVyc2NvcmVzIGluIHRoZWlyIG5hbWUKICAgICBkZWYgaGFuZGxlX19oZWxwKHNlbGYsYXJnKToKIApAQCAtNjA3LDcgKzYwNyw3IEBACiAgICAgICAgICAgICBpdCBpcyBOb25lLCAwIGlzIGFzc3VtZWQgKG1lYW5pbmcgT0spLiBVbmhhbmRsZWQKICAgICAgICAgICAgIGV4Y2VwdGlvbnMgYXJlIHJlcG9ydGVkIHdpdGggZXhpdCBzdGF0dXMgY29kZSAxIChzZWUKICAgICAgICAgICAgIF9faW5pdF9fIGZvciBmdXJ0aGVyIGRldGFpbHMpLgotICAgICAgICAgICAgCisKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBOb25lCiAKQEAgLTYyMCw3ICs2MjAsNyBAQAogICAgICAgICBoZWFkZXIgPSAnVGVzdCBBcHBsaWNhdGlvbicKICAgICAgICAgdmVyc2lvbiA9IF9fdmVyc2lvbl9fCiAgICAgICAgIG9wdGlvbnMgPSBbT3B0aW9uKCctdicsJ3ZlcmJvc2UnKV0KLSAgICAgICAgCisKICAgICAgICAgZGVmIGhhbmRsZV92KHNlbGYsYXJnKToKICAgICAgICAgICAgIHByaW50ICdWRVJCT1NFLCBZZWFoICEnCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvQ29uc3RydWN0cy5weSBiL1Rvb2xzL3B5YmVuY2gvQ29uc3RydWN0cy5weQppbmRleCBhYmE4ODhmLi4wMDA0NWJkIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9Db25zdHJ1Y3RzLnB5CkBAIC01NjIsNCArNTYyLDMgQEAKICAgICAgICAgbDEgPSByYW5nZSgxMDAwKQogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogICAgICAgICAgICAgcGFzcwotCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0RpY3QucHkgYi9Ub29scy9weWJlbmNoL0RpY3QucHkKaW5kZXggMjA3ZDg4Zi4uNTRhZWFlNyAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9EaWN0LnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvRGljdC5weQpAQCAtOTMsNzAgKzkzLDcwIEBACiAgICAgICAgICAgICBkWydqa2wnXSA9IDQKICAgICAgICAgICAgIGRbJ21ubyddID0gNQogICAgICAgICAgICAgZFsncHFyJ10gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXQogICAgICAgICAgICAgZFsnZGVmJ10KICAgICAgICAgICAgIGRbJ2doaSddCiAgICAgICAgICAgICBkWydqa2wnXQogICAgICAgICAgICAgZFsnbW5vJ10KICAgICAgICAgICAgIGRbJ3BxciddCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXSA9IDEKICAgICAgICAgICAgIGRbJ2RlZiddID0gMgogICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCiAgICAgICAgICAgICBkWydqa2wnXSA9IDQKICAgICAgICAgICAgIGRbJ21ubyddID0gNQogICAgICAgICAgICAgZFsncHFyJ10gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXQogICAgICAgICAgICAgZFsnZGVmJ10KICAgICAgICAgICAgIGRbJ2doaSddCiAgICAgICAgICAgICBkWydqa2wnXQogICAgICAgICAgICAgZFsnbW5vJ10KICAgICAgICAgICAgIGRbJ3BxciddCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXSA9IDEKICAgICAgICAgICAgIGRbJ2RlZiddID0gMgogICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCiAgICAgICAgICAgICBkWydqa2wnXSA9IDQKICAgICAgICAgICAgIGRbJ21ubyddID0gNQogICAgICAgICAgICAgZFsncHFyJ10gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXQogICAgICAgICAgICAgZFsnZGVmJ10KICAgICAgICAgICAgIGRbJ2doaSddCiAgICAgICAgICAgICBkWydqa2wnXQogICAgICAgICAgICAgZFsnbW5vJ10KICAgICAgICAgICAgIGRbJ3BxciddCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXSA9IDEKICAgICAgICAgICAgIGRbJ2RlZiddID0gMgogICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCiAgICAgICAgICAgICBkWydqa2wnXSA9IDQKICAgICAgICAgICAgIGRbJ21ubyddID0gNQogICAgICAgICAgICAgZFsncHFyJ10gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXQogICAgICAgICAgICAgZFsnZGVmJ10KICAgICAgICAgICAgIGRbJ2doaSddCiAgICAgICAgICAgICBkWydqa2wnXQogICAgICAgICAgICAgZFsnbW5vJ10KICAgICAgICAgICAgIGRbJ3BxciddCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXSA9IDEKICAgICAgICAgICAgIGRbJ2RlZiddID0gMgogICAgICAgICAgICAgZFsnZ2hpJ10gPSAzCiAgICAgICAgICAgICBkWydqa2wnXSA9IDQKICAgICAgICAgICAgIGRbJ21ubyddID0gNQogICAgICAgICAgICAgZFsncHFyJ10gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWydhYmMnXQogICAgICAgICAgICAgZFsnZGVmJ10KICAgICAgICAgICAgIGRbJ2doaSddCiAgICAgICAgICAgICBkWydqa2wnXQogICAgICAgICAgICAgZFsnbW5vJ10KICAgICAgICAgICAgIGRbJ3BxciddCi0gICAgICAgICAgICAgIAorCiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIAogICAgICAgICBkID0ge30KQEAgLTE4Miw3MCArMTgyLDcwIEBACiAgICAgICAgICAgICBkWzQuNTY3XSA9IDQKICAgICAgICAgICAgIGRbNS42NzhdID0gNQogICAgICAgICAgICAgZFs2Ljc4OV0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XQogICAgICAgICAgICAgZFsyLjM0NV0KICAgICAgICAgICAgIGRbMy40NTZdCiAgICAgICAgICAgICBkWzQuNTY3XQogICAgICAgICAgICAgZFs1LjY3OF0KICAgICAgICAgICAgIGRbNi43ODldCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XSA9IDEKICAgICAgICAgICAgIGRbMi4zNDVdID0gMgogICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCiAgICAgICAgICAgICBkWzQuNTY3XSA9IDQKICAgICAgICAgICAgIGRbNS42NzhdID0gNQogICAgICAgICAgICAgZFs2Ljc4OV0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XQogICAgICAgICAgICAgZFsyLjM0NV0KICAgICAgICAgICAgIGRbMy40NTZdCiAgICAgICAgICAgICBkWzQuNTY3XQogICAgICAgICAgICAgZFs1LjY3OF0KICAgICAgICAgICAgIGRbNi43ODldCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XSA9IDEKICAgICAgICAgICAgIGRbMi4zNDVdID0gMgogICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCiAgICAgICAgICAgICBkWzQuNTY3XSA9IDQKICAgICAgICAgICAgIGRbNS42NzhdID0gNQogICAgICAgICAgICAgZFs2Ljc4OV0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XQogICAgICAgICAgICAgZFsyLjM0NV0KICAgICAgICAgICAgIGRbMy40NTZdCiAgICAgICAgICAgICBkWzQuNTY3XQogICAgICAgICAgICAgZFs1LjY3OF0KICAgICAgICAgICAgIGRbNi43ODldCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XSA9IDEKICAgICAgICAgICAgIGRbMi4zNDVdID0gMgogICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCiAgICAgICAgICAgICBkWzQuNTY3XSA9IDQKICAgICAgICAgICAgIGRbNS42NzhdID0gNQogICAgICAgICAgICAgZFs2Ljc4OV0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XQogICAgICAgICAgICAgZFsyLjM0NV0KICAgICAgICAgICAgIGRbMy40NTZdCiAgICAgICAgICAgICBkWzQuNTY3XQogICAgICAgICAgICAgZFs1LjY3OF0KICAgICAgICAgICAgIGRbNi43ODldCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XSA9IDEKICAgICAgICAgICAgIGRbMi4zNDVdID0gMgogICAgICAgICAgICAgZFszLjQ1Nl0gPSAzCiAgICAgICAgICAgICBkWzQuNTY3XSA9IDQKICAgICAgICAgICAgIGRbNS42NzhdID0gNQogICAgICAgICAgICAgZFs2Ljc4OV0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzEuMjM0XQogICAgICAgICAgICAgZFsyLjM0NV0KICAgICAgICAgICAgIGRbMy40NTZdCiAgICAgICAgICAgICBkWzQuNTY3XQogICAgICAgICAgICAgZFs1LjY3OF0KICAgICAgICAgICAgIGRbNi43ODldCi0gICAgICAgICAgICAgIAorCiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIAogICAgICAgICBkID0ge30KQEAgLTI3MSw3MCArMjcxLDcwIEBACiAgICAgICAgICAgICBkWzRdID0gNAogICAgICAgICAgICAgZFs1XSA9IDUKICAgICAgICAgICAgIGRbNl0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdCiAgICAgICAgICAgICBkWzJdCiAgICAgICAgICAgICBkWzNdCiAgICAgICAgICAgICBkWzRdCiAgICAgICAgICAgICBkWzVdCiAgICAgICAgICAgICBkWzZdCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdID0gMQogICAgICAgICAgICAgZFsyXSA9IDIKICAgICAgICAgICAgIGRbM10gPSAzCiAgICAgICAgICAgICBkWzRdID0gNAogICAgICAgICAgICAgZFs1XSA9IDUKICAgICAgICAgICAgIGRbNl0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdCiAgICAgICAgICAgICBkWzJdCiAgICAgICAgICAgICBkWzNdCiAgICAgICAgICAgICBkWzRdCiAgICAgICAgICAgICBkWzVdCiAgICAgICAgICAgICBkWzZdCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdID0gMQogICAgICAgICAgICAgZFsyXSA9IDIKICAgICAgICAgICAgIGRbM10gPSAzCiAgICAgICAgICAgICBkWzRdID0gNAogICAgICAgICAgICAgZFs1XSA9IDUKICAgICAgICAgICAgIGRbNl0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdCiAgICAgICAgICAgICBkWzJdCiAgICAgICAgICAgICBkWzNdCiAgICAgICAgICAgICBkWzRdCiAgICAgICAgICAgICBkWzVdCiAgICAgICAgICAgICBkWzZdCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdID0gMQogICAgICAgICAgICAgZFsyXSA9IDIKICAgICAgICAgICAgIGRbM10gPSAzCiAgICAgICAgICAgICBkWzRdID0gNAogICAgICAgICAgICAgZFs1XSA9IDUKICAgICAgICAgICAgIGRbNl0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdCiAgICAgICAgICAgICBkWzJdCiAgICAgICAgICAgICBkWzNdCiAgICAgICAgICAgICBkWzRdCiAgICAgICAgICAgICBkWzVdCiAgICAgICAgICAgICBkWzZdCi0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdID0gMQogICAgICAgICAgICAgZFsyXSA9IDIKICAgICAgICAgICAgIGRbM10gPSAzCiAgICAgICAgICAgICBkWzRdID0gNAogICAgICAgICAgICAgZFs1XSA9IDUKICAgICAgICAgICAgIGRbNl0gPSA2Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBkWzFdCiAgICAgICAgICAgICBkWzJdCiAgICAgICAgICAgICBkWzNdCiAgICAgICAgICAgICBkWzRdCiAgICAgICAgICAgICBkWzVdCiAgICAgICAgICAgICBkWzZdCi0gICAgICAgICAgICAgIAorCiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIAogICAgICAgICBkID0ge30KQEAgLTM2MCw3ICszNjAsNyBAQAogICAgICAgICAgICAgZFszXSA9IDMKICAgICAgICAgICAgIGRbNF0gPSA0CiAgICAgICAgICAgICBkWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHggPSBkWzBdCiAgICAgICAgICAgICB4ID0gZFsxXQogICAgICAgICAgICAgeCA9IGRbMl0KQEAgLTM4OCw3ICszODgsNyBAQAogICAgICAgICAgICAgZFszXSA9IDMKICAgICAgICAgICAgIGRbNF0gPSA0CiAgICAgICAgICAgICBkWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHggPSBkWzBdCiAgICAgICAgICAgICB4ID0gZFsxXQogICAgICAgICAgICAgeCA9IGRbMl0KQEAgLTQxNiw3ICs0MTYsNyBAQAogICAgICAgICAgICAgZFszXSA9IDMKICAgICAgICAgICAgIGRbNF0gPSA0CiAgICAgICAgICAgICBkWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHggPSBkWzBdCiAgICAgICAgICAgICB4ID0gZFsxXQogICAgICAgICAgICAgeCA9IGRbMl0KQEAgLTQ0NCw3ICs0NDQsNyBAQAogICAgICAgICAgICAgZFszXSA9IDMKICAgICAgICAgICAgIGRbNF0gPSA0CiAgICAgICAgICAgICBkWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHggPSBkWzBdCiAgICAgICAgICAgICB4ID0gZFsxXQogICAgICAgICAgICAgeCA9IGRbMl0KQEAgLTQ3Miw3ICs0NzIsNyBAQAogICAgICAgICAgICAgZFszXSA9IDMKICAgICAgICAgICAgIGRbNF0gPSA0CiAgICAgICAgICAgICBkWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHggPSBkWzBdCiAgICAgICAgICAgICB4ID0gZFsxXQogICAgICAgICAgICAgeCA9IGRbMl0KQEAgLTUwMCw0ICs1MDAsMyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weSBiL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weQppbmRleCAyOTVjODNhLi43ZTU1NzA4IDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0V4Y2VwdGlvbnMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9FeGNlcHRpb25zLnB5CkBAIC0zOCw3ICszOCw3IEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIAorCiAKIGNsYXNzIFRyeUV4Y2VwdChUZXN0KToKIApAQCAtNjc3LDUgKzY3NywzIEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIAotCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkgYi9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkKaW5kZXggZWI0NThiNC4uODVlYjYwNCAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9JbXBvcnRzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvSW1wb3J0cy5weQpAQCAtNDcsNyArNDcsNyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAKKwogCiBjbGFzcyBTZWNvbmRQYWNrYWdlSW1wb3J0KFRlc3QpOgogCkBAIC05Miw3ICs5Miw3IEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIAorCiBjbGFzcyBTZWNvbmRTdWJtb2R1bGVJbXBvcnQoVGVzdCk6CiAKICAgICB2ZXJzaW9uID0gMC4xCkBAIC0xMzYsNCArMTM2LDMgQEAKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0luc3RhbmNlcy5weSBiL1Rvb2xzL3B5YmVuY2gvSW5zdGFuY2VzLnB5CmluZGV4IDc2NjNlMjMuLjliMTkyOWQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvSW5zdGFuY2VzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvSW5zdGFuY2VzLnB5CkBAIC02NCw1ICs2NCwzIEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLQotCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0xpc3RzLnB5IGIvVG9vbHMvcHliZW5jaC9MaXN0cy5weQppbmRleCBhMDZiNDRjLi40YzE4ZTk5IDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0xpc3RzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkKQEAgLTI1LDcgKzI1LDcgQEAKICAgICAgICAgICAgIGxbM10gPSAzCiAgICAgICAgICAgICBsWzRdID0gNAogICAgICAgICAgICAgbFs1XSA9IDUKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICB4ID0gbFswXQogICAgICAgICAgICAgeCA9IGxbMV0KICAgICAgICAgICAgIHggPSBsWzJdCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICAgICBsWzNdID0gMwogICAgICAgICAgICAgbFs0XSA9IDQKICAgICAgICAgICAgIGxbNV0gPSA1Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgeCA9IGxbMF0KICAgICAgICAgICAgIHggPSBsWzFdCiAgICAgICAgICAgICB4ID0gbFsyXQpAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAgICAgbFszXSA9IDMKICAgICAgICAgICAgIGxbNF0gPSA0CiAgICAgICAgICAgICBsWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHggPSBsWzBdCiAgICAgICAgICAgICB4ID0gbFsxXQogICAgICAgICAgICAgeCA9IGxbMl0KQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgICAgICAgIGxbM10gPSAzCiAgICAgICAgICAgICBsWzRdID0gNAogICAgICAgICAgICAgbFs1XSA9IDUKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICB4ID0gbFswXQogICAgICAgICAgICAgeCA9IGxbMV0KICAgICAgICAgICAgIHggPSBsWzJdCkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgIGxbM10gPSAzCiAgICAgICAgICAgICBsWzRdID0gNAogICAgICAgICAgICAgbFs1XSA9IDUKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICB4ID0gbFswXQogICAgICAgICAgICAgeCA9IGxbMV0KICAgICAgICAgICAgIHggPSBsWzJdCkBAIC0xOTAsMTEgKzE5MCwxMSBAQAogICAgICAgICAgICAgbFszXSA9IDMKICAgICAgICAgICAgIGxbNF0gPSA0CiAgICAgICAgICAgICBsWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGxbOjNdID0gWzEsMiwzXQogICAgICAgICAgICAgbSA9IGxbOi0xXQogICAgICAgICAgICAgbSA9IGxbMTpdCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgbFstMTpdID0gWzQsNSw2XQogCiAgICAgICAgICAgICBsID0gW10KQEAgLTIxMiwxMSArMjEyLDExIEBACiAgICAgICAgICAgICBsWzNdID0gMwogICAgICAgICAgICAgbFs0XSA9IDQKICAgICAgICAgICAgIGxbNV0gPSA1Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgbFs6M10gPSBbMSwyLDNdCiAgICAgICAgICAgICBtID0gbFs6LTFdCiAgICAgICAgICAgICBtID0gbFsxOl0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBsWy0xOl0gPSBbNCw1LDZdCiAKICAgICAgICAgICAgIGwgPSBbXQpAQCAtMjM0LDExICsyMzQsMTEgQEAKICAgICAgICAgICAgIGxbM10gPSAzCiAgICAgICAgICAgICBsWzRdID0gNAogICAgICAgICAgICAgbFs1XSA9IDUKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBsWzozXSA9IFsxLDIsM10KICAgICAgICAgICAgIG0gPSBsWzotMV0KICAgICAgICAgICAgIG0gPSBsWzE6XQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGxbLTE6XSA9IFs0LDUsNl0KIAogICAgICAgICAgICAgbCA9IFtdCkBAIC0yNTYsMTEgKzI1NiwxMSBAQAogICAgICAgICAgICAgbFszXSA9IDMKICAgICAgICAgICAgIGxbNF0gPSA0CiAgICAgICAgICAgICBsWzVdID0gNQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGxbOjNdID0gWzEsMiwzXQogICAgICAgICAgICAgbSA9IGxbOi0xXQogICAgICAgICAgICAgbSA9IGxbMTpdCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgbFstMTpdID0gWzQsNSw2XQogCiAgICAgICAgICAgICBsID0gW10KQEAgLTI3OCwxNSArMjc4LDE0IEBACiAgICAgICAgICAgICBsWzNdID0gMwogICAgICAgICAgICAgbFs0XSA9IDQKICAgICAgICAgICAgIGxbNV0gPSA1Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgbFs6M10gPSBbMSwyLDNdCiAgICAgICAgICAgICBtID0gbFs6LTFdCiAgICAgICAgICAgICBtID0gbFsxOl0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBsWy0xOl0gPSBbNCw1LDZdCiAKICAgICBkZWYgY2FsaWJyYXRlKHNlbGYpOgogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBsID0gW10KLQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Mb29rdXBzLnB5IGIvVG9vbHMvcHliZW5jaC9Mb29rdXBzLnB5CmluZGV4IGZiYmMwZWQuLmU1NTI5Y2QgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weQorKysgYi9Ub29scy9weWJlbmNoL0xvb2t1cHMucHkKQEAgLTk0Myw0ICs5NDMsMyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvTmV3SW5zdGFuY2VzLnB5IGIvVG9vbHMvcHliZW5jaC9OZXdJbnN0YW5jZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTM1MjYzOAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL3B5YmVuY2gvTmV3SW5zdGFuY2VzLnB5CkBAIC0wLDAgKzEsNjYgQEAKK2Zyb20gcHliZW5jaCBpbXBvcnQgVGVzdAorCitjbGFzcyBDcmVhdGVOZXdJbnN0YW5jZXMoVGVzdCk6CisKKyAgICB2ZXJzaW9uID0gMC4xCisgICAgb3BlcmF0aW9ucyA9IDMgKyA3ICsgNAorICAgIHJvdW5kcyA9IDYwMDAwCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBjbGFzcyBjKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgZChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsYSxiLGMpOgorICAgICAgICAgICAgICAgIHNlbGYuYSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgICAgICAgICAgc2VsZi5jID0gYworCisgICAgICAgIGNsYXNzIGUob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLGEsYixjPTQpOgorICAgICAgICAgICAgICAgIHNlbGYuYSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgICAgICAgICAgc2VsZi5jID0gYworICAgICAgICAgICAgICAgIHNlbGYuZCA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmUgPSBiCisgICAgICAgICAgICAgICAgc2VsZi5mID0gYworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBvID0gYygpCisgICAgICAgICAgICBvMSA9IGMoKQorICAgICAgICAgICAgbzIgPSBjKCkKKyAgICAgICAgICAgIHAgPSBkKGksaSwzKQorICAgICAgICAgICAgcDEgPSBkKGksaSwzKQorICAgICAgICAgICAgcDIgPSBkKGksMywzKQorICAgICAgICAgICAgcDMgPSBkKDMsaSwzKQorICAgICAgICAgICAgcDQgPSBkKGksaSxpKQorICAgICAgICAgICAgcDUgPSBkKDMsaSwzKQorICAgICAgICAgICAgcDYgPSBkKGksaSxpKQorICAgICAgICAgICAgcSA9IGUoaSxpLDMpCisgICAgICAgICAgICBxMSA9IGUoaSxpLDMpCisgICAgICAgICAgICBxMiA9IGUoaSxpLDMpCisgICAgICAgICAgICBxMyA9IGUoaSxpKQorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKKworICAgICAgICBjbGFzcyBjKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgZChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsYSxiLGMpOgorICAgICAgICAgICAgICAgIHNlbGYuYSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgICAgICAgICAgc2VsZi5jID0gYworCisgICAgICAgIGNsYXNzIGUob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLGEsYixjPTQpOgorICAgICAgICAgICAgICAgIHNlbGYuYSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgICAgICAgICAgc2VsZi5jID0gYworICAgICAgICAgICAgICAgIHNlbGYuZCA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmUgPSBiCisgICAgICAgICAgICAgICAgc2VsZi5mID0gYworCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CisgICAgICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL051bWJlcnMucHkgYi9Ub29scy9weWJlbmNoL051bWJlcnMucHkKaW5kZXggNzVjZjJlZC4uYTZhZWEzMyAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9OdW1iZXJzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvTnVtYmVycy5weQpAQCAtMTUsNTUgKzE1LDcgQEAKICAgICAgICAgICAgIDIgPT0gMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA9PSAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyID09IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPT0gMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA9PSAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyID09IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPT0gMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA9PSAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyID09IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIgPCAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA9PSAzCkBAIC03NSw1NSArMjcsNyBAQAogICAgICAgICAgICAgMiA9PSAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyID09IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPT0gMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA9PSAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyID09IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPT0gMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA9PSAzCi0gICAgICAgICAgICAyID4gMwotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyID09IDMKLSAgICAgICAgICAgIDIgPiAzCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCi0gICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPT0gMwotICAgICAgICAgICAgMiA+IDMKLSAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMiA8IDMKICAgICAgICAgICAgIDIgPiAzCiAgICAgICAgICAgICAyID09IDMKQEAgLTEzNSw1NSArMzksMTUxIEBACiAgICAgICAgICAgICAyID09IDMKICAgICAgICAgICAgIDIgPiAzCiAgICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIgPCAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA9PSAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyIDwgMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPT0gMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMiA8IDMKICAgICAgICAgICAgIDIgPiAzCiAgICAgICAgICAgICAyID09IDMKICAgICAgICAgICAgIDIgPiAzCiAgICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIgPCAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA9PSAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyIDwgMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPT0gMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMiA8IDMKICAgICAgICAgICAgIDIgPiAzCiAgICAgICAgICAgICAyID09IDMKICAgICAgICAgICAgIDIgPiAzCiAgICAgICAgICAgICAyIDwgMwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIgPCAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA9PSAzCiAgICAgICAgICAgICAyID4gMwogICAgICAgICAgICAgMiA8IDMKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyIDwgMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPT0gMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPCAzCi0gICAgICAgICAgICAKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCisgICAgICAgICAgICAyIDwgMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPT0gMworICAgICAgICAgICAgMiA+IDMKKyAgICAgICAgICAgIDIgPCAzCisKKyAgICAgICAgICAgIDIgPCAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA9PSAzCisgICAgICAgICAgICAyID4gMworICAgICAgICAgICAgMiA8IDMKKworICAgICAgICAgICAgMiA8IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyID09IDMKKyAgICAgICAgICAgIDIgPiAzCisgICAgICAgICAgICAyIDwgMworCiAgICAgICAgICAgICAyIDwgMwogICAgICAgICAgICAgMiA+IDMKICAgICAgICAgICAgIDIgPT0gMwpAQCAtMjExLDU1ICsyMTEsNyBAQAogICAgICAgICAgICAgMi4xID09IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPT0gMy4zMQpAQCAtMjcxLDU1ICsyMjMsNyBAQAogICAgICAgICAgICAgMi4xID09IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgMi4xID4gMy4zMQotICAgICAgICAgICAgMi4xID09IDMuMzEKLSAgICAgICAgICAgIDIuMSA+IDMuMzEKLSAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPT0gMy4zMQpAQCAtMzMxLDU1ICsyMzUsMTUxIEBACiAgICAgICAgICAgICAyLjEgPT0gMy4zMQogICAgICAgICAgICAgMi4xID4gMy4zMQogICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIuMSA8IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA9PSAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPCAzLjMxCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMi4xIDwgMy4zMQogICAgICAgICAgICAgMi4xID4gMy4zMQogICAgICAgICAgICAgMi4xID09IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPT0gMy4zMQogICAgICAgICAgICAgMi4xID4gMy4zMQogICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIuMSA8IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA9PSAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPCAzLjMxCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMi4xIDwgMy4zMQogICAgICAgICAgICAgMi4xID4gMy4zMQogICAgICAgICAgICAgMi4xID09IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPT0gMy4zMQogICAgICAgICAgICAgMi4xID4gMy4zMQogICAgICAgICAgICAgMi4xIDwgMy4zMQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIuMSA8IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA9PSAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPCAzLjMxCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMi4xIDwgMy4zMQogICAgICAgICAgICAgMi4xID4gMy4zMQogICAgICAgICAgICAgMi4xID09IDMuMzEKICAgICAgICAgICAgIDIuMSA+IDMuMzEKICAgICAgICAgICAgIDIuMSA8IDMuMzEKLSAgICAgICAgICAgIAorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCisgICAgICAgICAgICAyLjEgPCAzLjMxCisgICAgICAgICAgICAyLjEgPiAzLjMxCisgICAgICAgICAgICAyLjEgPT0gMy4zMQorICAgICAgICAgICAgMi4xID4gMy4zMQorICAgICAgICAgICAgMi4xIDwgMy4zMQorCiAgICAgICAgICAgICAyLjEgPCAzLjMxCiAgICAgICAgICAgICAyLjEgPiAzLjMxCiAgICAgICAgICAgICAyLjEgPT0gMy4zMQpAQCAtNDA3LDU1ICs0MDcsNyBAQAogICAgICAgICAgICAgMi4xID09IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPT0gNApAQCAtNDY3LDU1ICs0MTksNyBAQAogICAgICAgICAgICAgMi4xID09IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgMi4xID4gNAotICAgICAgICAgICAgMi4xID09IDQKLSAgICAgICAgICAgIDIuMSA+IDQKLSAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPT0gNApAQCAtNTI3LDU1ICs0MzEsMTUxIEBACiAgICAgICAgICAgICAyLjEgPT0gNAogICAgICAgICAgICAgMi4xID4gNAogICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIuMSA8IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA9PSA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPCA0Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMi4xIDwgNAogICAgICAgICAgICAgMi4xID4gNAogICAgICAgICAgICAgMi4xID09IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPT0gNAogICAgICAgICAgICAgMi4xID4gNAogICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIuMSA8IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA9PSA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPCA0Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMi4xIDwgNAogICAgICAgICAgICAgMi4xID4gNAogICAgICAgICAgICAgMi4xID09IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAyLjEgPCA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPT0gNAogICAgICAgICAgICAgMi4xID4gNAogICAgICAgICAgICAgMi4xIDwgNAotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDIuMSA8IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA9PSA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPCA0Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMi4xIDwgNAogICAgICAgICAgICAgMi4xID4gNAogICAgICAgICAgICAgMi4xID09IDQKICAgICAgICAgICAgIDIuMSA+IDQKICAgICAgICAgICAgIDIuMSA8IDQKLSAgICAgICAgICAgIAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCisgICAgICAgICAgICAyLjEgPCA0CisgICAgICAgICAgICAyLjEgPiA0CisgICAgICAgICAgICAyLjEgPT0gNAorICAgICAgICAgICAgMi4xID4gNAorICAgICAgICAgICAgMi4xIDwgNAorCiAgICAgICAgICAgICAyLjEgPCA0CiAgICAgICAgICAgICAyLjEgPiA0CiAgICAgICAgICAgICAyLjEgPT0gNApAQCAtNjAzLDU1ICs2MDMsNyBAQAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TApAQCAtNjYzLDU1ICs2MTUsNyBAQAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TApAQCAtNzIzLDU1ICs2MjcsMTUxIEBACiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID09IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID09IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID09IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCi0gICAgICAgICAgICAKKwogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAogICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPT0gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMID4gMzQ1Njc4OTAxMjM0NUwKICAgICAgICAgICAgIDEyMzQ1Njc4OTBMIDwgMzQ1Njc4OTAxMjM0NUwKLSAgICAgICAgICAgIAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCisgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPiAzNDU2Nzg5MDEyMzQ1TAorICAgICAgICAgICAgMTIzNDU2Nzg5MEwgPCAzNDU2Nzg5MDEyMzQ1TAorCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA8IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA+IDM0NTY3ODkwMTIzNDVMCiAgICAgICAgICAgICAxMjM0NTY3ODkwTCA9PSAzNDU2Nzg5MDEyMzQ1TApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9SRUFETUUgYi9Ub29scy9weWJlbmNoL1JFQURNRQppbmRleCA2MzRlNDFiLi45NWFlMzkyIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL1JFQURNRQorKysgYi9Ub29scy9weWJlbmNoL1JFQURNRQpAQCAtNDYsNiArNDYsOSBAQAogICAtdyBhcmcgICAgICAgICAgIHNldCB3YXJwIGZhY3RvciB0byBhcmcgKDIwKQogICAtZCAgICAgICAgICAgICAgIGhpZGUgbm9pc2UgaW4gY29tcGFyZXMgKDApCiAgIC0tbm8tZ2MgICAgICAgICAgZGlzYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gKDApCisgIC0tbm8tc3lzY2hlY2sgICAgImRpc2FibGUiIHN5cyBjaGVjayBpbnRlcnZhbCAoc2V0IHRvIHN5cy5tYXhpbnQpICgwKQorICAtdCBhcmcgICAgICAgICAgIHRlc3RzIGNvbnRhaW5pbmcgc3Vic3RyaW5nICgpCisgIC1DIGFyZyAgICAgICAgICAgbnVtYmVyIG9mIGNhbGlicmF0aW9uIHJ1bnMgKDIwKQogICAtdiAgICAgICAgICAgICAgIGdlbmVyYXRlIHZlcmJvc2Ugb3V0cHV0CiAgIC1oICAgICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgdGV4dAogICAtLWhlbHAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIHRleHQKQEAgLTM2Niw2ICszNjksMTQgQEAKIGF1dG9tYXRpY2FsbHkgYWRkIHRoZW0gdG8gdGhlIGJlbmNobWFyayBzdWl0ZS4KIAogCitCcmVha2luZyBDb21wYXJhYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIGEgY2hhbmdlIGlzIG1hZGUgdG8gYW55IGluZGl2aWR1YWwgdGVzdCB0aGF0IG1lYW5zIGl0IGlzIG5vCitsb25nZXIgc3RyaWN0bHkgY29tcGFyYWJsZSB3aXRoIHByZXZpb3VzIHJ1bnMsIHRoZSAnLnZlcnNpb24nIGNsYXNzCit2YXJpYWJsZSBzaG91bGQgYmUgdXBkYXRlZC4gVGhlcmVmYWZ0ZXIsIGNvbXBhcmlzb25zIHdpdGggcHJldmlvdXMKK3ZlcnNpb25zIG9mIHRoZSB0ZXN0IHdpbGwgbGlzdCBhcyAibi9hIiB0byByZWZsZWN0IHRoZSBjaGFuZ2UuCisKIEhhdmUgZnVuLAogLS0KIE1hcmMtQW5kcmUgTGVtYnVyZwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9TZXR1cC5weSBiL1Rvb2xzL3B5YmVuY2gvU2V0dXAucHkKaW5kZXggOTA2YTJhOS4uZjVjNTE5MCAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9TZXR1cC5weQorKysgYi9Ub29scy9weWJlbmNoL1NldHVwLnB5CkBAIC0yMiw2ICsyMiwxMCBAQAogZnJvbSBDb25zdHJ1Y3RzIGltcG9ydCAqCiBmcm9tIExvb2t1cHMgaW1wb3J0ICoKIGZyb20gSW5zdGFuY2VzIGltcG9ydCAqCit0cnk6CisgICAgZnJvbSBOZXdJbnN0YW5jZXMgaW1wb3J0ICoKK2V4Y2VwdDoKKyAgICBwcmludCAiQ2Fubm90IHRlc3QgbmV3LXN0eWxlIG9iamVjdHMiCiBmcm9tIExpc3RzIGltcG9ydCAqCiBmcm9tIFR1cGxlcyBpbXBvcnQgKgogZnJvbSBEaWN0IGltcG9ydCAqCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1N0cmluZ3MucHkgYi9Ub29scy9weWJlbmNoL1N0cmluZ3MucHkKaW5kZXggNWFiNDU4ZS4uYjAxODQzYSAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvU3RyaW5ncy5weQpAQCAtODEsNyArODEsNyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAKKwogCiBjbGFzcyBDb21wYXJlU3RyaW5ncyhUZXN0KToKIApAQCAtMTYzLDcgKzE2Myw3IEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIAorCiAKIGNsYXNzIENvbXBhcmVJbnRlcm5lZFN0cmluZ3MoVGVzdCk6CiAKQEAgLTI0NSw3ICsyNDUsNyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAKKwogCiBjbGFzcyBDcmVhdGVTdHJpbmdzV2l0aENvbmNhdChUZXN0KToKIApAQCAtMzIwLDcgKzMyMCw3IEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIAorCiAKIGNsYXNzIFN0cmluZ1NsaWNpbmcoVGVzdCk6CiAKQEAgLTMzNCw0NSArMzM0LDQ1IEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKIAotICAgICAgICAgICAgICAgIHNbNTA6XQotICAgICAgICAgICAgICAgIHNbOjI1XQotICAgICAgICAgICAgICAgIHNbNTA6NTVdCi0gICAgICAgICAgICAgICAgc1stMTpdCi0gICAgICAgICAgICAgICAgc1s6MV0KLSAgICAgICAgICAgICAgICBzWzI6XQotICAgICAgICAgICAgICAgIHNbMTE6LTExXQorICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgIHNbNTA6NTVdCisgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICBzWzI6XQorICAgICAgICAgICAgc1sxMTotMTFdCiAKLSAgICAgICAgICAgICAgICBzWzUwOl0KLSAgICAgICAgICAgICAgICBzWzoyNV0KLSAgICAgICAgICAgICAgICBzWzUwOjU1XQotICAgICAgICAgICAgICAgIHNbLTE6XQotICAgICAgICAgICAgICAgIHNbOjFdCi0gICAgICAgICAgICAgICAgc1syOl0KLSAgICAgICAgICAgICAgICBzWzExOi0xMV0KKyAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgIHNbMTE6LTExXQogCi0gICAgICAgICAgICAgICAgc1s1MDpdCi0gICAgICAgICAgICAgICAgc1s6MjVdCi0gICAgICAgICAgICAgICAgc1s1MDo1NV0KLSAgICAgICAgICAgICAgICBzWy0xOl0KLSAgICAgICAgICAgICAgICBzWzoxXQotICAgICAgICAgICAgICAgIHNbMjpdCi0gICAgICAgICAgICAgICAgc1sxMTotMTFdCisgICAgICAgICAgICBzWzUwOl0KKyAgICAgICAgICAgIHNbOjI1XQorICAgICAgICAgICAgc1s1MDo1NV0KKyAgICAgICAgICAgIHNbLTE6XQorICAgICAgICAgICAgc1s6MV0KKyAgICAgICAgICAgIHNbMjpdCisgICAgICAgICAgICBzWzExOi0xMV0KIAotICAgICAgICAgICAgICAgIHNbNTA6XQotICAgICAgICAgICAgICAgIHNbOjI1XQotICAgICAgICAgICAgICAgIHNbNTA6NTVdCi0gICAgICAgICAgICAgICAgc1stMTpdCi0gICAgICAgICAgICAgICAgc1s6MV0KLSAgICAgICAgICAgICAgICBzWzI6XQotICAgICAgICAgICAgICAgIHNbMTE6LTExXQorICAgICAgICAgICAgc1s1MDpdCisgICAgICAgICAgICBzWzoyNV0KKyAgICAgICAgICAgIHNbNTA6NTVdCisgICAgICAgICAgICBzWy0xOl0KKyAgICAgICAgICAgIHNbOjFdCisgICAgICAgICAgICBzWzI6XQorICAgICAgICAgICAgc1sxMTotMTFdCiAKLSAgICAgICAgICAgICAgICBzWzUwOl0KLSAgICAgICAgICAgICAgICBzWzoyNV0KLSAgICAgICAgICAgICAgICBzWzUwOjU1XQotICAgICAgICAgICAgICAgIHNbLTE6XQotICAgICAgICAgICAgICAgIHNbOjFdCi0gICAgICAgICAgICAgICAgc1syOl0KLSAgICAgICAgICAgICAgICBzWzExOi0xMV0KKyAgICAgICAgICAgIHNbNTA6XQorICAgICAgICAgICAgc1s6MjVdCisgICAgICAgICAgICBzWzUwOjU1XQorICAgICAgICAgICAgc1stMTpdCisgICAgICAgICAgICBzWzoxXQorICAgICAgICAgICAgc1syOl0KKyAgICAgICAgICAgIHNbMTE6LTExXQogCiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIApAQCAtNTYwLDUgKzU2MCwzIEBACiAKICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICAgICAgcyA9IGRhdGFbaSAlIGxlbl9kYXRhXQotCi0KZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5IGIvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKaW5kZXggNzg1NGRlZi4uZTg0ZWE1MyAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9UdXBsZXMucHkKQEAgLTI2NSw3ICsyNjUsNyBAQAogICAgICAgICAgICAgdCA9IHR1cGxlKHJhbmdlKDEwMCkpCiAKICAgICAgICAgICAgIGZvciBqIGluIHI6Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICBwYXNzCiAKIGNsYXNzIFNtYWxsVHVwbGVzKFRlc3QpOgpAQCAtMzYyLDQgKzM2MiwzIEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Vbmljb2RlLnB5IGIvVG9vbHMvcHliZW5jaC9Vbmljb2RlLnB5CmluZGV4IDg1NWZjZjIuLjM2NmYxNzEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvVW5pY29kZS5weQorKysgYi9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkKQEAgLTg2LDcgKzg2LDcgQEAKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgCisKIAogY2xhc3MgQ29tcGFyZVVuaWNvZGUoVGVzdCk6CiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAKKwogCiBjbGFzcyBDcmVhdGVVbmljb2RlV2l0aENvbmNhdChUZXN0KToKIApAQCAtMjQzLDcgKzI0Myw3IEBACiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIAorCiAKIGNsYXNzIFVuaWNvZGVTbGljaW5nKFRlc3QpOgogCkBAIC0zMDMsNyArMzAzLDcgQEAKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICAKKwogIyMjIFN0cmluZyBtZXRob2RzCiAKIGNsYXNzIFVuaWNvZGVNYXBwaW5ncyhUZXN0KToKQEAgLTMxOCw3ICszMTgsNyBAQAogICAgICAgICB0ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDEwMCkpLCcnKQogICAgICAgICB1ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDUwMCkpLCcnKQogICAgICAgICB2ID0gam9pbihtYXAodW5pY2hyLHJhbmdlKDEwMDApKSwnJykKLSAgICAgICAgCisKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKIAogICAgICAgICAgICAgcy5sb3dlcigpCkBAIC0zNzUsNyArMzc1LDcgQEAKICAgICAgICAgdCA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgxMDApKSwnJykKICAgICAgICAgdSA9IGpvaW4obWFwKHVuaWNocixyYW5nZSg1MDApKSwnJykKICAgICAgICAgdiA9IGpvaW4obWFwKHVuaWNocixyYW5nZSgxMDAwKSksJycpCi0gICAgICAgIAorCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCiAKQEAgLTM4OSw3ICszODksNyBAQAogCiAgICAgICAgIGRhdGEgPSAodSdhYmMnLCB1JzEyMycsIHUnICAgJywgdSdcdTEyMzRcdTIzNDVcdTM0NTYnLCB1J1x1RkZGRicqMTApCiAgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCi0gICAgICAgIAorCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBzID0gZGF0YVtpICUgbGVuX2RhdGFdCiAKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCiAgICAgICAgIGRhdGEgPSAodSdhYmMnLCB1JzEyMycsIHUnICAgJywgdSdcdTEyMzRcdTIzNDVcdTM0NTYnLCB1J1x1RkZGRicqMTApCiAgICAgICAgIGxlbl9kYXRhID0gbGVuKGRhdGEpCi0gICAgICAgIAorCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBzID0gZGF0YVtpICUgbGVuX2RhdGFdCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weSBiL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weQppbmRleCA2ZjEwYmQxLi5lMDExMGQwIDEwMDc1NQotLS0gYS9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkKKysrIGIvVG9vbHMvcHliZW5jaC9weWJlbmNoLnB5CkBAIC0zOCw3ICszOCw3IEBACiBfX3ZlcnNpb25fXyA9ICcxLjMnCiAKICMKLSMgTk9URTogVXNlIHhyYW5nZSBmb3IgYWxsIHRlc3QgbG9vcHMgdW5sZXNzIHlvdSB3YW50IHRvIGZhY2UgCisjIE5PVEU6IFVzZSB4cmFuZ2UgZm9yIGFsbCB0ZXN0IGxvb3BzIHVubGVzcyB5b3Ugd2FudCB0byBmYWNlCiAjICAgICAgIGEgMjBNQiBwcm9jZXNzICEKICMKICMgQWxsIHRlc3RzIHNob3VsZCBoYXZlIHJvdW5kcyBzZXQgdG8gdmFsdWVzIHNvIHRoYXQgYSBydW4oKQpAQCAtODUsNyArODUsNyBAQAogICAgICMgZm9yIGNvbXBhcmlzb25zIG9mIGJlbmNobWFyayBydW5zIC0gdGVzdHMgd2l0aCB1bmVxdWFsIHZlcnNpb24KICAgICAjIG51bWJlciB3aWxsIG5vdCBnZXQgY29tcGFyZWQuCiAgICAgdmVyc2lvbiA9IDEuMAotICAgIAorCiAgICAgIyBUaGUgbnVtYmVyIG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgZG9uZSBpbiBlYWNoIHJvdW5kIG9mIHRoZQogICAgICMgdGVzdC4gQW4gb3BlcmF0aW9uIGlzIHRoZSBiYXNpYyB1bml0IG9mIHdoYXQgeW91IHdhbnQgdG8KICAgICAjIG1lYXN1cmUuIFRoZSBiZW5jaG1hcmsgd2lsbCBvdXRwdXQgdGhlIGFtb3VudCBvZiBydW4tdGltZSBwZXIKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAjIE51bWJlciBvZiByb3VuZHMgdG8gZXhlY3V0ZSBwZXIgdGVzdCBydW4uIFRoaXMgc2hvdWxkIGJlCiAgICAgIyBhZGp1c3RlZCB0byBhIGZpZ3VyZSB0aGF0IHJlc3VsdHMgaW4gYSB0ZXN0IHJ1bi10aW1lIG9mIGJldHdlZW4KICAgICAjIDIwLTUwIHNlY29uZHMuCi0gICAgcm91bmRzID0gMTAwMDAwCisgICAgcm91bmRzID0gMTAwMDAKIAogICAgICMjIyBJbnRlcm5hbCB2YXJpYWJsZXMKIApAQCAtMTE1LDYgKzExNSw4IEBACiAKICAgICAgICAgaWYgd2FycCA+IDE6CiAgICAgICAgICAgICBzZWxmLnJvdW5kcyA9IHNlbGYucm91bmRzIC8gd2FycAorICAgICAgICAgICAgaWYgc2VsZi5yb3VuZHMgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnJvdW5kcyA9IDEKICAgICAgICAgICAgIHNlbGYud2FycCA9IHdhcnAKICAgICAgICAgc2VsZi50aW1lcyA9IFtdCiAgICAgICAgIHNlbGYub3ZlcmhlYWQgPSBbXQpAQCAtMTI0LDY0ICsxMjYsNzMgQEAKICAgICAgICAgc2VsZi5vcGVyYXRpb25zID0gc2VsZi5vcGVyYXRpb25zCiAgICAgICAgIHNlbGYucm91bmRzID0gc2VsZi5yb3VuZHMKIAotICAgIGRlZiBydW4oc2VsZik6CisgICAgZGVmIHJ1bihzZWxmLCBjcnVucyk6CiAKICAgICAgICAgIiIiIFJ1biB0aGUgdGVzdCBpbiB0d28gcGhhc2VzOiBmaXJzdCBjYWxpYnJhdGUsIHRoZW4KICAgICAgICAgICAgIGRvIHRoZSBhY3R1YWwgdGVzdC4gQmUgY2FyZWZ1bCB0byBrZWVwIHRoZSBjYWxpYnJhdGlvbgogICAgICAgICAgICAgdGltaW5nIGxvdyB3L3IgdG8gdGhlIHRlc3QgdGltaW5nLgotICAgICAgICAgICAgCisKICAgICAgICAgIiIiCiAgICAgICAgIHRlc3QgPSBzZWxmLnRlc3QKICAgICAgICAgY2FsaWJyYXRlID0gc2VsZi5jYWxpYnJhdGUKICAgICAgICAgY2xvY2sgPSB0aW1lLmNsb2NrCi0gICAgICAgIGNydW5zID0gc2VsZi5jcnVucwogICAgICAgICAjIGZpcnN0IGNhbGlicmF0ZQotICAgICAgICBvZmZzZXQgPSAwLjAKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY3J1bnMpOgotICAgICAgICAgICAgdCA9IGNsb2NrKCkKLSAgICAgICAgICAgIGNhbGlicmF0ZSgpCi0gICAgICAgICAgICB0ID0gY2xvY2soKSAtIHQKLSAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIHQKLSAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC8gY3J1bnMKKyAgICAgICAgdCA9IGNsb2NrKCkKKyAgICAgICAgY2FsaWJyYXRlKCkKKyAgICAgICAgb2Zmc2V0ID0gY2xvY2soKSAtIHQKKyAgICAgICAgaWYgY3J1bnM6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShjcnVucy0xKToKKyAgICAgICAgICAgICAgICB0ID0gY2xvY2soKQorICAgICAgICAgICAgICAgIGNhbGlicmF0ZSgpCisgICAgICAgICAgICAgICAgdCA9IGNsb2NrKCkgLSB0CisgICAgICAgICAgICAgICAgaWYgdCA8IG9mZnNldDoKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdAogICAgICAgICAjIG5vdyB0aGUgcmVhbCB0aGluZwotICAgICAgICB0ID0gY2xvY2soKSAKKyAgICAgICAgdCA9IGNsb2NrKCkKICAgICAgICAgdGVzdCgpCiAgICAgICAgIHQgPSBjbG9jaygpIC0gdAorICAgICAgICBpZiB0IDwgMC4wMToKKyAgICAgICAgICAgIHN5cy5leGl0KCJMb3dlciB3YXJwIHJlcXVpcmVkOiB0ZXN0IHRpbWVzIDwgMTAgbXMgYXJlIHVucmVsaWFibGUiKQogICAgICAgICBzZWxmLmxhc3RfdGltaW5nID0gKHQtb2Zmc2V0LHQsb2Zmc2V0KQogICAgICAgICBzZWxmLnRpbWVzLmFwcGVuZCh0LW9mZnNldCkKIAogICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CiAKLQkiIiIgQ2FsaWJyYXRlIHRoZSB0ZXN0LgorICAgICAgICAiIiIgQ2FsaWJyYXRlIHRoZSB0ZXN0LgogCi0JICAgIFRoaXMgbWV0aG9kIHNob3VsZCBleGVjdXRlIGV2ZXJ5dGhpbmcgdGhhdCBpcyBuZWVkZWQgdG8KLQkgICAgc2V0dXAgYW5kIHJ1biB0aGUgdGVzdCAtIGV4Y2VwdCBmb3IgdGhlIGFjdHVhbCBvcGVyYXRpb25zCi0JICAgIHRoYXQgeW91IGludGVuZCB0byBtZWFzdXJlLiBweWJlbmNoIHVzZXMgdGhpcyBtZXRob2QgdG8KLQkgICAgbWVhc3VyZSB0aGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvdmVyaGVhZC4KKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBleGVjdXRlIGV2ZXJ5dGhpbmcgdGhhdCBpcyBuZWVkZWQgdG8KKyAgICAgICAgICAgIHNldHVwIGFuZCBydW4gdGhlIHRlc3QgLSBleGNlcHQgZm9yIHRoZSBhY3R1YWwgb3BlcmF0aW9ucworICAgICAgICAgICAgdGhhdCB5b3UgaW50ZW5kIHRvIG1lYXN1cmUuIHB5YmVuY2ggdXNlcyB0aGlzIG1ldGhvZCB0bworICAgICAgICAgICAgbWVhc3VyZSB0aGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvdmVyaGVhZC4KIAogICAgICAgICAiIiIKICAgICAgICAgcmV0dXJuCiAKICAgICBkZWYgdGVzdChzZWxmKToKIAotCSIiIiBSdW4gdGhlIHRlc3QuCisgICAgICAgICIiIiBSdW4gdGhlIHRlc3QuCiAKLQkgICAgVGhlIHRlc3QgbmVlZHMgdG8gcnVuIHNlbGYucm91bmRzIGV4ZWN1dGluZwotCSAgICBzZWxmLm9wZXJhdGlvbnMgbnVtYmVyIG9mIG9wZXJhdGlvbnMgZWFjaC4KKyAgICAgICAgICAgIFRoZSB0ZXN0IG5lZWRzIHRvIHJ1biBzZWxmLnJvdW5kcyBleGVjdXRpbmcKKyAgICAgICAgICAgIHNlbGYub3BlcmF0aW9ucyBudW1iZXIgb2Ygb3BlcmF0aW9ucyBlYWNoLgogCiAgICAgICAgICIiIgogICAgICAgICAjIGRvIHNvbWUgdGVzdHMKICAgICAgICAgcmV0dXJuCi0gICAgCisKICAgICBkZWYgc3RhdChzZWxmKToKIAotICAgICAgICAiIiIgUmV0dXJucyB0d28gdmFsdWU6IGF2ZXJhZ2UgdGltZSBwZXIgcnVuIGFuZCBhdmVyYWdlIHBlcgotICAgICAgICAgICAgb3BlcmF0aW9uLgotICAgICAgICAgICAgCisgICAgICAgICIiIiBSZXR1cm5zIGZvdXIgdmFsdWVzOgorICAgICAgICBtaW5pbXVtIHJvdW5kIHRpbWUKKyAgICAgICAgYXZlcmFnZSB0aW1lIHBlciByb3VuZAorICAgICAgICBhdmVyYWdlIHRpbWUgcGVyIG9wZXJhdGlvbgorICAgICAgICBhdmVyYWdlIG92ZXJoZWFkIHRpbWUKKworICAgICAgICBYWFggU2hvdWxkIHRoaXMgdGFrZSB3YXJwIGZhY3RvcnMgaW50byBhY2NvdW50PwogICAgICAgICAiIiIKICAgICAgICAgcnVucyA9IGxlbihzZWxmLnRpbWVzKQogICAgICAgICBpZiBydW5zID09IDA6CiAgICAgICAgICAgICByZXR1cm4gMCwwCisgICAgICAgIG1pbnRpbWUgPSBtaW4oc2VsZi50aW1lcykKICAgICAgICAgdG90YWx0aW1lID0gcmVkdWNlKG9wZXJhdG9yLmFkZCxzZWxmLnRpbWVzLDAuMCkKICAgICAgICAgYXZnID0gdG90YWx0aW1lIC8gZmxvYXQocnVucykKICAgICAgICAgb3BfYXZnID0gdG90YWx0aW1lIC8gZmxvYXQocnVucyAqIHNlbGYucm91bmRzICogc2VsZi5vcGVyYXRpb25zKQpAQCAtMTkxLDcgKzIwMiw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIHVzZSBzZWxmLmxhc3RfdGltaW5nIC0gbm90IHRvbyBhY2N1cmF0ZQogICAgICAgICAgICAgb3ZfYXZnID0gc2VsZi5sYXN0X3RpbWluZ1syXQotICAgICAgICByZXR1cm4gYXZnLG9wX2F2Zyxvdl9hdmcKKyAgICAgICAgcmV0dXJuIG1pbnRpbWUsIGF2Zywgb3BfYXZnLCBvdl9hdmcKIAogIyMjIExvYWQgU2V0dXAKIApAQCAtMjEwLDEwNSArMjIxLDEzMiBAQAogICAgIHJvdW5kdGltZSA9IDAgICAgICAgICAgICAgICAjIEF2ZXJhZ2Ugcm91bmQgdGltZQogICAgIHZlcnNpb24gPSBOb25lICAgICAgICAgICAgICAjIEJlbmNobWFyayB2ZXJzaW9uIG51bWJlciAoc2VlIF9faW5pdF9fKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzIGZsb2F0IHgueXkKLSAgICBzdGFydHRpbWUgPSBOb25lCQkjIEJlbmNobWFyayBzdGFydCB0aW1lCiAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAKICAgICAgICAgc2VsZi50ZXN0cyA9IHt9CiAgICAgICAgIHNlbGYudmVyc2lvbiA9IDAuMzEKIAotICAgIGRlZiBsb2FkX3Rlc3RzKHNlbGYsc2V0dXBtb2Qsd2FycD0xKToKKyAgICBkZWYgbG9hZF90ZXN0cyhzZWxmLCBzZXR1cG1vZCwgd2FycD0xLCBsaW1pdG5hbWVzPSIiLCB2ZXJib3NlPTApOgogCiAgICAgICAgIHNlbGYud2FycCA9IHdhcnAKKyAgICAgICAgaWYgbGltaXRuYW1lczoKKyAgICAgICAgICAgIGxpbWl0bmFtZXMgPSByZS5jb21waWxlKGxpbWl0bmFtZXMsIHJlLkkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaW1pdG5hbWVzID0gTm9uZQogICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMKLSAgICAgICAgcHJpbnQgJ1NlYXJjaGluZyBmb3IgdGVzdHMuLi4nCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnU2VhcmNoaW5nIGZvciB0ZXN0cyAuLi4nLAogICAgICAgICBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKQogICAgICAgICBmb3IgYyBpbiBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKToKLSAgICAgICAgICAgIGlmIGhhc2F0dHIoYywnaXNfYV90ZXN0JykgYW5kIGMuX19uYW1lX18gIT0gJ1Rlc3QnOgotICAgICAgICAgICAgICAgIHRlc3RzW2MuX19uYW1lX19dID0gYyh3YXJwKQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoYywnaXNfYV90ZXN0Jyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG5hbWUgPSBjLl9fbmFtZV9fCisgICAgICAgICAgICBpZiAgbmFtZSA9PSAnVGVzdCc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGxpbWl0bmFtZXMgaXMgbm90IE5vbmUgYW5kIGxpbWl0bmFtZXMuc2VhcmNoKG5hbWUpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRlc3RzW25hbWVdID0gYyh3YXJwKQogICAgICAgICBsID0gdGVzdHMua2V5cygpCiAgICAgICAgIGwuc29ydCgpCi0gICAgICAgIGZvciB0IGluIGw6Ci0gICAgICAgICAgICBwcmludCAnICAnLHQKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBmb3IgdCBpbiBsOgorICAgICAgICAgICAgICAgIHByaW50ICcgICcsIHQKKyAgICAgICAgICAgIHByaW50IGxlbihsKSwgInRlc3RzIGZvdW5kIgogICAgICAgICBwcmludAogCi0gICAgZGVmIHJ1bihzZWxmKToKKyAgICBkZWYgcnVuKHNlbGYsIHZlcmJvc2UsIGNydW5zKToKIAogICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQogICAgICAgICB0ZXN0cy5zb3J0KCkKICAgICAgICAgY2xvY2sgPSB0aW1lLmNsb2NrCi0gICAgICAgIHByaW50ICdSdW5uaW5nICVpIHJvdW5kKHMpIG9mIHRoZSBzdWl0ZTogJyAlIHNlbGYucm91bmRzCisgICAgICAgIHByaW50ICdSdW5uaW5nICVpIHJvdW5kKHMpIG9mIHRoZSBzdWl0ZSBhdCB3YXJwIGZhY3RvciAlaTonICUgKHNlbGYucm91bmRzLCBzZWxmLndhcnApCiAgICAgICAgIHByaW50Ci0gICAgICAgIHNlbGYuc3RhcnR0aW1lID0gdGltZS50aW1lKCkKICAgICAgICAgcm91bmR0aW1lID0gY2xvY2soKQogICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnJvdW5kcyk6Ci0gICAgICAgICAgICBwcmludCAnIFJvdW5kICUtMjVpICByZWFsICAgYWJzICAgIG92ZXJoZWFkJyAlIChpKzEpCisgICAgICAgICAgICByb3VuZHN0YXJ0dGltZSA9IGNsb2NrKCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyBSb3VuZCAlLTI1aSAgcmVhbCAgIGFicyAgICBvdmVyaGVhZCcgJSAoaSsxKQogICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHRlc3RzKSk6Ci0gICAgICAgICAgICAgICAgbmFtZSx0ID0gdGVzdHNbal0KLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczonICUgbmFtZSwKLSAgICAgICAgICAgICAgICB0LnJ1bigpCi0gICAgICAgICAgICAgICAgcHJpbnQgJyAgJS4zZnIgJS4zZmEgJS4zZm8nICUgdC5sYXN0X3RpbWluZwotICAgICAgICAgICAgcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi0gICAgICAgICAgICBwcmludCAnICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAgICUuM2Ygc2Vjb25kcycgJSBcCi0gICAgICAgICAgICAgICAgICAoKGNsb2NrKCkgLSByb3VuZHRpbWUpLyhpKzEpKQotICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICBuYW1lLCB0ID0gdGVzdHNbal0KKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnJTMwczonICUgbmFtZSwKKyAgICAgICAgICAgICAgICB0LnJ1bihjcnVucykKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnICAlLjNmciAlLjNmYSAlLjNmbycgJSB0Lmxhc3RfdGltaW5nCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICAgICAgICAgICAgICAgIHByaW50ICcgICAgICAgICAgICBBdmVyYWdlIHJvdW5kIHRpbWU6ICAgICAgJS4zZiBzZWNvbmRzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgKChjbG9jaygpIC0gcm91bmR0aW1lKS8oaSsxKSkKKyAgICAgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnJWQgZG9uZSBpbiAlLjNmIHNlY29uZHMnICUgKGkrMSwgKGNsb2NrKCkgLSByb3VuZHN0YXJ0dGltZSkpCiAgICAgICAgIHNlbGYucm91bmR0aW1lID0gKGNsb2NrKCkgLSByb3VuZHRpbWUpIC8gc2VsZi5yb3VuZHMKICAgICAgICAgcHJpbnQKLSAgICAKKwogICAgIGRlZiBwcmludF9zdGF0KHNlbGYsIGNvbXBhcmVfdG89Tm9uZSwgaGlkZW5vaXNlPTApOgogCiAgICAgICAgIGlmIG5vdCBjb21wYXJlX3RvOgotICAgICAgICAgICAgcHJpbnQgJyUtMzBzICAgICAgcGVyIHJ1biAgICBwZXIgb3Blci4gICBvdmVyaGVhZCcgJSAnVGVzdHM6JwotICAgICAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgICAgICBwcmludCAnJS0zMHMgICAgICAgbWluIHJ1biAgICBhdmcgcnVuICAgIHBlciBvcHJuICBvdmVyaGVhZCcgJSAnVGVzdHM6JworICAgICAgICAgICAgcHJpbnQgJy0nKjc3CiAgICAgICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQogICAgICAgICAgICAgdGVzdHMuc29ydCgpCisgICAgICAgICAgICB0b3RhbG1pbnRpbWUgPSAwCiAgICAgICAgICAgICBmb3IgbmFtZSx0IGluIHRlc3RzOgotICAgICAgICAgICAgICAgIGF2ZyxvcF9hdmcsb3ZfYXZnID0gdC5zdGF0KCkKLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTEwLjJmIG1zICU3LjJmIHVzICU3LjJmIG1zJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAobmFtZSxhdmcqMTAwMC4wLG9wX2F2ZyoxMDAwMDAwLjAsb3ZfYXZnKjEwMDAuMCkKLSAgICAgICAgICAgIHByaW50ICctJyo3MgotICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICUxMC4yZiBtcycgJSBcCi0gICAgICAgICAgICAgICAgICAoJ0F2ZXJhZ2Ugcm91bmQgdGltZScsc2VsZi5yb3VuZHRpbWUgKiAxMDAwLjApCisgICAgICAgICAgICAgICAgbWludGltZSxhdmcsb3BfYXZnLG92X2F2ZyA9IHQuc3RhdCgpCisgICAgICAgICAgICAgICAgdG90YWxtaW50aW1lICs9IG1pbnRpbWUKKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTkuMmYgbXMgJTkuMmYgbXMgJTYuMmYgdXMgICU2LjJmJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAobmFtZSxtaW50aW1lKjEwMDAuMCxhdmcqMTAwMC4wLG9wX2F2ZyoxMDAwMDAwLjAsb3ZfYXZnKjEwMDAuMCkKKyAgICAgICAgICAgIHByaW50ICctJyo3NworICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICU5LjJmIG1zJyAlIFwKKyAgICAgICAgICAgICAgICAgICgnTm90aW9uYWwgbWluaW11bSByb3VuZCB0aW1lJywgdG90YWxtaW50aW1lICogMTAwMC4wKQogCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAnJS0zMHMgICAgICBwZXIgcnVuICAgIHBlciBvcGVyLiAgICBkaWZmICopJyAlIFwKKyAgICAgICAgICAgIHByaW50ICdDb21wYXJpbmcgd2l0aDogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAorICAgICAgICAgICAgICAgICAgKGNvbXBhcmVfdG8ubmFtZSxjb21wYXJlX3RvLnJvdW5kcyxjb21wYXJlX3RvLndhcnApCisgICAgICAgICAgICBwcmludCAnJS0zMHMgICAgICBtaW4gcnVuICAgICBjbXAgcnVuICAgICBhdmcgcnVuICAgICAgZGlmZicgJSBcCiAgICAgICAgICAgICAgICAgICAnVGVzdHM6JwotICAgICAgICAgICAgcHJpbnQgJy0nKjcyCisgICAgICAgICAgICBwcmludCAnLScqNzcKICAgICAgICAgICAgIHRlc3RzID0gc2VsZi50ZXN0cy5pdGVtcygpCiAgICAgICAgICAgICB0ZXN0cy5zb3J0KCkKICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAxCi0gICAgICAgICAgICBmb3IgbmFtZSx0IGluIHRlc3RzOgotICAgICAgICAgICAgICAgIGF2ZyxvcF9hdmcsb3ZfYXZnID0gdC5zdGF0KCkKKyAgICAgICAgICAgIHRvdGFsbWludGltZSA9IG90aGVyX3RvdGFsbWludGltZSA9IDAKKyAgICAgICAgICAgIGZvciBuYW1lLCB0IGluIHRlc3RzOgorICAgICAgICAgICAgICAgIG1pbnRpbWUsIGF2Zywgb3BfYXZnLCBvdl9hdmcgPSB0LnN0YXQoKQorICAgICAgICAgICAgICAgIHRvdGFsbWludGltZSArPSBtaW50aW1lCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBvdGhlciA9IGNvbXBhcmVfdG8udGVzdHNbbmFtZV0KICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIG90aGVyID0gTm9uZQogICAgICAgICAgICAgICAgIGlmIG90aGVyIGFuZCBvdGhlci52ZXJzaW9uID09IHQudmVyc2lvbiBhbmQgXAogICAgICAgICAgICAgICAgICAgIG90aGVyLm9wZXJhdGlvbnMgPT0gdC5vcGVyYXRpb25zOgotICAgICAgICAgICAgICAgICAgICBhdmcxLG9wX2F2ZzEsb3ZfYXZnMSA9IG90aGVyLnN0YXQoKQotICAgICAgICAgICAgICAgICAgICBxb3BfYXZnID0gKG9wX2F2Zy9vcF9hdmcxLTEuMCkqMTAwLjAKKyAgICAgICAgICAgICAgICAgICAgbWludGltZTEsIGF2ZzEsIG9wX2F2ZzEsIG92X2F2ZzEgPSBvdGhlci5zdGF0KCkKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfdG90YWxtaW50aW1lICs9IG1pbnRpbWUxCisgICAgICAgICAgICAgICAgICAgIGRpZmYgPSAoKG1pbnRpbWUqc2VsZi53YXJwKS8obWludGltZTEqb3RoZXIud2FycCkgLSAxLjApKjEwMC4wCiAgICAgICAgICAgICAgICAgICAgIGlmIGhpZGVub2lzZSBhbmQgYWJzKHFvcF9hdmcpIDwgMTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBxb3BfYXZnID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSAnJwogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgcW9wX2F2ZyA9ICclKzcuMmYlJScgJSBxb3BfYXZnCisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gJyUrNy4yZiUlJyAlIGRpZmYKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBxYXZnLHFvcF9hdmcgPSAnbi9hJywgJ24vYScKKyAgICAgICAgICAgICAgICAgICAgcWF2ZywgZGlmZiA9ICduL2EnLCAnbi9hJwogICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gMAotICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAlMTAuMmYgbXMgJTcuMmYgdXMgICU4cycgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgKG5hbWUsYXZnKjEwMDAuMCxvcF9hdmcqMTAwMDAwMC4wLHFvcF9hdmcpCi0gICAgICAgICAgICBwcmludCAnLScqNzIKKyAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTguMmYgbXMgJTguMmYgbXMgJTguMmYgbXMgICU4cycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsbWludGltZSoxMDAwLjAsbWludGltZTEqMTAwMC4wICogY29tcGFyZV90by53YXJwL3NlbGYud2FycCwgYXZnKjEwMDAuMCxkaWZmKQorICAgICAgICAgICAgcHJpbnQgJy0nKjc3CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFN1bW1hcmlzZSB0ZXN0IHJlc3VsdHMKKyAgICAgICAgICAgICMKICAgICAgICAgICAgIGlmIGNvbXBhdGlibGUgYW5kIGNvbXBhcmVfdG8ucm91bmR0aW1lID4gMCBhbmQgXAogICAgICAgICAgICAgICAgY29tcGFyZV90by52ZXJzaW9uID09IHNlbGYudmVyc2lvbjoKLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTEwLjJmIG1zICAgICAgICAgICAgICUrNy4yZiUlJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAoJ0F2ZXJhZ2Ugcm91bmQgdGltZScsc2VsZi5yb3VuZHRpbWUgKiAxMDAwLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICgoc2VsZi5yb3VuZHRpbWUqc2VsZi53YXJwKS8KLSAgICAgICAgICAgICAgICAgICAgICAgIChjb21wYXJlX3RvLnJvdW5kdGltZSpjb21wYXJlX3RvLndhcnApLTEuMCkqMTAwLjApCisgICAgICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICU4LjJmIG1zICU4LjJmIG1zICAgICAgICAgICAgICAlKzcuMmYlJScgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKCdOb3Rpb25hbCBtaW5pbXVtIHJvdW5kIHRpbWUnLCB0b3RhbG1pbnRpbWUgKiAxMDAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdG90YWxtaW50aW1lICogMTAwMC4wICogY29tcGFyZV90by53YXJwL3NlbGYud2FycCwKKyAgICAgICAgICAgICAgICAgICAgICAgKCh0b3RhbG1pbnRpbWUqc2VsZi53YXJwKS8KKyAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcl90b3RhbG1pbnRpbWUqY29tcGFyZV90by53YXJwKS0xLjApKjEwMC4wKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTEwLjJmIG1zICAgICAgICAgICAgICAgICAgbi9hJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAoJ0F2ZXJhZ2Ugcm91bmQgdGltZScsc2VsZi5yb3VuZHRpbWUgKiAxMDAwLjApCi0gICAgICAgICAgICBwcmludAotICAgICAgICAgICAgcHJpbnQgJyopIG1lYXN1cmVkIGFnYWluc3Q6ICVzIChyb3VuZHM9JWksIHdhcnA9JWkpJyAlIFwKLSAgICAgICAgICAgICAgICAgIChjb21wYXJlX3RvLm5hbWUsY29tcGFyZV90by5yb3VuZHMsY29tcGFyZV90by53YXJwKQorICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAlOS4yZiBtcyAgICAgICAgICAgICAgICAgICAgbi9hJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoJ05vdGlvbmFsIG1pbmltdW0gcm91bmQgdGltZScsIHRvdGFsbWludGltZSAqIDEwMDAuMCkKICAgICAgICAgcHJpbnQKIAogZGVmIHByaW50X21hY2hpbmUoKToKQEAgLTMzOSw3ICszNzcsMTIgQEAKICAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLVMnLCdzaG93IHN0YXRpc3RpY3Mgb2YgYmVuY2htYXJrcycsMCksCiAgICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLXcnLCdzZXQgd2FycCBmYWN0b3IgdG8gYXJnJyxTZXR1cC5XYXJwX2ZhY3RvciksCiAgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy1kJywnaGlkZSBub2lzZSBpbiBjb21wYXJlcycsIDApLAorICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctdicsJ3ZlcmJvc2Ugb3V0cHV0IChub3QgcmVjb21tZW5kZWQpJywgMCksCiAgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy0tbm8tZ2MnLCdkaXNhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbicsIDApLAorICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctLW5vLXN5c2NoZWNrJywKKyAgICAgICAgICAgICAgICAgICAgJyJkaXNhYmxlIiBzeXMgY2hlY2sgaW50ZXJ2YWwgKHNldCB0byBzeXMubWF4aW50KScsIDApLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy10JywgJ3Rlc3RzIGNvbnRhaW5pbmcgc3Vic3RyaW5nJywgJycpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1DJywgJ251bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zJywgMjApCiAgICAgICAgICAgICAgICBdCiAKICAgICBhYm91dCA9ICIiIlwKQEAgLTM4MCw3ICs0MjMsMTQgQEAKICAgICAgICAgaGlkZW5vaXNlID0gc2VsZi52YWx1ZXNbJy1kJ10KICAgICAgICAgd2FycCA9IHNlbGYudmFsdWVzWyctdyddCiAgICAgICAgIG5vZ2MgPSBzZWxmLnZhbHVlc1snLS1uby1nYyddCi0gICAgICAgIAorICAgICAgICBsaW1pdG5hbWVzID0gc2VsZi52YWx1ZXNbJy10J10KKyAgICAgICAgdmVyYm9zZSA9IHNlbGYudmVyYm9zZQorICAgICAgICBub3N5c2NoZWNrID0gc2VsZi52YWx1ZXNbJy0tbm8tc3lzY2hlY2snXQorICAgICAgICBjcnVucyA9IHNlbGYudmFsdWVzWyctQyddCisgICAgICAgIHByaW50ICJDUlVOUzoiLCBjcnVucworCisgICAgICAgIHByaW50ICdQWUJFTkNIJyxfX3ZlcnNpb25fXworCiAgICAgICAgICMgU3dpdGNoIG9mZiBHQwogICAgICAgICBpZiBub2djOgogICAgICAgICAgICAgdHJ5OgpAQCAtMzkwLDggKzQ0MCwxMyBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBpZiBzZWxmLnZhbHVlc1snLS1uby1nYyddOgogICAgICAgICAgICAgICAgICAgICBnYy5kaXNhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ05PIEdDJwogCi0gICAgICAgIHByaW50ICdQWUJFTkNIJyxfX3ZlcnNpb25fXworICAgICAgICAjIG1heGltaXNlIHN5cyBjaGVjayBpbnRlcnZhbAorICAgICAgICBpZiBub3N5c2NoZWNrOgorICAgICAgICAgICAgc3lzLnNldGNoZWNraW50ZXJ2YWwoc3lzLm1heGludCkKKyAgICAgICAgICAgIHByaW50ICdDSEVDS0lOVEVSVkFMID0nLCBzeXMubWF4aW50CisKICAgICAgICAgcHJpbnQKIAogICAgICAgICBpZiBub3QgY29tcGFyZV90bzoKQEAgLTQwNyw3ICs0NjIsNyBAQAogICAgICAgICAgICAgICAgIGNvbXBhcmVfdG8gPSBiZW5jaAogICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICAgICAgcHJpbnQgJyogRXJyb3Igb3BlbmluZy9yZWFkaW5nIGZpbGUnLGNvbXBhcmVfdG8KLSAgICAgICAgICAgICAgICBjb21wYXJlX3RvID0gTm9uZSAgICAKKyAgICAgICAgICAgICAgICBjb21wYXJlX3RvID0gTm9uZQogCiAgICAgICAgIGlmIHNob3dfYmVuY2g6CiAgICAgICAgICAgICB0cnk6CkBAIC00MzYsOSArNDkxLDkgQEAKICAgICAgICAgIyBDcmVhdGUgYmVuY2htYXJrIG9iamVjdAogICAgICAgICBiZW5jaCA9IEJlbmNobWFyaygpCiAgICAgICAgIGJlbmNoLnJvdW5kcyA9IHJvdW5kcwotICAgICAgICBiZW5jaC5sb2FkX3Rlc3RzKFNldHVwLHdhcnApCisgICAgICAgIGJlbmNoLmxvYWRfdGVzdHMoU2V0dXAsIHdhcnAsIGxpbWl0bmFtZXMsIHZlcmJvc2UpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGJlbmNoLnJ1bigpCisgICAgICAgICAgICBiZW5jaC5ydW4odmVyYm9zZSwgY3J1bnMpCiAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgICAgIHByaW50CiAgICAgICAgICAgICBwcmludCAnKioqIEtleWJvYXJkSW50ZXJydXB0IC0tIEFib3J0aW5nJwpkaWZmIC0tZ2l0IGEvVG9vbHMvdW5pY29kZS9nZW5jb2RlYy5weSBiL1Rvb2xzL3VuaWNvZGUvZ2VuY29kZWMucHkKaW5kZXggM2NmZWYyMC4uMGFlZjIwNyAxMDA2NDQKLS0tIGEvVG9vbHMvdW5pY29kZS9nZW5jb2RlYy5weQorKysgYi9Ub29scy91bmljb2RlL2dlbmNvZGVjLnB5CkBAIC0zMTgsMTUgKzMxOCwxNSBAQAogIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKCgKLSAgICAgICAgbmFtZT0lciwKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKICAgICAgICAgQ29kZWMoKS5lbmNvZGUsCiAgICAgICAgIENvZGVjKCkuZGVjb2RlLAorICAgICAgICBuYW1lPSVyLAogICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAogICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAogICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAogICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAotICAgICkpCisgICAgKQogJycnICUgZW5jb2RpbmduYW1lLnJlcGxhY2UoJ18nLCAnLScpKQogCiAgICAgIyBBZGQgZGVjb2RpbmcgdGFibGUgb3IgbWFwICh3aXRoIHByZWZlcmVuY2UgdG8gdGhlIHRhYmxlKQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDAyNTBkOWUuLjA3YmU2MjUgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTEsMTEgKzEsMTIgQEAKICMhIC9iaW4vc2gKLSMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQzNDU5IC4KKyMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQ1NTk3IC4KICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5IGZvciBweXRob24gMy4wLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTlkIGZvciBweXRob24gMy4wLgogIwogIyBSZXBvcnQgYnVncyB0byA8aHR0cDovL3d3dy5weXRob24ub3JnL3B5dGhvbi1idWdzPi4KICMKLSMgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisjIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwpAQCAtMTksNjYgKzIwLDE1IEBACiAgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKICAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KICAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi1lbGlmIHRlc3QgLW4gIiR7QkFTSF9WRVJTSU9OK3NldH0iICYmIChzZXQgLW8gcG9zaXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBzZXQgLW8gcG9zaXgKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKIGZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAogRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAogCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQotZmkKIAotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLSRhc191bnNldCBFTlYgTUFJTCBNQUlMUEFUSAotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1mb3IgYXNfdmFyIGluIFwKLSAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKLSAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKLSAgTENfVEVMRVBIT05FIExDX1RJTUUKLWRvCi0gIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCi0gICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gIGVsc2UKLSAgICAkYXNfdW5zZXQgJGFzX3ZhcgotICBmaQotZG9uZQotCi0jIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJCcgXHwgXAotCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKLWVjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwvXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwvXChcL1wpLioveyBzLy9cMS87IHE7IH0KLSAgCSAgcy8uKi8uLzsgcSdgCi0KLQotIyBQQVRIIG5lZWRzIENSLCBhbmQgTElORU5PIG5lZWRzIENSIGFuZCBQQVRILgorIyBQQVRIIG5lZWRzIENSCiAjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCiBhc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKIGFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwpAQCAtOTksMTI0ICs0OSw0NjQgQEAKICAgcm0gLWYgY29uZiQkLnNoCiBmaQogCisjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc191bnNldD11bnNldAorZWxzZQorICBhc191bnNldD1mYWxzZQorZmkKIAotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICB8fCB7Ci0gICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIHBhdGggYXQgYWxsCi0gICMgcmVsYXRpdmUgb3Igbm90LgotICBjYXNlICQwIGluCi0gICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorYXNfbmw9JworJworSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorY2FzZSAkMCBpbgorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAotICAgICAgIDs7Ci0gIGVzYWMKLSAgIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJwotICAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLSAgaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICAgIGFzX215c2VsZj0kMAorICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgZWNobyAiJGFzX215c2VsZjogZXJyb3I6IGNhbm5vdCBmaW5kIG15c2VsZjsgcmVydW4gd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUiID4mMgorICB7IChleGl0IDEpOyBleGl0IDE7IH0KK2ZpCisKKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorZm9yIGFzX3ZhciBpbiBFTlYgTUFJTCBNQUlMUEFUSAorZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKK2RvbmUKK1BTMT0nJCAnCitQUzI9Jz4gJworUFM0PScrICcKKworIyBOTFMgbnVpc2FuY2VzLgorZm9yIGFzX3ZhciBpbiBcCisgIExBTkcgTEFOR1VBR0UgTENfQUREUkVTUyBMQ19BTEwgTENfQ09MTEFURSBMQ19DVFlQRSBMQ19JREVOVElGSUNBVElPTiBcCisgIExDX01FQVNVUkVNRU5UIExDX01FU1NBR0VTIExDX01PTkVUQVJZIExDX05BTUUgTENfTlVNRVJJQyBMQ19QQVBFUiBcCisgIExDX1RFTEVQSE9ORSBMQ19USU1FCitkbworICBpZiAoc2V0ICt4OyB0ZXN0IC16ICJgKGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcikgMj4mMWAiKTsgdGhlbgorICAgIGV2YWwgJGFzX3Zhcj1DOyBleHBvcnQgJGFzX3ZhcgorICBlbHNlCisgICAgKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKICAgZmkKLSAgaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gIGZpCi0gIGNhc2UgJENPTkZJR19TSEVMTCBpbgotICAnJykKK2RvbmUKKworIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKKworIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKK2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQ0RQQVRILgorJGFzX3Vuc2V0IENEUEFUSAorCisKK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgaWYgKGV2YWwgIjoiKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19oYXZlX3JlcXVpcmVkPXllcworZWxzZQorICBhc19oYXZlX3JlcXVpcmVkPW5vCitmaQorCisgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSB5ZXMgJiYgCSAoZXZhbCAiOgorKGFzX2Z1bmNfcmV0dXJuICgpIHsKKyAgKGV4aXQgXCQxKQorfQorYXNfZnVuY19zdWNjZXNzICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMAorfQorYXNfZnVuY19mYWlsdXJlICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMQorfQorYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisgIHJldHVybiAwCit9Cithc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKyAgcmV0dXJuIDEKK30KKworZXhpdGNvZGU9MAoraWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCitmaQorCitpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorICBleGl0Y29kZT0xCisgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCisKK3Rlc3QgXCRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorCisoCisgIGFzX2xpbmVub18xPVwkTElORU5PCisgIGFzX2xpbmVub18yPVwkTElORU5PCisgIHRlc3QgXCJ4XCRhc19saW5lbm9fMVwiICE9IFwieFwkYXNfbGluZW5vXzJcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yXCIpIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorIikgMj4gL2Rldi9udWxsOyB0aGVuCisgIDoKK2Vsc2UKKyAgYXNfY2FuZGlkYXRlX3NoZWxscz0KICAgICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitmb3IgYXNfZGlyIGluIC91c3IvYmluL3Bvc2l4JFBBVEhfU0VQQVJBVE9SL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotCSBjYXNlICRhc19kaXIgaW4KKyAgY2FzZSAkYXNfZGlyIGluCiAJIC8qKQotCSAgIGlmICgiJGFzX2Rpci8kYXNfYmFzZSIgLWMgJworCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9IiRhc19jYW5kaWRhdGVfc2hlbGxzICRhc19kaXIvJGFzX2Jhc2UiCisJICAgZG9uZTs7CisgICAgICAgZXNhYworZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisKKyAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCisJICMgVHJ5IG9ubHkgc2hlbGxzIHdoaWNoIGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCisJIGlmIHRlc3QgLWYgJGFzX3NoZWxsICYmCisJCXsgKCRhc19zaGVsbCkgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgorIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCitmaQorQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworOgorX0FTRU9GCit9OyB0aGVuCisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKKwkgICAgICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkgICAgICAgaWYgeyAkYXNfc2hlbGwgMj4gL2Rldi9udWxsIDw8XF9BU0VPRgorIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisgIHNldG9wdCBOT19HTE9CX1NVQlNUCitlbHNlCisgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbiAqcG9zaXgqKSBzZXQgLW8gcG9zaXg7OyBlc2FjCitmaQorQklOX1NIPXhwZzQ7IGV4cG9ydCBCSU5fU0ggIyBmb3IgVHJ1NjQKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKworOgorKGFzX2Z1bmNfcmV0dXJuICgpIHsKKyAgKGV4aXQgJDEpCit9Cithc19mdW5jX3N1Y2Nlc3MgKCkgeworICBhc19mdW5jX3JldHVybiAwCit9Cithc19mdW5jX2ZhaWx1cmUgKCkgeworICBhc19mdW5jX3JldHVybiAxCit9Cithc19mdW5jX3JldF9zdWNjZXNzICgpIHsKKyAgcmV0dXJuIDAKK30KK2FzX2Z1bmNfcmV0X2ZhaWx1cmUgKCkgeworICByZXR1cm4gMQorfQorCitleGl0Y29kZT0wCitpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKyAgOgorZWxzZQorICBleGl0Y29kZT0xCisgIGVjaG8gYXNfZnVuY19zdWNjZXNzIGZhaWxlZC4KK2ZpCisKK2lmIGFzX2Z1bmNfZmFpbHVyZTsgdGhlbgorICBleGl0Y29kZT0xCisgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KK2ZpCisKK2lmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKyAgOgorZWxzZQorICBleGl0Y29kZT0xCisgIGVjaG8gYXNfZnVuY19yZXRfc3VjY2VzcyBmYWlsZWQuCitmaQorCitpZiBhc19mdW5jX3JldF9mYWlsdXJlOyB0aGVuCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KK2ZpCisKK2lmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSAiJDEiICk7IHRoZW4KKyAgOgorZWxzZQorICBleGl0Y29kZT0xCisgIGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLgorZmkKKwordGVzdCAkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKworKAogICBhc19saW5lbm9fMT0kTElORU5PCiAgIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAogICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICcpIDI+L2Rldi9udWxsOyB0aGVuCi0JICAgICAkYXNfdW5zZXQgQkFTSF9FTlYgfHwgdGVzdCAiJHtCQVNIX0VOVitzZXR9IiAhPSBzZXQgfHwgeyBCQVNIX0VOVj07IGV4cG9ydCBCQVNIX0VOVjsgfQotCSAgICAgJGFzX3Vuc2V0IEVOViB8fCB0ZXN0ICIke0VOVitzZXR9IiAhPSBzZXQgfHwgeyBFTlY9OyBleHBvcnQgRU5WOyB9Ci0JICAgICBDT05GSUdfU0hFTEw9JGFzX2Rpci8kYXNfYmFzZQotCSAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotCSAgICAgZXhlYyAiJENPTkZJR19TSEVMTCIgIiQwIiAkezErIiRAIn0KLQkgICBmaTs7Ci0JIGVzYWMKLSAgICAgICBkb25lCi1kb25lCi07OwotICBlc2FjCisgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIpIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorCitfQVNFT0YKK307IHRoZW4KKyAgYnJlYWsKK2ZpCisKK2ZpCisKKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHg7IHRoZW4KKyAgZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYKKyAgICAgICAgZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKKyAgICAgICAgZG9uZQorICAgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkYXNfbXlzZWxmIiAkezErIiRAIn0KK2ZpCisKKworICAgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSBubzsgdGhlbgorICBlY2hvIFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwgdGhlCisgICAgICBlY2hvIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uICBQbGVhc2UgaW5zdGFsbCBhCisgICAgICBlY2hvIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuIHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhCisgICAgICBlY2hvIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4KKyAgICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorZmkKKworCitmaQorCitmaQorCisKKworKGV2YWwgImFzX2Z1bmNfcmV0dXJuICgpIHsKKyAgKGV4aXQgXCQxKQorfQorYXNfZnVuY19zdWNjZXNzICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMAorfQorYXNfZnVuY19mYWlsdXJlICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMQorfQorYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisgIHJldHVybiAwCit9Cithc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKyAgcmV0dXJuIDEKK30KKworZXhpdGNvZGU9MAoraWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCitmaQorCitpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorICBleGl0Y29kZT0xCisgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gXCJcJDFcIiApOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCisKK3Rlc3QgXCRleGl0Y29kZSA9IDAiKSB8fCB7CisgIGVjaG8gTm8gc2hlbGwgZm91bmQgdGhhdCBzdXBwb3J0cyBzaGVsbCBmdW5jdGlvbnMuCisgIGVjaG8gUGxlYXNlIHRlbGwgYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKKyAgZWNobyBpbmNsdWRpbmcgYW55IGVycm9yIHBvc3NpYmx5IG91dHB1dCBiZWZvcmUgdGhpcworICBlY2hvIG1lc3NhZ2UKK30KKworCisKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKIAogICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCiAgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGJlZm9yZSBlYWNoIGxpbmU7IHRoZSBzZWNvbmQgJ3NlZCcgZG9lcyB0aGUgcmVhbAotICAjIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2ggbGluZS1udW1iZXIgbGluZQotICAjIHdpdGggdGhlIG51bWJlcmVkIGxpbmUsIGFuZCBhcHBlbmRzIHRyYWlsaW5nICctJyBkdXJpbmcKLSAgIyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwgY2FzZSBhdCBsaW5lIGVuZC4KKyAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCisgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCisgICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKKyAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAorICAjIGNhc2UgYXQgbGluZSBlbmQuCiAgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKKyAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAogICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KICAgICAgIE4KLSAgICAgIHMsJCwtLAotICAgICAgOiBsb29wCi0gICAgICBzLF5cKFsnJGFzX2NyX2RpZ2l0cyddKlwpXCguKlwpWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX11cKSxcMVwyXDFcMywKKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KICAgICAgIHQgbG9vcAotICAgICAgcywtJCwsCi0gICAgICBzLF5bJyRhc19jcl9kaWdpdHMnXSpcbiwsCisgICAgICBzLy1cbi4qLy8KICAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICRhc19tZS5saW5lbm8gfHwKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CiAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIAogICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwogICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpYmxlIHRvIHRoaXMpLgotICAuIC4vJGFzX21lLmxpbmVubworICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgorICAuICIuLyRhc19tZS5saW5lbm8iCiAgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgogICBleGl0CiB9CiAKIAotY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KLSAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JwotJyBFQ0hPX1Q9JwknIDs7Ci0gICpjKiwqICApIEVDSE9fTj0tbiBFQ0hPX0M9IEVDSE9fVD0gOzsKLSAgKikgICAgICAgRUNIT19OPSBFQ0hPX0M9J1xjJyBFQ0hPX1Q9IDs7CitpZiAoZGlybmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluCistbiopCisgIGNhc2UgYGVjaG8gJ3hcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICAqKSAgIEVDSE9fQz0nXGMnOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7CiBlc2FjCiAKLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KICAgYXNfZXhwcj1leHByCiBlbHNlCiAgIGFzX2V4cHI9ZmFsc2UKIGZpCiAKIHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIKK2ZpCiBlY2hvID5jb25mJCQuZmlsZQogaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCi0gICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgotICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KLSAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgIGFzX2xuX3M9J2xuIC1zJworICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKyAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAogICAgIGFzX2xuX3M9J2NwIC1wJwotICBlbHNlCi0gICAgYXNfbG5fcz0nbG4gLXMnCi0gIGZpCiBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgogICBhc19sbl9zPWxuCiBlbHNlCiAgIGFzX2xuX3M9J2NwIC1wJwogZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCiAKIGlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KICAgYXNfbWtkaXJfcD06CkBAIC0yMjUsNyArNTE1LDE5IEBACiAgIGFzX21rZGlyX3A9ZmFsc2UKIGZpCiAKLWFzX2V4ZWN1dGFibGVfcD0idGVzdCAtZiIKKyMgRmluZCBvdXQgd2hldGhlciBgYHRlc3QgLXgnJyB3b3Jrcy4gIERvbid0IHVzZSBhIHplcm8tYnl0ZSBmaWxlLCBhcworIyBzeXN0ZW1zIG1heSB1c2UgbWV0aG9kcyBvdGhlciB0aGFuIG1vZGUgYml0cyB0byBkZXRlcm1pbmUgZXhlY3V0YWJpbGl0eS4KK2NhdCA+Y29uZiQkLmZpbGUgPDxfQVNFT0YKKyMhIC9iaW4vc2gKK2V4aXQgMAorX0FTRU9GCitjaG1vZCAreCBjb25mJCQuZmlsZQoraWYgdGVzdCAteCBjb25mJCQuZmlsZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZXhlY3V0YWJsZV9wPSJ0ZXN0IC14IgorZWxzZQorICBhc19leGVjdXRhYmxlX3A9OgorZmkKK3JtIC1mIGNvbmYkJC5maWxlCiAKICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KIGFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCkBAIC0yMzQsMzkgKzUzNiwyNyBAQAogYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKIAogCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4KLWFzX25sPScKLScKLUlGUz0iIAkkYXNfbmwiCiAKLSMgQ0RQQVRILgotJGFzX3Vuc2V0IENEUEFUSAotCitleGVjIDc8JjAgPC9kZXYvbnVsbCA2PiYxCiAKICMgTmFtZSBvZiB0aGUgaG9zdC4KICMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCiAjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KIGFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAogCi1leGVjIDY+JjEKLQogIwogIyBJbml0aWFsaXphdGlvbnMuCiAjCiBhY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCithY19jbGVhbl9maWxlcz0KIGFjX2NvbmZpZ19saWJvYmpfZGlyPS4KK0xJQk9CSlM9CiBjcm9zc19jb21waWxpbmc9bm8KIHN1YmRpcnM9CiBNRkxBR1M9CiBNQUtFRkxBR1M9CiBTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQogCi0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi0jIFRoaXMgdmFyaWFibGUgc2VlbXMgb2Jzb2xldGUuICBJdCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCwgYW5kCi0jIG9ubHkgYWNfbWF4X3NlZF9saW5lcyBzaG91bGQgYmUgdXNlZC4KLTogJHthY19tYXhfaGVyZV9saW5lcz0zOH0KLQogIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCiBQQUNLQUdFX05BTUU9J3B5dGhvbicKIFBBQ0tBR0VfVEFSTkFNRT0ncHl0aG9uJwpAQCAtMzAzLDE3ICs1OTMsMTM3IEBACiAjZW5kaWYKICNpZiBIQVZFX0lOVFRZUEVTX0gKICMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbHNlCi0jIGlmIEhBVkVfU1RESU5UX0gKLSMgIGluY2x1ZGUgPHN0ZGludC5oPgotIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KICNlbmRpZgogI2lmIEhBVkVfVU5JU1REX0gKICMgaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYiCiAKLWFjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgVkVSU0lPTiBTT1ZFUlNJT04gQ09ORklHX0FSR1MgUFlUSE9ORlJBTUVXT1JLIFBZVEhPTkZSQU1FV09SS0RJUiBQWVRIT05GUkFNRVdPUktQUkVGSVggUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUiBNQUNIREVQIFNHSV9BQkkgRVhUUkFQTEFURElSIEVYVFJBTUFDSERFUFBBVEggQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBDQyBDRkxBR1MgTERGTEFHUyBDUFBGTEFHUyBhY19jdF9DQyBFWEVFWFQgT0JKRVhUIENYWCBNQUlOQ0MgQ1BQIEVHUkVQIEJVSUxERVhFRVhUIExJQlJBUlkgTERMSUJSQVJZIERMTExJQlJBUlkgQkxETElCUkFSWSBMRExJQlJBUllESVIgSU5TVFNPTkFNRSBSVU5TSEFSRUQgTElOS0NDIFJBTkxJQiBhY19jdF9SQU5MSUIgQVIgU1ZOVkVSU0lPTiBJTlNUQUxMX1BST0dSQU0gSU5TVEFMTF9TQ1JJUFQgSU5TVEFMTF9EQVRBIExOIE9QVCBCQVNFQ0ZMQUdTIE9USEVSX0xJQlRPT0xfT1BUIExJQlRPT0xfQ1JVRlQgU08gTERTSEFSRUQgQkxEU0hBUkVEIENDU0hBUkVEIExJTktGT1JTSEFSRUQgQ0ZMQUdTRk9SU0hBUkVEIFNITElCUyBVU0VfU0lHTkFMX01PRFVMRSBTSUdOQUxfT0JKUyBVU0VfVEhSRUFEX01PRFVMRSBMRExBU1QgVEhSRUFET0JKIERMSU5DTERJUiBEWU5MT0FERklMRSBNQUNIREVQX09CSlMgVFJVRSBMSUJPQkpTIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHIEhBVkVfR0VUSE9TVEJZTkFNRV9SIEhBVkVfR0VUSE9TVEJZTkFNRSBMSUJNIExJQkMgVU5JQ09ERV9PQkpTIFRIUkVBREhFQURFUlMgU1JDRElSUyBMVExJQk9CSlMnCithY19zdWJzdF92YXJzPSdTSEVMTAorUEFUSF9TRVBBUkFUT1IKK1BBQ0tBR0VfTkFNRQorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX1ZFUlNJT04KK1BBQ0tBR0VfU1RSSU5HCitQQUNLQUdFX0JVR1JFUE9SVAorZXhlY19wcmVmaXgKK3ByZWZpeAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorYmluZGlyCitzYmluZGlyCitsaWJleGVjZGlyCitkYXRhcm9vdGRpcgorZGF0YWRpcgorc3lzY29uZmRpcgorc2hhcmVkc3RhdGVkaXIKK2xvY2Fsc3RhdGVkaXIKK2luY2x1ZGVkaXIKK29sZGluY2x1ZGVkaXIKK2RvY2RpcgoraW5mb2RpcgoraHRtbGRpcgorZHZpZGlyCitwZGZkaXIKK3BzZGlyCitsaWJkaXIKK2xvY2FsZWRpcgorbWFuZGlyCitERUZTCitFQ0hPX0MKK0VDSE9fTgorRUNIT19UCitMSUJTCitidWlsZF9hbGlhcworaG9zdF9hbGlhcwordGFyZ2V0X2FsaWFzCitWRVJTSU9OCitTT1ZFUlNJT04KK0NPTkZJR19BUkdTCitVTklWRVJTQUxTREsKK1BZVEhPTkZSQU1FV09SSworUFlUSE9ORlJBTUVXT1JLRElSCitQWVRIT05GUkFNRVdPUktQUkVGSVgKK1BZVEhPTkZSQU1FV09SS0lOU1RBTExESVIKK0ZSQU1FV09SS0lOU1RBTExGSVJTVAorRlJBTUVXT1JLSU5TVEFMTExBU1QKK01BQ0hERVAKK1NHSV9BQkkKK0VYVFJBUExBVERJUgorRVhUUkFNQUNIREVQUEFUSAorQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAorRVhQT1JUX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAorQ0MKK0NGTEFHUworTERGTEFHUworQ1BQRkxBR1MKK2FjX2N0X0NDCitFWEVFWFQKK09CSkVYVAorQ1hYCitNQUlOQ0MKK0NQUAorR1JFUAorRUdSRVAKK0JVSUxERVhFRVhUCitMSUJSQVJZCitMRExJQlJBUlkKK0RMTExJQlJBUlkKK0JMRExJQlJBUlkKK0xETElCUkFSWURJUgorSU5TVFNPTkFNRQorUlVOU0hBUkVECitMSU5LQ0MKK1JBTkxJQgorQVIKK1NWTlZFUlNJT04KK0lOU1RBTExfUFJPR1JBTQorSU5TVEFMTF9TQ1JJUFQKK0lOU1RBTExfREFUQQorTE4KK09QVAorQkFTRUNGTEFHUworT1RIRVJfTElCVE9PTF9PUFQKK0xJQlRPT0xfQ1JVRlQKK1NPCitMRFNIQVJFRAorQkxEU0hBUkVECitDQ1NIQVJFRAorTElOS0ZPUlNIQVJFRAorQ0ZMQUdTRk9SU0hBUkVECitTSExJQlMKK1VTRV9TSUdOQUxfTU9EVUxFCitTSUdOQUxfT0JKUworVVNFX1RIUkVBRF9NT0RVTEUKK0xETEFTVAorVEhSRUFET0JKCitETElOQ0xESVIKK0RZTkxPQURGSUxFCitNQUNIREVQX09CSlMKK1RSVUUKK0xJQk9CSlMKK0hBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHCitIQVZFX0dFVEhPU1RCWU5BTUVfUl81X0FSRworSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcKK0hBVkVfR0VUSE9TVEJZTkFNRV9SCitIQVZFX0dFVEhPU1RCWU5BTUUKK0xJQk0KK0xJQkMKK1VOSUNPREVfT0JKUworVEhSRUFESEVBREVSUworU1JDRElSUworTFRMSUJPQkpTJwogYWNfc3Vic3RfZmlsZXM9JycKKyAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCitob3N0X2FsaWFzCit0YXJnZXRfYWxpYXMKK0NDCitDRkxBR1MKK0xERkxBR1MKK0NQUEZMQUdTCitDUFAnCisKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgogYWNfaW5pdF9oZWxwPQpAQCAtMzQwLDM0ICs3NTAsNDggQEAKICMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CiAjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCiAjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQogYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCiBzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwogbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKIHN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCiBzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKIGxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKIGluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwogb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCitkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCitpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworaHRtbGRpcj0nJHtkb2NkaXJ9JworZHZpZGlyPScke2RvY2Rpcn0nCitwZGZkaXI9JyR7ZG9jZGlyfScKK3BzZGlyPScke2RvY2Rpcn0nCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2xvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCiAKIGFjX3ByZXY9CithY19kYXNoZGFzaD0KIGZvciBhY19vcHRpb24KIGRvCiAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgogICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCiAgICAgYWNfcHJldj0KICAgICBjb250aW51ZQogICBmaQogCi0gIGFjX29wdGFyZz1gZXhwciAieCRhY19vcHRpb24iIDogJ3hbXj1dKj1cKC4qXCknYAorICBjYXNlICRhY19vcHRpb24gaW4KKyAgKj0qKQlhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqKQlhY19vcHRhcmc9eWVzIDs7CisgIGVzYWMKIAogICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgogCi0gIGNhc2UgJGFjX29wdGlvbiBpbgorICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CiAKICAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKICAgICBhY19wcmV2PWJpbmRpciA7OwpAQCAtMzg5LDEyICs4MTMsMTggQEAKICAgLS1jb25maWctY2FjaGUgfCAtQykKICAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OwogCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQorICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKICAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQorICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQogICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OwogCisgIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAorICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKyAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CisgIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisgICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OworCiAgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKICAgICBhY19mZWF0dXJlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAogICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KQEAgLTQwMiw3ICs4MzIsMTcgQEAKICAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8kYWNfZmVhdHVyZT1ubyIgOzsKKyAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1ubyA7OworCisgIC1kb2NkaXIgfCAtLWRvY2RpciB8IC0tZG9jZGkgfCAtLWRvYyB8IC0tZG8pCisgICAgYWNfcHJldj1kb2NkaXIgOzsKKyAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCisgICAgZG9jZGlyPSRhY19vcHRhcmcgOzsKKworICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQorICAgIGFjX3ByZXY9ZHZpZGlyIDs7CisgIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCisgICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKIAogICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQogICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKQEAgLTQxMSwxMSArODUxLDcgQEAKICAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgJGFjX29wdGlvbiBpbgotICAgICAgKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyRhY19mZWF0dXJlPSckYWNfb3B0YXJnJyIgOzsKKyAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1cJGFjX29wdGFyZyA7OwogCiAgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKICAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXApAQCAtNDQyLDYgKzg3OCwxMiBAQAogICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQogICAgIGhvc3RfYWxpYXM9JGFjX29wdGFyZyA7OwogCisgIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQorICAgIGFjX3ByZXY9aHRtbGRpciA7OworICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKKyAgfCAtLWh0PSopCisgICAgaHRtbGRpcj0kYWNfb3B0YXJnIDs7CisKICAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAogICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQogICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwpAQCAtNDY2LDEzICs5MDgsMTYgQEAKICAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCiAgICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CiAKKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CisgIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCisgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKwogICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCiAgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CiAgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKICAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKIAogICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQpAQCAtNTM3LDYgKzk4MiwxNiBAQAogICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCiAgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CiAKKyAgLXBkZmRpciB8IC0tcGRmZGlyIHwgLS1wZGZkaSB8IC0tcGRmZCB8IC0tcGRmIHwgLS1wZCkKKyAgICBhY19wcmV2PXBkZmRpciA7OworICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQorICAgIHBkZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKKyAgICBhY19wcmV2PXBzZGlyIDs7CisgIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQorICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKKwogICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAogICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKICAgICBzaWxlbnQ9eWVzIDs7CkBAIC01OTMsMTEgKzEwNDgsNyBAQAogICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICRhY19vcHRpb24gaW4KLSAgICAgICo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0YXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJGFjX3BhY2thZ2U9JyRhY19vcHRhcmcnIiA7OworICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1cJGFjX29wdGFyZyA7OwogCiAgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKICAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYApAQCAtNjA2LDcgKzEwNTcsNyBAQAogICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3BhY2thZ2UiID4mMgogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZSB8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8kYWNfcGFja2FnZT1ubyIgOzsKKyAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9bm8gOzsKIAogICAtLXgpCiAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgpAQCAtNjM3LDggKzEwODgsNyBAQAogICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKICAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YXJpYWJsZSBuYW1lOiAkYWNfZW52dmFyIiA+JjIKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAKLSAgICBldmFsICIkYWNfZW52dmFyPSckYWNfb3B0YXJnJyIKKyAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKICAgICBleHBvcnQgJGFjX2VudnZhciA7OwogCiAgICopCkBAIC02NTgsMjcgKzExMDgsMTkgQEAKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZmkKIAotIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgcGF0aHMuCi1mb3IgYWNfdmFyIGluIGV4ZWNfcHJlZml4IHByZWZpeAorIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgorZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisJCWRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGluY2x1ZGVkaXIgXAorCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCisJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCiBkbwotICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKKyAgZXZhbCBhY192YWw9XCQkYWNfdmFyCiAgIGNhc2UgJGFjX3ZhbCBpbgotICAgIFtcXC8kXSogfCA/OltcXC9dKiB8IE5PTkUgfCAnJyApIDs7Ci0gICAgKikgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7CisgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OwogICBlc2FjCi1kb25lCi0KLSMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIHBhdGhzLgotZm9yIGFjX3ZhciBpbiBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBcCi0JICAgICAgbG9jYWxzdGF0ZWRpciBsaWJkaXIgaW5jbHVkZWRpciBvbGRpbmNsdWRlZGlyIGluZm9kaXIgbWFuZGlyCi1kbwotICBldmFsIGFjX3ZhbD0kYGVjaG8gJGFjX3ZhcmAKLSAgY2FzZSAkYWNfdmFsIGluCi0gICAgW1xcLyRdKiB8ID86W1xcL10qICkgOzsKLSAgICAqKSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIGVzYWMKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZG9uZQogCiAjIFRoZXJlIG1pZ2h0IGJlIHBlb3BsZSB3aG8gZGVwZW5kIG9uIHRoZSBvbGQgYnJva2VuIGJlaGF2aW9yOiBgJGhvc3QnCkBAIC03MDUsNzQgKzExNDcsNzYgQEAKIHRlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgNj4vZGV2L251bGwKIAogCithY19wd2Q9YHB3ZGAgJiYgdGVzdCAtbiAiJGFjX3B3ZCIgJiYKK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKK2FjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IFdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQordGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8CisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogcHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5IiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisKICMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KIGlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCiAgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19jb25mZGlyPWAoZGlybmFtZSAiJDAiKSAyPi9kZXYvbnVsbCB8fAorICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkMCIgfHwKICRhc19leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCiAJIFgiJDAiIDogJ1hcKC8vXClbXi9dJyBcfCBcCiAJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgXAotCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiBlY2hvIFgiJDAiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KLSAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KLSAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIHMvLiovLi87IHEnYAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCiAgIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KICAgICBzcmNkaXI9Li4KICAgZmkKIGVsc2UKICAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwogZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHNvdXJjZXMgKCRhY191bmlxdWVfZmlsZSkgaW4gJGFjX2NvbmZkaXIgb3IgLi4iID4mMgoraWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICBlbHNlCi0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gIGZpCiBmaQotKGNkICRzcmNkaXIgJiYgdGVzdCAtciAuLyRhY191bmlxdWVfZmlsZSkgMj4vZGV2L251bGwgfHwKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIiA+JjIKK2FjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKK2FjX2Fic19jb25mZGlyPWAoCisJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCB7IGVjaG8gIiRhc19tZTogZXJyb3I6ICRhY19tc2ciID4mMgogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1zcmNkaXI9YGVjaG8gIiRzcmNkaXIiIHwgc2VkICdzJVwoW15cXC9dXClbXFwvXSokJVwxJSdgCi1hY19lbnZfYnVpbGRfYWxpYXNfc2V0PSR7YnVpbGRfYWxpYXMrc2V0fQotYWNfZW52X2J1aWxkX2FsaWFzX3ZhbHVlPSRidWlsZF9hbGlhcwotYWNfY3ZfZW52X2J1aWxkX2FsaWFzX3NldD0ke2J1aWxkX2FsaWFzK3NldH0KLWFjX2N2X2Vudl9idWlsZF9hbGlhc192YWx1ZT0kYnVpbGRfYWxpYXMKLWFjX2Vudl9ob3N0X2FsaWFzX3NldD0ke2hvc3RfYWxpYXMrc2V0fQotYWNfZW52X2hvc3RfYWxpYXNfdmFsdWU9JGhvc3RfYWxpYXMKLWFjX2N2X2Vudl9ob3N0X2FsaWFzX3NldD0ke2hvc3RfYWxpYXMrc2V0fQotYWNfY3ZfZW52X2hvc3RfYWxpYXNfdmFsdWU9JGhvc3RfYWxpYXMKLWFjX2Vudl90YXJnZXRfYWxpYXNfc2V0PSR7dGFyZ2V0X2FsaWFzK3NldH0KLWFjX2Vudl90YXJnZXRfYWxpYXNfdmFsdWU9JHRhcmdldF9hbGlhcwotYWNfY3ZfZW52X3RhcmdldF9hbGlhc19zZXQ9JHt0YXJnZXRfYWxpYXMrc2V0fQotYWNfY3ZfZW52X3RhcmdldF9hbGlhc192YWx1ZT0kdGFyZ2V0X2FsaWFzCi1hY19lbnZfQ0Nfc2V0PSR7Q0Mrc2V0fQotYWNfZW52X0NDX3ZhbHVlPSRDQwotYWNfY3ZfZW52X0NDX3NldD0ke0NDK3NldH0KLWFjX2N2X2Vudl9DQ192YWx1ZT0kQ0MKLWFjX2Vudl9DRkxBR1Nfc2V0PSR7Q0ZMQUdTK3NldH0KLWFjX2Vudl9DRkxBR1NfdmFsdWU9JENGTEFHUwotYWNfY3ZfZW52X0NGTEFHU19zZXQ9JHtDRkxBR1Mrc2V0fQotYWNfY3ZfZW52X0NGTEFHU192YWx1ZT0kQ0ZMQUdTCi1hY19lbnZfTERGTEFHU19zZXQ9JHtMREZMQUdTK3NldH0KLWFjX2Vudl9MREZMQUdTX3ZhbHVlPSRMREZMQUdTCi1hY19jdl9lbnZfTERGTEFHU19zZXQ9JHtMREZMQUdTK3NldH0KLWFjX2N2X2Vudl9MREZMQUdTX3ZhbHVlPSRMREZMQUdTCi1hY19lbnZfQ1BQRkxBR1Nfc2V0PSR7Q1BQRkxBR1Mrc2V0fQotYWNfZW52X0NQUEZMQUdTX3ZhbHVlPSRDUFBGTEFHUwotYWNfY3ZfZW52X0NQUEZMQUdTX3NldD0ke0NQUEZMQUdTK3NldH0KLWFjX2N2X2Vudl9DUFBGTEFHU192YWx1ZT0kQ1BQRkxBR1MKLWFjX2Vudl9DUFBfc2V0PSR7Q1BQK3NldH0KLWFjX2Vudl9DUFBfdmFsdWU9JENQUAotYWNfY3ZfZW52X0NQUF9zZXQ9JHtDUFArc2V0fQotYWNfY3ZfZW52X0NQUF92YWx1ZT0kQ1BQCisJcHdkKWAKKyMgV2hlbiBidWlsZGluZyBpbiBwbGFjZSwgc2V0IHNyY2Rpcj0uCitpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisgIHNyY2Rpcj0uCitmaQorIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKyMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworIyBtZXNzIHVwIE0teCBnZGIgaW4gRW1hY3MuCitjYXNlICRzcmNkaXIgaW4KKyovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworZXNhYworZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KK2RvbmUKIAogIwogIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgpAQCAtODAxLDkgKzEyNDUsNiBAQAogICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwogICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KIAotX0FDRU9GCi0KLSAgY2F0IDw8X0FDRU9GCiBJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CiAgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAogCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQpAQCAtODIxLDE1ICsxMjYyLDIyIEBACiAgIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCiAgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCiAgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL3NoYXJlXQogICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQogICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCiAgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQogICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCiAgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQogICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBbUFJFRklYL21hbl0KKyAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKyAgLS1pbmZvZGlyPURJUiAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCisgIC0tbG9jYWxlZGlyPURJUiAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKyAgLS1kb2NkaXI9RElSICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9weXRob25dCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgaHRtbCBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tZHZpZGlyPURJUiAgICAgICAgICAgZHZpIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1wZGZkaXI9RElSICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgIHBzIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KIF9BQ0VPRgogCiAgIGNhdCA8PFxfQUNFT0YKQEAgLTg0NSw2ICsxMjkzLDggQEAKIE9wdGlvbmFsIEZlYXR1cmVzOgogICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCiAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1lbmFibGUtdW5pdmVyc2Fsc2RrW1NES0RJUl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGQgYWdhaW5zIE1hYyBPUyBYIDEwLjR1IFNESyAocHBjL2kzODYpCiAgIC0tZW5hYmxlLWZyYW1ld29ya1s9SU5TVEFMTERJUl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGQgKE1hY09TWHxEYXJ3aW4pIGZyYW1ld29yawogICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICBkaXNhYmxlL2VuYWJsZSBidWlsZGluZyBzaGFyZWQgcHl0aG9uIGxpYnJhcnkKQEAgLTg4Niw4ICsxMzM2LDggQEAKICAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncwogICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKICAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgotICBDUFBGTEFHUyAgICBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmIHlvdSBoYXZlCi0gICAgICAgICAgICAgIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFBGTEFHUyAgICBDL0MrKy9PYmplY3RpdmUgQyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCisgICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgogICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgogCiBVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscApAQCAtODk1LDEyMCArMTM0NSw4NiBAQAogCiBSZXBvcnQgYnVncyB0byA8aHR0cDovL3d3dy5weXRob24ub3JnL3B5dGhvbi1idWdzPi4KIF9BQ0VPRgorYWNfc3RhdHVzPSQ/CiBmaQogCiBpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCiAgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCi0gIGFjX3BvcGRpcj1gcHdkYAogICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQogICAgIHRlc3QgLWQgJGFjX2RpciB8fCBjb250aW51ZQogICAgIGFjX2J1aWxkZGlyPS4KIAotaWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKICAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCi1lbHNlCi0gIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KLWZpCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKIAogY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgogICAgIGFjX3NyY2Rpcj0uCi0gICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KLSAgICAgICBhY190b3Bfc3JjZGlyPS4KLSAgICBlbHNlCi0gICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAotICAgIGZpIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCiAgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4Ci0gICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7CiBlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CiAKLSMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQotIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KLWNhc2UgYHB3ZGAgaW4KLS4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OwotKikKLSAgY2FzZSAiJGFjX2RpciIgaW4KLSAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKLSAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKLSAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7Ci0gIGVzYWM7OwotZXNhYwotY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCi0uKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OwotKikKLSAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCi0gIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKLSAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OwotICBlc2FjOzsKLWVzYWMKLWNhc2UgJGFjX2Fic19idWlsZGRpciBpbgotLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKLSopCi0gIGNhc2UgJGFjX3NyY2RpciBpbgotICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OwotICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7Ci0gICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKLSAgZXNhYzs7Ci1lc2FjCi1jYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KLS4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKLSopCi0gIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KLSAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OwotICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKLSAgZXNhYzs7Ci1lc2FjCi0KLSAgICBjZCAkYWNfZGlyCi0gICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KKyAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CisgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCiAgICAgaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnU7IHRoZW4KLSAgICAgIGVjaG8KKyAgICAgIGVjaG8gJiYKICAgICAgICRTSEVMTCAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUgIC0taGVscD1yZWN1cnNpdmUKICAgICBlbGlmIHRlc3QgLWYgJGFjX3NyY2Rpci9jb25maWd1cmU7IHRoZW4KLSAgICAgIGVjaG8KKyAgICAgIGVjaG8gJiYKICAgICAgICRTSEVMTCAkYWNfc3JjZGlyL2NvbmZpZ3VyZSAgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsaWYgdGVzdCAtZiAkYWNfc3JjZGlyL2NvbmZpZ3VyZS5hYyB8fAotCSAgIHRlc3QgLWYgJGFjX3NyY2Rpci9jb25maWd1cmUuaW47IHRoZW4KLSAgICAgIGVjaG8KLSAgICAgICRhY19jb25maWd1cmUgLS1oZWxwCiAgICAgZWxzZQogICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgotICAgIGZpCi0gICAgY2QgIiRhY19wb3BkaXIiCisgICAgZmkgfHwgYWNfc3RhdHVzPSQ/CisgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQogICBkb25lCiBmaQogCi10ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0IDAKK3Rlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCiBweXRob24gY29uZmlndXJlIDMuMAotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5CitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTlkCiAKLUNvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKzIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgogX0FDRU9GCi0gIGV4aXQgMAorICBleGl0CiBmaQotZXhlYyA1PmNvbmZpZy5sb2cKLWNhdCA+JjUgPDxfQUNFT0YKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgogVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKIHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCiAKIEl0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy4wLCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5ZC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKIAogX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKIHsKIGNhdCA8PF9BU1VOQU1FCiAjIyAtLS0tLS0tLS0gIyMKQEAgLTEwMjcsNyArMTQ0Myw3IEBACiAvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCiAvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCiAvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi1ob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGwgICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCiAvYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCiAvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCiAvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCkBAIC0xMDQxLDYgKzE0NTcsNyBAQAogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICBlY2hvICJQQVRIOiAkYXNfZGlyIgogZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCiB9ID4mNQogCkBAIC0xMDczLDcgKzE0OTAsNyBAQAogICAgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCiAgICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCiAgICAgICBjb250aW51ZSA7OwotICAgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XCJcJ10qKQorICAgICpcJyopCiAgICAgICBhY19hcmc9YGVjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CiAgICAgZXNhYwogICAgIGNhc2UgJGFjX3Bhc3MgaW4KQEAgLTExMDgsOCArMTUyNSw4IEBACiAjIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCiAjIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQogIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCi0jIFdBUk5JTkc6IEJlIHN1cmUgbm90IHRvIHVzZSBzaW5nbGUgcXVvdGVzIGluIHRoZXJlLCBhcyBzb21lIHNoZWxscywKLSMgc3VjaCBhcyBvdXIgRFUgNS4wIGZyaWVuZCwgd2lsbCB0aGVuIGBjbG9zZScgdGhlIHRyYXAuCisjIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KKyMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CiAgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgogICB7CkBAIC0xMTIyLDIwICsxNTM5LDM0IEBACiBfQVNCT1gKICAgICBlY2hvCiAgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLXsKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICAqKSAkYXNfdW5zZXQgJGFjX3ZhciA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQogICAoc2V0KSAyPiYxIHwKLSAgICBjYXNlIGAoYWNfc3BhY2U9JyInIicgJyInIic7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICAgKmFjX3NwYWNlPVwgKikKKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9J1wnJyAnXCcnOyBzZXQpIDI+JjFgIGluICMoCisgICAgKiR7YXNfbmx9YWNfc3BhY2U9XCAqKQogICAgICAgc2VkIC1uIFwKLQkicy8nIiciJy8nIiciJ1xcXFwnIiciJyciJyInL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSciJyInXFwyJyInIicvcCIKLSAgICAgIDs7CisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAogICAgICopCi0gICAgICBzZWQgLW4gXAotCSJzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPVxcMi9wIgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKICAgICAgIDs7Ci0gICAgZXNhYzsKLX0KKyAgICBlc2FjIHwKKyAgICBzb3J0CispCiAgICAgZWNobwogCiAgICAgY2F0IDw8XF9BU0JPWApAQCAtMTE0NiwyMiArMTU3NywyMiBAQAogICAgIGVjaG8KICAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCiAgICAgZG8KLSAgICAgIGV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAotICAgICAgZWNobyAiJGFjX3Zhcj0nIiciJyRhY192YWwnIiciJyIKKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCiAgICAgZG9uZSB8IHNvcnQKICAgICBlY2hvCiAKICAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCiAgICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tICMjCi0jIyBPdXRwdXQgZmlsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCiBfQVNCT1gKICAgICAgIGVjaG8KICAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCiAgICAgICBkbwotCWV2YWwgYWNfdmFsPSRgZWNobyAkYWNfdmFyYAotCWVjaG8gIiRhY192YXI9JyInIickYWNfdmFsJyInIiciCisJZXZhbCBhY192YWw9XCQkYWNfdmFyCisJZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCiAgICAgICBkb25lIHwgc29ydAogICAgICAgZWNobwogICAgIGZpCkBAIC0xMTczLDI2ICsxNjA0LDI0IEBACiAjIyAtLS0tLS0tLS0tLSAjIwogX0FTQk9YCiAgICAgICBlY2hvCi0gICAgICBzZWQgIi9eJC9kIiBjb25mZGVmcy5oIHwgc29ydAorICAgICAgY2F0IGNvbmZkZWZzLmgKICAgICAgIGVjaG8KICAgICBmaQogICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKICAgICAgIGVjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgogICAgIGVjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCiAgIH0gPiY1Ci0gIHJtIC1mIGNvcmUgKi5jb3JlICYmCi0gIHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKICAgICBleGl0ICRleGl0X3N0YXR1cwotICAgICAnIDAKKycgMAogZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCiAgIHRyYXAgJ2FjX3NpZ25hbD0nJGFjX3NpZ25hbCc7IHsgKGV4aXQgMSk7IGV4aXQgMTsgfScgJGFjX3NpZ25hbAogZG9uZQogYWNfc2lnbmFsPTAKIAogIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID5jb25mZGVmcy5oCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAogCiAjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KIApAQCAtMTIyMywxNCArMTY1MiwxNyBAQAogCiAjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KICMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBzZXQgeCAiJENPTkZJR19TSVRFIgorZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKK2Vsc2UKKyAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAorCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgogZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworc2hpZnQKK2ZvciBhY19zaXRlX2ZpbGUKK2RvCiAgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCiAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjUKIGVjaG8gIiRhc19tZTogbG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIiA+JjY7fQpAQCAtMTI1OSwxMiArMTY5MSwxMSBAQAogIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQogIyB2YWx1ZS4KIGFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQotZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8Ci0JICAgICAgIHNlZCAtbiAncy9eYWNfZW52X1woW2EtekEtWl8wLTldKlwpX3NldD0uKi9cMS9wJ2A7IGRvCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwogICBldmFsIGFjX29sZF9zZXQ9XCRhY19jdl9lbnZfJHthY192YXJ9X3NldAogICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAotICBldmFsIGFjX29sZF92YWw9IlwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZSIKLSAgZXZhbCBhY19uZXdfdmFsPSJcJGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWUiCisgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKyAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQogICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCiAgICAgc2V0LCkKICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CkBAIC0xMjg5LDggKzE3MjAsNyBAQAogICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCiAgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgogICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP1wiXCddKikKLSAgICAgIGFjX2FyZz0kYWNfdmFyPWBlY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CiAgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKICAgICBlc2FjCiAgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCkBAIC0xMzA3LDYgKzE3MzcsMzAgQEAKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZmkKIAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwogYWNfZXh0PWMKIGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCkBAIC0xMzE1LDMyICsxNzY5LDcgQEAKIAogCiAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotICAgICAgICAgIGFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgcHljb25maWcuaCIKK2FjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgcHljb25maWcuaCIKIAogCiAKQEAgLTE0MDAsMTAgKzE4MjksMzYgQEAKIAogQ09ORklHX0FSR1M9IiRhY19jb25maWd1cmVfYXJncyIKIAotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZyYW1ld29yayBvciAtLWRpc2FibGUtZnJhbWV3b3JrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2ZyYW1ld29yaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZnJhbWV3b3JrIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXVuaXZlcnNhbHNkayB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV91bml2ZXJzYWxzZGsrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZW5hYmxldmFsPSRlbmFibGVfdW5pdmVyc2Fsc2RrOworCWNhc2UgJGVuYWJsZXZhbCBpbgorCXllcykKKwkJZW5hYmxldmFsPS9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsKKwkJOzsKKwllc2FjCisJY2FzZSAkZW5hYmxldmFsIGluCisJbm8pCisJCVVOSVZFUlNBTFNESz0KKwkJZW5hYmxlX3VuaXZlcnNhbHNkaz0KKwkJOzsKKwkqKQorCQlVTklWRVJTQUxTREs9JGVuYWJsZXZhbAorCQk7OworCWVzYWMKIAorZWxzZQorCisgICAJVU5JVkVSU0FMU0RLPQorCWVuYWJsZV91bml2ZXJzYWxzZGs9CisKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZnJhbWV3b3JrIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2ZyYW1ld29yaytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9mcmFtZXdvcms7CiAJY2FzZSAkZW5hYmxldmFsIGluCiAJeWVzKQogCQllbmFibGV2YWw9L0xpYnJhcnkvRnJhbWV3b3JrcwpAQCAtMTQxNCw2ICsxODY5LDggQEAKIAkJUFlUSE9ORlJBTUVXT1JLRElSPW5vLWZyYW1ld29yawogCQlQWVRIT05GUkFNRVdPUktQUkVGSVg9CiAJCVBZVEhPTkZSQU1FV09SS0lOU1RBTExESVI9CisJCUZSQU1FV09SS0lOU1RBTExGSVJTVD0KKwkJRlJBTUVXT1JLSU5TVEFMTExBU1Q9CiAJCWVuYWJsZV9mcmFtZXdvcms9CiAJCTs7CiAJKikKQEAgLTE0MjEsNyArMTg3OCwxOCBAQAogCQlQWVRIT05GUkFNRVdPUktESVI9UHl0aG9uLmZyYW1ld29yawogCQlQWVRIT05GUkFNRVdPUktQUkVGSVg9JGVuYWJsZXZhbAogCQlQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSPSRQWVRIT05GUkFNRVdPUktQUkVGSVgvJFBZVEhPTkZSQU1FV09SS0RJUgorCQlGUkFNRVdPUktJTlNUQUxMRklSU1Q9ImZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmUiCisJCUZSQU1FV09SS0lOU1RBTExMQVNUPSJmcmFtZXdvcmtpbnN0YWxsbWFjbGliIGZyYW1ld29ya2luc3RhbGxhcHBzIGZyYW1ld29ya2luc3RhbGx1bml4dG9vbHMiCiAJCXByZWZpeD0kUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUi9WZXJzaW9ucy8kVkVSU0lPTgorCisJCSMgQWRkIG1ha2VmaWxlcyBmb3IgTWFjIHNwZWNpZmljIGNvZGUgdG8gdGhlIGxpc3Qgb2Ygb3V0cHV0CisJCSMgZmlsZXM6CisJCWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWMvT1NYL01ha2VmaWxlIgorCisJCWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWMvT1NYL1B5dGhvbkxhdW5jaGVyL01ha2VmaWxlIgorCisJCWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWMvT1NYL0lETEUvTWFrZWZpbGUiCisKIAllc2FjCiAKIGVsc2UKQEAgLTE0MzAsOSArMTg5OCwxNCBAQAogCVBZVEhPTkZSQU1FV09SS0RJUj1uby1mcmFtZXdvcmsKIAlQWVRIT05GUkFNRVdPUktQUkVGSVg9CiAJUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUj0KKwlGUkFNRVdPUktJTlNUQUxMRklSU1Q9CisJRlJBTUVXT1JLSU5TVEFMTExBU1Q9CiAJZW5hYmxlX2ZyYW1ld29yaz0KIAotZmk7CitmaQorCisKKwogCiAKIApAQCAtMTQ0NCw4ICsxOTE3LDggQEAKICMjCiAjIFNldCBuYW1lIGZvciBtYWNoaW5lLWRlcGVuZGVudCBsaWJyYXJ5IGZpbGVzCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBNQUNIREVQIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgTUFDSERFUC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIE1BQ0hERVAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBNQUNIREVQLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAteiAiJE1BQ0hERVAiCiB0aGVuCiAJYWNfc3lzX3N5c3RlbT1gdW5hbWUgLXNgCkBAIC0xNTg5LDE0ICsyMDYyLDE0IEBACiAgICAgICAgIExERkxBR1M9IiRTR0lfQUJJICRMREZMQUdTIgogICAgICAgICBNQUNIREVQPWBlY2hvICIke01BQ0hERVB9JHtTR0lfQUJJfSIgfCBzZWQgJ3MvICovL2cnYAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRNQUNIREVQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRNQUNIREVQIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJE1BQ0hERVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JE1BQ0hERVAiID4mNjsgfQogCiAjIEFuZCBhZGQgZXh0cmEgcGxhdC1tYWMgZm9yIGRhcndpbgogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBFWFRSQVBMQVRESVIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBFWFRSQVBMQVRESVIuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBFWFRSQVBMQVRESVIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBFWFRSQVBMQVRESVIuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0IC16ICIkRVhUUkFQTEFURElSIgogdGhlbgogCWNhc2UgJE1BQ0hERVAgaW4KQEAgLTE2MTAsMTQgKzIwODMsMTYgQEAKIAkJOzsKIAllc2FjCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEVYVFJBUExBVERJUiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kRVhUUkFQTEFURElSIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEVYVFJBUExBVERJUiIgPiY1CitlY2hvICIke0VDSE9fVH0kRVhUUkFQTEFURElSIiA+JjY7IH0KIAogIyBSZWNvcmQgdGhlIGNvbmZpZ3VyZS10aW1lIHZhbHVlIG9mIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCwKICMgaXQgbWF5IGluZmx1ZW5jZSB0aGUgd2F5IHdlIGNhbiBidWlsZCBleHRlbnNpb25zLCBzbyBkaXN0dXRpbHMKICMgbmVlZHMgdG8gY2hlY2sgaXQKIAorCiBDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPQorRVhQT1JUX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0nIycKIAogIyBjaGVja3MgZm9yIGFsdGVybmF0aXZlIHByb2dyYW1zCiAKQEAgLTE2MjksMTMgKzIxMDQsMTIgQEAKIAogIyBYWFggc2hvdWxkbid0IHNvbWUvbW9zdC9hbGwgb2YgdGhpcyBjb2RlIGJlIG1lcmdlZCB3aXRoIHRoZSBzdHVmZiBsYXRlcgogIyBvbiB0aGF0IGZpZGRsZXMgd2l0aCBPUFQgYW5kIEJBU0VDRkxBR1M/Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aG91dC1nY2MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRob3V0LWdjYy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGhvdXQtZ2NjIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aG91dC1nY2MuLi4gJEVDSE9fQyIgPiY2OyB9CiAKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ2NjIG9yIC0td2l0aG91dC1nY2Mgd2FzIGdpdmVuLgorIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nY2Mgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX2djYytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nY2MiCi0KKyAgd2l0aHZhbD0kd2l0aF9nY2M7CiAJY2FzZSAkd2l0aHZhbCBpbgogCW5vKQlDQz1jYwogCQl3aXRob3V0X2djYz15ZXM7OwpAQCAtMTY3Nyw5ICsyMTUxLDEwIEBACiAgICAgICAgIHdpdGhvdXRfZ2NjPTs7CiAJKikJd2l0aG91dF9nY2M9bm87OwogCWVzYWMKLWZpOwotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhvdXRfZ2NjIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR3aXRob3V0X2djYyIgPiY2CitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3aXRob3V0X2djYyIgPiY1CitlY2hvICIke0VDSE9fVH0kd2l0aG91dF9nY2MiID4mNjsgfQogCiAjIElmIHRoZSB1c2VyIHN3aXRjaGVzIGNvbXBpbGVycywgd2UgY2FuJ3QgYmVsaWV2ZSB0aGUgY2FjaGUKIGlmIHRlc3QgISAteiAiJGFjX2N2X3Byb2dfQ0MiIC1hICEgLXogIiRDQyIgLWEgIiRDQyIgIT0gIiRhY19jdl9wcm9nX0NDIgpAQCAtMTY5OSw4ICsyMTc0LDggQEAKIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE3MTMsMzIgKzIxODgsMzQgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgogICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Z2NjIgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogQ0M9JGFjX2N2X3Byb2dfQ0MKIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCisKIGZpCiBpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KICAgYWNfY3RfQ0M9JENDCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE3NTEsMzYgKzIyMjgsNTEgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQogZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKIGFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCiBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfQ0MiID4mNjsgfQogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIAotICBDQz0kYWNfY3RfQ0MKKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisgICAgQ0M9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQogZWxzZQogICBDQz0iJGFjX2N2X3Byb2dfQ0MiCiBmaQogCiBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNzkzLDc0ICsyMjg1LDM0IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KICAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWNjIgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogQ0M9JGFjX2N2X3Byb2dfQ0MKIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImNjIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCisKICAgZmkKLWRvbmUKLWRvbmUKLQotZmkKLWZpCi1hY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQwotaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjYKLWVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotZmkKLQotICBDQz0kYWNfY3RfQ0MKLWVsc2UKLSAgQ0M9IiRhY19jdl9wcm9nX0NDIgotZmkKLQogZmkKIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE4NzQsNyArMjMyNiw3IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KICAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwogICAgICAgIGNvbnRpbnVlCkBAIC0xODg1LDYgKzIzMzcsNyBAQAogICBmaQogZG9uZQogZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCiBpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCiAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KQEAgLTE5MDIsMjIgKzIzNTUsMjMgQEAKIGZpCiBDQz0kYWNfY3ZfcHJvZ19DQwogaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKKwogZmkKIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICBmb3IgYWNfcHJvZyBpbiBjbAorICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKICAgZG8KICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTkzMCwzNiArMjM4NCwzOCBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCiAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKIGRvbmUKIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAogZmkKIGZpCiBDQz0kYWNfY3ZfcHJvZ19DQwogaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKKwogICAgIHRlc3QgLW4gIiRDQyIgJiYgYnJlYWsKICAgZG9uZQogZmkKIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE5NzIsMjkgKzI0MjgsNDUgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgogICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9CiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCisKICAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawogZG9uZQogCi0gIENDPSRhY19jdF9DQworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCiBmaQogCiBmaQpAQCAtMjAwNywyNSArMjQ3OSwzOCBAQAogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiAKICMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KLWVjaG8gIiRhc19tZTokTElORU5POiIgXAotICAgICAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CiBhY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCi17IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtLXZlcnNpb24gPC9kZXYvbnVsbCA+JjVcIiIpID4mNQotICAoZXZhbCAkYWNfY29tcGlsZXIgLS12ZXJzaW9uIDwvZGV2L251bGwgPiY1KSAyPiY1Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLXsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1XCIiKSA+JjUKLSAgKGV2YWwgJGFjX2NvbXBpbGVyIC12IDwvZGV2L251bGwgPiY1KSAyPiY1Cit7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtdiA+JjVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZXIgLXYgPiY1KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNVwiIikgPiY1Ci0gIChldmFsICRhY19jb21waWxlciAtViA8L2Rldi9udWxsID4mNSkgMj4mNQoreyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZXIgLVYgPiY1XCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGVyIC1WID4mNSkgMj4mNQogICBhY19zdGF0dXM9JD8KICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfQogCisKKyMgTGlzdCBvZiBwb3NzaWJsZSBvdXRwdXQgZmlsZXMuICBXZSB3YW50IHRvIHN0YXJ0IGZyb20gdGhlIG1vc3QgbGlrZWx5LAorIyBidXQgd2UgaGF2ZSB0byBjaGVjayBmb28uZXhlIGJlZm9yZSBmb28sIGJlY2F1c2UgQ3lnd2luIGB0ZXN0IC1mJyBsb29rcworIyBhbHNvIGZvciBmb28uZXhlLiAgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KKyMgQXMgYSBsYXN0IHJlc29ydCwgd2UgYWxzbyB0cnkgd2lsZGNhcmRzOiBgY29uZnRlc3QuKicgYW5kIGBhLionLgorIyBCdXQgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHJtIGEuKiwgYW5kIHdlIGRvIG5vdCB3YW50IGFsd2F5cyByZW1vdmUKKyMgY29uZnRlc3QuKiwgc28gd2Ugd2lsbCBsaXN0IHRoZW0gbGl0ZXJhbGx5LCB3aGVuIGFwcHJvcHJpYXRlLgorYWNfb3V0ZmlsZXM9ImFfb3V0LmV4ZSBhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYi5vdXQiCisKKyMgVGhlIElSSVggNiBsaW5rZXIgd3JpdGVzIGludG8gZXhpc3RpbmcgZmlsZXMgd2hpY2ggbWF5IG5vdCBiZQorIyBleGVjdXRhYmxlLCByZXRhaW5pbmcgdGhlaXIgcGVybWlzc2lvbnMuICBSZW1vdmUgdGhlbSBmaXJzdCBzbyBhCisjIHN1YnNlcXVlbnQgZXhlY3V0aW9uIHRlc3Qgd29ya3MuCitybSAtZiAkYWNfb3V0ZmlsZXMgY29uZnRlc3QuKgorCiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0yMDQxLDUxICsyNTI2LDQwIEBACiAgIHJldHVybiAwOwogfQogX0FDRU9GCisKIGFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIGIub3V0IgorYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkYWNfb3V0ZmlsZXMiCisKKyMgVGhlIGZvbGxvd2luZyB0ZXN0cyBzaG91bGQgcmVtb3ZlIHRoZWlyIG91dHB1dCBleGNlcHQgZmlsZXMgbWF0Y2hpbmcgY29uZnRlc3QuKi4KICMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KICMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KICMgb2YgZXhlZXh0LgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KIGFjX2xpbmtfZGVmYXVsdD1gZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKwogaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua19kZWZhdWx0XCIiKSA+JjUKICAgKGV2YWwgJGFjX2xpbmtfZGVmYXVsdCkgMj4mNQogICBhY19zdGF0dXM9JD8KICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIEZpbmQgdGhlIG91dHB1dCwgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCBsaWtlbHkuICBUaGlzIHNjaGVtZSBpcwotIyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikgb25seSBhcyBhIGxhc3QKLSMgcmVzb3J0LgotCi0jIEJlIGNhcmVmdWwgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhcmlhYmxlLCBzaW5jZSBpdCB1c2VkIHRvIGJlIGNhY2hlZC4KLSMgT3RoZXJ3aXNlIGFuIG9sZCBjYWNoZSB2YWx1ZSBvZiBgbm8nIGxlZCB0byBgRVhFRVhUID0gbm8nIGluIGEgTWFrZWZpbGUuCi1hY19jdl9leGVleHQ9Ci0jIGIub3V0IGlzIGNyZWF0ZWQgYnkgaTk2MCBjb21waWxlcnMuCi1mb3IgYWNfZmlsZSBpbiBhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0CisgIGZvciBhY19maWxlIGluICRhY19vdXRmaWxlcyBhLiogY29uZnRlc3QuKiBOTwogZG8KICAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCiAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubyB8ICoub2JqICkKLQk7OwotICAgIGNvbmZ0ZXN0LiRhY19leHQgKQotCSMgVGhpcyBpcyB0aGUgc291cmNlIGZpbGUuCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRhaW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLQlhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkjIEZJWE1FOiBJIGJlbGlldmUgd2UgZXhwb3J0IGFjX2N2X2V4ZWV4dCBmb3IgTGlidG9vbCwKLQkjIGJ1dCBpdCB3b3VsZCBiZSBjb29sIHRvIGZpbmQgb3V0IGlmIGl0J3MgdHJ1ZS4gIERvZXMgYW55Ym9keQotCSMgbWFpbnRhaW4gTGlidG9vbD8gLS1ha2ltLgotCWV4cG9ydCBhY19jdl9leGVleHQKLQlicmVhazs7Ci0gICAgKiApCi0JYnJlYWs7OworICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqICkgYnJlYWs7OwogICBlc2FjCiBkb25lCitpZiB0ZXN0ICIkYWNfZmlsZSIgPSBOTzsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBvdXRwdXQgZmlsZSBmb3VuZAorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gb3V0cHV0IGZpbGUgZm91bmQKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCisKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKQEAgLTIwOTcsMTQgKzI1NzEsMTIgQEAKICAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CiBmaQogCi1hY19leGVleHQ9JGFjX2N2X2V4ZWV4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNgotCi0jIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2ZpbGUiID4mNjsgfQorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKICMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzLi4uICRFQ0hPX0MiID4mNjsgfQogIyBGSVhNRTogVGhlc2UgY3Jvc3MgY29tcGlsZXIgaGFja3Mgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIEF1dG9jb25mIDMuMAogIyBJZiBub3QgY3Jvc3MgY29tcGlsaW5nLCBjaGVjayB0aGF0IHdlIGNhbiBydW4gYSBzaW1wbGUgcHJvZ3JhbS4KIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgpAQCAtMjEyOSw4MyArMjYwMSw4NCBAQAogICAgIGZpCiAgIGZpCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogCi1ybSAtZiBhLm91dCBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi0jIENoZWNrIHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKLSMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRjcm9zc19jb21waWxpbmciID4mNgorIyBDbGVhbiB1cDsgbGlzdCBhbHNvICRhY19maWxlLCBpbiBjYXNlIGl0IG1hdGNoZWQgYSB3aWxkY2FyZCBlbnRyeS4KK3JtIC1mICRhY19vdXRmaWxlcyAkYWNfZmlsZQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2Ci1pZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAkRUNIT19DIiA+JjY7IH0KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGNyb3NzX2NvbXBpbGluZyIgPiY1CitlY2hvICIke0VDSE9fVH0kY3Jvc3NfY29tcGlsaW5nIiA+JjY7IH0KKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKICAgKGV2YWwgJGFjX2xpbmspIDI+JjUKICAgYWNfc3RhdHVzPSQ/CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCi0jIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKLSMgd29yayBwcm9wZXJseSAoaS5lLiwgcmVmZXIgdG8gYGNvbmZ0ZXN0LmV4ZScpLCB3aGlsZSBpdCB3b24ndCB3aXRoCi0jIGBybScuCi1mb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkgIGV4cG9ydCBhY19jdl9leGVleHQKLQkgIGJyZWFrOzsKLSAgICAqICkgYnJlYWs7OwotICBlc2FjCi1kb25lCisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKSwKKyAgICAjIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKKyAgICAjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aCBgcm0nLgorICAgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qIE5POyBkbworICAgICAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgICAgICBjYXNlICRhY19maWxlIGluCisJKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5vIHwgKi5vYmogKSA7OworCSouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgICAgIGJyZWFrOzsKKwkqICkgYnJlYWs7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgICBpZiB0ZXN0ICIkYWNfZmlsZSIgPSBOTzsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IG5vIG91dHB1dCBmaWxlIGZvdW5kCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IG5vIG91dHB1dCBmaWxlIGZvdW5kCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworICAgICMgQ2xlYW4gdXA7IGxpc3QgYWxzbyAkYWNfZmlsZSwgaW4gY2FzZSBpdCBtYXRjaGVkIGNvbmZ0ZXN0LiouCisgICAgcm0gLWYgJGFjX291dGZpbGVzICRhY19maWxlCisKIGVsc2UKICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQogZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluawogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwogZmkKIAotcm0gLWYgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNgogCi1ybSAtZiBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9leGVleHQiID4mNjsgfQogRVhFRVhUPSRhY19jdl9leGVleHQKIGFjX2V4ZWV4dD0kRVhFRVhUCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAkRUNIT19DIiA+JjYKKworCithY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCisgIHJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCiBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKICAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IHRoZW4KLSAgZm9yIGFjX2ZpbGUgaW4gYChscyBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iajsgbHMgY29uZnRlc3QuKikgMj4vZGV2L251bGxgOyBkbworICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7CiAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyApIDs7CisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mICkgOzsKICAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKICAgICAgICBicmVhazs7CiAgIGVzYWMKQEAgLTIyMjEsMTQgKzI2OTQsMTYgQEAKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZmkKIAotcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjY7IH0KIE9CSkVYVD0kYWNfY3Zfb2JqZXh0CiBhY19vYmpleHQ9JE9CSkVYVAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAkRUNIT19DIiA+JjYKKworCitybSAtZiBjb25mdGVzdC4qCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2NfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0yMjc2LDI0ICsyNzUxLDI4IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2NvbXBpbGVyX2dudT1ubworCWFjX2NvbXBpbGVyX2dudT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQogCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQogR0NDPWB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXMgJiYgZWNobyB5ZXNgCiBhY190ZXN0X0NGTEFHUz0ke0NGTEFHUytzZXR9CiBhY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCi1DRkxBR1M9Ii1nIgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgogY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CkBAIC0yMzM0LDEyICsyODEzLDEwNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9wcm9nX2NjX2c9bm8KKwlDRkxBR1M9IiIKKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjYKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgYWNfY193ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jX3dlcnJvcl9mbGFnCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2ciID4mNjsgfQogaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgogICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCiBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgpAQCAtMjM1NSwxMiArMjkyNywxMiBAQAogICAgIENGTEFHUz0KICAgZmkKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IEFOU0kgQyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBBTlNJIEMuLi4gJEVDSE9fQyIgPiY2Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2Nfc3RkYytzZXR9IiA9IHNldDsgdGhlbgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKLSAgYWNfY3ZfcHJvZ19jY19zdGRjPW5vCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCiBhY19zYXZlX0NDPSRDQwogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KQEAgLTIzOTQsMTAgKzI5NjYsMTAgQEAKIC8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCiAgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCiAgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKLSAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZDEgaXMgYWRkZWQgdG8gZ2V0CisgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CiAgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCiAgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKLSAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkMS4gICovCisgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCiBpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwogCiBpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKQEAgLTI0MTQsMTQgKzI5ODYsOCBAQAogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotIyBEb24ndCB0cnkgZ2NjIC1hbnNpOyB0aGF0IHR1cm5zIG9mZiB1c2VmdWwgZXh0ZW5zaW9ucyBhbmQKLSMgYnJlYWtzIHNvbWUgc3lzdGVtcycgaGVhZGVyIGZpbGVzLgotIyBBSVgJCQktcWxhbmdsdmw9YW5zaQotIyBVbHRyaXggYW5kIE9TRi8xCS1zdGQxCi0jIEhQLVVYIDEwLjIwIGFuZCBsYXRlcgktQWUKLSMgSFAtVVggb2xkZXIgdmVyc2lvbnMJLUFhIC1EX0hQVVhfU09VUkNFCi0jIFNWUjQJCQktWGMgLURfX0VYVEVOU0lPTlNfXwotZm9yIGFjX2FyZyBpbiAiIiAtcWxhbmdsdmw9YW5zaSAtc3RkMSAtQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCiBkbwogICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKICAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dApAQCAtMjQ0NSwxNzAgKzMwMTEsMzYgQEAKICAgYWNfc3RhdHVzPSQ/CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19zdGRjPSRhY19hcmcKLWJyZWFrCisgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAorCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhawogZG9uZQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdC4kYWNfb2JqZXh0CitybSAtZiBjb25mdGVzdC4kYWNfZXh0CiBDQz0kYWNfc2F2ZV9DQwogCiBmaQotCi1jYXNlICJ4JGFjX2N2X3Byb2dfY2Nfc3RkYyIgaW4KLSAgeHx4bm8pCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9bm9uZSBuZWVkZWQiID4mNiA7OworIyBBQ19DQUNIRV9WQUwKK2Nhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCisgIHgpCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CitlY2hvICIke0VDSE9fVH1ub25lIG5lZWRlZCIgPiY2OyB9IDs7CisgIHhubykKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfXVuc3VwcG9ydGVkIiA+JjY7IH0gOzsKICAgKikKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19zdGRjIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX3N0ZGMiID4mNgotICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2Nfc3RkYyIgOzsKKyAgICBDQz0iJENDICRhY19jdl9wcm9nX2NjX2M4OSIKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19jODkiID4mNjsgfSA7OwogZXNhYwogCi0jIFNvbWUgcGVvcGxlIHVzZSBhIEMrKyBjb21waWxlciB0byBjb21waWxlIEMuICBTaW5jZSB3ZSB1c2UgYGV4aXQnLAotIyBpbiBDKysgd2UgbmVlZCB0byBkZWNsYXJlIGl0LiAgSW4gY2FzZSBzb21lb25lIHVzZXMgdGhlIHNhbWUgY29tcGlsZXIKLSMgZm9yIGJvdGggY29tcGlsaW5nIEMgYW5kIEMrKyB3ZSBuZWVkIHRvIGhhdmUgdGhlIEMrKyBjb21waWxlciBkZWNpZGUKLSMgdGhlIGRlY2xhcmF0aW9uIG9mIGV4aXQsIHNpbmNlIGl0J3MgdGhlIG1vc3QgZGVtYW5kaW5nIGVudmlyb25tZW50LgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0gIGNob2tlIG1lCi0jZW5kaWYKLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwotICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0gIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gIChldmFsICRhY190cnkpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgZm9yIGFjX2RlY2xhcmF0aW9uIGluIFwKLSAgICcnIFwKLSAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpIHRocm93ICgpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCi0gICAnZXh0ZXJuICJDIiB2b2lkIHN0ZDo6ZXhpdCAoaW50KTsgdXNpbmcgc3RkOjpleGl0OycgXAotICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpIHRocm93ICgpOycgXAotICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOycgXAotICAgJ3ZvaWQgZXhpdCAoaW50KTsnCi1kbwotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19kZWNsYXJhdGlvbgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotaW50Ci1tYWluICgpCi17Ci1leGl0ICg0Mik7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQotICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JwotICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotY29udGludWUKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2RlY2xhcmF0aW9uCi1pbnQKLW1haW4gKCkKLXsKLWV4aXQgKDQyKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfY29tcGlsZVwiIikgPiY1Ci0gIChldmFsICRhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwotICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQnCi0gIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gIChldmFsICRhY190cnkpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0KgotaWYgdGVzdCAtbiAiJGFjX2RlY2xhcmF0aW9uIjsgdGhlbgotICBlY2hvICcjaWZkZWYgX19jcGx1c3BsdXMnID4+Y29uZmRlZnMuaAotICBlY2hvICRhY19kZWNsYXJhdGlvbiAgICAgID4+Y29uZmRlZnMuaAotICBlY2hvICcjZW5kaWYnICAgICAgICAgICAgID4+Y29uZmRlZnMuaAotZmkKLQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogYWNfZXh0PWMKIGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCkBAIC0yNjE4LDEzICszMDUwLDEyIEBACiAKIAogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1jeHgtbWFpbj08Y29tcGlsZXI+IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aC1jeHgtbWFpbj08Y29tcGlsZXI+Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1jeHgtbWFpbj08Y29tcGlsZXI+IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aC1jeHgtbWFpbj08Y29tcGlsZXI+Li4uICRFQ0hPX0MiID4mNjsgfQogCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWN4eF9tYWluIG9yIC0td2l0aG91dC1jeHhfbWFpbiB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWN4eF9tYWluIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9jeHhfbWFpbitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9jeHhfbWFpbiIKLQorICB3aXRodmFsPSR3aXRoX2N4eF9tYWluOwogCiAJY2FzZSAkd2l0aHZhbCBpbgogCW5vKQl3aXRoX2N4eF9tYWluPW5vCkBAIC0yNjQzLDkgKzMwNzQsMTAgQEAKIAl3aXRoX2N4eF9tYWluPW5vCiAJTUFJTkNDPSckKENDKScKIAotZmk7Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF9jeHhfbWFpbiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kd2l0aF9jeHhfbWFpbiIgPiY2CitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3aXRoX2N4eF9tYWluIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3aXRoX2N4eF9tYWluIiA+JjY7IH0KIAogcHJlc2V0X2N4eD0iJENYWCIKIGlmIHRlc3QgLXogIiRDWFgiCkBAIC0yNjUzLDggKzMwODUsOCBAQAogICAgICAgICBjYXNlICIkQ0MiIGluCiAgICAgICAgIGdjYykgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGcrKzsgYWNfd29yZD0kMgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTI2NjksMzIgKzMxMDEsMzMgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgogICAgIGFjX2N2X3BhdGhfQ1hYPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ1hYIiAmJiBhY19jdl9wYXRoX0NYWD0iZysrIgogICA7OwogZXNhYwogZmkKIENYWD0kYWNfY3ZfcGF0aF9DWFgKLQogaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ1hYIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNjsgfQogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKKwogIDs7CiAgICAgICAgIGNjKSAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjKysiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGMrKzsgYWNfd29yZD0kMgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTI3MDksMjcgKzMxNDIsMjggQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgogICAgIGFjX2N2X3BhdGhfQ1hYPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQ1hYIiAmJiBhY19jdl9wYXRoX0NYWD0iYysrIgogICA7OwogZXNhYwogZmkKIENYWD0kYWNfY3ZfcGF0aF9DWFgKLQogaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ1hYIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDWFgiID4mNjsgfQogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKKwogIDs7CiAgICAgICAgIGVzYWMKIAlpZiB0ZXN0ICIkQ1hYIiA9ICJub3Rmb3VuZCIKQEAgLTI3NDMsOCArMzE3Nyw4IEBACiBkbwogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTI3NTcsMjUgKzMxOTEsMjcgQEAKICAgSUZTPSRhc19zYXZlX0lGUwogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IHRoZW4KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgogICAgIGFjX2N2X3Byb2dfQ1hYPSIkYWNfcHJvZyIKICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQogZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKIENYWD0kYWNfY3ZfcHJvZ19DWFgKIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDWFgiID4mNQotZWNobyAiJHtFQ0hPX1R9JENYWCIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1hYIiA+JjY7IH0KIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKKwogICB0ZXN0IC1uICIkQ1hYIiAmJiBicmVhawogZG9uZQogdGVzdCAtbiAiJENYWCIgfHwgQ1hYPSJub3Rmb3VuZCIKQEAgLTI4MDcsOCArMzI0Myw4IEBACiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCiBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwogYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICRFQ0hPX0MiID4mNjsgfQogIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KIGlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCiAgIENQUD0KQEAgLTI4NjgsOSArMzMwNCwxMCBAQAogICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCiBjb250aW51ZQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKIAotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKICAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KQEAgLTI5MDgsNiArMzM0NSw3IEBACiBhY19wcmVwcm9jX29rPToKIGJyZWFrCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAogCiBkb25lCkBAIC0yOTI1LDggKzMzNjMsOCBAQAogZWxzZQogICBhY19jdl9wcm9nX0NQUD0kQ1BQCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ1BQIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1BQIiA+JjY7IH0KIGFjX3ByZXByb2Nfb2s9ZmFsc2UKIGZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwogZG8KQEAgLTI5NzUsOSArMzQxMywxMCBAQAogICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCiBjb250aW51ZQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKIAotICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uLWV4aXN0ZW50IGhlYWRlcnMKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKICAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KQEAgLTMwMTUsNiArMzQ1NCw3IEBACiBhY19wcmVwcm9jX29rPToKIGJyZWFrCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAogCiBkb25lCkBAIC0zMDM3LDI0ICszNDc3LDE3MSBAQAogYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZWdyZXAuLi4gJEVDSE9fQyIgPiY2Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfZWdyZXArc2V0fSIgPSBzZXQ7IHRoZW4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCi0gIGlmIGVjaG8gYSB8IChncmVwIC1FICcoYXxiKScpID4vZGV2L251bGwgMj4mMQotICAgIHRoZW4gYWNfY3ZfcHJvZ19lZ3JlcD0nZ3JlcCAtRScKLSAgICBlbHNlIGFjX2N2X3Byb2dfZWdyZXA9J2VncmVwJworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdyZXAgZ2dyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0CitpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KK3NldCBkdW1teSBncmVwIGdncmVwOyBhY19wcm9nX25hbWU9JDIKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc19leGVjdXRhYmxlX3AgIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisgICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAorY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisgICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAogICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0Lio7OworZXNhYworCisKKyAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgZG9uZQorZG9uZQorCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2VncmVwIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2VncmVwIiA+JjYKLSBFR1JFUD0kYWNfY3ZfcHJvZ19lZ3JlcAorCitHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgoraWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworZWxzZQorICBhY19jdl9wYXRoX0dSRVA9JEdSRVAKK2ZpCisKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfR1JFUCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKyAgIGVsc2UKKyAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJlZ3JlcCIgdG8gdXNlIGluIG1zZyBvdXRwdXQKK2lmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KK3NldCBkdW1teSBlZ3JlcDsgYWNfcHJvZ19uYW1lPSQyCitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc19leGVjdXRhYmxlX3AgIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQorICAgICMgQ2hlY2sgZm9yIEdOVSBhY19wYXRoX0VHUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9FR1JFUAorY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKypHTlUqKQorICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIgYWNfcGF0aF9FR1JFUF9mb3VuZD06OzsKKyopCisgIGFjX2NvdW50PTAKKyAgZWNobyAkRUNIT19OICIwMTIzNDU2Nzg5JEVDSE9fQyIgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgIGVjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCisgICAgIiRhY19wYXRoX0VHUkVQIiAnRUdSRVAkJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9FR1JFUF9tYXgtMH07IHRoZW4KKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCisgICAgICBhY19wYXRoX0VHUkVQX21heD0kYWNfY291bnQKKyAgICBmaQorICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKyAgZG9uZQorICBybSAtZiBjb25mdGVzdC4qOzsKK2VzYWMKKworCisgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMworICBkb25lCitkb25lCisKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworCitmaQorCitFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCitpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSAkYWNfcHJvZ19uYW1lIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworZWxzZQorICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorZmkKKworCisgICBmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKIAogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQUlYIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIEFJWC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBBSVgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQUlYLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMzA2OCwxNSArMzY1NSwxNSBAQAogX0FDRU9GCiBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CiAgICRFR1JFUCAieWVzIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBfQUxMX1NPVVJDRSAxCiBfQUNFT0YKIAogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIHJtIC1mIGNvbmZ0ZXN0KgogCkBAIC0zMDkxLDM5ICszNjc4LDM5IEBACiBlc2FjCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtc3VmZml4IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aC1zdWZmaXguLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXN1ZmZpeCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtc3VmZml4Li4uICRFQ0hPX0MiID4mNjsgfQogCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXN1ZmZpeCBvciAtLXdpdGhvdXQtc3VmZml4IHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3VmZml4IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9zdWZmaXgrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfc3VmZml4IgotCisgIHdpdGh2YWw9JHdpdGhfc3VmZml4OwogCWNhc2UgJHdpdGh2YWwgaW4KIAlubykJRVhFRVhUPTs7CiAJeWVzKQlFWEVFWFQ9LmV4ZTs7CiAJKikJRVhFRVhUPSR3aXRodmFsOzsKIAllc2FjCi1maTsKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRFWEVFWFQiID4mNQotZWNobyAiJHtFQ0hPX1R9JEVYRUVYVCIgPiY2CitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRFWEVFWFQiID4mNQorZWNobyAiJHtFQ0hPX1R9JEVYRUVYVCIgPiY2OyB9CiAKICMgVGVzdCB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgb24gYSBub24tY2FzZS1zZW5zaXRpdmUgc3lzdGVtLCBpbiB3aGljaAogIyBjYXNlIHdlIGdpdmUgYSB3YXJuaW5nIGlmIG5vIGV4dCBpcyBnaXZlbgogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGNhc2UtaW5zZW5zaXRpdmUgYnVpbGQgZGlyZWN0b3J5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNhc2UtaW5zZW5zaXRpdmUgYnVpbGQgZGlyZWN0b3J5Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGNhc2UtaW5zZW5zaXRpdmUgYnVpbGQgZGlyZWN0b3J5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNhc2UtaW5zZW5zaXRpdmUgYnVpbGQgZGlyZWN0b3J5Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAhIC1kIENhc2VTZW5zaXRpdmVUZXN0RGlyOyB0aGVuCiBta2RpciBDYXNlU2Vuc2l0aXZlVGVzdERpcgogZmkKIAogaWYgdGVzdCAtZCBjYXNlc2Vuc2l0aXZldGVzdGRpcgogdGhlbgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiAgICAgQlVJTERFWEVFWFQ9LmV4ZQogZWxzZQotCWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIAlCVUlMREVYRUVYVD0kRVhFRVhUCiBmaQogcm1kaXIgQ2FzZVNlbnNpdGl2ZVRlc3REaXIKQEAgLTMxNTYsMTQgKzM3NDMsMTQgQEAKIAogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBMSUJSQVJZIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgTElCUkFSWS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIExJQlJBUlkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBMSUJSQVJZLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAteiAiJExJQlJBUlkiCiB0aGVuCiAJTElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5hJwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMSUJSQVJZIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRMSUJSQVJZIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJExJQlJBUlkiID4mNQorZWNobyAiJHtFQ0hPX1R9JExJQlJBUlkiID4mNjsgfQogCiAjIExETElCUkFSWSBpcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB0byBsaW5rIGFnYWluc3QgKGFzIG9wcG9zZWQgdG8gdGhlCiAjIG5hbWUgb2YgdGhlIGxpYnJhcnkgaW50byB3aGljaCB0byBpbnNlcnQgb2JqZWN0IGZpbGVzKS4gQkxETElCUkFSWSBpcyBhbHNvCkBAIC0zMTk4LDggKzM3ODUsOCBAQAogIyBUaGlzIGlzIGFsdGVyZWQgZm9yIEFJWCBpbiBvcmRlciB0byBidWlsZCB0aGUgZXhwb3J0IGxpc3QgYmVmb3JlCiAjIGxpbmtpbmcuCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBMSU5LQ0MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBMSU5LQ0MuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBMSU5LQ0MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBMSU5LQ0MuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0IC16ICIkTElOS0NDIgogdGhlbgogCUxJTktDQz0nJChQVVJJRlkpICQoTUFJTkNDKScKQEAgLTMyMTUsMTYgKzM4MDIsMTYgQEAKIAkgICBMSU5LQ0M9IiRMSU5LQ0MgLUwvdXNyL2xpYi9pYTY0bDY0Ijs7CiAJZXNhYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMSU5LQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JExJTktDQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMSU5LQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JExJTktDQyIgPiY2OyB9CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS1lbmFibGUtc2hhcmVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0tZW5hYmxlLXNoYXJlZC4uLiAkRUNIT19DIiA+JjYKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS1lbmFibGUtc2hhcmVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0tZW5hYmxlLXNoYXJlZC4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCisgIGVuYWJsZXZhbD0kZW5hYmxlX3NoYXJlZDsKK2ZpCiAKLWZpOwogCiBpZiB0ZXN0IC16ICIkZW5hYmxlX3NoYXJlZCIKIHRoZW4KQEAgLTMyMzUsMTUgKzM4MjIsMTQgQEAKICAgICBlbmFibGVfc2hhcmVkPSJubyI7OwogICBlc2FjCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZV9zaGFyZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGVuYWJsZV9zaGFyZWQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlX3NoYXJlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kZW5hYmxlX3NoYXJlZCIgPiY2OyB9CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS1lbmFibGUtcHJvZmlsaW5nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0tZW5hYmxlLXByb2ZpbGluZy4uLiAkRUNIT19DIiA+JjYKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wcm9maWxpbmcgb3IgLS1kaXNhYmxlLXByb2ZpbGluZyB3YXMgZ2l2ZW4uCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS1lbmFibGUtcHJvZmlsaW5nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0tZW5hYmxlLXByb2ZpbGluZy4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wcm9maWxpbmcgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHtlbmFibGVfcHJvZmlsaW5nK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9wcm9maWxpbmciCi0gIGFjX3NhdmVfY2M9IiRDQyIKKyAgZW5hYmxldmFsPSRlbmFibGVfcHJvZmlsaW5nOyBhY19zYXZlX2NjPSIkQ0MiCiAgQ0M9IiRDQyAtcGciCiAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KICAgYWNfZW5hYmxlX3Byb2ZpbGluZz0ibm8iCkBAIC0zMjc2LDEyICszODYyLDE1IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19lbmFibGVfcHJvZmlsaW5nPSJubyIKIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCisKICBDQz0iJGFjX3NhdmVfY2MiCi1maTsKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19lbmFibGVfcHJvZmlsaW5nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19lbmFibGVfcHJvZmlsaW5nIiA+JjYKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2VuYWJsZV9wcm9maWxpbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2VuYWJsZV9wcm9maWxpbmciID4mNjsgfQogCiBjYXNlICIkYWNfZW5hYmxlX3Byb2ZpbGluZyIgaW4KICAgICAieWVzIikKQEAgLTMyOTAsOCArMzg3OSw4IEBACiAgICAgOzsKIGVzYWMKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIExETElCUkFSWSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIExETElCUkFSWS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIExETElCUkFSWSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIExETElCUkFSWS4uLiAkRUNIT19DIiA+JjY7IH0KIAogIyBNYWNPU1ggZnJhbWV3b3JrIGJ1aWxkcyBuZWVkIG1vcmUgbWFnaWMuIExETElCUkFSWSBpcyB0aGUgZHluYW1pYwogIyBsaWJyYXJ5IHRoYXQgd2UgYnVpbGQsIGJ1dCB3ZSBkbyBub3Qgd2FudCB0byBsaW5rIGFnYWluc3QgaXQgKHdlCkBAIC0zMzQxLDcgKzM5MzAsMTQgQEAKIAkgIElOU1RTT05BTUU9IiRMRExJQlJBUlkiLiRTT1ZFUlNJT04KIAkgIDs7CiAgICAgaHAqfEhQKikKLQkgIExETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbCcKKwkgIGNhc2UgYHVuYW1lIC1tYCBpbgorCQlpYTY0KQorCQkJTERMSUJSQVJZPSdsaWJweXRob24kKFZFUlNJT04pLnNvJworCQkJOzsKKwkJKikKKwkJCUxETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbCcKKwkJCTs7CisJICBlc2FjCiAJICBCTERMSUJSQVJZPSctV2wsK2IsJChMSUJESVIpIC1MLiAtbHB5dGhvbiQoVkVSU0lPTiknCiAJICBSVU5TSEFSRUQ9U0hMSUJfUEFUSD1gcHdkYDoke1NITElCX1BBVEh9CiAJICA7OwpAQCAtMzM2NSwxNCArMzk2MSwxNCBAQAogICBlc2FjCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTERMSUJSQVJZIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRMRExJQlJBUlkiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTERMSUJSQVJZIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRMRExJQlJBUlkiID4mNjsgfQogCiBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMzM4NSwzMiArMzk4MSwzNCBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKIGZpCiBmaQogUkFOTElCPSRhY19jdl9wcm9nX1JBTkxJQgogaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFJBTkxJQiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kUkFOTElCIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRSQU5MSUIiID4mNjsgfQogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIAorCiBmaQogaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgogICBhY19jdF9SQU5MSUI9JFJBTkxJQgogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMzQyMywyNyArNDAyMSw0MSBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9InJhbmxpYiIKICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQogZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUI9IjoiCiBmaQogZmkKIGFjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKIGlmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X1JBTkxJQiIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X1JBTkxJQiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3RfUkFOTElCIiA+JjY7IH0KIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKLSAgUkFOTElCPSRhY19jdF9SQU5MSUIKKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorICAgIFJBTkxJQj0iOiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisgIGZpCiBlbHNlCiAgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgogZmkKQEAgLTM0NTMsOCArNDA2NSw4IEBACiBkbwogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19BUitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMzQ2NywyNSArNDA3OSwyNyBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19BUj0iJGFjX3Byb2ciCiAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKIGRvbmUKIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAogZmkKIGZpCiBBUj0kYWNfY3ZfcHJvZ19BUgogaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQVIiID4mNQotZWNobyAiJHtFQ0hPX1R9JEFSIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQVIiID4mNQorZWNobyAiJHtFQ0hPX1R9JEFSIiA+JjY7IH0KIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKKwogICB0ZXN0IC1uICIkQVIiICYmIGJyZWFrCiBkb25lCiB0ZXN0IC1uICIkQVIiIHx8IEFSPSJhciIKQEAgLTM0OTQsOCArNDEwOCw4IEBACiAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3ZudmVyc2lvbiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgc3ZudmVyc2lvbjsgYWNfd29yZD0kMgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVk5WRVJTSU9OK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0zNTA4LDI2ICs0MTIyLDI4IEBACiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB0aGVuCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KICAgICBhY19jdl9wcm9nX1NWTlZFUlNJT049ImZvdW5kIgogICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCiBkb25lCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKICAgdGVzdCAteiAiJGFjX2N2X3Byb2dfU1ZOVkVSU0lPTiIgJiYgYWNfY3ZfcHJvZ19TVk5WRVJTSU9OPSJub3QtZm91bmQiCiBmaQogZmkKIFNWTlZFUlNJT049JGFjX2N2X3Byb2dfU1ZOVkVSU0lPTgogaWYgdGVzdCAtbiAiJFNWTlZFUlNJT04iOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVk5WRVJTSU9OIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRTVk5WRVJTSU9OIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU1ZOVkVSU0lPTiIgPiY1CitlY2hvICIke0VDSE9fVH0kU1ZOVkVSU0lPTiIgPiY2OyB9CiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCisKIGlmIHRlc3QgJFNWTlZFUlNJT04gPSBmb3VuZAogdGhlbgogCVNWTlZFUlNJT049InN2bnZlcnNpb24gXCQoc3JjZGlyKSIKQEAgLTM1ODEsOCArNDE5Nyw4IEBACiAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCiAjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKICMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CkBAIC0zNjA0LDcgKzQyMjAsNyBAQAogICAgICMgYnkgZGVmYXVsdC4KICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCiAgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLQlpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KIAkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCiAJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KIAkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgpAQCAtMzYyMywyMSArNDIzOSwyMiBAQAogICAgIDs7CiBlc2FjCiBkb25lCitJRlM9JGFzX3NhdmVfSUZTCiAKIAogZmkKICAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KICAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKICAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAogICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCiAgICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAogICBmaQogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRJTlNUQUxMIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQorZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNjsgfQogCiAjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCiAjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgpAQCAtMzY2MCwxMyArNDI3NywxMiBAQAogZmkKIAogIyBDaGVjayBmb3IgLS13aXRoLXB5ZGVidWcKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXB5ZGVidWciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLXB5ZGVidWcuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXB5ZGVidWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLXB5ZGVidWcuLi4gJEVDSE9fQyIgPiY2OyB9CiAKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHlkZWJ1ZyBvciAtLXdpdGhvdXQtcHlkZWJ1ZyB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXB5ZGVidWcgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX3B5ZGVidWcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfcHlkZWJ1ZyIKLQorICB3aXRodmFsPSR3aXRoX3B5ZGVidWc7CiBpZiB0ZXN0ICIkd2l0aHZhbCIgIT0gbm8KIHRoZW4KIApAQCAtMzY3NCwxNiArNDI5MCwxNyBAQAogI2RlZmluZSBQeV9ERUJVRyAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9OwogICBQeV9ERUJVRz0ndHJ1ZScKLWVsc2UgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgUHlfREVCVUc9J2ZhbHNlJworZWxzZSB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH07IFB5X0RFQlVHPSdmYWxzZScKIGZpCiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLWZpOworICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKIAogIyBYWFggU2hvdWxkbid0IHRoZSBjb2RlIGFib3ZlIHRoYXQgZmlkZGxlcyB3aXRoIEJBU0VDRkxBR1MgYW5kIE9QVCBiZQogIyBtZXJnZWQgd2l0aCB0aGlzIGNodW5rIG9mIGNvZGU/CkBAIC0zNzUwLDggKzQzNjcsOCBAQAogICAgICMgUHl0aG9uIHZpb2xhdGVzIEM5OSBydWxlcywgYnkgY2FzdGluZyBiZXR3ZWVuIGluY29tcGF0aWJsZQogICAgICMgcG9pbnRlciB0eXBlcy4gR0NDIG1heSBnZW5lcmF0ZSBiYWQgY29kZSBhcyBhIHJlc3VsdCBvZiB0aGF0LAogICAgICMgc28gdXNlIC1mbm8tc3RyaWN0LWFsaWFzaW5nIGlmIHN1cHBvcnRlZC4KLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZm5vLXN0cmljdC1hbGlhc2luZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWZuby1zdHJpY3QtYWxpYXNpbmcuLi4gJEVDSE9fQyIgPiY2CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZm5vLXN0cmljdC1hbGlhc2luZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWZuby1zdHJpY3QtYWxpYXNpbmcuLi4gJEVDSE9fQyIgPiY2OyB9CiAgICAgIGFjX3NhdmVfY2M9IiRDQyIKICAgICAgQ0M9IiRDQyAtZm5vLXN0cmljdC1hbGlhc2luZyIKICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KQEAgLTM3ODUsMTEgKzQ0MDIsMTMgQEAKICggZXhpdCAkYWNfc3RhdHVzICkKIGFjX2N2X25vX3N0cmljdF9hbGlhc2luZ19vaz1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKKwogICAgICBDQz0iJGFjX3NhdmVfY2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X25vX3N0cmljdF9hbGlhc2luZ19vayIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfbm9fc3RyaWN0X2FsaWFzaW5nX29rIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ub19zdHJpY3RfYWxpYXNpbmdfb2siID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X25vX3N0cmljdF9hbGlhc2luZ19vayIgPiY2OyB9CiAgICAgaWYgdGVzdCAkYWNfY3Zfbm9fc3RyaWN0X2FsaWFzaW5nX29rID0geWVzCiAgICAgdGhlbgogICAgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLWZuby1zdHJpY3QtYWxpYXNpbmciCkBAIC0zODAxLDYgKzQ0MjAsMTAgQEAKIAkjIGlzIHRoZXJlIGFueSBvdGhlciBjb21waWxlciBvbiBEYXJ3aW4gYmVzaWRlcyBnY2M/CiAJRGFyd2luKikKIAkgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLVduby1sb25nLWRvdWJsZSAtbm8tY3BwLXByZWNvbXAgLW1uby1mdXNlZC1tYWRkIgorCSAgICBpZiB0ZXN0ICIke2VuYWJsZV91bml2ZXJzYWxzZGt9IjsgdGhlbgorCQlCQVNFQ0ZMQUdTPSItYXJjaCBwcGMgLWFyY2ggaTM4NiAtaXN5c3Jvb3QgJHtVTklWRVJTQUxTREt9ICR7QkFTRUNGTEFHU30iCisJICAgIGZpCisKIAkgICAgOzsKIAlPU0YqKQogCSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtbWllZWUiCkBAIC0zODQwLDggKzQ0NjMsOCBAQAogICBhY19jdl9vcHRfb2xpbWl0X29rPW5vCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtT1BUOk9saW1pdD0wIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtT1BUOk9saW1pdD0wLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtT1BUOk9saW1pdD0wIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtT1BUOk9saW1pdD0wLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9vcHRfb2xpbWl0X29rK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0zODc4LDEzICs0NTAxLDE1IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9vcHRfb2xpbWl0X29rPW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKworCiBDQz0iJGFjX3NhdmVfY2MiCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb3B0X29saW1pdF9vayIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfb3B0X29saW1pdF9vayIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vcHRfb2xpbWl0X29rIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9vcHRfb2xpbWl0X29rIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X29wdF9vbGltaXRfb2sgPSB5ZXM7IHRoZW4KICAgICBjYXNlICRhY19zeXNfc3lzdGVtIGluCiAJIyBYWFggaXMgdGhpcyBicmFuY2ggbmVlZGVkPyBPbiBNYWNPU1ggMTAuMi4yIHRoZSByZXN1bHQgb2YgdGhlCkBAIC0zODk3LDggKzQ1MjIsOCBAQAogCSAgICA7OwogICAgIGVzYWMKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLU9saW1pdCAxNTAwIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtT2xpbWl0IDE1MDAuLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLU9saW1pdCAxNTAwIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtT2xpbWl0IDE1MDAuLi4gJEVDSE9fQyIgPiY2OyB9CiAgIGlmIHRlc3QgIiR7YWNfY3Zfb2xpbWl0X29rK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0zOTM1LDEzICs0NTYwLDE1IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9vbGltaXRfb2s9bm8KIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCisKICAgQ0M9IiRhY19zYXZlX2NjIgogZmkKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2xpbWl0X29rIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9vbGltaXRfb2siID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vbGltaXRfb2siID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X29saW1pdF9vayIgPiY2OyB9CiAgIGlmIHRlc3QgJGFjX2N2X29saW1pdF9vayA9IHllczsgdGhlbgogICAgIEJBU0VDRkxBR1M9IiRCQVNFQ0ZMQUdTIC1PbGltaXQgMTUwMCIKICAgZmkKQEAgLTM5NTIsOCArNDU3OSw4IEBACiAjIGNvbXBsYWluIGlmIHVuYWNjZXB0ZWQgb3B0aW9ucyBhcmUgcGFzc2VkIChlLmcuIGdjYyBvbiBNYWMgT1MgWCkuCiAjIFNvIHdlIGhhdmUgdG8gc2VlIGZpcnN0IHdoZXRoZXIgcHRocmVhZHMgYXJlIGF2YWlsYWJsZSB3aXRob3V0CiAjIG9wdGlvbnMgYmVmb3JlIHdlIGNhbiBjaGVjayB3aGV0aGVyIC1LcHRocmVhZCBpbXByb3ZlcyBhbnl0aGluZy4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIGFyZSBhdmFpbGFibGUgd2l0aG91dCBvcHRpb25zIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBwdGhyZWFkcyBhcmUgYXZhaWxhYmxlIHdpdGhvdXQgb3B0aW9ucy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgcHRocmVhZHMgYXJlIGF2YWlsYWJsZSB3aXRob3V0IG9wdGlvbnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHB0aHJlYWRzIGFyZSBhdmFpbGFibGUgd2l0aG91dCBvcHRpb25zLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9wdGhyZWFkX2lzX2RlZmF1bHQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTQwMDQsMTMgKzQ2MzEsMTUgQEAKICggZXhpdCAkYWNfc3RhdHVzICkKIGFjX2N2X3B0aHJlYWRfaXNfZGVmYXVsdD1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKKworCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHRocmVhZF9pc19kZWZhdWx0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wdGhyZWFkX2lzX2RlZmF1bHQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHRocmVhZF9pc19kZWZhdWx0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wdGhyZWFkX2lzX2RlZmF1bHQiID4mNjsgfQogCiAKIGlmIHRlc3QgJGFjX2N2X3B0aHJlYWRfaXNfZGVmYXVsdCA9IHllcwpAQCAtNDAyMiw4ICs0NjUxLDggQEAKICMgU29tZSBjb21waWxlcnMgd29uJ3QgcmVwb3J0IHRoYXQgdGhleSBkbyBub3Qgc3VwcG9ydCAtS3B0aHJlYWQsCiAjIHNvIHdlIG5lZWQgdG8gcnVuIGEgcHJvZ3JhbSB0byBzZWUgd2hldGhlciBpdCByZWFsbHkgbWFkZSB0aGUKICMgZnVuY3Rpb24gYXZhaWxhYmxlLgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLUtwdGhyZWFkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtS3B0aHJlYWQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1LcHRocmVhZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLUtwdGhyZWFkLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9rcHRocmVhZCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtNDA3MiwxMyArNDcwMSwxNSBAQAogKCBleGl0ICRhY19zdGF0dXMgKQogYWNfY3Zfa3B0aHJlYWQ9bm8KIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCisKIENDPSIkYWNfc2F2ZV9jYyIKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9rcHRocmVhZCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfa3B0aHJlYWQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfa3B0aHJlYWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2twdGhyZWFkIiA+JjY7IH0KIGZpCiAKIGlmIHRlc3QgJGFjX2N2X2twdGhyZWFkID0gbm8gLWEgJGFjX2N2X3B0aHJlYWRfaXNfZGVmYXVsdCA9IG5vCkBAIC00MDg4LDggKzQ3MTksOCBAQAogIyBTb21lIGNvbXBpbGVycyB3b24ndCByZXBvcnQgdGhhdCB0aGV5IGRvIG5vdCBzdXBwb3J0IC1LdGhyZWFkLAogIyBzbyB3ZSBuZWVkIHRvIHJ1biBhIHByb2dyYW0gdG8gc2VlIHdoZXRoZXIgaXQgcmVhbGx5IG1hZGUgdGhlCiAjIGZ1bmN0aW9uIGF2YWlsYWJsZS4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1LdGhyZWFkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtS3RocmVhZC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLUt0aHJlYWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1LdGhyZWFkLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9rdGhyZWFkK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC00MTM4LDEzICs0NzY5LDE1IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9rdGhyZWFkPW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKworCiBDQz0iJGFjX3NhdmVfY2MiCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfa3RocmVhZCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfa3RocmVhZCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9rdGhyZWFkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9rdGhyZWFkIiA+JjY7IH0KIGZpCiAKIGlmIHRlc3QgJGFjX2N2X2t0aHJlYWQgPSBubyAtYSAkYWNfY3ZfcHRocmVhZF9pc19kZWZhdWx0ID0gbm8KQEAgLTQxNTQsOCArNDc4Nyw4IEBACiAjIFNvbWUgY29tcGlsZXJzIHdvbid0IHJlcG9ydCB0aGF0IHRoZXkgZG8gbm90IHN1cHBvcnQgLXB0aHJlYWQsCiAjIHNvIHdlIG5lZWQgdG8gcnVuIGEgcHJvZ3JhbSB0byBzZWUgd2hldGhlciBpdCByZWFsbHkgbWFkZSB0aGUKICMgZnVuY3Rpb24gYXZhaWxhYmxlLgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLXB0aHJlYWQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1wdGhyZWFkLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtcHRocmVhZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLXB0aHJlYWQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3RocmVhZCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtNDIwNCwxMyArNDgzNywxNSBAQAogKCBleGl0ICRhY19zdGF0dXMgKQogYWNfY3ZfcHRocmVhZD1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKKwogQ0M9IiRhY19zYXZlX2NjIgogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3B0aHJlYWQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3B0aHJlYWQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHRocmVhZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHRocmVhZCIgPiY2OyB9CiBmaQogCiAjIElmIHdlIGhhdmUgc2V0IGEgQ0MgY29tcGlsZXIgZmxhZyBmb3IgdGhyZWFkIHN1cHBvcnQgdGhlbgpAQCAtNDIxOCw4ICs0ODUzLDggQEAKIGFjX2N2X2N4eF90aHJlYWQ9bm8KIGlmIHRlc3QgISAteiAiJENYWCIKIHRoZW4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDWFggYWxzbyBhY2NlcHRzIGZsYWdzIGZvciB0aHJlYWQgc3VwcG9ydCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJENYWCBhbHNvIGFjY2VwdHMgZmxhZ3MgZm9yIHRocmVhZCBzdXBwb3J0Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFsc28gYWNjZXB0cyBmbGFncyBmb3IgdGhyZWFkIHN1cHBvcnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDWFggYWxzbyBhY2NlcHRzIGZsYWdzIGZvciB0aHJlYWQgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjY7IH0KIGFjX3NhdmVfY3h4PSIkQ1hYIgogCiBpZiB0ZXN0ICIkYWNfY3Zfa3B0aHJlYWQiID0gInllcyIKQEAgLTQyNDksMTUgKzQ4ODQsMTUgQEAKICAgZmkKICAgcm0gLWZyIGNvbmZ0ZXN0KgogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jeHhfdGhyZWFkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9jeHhfdGhyZWFkIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2N4eF90aHJlYWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2N4eF90aHJlYWQiID4mNjsgfQogZmkKIENYWD0iJGFjX3NhdmVfY3h4IgogCiAKICMgY2hlY2tzIGZvciBoZWFkZXIgZmlsZXMKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTQzMDYsOCArNDk0MSw5IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2hlYWRlcl9zdGRjPW5vCisJYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KQEAgLTQzNjQsNiArNTAwMCw3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKICMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKICMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKQEAgLTQzODMsOCArNTAyMCw4IEBACiAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKICAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCiAJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0gICAgICBleGl0KDIpOwotICBleGl0ICgwKTsKKyAgICAgIHJldHVybiAyOworICByZXR1cm4gMDsKIH0KIF9BQ0VPRgogcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CkBAIC00NDA3LDEyICs1MDQ0LDE0IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9oZWFkZXJfc3RkYz1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwogZmkKIGZpCi1maQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3RkYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3RkYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KIAogY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKQEAgLTQ0MzUsOSArNTA3NCw5IEBACiAJCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaAogZG8KIGFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTQ0NzYsMTIgKzUxMTUsMTQgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKKwlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCkBAIC00NTMxLDMwICs1MTcyLDMyIEBACiAKIAogCisKIGZvciBhY19oZWFkZXIgaW4gYXNtL3R5cGVzLmggY3Vyc2VzLmggZGxmY24uaCBmY250bC5oIGdycC5oIFwKIHNoYWRvdy5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHRocmVhZC5oIFwKIHN0cm9wdHMuaCB0ZXJtaW9zLmggdGhyZWFkLmggXAogdW5pc3RkLmggdXRpbWUuaCBcCiBzeXMvYXVkaW9pby5oIHN5cy9ic2R0dHkuaCBzeXMvZmlsZS5oIHN5cy9sb2FkYXZnLmggc3lzL2xvY2suaCBzeXMvbWtkZXYuaCBcCiBzeXMvbW9kZW0uaCBcCi1zeXMvcGFyYW0uaCBzeXMvcG9sbC5oIHN5cy9zZWxlY3QuaCBzeXMvc29ja2V0Lmggc3lzL3RpbWUuaCBzeXMvdGltZXMuaCBcCi1zeXMvdW4uaCBzeXMvdXRzbmFtZS5oIHN5cy93YWl0LmggcHR5LmggbGlidXRpbC5oIFwKK3N5cy9wYXJhbS5oIHN5cy9wb2xsLmggc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaCBzeXMvc3RhdHZmcy5oIHN5cy90aW1lLmggXAorc3lzL3RpbWVzLmggc3lzL3VuLmggc3lzL3V0c25hbWUuaCBzeXMvd2FpdC5oIHB0eS5oIGxpYnV0aWwuaCBcCiBzeXMvcmVzb3VyY2UuaCBuZXRwYWNrZXQvcGFja2V0Lmggc3lzZXhpdHMuaCBibHVldG9vdGguaCBcCiBibHVldG9vdGgvYmx1ZXRvb3RoLmgKIGRvCiBhc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfSGVhZGVyK3NldH1cIiA9IHNldCI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KIGVsc2UKICAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC00NTkwLDE1ICs1MjMzLDE2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2hlYWRlcl9jb21waWxlcj1ubworCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIAogIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTQ2MzIsOSArNTI3NiwxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTQ2NTgsMjUgKzUzMDMsMjQgQEAKIGVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CiAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKIGVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotICAgICgKLSAgICAgIGNhdCA8PFxfQVNCT1gKKyAgICAoIGNhdCA8PFxfQVNCT1gKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogIyMgUmVwb3J0IHRoaXMgdG8gaHR0cDovL3d3dy5weXRob24ub3JnL3B5dGhvbi1idWdzICMjCiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKIF9BU0JPWAotICAgICkgfAotICAgICAgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKICAgICA7OwogZXNhYwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KIAogZmkKIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KQEAgLTQ2OTYsOSArNTM0MCw5IEBACiBhY19oZWFkZXJfZGlyZW50PW5vCiBmb3IgYWNfaGRyIGluIGRpcmVudC5oIHN5cy9uZGlyLmggc3lzL2Rpci5oIG5kaXIuaDsgZG8KICAgYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19oZHIiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSLi4uICRFQ0hPX0MiID4mNgotaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGRyIHRoYXQgZGVmaW5lcyBESVIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtNDc0NSwxMiArNTM4OSwxNCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1ldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNQotZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AiID4mNgorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGRyIiB8ICRhc190cl9jcHBgIDEKQEAgLTQ3NjIsMTMgKzU0MDgsMTIgQEAKIGRvbmUKICMgVHdvIHZlcnNpb25zIG9mIG9wZW5kaXIgZXQgYWwuIGFyZSBpbiAtbGRpciBhbmQgLWx4IG9uIFNDTyBYZW5peC4KIGlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVuZGlyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBvcGVuZGlyLi4uICRFQ0hPX0MiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5kaXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5kaXIuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9vcGVuZGlyK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwotYWNfY3Zfc2VhcmNoX29wZW5kaXI9bm8KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTQ3NzYsNzYgKzU0MjEsMjkgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIG9wZW5kaXIgKCk7CiBpbnQKIG1haW4gKCkKIHsKLW9wZW5kaXIgKCk7CityZXR1cm4gb3BlbmRpciAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gIChldmFsICRhY190cnkpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYWNfY3Zfc2VhcmNoX29wZW5kaXI9Im5vbmUgcmVxdWlyZWQiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9vcGVuZGlyIiA9IG5vOyB0aGVuCi0gIGZvciBhY19saWIgaW4gZGlyOyBkbworZm9yIGFjX2xpYiBpbiAnJyBkaXI7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgogICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBvcGVuZGlyICgpOwotaW50Ci1tYWluICgpCi17Ci1vcGVuZGlyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBmaQorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAogaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1CiAgIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQogICBhY19zdGF0dXM9JD8KQEAgLTQ4NjYsMzQgKzU0NjQsNDMgQEAKICAgYWNfc3RhdHVzPSQ/CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYWNfY3Zfc2VhcmNoX29wZW5kaXI9Ii1sJGFjX2xpYiIKLWJyZWFrCisgIGFjX2N2X3NlYXJjaF9vcGVuZGlyPSRhY19yZXMKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAorCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICBkb25lCisgICAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfb3BlbmRpcitzZXR9IiA9IHNldDsgdGhlbgorICBicmVhawogZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX29wZW5kaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9zZWFyY2hfb3BlbmRpcj1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfb3BlbmRpciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2VhcmNoX29wZW5kaXIiID4mNgotaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9vcGVuZGlyIiAhPSBubzsgdGhlbgotICB0ZXN0ICIkYWNfY3Zfc2VhcmNoX29wZW5kaXIiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfb3BlbmRpciAkTElCUyIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9vcGVuZGlyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfb3BlbmRpciIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9vcGVuZGlyCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgogCiBmaQogCiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5kaXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIG9wZW5kaXIuLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgb3BlbmRpciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgb3BlbmRpci4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX29wZW5kaXIrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1hY19jdl9zZWFyY2hfb3BlbmRpcj1ubwogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtNDkwMSw3NiArNTUwOCwyOSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgb3BlbmRpciAoKTsKIGludAogbWFpbiAoKQogewotb3BlbmRpciAoKTsKK3JldHVybiBvcGVuZGlyICgpOwogICA7CiAgIHJldHVybiAwOwogfQogX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfbGlua1wiIikgPiY1Ci0gIChldmFsICRhY19saW5rKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwotICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQotICAoZXZhbCAkYWNfdHJ5KSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICBhY19jdl9zZWFyY2hfb3BlbmRpcj0ibm9uZSByZXF1aXJlZCIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotZmkKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1pZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX29wZW5kaXIiID0gbm87IHRoZW4KLSAgZm9yIGFjX2xpYiBpbiB4OyBkbworZm9yIGFjX2xpYiBpbiAnJyB4OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKICAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi0gICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpciAoKTsKLWludAotbWFpbiAoKQotewotb3BlbmRpciAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgZmkKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKIGlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQogICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKICAgYWNfc3RhdHVzPSQ/CkBAIC00OTkxLDMwICs1NTUxLDQwIEBACiAgIGFjX3N0YXR1cz0kPwogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X3NlYXJjaF9vcGVuZGlyPSItbCRhY19saWIiCi1icmVhaworICBhY19jdl9zZWFyY2hfb3BlbmRpcj0kYWNfcmVzCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKKwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgZG9uZQorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX29wZW5kaXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYnJlYWsKIGZpCitkb25lCitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9vcGVuZGlyK3NldH0iID0gc2V0OyB0aGVuCisgIDoKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX29wZW5kaXI9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX29wZW5kaXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9vcGVuZGlyIiA+JjYKLWlmIHRlc3QgIiRhY19jdl9zZWFyY2hfb3BlbmRpciIgIT0gbm87IHRoZW4KLSAgdGVzdCAiJGFjX2N2X3NlYXJjaF9vcGVuZGlyIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfY3Zfc2VhcmNoX29wZW5kaXIgJExJQlMiCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfb3BlbmRpciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2VhcmNoX29wZW5kaXIiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfb3BlbmRpcgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKIAogZmkKIAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3lzL3R5cGVzLmggZGVmaW5lcyBtYWtlZGV2IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBzeXMvdHlwZXMuaCBkZWZpbmVzIG1ha2VkZXYuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHN5cy90eXBlcy5oIGRlZmluZXMgbWFrZWRldiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3lzL3R5cGVzLmggZGVmaW5lcyBtYWtlZGV2Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRlditzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtNTA1OSwyOCArNTYyOSwyOSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldj1ubworCWFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zeXNfdHlwZXNfaF9tYWtlZGV2IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXYiID4mNjsgfQogCiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldiA9IG5vOyB0aGVuCiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN5cy9ta2Rldi5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN5cy9ta2Rldi5oLi4uICRFQ0hPX0MiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3lzL21rZGV2LmgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3lzL21rZGV2LmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3lzX21rZGV2X2giID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3lzX21rZGV2X2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaCIgPiY2OyB9CiBlbHNlCiAgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHN5cy9ta2Rldi5oIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHN5cy9ta2Rldi5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHN5cy9ta2Rldi5oIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHN5cy9ta2Rldi5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTUxMTYsMTUgKzU2ODcsMTYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGVhZGVyX2NvbXBpbGVyPW5vCisJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQogCiAjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzeXMvbWtkZXYuaCBwcmVzZW5jZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHN5cy9ta2Rldi5oIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc3lzL21rZGV2LmggcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzeXMvbWtkZXYuaCBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTUxNTgsOSArNTczMCwxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTUxODQsMjUgKzU3NTcsMjMgQEAKIGVjaG8gIiRhc19tZTogV0FSTklORzogc3lzL21rZGV2Lmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQogICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHN5cy9ta2Rldi5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQogZWNobyAiJGFzX21lOiBXQVJOSU5HOiBzeXMvbWtkZXYuaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotICAgICgKLSAgICAgIGNhdCA8PFxfQVNCT1gKKyAgICAoIGNhdCA8PFxfQVNCT1gKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogIyMgUmVwb3J0IHRoaXMgdG8gaHR0cDovL3d3dy5weXRob24ub3JnL3B5dGhvbi1idWdzICMjCiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKIF9BU0JPWAotICAgICkgfAotICAgICAgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKICAgICA7OwogZXNhYwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzeXMvbWtkZXYuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzeXMvbWtkZXYuaC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzeXMvbWtkZXYuaCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzeXMvbWtkZXYuaC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGFjX2N2X2hlYWRlcl9zeXNfbWtkZXZfaD0kYWNfaGVhZGVyX3ByZXByb2MKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3lzX21rZGV2X2giID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3lzX21rZGV2X2giID4mNjsgfQogCiBmaQogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oID0geWVzOyB0aGVuCkBAIC01MjE3LDE3ICs1Nzg4LDE3IEBACiAKICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c19ta2Rldl9oID0gbm87IHRoZW4KICAgICBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zeXNfc3lzbWFjcm9zX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzeXMvc3lzbWFjcm9zLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3lzL3N5c21hY3Jvcy5oLi4uICRFQ0hPX0MiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3lzL3N5c21hY3Jvcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN5cy9zeXNtYWNyb3MuaC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N5c19zeXNtYWNyb3NfaCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3lzX3N5c21hY3Jvc19oIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3lzX3N5c21hY3Jvc19oIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zeXNfc3lzbWFjcm9zX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zeXNfc3lzbWFjcm9zX2giID4mNjsgfQogZWxzZQogICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzeXMvc3lzbWFjcm9zLmggdXNhYmlsaXR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc3lzL3N5c21hY3Jvcy5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHN5cy9zeXNtYWNyb3MuaCB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzeXMvc3lzbWFjcm9zLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtNTI2MywxNSArNTgzNCwxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19oZWFkZXJfY29tcGlsZXI9bm8KKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKICMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHN5cy9zeXNtYWNyb3MuaCBwcmVzZW5jZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHN5cy9zeXNtYWNyb3MuaCBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHN5cy9zeXNtYWNyb3MuaCBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHN5cy9zeXNtYWNyb3MuaCBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTUzMDUsOSArNTg3NywxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTUzMzEsMjUgKzU5MDQsMjMgQEAKIGVjaG8gIiRhc19tZTogV0FSTklORzogc3lzL3N5c21hY3Jvcy5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBzeXMvc3lzbWFjcm9zLmg6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CiBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHN5cy9zeXNtYWNyb3MuaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotICAgICgKLSAgICAgIGNhdCA8PFxfQVNCT1gKKyAgICAoIGNhdCA8PFxfQVNCT1gKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogIyMgUmVwb3J0IHRoaXMgdG8gaHR0cDovL3d3dy5weXRob24ub3JnL3B5dGhvbi1idWdzICMjCiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKIF9BU0JPWAotICAgICkgfAotICAgICAgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCisgICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKICAgICA7OwogZXNhYwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzeXMvc3lzbWFjcm9zLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3lzL3N5c21hY3Jvcy5oLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN5cy9zeXNtYWNyb3MuaCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzeXMvc3lzbWFjcm9zLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9zeXNfc3lzbWFjcm9zX2grc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgYWNfY3ZfaGVhZGVyX3N5c19zeXNtYWNyb3NfaD0kYWNfaGVhZGVyX3ByZXByb2MKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N5c19zeXNtYWNyb3NfaCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3N5c19zeXNtYWNyb3NfaCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfc3lzX3N5c21hY3Jvc19oIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfc3lzX3N5c21hY3Jvc19oIiA+JjY7IH0KIAogZmkKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfc3lzbWFjcm9zX2ggPSB5ZXM7IHRoZW4KQEAgLTUzNzAsOSArNTk0MSw5IEBACiBmb3IgYWNfaGVhZGVyIGluIHRlcm0uaAogZG8KIGFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX0hlYWRlcitzZXR9XCIgPSBzZXQiOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTU0MTUsMTIgKzU5ODYsMTQgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKKwlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCkBAIC01NDM2LDkgKzYwMDksOSBAQAogZm9yIGFjX2hlYWRlciBpbiBsaW51eC9uZXRsaW5rLmgKIGRvCiBhc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNgotaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY19IZWFkZXIrc2V0fVwiID0gc2V0IjsgdGhlbgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC01NDg0LDEyICs2MDU3LDE0IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCisJZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY1Ci1lY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCIgPiY2CithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQogaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQpAQCAtNTUwMiw4ICs2MDc3LDggQEAKIAogIyBjaGVja3MgZm9yIHR5cGVkZWZzCiB3YXNfaXRfZGVmaW5lZD1ubwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjbG9ja190IGluIHRpbWUuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBjbG9ja190IGluIHRpbWUuaC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjbG9ja190IGluIHRpbWUuaCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBjbG9ja190IGluIHRpbWUuaC4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTU1MjcsMTIgKzYxMDIsMTIgQEAKIGZpCiBybSAtZiBjb25mdGVzdCoKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdhc19pdF9kZWZpbmVkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR3YXNfaXRfZGVmaW5lZCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3YXNfaXRfZGVmaW5lZCIgPiY1CitlY2hvICIke0VDSE9fVH0kd2FzX2l0X2RlZmluZWQiID4mNjsgfQogCiAjIENoZWNrIHdoZXRoZXIgdXNpbmcgbWFrZWRldiByZXF1aXJlcyBkZWZpbmluZyBfT1NGX1NPVVJDRQotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtYWtlZGV2IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1ha2VkZXYuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbWFrZWRldiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtYWtlZGV2Li4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtNTU3NCw4ICs2MTQ5LDkgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfaGFzX21ha2VkZXY9bm8KKwlhY19jdl9oYXNfbWFrZWRldj1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGlmIHRlc3QgIiRhY19jdl9oYXNfbWFrZWRldiIgPSAibm8iOyB0aGVuCkBAIC01NjI0LDggKzYyMDAsOSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9oYXNfbWFrZWRldj1ubworCWFjX2N2X2hhc19tYWtlZGV2PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogICAgIGlmIHRlc3QgIiRhY19jdl9oYXNfbWFrZWRldiIgPSAieWVzIjsgdGhlbgpAQCAtNTYzNiw4ICs2MjEzLDggQEAKIAogICAgIGZpCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhc19tYWtlZGV2IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oYXNfbWFrZWRldiIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oYXNfbWFrZWRldiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGFzX21ha2VkZXYiID4mNjsgfQogaWYgdGVzdCAiJGFjX2N2X2hhc19tYWtlZGV2IiA9ICJ5ZXMiOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCkBAIC01NjU0LDggKzYyMzEsOCBAQAogIyB3b3JrLWFyb3VuZCwgZGlzYWJsZSBMRlMgb24gc3VjaCBjb25maWd1cmF0aW9ucwogCiB1c2VfbGZzPXllcwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIFNvbGFyaXMgTEZTIGJ1ZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIFNvbGFyaXMgTEZTIGJ1Zy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIFNvbGFyaXMgTEZTIGJ1ZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIFNvbGFyaXMgTEZTIGJ1Zy4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTU3MDEsMTEgKzYyNzgsMTIgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotc29sX2xmc19idWc9eWVzCisJc29sX2xmc19idWc9eWVzCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkc29sX2xmc19idWciID4mNQotZWNobyAiJHtFQ0hPX1R9JHNvbF9sZnNfYnVnIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHNvbF9sZnNfYnVnIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRzb2xfbGZzX2J1ZyIgPiY2OyB9CiBpZiB0ZXN0ICIkc29sX2xmc19idWciID0gInllcyI7IHRoZW4KICAgdXNlX2xmcz1ubwogZmkKQEAgLTU3MzMsOCArNjMxMSw4IEBACiBFT0YKIAogIyBUeXBlIGF2YWlsYWJpbGl0eSBjaGVja3MKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbW9kZV90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1vZGVfdC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtb2RlX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbW9kZV90Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl90eXBlX21vZGVfdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtNTc0NSwxMiArNjMyMywxMyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgbW9kZV90IGFjX190eXBlX25ld187CiBpbnQKIG1haW4gKCkKIHsKLWlmICgobW9kZV90ICopIDApCitpZiAoKGFjX190eXBlX25ld18gKikgMCkKICAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChtb2RlX3QpKQoraWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCiAgIHJldHVybiAwOwogICA7CiAgIHJldHVybiAwOwpAQCAtNTc4MiwxMiArNjM2MSwxMyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl90eXBlX21vZGVfdD1ubworCWFjX2N2X3R5cGVfbW9kZV90PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfbW9kZV90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX21vZGVfdCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX21vZGVfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9tb2RlX3QiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfdHlwZV9tb2RlX3QgPSB5ZXM7IHRoZW4KICAgOgogZWxzZQpAQCAtNTc5OCw4ICs2Mzc4LDggQEAKIAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvZmZfdC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvZmZfdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9vZmZfdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtNTgxMCwxMiArNjM5MCwxMyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgb2ZmX3QgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKChvZmZfdCAqKSAwKQoraWYgKChhY19fdHlwZV9uZXdfICopIDApCiAgIHJldHVybiAwOwotaWYgKHNpemVvZiAob2ZmX3QpKQoraWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCiAgIHJldHVybiAwOwogICA7CiAgIHJldHVybiAwOwpAQCAtNTg0NywyNCArNjQyOCwyNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl90eXBlX29mZl90PW5vCisJYWNfY3ZfdHlwZV9vZmZfdD1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX29mZl90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX29mZl90IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfb2ZmX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfb2ZmX3QiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IHllczsgdGhlbgogICA6CiBlbHNlCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZworI2RlZmluZSBvZmZfdCBsb25nIGludAogX0FDRU9GCiAKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGlkX3QuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGlkX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGlkX3QuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfcGlkX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTU4NzUsMTIgKzY0NTcsMTMgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIHBpZF90IGFjX190eXBlX25ld187CiBpbnQKIG1haW4gKCkKIHsKLWlmICgocGlkX3QgKikgMCkKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQogICByZXR1cm4gMDsKLWlmIChzaXplb2YgKHBpZF90KSkKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQogICByZXR1cm4gMDsKICAgOwogICByZXR1cm4gMDsKQEAgLTU5MTIsMTIgKzY0OTUsMTMgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV9waWRfdD1ubworCWFjX2N2X3R5cGVfcGlkX3Q9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9waWRfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9waWRfdCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3BpZF90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3BpZF90IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X3R5cGVfcGlkX3QgPSB5ZXM7IHRoZW4KICAgOgogZWxzZQpAQCAtNTkyOCw4ICs2NTEyLDggQEAKIAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zaWduYWwrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTU5NDEsMTkgKzY1MjUsMTEgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBzaWduYWwKLSMgdW5kZWYgc2lnbmFsCi0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB2b2lkICgqc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOwotI2Vsc2UKLXZvaWQgKCpzaWduYWwgKCkpICgpOwotI2VuZGlmCiAKIGludAogbWFpbiAoKQogewotaW50IGk7CityZXR1cm4gKihzaWduYWwgKDAsIDApKSAoMCkgPT0gMTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTU5NzksMjUgKzY1NTUsMjYgQEAKICAgYWNfc3RhdHVzPSQ/CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV9zaWduYWw9aW50CisJYWNfY3ZfdHlwZV9zaWduYWw9dm9pZAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpZ25hbCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaWduYWwiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaWduYWwiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2lnbmFsIiA+JjY7IH0KIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBSRVRTSUdUWVBFICRhY19jdl90eXBlX3NpZ25hbAogX0FDRU9GCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2l6ZV90Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaXplX3QuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfc2l6ZV90K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC02MDA4LDEyICs2NTg1LDEzIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBzaXplX3QgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKChzaXplX3QgKikgMCkKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQogICByZXR1cm4gMDsKLWlmIChzaXplb2YgKHNpemVfdCkpCitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKICAgcmV0dXJuIDA7CiAgIDsKICAgcmV0dXJuIDA7CkBAIC02MDQ1LDI0ICs2NjIzLDI1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3R5cGVfc2l6ZV90PW5vCisJYWNfY3ZfdHlwZV9zaXplX3Q9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2l6ZV90IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2l6ZV90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NpemVfdCIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IHllczsgdGhlbgogICA6CiBlbHNlCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCisjZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBpbnQKIF9BQ0VPRgogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVpZF90IGluIHN5cy90eXBlcy5oLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl90eXBlX3VpZF90K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC02MDg0LDggKzY2NjMsOCBAQAogcm0gLWYgY29uZnRlc3QqCiAKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aWRfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV91aWRfdCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpZF90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VpZF90IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X3R5cGVfdWlkX3QgPSBubzsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtNjA5OSw4ICs2Njc4LDggQEAKIAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzc2l6ZV90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNzaXplX3QuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3NpemVfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzc2l6ZV90Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl90eXBlX3NzaXplX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTYxMTEsMTIgKzY2OTAsMTMgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIHNzaXplX3QgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKChzc2l6ZV90ICopIDApCitpZiAoKGFjX190eXBlX25ld18gKikgMCkKICAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChzc2l6ZV90KSkKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQogICByZXR1cm4gMDsKICAgOwogICByZXR1cm4gMDsKQEAgLTYxNDgsMTIgKzY3MjgsMTMgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV9zc2l6ZV90PW5vCisJYWNfY3ZfdHlwZV9zc2l6ZV90PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc3NpemVfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zc2l6ZV90IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc3NpemVfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zc2l6ZV90IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X3R5cGVfc3NpemVfdCA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtNjE2NSw4ICs2NzQ2LDggQEAKIAogIyBTaXplcyBvZiB2YXJpb3VzIGNvbW1vbiBiYXNpYyB0eXBlcwogIyBBTlNJIEMgcmVxdWlyZXMgc2l6ZW9mKGNoYXIpID09IDEsIHNvIG5vIG5lZWQgdG8gY2hlY2sgaXQKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGludC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW50Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl90eXBlX2ludCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtNjE3NywxMiArNjc1OCwxMyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgaW50IGFjX190eXBlX25ld187CiBpbnQKIG1haW4gKCkKIHsKLWlmICgoaW50ICopIDApCitpZiAoKGFjX190eXBlX25ld18gKikgMCkKICAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChpbnQpKQoraWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCiAgIHJldHVybiAwOwogICA7CiAgIHJldHVybiAwOwpAQCAtNjIxNCwyMCArNjc5NiwyMSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl90eXBlX2ludD1ubworCWFjX2N2X3R5cGVfaW50PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2ludCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQiID4mNjsgfQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBpbnQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGludC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgaW50IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBpbnQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9pbnQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50IiA9IHllczsgdGhlbgotICAjIFRoZSBjYXN0IHRvIHVuc2lnbmVkIGxvbmcgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCiAgICMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKICAgIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCiAgICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCkBAIC02MjQwLDEwICs2ODIzLDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGludCkpKSA+PSAwKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTYyODAsMTAgKzY4NjQsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgaW50IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoaW50KSkpIDw9ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtNjMxNiwzMCArNjkwMSwzMiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAkYWNfbWlkICsgMWAKLQkJICAgIGlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCi0JCSAgICAgIGFjX2xvPSBhY19oaT0KLQkJICAgICAgYnJlYWsKLQkJICAgIGZpCi0JCSAgICBhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKIGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChpbnQpKSkgPCAwKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtNjM3NiwxMCArNjk2MywxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChpbnQpKSkgPj0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC02NDEyLDIzICs3MDAwLDI2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0JCSAgICAgICBpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJIGFjX2xvPSBhY19oaT0KLQkJCSBicmVhawotCQkgICAgICAgZmkKLQkJICAgICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89IGFjX2hpPQorCWFjX2xvPSBhY19oaT0KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCiB3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCkBAIC02NDQwLDEwICs3MDMxLDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGludCkpKSA8PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTY0NzYsMjQgKzcwNjgsMjAgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2ZfaW50PSRhY19sbzs7Ci0nJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpLCA3NworJycpIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpLCA3NworZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0gOzsKIGVzYWMKIGVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtNjUwMSw4ICs3MDg5LDkgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0Ci1sb25nIGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcpIChzaXplb2YgKGludCkpOyB9Ci11bnNpZ25lZCBsb25nIHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nKSAoc2l6ZW9mIChpbnQpKTsgfQorCQkgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiBpbnQKQEAgLTY1MTEsMjIgKzcxMDAsMjIgQEAKIAogICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwogICBpZiAoISBmKQotICAgIGV4aXQgKDEpOwotICBpZiAoKChsb25nKSAoc2l6ZW9mIChpbnQpKSkgPCAwKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCiAgICAgewotICAgICAgbG9uZyBpID0gbG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAoaW50KSkpKQotCWV4aXQgKDEpOworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOwogICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CiAgICAgfQogICBlbHNlCiAgICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpID0gdWxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcpIChzaXplb2YgKGludCkpKSkKLQlleGl0ICgxKTsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CiAgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKICAgICB9Ci0gIGV4aXQgKGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwKTsKKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwogCiAgIDsKICAgcmV0dXJuIDA7CkBAIC02NTUwLDI5ICs3MTM5LDI4IEBACiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKICggZXhpdCAkYWNfc3RhdHVzICkKLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KSwgNzcKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpLCA3NworZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHJtIC1mIGNvbmZ0ZXN0LnZhbAogZWxzZQogICBhY19jdl9zaXplb2ZfaW50PTAKIGZpCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9pbnQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9pbnQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2ludCIgPiY2OyB9CiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKIF9BQ0VPRgogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbG9uZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9uZy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9sb25nK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC02NTgzLDEyICs3MTcxLDEzIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBsb25nIGFjX190eXBlX25ld187CiBpbnQKIG1haW4gKCkKIHsKLWlmICgobG9uZyAqKSAwKQoraWYgKChhY19fdHlwZV9uZXdfICopIDApCiAgIHJldHVybiAwOwotaWYgKHNpemVvZiAobG9uZykpCitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKICAgcmV0dXJuIDA7CiAgIDsKICAgcmV0dXJuIDA7CkBAIC02NjIwLDIwICs3MjA5LDIxIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3R5cGVfbG9uZz1ubworCWFjX2N2X3R5cGVfbG9uZz1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbG9uZyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbG9uZyIgPiY2OyB9CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGxvbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGxvbmcuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGxvbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9sb25nK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmciID0geWVzOyB0aGVuCi0gICMgVGhlIGNhc3QgdG8gdW5zaWduZWQgbG9uZyB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyAgIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKICAgIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogICAjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KICAgIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KQEAgLTY2NDYsMTAgKzcyMzYsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGxvbmcpKSkgPj0gMCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC02Njg2LDEwICs3Mjc3LDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChsb25nKSkpIDw9ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtNjcyMiwzMCArNzMxNCwzMiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAkYWNfbWlkICsgMWAKLQkJICAgIGlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCi0JCSAgICAgIGFjX2xvPSBhY19oaT0KLQkJICAgICAgYnJlYWsKLQkJICAgIGZpCi0JCSAgICBhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKIGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAobG9uZykpKSA8IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC02NzgyLDEwICs3Mzc2LDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChsb25nKSkpID49ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtNjgxOCwyMyArNzQxMywyNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAotCQkgICAgICAgaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KLQkJCSBhY19sbz0gYWNfaGk9Ci0JCQkgYnJlYWsKLQkJICAgICAgIGZpCi0JCSAgICAgICBhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKKwlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2xvPSBhY19oaT0KKwlhY19sbz0gYWNfaGk9CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwpAQCAtNjg0NiwxMCArNzQ0NCwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAobG9uZykpKSA8PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTY4ODIsMjQgKzc0ODEsMjAgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2ZfbG9uZz0kYWNfbG87OwotJycpIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyksIDc3CisnJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKSwgNzcKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZykKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfSA7OwogZXNhYwogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC02OTA3LDggKzc1MDIsOSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWxvbmcgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAobG9uZykpOyB9Ci11bnNpZ25lZCBsb25nIHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nKSAoc2l6ZW9mIChsb25nKSk7IH0KKwkJICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIGludApAQCAtNjkxNywyMiArNzUxMywyMiBAQAogCiAgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgIGlmICghIGYpCi0gICAgZXhpdCAoMSk7Ci0gIGlmICgoKGxvbmcpIChzaXplb2YgKGxvbmcpKSkgPCAwKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCiAgICAgewotICAgICAgbG9uZyBpID0gbG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAobG9uZykpKSkKLQlleGl0ICgxKTsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mIChsb25nKSkpKQotCWV4aXQgKDEpOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwogICAgIH0KLSAgZXhpdCAoZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDApOworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTY5NTYsMjkgKzc1NTIsMjggQEAKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAogKCBleGl0ICRhY19zdGF0dXMgKQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKSwgNzcKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZykKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHJtIC1mIGNvbmZ0ZXN0LnZhbAogZWxzZQogICBhY19jdl9zaXplb2ZfbG9uZz0wCiBmaQogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2xvbmciID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9sb25nIiA+JjY7IH0KIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgU0laRU9GX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nCiBfQUNFT0YKIAogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHZvaWQgKiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB2b2lkICouLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igdm9pZCAqIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHZvaWQgKi4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV92b2lkX3Arc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTY5ODksMTIgKzc1ODQsMTMgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIHZvaWQgKiBhY19fdHlwZV9uZXdfOwogaW50CiBtYWluICgpCiB7Ci1pZiAoKHZvaWQgKiAqKSAwKQoraWYgKChhY19fdHlwZV9uZXdfICopIDApCiAgIHJldHVybiAwOwotaWYgKHNpemVvZiAodm9pZCAqKSkKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQogICByZXR1cm4gMDsKICAgOwogICByZXR1cm4gMDsKQEAgLTcwMjYsMjAgKzc2MjIsMjEgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV92b2lkX3A9bm8KKwlhY19jdl90eXBlX3ZvaWRfcD1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3ZvaWRfcCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV92b2lkX3AiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV92b2lkX3AiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdm9pZF9wIiA+JjY7IH0KIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2Ygdm9pZCAqIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiB2b2lkICouLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIHZvaWQgKiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2Ygdm9pZCAqLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfdm9pZF9wK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgIiRhY19jdl90eXBlX3ZvaWRfcCIgPSB5ZXM7IHRoZW4KLSAgIyBUaGUgY2FzdCB0byB1bnNpZ25lZCBsb25nIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorICAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogICAjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCiAgICMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgogICAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgpAQCAtNzA1MiwxMCArNzY0OSwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiB2b2lkICogYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mICh2b2lkICopKSkgPj0gMCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC03MDkyLDEwICs3NjkwLDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIHZvaWQgKiBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKHZvaWQgKikpKSA8PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTcxMjgsMzAgKzc3MjcsMzIgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCSAgICBpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkgICAgICBhY19sbz0gYWNfaGk9Ci0JCSAgICAgIGJyZWFrCi0JCSAgICBmaQotCQkgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgdm9pZCAqIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAodm9pZCAqKSkpIDwgMCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTcxODgsMTAgKzc3ODksMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgdm9pZCAqIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAodm9pZCAqKSkpID49ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtNzIyNCwyMyArNzgyNiwyNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAotCQkgICAgICAgaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KLQkJCSBhY19sbz0gYWNfaGk9Ci0JCQkgYnJlYWsKLQkJICAgICAgIGZpCi0JCSAgICAgICBhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKKwlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2xvPSBhY19oaT0KKwlhY19sbz0gYWNfaGk9CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwpAQCAtNzI1MiwxMCArNzg1NywxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiB2b2lkICogYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mICh2b2lkICopKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC03Mjg4LDI0ICs3ODk0LDIwIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCisJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX3ZvaWRfcD0kYWNfbG87OwotJycpIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodm9pZCAqKSwgNzcKKycnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHZvaWQgKikKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodm9pZCAqKSwgNzcKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodm9pZCAqKQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9IDs7CiBlc2FjCiBlbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1lbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTczMTMsOCArNzkxNSw5IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAotbG9uZyBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nKSAoc2l6ZW9mICh2b2lkICopKTsgfQotdW5zaWduZWQgbG9uZyB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAodm9pZCAqKSk7IH0KKwkJICAgdHlwZWRlZiB2b2lkICogYWNfX3R5cGVfc2l6ZW9mXzsKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogaW50CkBAIC03MzIzLDIyICs3OTI2LDIyIEBACiAKICAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKICAgaWYgKCEgZikKLSAgICBleGl0ICgxKTsKLSAgaWYgKCgobG9uZykgKHNpemVvZiAodm9pZCAqKSkpIDwgMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQogICAgIHsKLSAgICAgIGxvbmcgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcpIChzaXplb2YgKHZvaWQgKikpKSkKLQlleGl0ICgxKTsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mICh2b2lkICopKSkpCi0JZXhpdCAoMSk7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOwogICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CiAgICAgfQotICBleGl0IChmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMCk7CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtNzM2MiwyOSArNzk2NSwyOCBAQAogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCiAoIGV4aXQgJGFjX3N0YXR1cyApCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHZvaWQgKiksIDc3Cit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHZvaWQgKikKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodm9pZCAqKSwgNzcKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodm9pZCAqKQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBybSAtZiBjb25mdGVzdC52YWwKIGVsc2UKICAgYWNfY3Zfc2l6ZW9mX3ZvaWRfcD0wCiBmaQogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfdm9pZF9wIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2Zfdm9pZF9wIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl92b2lkX3AiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl92b2lkX3AiID4mNjsgfQogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBTSVpFT0ZfVk9JRF9QICRhY19jdl9zaXplb2Zfdm9pZF9wCiBfQUNFT0YKIAogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNob3J0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNob3J0Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNob3J0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl90eXBlX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC03Mzk1LDEyICs3OTk3LDEzIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBzaG9ydCBhY19fdHlwZV9uZXdfOwogaW50CiBtYWluICgpCiB7Ci1pZiAoKHNob3J0ICopIDApCitpZiAoKGFjX190eXBlX25ld18gKikgMCkKICAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChzaG9ydCkpCitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKICAgcmV0dXJuIDA7CiAgIDsKICAgcmV0dXJuIDA7CkBAIC03NDMyLDIwICs4MDM1LDIxIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3R5cGVfc2hvcnQ9bm8KKwlhY19jdl90eXBlX3Nob3J0PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2hvcnQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2hvcnQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaG9ydCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaG9ydCIgPiY2OyB9CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIHNob3J0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBzaG9ydC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfc2hvcnQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc2hvcnQiID0geWVzOyB0aGVuCi0gICMgVGhlIGNhc3QgdG8gdW5zaWduZWQgbG9uZyB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyAgIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKICAgIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogICAjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KICAgIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KQEAgLTc0NTgsMTAgKzgwNjIsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChzaG9ydCkpKSA+PSAwKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTc0OTgsMTAgKzgxMDMsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChzaG9ydCkpKSA8PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTc1MzQsMzAgKzgxNDAsMzIgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCSAgICBpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkgICAgICBhY19sbz0gYWNfaGk9Ci0JCSAgICAgIGJyZWFrCi0JCSAgICBmaQotCQkgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChzaG9ydCkpKSA8IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC03NTk0LDEwICs4MjAyLDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIHNob3J0IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoc2hvcnQpKSkgPj0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC03NjMwLDIzICs4MjM5LDI2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0JCSAgICAgICBpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJIGFjX2xvPSBhY19oaT0KLQkJCSBicmVhawotCQkgICAgICAgZmkKLQkJICAgICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89IGFjX2hpPQorCWFjX2xvPSBhY19oaT0KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCiB3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCkBAIC03NjU4LDEwICs4MjcwLDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIHNob3J0IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoc2hvcnQpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC03Njk0LDI0ICs4MzA3LDIwIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCisJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX3Nob3J0PSRhY19sbzs7Ci0nJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCksIDc3CisnJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2hvcnQpLCA3NworZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfSA7OwogZXNhYwogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC03NzE5LDggKzgzMjgsOSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWxvbmcgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAoc2hvcnQpKTsgfQotdW5zaWduZWQgbG9uZyB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAoc2hvcnQpKTsgfQorCQkgICB0eXBlZGVmIHNob3J0IGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIGludApAQCAtNzcyOSwyMiArODMzOSwyMiBAQAogCiAgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgIGlmICghIGYpCi0gICAgZXhpdCAoMSk7Ci0gIGlmICgoKGxvbmcpIChzaXplb2YgKHNob3J0KSkpIDwgMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQogICAgIHsKLSAgICAgIGxvbmcgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcpIChzaXplb2YgKHNob3J0KSkpKQotCWV4aXQgKDEpOworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOwogICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CiAgICAgfQogICBlbHNlCiAgICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpID0gdWxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcpIChzaXplb2YgKHNob3J0KSkpKQotCWV4aXQgKDEpOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwogICAgIH0KLSAgZXhpdCAoZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDApOworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTc3NjgsMjkgKzgzNzgsMjggQEAKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAogKCBleGl0ICRhY19zdGF0dXMgKQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCksIDc3Cit7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBybSAtZiBjb25mdGVzdC52YWwKIGVsc2UKICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKIGZpCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9zaG9ydCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9zaG9ydCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjY7IH0KIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgU0laRU9GX1NIT1JUICRhY19jdl9zaXplb2Zfc2hvcnQKIF9BQ0VPRgogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvYXQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmxvYXQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvYXQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmxvYXQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfZmxvYXQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTc4MDEsMTIgKzg0MTAsMTMgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIGZsb2F0IGFjX190eXBlX25ld187CiBpbnQKIG1haW4gKCkKIHsKLWlmICgoZmxvYXQgKikgMCkKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQogICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGZsb2F0KSkKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQogICByZXR1cm4gMDsKICAgOwogICByZXR1cm4gMDsKQEAgLTc4MzgsMjAgKzg0NDgsMjEgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV9mbG9hdD1ubworCWFjX2N2X3R5cGVfZmxvYXQ9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9mbG9hdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9mbG9hdCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2Zsb2F0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2Zsb2F0IiA+JjY7IH0KIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgZmxvYXQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGZsb2F0Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBmbG9hdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgZmxvYXQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3NpemVvZl9mbG9hdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9mbG9hdCIgPSB5ZXM7IHRoZW4KLSAgIyBUaGUgY2FzdCB0byB1bnNpZ25lZCBsb25nIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorICAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogICAjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCiAgICMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgogICAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgpAQCAtNzg2NCwxMCArODQ3NSwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBmbG9hdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGZsb2F0KSkpID49IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtNzkwNCwxMCArODUxNiwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBmbG9hdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGZsb2F0KSkpIDw9ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtNzk0MCwzMCArODU1MywzMiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAkYWNfbWlkICsgMWAKLQkJICAgIGlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCi0JCSAgICAgIGFjX2xvPSBhY19oaT0KLQkJICAgICAgYnJlYWsKLQkJICAgIGZpCi0JCSAgICBhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKIGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBmbG9hdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGZsb2F0KSkpIDwgMCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTgwMDAsMTAgKzg2MTUsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgZmxvYXQgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChmbG9hdCkpKSA+PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTgwMzYsMjMgKzg2NTIsMjYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLQkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCi0JCQkgYWNfbG89IGFjX2hpPQotCQkJIGJyZWFrCi0JCSAgICAgICBmaQotCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz0gYWNfaGk9CisJYWNfbG89IGFjX2hpPQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KQEAgLTgwNjQsMTAgKzg2ODMsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgZmxvYXQgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChmbG9hdCkpKSA8PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTgxMDAsMjQgKzg3MjAsMjAgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2ZfZmxvYXQ9JGFjX2xvOzsKLScnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZsb2F0KSwgNzcKKycnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZsb2F0KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChmbG9hdCksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZsb2F0KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9IDs7CiBlc2FjCiBlbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1lbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTgxMjUsOCArODc0MSw5IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAotbG9uZyBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nKSAoc2l6ZW9mIChmbG9hdCkpOyB9Ci11bnNpZ25lZCBsb25nIHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nKSAoc2l6ZW9mIChmbG9hdCkpOyB9CisJCSAgIHR5cGVkZWYgZmxvYXQgYWNfX3R5cGVfc2l6ZW9mXzsKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogaW50CkBAIC04MTM1LDIyICs4NzUyLDIyIEBACiAKICAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKICAgaWYgKCEgZikKLSAgICBleGl0ICgxKTsKLSAgaWYgKCgobG9uZykgKHNpemVvZiAoZmxvYXQpKSkgPCAwKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCiAgICAgewotICAgICAgbG9uZyBpID0gbG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAoZmxvYXQpKSkpCi0JZXhpdCAoMSk7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CiAgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGkgPSB1bG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAoZmxvYXQpKSkpCi0JZXhpdCAoMSk7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOwogICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CiAgICAgfQotICBleGl0IChmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMCk7CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtODE3NCwyOSArODc5MSwyOCBAQAogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCiAoIGV4aXQgJGFjX3N0YXR1cyApCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZsb2F0KSwgNzcKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoZmxvYXQpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZsb2F0KSwgNzcKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoZmxvYXQpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHJtIC1mIGNvbmZ0ZXN0LnZhbAogZWxzZQogICBhY19jdl9zaXplb2ZfZmxvYXQ9MAogZmkKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2Zsb2F0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfZmxvYXQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2Zsb2F0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfZmxvYXQiID4mNjsgfQogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBTSVpFT0ZfRkxPQVQgJGFjX2N2X3NpemVvZl9mbG9hdAogX0FDRU9GCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkb3VibGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZG91YmxlLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGRvdWJsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkb3VibGUuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfZG91YmxlK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC04MjA3LDEyICs4ODIzLDEzIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBkb3VibGUgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKChkb3VibGUgKikgMCkKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQogICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGRvdWJsZSkpCitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKICAgcmV0dXJuIDA7CiAgIDsKICAgcmV0dXJuIDA7CkBAIC04MjQ0LDIwICs4ODYxLDIxIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3R5cGVfZG91YmxlPW5vCisJYWNfY3ZfdHlwZV9kb3VibGU9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9kb3VibGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfZG91YmxlIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfZG91YmxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2RvdWJsZSIgPiY2OyB9CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGRvdWJsZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgZG91YmxlLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBkb3VibGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGRvdWJsZS4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2RvdWJsZStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9kb3VibGUiID0geWVzOyB0aGVuCi0gICMgVGhlIGNhc3QgdG8gdW5zaWduZWQgbG9uZyB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyAgIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKICAgIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogICAjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KICAgIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KQEAgLTgyNzAsMTAgKzg4ODgsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoZG91YmxlKSkpID49IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtODMxMCwxMCArODkyOSwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBkb3VibGUgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChkb3VibGUpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC04MzQ2LDMwICs4OTY2LDMyIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2xvPWBleHByICRhY19taWQgKyAxYAotCQkgICAgaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KLQkJICAgICAgYWNfbG89IGFjX2hpPQotCQkgICAgICBicmVhawotCQkgICAgZmkKLQkJICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgogY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGRvdWJsZSkpKSA8IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC04NDA2LDEwICs5MDI4LDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGRvdWJsZSBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGRvdWJsZSkpKSA+PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTg0NDIsMjMgKzkwNjUsMjYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLQkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCi0JCQkgYWNfbG89IGFjX2hpPQotCQkJIGJyZWFrCi0JCSAgICAgICBmaQotCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz0gYWNfaGk9CisJYWNfbG89IGFjX2hpPQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KQEAgLTg0NzAsMTAgKzkwOTYsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoZG91YmxlKSkpIDw9ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtODUwNiwyNCArOTEzMywyMCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9kb3VibGU9JGFjX2xvOzsKLScnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSksIDc3CisnJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfSA7OwogZXNhYwogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC04NTMxLDggKzkxNTQsOSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWxvbmcgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAoZG91YmxlKSk7IH0KLXVuc2lnbmVkIGxvbmcgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcpIChzaXplb2YgKGRvdWJsZSkpOyB9CisJCSAgIHR5cGVkZWYgZG91YmxlIGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIGludApAQCAtODU0MSwyMiArOTE2NSwyMiBAQAogCiAgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgIGlmICghIGYpCi0gICAgZXhpdCAoMSk7Ci0gIGlmICgoKGxvbmcpIChzaXplb2YgKGRvdWJsZSkpKSA8IDApCisgICAgcmV0dXJuIDE7CisgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKICAgICB7Ci0gICAgICBsb25nIGkgPSBsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mIChkb3VibGUpKSkpCi0JZXhpdCAoMSk7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CiAgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGkgPSB1bG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAoZG91YmxlKSkpKQotCWV4aXQgKDEpOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwogICAgIH0KLSAgZXhpdCAoZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDApOworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTg1ODAsMjkgKzkyMDQsMjggQEAKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAogKCBleGl0ICRhY19zdGF0dXMgKQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpLCA3NworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChkb3VibGUpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGRvdWJsZSkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogcm0gLWYgY29uZnRlc3QudmFsCiBlbHNlCiAgIGFjX2N2X3NpemVvZl9kb3VibGU9MAogZmkKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2RvdWJsZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2RvdWJsZSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfZG91YmxlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfZG91YmxlIiA+JjY7IH0KIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgU0laRU9GX0RPVUJMRSAkYWNfY3Zfc2l6ZW9mX2RvdWJsZQogX0FDRU9GCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmcG9zX3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZnBvc190Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZwb3NfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBmcG9zX3QuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfZnBvc190K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC04NjEzLDEyICs5MjM2LDEzIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBmcG9zX3QgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKChmcG9zX3QgKikgMCkKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQogICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGZwb3NfdCkpCitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKICAgcmV0dXJuIDA7CiAgIDsKICAgcmV0dXJuIDA7CkBAIC04NjUwLDIwICs5Mjc0LDIxIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3R5cGVfZnBvc190PW5vCisJYWNfY3ZfdHlwZV9mcG9zX3Q9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9mcG9zX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfZnBvc190IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfZnBvc190IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2Zwb3NfdCIgPiY2OyB9CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGZwb3NfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgZnBvc190Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBmcG9zX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGZwb3NfdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2Zwb3NfdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9mcG9zX3QiID0geWVzOyB0aGVuCi0gICMgVGhlIGNhc3QgdG8gdW5zaWduZWQgbG9uZyB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyAgIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKICAgIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogICAjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KICAgIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KQEAgLTg2NzYsMTAgKzkzMDEsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgZnBvc190IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoZnBvc190KSkpID49IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtODcxNiwxMCArOTM0MiwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBmcG9zX3QgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChmcG9zX3QpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC04NzUyLDMwICs5Mzc5LDMyIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2xvPWBleHByICRhY19taWQgKyAxYAotCQkgICAgaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KLQkJICAgICAgYWNfbG89IGFjX2hpPQotCQkgICAgICBicmVhawotCQkgICAgZmkKLQkJICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgogY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGZwb3NfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGZwb3NfdCkpKSA8IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC04ODEyLDEwICs5NDQxLDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGZwb3NfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGZwb3NfdCkpKSA+PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTg4NDgsMjMgKzk0NzgsMjYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLQkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCi0JCQkgYWNfbG89IGFjX2hpPQotCQkJIGJyZWFrCi0JCSAgICAgICBmaQotCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz0gYWNfaGk9CisJYWNfbG89IGFjX2hpPQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KQEAgLTg4NzYsMTAgKzk1MDksMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgZnBvc190IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoZnBvc190KSkpIDw9ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtODkxMiwyNCArOTU0NiwyMCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9mcG9zX3Q9JGFjX2xvOzsKLScnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZwb3NfdCksIDc3CisnJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChmcG9zX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZwb3NfdCksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZwb3NfdCkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfSA7OwogZXNhYwogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC04OTM3LDggKzk1NjcsOSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWxvbmcgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAoZnBvc190KSk7IH0KLXVuc2lnbmVkIGxvbmcgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcpIChzaXplb2YgKGZwb3NfdCkpOyB9CisJCSAgIHR5cGVkZWYgZnBvc190IGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIGludApAQCAtODk0NywyMiArOTU3OCwyMiBAQAogCiAgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgIGlmICghIGYpCi0gICAgZXhpdCAoMSk7Ci0gIGlmICgoKGxvbmcpIChzaXplb2YgKGZwb3NfdCkpKSA8IDApCisgICAgcmV0dXJuIDE7CisgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKICAgICB7Ci0gICAgICBsb25nIGkgPSBsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mIChmcG9zX3QpKSkpCi0JZXhpdCAoMSk7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CiAgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGkgPSB1bG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAoZnBvc190KSkpKQotCWV4aXQgKDEpOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwogICAgIH0KLSAgZXhpdCAoZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDApOworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTg5ODYsMjkgKzk2MTcsMjggQEAKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAogKCBleGl0ICRhY19zdGF0dXMgKQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChmcG9zX3QpLCA3NworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChmcG9zX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZwb3NfdCksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGZwb3NfdCkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogcm0gLWYgY29uZnRlc3QudmFsCiBlbHNlCiAgIGFjX2N2X3NpemVvZl9mcG9zX3Q9MAogZmkKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2Zwb3NfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2Zwb3NfdCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfZnBvc190IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfZnBvc190IiA+JjY7IH0KIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgU0laRU9GX0ZQT1NfVCAkYWNfY3Zfc2l6ZW9mX2Zwb3NfdAogX0FDRU9GCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2l6ZV90Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzaXplX3QuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfc2l6ZV90K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC05MDE5LDEyICs5NjQ5LDEzIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBzaXplX3QgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKChzaXplX3QgKikgMCkKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQogICByZXR1cm4gMDsKLWlmIChzaXplb2YgKHNpemVfdCkpCitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKICAgcmV0dXJuIDA7CiAgIDsKICAgcmV0dXJuIDA7CkBAIC05MDU2LDIwICs5Njg3LDIxIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3R5cGVfc2l6ZV90PW5vCisJYWNfY3ZfdHlwZV9zaXplX3Q9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2l6ZV90IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2l6ZV90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NpemVfdCIgPiY2OyB9CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIHNpemVfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2Ygc2l6ZV90Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBzaXplX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIHNpemVfdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3NpemVfdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zaXplX3QiID0geWVzOyB0aGVuCi0gICMgVGhlIGNhc3QgdG8gdW5zaWduZWQgbG9uZyB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyAgIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKICAgIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwogICAjIGRlY2xhcmF0aW9ucyBsaWtlIGBpbnQgYTNbWyhzaXplb2YgKHVuc2lnbmVkIGNoYXIpKSA+PSAwXV07Jy4KICAgIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KQEAgLTkwODIsMTAgKzk3MTQsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgc2l6ZV90IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoc2l6ZV90KSkpID49IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtOTEyMiwxMCArOTc1NSwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBzaXplX3QgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChzaXplX3QpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC05MTU4LDMwICs5NzkyLDMyIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2xvPWBleHByICRhY19taWQgKyAxYAotCQkgICAgaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KLQkJICAgICAgYWNfbG89IGFjX2hpPQotCQkgICAgICBicmVhawotCQkgICAgZmkKLQkJICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKKwlhY19sbz1gZXhwciAkYWNfbWlkICsgMWAKKwkJCWlmIHRlc3QgJGFjX2xvIC1sZSAkYWNfbWlkOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgogY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIHNpemVfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKHNpemVfdCkpKSA8IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC05MjE4LDEwICs5ODU0LDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIHNpemVfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKHNpemVfdCkpKSA+PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTkyNTQsMjMgKzk4OTEsMjYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLQkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCi0JCQkgYWNfbG89IGFjX2hpPQotCQkJIGJyZWFrCi0JCSAgICAgICBmaQotCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz0gYWNfaGk9CisJYWNfbG89IGFjX2hpPQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KQEAgLTkyODIsMTAgKzk5MjIsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgc2l6ZV90IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAoc2l6ZV90KSkpIDw9ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtOTMxOCwyNCArOTk1OSwyMCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9zaXplX3Q9JGFjX2xvOzsKLScnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNpemVfdCksIDc3CisnJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaXplX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNpemVfdCksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNpemVfdCkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfSA7OwogZXNhYwogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC05MzQzLDggKzk5ODAsOSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWxvbmcgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAoc2l6ZV90KSk7IH0KLXVuc2lnbmVkIGxvbmcgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcpIChzaXplb2YgKHNpemVfdCkpOyB9CisJCSAgIHR5cGVkZWYgc2l6ZV90IGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIGludApAQCAtOTM1MywyMiArOTk5MSwyMiBAQAogCiAgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgIGlmICghIGYpCi0gICAgZXhpdCAoMSk7Ci0gIGlmICgoKGxvbmcpIChzaXplb2YgKHNpemVfdCkpKSA8IDApCisgICAgcmV0dXJuIDE7CisgIGlmICgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCkKICAgICB7Ci0gICAgICBsb25nIGkgPSBsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mIChzaXplX3QpKSkpCi0JZXhpdCAoMSk7CisgICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CiAgICAgICBmcHJpbnRmIChmLCAiJWxkXG4iLCBpKTsKICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGkgPSB1bG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAoc2l6ZV90KSkpKQotCWV4aXQgKDEpOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwogICAgIH0KLSAgZXhpdCAoZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDApOworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTkzOTIsMzAgKzEwMDMwLDI5IEBACiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKICggZXhpdCAkYWNfc3RhdHVzICkKLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2l6ZV90KSwgNzcKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2l6ZV90KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaXplX3QpLCA3NworZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaXplX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHJtIC1mIGNvbmZ0ZXN0LnZhbAogZWxzZQogICBhY19jdl9zaXplb2Zfc2l6ZV90PTAKIGZpCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9zaXplX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9zaXplX3QiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3NpemVfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX3NpemVfdCIgPiY2OyB9CiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIFNJWkVPRl9TSVpFX1QgJGFjX2N2X3NpemVvZl9zaXplX3QKIF9BQ0VPRgogCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjY7IH0KIGhhdmVfbG9uZ19sb25nPW5vCiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwpAQCAtOTQ2NSwxMyArMTAxMDIsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAorCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGF2ZV9sb25nX2xvbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGhhdmVfbG9uZ19sb25nIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfbG9uZ19sb25nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXZlX2xvbmdfbG9uZyIgPiY2OyB9CiBpZiB0ZXN0ICIkaGF2ZV9sb25nX2xvbmciID0geWVzIDsgdGhlbgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIGxvbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9uZyBsb25nLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC05NDgyLDEyICsxMDEyMSwxMyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX25ld187CiBpbnQKIG1haW4gKCkKIHsKLWlmICgobG9uZyBsb25nICopIDApCitpZiAoKGFjX190eXBlX25ld18gKikgMCkKICAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChsb25nIGxvbmcpKQoraWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCiAgIHJldHVybiAwOwogICA7CiAgIHJldHVybiAwOwpAQCAtOTUxOSwyMCArMTAxNTksMjEgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV9sb25nX2xvbmc9bm8KKwlhY19jdl90eXBlX2xvbmdfbG9uZz1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmdfbG9uZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbG9uZ19sb25nIiA+JjY7IH0KIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgIiRhY19jdl90eXBlX2xvbmdfbG9uZyIgPSB5ZXM7IHRoZW4KLSAgIyBUaGUgY2FzdCB0byB1bnNpZ25lZCBsb25nIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorICAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogICAjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCiAgICMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgogICAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgpAQCAtOTU0NSwxMCArMTAxODYsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAobG9uZyBsb25nKSkpID49IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtOTU4NSwxMCArMTAyMjcsMTEgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAobG9uZyBsb25nKSkpIDw9ICRhY19taWQpXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwogdGVzdF9hcnJheSBbMF0gPSAwCiAKICAgOwpAQCAtOTYyMSwzMCArMTAyNjQsMzIgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCSAgICBpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkgICAgICBhY19sbz0gYWNfaGk9Ci0JCSAgICAgIGJyZWFrCi0JCSAgICBmaQotCQkgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAobG9uZyBsb25nKSkpIDwgMCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTk2ODEsMTAgKzEwMzI2LDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKGxvbmcgbG9uZykpKSA+PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTk3MTcsMjMgKzEwMzYzLDI2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0JCSAgICAgICBpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJIGFjX2xvPSBhY19oaT0KLQkJCSBicmVhawotCQkgICAgICAgZmkKLQkJICAgICAgIGFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89IGFjX2hpPQorCWFjX2xvPSBhY19oaT0KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCiB3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCkBAIC05NzQ1LDEwICsxMDM5NCwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mIChsb25nIGxvbmcpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC05NzgxLDI0ICsxMDQzMSwyMCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9JGFjX2xvOzsKLScnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZyksIDc3CisnJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZyksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfSA7OwogZXNhYwogZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC05ODA2LDggKzEwNDUyLDkgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0Ci1sb25nIGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcpIChzaXplb2YgKGxvbmcgbG9uZykpOyB9Ci11bnNpZ25lZCBsb25nIHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nKSAoc2l6ZW9mIChsb25nIGxvbmcpKTsgfQorCQkgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiBpbnQKQEAgLTk4MTYsMjIgKzEwNDYzLDIyIEBACiAKICAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKICAgaWYgKCEgZikKLSAgICBleGl0ICgxKTsKLSAgaWYgKCgobG9uZykgKHNpemVvZiAobG9uZyBsb25nKSkpIDwgMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQogICAgIHsKLSAgICAgIGxvbmcgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcpIChzaXplb2YgKGxvbmcgbG9uZykpKSkKLQlleGl0ICgxKTsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mIChsb25nIGxvbmcpKSkpCi0JZXhpdCAoMSk7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOwogICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CiAgICAgfQotICBleGl0IChmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMCk7CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtOTg1NSwyMiArMTA1MDIsMjEgQEAKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAogKCBleGl0ICRhY19zdGF0dXMgKQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpLCA3NworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZyksIDc3CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogcm0gLWYgY29uZnRlc3QudmFsCiBlbHNlCiAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAogZmkKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiA+JjY7IH0KIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgU0laRU9GX0xPTkdfTE9ORyAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZwogX0FDRU9GCkBAIC05ODc4LDggKzEwNTI0LDggQEAKIAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1aW50cHRyX3Qgc3VwcG9ydCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1aW50cHRyX3Qgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1aW50cHRyX3Qgc3VwcG9ydCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1aW50cHRyX3Qgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjY7IH0KIGhhdmVfdWludHB0cl90PW5vCiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwpAQCAtOTkyOSwxMyArMTA1NzUsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAorCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGF2ZV91aW50cHRyX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGhhdmVfdWludHB0cl90IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfdWludHB0cl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXZlX3VpbnRwdHJfdCIgPiY2OyB9CiBpZiB0ZXN0ICIkaGF2ZV91aW50cHRyX3QiID0geWVzIDsgdGhlbgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1aW50cHRyX3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdWludHB0cl90Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnRwdHJfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1aW50cHRyX3QuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfdWludHB0cl90K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC05OTQ2LDEyICsxMDU5NCwxMyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgdWludHB0cl90IGFjX190eXBlX25ld187CiBpbnQKIG1haW4gKCkKIHsKLWlmICgodWludHB0cl90ICopIDApCitpZiAoKGFjX190eXBlX25ld18gKikgMCkKICAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mICh1aW50cHRyX3QpKQoraWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCiAgIHJldHVybiAwOwogICA7CiAgIHJldHVybiAwOwpAQCAtOTk4MywyMCArMTA2MzIsMjEgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV91aW50cHRyX3Q9bm8KKwlhY19jdl90eXBlX3VpbnRwdHJfdD1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnRwdHJfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV91aW50cHRyX3QiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aW50cHRyX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdWludHB0cl90IiA+JjY7IH0KIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgdWludHB0cl90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiB1aW50cHRyX3QuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIHVpbnRwdHJfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgdWludHB0cl90Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfdWludHB0cl90K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGlmIHRlc3QgIiRhY19jdl90eXBlX3VpbnRwdHJfdCIgPSB5ZXM7IHRoZW4KLSAgIyBUaGUgY2FzdCB0byB1bnNpZ25lZCBsb25nIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorICAjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgogICAjIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCiAgICMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgogICAjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgpAQCAtMTAwMDksMTAgKzEwNjU5LDExIEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorCQkgICB0eXBlZGVmIHVpbnRwdHJfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKHVpbnRwdHJfdCkpKSA+PSAwKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49IDApXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTEwMDQ5LDEwICsxMDcwMCwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiB1aW50cHRyX3QgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mICh1aW50cHRyX3QpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC0xMDA4NSwzMCArMTA3MzcsMzIgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCSAgICBpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkgICAgICBhY19sbz0gYWNfaGk9Ci0JCSAgICAgIGJyZWFrCi0JCSAgICBmaQotCQkgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICRhY19pbmNsdWRlc19kZWZhdWx0CisJCSAgIHR5cGVkZWYgdWludHB0cl90IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAodWludHB0cl90KSkpIDwgMCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTEwMTQ1LDEwICsxMDc5OSwxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiB1aW50cHRyX3QgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mICh1aW50cHRyX3QpKSkgPj0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC0xMDE4MSwyMyArMTA4MzYsMjYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLQkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCi0JCQkgYWNfbG89IGFjX2hpPQotCQkJIGJyZWFrCi0JCSAgICAgICBmaQotCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz0gYWNfaGk9CisJYWNfbG89IGFjX2hpPQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KQEAgLTEwMjA5LDEwICsxMDg2NywxMSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKKwkJICAgdHlwZWRlZiB1aW50cHRyX3QgYWNfX3R5cGVfc2l6ZW9mXzsKIGludAogbWFpbiAoKQogewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nKSAoc2l6ZW9mICh1aW50cHRyX3QpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC0xMDI0NSwyNCArMTA5MDQsMjAgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2ZfdWludHB0cl90PSRhY19sbzs7Ci0nJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1aW50cHRyX3QpLCA3NworJycpIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodWludHB0cl90KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1aW50cHRyX3QpLCA3NworZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1aW50cHRyX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0gOzsKIGVzYWMKIGVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTAyNzAsOCArMTA5MjUsOSBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogJGFjX2luY2x1ZGVzX2RlZmF1bHQKLWxvbmcgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAodWludHB0cl90KSk7IH0KLXVuc2lnbmVkIGxvbmcgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcpIChzaXplb2YgKHVpbnRwdHJfdCkpOyB9CisJCSAgIHR5cGVkZWYgdWludHB0cl90IGFjX190eXBlX3NpemVvZl87CitzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KIGludApAQCAtMTAyODAsMjIgKzEwOTM2LDIyIEBACiAKICAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKICAgaWYgKCEgZikKLSAgICBleGl0ICgxKTsKLSAgaWYgKCgobG9uZykgKHNpemVvZiAodWludHB0cl90KSkpIDwgMCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQogICAgIHsKLSAgICAgIGxvbmcgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcpIChzaXplb2YgKHVpbnRwdHJfdCkpKSkKLQlleGl0ICgxKTsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mICh1aW50cHRyX3QpKSkpCi0JZXhpdCAoMSk7CisgICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOwogICAgICAgZnByaW50ZiAoZiwgIiVsdVxuIiwgaSk7CiAgICAgfQotICBleGl0IChmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMCk7CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKIAogICA7CiAgIHJldHVybiAwOwpAQCAtMTAzMTksMjIgKzEwOTc1LDIxIEBACiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKICggZXhpdCAkYWNfc3RhdHVzICkKLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodWludHB0cl90KSwgNzcKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAodWludHB0cl90KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1aW50cHRyX3QpLCA3NworZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh1aW50cHRyX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHJtIC1mIGNvbmZ0ZXN0LnZhbAogZWxzZQogICBhY19jdl9zaXplb2ZfdWludHB0cl90PTAKIGZpCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl91aW50cHRyX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl91aW50cHRyX3QiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX3VpbnRwdHJfdCIgPiY2OyB9CiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIFNJWkVPRl9VSU5UUFRSX1QgJGFjX2N2X3NpemVvZl91aW50cHRyX3QKIF9BQ0VPRgpAQCAtMTAzNDMsOCArMTA5OTgsOCBAQAogZmkKIAogIyBIbXBoLiBBQ19DSEVDS19TSVpFT0YoKSBkb2Vzbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIG9mZl90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBvZmZfdC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2Ygb2ZmX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIG9mZl90Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfb2ZmX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTEwMzg3LDIxICsxMTA0MiwyMyBAQAogKCBleGl0ICRhY19zdGF0dXMgKQogYWNfY3Zfc2l6ZW9mX29mZl90PTAKIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCisKKwogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9vZmZfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX29mZl90IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9vZmZfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX29mZl90IiA+JjY7IH0KIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBTSVpFT0ZfT0ZGX1QgJGFjX2N2X3NpemVvZl9vZmZfdAogX0FDRU9GCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiRoYXZlX2xvbmdfbG9uZyIgPSB5ZXMgLWEgXAogCSIkYWNfY3Zfc2l6ZW9mX29mZl90IiAtZ3QgIiRhY19jdl9zaXplb2ZfbG9uZyIgLWEgXAogCSIkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgLWdlICIkYWNfY3Zfc2l6ZW9mX29mZl90IjsgdGhlbgpAQCAtMTA0MTAsMTYgKzExMDY3LDE2IEBACiAjZGVmaW5lIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQgMQogX0FDRU9GCiAKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCiAjIEFDX0NIRUNLX1NJWkVPRigpIGRvZXNuJ3QgaW5jbHVkZSA8dGltZS5oPi4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIHRpbWVfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHNpemUgb2YgdGltZV90Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiB0aW1lX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIHRpbWVfdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3RpbWVfdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTA0NjIsMTMgKzExMTE5LDE1IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9zaXplb2ZfdGltZV90PTAKIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCisKKwogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl90aW1lX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl90aW1lX3QiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3RpbWVfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX3RpbWVfdCIgPiY2OyB9CiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgU0laRU9GX1RJTUVfVCAkYWNfY3Zfc2l6ZW9mX3RpbWVfdApAQCAtMTA0ODUsOCArMTExNDQsOCBAQAogZWxpZiB0ZXN0ICIkYWNfY3ZfcHRocmVhZCIgPSAieWVzIgogdGhlbiBDQz0iJENDIC1wdGhyZWFkIgogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfdC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcHRocmVhZF90Li4uICRFQ0hPX0MiID4mNjsgfQogaGF2ZV9wdGhyZWFkX3Q9bm8KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCkBAIC0xMDUyOSwxNCArMTExODgsMTYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAorCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGF2ZV9wdGhyZWFkX3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGhhdmVfcHRocmVhZF90IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfcHRocmVhZF90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXZlX3B0aHJlYWRfdCIgPiY2OyB9CiBpZiB0ZXN0ICIkaGF2ZV9wdGhyZWFkX3QiID0geWVzIDsgdGhlbgogICAjIEFDX0NIRUNLX1NJWkVPRigpIGRvZXNuJ3QgaW5jbHVkZSA8cHRocmVhZC5oPi4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgcHRocmVhZF90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBwdGhyZWFkX3QuLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2YgcHRocmVhZF90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBwdGhyZWFkX3QuLi4gJEVDSE9fQyIgPiY2OyB9CiAgIGlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3B0aHJlYWRfdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTA1NzksMTMgKzExMjQwLDE1IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9zaXplb2ZfcHRocmVhZF90PTAKIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCisKKwogZmkKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3B0aHJlYWRfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX3B0aHJlYWRfdCIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9wdGhyZWFkX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NpemVvZl9wdGhyZWFkX3QiID4mNjsgfQogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgJGFjX2N2X3NpemVvZl9wdGhyZWFkX3QKQEAgLTEwNTk0LDEzICsxMTI1NywxMyBAQAogZmkKIENDPSIkYWNfc2F2ZV9jYyIKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLWVuYWJsZS10b29sYm94LWdsdWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS1lbmFibGUtdG9vbGJveC1nbHVlLi4uICRFQ0hPX0MiID4mNgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRvb2xib3gtZ2x1ZSBvciAtLWRpc2FibGUtdG9vbGJveC1nbHVlIHdhcyBnaXZlbi4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLWVuYWJsZS10b29sYm94LWdsdWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS1lbmFibGUtdG9vbGJveC1nbHVlLi4uICRFQ0hPX0MiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRvb2xib3gtZ2x1ZSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV90b29sYm94X2dsdWUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3Rvb2xib3hfZ2x1ZSIKKyAgZW5hYmxldmFsPSRlbmFibGVfdG9vbGJveF9nbHVlOworZmkKIAotZmk7CiAKIGlmIHRlc3QgLXogIiRlbmFibGVfdG9vbGJveF9nbHVlIgogdGhlbgpAQCAtMTA2MjYsOCArMTEyODksOCBAQAogCWV4dHJhX3VuZGVmcz0iIgogCTs7CiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlX3Rvb2xib3hfZ2x1ZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kZW5hYmxlX3Rvb2xib3hfZ2x1ZSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVfdG9vbGJveF9nbHVlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRlbmFibGVfdG9vbGJveF9nbHVlIiA+JjY7IH0KIAogCiBjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgpAQCAtMTA2NDIsNyArMTEzMDUsMTIgQEAKIAogY2FzZSAkYWNfc3lzX3N5c3RlbS8kYWNfc3lzX3JlbGVhc2UgaW4KICAgRGFyd2luL1swMTU2N11cLi4qKQotICAgIExJQlRPT0xfQ1JVRlQ9Ii1mcmFtZXdvcmsgU3lzdGVtIC1sY2NfZHluYW1pYyAtYXJjaF9vbmx5IGBhcmNoYCIKKyAgICBMSUJUT09MX0NSVUZUPSItZnJhbWV3b3JrIFN5c3RlbSAtbGNjX2R5bmFtaWMiCisgICAgaWYgdGVzdCAiJHtlbmFibGVfdW5pdmVyc2Fsc2RrfSI7IHRoZW4KKwkgICAgOgorICAgIGVsc2UKKwlMSUJUT09MX0NSVUZUPSIke0xJQlRPT0xfQ1JVRlR9IC1hcmNoX29ubHkgYGFyY2hgIgorICAgIGZpCiAgICAgTElCVE9PTF9DUlVGVD0kTElCVE9PTF9DUlVGVCcgLWluc3RhbGxfbmFtZSAkKFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvJChQWVRIT05GUkFNRVdPUkspJwogICAgIExJQlRPT0xfQ1JVRlQ9JExJQlRPT0xfQ1JVRlQnIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJChWRVJTSU9OKSAtY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTiknOzsKICAgRGFyd2luLyopCkBAIC0xMDY1OCw4ICsxMTMyNiw4IEBACiAgICAgTElCVE9PTF9DUlVGVD0kTElCVE9PTF9DUlVGVCcgLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkKFZFUlNJT04pIC1jdXJyZW50X3ZlcnNpb24gJChWRVJTSU9OKSc7OwogZXNhYwogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0tZW5hYmxlLWZyYW1ld29yayIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLWVuYWJsZS1mcmFtZXdvcmsuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS1lbmFibGUtZnJhbWV3b3JrIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0tZW5hYmxlLWZyYW1ld29yay4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiRlbmFibGVfZnJhbWV3b3JrIgogdGhlbgogCUJBU0VDRkxBR1M9IiRCQVNFQ0ZMQUdTIC1mbm8tY29tbW9uIC1keW5hbWljIgpAQCAtMTA2NzAsMTUgKzExMzM4LDE1IEBACiAjZGVmaW5lIFdJVEhfTkVYVF9GUkFNRVdPUksgMQogX0FDRU9GCiAKLQllY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogZWxzZQotCWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZHlsZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkeWxkLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGR5bGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZHlsZC4uLiAkRUNIT19DIiA+JjY7IH0KIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCiAgIERhcndpbi8qKQogCkBAIC0xMDY4NiwxMiArMTEzNTQsMTIgQEAKICNkZWZpbmUgV0lUSF9EWUxEIDEKIF9BQ0VPRgogCi0gIAllY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBhbHdheXMgb24gZm9yIERhcndpbiIgPiY1Ci1lY2hvICIke0VDSE9fVH1hbHdheXMgb24gZm9yIERhcndpbiIgPiY2CisgIAl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGFsd2F5cyBvbiBmb3IgRGFyd2luIiA+JjUKK2VjaG8gIiR7RUNIT19UfWFsd2F5cyBvbiBmb3IgRGFyd2luIiA+JjY7IH0KICAgCTs7CiAgICopCi0JZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCTs7CiBlc2FjCiAKQEAgLTEwNzAzLDEyICsxMTM3MSwxNyBAQAogCiAjIFNPIGlzIHRoZSBleHRlbnNpb24gb2Ygc2hhcmVkIGxpYnJhcmllcyBgKGluY2x1ZGluZyB0aGUgZG90ISkKICMgLS0gdXN1YWxseSAuc28sIC5zbCBvbiBIUC1VWCwgLmRsbCBvbiBDeWd3aW4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBTTyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIFNPLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgU08iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBTTy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgLXogIiRTTyIKIHRoZW4KIAljYXNlICRhY19zeXNfc3lzdGVtIGluCi0JaHAqfEhQKikgICBTTz0uc2w7OworCWhwKnxIUCopCisJCWNhc2UgYHVuYW1lIC1tYCBpbgorCQkJaWE2NCkgU089LnNvOzsKKwkgIAkJKikgICAgU089LnNsOzsKKwkJZXNhYworCQk7OwogCUNZR1dJTiopICAgU089LmRsbDs7CiAJKikJICAgU089LnNvOzsKIAllc2FjCkBAIC0xMDcyNCwxNCArMTEzOTcsMTkgQEAKICAgICAgICAgZWNobyAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09JwogCXNsZWVwIDEwCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFNPIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRTTyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTTyIgPiY1CitlY2hvICIke0VDSE9fVH0kU08iID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNITElCX0VYVCAiJFNPIgorX0FDRU9GCisKICMgTERTSEFSRUQgaXMgdGhlIGxkICpjb21tYW5kKiB1c2VkIHRvIGNyZWF0ZSBzaGFyZWQgbGlicmFyeQogIyAtLSAiY2MgLUciIG9uIFN1bk9TIDUueCwgImxkIC1zaGFyZWQiIG9uIElSSVggNQogIyAoU2hhcmVkIGxpYnJhcmllcyBpbiB0aGlzIGluc3RhbmNlIGFyZSBzaGFyZWQgbW9kdWxlcyB0byBiZSBsb2FkZWQgaW50bwogIyBQeXRob24sIGFzIG9wcG9zZWQgdG8gYnVpbGRpbmcgUHl0aG9uIGl0c2VsZiBhcyBhIHNoYXJlZCBsaWJyYXJ5LikKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBMRFNIQVJFRCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIExEU0hBUkVELi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgTERTSEFSRUQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBMRFNIQVJFRC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgLXogIiRMRFNIQVJFRCIKIHRoZW4KIAljYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgpAQCAtMTA3NzcsOSArMTE0NTUsMTYgQEAKIAkJIyBVc2UgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCB3aGVuZXZlciBwb3NzaWJsZSAoMTAuMyBhbmQgbGF0ZXIpLgogCQkjIFRoaXMgYWxsb3dzIGFuIGV4dGVuc2lvbiB0byBiZSB1c2VkIGluIGFueSBQeXRob24KIAkJY3VyX3RhcmdldD1gc3dfdmVycyAtcHJvZHVjdFZlcnNpb24gfCBzZWQgJ3MvXCgxMFwuWzAtOV0qXCkuKi9cMS8nYAorCQlpZiB0ZXN0ICR7Y3VyX3RhcmdldH0gJz4nIDEwLjI7IHRoZW4KKwkJCWN1cl90YXJnZXQ9MTAuMworCQlmaQogCQlDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPSR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULSR7Y3VyX3RhcmdldH19CisJCUVYUE9SVF9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9JycKIAkJaWYgdGVzdCAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0ke2N1cl90YXJnZXR9fSAnPicgMTAuMgogCQl0aGVuCisJCQlpZiB0ZXN0ICIke2VuYWJsZV91bml2ZXJzYWxzZGt9IjsgdGhlbgorCQkJCUxERkxBR1M9Ii1hcmNoIGkzODYgLWFyY2ggcHBjIC1pc3lzcm9vdCAke1VOSVZFUlNBTFNES30gJHtMREZMQUdTfSIKKwkJCWZpCiAJCQlMRFNIQVJFRD0nJChDQykgJChMREZMQUdTKSAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCiAJCQlCTERTSEFSRUQ9IiRMRFNIQVJFRCIKIAkJZWxzZQpAQCAtMTA4MTcsMTMgKzExNTAyLDEzIEBACiAJKikJTERTSEFSRUQ9ImxkIjs7CiAJZXNhYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMRFNIQVJFRCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kTERTSEFSRUQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTERTSEFSRUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JExEU0hBUkVEIiA+JjY7IH0KIEJMRFNIQVJFRD0ke0JMRFNIQVJFRC0kTERTSEFSRUR9CiAjIENDU0hBUkVEIGFyZSB0aGUgQyAqZmxhZ3MqIHVzZWQgdG8gY3JlYXRlIG9iamVjdHMgdG8gZ28gaW50byBhIHNoYXJlZAogIyBsaWJyYXJ5IChtb2R1bGUpIC0tIHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGEgZmV3IHN5c3RlbXMKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBDQ1NIQVJFRCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIENDU0hBUkVELi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgQ0NTSEFSRUQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBDQ1NIQVJFRC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgLXogIiRDQ1NIQVJFRCIKIHRoZW4KIAljYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgpAQCAtMTA4NTYsMTIgKzExNTQxLDEyIEBACiAJYXRoZW9zKikgQ0NTSEFSRUQ9Ii1mUElDIjs7CiAJZXNhYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQ1NIQVJFRCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0NTSEFSRUQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0NTSEFSRUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDU0hBUkVEIiA+JjY7IH0KICMgTElOS0ZPUlNIQVJFRCBhcmUgdGhlIGZsYWdzIHBhc3NlZCB0byB0aGUgJChDQykgY29tbWFuZCB0aGF0IGxpbmtzCiAjIHRoZSBweXRob24gZXhlY3V0YWJsZSAtLSB0aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBhIGZldyBzeXN0ZW1zCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgTElOS0ZPUlNIQVJFRCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIExJTktGT1JTSEFSRUQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBMSU5LRk9SU0hBUkVEIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgTElOS0ZPUlNIQVJFRC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgLXogIiRMSU5LRk9SU0hBUkVEIgogdGhlbgogCWNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCkBAIC0xMDkwOSwxMiArMTE1OTQsMTIgQEAKIAkJZmk7OwogCWVzYWMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkTElOS0ZPUlNIQVJFRCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kTElOS0ZPUlNIQVJFRCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRMSU5LRk9SU0hBUkVEIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRMSU5LRk9SU0hBUkVEIiA+JjY7IH0KIAogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgQ0ZMQUdTRk9SU0hBUkVEIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgQ0ZMQUdTRk9SU0hBUkVELi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgQ0ZMQUdTRk9SU0hBUkVEIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgQ0ZMQUdTRk9SU0hBUkVELi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAhICIkTElCUkFSWSIgPSAiJExETElCUkFSWSIKIHRoZW4KIAljYXNlICRhY19zeXNfc3lzdGVtIGluCkBAIC0xMDkyNiw4ICsxMTYxMSw4IEBACiAJCUNGTEFHU0ZPUlNIQVJFRD0nJChDQ1NIQVJFRCknCiAJZXNhYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDRkxBR1NGT1JTSEFSRUQiID4mNQotZWNobyAiJHtFQ0hPX1R9JENGTEFHU0ZPUlNIQVJFRCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDRkxBR1NGT1JTSEFSRUQiID4mNQorZWNobyAiJHtFQ0hPX1R9JENGTEFHU0ZPUlNIQVJFRCIgPiY2OyB9CiAKICMgU0hMSUJTIGFyZSBsaWJyYXJpZXMgKGV4Y2VwdCAtbGMgYW5kIC1sbSkgdG8gbGluayB0byB0aGUgcHl0aG9uIHNoYXJlZAogIyBsaWJyYXJ5ICh3aXRoIC0tZW5hYmxlLXNoYXJlZCkuCkBAIC0xMDkzOCwyMCArMTE2MjMsMjAgQEAKICMgZG9uJ3QgbmVlZCB0byBsaW5rIExJQlMgZXhwbGljaXRseS4gVGhlIGRlZmF1bHQgc2hvdWxkIGJlIG9ubHkgY2hhbmdlZAogIyBvbiBzeXN0ZW1zIHdoZXJlIHRoaXMgYXBwcm9hY2ggY2F1c2VzIHByb2JsZW1zLgogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgU0hMSUJTIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgU0hMSUJTLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgU0hMSUJTIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgU0hMSUJTLi4uICRFQ0hPX0MiID4mNjsgfQogY2FzZSAiJGFjX3N5c19zeXN0ZW0iIGluCiAJKikKIAkJU0hMSUJTPSckKExJQlMpJzs7CiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU0hMSUJTIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRTSExJQlMiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU0hMSUJTIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRTSExJQlMiID4mNjsgfQogCiAKICMgY2hlY2tzIGZvciBsaWJyYXJpZXMKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbG9wZW4gaW4gLWxkbC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbGliX2RsX2Rsb3BlbitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTA5NjQsMTcgKzExNjQ5LDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBkbG9wZW4gKCk7CiBpbnQKIG1haW4gKCkKIHsKLWRsb3BlbiAoKTsKK3JldHVybiBkbG9wZW4gKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xMTAwNSwxNCArMTE2OTAsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX2RsX2Rsb3Blbj1ubworCWFjX2N2X2xpYl9kbF9kbG9wZW49bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbF9kbG9wZW4iID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2RsX2Rsb3BlbiIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfZGxfZGxvcGVuID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9MSUJETCAxCkBAIC0xMTAyMyw4ICsxMTcwOSw4IEBACiBmaQogCSMgRHluYW1pYyBsaW5raW5nIGZvciBTdW5PUy9Tb2xhcmlzIGFuZCBTWVNWCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc2hsX2xvYWQgaW4gLWxkbGQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbGRfc2hsX2xvYWQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTExMDM3LDE3ICsxMTcyMywxNyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgc2hsX2xvYWQgKCk7CiBpbnQKIG1haW4gKCkKIHsKLXNobF9sb2FkICgpOworcmV0dXJuIHNobF9sb2FkICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTEwNzgsMTQgKzExNzY0LDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KKwlhY19jdl9saWJfZGxkX3NobF9sb2FkPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfZGxkX3NobF9sb2FkIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9kbGRfc2hsX2xvYWQiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbGliX2RsZF9zaGxfbG9hZCA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfTElCRExEIDEKQEAgLTExMDk4LDEzICsxMTc4NSwxMiBAQAogCiAjIG9ubHkgY2hlY2sgZm9yIHNlbV9pbmkgaWYgdGhyZWFkIHN1cHBvcnQgaXMgcmVxdWVzdGVkCiBpZiB0ZXN0ICIkd2l0aF90aHJlYWRzIiA9ICJ5ZXMiIC1vIC16ICIkd2l0aF90aHJlYWRzIjsgdGhlbgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNlbV9pbml0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzZW1faW5pdC4uLiAkRUNIT19DIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNlbV9pbml0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzZW1faW5pdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NlbV9pbml0K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwotYWNfY3Zfc2VhcmNoX3NlbV9pbml0PW5vCiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMTExMiw3NiArMTE3OTgsMjkgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHNlbV9pbml0ICgpOwogaW50CiBtYWluICgpCiB7Ci1zZW1faW5pdCAoKTsKK3JldHVybiBzZW1faW5pdCAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KIF9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQotICAoZXZhbCAkYWNfbGluaykgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKLSAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKLSAgKGV2YWwgJGFjX3RyeSkgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1Ci0gIChldmFsICRhY190cnkpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgYWNfY3Zfc2VhcmNoX3NlbV9pbml0PSJub25lIHJlcXVpcmVkIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi1maQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgIiRhY19jdl9zZWFyY2hfc2VtX2luaXQiID0gbm87IHRoZW4KLSAgZm9yIGFjX2xpYiBpbiBwdGhyZWFkIHJ0IHBvc2l4NDsgZG8KK2ZvciBhY19saWIgaW4gJycgcHRocmVhZCBydCBwb3NpeDQ7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgogICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBzZW1faW5pdCAoKTsKLWludAotbWFpbiAoKQotewotc2VtX2luaXQgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CiBpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19saW5rXCIiKSA+JjUKICAgKGV2YWwgJGFjX2xpbmspIDI+Y29uZnRlc3QuZXIxCiAgIGFjX3N0YXR1cz0kPwpAQCAtMTEyMDIsMjMgKzExODQxLDMzIEBACiAgIGFjX3N0YXR1cz0kPwogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X3NlYXJjaF9zZW1faW5pdD0iLWwkYWNfbGliIgotYnJlYWsKKyAgYWNfY3Zfc2VhcmNoX3NlbV9pbml0PSRhY19yZXMKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAorCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotICBkb25lCisgICAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc2VtX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYnJlYWsKIGZpCitkb25lCitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zZW1faW5pdCtzZXR9IiA9IHNldDsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X3NlYXJjaF9zZW1faW5pdD1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfc2VtX2luaXQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9zZW1faW5pdCIgPiY2Ci1pZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3NlbV9pbml0IiAhPSBubzsgdGhlbgotICB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3NlbV9pbml0IiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfY3Zfc2VhcmNoX3NlbV9pbml0ICRMSUJTIgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3NlbV9pbml0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfc2VtX2luaXQiID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfc2VtX2luaXQKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuCisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCiAKIGZpCiAgIyAnUmVhbCBUaW1lJyBmdW5jdGlvbnMgb24gU29sYXJpcwpAQCAtMTEyMjcsOCArMTE4NzYsOCBAQAogZmkKIAogIyBjaGVjayBpZiB3ZSBuZWVkIGxpYmludGwgZm9yIGxvY2FsZSBmdW5jdGlvbnMKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGV4dGRvbWFpbiBpbiAtbGludGwuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGV4dGRvbWFpbiBpbiAtbGludGwuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9pbnRsX3RleHRkb21haW4rc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTExMjQxLDE3ICsxMTg5MCwxNyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgdGV4dGRvbWFpbiAoKTsKIGludAogbWFpbiAoKQogewotdGV4dGRvbWFpbiAoKTsKK3JldHVybiB0ZXh0ZG9tYWluICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTEyODIsMTQgKzExOTMxLDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2xpYl9pbnRsX3RleHRkb21haW49bm8KKwlhY19jdl9saWJfaW50bF90ZXh0ZG9tYWluPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfaW50bF90ZXh0ZG9tYWluIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfaW50bF90ZXh0ZG9tYWluIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9pbnRsX3RleHRkb21haW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9pbnRsX3RleHRkb21haW4iID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbGliX2ludGxfdGV4dGRvbWFpbiA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtMTEzMDEsOCArMTE5NTEsOCBAQAogCiAjIGNoZWNrcyBmb3Igc3lzdGVtIGRlcGVuZGVudCBDKysgZXh0ZW5zaW9ucyBzdXBwb3J0CiBjYXNlICIkYWNfc3lzX3N5c3RlbSIgaW4KLQlBSVgqKQllY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdlbnVpbmUgQUlYIEMrKyBleHRlbnNpb25zIHN1cHBvcnQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ2VudWluZSBBSVggQysrIGV4dGVuc2lvbnMgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjYKKwlBSVgqKQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2VudWluZSBBSVggQysrIGV4dGVuc2lvbnMgc3VwcG9ydCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBnZW51aW5lIEFJWCBDKysgZXh0ZW5zaW9ucyBzdXBwb3J0Li4uICRFQ0hPX0MiID4mNjsgfQogCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMTM0NCwxNSArMTE5OTQsMTYgQEAKICNkZWZpbmUgQUlYX0dFTlVJTkVfQ1BMVVNQTFVTIDEKIF9BQ0VPRgogCi0JCQkgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorCQkJICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dDs7CiAJKikgOzsKQEAgLTExMzYwLDggKzEyMDExLDggQEAKIAogIyBNb3N0IFNWUjQgcGxhdGZvcm1zIChlLmcuIFNvbGFyaXMpIG5lZWQgLWxzb2NrZXQgYW5kIC1sbnNsLgogIyBCZU9TJyBzb2NrZXRzIGFyZSBzdGFzaGVkIGluIGxpYm5ldC4KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdF9vcGVuIGluIC1sbnNsIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHRfb3BlbiBpbiAtbG5zbC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0X29wZW4gaW4gLWxuc2wiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdF9vcGVuIGluIC1sbnNsLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfbnNsX3Rfb3BlbitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTEzNzQsMTcgKzEyMDI1LDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciB0X29wZW4gKCk7CiBpbnQKIG1haW4gKCkKIHsKLXRfb3BlbiAoKTsKK3JldHVybiB0X29wZW4gKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xMTQxNSwyMCArMTIwNjYsMjEgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX25zbF90X29wZW49bm8KKwlhY19jdl9saWJfbnNsX3Rfb3Blbj1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX25zbF90X29wZW4iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9uc2xfdF9vcGVuIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9uc2xfdF9vcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfbnNsX3Rfb3BlbiIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfbnNsX3Rfb3BlbiA9IHllczsgdGhlbgogICBMSUJTPSItbG5zbCAkTElCUyIKIGZpCiAgIyBTVlI0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbGliX3NvY2tldF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTExNDQxLDE3ICsxMjA5MywxNyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgc29ja2V0ICgpOwogaW50CiBtYWluICgpCiB7Ci1zb2NrZXQgKCk7CityZXR1cm4gc29ja2V0ICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTE0ODIsMTQgKzEyMTM0LDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PW5vCisJYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQgPSB5ZXM7IHRoZW4KICAgTElCUz0iLWxzb2NrZXQgJExJQlMiCiBmaQpAQCAtMTE0OTcsOCArMTIxNTAsOCBAQAogCiBjYXNlICIkYWNfc3lzX3N5c3RlbSIgaW4KIEJlT1MqKQotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxuZXQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sbmV0Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbG5ldCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxuZXQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9uZXRfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xMTUxMSwxNyArMTIxNjQsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHNvY2tldCAoKTsKIGludAogbWFpbiAoKQogewotc29ja2V0ICgpOworcmV0dXJuIHNvY2tldCAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTExNTUyLDE0ICsxMjIwNSwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfbmV0X3NvY2tldD1ubworCWFjX2N2X2xpYl9uZXRfc29ja2V0PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfbmV0X3NvY2tldCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX25ldF9zb2NrZXQiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX25ldF9zb2NrZXQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9uZXRfc29ja2V0IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl9uZXRfc29ja2V0ID0geWVzOyB0aGVuCiAgIExJQlM9Ii1sbmV0ICRMSUJTIgogZmkKQEAgLTExNTY3LDU1ICsxMjIyMSw1NSBAQAogOzsKIGVzYWMKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtbGlicyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtbGlicy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtbGlicyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtbGlicy4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJzIG9yIC0td2l0aG91dC1saWJzIHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlicyB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfbGlicytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9saWJzIgotCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aHZhbCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kd2l0aHZhbCIgPiY2CisgIHdpdGh2YWw9JHdpdGhfbGliczsKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGh2YWwiID4mNQorZWNobyAiJHtFQ0hPX1R9JHdpdGh2YWwiID4mNjsgfQogTElCUz0iJHdpdGh2YWwgJExJQlMiCiAKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotZmk7CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKwogCiAjIENoZWNrIGZvciB1c2Ugb2YgdGhlIHN5c3RlbSBsaWJmZmkgbGlicmFyeQotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtc3lzdGVtLWZmaSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtc3lzdGVtLWZmaS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtc3lzdGVtLWZmaSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtc3lzdGVtLWZmaS4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zeXN0ZW1fZmZpIG9yIC0td2l0aG91dC1zeXN0ZW1fZmZpIHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzdGVtX2ZmaSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfc3lzdGVtX2ZmaStzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9zeXN0ZW1fZmZpIgorICB3aXRodmFsPSR3aXRoX3N5c3RlbV9mZmk7CitmaQogCi1maTsKIAogaWYgdGVzdCAteiAiJHdpdGhfc3lzdGVtX2ZmaSIKIHRoZW4gd2l0aF9zeXN0ZW1fZmZpPSJubyIKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF9zeXN0ZW1fZmZpIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR3aXRoX3N5c3RlbV9mZmkiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF9zeXN0ZW1fZmZpIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3aXRoX3N5c3RlbV9mZmkiID4mNjsgfQogCiAjIERldGVybWluZSBpZiBzaWduYWxtb2R1bGUgc2hvdWxkIGJlIHVzZWQuCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtc2lnbmFsLW1vZHVsZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtc2lnbmFsLW1vZHVsZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtc2lnbmFsLW1vZHVsZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtc2lnbmFsLW1vZHVsZS4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zaWduYWwtbW9kdWxlIG9yIC0td2l0aG91dC1zaWduYWwtbW9kdWxlIHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc2lnbmFsLW1vZHVsZSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfc2lnbmFsX21vZHVsZStzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9zaWduYWxfbW9kdWxlIgorICB3aXRodmFsPSR3aXRoX3NpZ25hbF9tb2R1bGU7CitmaQogCi1maTsKIAogaWYgdGVzdCAteiAiJHdpdGhfc2lnbmFsX21vZHVsZSIKIHRoZW4gd2l0aF9zaWduYWxfbW9kdWxlPSJ5ZXMiCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhfc2lnbmFsX21vZHVsZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kd2l0aF9zaWduYWxfbW9kdWxlIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhfc2lnbmFsX21vZHVsZSIgPiY1CitlY2hvICIke0VDSE9fVH0kd2l0aF9zaWduYWxfbW9kdWxlIiA+JjY7IH0KIAogaWYgdGVzdCAiJHt3aXRoX3NpZ25hbF9tb2R1bGV9IiA9ICJ5ZXMiOyB0aGVuCiAJVVNFX1NJR05BTF9NT0RVTEU9IiIKQEAgLTExNjI5LDI0ICsxMjI4MywyNCBAQAogCiBVU0VfVEhSRUFEX01PRFVMRT0iIgogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1kZWMtdGhyZWFkcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtZGVjLXRocmVhZHMuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLWRlYy10aHJlYWRzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aC1kZWMtdGhyZWFkcy4uLiAkRUNIT19DIiA+JjY7IH0KIAogCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlYy10aHJlYWRzIG9yIC0td2l0aG91dC1kZWMtdGhyZWFkcyB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRlYy10aHJlYWRzIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9kZWNfdGhyZWFkcytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9kZWNfdGhyZWFkcyIKLQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGh2YWwiID4mNQotZWNobyAiJHtFQ0hPX1R9JHdpdGh2YWwiID4mNgorICB3aXRodmFsPSR3aXRoX2RlY190aHJlYWRzOworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aHZhbCIgPiY1CitlY2hvICIke0VDSE9fVH0kd2l0aHZhbCIgPiY2OyB9CiBMRExBU1Q9LXRocmVhZHMKIGlmIHRlc3QgIiR7d2l0aF90aHJlYWQrc2V0fSIgIT0gc2V0OyB0aGVuCiAgICB3aXRoX3RocmVhZD0iJHdpdGh2YWwiOwogZmkKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotZmk7CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKwogCiAjIFRlbXBsYXRlcyBmb3IgdGhpbmdzIEFDX0RFRklORWQgbW9yZSB0aGFuIG9uY2UuCiAjIEZvciBhIHNpbmdsZSBBQ19ERUZJTkUsIG5vIHRlbXBsYXRlIGlzIG5lZWRlZC4KQEAgLTExNjU3LDI4ICsxMjMxMSwyOCBAQAogCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtdGhyZWFkcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtdGhyZWFkcy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtdGhyZWFkcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtdGhyZWFkcy4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC10aHJlYWRzIG9yIC0td2l0aG91dC10aHJlYWRzIHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGhyZWFkcyB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfdGhyZWFkcytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF90aHJlYWRzIgorICB3aXRodmFsPSR3aXRoX3RocmVhZHM7CitmaQogCi1maTsKIAogIyAtLXdpdGgtdGhyZWFkIGlzIGRlcHJlY2F0ZWQsIGJ1dCBjaGVjayBmb3IgaXQgYW55d2F5CiAKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdGhyZWFkIG9yIC0td2l0aG91dC10aHJlYWQgd2FzIGdpdmVuLgorIyBDaGVjayB3aGV0aGVyIC0td2l0aC10aHJlYWQgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX3RocmVhZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF90aHJlYWQiCi0gIHdpdGhfdGhyZWFkcz0kd2l0aF90aHJlYWQKLWZpOworICB3aXRodmFsPSR3aXRoX3RocmVhZDsgd2l0aF90aHJlYWRzPSR3aXRoX3RocmVhZAorZmkKKwogCiBpZiB0ZXN0IC16ICIkd2l0aF90aHJlYWRzIgogdGhlbiB3aXRoX3RocmVhZHM9InllcyIKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF90aHJlYWRzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR3aXRoX3RocmVhZHMiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aF90aHJlYWRzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3aXRoX3RocmVhZHMiID4mNjsgfQogCiAKIGlmIHRlc3QgIiR3aXRoX3RocmVhZHMiID0gIm5vIgpAQCAtMTE3NDQsOCArMTIzOTgsOCBAQAogICAgICMgQWNjb3JkaW5nIHRvIHRoZSBQT1NJWCBzcGVjLCBhIHB0aHJlYWRzIGltcGxlbWVudGF0aW9uIG11c3QKICAgICAjIGRlZmluZSBfUE9TSVhfVEhSRUFEUyBpbiB1bmlzdGQuaC4gU29tZSBhcHBhcmVudGx5IGRvbid0CiAgICAgIyAoZS5nLiBnbnUgcHRoIHdpdGggcHRocmVhZCBlbXVsYXRpb24pCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfUE9TSVhfVEhSRUFEUyBpbiB1bmlzdGQuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfUE9TSVhfVEhSRUFEUyBpbiB1bmlzdGQuaC4uLiAkRUNIT19DIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX1BPU0lYX1RIUkVBRFMgaW4gdW5pc3RkLmgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgX1BPU0lYX1RIUkVBRFMgaW4gdW5pc3RkLmguLi4gJEVDSE9fQyIgPiY2OyB9CiAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTE3NjcsMjUgKzEyNDIxLDI1IEBACiBmaQogcm0gLWYgY29uZnRlc3QqCiAKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkdW5pc3RkX2RlZmluZXNfcHRocmVhZHMiID4mNQotZWNobyAiJHtFQ0hPX1R9JHVuaXN0ZF9kZWZpbmVzX3B0aHJlYWRzIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR1bmlzdGRfZGVmaW5lc19wdGhyZWFkcyIgPiY1CitlY2hvICIke0VDSE9fVH0kdW5pc3RkX2RlZmluZXNfcHRocmVhZHMiID4mNjsgfQogCiAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgX1JFRU5UUkFOVCAxCiBfQUNFT0YKIAogICAgIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2N0aHJlYWRzX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjdGhyZWFkcy5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGN0aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjdGhyZWFkcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGN0aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9jdGhyZWFkc19oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9jdGhyZWFkc19oIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfY3RocmVhZHNfaCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfY3RocmVhZHNfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2N0aHJlYWRzX2giID4mNjsgfQogZWxzZQogICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBjdGhyZWFkcy5oIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGN0aHJlYWRzLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgY3RocmVhZHMuaCB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBjdGhyZWFkcy5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTExODIxLDE1ICsxMjQ3NSwxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19oZWFkZXJfY29tcGlsZXI9bm8KKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKICMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGN0aHJlYWRzLmggcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBjdGhyZWFkcy5oIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgY3RocmVhZHMuaCBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGN0aHJlYWRzLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMTg2Myw5ICsxMjUxOCwxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTExODg5LDI1ICsxMjU0NSwyMyBAQAogZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjdGhyZWFkcy5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBjdGhyZWFkcy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQogZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjdGhyZWFkcy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0gICAgKAotICAgICAgY2F0IDw8XF9BU0JPWAorICAgICggY2F0IDw8XF9BU0JPWAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBSZXBvcnQgdGhpcyB0byBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHl0aG9uLWJ1Z3MgIyMKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogX0FTQk9YCi0gICAgKSB8Ci0gICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgogICAgIDs7CiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGN0aHJlYWRzLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgY3RocmVhZHMuaC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjdGhyZWFkcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGN0aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9jdGhyZWFkc19oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGFjX2N2X2hlYWRlcl9jdGhyZWFkc19oPSRhY19oZWFkZXJfcHJlcHJvYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfY3RocmVhZHNfaCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2N0aHJlYWRzX2giID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2N0aHJlYWRzX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9jdGhyZWFkc19oIiA+JjY7IH0KIAogZmkKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9jdGhyZWFkc19oID0geWVzOyB0aGVuCkBAIC0xMTkyOSwxNyArMTI1ODMsMTcgQEAKIGVsc2UKIAogICAgIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX21hY2hfY3RocmVhZHNfaCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1hY2gvY3RocmVhZHMuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtYWNoL2N0aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtYWNoL2N0aHJlYWRzLmgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbWFjaC9jdGhyZWFkcy5oLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfbWFjaF9jdGhyZWFkc19oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9tYWNoX2N0aHJlYWRzX2giID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9tYWNoX2N0aHJlYWRzX2giID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX21hY2hfY3RocmVhZHNfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX21hY2hfY3RocmVhZHNfaCIgPiY2OyB9CiBlbHNlCiAgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIG1hY2gvY3RocmVhZHMuaCB1c2FiaWxpdHkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBtYWNoL2N0aHJlYWRzLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgbWFjaC9jdGhyZWFkcy5oIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIG1hY2gvY3RocmVhZHMuaCB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMTk3NSwxNSArMTI2MjksMTYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGVhZGVyX2NvbXBpbGVyPW5vCisJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQogCiAjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBtYWNoL2N0aHJlYWRzLmggcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBtYWNoL2N0aHJlYWRzLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBtYWNoL2N0aHJlYWRzLmggcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBtYWNoL2N0aHJlYWRzLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMjAxNyw5ICsxMjY3MiwxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTEyMDQzLDI1ICsxMjY5OSwyMyBAQAogZWNobyAiJGFzX21lOiBXQVJOSU5HOiBtYWNoL2N0aHJlYWRzLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQogICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IG1hY2gvY3RocmVhZHMuaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKIGVjaG8gIiRhc19tZTogV0FSTklORzogbWFjaC9jdGhyZWFkcy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0gICAgKAotICAgICAgY2F0IDw8XF9BU0JPWAorICAgICggY2F0IDw8XF9BU0JPWAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBSZXBvcnQgdGhpcyB0byBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHl0aG9uLWJ1Z3MgIyMKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogX0FTQk9YCi0gICAgKSB8Ci0gICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgogICAgIDs7CiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1hY2gvY3RocmVhZHMuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtYWNoL2N0aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbWFjaC9jdGhyZWFkcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1hY2gvY3RocmVhZHMuaC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX21hY2hfY3RocmVhZHNfaCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBhY19jdl9oZWFkZXJfbWFjaF9jdGhyZWFkc19oPSRhY19oZWFkZXJfcHJlcHJvYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfbWFjaF9jdGhyZWFkc19oIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfbWFjaF9jdGhyZWFkc19oIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9tYWNoX2N0aHJlYWRzX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9tYWNoX2N0aHJlYWRzX2giID4mNjsgfQogCiBmaQogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX21hY2hfY3RocmVhZHNfaCA9IHllczsgdGhlbgpAQCAtMTIwODEsMTQgKzEyNzM1LDEzIEBACiAgICAgVEhSRUFET0JKPSJQeXRob24vdGhyZWFkLm8iCiBlbHNlCiAKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1wdGgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLXB0aC4uLiAkRUNIT19DIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXB0aCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtcHRoLi4uICRFQ0hPX0MiID4mNjsgfQogCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXB0aCBvciAtLXdpdGhvdXQtcHRoIHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtcHRoIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9wdGgrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfcHRoIgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2l0aHZhbCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kd2l0aHZhbCIgPiY2CisgIHdpdGh2YWw9JHdpdGhfcHRoOyB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3aXRodmFsIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3aXRodmFsIiA+JjY7IH0KICAgICAgICAgICAgICAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCiAjZGVmaW5lIFdJVEhfVEhSRUFEIDEKIF9BQ0VPRgpAQCAtMTIxMDEsMTYgKzEyNzU0LDE2IEBACiAgICAgICAgICAgICAgICAgICBMSUJTPSItbHB0aCAkTElCUyIKICAgICAgICAgICAgICAgICAgIFRIUkVBRE9CSj0iUHl0aG9uL3RocmVhZC5vIgogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiAgICAgIyBKdXN0IGxvb2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIGxpYnB0aHJlYWQgaXMgbm90IGVub3VnaDoKICAgICAjIG9uIEhQL1VYLCBwdGhyZWFkLmggcmVuYW1lcyBwdGhyZWFkX2NyZWF0ZSB0byBhIGRpZmZlcmVudCBzeW1ib2wgbmFtZS4KICAgICAjIFNvIHdlIHJlYWxseSBoYXZlIHRvIGluY2x1ZGUgcHRocmVhZC5oLCBhbmQgdGhlbiBsaW5rLgogICAgIF9saWJzPSRMSUJTCiAgICAgTElCUz0iJExJQlMgLWxwdGhyZWFkIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1scHRocmVhZC4uLiAkRUNIT19DIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1scHRocmVhZC4uLiAkRUNIT19DIiA+JjY7IH0KICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMjE1MSw4ICsxMjgwNCw4IEBACiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KIAotICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgV0lUSF9USFJFQUQgMQogX0FDRU9GCkBAIC0xMjE2NSw4ICsxMjgxOCw4IEBACiAKIAogICAgIExJQlM9JF9saWJzCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX2RldGFjaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwdGhyZWFkX2RldGFjaC4uLiAkRUNIT19DIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9kZXRhY2giID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcHRocmVhZF9kZXRhY2guLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfcHRocmVhZF9kZXRhY2grc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTEyMTkzLDMwICsxMjg0NiwyNCBAQAogCiAjdW5kZWYgcHRocmVhZF9kZXRhY2gKIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCi17CiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHB0aHJlYWRfZGV0YWNoICgpOwogLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCiAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX3B0aHJlYWRfZGV0YWNoKSB8fCBkZWZpbmVkIChfX3N0dWJfX19wdGhyZWFkX2RldGFjaCkKKyNpZiBkZWZpbmVkIF9fc3R1Yl9wdGhyZWFkX2RldGFjaCB8fCBkZWZpbmVkIF9fc3R1Yl9fX3B0aHJlYWRfZGV0YWNoCiBjaG9rZSBtZQotI2Vsc2UKLWNoYXIgKCpmKSAoKSA9IHB0aHJlYWRfZGV0YWNoOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KICNlbmRpZgogCiBpbnQKIG1haW4gKCkKIHsKLXJldHVybiBmICE9IHB0aHJlYWRfZGV0YWNoOworcmV0dXJuIHB0aHJlYWRfZGV0YWNoICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTIyNDcsMTMgKzEyODk0LDE0IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2Z1bmNfcHRocmVhZF9kZXRhY2g9bm8KKwlhY19jdl9mdW5jX3B0aHJlYWRfZGV0YWNoPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3B0aHJlYWRfZGV0YWNoIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX3B0aHJlYWRfZGV0YWNoIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfcHRocmVhZF9kZXRhY2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfcHRocmVhZF9kZXRhY2giID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfZnVuY19wdGhyZWFkX2RldGFjaCA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBXSVRIX1RIUkVBRCAxCkBAIC0xMjI2NCwxNyArMTI5MTIsMTcgQEAKIGVsc2UKIAogICAgIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2F0aGVvc190aHJlYWRzX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhdGhlb3MvdGhyZWFkcy5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGF0aGVvcy90aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhdGhlb3MvdGhyZWFkcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGF0aGVvcy90aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9hdGhlb3NfdGhyZWFkc19oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9hdGhlb3NfdGhyZWFkc19oIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfYXRoZW9zX3RocmVhZHNfaCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfYXRoZW9zX3RocmVhZHNfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2F0aGVvc190aHJlYWRzX2giID4mNjsgfQogZWxzZQogICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBhdGhlb3MvdGhyZWFkcy5oIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGF0aGVvcy90aHJlYWRzLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgYXRoZW9zL3RocmVhZHMuaCB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBhdGhlb3MvdGhyZWFkcy5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTEyMzEwLDE1ICsxMjk1OCwxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19oZWFkZXJfY29tcGlsZXI9bm8KKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKICMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGF0aGVvcy90aHJlYWRzLmggcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBhdGhlb3MvdGhyZWFkcy5oIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgYXRoZW9zL3RocmVhZHMuaCBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGF0aGVvcy90aHJlYWRzLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMjM1Miw5ICsxMzAwMSwxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTEyMzc4LDI1ICsxMzAyOCwyMyBAQAogZWNobyAiJGFzX21lOiBXQVJOSU5HOiBhdGhlb3MvdGhyZWFkcy5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBhdGhlb3MvdGhyZWFkcy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQogZWNobyAiJGFzX21lOiBXQVJOSU5HOiBhdGhlb3MvdGhyZWFkcy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0gICAgKAotICAgICAgY2F0IDw8XF9BU0JPWAorICAgICggY2F0IDw8XF9BU0JPWAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBSZXBvcnQgdGhpcyB0byBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHl0aG9uLWJ1Z3MgIyMKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogX0FTQk9YCi0gICAgKSB8Ci0gICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgogICAgIDs7CiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGF0aGVvcy90aHJlYWRzLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYXRoZW9zL3RocmVhZHMuaC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhdGhlb3MvdGhyZWFkcy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGF0aGVvcy90aHJlYWRzLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9hdGhlb3NfdGhyZWFkc19oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGFjX2N2X2hlYWRlcl9hdGhlb3NfdGhyZWFkc19oPSRhY19oZWFkZXJfcHJlcHJvYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfYXRoZW9zX3RocmVhZHNfaCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2F0aGVvc190aHJlYWRzX2giID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2F0aGVvc190aHJlYWRzX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9hdGhlb3NfdGhyZWFkc19oIiA+JjY7IH0KIAogZmkKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hdGhlb3NfdGhyZWFkc19oID0geWVzOyB0aGVuCkBAIC0xMjQxMywxNyArMTMwNjEsMTcgQEAKIGVsc2UKIAogICAgIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2tlcm5lbF9PU19oK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Iga2VybmVsL09TLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Iga2VybmVsL09TLmguLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBrZXJuZWwvT1MuaCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBrZXJuZWwvT1MuaC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2tlcm5lbF9PU19oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9rZXJuZWxfT1NfaCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2tlcm5lbF9PU19oIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9rZXJuZWxfT1NfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX2tlcm5lbF9PU19oIiA+JjY7IH0KIGVsc2UKICAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcga2VybmVsL09TLmggdXNhYmlsaXR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcga2VybmVsL09TLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcga2VybmVsL09TLmggdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcga2VybmVsL09TLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTI0NTksMTUgKzEzMTA3LDE2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2hlYWRlcl9jb21waWxlcj1ubworCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIAogIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcga2VybmVsL09TLmggcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBrZXJuZWwvT1MuaCBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGtlcm5lbC9PUy5oIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcga2VybmVsL09TLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xMjUwMSw5ICsxMzE1MCwxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTEyNTI3LDI1ICsxMzE3NywyMyBAQAogZWNobyAiJGFzX21lOiBXQVJOSU5HOiBrZXJuZWwvT1MuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CiAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzoga2VybmVsL09TLmg6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CiBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGtlcm5lbC9PUy5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0gICAgKAotICAgICAgY2F0IDw8XF9BU0JPWAorICAgICggY2F0IDw8XF9BU0JPWAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBSZXBvcnQgdGhpcyB0byBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHl0aG9uLWJ1Z3MgIyMKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogX0FTQk9YCi0gICAgKSB8Ci0gICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgogICAgIDs7CiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGtlcm5lbC9PUy5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGtlcm5lbC9PUy5oLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGtlcm5lbC9PUy5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGtlcm5lbC9PUy5oLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfa2VybmVsX09TX2grc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgYWNfY3ZfaGVhZGVyX2tlcm5lbF9PU19oPSRhY19oZWFkZXJfcHJlcHJvYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfa2VybmVsX09TX2giID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9rZXJuZWxfT1NfaCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfa2VybmVsX09TX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9rZXJuZWxfT1NfaCIgPiY2OyB9CiAKIGZpCiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfa2VybmVsX09TX2ggPSB5ZXM7IHRoZW4KQEAgLTEyNTYxLDggKzEzMjA5LDggQEAKICAgICBUSFJFQURPQko9IlB5dGhvbi90aHJlYWQubyIKIGVsc2UKIAotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxwdGhyZWFkcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwdGhyZWFkX2NyZWF0ZSBpbiAtbHB0aHJlYWRzLi4uICRFQ0hPX0MiID4mNgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX2NyZWF0ZSBpbiAtbHB0aHJlYWRzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1scHRocmVhZHMuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9wdGhyZWFkc19wdGhyZWFkX2NyZWF0ZStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTI1NzUsMTcgKzEzMjIzLDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBwdGhyZWFkX2NyZWF0ZSAoKTsKIGludAogbWFpbiAoKQogewotcHRocmVhZF9jcmVhdGUgKCk7CityZXR1cm4gcHRocmVhZF9jcmVhdGUgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xMjYxNiwxNCArMTMyNjQsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX3B0aHJlYWRzX3B0aHJlYWRfY3JlYXRlPW5vCisJYWNfY3ZfbGliX3B0aHJlYWRzX3B0aHJlYWRfY3JlYXRlPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZHNfcHRocmVhZF9jcmVhdGUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9wdGhyZWFkc19wdGhyZWFkX2NyZWF0ZSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZHNfcHRocmVhZF9jcmVhdGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9wdGhyZWFkc19wdGhyZWFkX2NyZWF0ZSIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfcHRocmVhZHNfcHRocmVhZF9jcmVhdGUgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgV0lUSF9USFJFQUQgMQpAQCAtMTI2MzQsOCArMTMyODMsOCBAQAogICAgIFRIUkVBRE9CSj0iUHl0aG9uL3RocmVhZC5vIgogZWxzZQogCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX2NyZWF0ZSBpbiAtbGNfciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwdGhyZWFkX2NyZWF0ZSBpbiAtbGNfci4uLiAkRUNIT19DIiA+JjYKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxjX3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxjX3IuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9jX3JfcHRocmVhZF9jcmVhdGUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTEyNjQ4LDE3ICsxMzI5NywxNyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgcHRocmVhZF9jcmVhdGUgKCk7CiBpbnQKIG1haW4gKCkKIHsKLXB0aHJlYWRfY3JlYXRlICgpOworcmV0dXJuIHB0aHJlYWRfY3JlYXRlICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTI2ODksMTQgKzEzMzM4LDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2xpYl9jX3JfcHRocmVhZF9jcmVhdGU9bm8KKwlhY19jdl9saWJfY19yX3B0aHJlYWRfY3JlYXRlPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfY19yX3B0aHJlYWRfY3JlYXRlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfY19yX3B0aHJlYWRfY3JlYXRlIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9jX3JfcHRocmVhZF9jcmVhdGUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9jX3JfcHRocmVhZF9jcmVhdGUiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbGliX2Nfcl9wdGhyZWFkX2NyZWF0ZSA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBXSVRIX1RIUkVBRCAxCkBAIC0xMjcwNyw4ICsxMzM1Nyw4IEBACiAgICAgVEhSRUFET0JKPSJQeXRob24vdGhyZWFkLm8iCiBlbHNlCiAKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF9fcHRocmVhZF9jcmVhdGVfc3lzdGVtIGluIC1scHRocmVhZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX3B0aHJlYWRfY3JlYXRlX3N5c3RlbSBpbiAtbHB0aHJlYWQuLi4gJEVDSE9fQyIgPiY2CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF9fcHRocmVhZF9jcmVhdGVfc3lzdGVtIGluIC1scHRocmVhZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX3B0aHJlYWRfY3JlYXRlX3N5c3RlbSBpbiAtbHB0aHJlYWQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xMjcyMSwxNyArMTMzNzEsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIF9fcHRocmVhZF9jcmVhdGVfc3lzdGVtICgpOwogaW50CiBtYWluICgpCiB7Ci1fX3B0aHJlYWRfY3JlYXRlX3N5c3RlbSAoKTsKK3JldHVybiBfX3B0aHJlYWRfY3JlYXRlX3N5c3RlbSAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTEyNzYyLDE0ICsxMzQxMiwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfcHRocmVhZF9fX3B0aHJlYWRfY3JlYXRlX3N5c3RlbT1ubworCWFjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9fX3B0aHJlYWRfY3JlYXRlX3N5c3RlbSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3B0aHJlYWRfX19wdGhyZWFkX2NyZWF0ZV9zeXN0ZW0iID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRfX19wdGhyZWFkX2NyZWF0ZV9zeXN0ZW0iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl9wdGhyZWFkX19fcHRocmVhZF9jcmVhdGVfc3lzdGVtID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCiAjZGVmaW5lIFdJVEhfVEhSRUFEIDEKQEAgLTEyNzgwLDggKzEzNDMxLDggQEAKICAgICBUSFJFQURPQko9IlB5dGhvbi90aHJlYWQubyIKIGVsc2UKIAotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxjbWEiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcHRocmVhZF9jcmVhdGUgaW4gLWxjbWEuLi4gJEVDSE9fQyIgPiY2CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1sY21hIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfY3JlYXRlIGluIC1sY21hLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xMjc5NCwxNyArMTM0NDUsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHB0aHJlYWRfY3JlYXRlICgpOwogaW50CiBtYWluICgpCiB7Ci1wdGhyZWFkX2NyZWF0ZSAoKTsKK3JldHVybiBwdGhyZWFkX2NyZWF0ZSAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTEyODM1LDE0ICsxMzQ4NiwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlPW5vCisJYWNfY3ZfbGliX2NtYV9wdGhyZWFkX2NyZWF0ZT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2NtYV9wdGhyZWFkX2NyZWF0ZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2NtYV9wdGhyZWFkX2NyZWF0ZSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl9jbWFfcHRocmVhZF9jcmVhdGUgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgV0lUSF9USFJFQUQgMQpAQCAtMTI4NzIsOSArMTM1MjQsMTEgQEAKIGZpCiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maTsKK2ZpCisKIGZpCiAKIApAQCAtMTI4ODIsOCArMTM1MzYsOCBAQAogCiAKIAotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdXNjb25maWcgaW4gLWxtcGMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdXNjb25maWcgaW4gLWxtcGMuLi4gJEVDSE9fQyIgPiY2CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVzY29uZmlnIGluIC1sbXBjIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVzY29uZmlnIGluIC1sbXBjLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfbXBjX3VzY29uZmlnK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xMjg5NiwxNyArMTM1NTAsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHVzY29uZmlnICgpOwogaW50CiBtYWluICgpCiB7Ci11c2NvbmZpZyAoKTsKK3JldHVybiB1c2NvbmZpZyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTEyOTM3LDE0ICsxMzU5MSwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfbXBjX3VzY29uZmlnPW5vCisJYWNfY3ZfbGliX21wY191c2NvbmZpZz1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX21wY191c2NvbmZpZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX21wY191c2NvbmZpZyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfbXBjX3VzY29uZmlnIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfbXBjX3VzY29uZmlnIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl9tcGNfdXNjb25maWcgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgV0lUSF9USFJFQUQgMQpAQCAtMTI5NTcsOCArMTM2MTIsOCBAQAogCiAKICAgICBpZiB0ZXN0ICIkcG9zaXhfdGhyZWFkcyIgIT0gInllcyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGhyX2NyZWF0ZSBpbiAtbHRocmVhZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0aHJfY3JlYXRlIGluIC1sdGhyZWFkLi4uICRFQ0hPX0MiID4mNgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRocl9jcmVhdGUgaW4gLWx0aHJlYWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGhyX2NyZWF0ZSBpbiAtbHRocmVhZC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbGliX3RocmVhZF90aHJfY3JlYXRlK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xMjk3MSwxNyArMTM2MjYsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHRocl9jcmVhdGUgKCk7CiBpbnQKIG1haW4gKCkKIHsKLXRocl9jcmVhdGUgKCk7CityZXR1cm4gdGhyX2NyZWF0ZSAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTEzMDEyLDE0ICsxMzY2NywxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfdGhyZWFkX3Rocl9jcmVhdGU9bm8KKwlhY19jdl9saWJfdGhyZWFkX3Rocl9jcmVhdGU9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl90aHJlYWRfdGhyX2NyZWF0ZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3RocmVhZF90aHJfY3JlYXRlIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl90aHJlYWRfdGhyX2NyZWF0ZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3RocmVhZF90aHJfY3JlYXRlIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl90aHJlYWRfdGhyX2NyZWF0ZSA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBXSVRIX1RIUkVBRCAxCkBAIC0xMzA2Nyw4ICsxMzcyMyw4IEBACiAJCSAgICAgICA7OwogICAgICAgZXNhYwogCi0gICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgUFRIUkVBRF9TQ09QRV9TWVNURU0gaXMgc3VwcG9ydGVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgUFRIUkVBRF9TQ09QRV9TWVNURU0gaXMgc3VwcG9ydGVkLi4uICRFQ0hPX0MiID4mNgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgUFRIUkVBRF9TQ09QRV9TWVNURU0gaXMgc3VwcG9ydGVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgUFRIUkVBRF9TQ09QRV9TWVNURU0gaXMgc3VwcG9ydGVkLi4uICRFQ0hPX0MiID4mNjsgfQogICAgICAgaWYgdGVzdCAiJHthY19jdl9wdGhyZWFkX3N5c3RlbV9zdXBwb3J0ZWQrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTEzMTE0LDEzICsxMzc3MCwxNSBAQAogKCBleGl0ICRhY19zdGF0dXMgKQogYWNfY3ZfcHRocmVhZF9zeXN0ZW1fc3VwcG9ydGVkPW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAorCisKIGZpCiAKLSAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wdGhyZWFkX3N5c3RlbV9zdXBwb3J0ZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3B0aHJlYWRfc3lzdGVtX3N1cHBvcnRlZCIgPiY2CisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wdGhyZWFkX3N5c3RlbV9zdXBwb3J0ZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3B0aHJlYWRfc3lzdGVtX3N1cHBvcnRlZCIgPiY2OyB9CiAgICAgICBpZiB0ZXN0ICIkYWNfY3ZfcHRocmVhZF9zeXN0ZW1fc3VwcG9ydGVkIiA9ICJ5ZXMiOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCkBAIC0xMzEzMiw5ICsxMzc5MCw5IEBACiBmb3IgYWNfZnVuYyBpbiBwdGhyZWFkX3NpZ21hc2sKIGRvCiBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xMzE2MCwzMCArMTM4MTgsMjQgQEAKIAogI3VuZGVmICRhY19mdW5jCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgotewogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciAkYWNfZnVuYyAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwogY2hva2UgbWUKLSNlbHNlCi1jaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19CiAjZW5kaWYKIAogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gZiAhPSAkYWNfZnVuYzsKK3JldHVybiAkYWNfZnVuYyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTEzMjE0LDEzICsxMzg2NiwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1ldmFsICIkYXNfYWNfdmFyPW5vIgorCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQpAQCAtMTMyNDMsMTkgKzEzODk3LDE4IEBACiAjIENoZWNrIGZvciBlbmFibGUtaXB2NgogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiAtLWVuYWJsZS1pcHY2IGlzIHNwZWNpZmllZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIC0tZW5hYmxlLWlwdjYgaXMgc3BlY2lmaWVkLi4uICRFQ0hPX0MiID4mNgotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWlwdjYgb3IgLS1kaXNhYmxlLWlwdjYgd2FzIGdpdmVuLgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgLS1lbmFibGUtaXB2NiBpcyBzcGVjaWZpZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiAtLWVuYWJsZS1pcHY2IGlzIHNwZWNpZmllZC4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1pcHY2IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX2lwdjYrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2lwdjYiCi0gICBjYXNlICIkZW5hYmxldmFsIiBpbgorICBlbmFibGV2YWw9JGVuYWJsZV9pcHY2OyAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KICAgbm8pCi0gICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogICAgICAgIGlwdjY9bm8KICAgICAgICA7OwotICAqKSAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICAqKSAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiAgICAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgRU5BQkxFX0lQVjYgMQogX0FDRU9GCkBAIC0xMzI2Niw4ICsxMzkxOSw4IEBACiBlbHNlCiAKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KICAgaXB2Nj1ubwogCiBlbHNlCkBAIC0xMzMwMCw4ICsxMzk1Myw4IEBACiAgIGFjX3N0YXR1cz0kPwogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogICBpcHY2PXllcwogZWxzZQogICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQpAQCAtMTMzMDksMTYgKzEzOTYyLDE4IEBACiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKICggZXhpdCAkYWNfc3RhdHVzICkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogICBpcHY2PW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAorCisKIGlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCi0JZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIFJGQzI1NTMgQVBJIGlzIGF2YWlsYWJsZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIFJGQzI1NTMgQVBJIGlzIGF2YWlsYWJsZS4uLiAkRUNIT19DIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBSRkMyNTUzIEFQSSBpcyBhdmFpbGFibGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpZiBSRkMyNTUzIEFQSSBpcyBhdmFpbGFibGUuLi4gJEVDSE9fQyIgPiY2OyB9CiAJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTMzNTcsMTcgKzE0MDEyLDE4IEBACiAgIGFjX3N0YXR1cz0kPwogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogCQlpcHY2PXllcwogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiAJCWlwdjY9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKQEAgLTEzMzc4LDE1ICsxNDAzNCwxNiBAQAogCiBmaQogCi1maTsKK2ZpCisKIAogaXB2NnR5cGU9dW5rbm93bgogaXB2NmxpYj1ub25lCiBpcHY2dHJ5bGliYz1ubwogCiBpZiB0ZXN0ICIkaXB2NiIgPSAieWVzIjsgdGhlbgotCWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpcHY2IHN0YWNrIHR5cGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBpcHY2IHN0YWNrIHR5cGUuLi4gJEVDSE9fQyIgPiY2CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaXB2NiBzdGFjayB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaXB2NiBzdGFjayB0eXBlLi4uICRFQ0hPX0MiID4mNjsgfQogCWZvciBpIGluIGlucmlhIGthbWUgbGludXgtZ2xpYmMgbGludXgtaW5ldDYgc29sYXJpcyB0b3NoaWJhIHY2ZCB6ZXRhOwogCWRvCiAJCWNhc2UgJGkgaW4KQEAgLTEzNTQyLDggKzE0MTk5LDggQEAKIAkJCWJyZWFrCiAJCWZpCiAJZG9uZQotCWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRpcHY2dHlwZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kaXB2NnR5cGUiID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGlwdjZ0eXBlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRpcHY2dHlwZSIgPiY2OyB9CiBmaQogCiBpZiB0ZXN0ICIkaXB2NiIgPSAieWVzIiAtYSAiJGlwdjZsaWIiICE9ICJub25lIjsgdGhlbgpAQCAtMTM1NjMsMTQgKzE0MjIwLDE0IEBACiBmaQogCiAjIENoZWNrIGZvciAtLXdpdGgtZG9jLXN0cmluZ3MKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLWRvYy1zdHJpbmdzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aC1kb2Mtc3RyaW5ncy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtZG9jLXN0cmluZ3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLWRvYy1zdHJpbmdzLi4uICRFQ0hPX0MiID4mNjsgfQogCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWRvYy1zdHJpbmdzIG9yIC0td2l0aG91dC1kb2Mtc3RyaW5ncyB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRvYy1zdHJpbmdzIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9kb2Nfc3RyaW5ncytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9kb2Nfc3RyaW5ncyIKKyAgd2l0aHZhbD0kd2l0aF9kb2Nfc3RyaW5nczsKK2ZpCiAKLWZpOwogCiBpZiB0ZXN0IC16ICIkd2l0aF9kb2Nfc3RyaW5ncyIKIHRoZW4gd2l0aF9kb2Nfc3RyaW5ncz0ieWVzIgpAQCAtMTM1ODMsMTcgKzE0MjQwLDE2IEBACiBfQUNFT0YKIAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3aXRoX2RvY19zdHJpbmdzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR3aXRoX2RvY19zdHJpbmdzIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhfZG9jX3N0cmluZ3MiID4mNQorZWNobyAiJHtFQ0hPX1R9JHdpdGhfZG9jX3N0cmluZ3MiID4mNjsgfQogCiAjIENoZWNrIGZvciBQeXRob24tc3BlY2lmaWMgbWFsbG9jIHN1cHBvcnQKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXRzYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtdHNjLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC10c2MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLXRzYy4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC10c2Mgb3IgLS13aXRob3V0LXRzYyB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRzYyB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfdHNjK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX3RzYyIKLQorICB3aXRodmFsPSR3aXRoX3RzYzsKIGlmIHRlc3QgIiR3aXRodmFsIiAhPSBubwogdGhlbgogCkBAIC0xMzYwMSwyNSArMTQyNTcsMjYgQEAKICNkZWZpbmUgV0lUSF9UU0MgMQogX0FDRU9GCiAKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKLWVsc2UgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotZmk7CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKwogCiAjIENoZWNrIGZvciBQeXRob24tc3BlY2lmaWMgbWFsbG9jIHN1cHBvcnQKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLXB5bWFsbG9jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aC1weW1hbGxvYy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtcHltYWxsb2MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLXB5bWFsbG9jLi4uICRFQ0hPX0MiID4mNjsgfQogCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXB5bWFsbG9jIG9yIC0td2l0aG91dC1weW1hbGxvYyB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXB5bWFsbG9jIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF9weW1hbGxvYytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9weW1hbGxvYyIKKyAgd2l0aHZhbD0kd2l0aF9weW1hbGxvYzsKK2ZpCiAKLWZpOwogCiBpZiB0ZXN0IC16ICIkd2l0aF9weW1hbGxvYyIKIHRoZW4gd2l0aF9weW1hbGxvYz0ieWVzIgpAQCAtMTM2MzIsMTcgKzE0Mjg5LDE2IEBACiBfQUNFT0YKIAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3aXRoX3B5bWFsbG9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR3aXRoX3B5bWFsbG9jIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdpdGhfcHltYWxsb2MiID4mNQorZWNobyAiJHtFQ0hPX1R9JHdpdGhfcHltYWxsb2MiID4mNjsgfQogCiAjIENoZWNrIGZvciAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucy4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC13Y3R5cGUtZnVuY3Rpb25zIG9yIC0td2l0aG91dC13Y3R5cGUtZnVuY3Rpb25zIHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucyB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfd2N0eXBlX2Z1bmN0aW9ucytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF93Y3R5cGVfZnVuY3Rpb25zIgotCisgIHdpdGh2YWw9JHdpdGhfd2N0eXBlX2Z1bmN0aW9uczsKIGlmIHRlc3QgIiR3aXRodmFsIiAhPSBubwogdGhlbgogCkBAIC0xMzY1MCwxNSArMTQzMDYsMTYgQEAKICNkZWZpbmUgV0FOVF9XQ1RZUEVfRlVOQ1RJT05TIDEKIF9BQ0VPRgogCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgotZWxzZSBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotZmk7CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKwogCiAjIC1JJHtETElOQ0xESVJ9IGlzIGFkZGVkIHRvIHRoZSBjb21waWxlIHJ1bGUgZm9yIGltcG9ydGRsLm8KIApAQCAtMTM2NzAsOSArMTQzMjcsOSBAQAogZm9yIGFjX2Z1bmMgaW4gZGxvcGVuCiBkbwogYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtMTM2OTgsMzAgKzE0MzU1LDI0IEBACiAKICN1bmRlZiAkYWNfZnVuYwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKLXsKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgJGFjX2Z1bmMgKCk7CiAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCiAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKIGNob2tlIG1lCi0jZWxzZQotY2hhciAoKmYpICgpID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQogI2VuZGlmCiAKIGludAogbWFpbiAoKQogewotcmV0dXJuIGYgIT0gJGFjX2Z1bmM7CityZXR1cm4gJGFjX2Z1bmMgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xMzc1MiwxMyArMTQ0MDMsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZXZhbCAiJGFzX2FjX3Zhcj1ubyIKKwlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci1lY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2CithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQogaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKQEAgLTEzNzcxLDggKzE0NDI0LDggQEAKICMgRFlOTE9BREZJTEUgc3BlY2lmaWVzIHdoaWNoIGR5bmxvYWRfKi5vIGZpbGUgd2Ugd2lsbCB1c2UgZm9yIGR5bmFtaWMKICMgbG9hZGluZyBvZiBtb2R1bGVzLgogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgRFlOTE9BREZJTEUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBEWU5MT0FERklMRS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIERZTkxPQURGSUxFIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgRFlOTE9BREZJTEUuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0IC16ICIkRFlOTE9BREZJTEUiCiB0aGVuCiAJY2FzZSAkYWNfc3lzX3N5c3RlbS8kYWNfc3lzX3JlbGVhc2UgaW4KQEAgLTEzNzk3LDggKzE0NDUwLDggQEAKIAk7OwogCWVzYWMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRFlOTE9BREZJTEUiID4mNQotZWNobyAiJHtFQ0hPX1R9JERZTkxPQURGSUxFIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJERZTkxPQURGSUxFIiA+JjUKK2VjaG8gIiR7RUNIT19UfSREWU5MT0FERklMRSIgPiY2OyB9CiBpZiB0ZXN0ICIkRFlOTE9BREZJTEUiICE9ICJkeW5sb2FkX3N0dWIubyIKIHRoZW4KIApAQCAtMTM4MTEsMTYgKzE0NDY0LDE2IEBACiAjIE1BQ0hERVBfT0JKUyBjYW4gYmUgc2V0IHRvIHBsYXRmb3JtLXNwZWNpZmljIG9iamVjdCBmaWxlcyBuZWVkZWQgYnkgUHl0aG9uCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIE1BQ0hERVBfT0JKUyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIE1BQ0hERVBfT0JKUy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIE1BQ0hERVBfT0JKUyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIE1BQ0hERVBfT0JKUy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgLXogIiRNQUNIREVQX09CSlMiCiB0aGVuCiAJTUFDSERFUF9PQkpTPSRleHRyYV9tYWNoZGVwX29ianMKIGVsc2UKIAlNQUNIREVQX09CSlM9IiRNQUNIREVQX09CSlMgJGV4dHJhX21hY2hkZXBfb2JqcyIKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBNQUNIREVQX09CSlMiID4mNQotZWNobyAiJHtFQ0hPX1R9TUFDSERFUF9PQkpTIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogTUFDSERFUF9PQkpTIiA+JjUKK2VjaG8gIiR7RUNIT19UfU1BQ0hERVBfT0JKUyIgPiY2OyB9CiAKICMgY2hlY2tzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucwogCkBAIC0xMzkxMyw5ICsxNDU2Niw5IEBACiAgdHJ1bmNhdGUgdW5hbWUgdW5zZXRlbnYgdXRpbWVzIHdhaXRwaWQgd2FpdDMgd2FpdDQgd2NzY29sbCBfZ2V0cHR5CiBkbwogYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtMTM5NDEsMzAgKzE0NTk0LDI0IEBACiAKICN1bmRlZiAkYWNfZnVuYwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKLXsKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgJGFjX2Z1bmMgKCk7CiAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCiAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKIGNob2tlIG1lCi0jZWxzZQotY2hhciAoKmYpICgpID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQogI2VuZGlmCiAKIGludAogbWFpbiAoKQogewotcmV0dXJuIGYgIT0gJGFjX2Z1bmM7CityZXR1cm4gJGFjX2Z1bmMgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xMzk5NSwxMyArMTQ2NDIsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZXZhbCAiJGFzX2FjX3Zhcj1ubyIKKwlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci1lY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2CithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQogaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKQEAgLTE0MDEzLDggKzE0NjYyLDggQEAKIAogIyBGb3Igc29tZSBmdW5jdGlvbnMsIGhhdmluZyBhIGRlZmluaXRpb24gaXMgbm90IHN1ZmZpY2llbnQsIHNpbmNlCiAjIHdlIHdhbnQgdG8gdGFrZSB0aGVpciBhZGRyZXNzLgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjaHJvb3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgY2hyb290Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGNocm9vdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBjaHJvb3QuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDA1NiwxOSArMTQ3MDUsMjAgQEAKICNkZWZpbmUgSEFWRV9DSFJPT1QgMQogX0FDRU9GCiAKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaW5rIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpbmsuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGluayIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaW5rLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTQxMTAsMTkgKzE0NzYwLDIwIEBACiAjZGVmaW5lIEhBVkVfTElOSyAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN5bWxpbmsiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3ltbGluay4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzeW1saW5rIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN5bWxpbmsuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDE2NCwxOSArMTQ4MTUsMjAgQEAKICNkZWZpbmUgSEFWRV9TWU1MSU5LIDEKIF9BQ0VPRgogCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmNoZGlyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZjaGRpci4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmY2hkaXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmNoZGlyLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTQyMTgsMTkgKzE0ODcwLDIwIEBACiAjZGVmaW5lIEhBVkVfRkNIRElSIDEKIF9BQ0VPRgogCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZnN5bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZnN5bmMuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZnN5bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZnN5bmMuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDI3MiwxOSArMTQ5MjUsMjAgQEAKICNkZWZpbmUgSEFWRV9GU1lOQyAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZkYXRhc3luYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBmZGF0YXN5bmMuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmRhdGFzeW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZkYXRhc3luYy4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTE0MzI2LDE2ICsxNDk4MCwxNyBAQAogI2RlZmluZSBIQVZFX0ZEQVRBU1lOQyAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKICMgT24gc29tZSBzeXN0ZW1zIChlZy4gRnJlZUJTRCA1KSwgd2Ugd291bGQgZmluZCBhIGRlZmluaXRpb24gb2YgdGhlCkBAIC0xNDM0NCw4ICsxNDk5OSw4IEBACiAjIGFkZHJlc3MgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgYW5kIHBvdGVudGlhbCBtaXNjb21waWxhdGlvbnMKICMgYmVjYXVzZSBvZiB0aGUgbWlzc2luZyBwcm90b3R5cGVzLgogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGN0ZXJtaWRfciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBjdGVybWlkX3IuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgY3Rlcm1pZF9yIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGN0ZXJtaWRfci4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTE0MzkwLDIwICsxNTA0NSwyMSBAQAogI2RlZmluZSBIQVZFX0NURVJNSURfUiAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvY2siID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmxvY2suLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvY2siID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmxvY2suLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDQ0OCwyMCArMTUxMDQsMjEgQEAKICNkZWZpbmUgSEFWRV9GTE9DSyAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0cGFnZXNpemUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ2V0cGFnZXNpemUuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0cGFnZXNpemUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ2V0cGFnZXNpemUuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDUwNiwyNCArMTUxNjMsMjUgQEAKICNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZvciBhY19wcm9nIGluIHRydWUKIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9wcm9nX1RSVUUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE0NTM2LDMyICsxNTE5NCwzNCBAQAogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgdGhlbgorICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc19leGVjdXRhYmxlX3AgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCiAgICAgYWNfY3ZfcHJvZ19UUlVFPSIkYWNfcHJvZyIKICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CiAgICAgYnJlYWsgMgogICBmaQogZG9uZQogZG9uZQorSUZTPSRhc19zYXZlX0lGUwogCiBmaQogZmkKIFRSVUU9JGFjX2N2X3Byb2dfVFJVRQogaWYgdGVzdCAtbiAiJFRSVUUiOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRUUlVFIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRUUlVFIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkVFJVRSIgPiY1CitlY2hvICIke0VDSE9fVH0kVFJVRSIgPiY2OyB9CiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCisKICAgdGVzdCAtbiAiJFRSVUUiICYmIGJyZWFrCiBkb25lCiB0ZXN0IC1uICIkVFJVRSIgfHwgVFJVRT0iL2Jpbi90cnVlIgogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5ldF9hdG9uIGluIC1sYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbmV0X2F0b24gaW4gLWxjLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluZXRfYXRvbiBpbiAtbGMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9hdG9uIGluIC1sYy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbGliX2NfaW5ldF9hdG9uK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNDU3NCwxNyArMTUyMzQsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIGluZXRfYXRvbiAoKTsKIGludAogbWFpbiAoKQogewotaW5ldF9hdG9uICgpOworcmV0dXJuIGluZXRfYXRvbiAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE0NjE1LDIwICsxNTI3NSwyMSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfY19pbmV0X2F0b249bm8KKwlhY19jdl9saWJfY19pbmV0X2F0b249bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9jX2luZXRfYXRvbiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2NfaW5ldF9hdG9uIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9jX2luZXRfYXRvbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2NfaW5ldF9hdG9uIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl9jX2luZXRfYXRvbiA9IHllczsgdGhlbgogICAkYWNfY3ZfcHJvZ19UUlVFCiBlbHNlCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5ldF9hdG9uIGluIC1scmVzb2x2IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGluZXRfYXRvbiBpbiAtbHJlc29sdi4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmV0X2F0b24gaW4gLWxyZXNvbHYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9hdG9uIGluIC1scmVzb2x2Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfcmVzb2x2X2luZXRfYXRvbitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTQ2NDEsMTcgKzE1MzAyLDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBpbmV0X2F0b24gKCk7CiBpbnQKIG1haW4gKCkKIHsKLWluZXRfYXRvbiAoKTsKK3JldHVybiBpbmV0X2F0b24gKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xNDY4MiwxNCArMTUzNDMsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX3Jlc29sdl9pbmV0X2F0b249bm8KKwlhY19jdl9saWJfcmVzb2x2X2luZXRfYXRvbj1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3Jlc29sdl9pbmV0X2F0b24iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9yZXNvbHZfaW5ldF9hdG9uIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9yZXNvbHZfaW5ldF9hdG9uIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcmVzb2x2X2luZXRfYXRvbiIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfcmVzb2x2X2luZXRfYXRvbiA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfTElCUkVTT0xWIDEKQEAgLTE0NzAzLDggKzE1MzY1LDggQEAKIGZpCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBoc3RyZXJyb3IiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaHN0cmVycm9yLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGhzdHJlcnJvciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBoc3RyZXJyb3IuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDc0OSwyMSArMTU0MTEsMjIgQEAKICNkZWZpbmUgSEFWRV9IU1RSRVJST1IgMQogX0FDRU9GCiAKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmV0X2F0b24iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9hdG9uLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluZXRfYXRvbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbmV0X2F0b24uLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDgxMSwyMSArMTU0NzQsMjIgQEAKICNkZWZpbmUgSEFWRV9JTkVUX0FUT04gMQogX0FDRU9GCiAKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmV0X3B0b24iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9wdG9uLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluZXRfcHRvbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbmV0X3B0b24uLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNDg3MywyMSArMTU1MzcsMjIgQEAKICNkZWZpbmUgSEFWRV9JTkVUX1BUT04gMQogX0FDRU9GCiAKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiAjIE9uIHNvbWUgc3lzdGVtcywgc2V0Z3JvdXBzIGlzIGluIHVuaXN0ZC5oLCBvbiBvdGhlcnMsIGluIGdycC5oCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNldGdyb3VwcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzZXRncm91cHMuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2V0Z3JvdXBzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNldGdyb3Vwcy4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTE0OTM1LDE2ICsxNTYwMCwxNyBAQAogI2RlZmluZSBIQVZFX1NFVEdST1VQUyAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKICMgY2hlY2sgZm9yIG9wZW5wdHkgYW5kIGZvcmtwdHkKQEAgLTE0OTUzLDkgKzE1NjE5LDkgQEAKIGZvciBhY19mdW5jIGluIG9wZW5wdHkKIGRvCiBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNDk4MSwzMCArMTU2NDcsMjQgQEAKIAogI3VuZGVmICRhY19mdW5jCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgotewogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciAkYWNfZnVuYyAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwogY2hva2UgbWUKLSNlbHNlCi1jaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19CiAjZW5kaWYKIAogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gZiAhPSAkYWNfZnVuYzsKK3JldHVybiAkYWNfZnVuYyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE1MDM1LDIxICsxNTY5NSwyMyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1ldmFsICIkYXNfYWNfdmFyPW5vIgorCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQogX0FDRU9GCiAKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvcGVucHR5IGluIC1sdXRpbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBvcGVucHR5IGluIC1sdXRpbC4uLiAkRUNIT19DIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG9wZW5wdHkgaW4gLWx1dGlsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG9wZW5wdHkgaW4gLWx1dGlsLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfdXRpbF9vcGVucHR5K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNTA2MiwxNyArMTU3MjQsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIG9wZW5wdHkgKCk7CiBpbnQKIG1haW4gKCkKIHsKLW9wZW5wdHkgKCk7CityZXR1cm4gb3BlbnB0eSAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE1MTAzLDIyICsxNTc2NSwyMyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfdXRpbF9vcGVucHR5PW5vCisJYWNfY3ZfbGliX3V0aWxfb3BlbnB0eT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3V0aWxfb3BlbnB0eSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3V0aWxfb3BlbnB0eSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfdXRpbF9vcGVucHR5IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfdXRpbF9vcGVucHR5IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl91dGlsX29wZW5wdHkgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgSEFWRV9PUEVOUFRZIDEKIF9BQ0VPRgogIExJQlM9IiRMSUJTIC1sdXRpbCIKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvcGVucHR5IGluIC1sYnNkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG9wZW5wdHkgaW4gLWxic2QuLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBvcGVucHR5IGluIC1sYnNkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG9wZW5wdHkgaW4gLWxic2QuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9ic2Rfb3BlbnB0eStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTUxMzEsMTcgKzE1Nzk0LDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBvcGVucHR5ICgpOwogaW50CiBtYWluICgpCiB7Ci1vcGVucHR5ICgpOworcmV0dXJuIG9wZW5wdHkgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xNTE3MiwxNCArMTU4MzUsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX2JzZF9vcGVucHR5PW5vCisJYWNfY3ZfbGliX2JzZF9vcGVucHR5PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfYnNkX29wZW5wdHkiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9ic2Rfb3BlbnB0eSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfYnNkX29wZW5wdHkiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9ic2Rfb3BlbnB0eSIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfYnNkX29wZW5wdHkgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgSEFWRV9PUEVOUFRZIDEKQEAgLTE1MTk4LDkgKzE1ODYyLDkgQEAKIGZvciBhY19mdW5jIGluIGZvcmtwdHkKIGRvCiBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNTIyNiwzMCArMTU4OTAsMjQgQEAKIAogI3VuZGVmICRhY19mdW5jCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgotewogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciAkYWNfZnVuYyAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwogY2hva2UgbWUKLSNlbHNlCi1jaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19CiAjZW5kaWYKIAogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gZiAhPSAkYWNfZnVuYzsKK3JldHVybiAkYWNfZnVuYyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE1MjgwLDIxICsxNTkzOCwyMyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1ldmFsICIkYXNfYWNfdmFyPW5vIgorCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQogX0FDRU9GCiAKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmb3JrcHR5IGluIC1sdXRpbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBmb3JrcHR5IGluIC1sdXRpbC4uLiAkRUNIT19DIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZvcmtwdHkgaW4gLWx1dGlsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZvcmtwdHkgaW4gLWx1dGlsLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfdXRpbF9mb3JrcHR5K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNTMwNywxNyArMTU5NjcsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIGZvcmtwdHkgKCk7CiBpbnQKIG1haW4gKCkKIHsKLWZvcmtwdHkgKCk7CityZXR1cm4gZm9ya3B0eSAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE1MzQ4LDIyICsxNjAwOCwyMyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfdXRpbF9mb3JrcHR5PW5vCisJYWNfY3ZfbGliX3V0aWxfZm9ya3B0eT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3V0aWxfZm9ya3B0eSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3V0aWxfZm9ya3B0eSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfdXRpbF9mb3JrcHR5IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfdXRpbF9mb3JrcHR5IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl91dGlsX2ZvcmtwdHkgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgSEFWRV9GT1JLUFRZIDEKIF9BQ0VPRgogIExJQlM9IiRMSUJTIC1sdXRpbCIKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmb3JrcHR5IGluIC1sYnNkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZvcmtwdHkgaW4gLWxic2QuLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmb3JrcHR5IGluIC1sYnNkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZvcmtwdHkgaW4gLWxic2QuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9ic2RfZm9ya3B0eStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTUzNzYsMTcgKzE2MDM3LDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBmb3JrcHR5ICgpOwogaW50CiBtYWluICgpCiB7Ci1mb3JrcHR5ICgpOworcmV0dXJuIGZvcmtwdHkgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xNTQxNywxNCArMTYwNzgsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX2JzZF9mb3JrcHR5PW5vCisJYWNfY3ZfbGliX2JzZF9mb3JrcHR5PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfYnNkX2ZvcmtwdHkiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9ic2RfZm9ya3B0eSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfYnNkX2ZvcmtwdHkiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9ic2RfZm9ya3B0eSIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfYnNkX2ZvcmtwdHkgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgSEFWRV9GT1JLUFRZIDEKQEAgLTE1NDUwLDkgKzE2MTEyLDkgQEAKIGZvciBhY19mdW5jIGluIGZzZWVrNjQgZnNlZWtvIGZzdGF0dmZzIGZ0ZWxsNjQgZnRlbGxvIHN0YXR2ZnMKIGRvCiBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNTQ3OCwzMCArMTYxNDAsMjQgQEAKIAogI3VuZGVmICRhY19mdW5jCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgotewogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciAkYWNfZnVuYyAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwogY2hva2UgbWUKLSNlbHNlCi1jaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19CiAjZW5kaWYKIAogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gZiAhPSAkYWNfZnVuYzsKK3JldHVybiAkYWNfZnVuYyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE1NTMyLDEzICsxNjE4OCwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1ldmFsICIkYXNfYWNfdmFyPW5vIgorCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQpAQCAtMTU1NTYsOSArMTYyMTQsOSBAQAogZm9yIGFjX2Z1bmMgaW4gZHVwMiBnZXRjd2Qgc3RyZHVwIHN0cmVycm9yIG1lbW1vdmUKIGRvCiBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNTU4NCwzMCArMTYyNDIsMjQgQEAKIAogI3VuZGVmICRhY19mdW5jCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgotewogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciAkYWNfZnVuYyAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwogY2hva2UgbWUKLSNlbHNlCi1jaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19CiAjZW5kaWYKIAogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gZiAhPSAkYWNfZnVuYzsKK3JldHVybiAkYWNfZnVuYyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE1NjM4LDI1ICsxNjI5MCwyNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1ldmFsICIkYXNfYWNfdmFyPW5vIgorCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQogX0FDRU9GCiAKIGVsc2UKLSAgY2FzZSAkTElCT0JKUyBpbgotICAgICIkYWNfZnVuYy4kYWNfb2JqZXh0IiAgIHwgXAotICAqIiAkYWNfZnVuYy4kYWNfb2JqZXh0IiAgIHwgXAotICAgICIkYWNfZnVuYy4kYWNfb2JqZXh0ICIqIHwgXAorICBjYXNlICIgJExJQk9CSlMgIiBpbgogICAqIiAkYWNfZnVuYy4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgJGFjX2Z1bmMuJGFjX29iamV4dCIgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgJGFjX2Z1bmMuJGFjX29iamV4dCIKKyA7OwogZXNhYwogCiBmaQpAQCAtMTU2NjcsOSArMTYzMTksOSBAQAogZm9yIGFjX2Z1bmMgaW4gZ2V0cGdycAogZG8KIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE1Njk1LDMwICsxNjM0NywyNCBAQAogCiAjdW5kZWYgJGFjX2Z1bmMKIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCi17CiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyICRhY19mdW5jICgpOwogLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCiAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKKyNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCiBjaG9rZSBtZQotI2Vsc2UKLWNoYXIgKCpmKSAoKSA9ICRhY19mdW5jOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KICNlbmRpZgogCiBpbnQKIG1haW4gKCkKIHsKLXJldHVybiBmICE9ICRhY19mdW5jOworcmV0dXJuICRhY19mdW5jICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTU3NDksMTMgKzE2Mzk1LDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWV2YWwgIiRhc19hY192YXI9bm8iCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCkBAIC0xNTgwNiw3ICsxNjQ1NCw5IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKKwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiBmaQpAQCAtMTU4MTYsOSArMTY0NjYsOSBAQAogZm9yIGFjX2Z1bmMgaW4gc2V0cGdycAogZG8KIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE1ODQ0LDMwICsxNjQ5NCwyNCBAQAogCiAjdW5kZWYgJGFjX2Z1bmMKIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCi17CiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyICRhY19mdW5jICgpOwogLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCiAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKKyNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCiBjaG9rZSBtZQotI2Vsc2UKLWNoYXIgKCpmKSAoKSA9ICRhY19mdW5jOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KICNlbmRpZgogCiBpbnQKIG1haW4gKCkKIHsKLXJldHVybiBmICE9ICRhY19mdW5jOworcmV0dXJuICRhY19mdW5jICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTU4OTgsMTMgKzE2NTQyLDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWV2YWwgIiRhc19hY192YXI9bm8iCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCkBAIC0xNTk1NSw3ICsxNjYwMSw5IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKKwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiBmaQpAQCAtMTU5NjUsOSArMTY2MTMsOSBAQAogZm9yIGFjX2Z1bmMgaW4gZ2V0dGltZW9mZGF5CiBkbwogYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtMTU5OTMsMzAgKzE2NjQxLDI0IEBACiAKICN1bmRlZiAkYWNfZnVuYwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKLXsKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgJGFjX2Z1bmMgKCk7CiAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCiAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKIGNob2tlIG1lCi0jZWxzZQotY2hhciAoKmYpICgpID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQogI2VuZGlmCiAKIGludAogbWFpbiAoKQogewotcmV0dXJuIGYgIT0gJGFjX2Z1bmM7CityZXR1cm4gJGFjX2Z1bmMgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xNjA0NywxMyArMTY2ODksMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZXZhbCAiJGFzX2FjX3Zhcj1ubyIKKwlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci1lY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2CithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQogaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKQEAgLTE2MTA2LDE0ICsxNjc1MCwxNSBAQAogCiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZmkKIGRvbmUKIAogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1ham9yIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1ham9yLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1ham9yIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG1ham9yLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTYxNjYsMjUgKzE2ODExLDI2IEBACiAjZGVmaW5lIEhBVkVfREVWSUNFX01BQ1JPUyAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIAogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCiAKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogIyBPbiBPU0YvMSBWNS4xLCBnZXRhZGRyaW5mbyBpcyBhdmFpbGFibGUsIGJ1dCBhIGRlZmluZQogIyBmb3IgW25vXWdldGFkZHJpbmZvIGluIG5ldGRiLmguCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGFkZHJpbmZvLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTYyMjksMTMgKzE2ODc1LDEzIEBACiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZ2V0YWRkcmluZm8gYnVnIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZ2V0YWRkcmluZm8gYnVnLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGdldGFkZHJpbmZvIGJ1ZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGdldGFkZHJpbmZvIGJ1Zy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGJ1Z2d5IiA+JjUKLWVjaG8gIiR7RUNIT19UfWJ1Z2d5IiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBidWdneSIgPiY1CitlY2hvICIke0VDSE9fVH1idWdneSIgPiY2OyB9CiBidWdneWdldGFkZHJpbmZvPXllcwogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE2MzQzLDggKzE2OTg5LDggQEAKICAgYWNfc3RhdHVzPSQ/CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogZ29vZCIgPiY1Ci1lY2hvICIke0VDSE9fVH1nb29kIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBnb29kIiA+JjUKK2VjaG8gIiR7RUNIT19UfWdvb2QiID4mNjsgfQogYnVnZ3lnZXRhZGRyaW5mbz1ubwogZWxzZQogICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQpAQCAtMTYzNTIsMjIgKzE2OTk4LDI1IEBACiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKICggZXhpdCAkYWNfc3RhdHVzICkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGJ1Z2d5IiA+JjUKLWVjaG8gIiR7RUNIT19UfWJ1Z2d5IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYnVnZ3kiID4mNQorZWNobyAiJHtFQ0hPX1R9YnVnZ3kiID4mNjsgfQogYnVnZ3lnZXRhZGRyaW5mbz15ZXMKIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCisKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGJ1Z2d5Z2V0YWRkcmluZm89eWVzCiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiAKQEAgLTE2Mzg4LDkgKzE3MDM3LDkgQEAKIGZvciBhY19mdW5jIGluIGdldG5hbWVpbmZvCiBkbwogYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JGFzX2FjX3ZhcitzZXR9XCIgPSBzZXQiOyB0aGVuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtMTY0MTYsMzAgKzE3MDY1LDI0IEBACiAKICN1bmRlZiAkYWNfZnVuYwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKLXsKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgJGFjX2Z1bmMgKCk7CiAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCiAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQorI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKIGNob2tlIG1lCi0jZWxzZQotY2hhciAoKmYpICgpID0gJGFjX2Z1bmM7Ci0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQogI2VuZGlmCiAKIGludAogbWFpbiAoKQogewotcmV0dXJuIGYgIT0gJGFjX2Z1bmM7CityZXR1cm4gJGFjX2Z1bmMgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xNjQ3MCwxMyArMTcxMTMsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotZXZhbCAiJGFzX2FjX3Zhcj1ubyIKKwlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY1Ci1lY2hvICIke0VDSE9fVH1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCIgPiY2CithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQogaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKQEAgLTE2NDg3LDggKzE3MTMyLDggQEAKIAogCiAjIGNoZWNrcyBmb3Igc3RydWN0dXJlcwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfdGltZStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTY1MzcsMTIgKzE3MTgyLDEzIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2hlYWRlcl90aW1lPW5vCisJYWNfY3ZfaGVhZGVyX3RpbWU9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl90aW1lIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl90aW1lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfdGltZSIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtMTY1NTEsOCArMTcxOTcsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3QgdG0gaXMgaW4gc3lzL3RpbWUuaCBvciB0aW1lLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHN0cnVjdCB0bSBpcyBpbiBzeXMvdGltZS5oIG9yIHRpbWUuaC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBzdHJ1Y3QgdG0gaXMgaW4gc3lzL3RpbWUuaCBvciB0aW1lLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3N0cnVjdF90bStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTY1OTksMTIgKzE3MjQ1LDEzIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3N0cnVjdF90bT1zeXMvdGltZS5oCisJYWNfY3Zfc3RydWN0X3RtPXN5cy90aW1lLmgKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X3RtIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zdHJ1Y3RfdG0iID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X3RtIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zdHJ1Y3RfdG0iID4mNjsgfQogaWYgdGVzdCAkYWNfY3Zfc3RydWN0X3RtID0gc3lzL3RpbWUuaDsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtMTY2MTMsOCArMTcyNjAsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cnVjdCB0bS50bV96b25lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCB0bS50bV96b25lLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cnVjdCB0bS50bV96b25lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCB0bS50bV96b25lLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE2NjY0LDcgKzE3MzExLDcgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgogY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CkBAIC0xNjcxMCwxNCArMTczNTcsMTYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lPW5vCisJYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3RfdG1fdG1fem9uZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3RfdG1fdG1fem9uZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X21lbWJlcl9zdHJ1Y3RfdG1fdG1fem9uZSA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCkBAIC0xNjczNCw4ICsxNzM4Myw4MiBAQAogX0FDRU9GCiAKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0em5hbWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdHpuYW1lLi4uICRFQ0hPX0MiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHR6bmFtZSBpcyBkZWNsYXJlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdHpuYW1lIGlzIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluICgpCit7CisjaWZuZGVmIHR6bmFtZQorICBjaGFyICpwID0gKGNoYXIgKikgdHpuYW1lOworICByZXR1cm4gIXA7CisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY19jb21waWxlXCIiKSA+JjUKKyAgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9oYXZlX2RlY2xfdHpuYW1lPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfaGF2ZV9kZWNsX3R6bmFtZT1ubworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhdmVfZGVjbF90em5hbWUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF90em5hbWUiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfaGF2ZV9kZWNsX3R6bmFtZSA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9UWk5BTUUgMQorX0FDRU9GCisKKworZWxzZQorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9UWk5BTUUgMAorX0FDRU9GCisKKworZmkKKworCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0em5hbWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdHpuYW1lLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl92YXJfdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNjc0NiwxNCArMTc0NjksMTQgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDx0aW1lLmg+Ci0jaWZuZGVmIHR6bmFtZSAvKiBGb3IgU0dJLiAgKi8KLWV4dGVybiBjaGFyICp0em5hbWVbXTsgLyogUlM2MDAwIGFuZCBvdGhlcnMgcmVqZWN0IGNoYXIgKip0em5hbWUuICAqLworI2lmICFIQVZFX0RFQ0xfVFpOQU1FCitleHRlcm4gY2hhciAqdHpuYW1lW107CiAjZW5kaWYKIAogaW50CiBtYWluICgpCiB7Ci1hdG9pKCp0em5hbWUpOworcmV0dXJuIHR6bmFtZVswXVswXTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE2Nzg0LDEzICsxNzUwNywxNCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl92YXJfdHpuYW1lPW5vCisJYWNfY3ZfdmFyX3R6bmFtZT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX3R6bmFtZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdmFyX3R6bmFtZSIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfdHpuYW1lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl92YXJfdHpuYW1lIiA+JjY7IH0KICAgaWYgdGVzdCAkYWNfY3ZfdmFyX3R6bmFtZSA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtMTY4MDAsOCArMTc1MjQsOCBAQAogICBmaQogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdC5zdF9yZGV2IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBzdGF0LnN0X3JkZXYuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfcmRldiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdC5zdF9yZGV2Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRlditzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTY4NDgsNyArMTc1NzIsNyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKQEAgLTE2ODkxLDE0ICsxNzYxNSwxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldj1ubworCWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9yZGV2PW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9yZGV2IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldiIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYgPSB5ZXM7IHRoZW4KIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgpAQCAtMTY5MDgsOCArMTc2MzQsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cnVjdCBzdGF0LnN0X2Jsa3NpemUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfYmxrc2l6ZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdC5zdF9ibGtzaXplIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBzdGF0LnN0X2Jsa3NpemUuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNjk1Niw3ICsxNzY4Miw3IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKIGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTY5OTksMTQgKzE3NzI1LDE2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplPW5vCisJYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsa3NpemU9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsa3NpemUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxrc2l6ZSA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCkBAIC0xNzAxNiw4ICsxNzc0NCw4IEBACiAKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfZmxhZ3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfZmxhZ3MuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfZmxhZ3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfZmxhZ3MuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9mbGFncytzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTcwNjQsNyArMTc3OTIsNyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKQEAgLTE3MTA3LDE0ICsxNzgzNSwxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZmxhZ3M9bm8KKwlhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZmxhZ3M9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2ZsYWdzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZmxhZ3MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2ZsYWdzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZmxhZ3MiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2ZsYWdzID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKQEAgLTE3MTI0LDggKzE3ODU0LDggQEAKIAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdC5zdF9nZW4iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfZ2VuLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cnVjdCBzdGF0LnN0X2dlbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdC5zdF9nZW4uLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9nZW4rc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE3MTcyLDcgKzE3OTAyLDcgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgogY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CkBAIC0xNzIxNSwxNCArMTc5NDUsMTYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2dlbj1ubworCWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9nZW49bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2dlbiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2dlbiIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZ2VuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZ2VuIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9nZW4gPSB5ZXM7IHRoZW4KIAogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgpAQCAtMTcyMzIsOCArMTc5NjQsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN0cnVjdCBzdGF0LnN0X2JpcnRodGltZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdC5zdF9iaXJ0aHRpbWUuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfYmlydGh0aW1lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBzdGF0LnN0X2JpcnRodGltZS4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2JpcnRodGltZStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTcyODAsNyArMTgwMTIsNyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKQEAgLTE3MzIzLDE0ICsxODA1NSwxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmlydGh0aW1lPW5vCisJYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2JpcnRodGltZT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmlydGh0aW1lIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmlydGh0aW1lIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9iaXJ0aHRpbWUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9iaXJ0aHRpbWUiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2JpcnRodGltZSA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCkBAIC0xNzM0MCw4ICsxODA3NCw4IEBACiAKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfYmxvY2tzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHN0cnVjdCBzdGF0LnN0X2Jsb2Nrcy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdHJ1Y3Qgc3RhdC5zdF9ibG9ja3MiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IHN0YXQuc3RfYmxvY2tzLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tzK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNzM4OCw3ICsxODEyMiw3IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKIGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dApAQCAtMTc0MzEsMTQgKzE4MTY1LDE2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibG9ja3M9bm8KKwlhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tzPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibG9ja3MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibG9ja3MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsb2NrcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsb2NrcyIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmxvY2tzID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKQEAgLTE3NDUxLDIwICsxODE4NywxOCBAQAogX0FDRU9GCiAKIGVsc2UKLSAgY2FzZSAkTElCT0JKUyBpbgotICAgICJmaWxlYmxvY2tzLiRhY19vYmpleHQiICAgfCBcCi0gICoiIGZpbGVibG9ja3MuJGFjX29iamV4dCIgICB8IFwKLSAgICAiZmlsZWJsb2Nrcy4kYWNfb2JqZXh0ICIqIHwgXAorICBjYXNlICIgJExJQk9CSlMgIiBpbgogICAqIiBmaWxlYmxvY2tzLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBmaWxlYmxvY2tzLiRhY19vYmpleHQiIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIGZpbGVibG9ja3MuJGFjX29iamV4dCIKKyA7OwogZXNhYwogCiBmaQogCiAKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0aW1lLmggdGhhdCBkZWZpbmVzIGFsdHpvbmUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdGltZS5oIHRoYXQgZGVmaW5lcyBhbHR6b25lLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRpbWUuaCB0aGF0IGRlZmluZXMgYWx0em9uZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0aW1lLmggdGhhdCBkZWZpbmVzIGFsdHpvbmUuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl90aW1lX2FsdHpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE3NTA5LDEzICsxODI0MywxNCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9oZWFkZXJfdGltZV9hbHR6b25lPW5vCisJYWNfY3ZfaGVhZGVyX3RpbWVfYWx0em9uZT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl90aW1lX2FsdHpvbmUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl90aW1lX2FsdHpvbmUiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWVfYWx0em9uZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3RpbWVfYWx0em9uZSIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZV9hbHR6b25lID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCkBAIC0xNzUyNSw4ICsxODI2MCw4IEBACiBmaQogCiB3YXNfaXRfZGVmaW5lZD1ubwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3lzL3NlbGVjdC5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBzeXMvc2VsZWN0LmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHN5cy9zZWxlY3QuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgc3lzL3NlbGVjdC5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTc1NzksMTMgKzE4MzE0LDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd2FzX2l0X2RlZmluZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9JHdhc19pdF9kZWZpbmVkIiA+JjYKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhZGRyaW5mbyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhZGRyaW5mby4uLiAkRUNIT19DIiA+JjYKK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdhc19pdF9kZWZpbmVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3YXNfaXRfZGVmaW5lZCIgPiY2OyB9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhZGRyaW5mbyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBhZGRyaW5mby4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc3RydWN0X2FkZHJpbmZvK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNzYzMSwxMyArMTgzNjgsMTQgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3Zfc3RydWN0X2FkZHJpbmZvPW5vCisJYWNfY3Zfc3RydWN0X2FkZHJpbmZvPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X2FkZHJpbmZvIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zdHJ1Y3RfYWRkcmluZm8iID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X2FkZHJpbmZvIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zdHJ1Y3RfYWRkcmluZm8iID4mNjsgfQogaWYgdGVzdCAkYWNfY3Zfc3RydWN0X2FkZHJpbmZvID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCkBAIC0xNzY0Niw4ICsxODM4NCw4IEBACiAKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc29ja2FkZHJfc3RvcmFnZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzb2NrYWRkcl9zdG9yYWdlLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNvY2thZGRyX3N0b3JhZ2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc29ja2FkZHJfc3RvcmFnZS4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2Urc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE3Njk0LDEzICsxODQzMiwxNCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZT1ubworCWFjX2N2X3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3N0cnVjdF9zb2NrYWRkcl9zdG9yYWdlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9zdHJ1Y3Rfc29ja2FkZHJfc3RvcmFnZSA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtMTc3MTIsOCArMTg0NTEsOCBAQAogIyBjaGVja3MgZm9yIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcwogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGNoYXIgaXMgdW5zaWduZWQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGNoYXIgaXMgdW5zaWduZWQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGNoYXIgaXMgdW5zaWduZWQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIGNoYXIgaXMgdW5zaWduZWQuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2NfY2hhcl91bnNpZ25lZCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTc3NjAsMTIgKzE4NDk5LDEzIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2NfY2hhcl91bnNpZ25lZD15ZXMKKwlhY19jdl9jX2NoYXJfdW5zaWduZWQ9eWVzCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY2hhcl91bnNpZ25lZCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jaGFyX3Vuc2lnbmVkIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY2hhcl91bnNpZ25lZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jaGFyX3Vuc2lnbmVkIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2NfY2hhcl91bnNpZ25lZCA9IHllcyAmJiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgX19DSEFSX1VOU0lHTkVEX18gMQpAQCAtMTc3NzMsOCArMTg1MTMsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9jX2NvbnN0K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xNzgxNCw2ICsxODU1NCw3IEBACiAgICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKIAogICAgICp0KysgPSAwOworICAgIGlmIChzKSByZXR1cm4gMDsKICAgfQogICB7IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwogICAgIGludCB4W10gPSB7MjUsIDE3fTsKQEAgLTE3ODMyLDcgKzE4NTczLDkgQEAKICAgfQogICB7IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwogICAgIGNvbnN0IGludCBmb28gPSAxMDsKKyAgICBpZiAoIWZvbykgcmV0dXJuIDA7CiAgIH0KKyAgcmV0dXJuICF4WzBdICYmICF6ZXJvLng7CiAjZW5kaWYKIAogICA7CkBAIC0xNzg2NSwxMiArMTg2MDgsMTMgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfY19jb25zdD1ubworCWFjX2N2X2NfY29uc3Q9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb25zdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jb25zdCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbnN0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgpAQCAtMTc4ODEsOCArMTg2MjUsOCBAQAogCiAKIHdvcmtzPW5vCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdm9sYXRpbGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igd29ya2luZyB2b2xhdGlsZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIHZvbGF0aWxlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdm9sYXRpbGUuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNzkzMSwxMyArMTg2NzUsMTQgQEAKIAogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd29ya3MiID4mNQotZWNobyAiJHtFQ0hPX1R9JHdvcmtzIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdvcmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3b3JrcyIgPiY2OyB9CiAKIHdvcmtzPW5vCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgc2lnbmVkIGNoYXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igd29ya2luZyBzaWduZWQgY2hhci4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3b3JraW5nIHNpZ25lZCBjaGFyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgc2lnbmVkIGNoYXIuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xNzk4NiwxMyArMTg3MzEsMTQgQEAKIAogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd29ya3MiID4mNQotZWNobyAiJHtFQ0hPX1R9JHdvcmtzIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdvcmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR3b3JrcyIgPiY2OyB9CiAKIGhhdmVfcHJvdG90eXBlcz1ubwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcm90b3R5cGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHJvdG90eXBlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwcm90b3R5cGVzLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTgwNDEsMTQgKzE4Nzg3LDE2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKKwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfcHJvdG90eXBlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kaGF2ZV9wcm90b3R5cGVzIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfcHJvdG90eXBlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kaGF2ZV9wcm90b3R5cGVzIiA+JjY7IH0KIAogd29ya3M9bm8KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdmFyaWFibGUgbGVuZ3RoIHByb3RvdHlwZXMgYW5kIHN0ZGFyZy5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHZhcmlhYmxlIGxlbmd0aCBwcm90b3R5cGVzIGFuZCBzdGRhcmcuaC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB2YXJpYWJsZSBsZW5ndGggcHJvdG90eXBlcyBhbmQgc3RkYXJnLmgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdmFyaWFibGUgbGVuZ3RoIHByb3RvdHlwZXMgYW5kIHN0ZGFyZy5oLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTgxMDcsMTQgKzE4ODU1LDE2IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKKwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdvcmtzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR3b3JrcyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3b3JrcyIgPiY1CitlY2hvICIke0VDSE9fVH0kd29ya3MiID4mNjsgfQogCiAjIGNoZWNrIGZvciBzb2NrZXRwYWlyCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNvY2tldHBhaXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc29ja2V0cGFpci4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzb2NrZXRwYWlyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2tldHBhaXIuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xODE1OSwyMSArMTg5MDksMjIgQEAKICNkZWZpbmUgSEFWRV9TT0NLRVRQQUlSIDEKIF9BQ0VPRgogCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogIyBjaGVjayBpZiBzb2NrYWRkciBoYXMgc2FfbGVuIG1lbWJlcgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHNvY2thZGRyIGhhcyBzYV9sZW4gbWVtYmVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgc29ja2FkZHIgaGFzIHNhX2xlbiBtZW1iZXIuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiBzb2NrYWRkciBoYXMgc2FfbGVuIG1lbWJlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHNvY2thZGRyIGhhcyBzYV9sZW4gbWVtYmVyLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTgyMTIsOCArMTg5NjMsOCBAQAogICBhY19zdGF0dXM9JD8KICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KIAogY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgSEFWRV9TT0NLQUREUl9TQV9MRU4gMQpAQCAtMTgyMjMsMTQgKzE4OTc0LDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogdmFfbGlzdF9pc19hcnJheT1ubwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdmFfbGlzdCBpcyBhbiBhcnJheSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdmFfbGlzdCBpcyBhbiBhcnJheS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdmFfbGlzdCBpcyBhbiBhcnJheSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdmFfbGlzdCBpcyBhbiBhcnJheS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTE4Mjg3LDE2ICsxOTAzOSwxNyBAQAogIHZhX2xpc3RfaXNfYXJyYXk9eWVzCiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR2YV9saXN0X2lzX2FycmF5IiA+JjUKLWVjaG8gIiR7RUNIT19UfSR2YV9saXN0X2lzX2FycmF5IiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHZhX2xpc3RfaXNfYXJyYXkiID4mNQorZWNobyAiJHtFQ0hPX1R9JHZhX2xpc3RfaXNfYXJyYXkiID4mNjsgfQogCiAjIHNpZ2ggLS0gZ2V0aG9zdGJ5bmFtZV9yIGlzIGEgbWVzczsgaXQgY2FuIGhhdmUgMywgNSBvciA2IGFyZ3VtZW50cyA6LSgKIAogCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZV9yIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWVfci4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lX3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZV9yLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9mdW5jX2dldGhvc3RieW5hbWVfcitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTgzMjMsMzAgKzE5MDc2LDI0IEBACiAKICN1bmRlZiBnZXRob3N0YnluYW1lX3IKIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCi17CiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIGdldGhvc3RieW5hbWVfciAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9nZXRob3N0YnluYW1lX3IpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2dldGhvc3RieW5hbWVfcikKKyNpZiBkZWZpbmVkIF9fc3R1Yl9nZXRob3N0YnluYW1lX3IgfHwgZGVmaW5lZCBfX3N0dWJfX19nZXRob3N0YnluYW1lX3IKIGNob2tlIG1lCi0jZWxzZQotY2hhciAoKmYpICgpID0gZ2V0aG9zdGJ5bmFtZV9yOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KICNlbmRpZgogCiBpbnQKIG1haW4gKCkKIHsKLXJldHVybiBmICE9IGdldGhvc3RieW5hbWVfcjsKK3JldHVybiBnZXRob3N0YnluYW1lX3IgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xODM3NywyMSArMTkxMjQsMjIgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lX3I9bm8KKwlhY19jdl9mdW5jX2dldGhvc3RieW5hbWVfcj1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lX3IiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZV9yIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZV9yIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX2dldGhvc3RieW5hbWVfciIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWVfciA9IHllczsgdGhlbgogCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCiAjZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SIDEKIF9BQ0VPRgogCi0gIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBnZXRob3N0YnluYW1lX3Igd2l0aCA2IGFyZ3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBnZXRob3N0YnluYW1lX3Igd2l0aCA2IGFyZ3MuLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGdldGhvc3RieW5hbWVfciB3aXRoIDYgYXJncyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGdldGhvc3RieW5hbWVfciB3aXRoIDYgYXJncy4uLiAkRUNIT19DIiA+JjY7IH0KICAgT0xEX0NGTEFHUz0kQ0ZMQUdTCiAgIENGTEFHUz0iJENGTEFHUyAkTVlfQ1BQRkxBR1MgJE1ZX1RIUkVBRF9DUFBGTEFHUyAkTVlfQ0ZMQUdTIgogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE4NDUwLDE4ICsxOTE5OCwxOCBAQAogI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUl82X0FSRyAxCiBfQUNFT0YKIAotICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CiAKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAogCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBnZXRob3N0YnluYW1lX3Igd2l0aCA1IGFyZ3MiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBnZXRob3N0YnluYW1lX3Igd2l0aCA1IGFyZ3MuLi4gJEVDSE9fQyIgPiY2CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZ2V0aG9zdGJ5bmFtZV9yIHdpdGggNSBhcmdzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZ2V0aG9zdGJ5bmFtZV9yIHdpdGggNSBhcmdzLi4uICRFQ0hPX0MiID4mNjsgfQogICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTE4NTE4LDE4ICsxOTI2NiwxOCBAQAogI2RlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUl81X0FSRyAxCiBfQUNFT0YKIAotICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2CisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKIAotICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgotICAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGdldGhvc3RieW5hbWVfciB3aXRoIDMgYXJncyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGdldGhvc3RieW5hbWVfciB3aXRoIDMgYXJncy4uLiAkRUNIT19DIiA+JjYKKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZ2V0aG9zdGJ5bmFtZV9yIHdpdGggMyBhcmdzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZ2V0aG9zdGJ5bmFtZV9yIHdpdGggMyBhcmdzLi4uICRFQ0hPX0MiID4mNjsgfQogICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBjb25mZGVmcy5oLiAgKi8KIF9BQ0VPRgpAQCAtMTg1ODQsMjQgKzE5MzMyLDI3IEBACiAjZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHIDEKIF9BQ0VPRgogCi0gICAgICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKIAotICAgICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2CisgICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBDRkxBR1M9JE9MRF9DRkxBR1MKIApAQCAtMTg2MTEsOSArMTkzNjIsOSBAQAogZm9yIGFjX2Z1bmMgaW4gZ2V0aG9zdGJ5bmFtZQogZG8KIGFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNgotaWYgZXZhbCAidGVzdCBcIlwkeyRhc19hY192YXIrc2V0fVwiID0gc2V0IjsgdGhlbgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE4NjM5LDMwICsxOTM5MCwyNCBAQAogCiAjdW5kZWYgJGFjX2Z1bmMKIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCi17CiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyICRhY19mdW5jICgpOwogLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCiAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKKyNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCiBjaG9rZSBtZQotI2Vsc2UKLWNoYXIgKCpmKSAoKSA9ICRhY19mdW5jOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KICNlbmRpZgogCiBpbnQKIG1haW4gKCkKIHsKLXJldHVybiBmICE9ICRhY19mdW5jOworcmV0dXJuICRhY19mdW5jICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTg2OTMsMTMgKzE5NDM4LDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWV2YWwgIiRhc19hY192YXI9bm8iCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNQotZWNobyAiJHtFQ0hPX1R9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AiID4mNgorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KIGlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCkBAIC0xODcyMSw4ICsxOTQ2OCw4IEBACiAjIChub25lIHlldCkKIAogIyBMaW51eCByZXF1aXJlcyB0aGlzIGZvciBjb3JyZWN0IGYucC4gb3BlcmF0aW9ucwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfX2ZwdV9jb250cm9sIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIF9fZnB1X2NvbnRyb2wuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX19mcHVfY29udHJvbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX2ZwdV9jb250cm9sLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9mdW5jX19fZnB1X2NvbnRyb2wrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE4NzQ5LDMwICsxOTQ5NiwyNCBAQAogCiAjdW5kZWYgX19mcHVfY29udHJvbAogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKLXsKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgX19mcHVfY29udHJvbCAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9fX2ZwdV9jb250cm9sKSB8fCBkZWZpbmVkIChfX3N0dWJfX19fX2ZwdV9jb250cm9sKQorI2lmIGRlZmluZWQgX19zdHViX19fZnB1X2NvbnRyb2wgfHwgZGVmaW5lZCBfX3N0dWJfX19fX2ZwdV9jb250cm9sCiBjaG9rZSBtZQotI2Vsc2UKLWNoYXIgKCpmKSAoKSA9IF9fZnB1X2NvbnRyb2w7Ci0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQogI2VuZGlmCiAKIGludAogbWFpbiAoKQogewotcmV0dXJuIGYgIT0gX19mcHVfY29udHJvbDsKK3JldHVybiBfX2ZwdV9jb250cm9sICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMTg4MDMsMTkgKzE5NTQ0LDIwIEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2Z1bmNfX19mcHVfY29udHJvbD1ubworCWFjX2N2X2Z1bmNfX19mcHVfY29udHJvbD1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19fX2ZwdV9jb250cm9sIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX19fZnB1X2NvbnRyb2wiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19fX2ZwdV9jb250cm9sIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX19fZnB1X2NvbnRyb2wiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfZnVuY19fX2ZwdV9jb250cm9sID0geWVzOyB0aGVuCiAgIDoKIGVsc2UKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfX2ZwdV9jb250cm9sIGluIC1saWVlZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX2ZwdV9jb250cm9sIGluIC1saWVlZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfX2ZwdV9jb250cm9sIGluIC1saWVlZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX2ZwdV9jb250cm9sIGluIC1saWVlZS4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTg4MjgsMTcgKzE5NTcwLDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBfX2ZwdV9jb250cm9sICgpOwogaW50CiBtYWluICgpCiB7Ci1fX2ZwdV9jb250cm9sICgpOworcmV0dXJuIF9fZnB1X2NvbnRyb2wgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0xODg2OSwxNCArMTk2MTEsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbD1ubworCWFjX2N2X2xpYl9pZWVlX19fZnB1X2NvbnRyb2w9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9pZWVlX19fZnB1X2NvbnRyb2wiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9pZWVlX19fZnB1X2NvbnRyb2wiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbCIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfaWVlZV9fX2ZwdV9jb250cm9sID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9MSUJJRUVFIDEKQEAgLTE4ODkxLDEzICsxOTYzNCwxMiBAQAogCiAKICMgQ2hlY2sgZm9yIC0td2l0aC1mcGVjdGwKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLWZwZWN0bCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtZnBlY3RsLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1mcGVjdGwiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLWZwZWN0bC4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1mcGVjdGwgb3IgLS13aXRob3V0LWZwZWN0bCB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWZwZWN0bCB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfZnBlY3RsK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2ZwZWN0bCIKLQorICB3aXRodmFsPSR3aXRoX2ZwZWN0bDsKIGlmIHRlc3QgIiR3aXRodmFsIiAhPSBubwogdGhlbgogCkBAIC0xODkwNSwxNSArMTk2NDcsMTYgQEAKICNkZWZpbmUgV0FOVF9TSUdGUEVfSEFORExFUiAxCiBfQUNFT0YKIAotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjYKLWVsc2UgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorZWxzZSB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKLWZpOworICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKIAogIyBjaGVjayBmb3IgLS13aXRoLWxpYm09Li4uCiAKQEAgLTE4OTIyLDU1ICsxOTY2NSw1NSBAQAogQmVPUykgOzsKICopIExJQk09LWxtCiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1saWJtPVNUUklORyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtbGlibT1TVFJJTkcuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgLS13aXRoLWxpYm09U1RSSU5HIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC0td2l0aC1saWJtPVNUUklORy4uLiAkRUNIT19DIiA+JjY7IH0KIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJtIG9yIC0td2l0aG91dC1saWJtIHdhcyBnaXZlbi4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlibSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke3dpdGhfbGlibStzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9saWJtIgotCisgIHdpdGh2YWw9JHdpdGhfbGlibTsKIGlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCiB0aGVuIExJQk09Ci0gICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvcmNlIExJQk0gZW1wdHkiID4mNQotZWNobyAiJHtFQ0hPX1R9Zm9yY2UgTElCTSBlbXB0eSIgPiY2CisgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogZm9yY2UgTElCTSBlbXB0eSIgPiY1CitlY2hvICIke0VDSE9fVH1mb3JjZSBMSUJNIGVtcHR5IiA+JjY7IH0KIGVsaWYgdGVzdCAiJHdpdGh2YWwiICE9IHllcwogdGhlbiBMSUJNPSR3aXRodmFsCi0gICAgIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHNldCBMSUJNPVwiJHdpdGh2YWxcIiIgPiY1Ci1lY2hvICIke0VDSE9fVH1zZXQgTElCTT1cIiR3aXRodmFsXCIiID4mNgorICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHNldCBMSUJNPVwiJHdpdGh2YWxcIiIgPiY1CitlY2hvICIke0VDSE9fVH1zZXQgTElCTT1cIiR3aXRodmFsXCIiID4mNjsgfQogZWxzZSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBwcm9wZXIgdXNhZ2UgaXMgLS13aXRoLWxpYm09U1RSSU5HIiA+JjUKIGVjaG8gIiRhc19tZTogZXJyb3I6IHByb3BlciB1c2FnZSBpcyAtLXdpdGgtbGlibT1TVFJJTkciID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGZpCiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGRlZmF1bHQgTElCTT1cIiRMSUJNXCIiID4mNQotZWNobyAiJHtFQ0hPX1R9ZGVmYXVsdCBMSUJNPVwiJExJQk1cIiIgPiY2Ci1maTsKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBkZWZhdWx0IExJQk09XCIkTElCTVwiIiA+JjUKK2VjaG8gIiR7RUNIT19UfWRlZmF1bHQgTElCTT1cIiRMSUJNXCIiID4mNjsgfQorZmkKKwogCiAjIGNoZWNrIGZvciAtLXdpdGgtbGliYz0uLi4KIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAtLXdpdGgtbGliYz1TVFJJTkciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgLS13aXRoLWxpYmM9U1RSSU5HLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC0td2l0aC1saWJjPVNUUklORyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAtLXdpdGgtbGliYz1TVFJJTkcuLi4gJEVDSE9fQyIgPiY2OyB9CiAKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGliYyBvciAtLXdpdGhvdXQtbGliYyB3YXMgZ2l2ZW4uCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWxpYmMgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX2xpYmMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfbGliYyIKLQorICB3aXRodmFsPSR3aXRoX2xpYmM7CiBpZiB0ZXN0ICIkd2l0aHZhbCIgPSBubwogdGhlbiBMSUJDPQotICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBmb3JjZSBMSUJDIGVtcHR5IiA+JjUKLWVjaG8gIiR7RUNIT19UfWZvcmNlIExJQkMgZW1wdHkiID4mNgorICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvcmNlIExJQkMgZW1wdHkiID4mNQorZWNobyAiJHtFQ0hPX1R9Zm9yY2UgTElCQyBlbXB0eSIgPiY2OyB9CiBlbGlmIHRlc3QgIiR3aXRodmFsIiAhPSB5ZXMKIHRoZW4gTElCQz0kd2l0aHZhbAotICAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBzZXQgTElCQz1cIiR3aXRodmFsXCIiID4mNQotZWNobyAiJHtFQ0hPX1R9c2V0IExJQkM9XCIkd2l0aHZhbFwiIiA+JjYKKyAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBzZXQgTElCQz1cIiR3aXRodmFsXCIiID4mNQorZWNobyAiJHtFQ0hPX1R9c2V0IExJQkM9XCIkd2l0aHZhbFwiIiA+JjY7IH0KIGVsc2UgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogcHJvcGVyIHVzYWdlIGlzIC0td2l0aC1saWJjPVNUUklORyIgPiY1CiBlY2hvICIkYXNfbWU6IGVycm9yOiBwcm9wZXIgdXNhZ2UgaXMgLS13aXRoLWxpYmM9U1RSSU5HIiA+JjI7fQogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBmaQogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBkZWZhdWx0IExJQkM9XCIkTElCQ1wiIiA+JjUKLWVjaG8gIiR7RUNIT19UfWRlZmF1bHQgTElCQz1cIiRMSUJDXCIiID4mNgotZmk7CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogZGVmYXVsdCBMSUJDPVwiJExJQkNcIiIgPiY1CitlY2hvICIke0VDSE9fVH1kZWZhdWx0IExJQkM9XCIkTElCQ1wiIiA+JjY7IH0KK2ZpCisKIAogIyBjaGVjayBmb3IgaHlwb3QoKSBpbiBtYXRoIGxpYnJhcnkKIExJQlNfU0FWRT0kTElCUwpAQCAtMTg5NzksOSArMTk3MjIsOSBAQAogZm9yIGFjX2Z1bmMgaW4gaHlwb3QKIGRvCiBhc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjYKLWlmIGV2YWwgInRlc3QgXCJcJHskYXNfYWNfdmFyK3NldH1cIiA9IHNldCI7IHRoZW4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xOTAwNywzMCArMTk3NTAsMjQgQEAKIAogI3VuZGVmICRhY19mdW5jCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgotewogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciAkYWNfZnVuYyAoKTsKIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAogICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwogY2hva2UgbWUKLSNlbHNlCi1jaGFyICgqZikgKCkgPSAkYWNfZnVuYzsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19CiAjZW5kaWYKIAogaW50CiBtYWluICgpCiB7Ci1yZXR1cm4gZiAhPSAkYWNfZnVuYzsKK3JldHVybiAkYWNfZnVuYyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTE5MDYxLDI1ICsxOTc5OCwyNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1ldmFsICIkYXNfYWNfdmFyPW5vIgorCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjUKLWVjaG8gIiR7RUNIT19UfWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgIiA+JjYKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CiBpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQogX0FDRU9GCiAKIGVsc2UKLSAgY2FzZSAkTElCT0JKUyBpbgotICAgICIkYWNfZnVuYy4kYWNfb2JqZXh0IiAgIHwgXAotICAqIiAkYWNfZnVuYy4kYWNfb2JqZXh0IiAgIHwgXAotICAgICIkYWNfZnVuYy4kYWNfb2JqZXh0ICIqIHwgXAorICBjYXNlICIgJExJQk9CSlMgIiBpbgogICAqIiAkYWNfZnVuYy4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgJGFjX2Z1bmMuJGFjX29iamV4dCIgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgJGFjX2Z1bmMuJGFjX29iamV4dCIKKyA7OwogZXNhYwogCiBmaQpAQCAtMTkwOTAsMTcgKzE5ODI3LDE3IEBACiAKICMgY2hlY2sgZm9yIHdjaGFyLmgKIGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3djaGFyX2grc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3Y2hhci5oIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdjaGFyLmguLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3Y2hhci5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdjaGFyLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3djaGFyX2giID4mNjsgfQogZWxzZQogICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3Y2hhci5oIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdjaGFyLmggdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2NoYXIuaCB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3Y2hhci5oIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTE5MTM2LDE1ICsxOTg3MywxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19oZWFkZXJfY29tcGlsZXI9bm8KKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKICMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdjaGFyLmggcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3Y2hhci5oIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2NoYXIuaCBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdjaGFyLmggcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCkBAIC0xOTE3OCw5ICsxOTkxNiwxMCBAQAogCiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQogCiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KIGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KQEAgLTE5MjA0LDI1ICsxOTk0MywyMyBAQAogZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQogZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0gICAgKAotICAgICAgY2F0IDw8XF9BU0JPWAorICAgICggY2F0IDw8XF9BU0JPWAogIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCiAjIyBSZXBvcnQgdGhpcyB0byBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHl0aG9uLWJ1Z3MgIyMKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwogX0FTQk9YCi0gICAgKSB8Ci0gICAgICBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjIKKyAgICAgKSB8IHNlZCAicy9eLyRhc19tZTogV0FSTklORzogICAgIC8iID4mMgogICAgIDs7CiBlc2FjCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igd2NoYXIuaC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB3Y2hhci5oIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdjaGFyLmguLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCiAgIGFjX2N2X2hlYWRlcl93Y2hhcl9oPSRhY19oZWFkZXJfcHJlcHJvYwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGVhZGVyX3djaGFyX2giID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3djaGFyX2giID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjY7IH0KIAogZmkKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl93Y2hhcl9oID0geWVzOyB0aGVuCkBAIC0xOTI0NCw4ICsxOTk4MSw4IEBACiAjIGRldGVybWluZSB3Y2hhcl90IHNpemUKIGlmIHRlc3QgIiR3Y2hhcl9oIiA9IHllcwogdGhlbgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyX3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igd2NoYXJfdC4uLiAkRUNIT19DIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igd2NoYXJfdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV93Y2hhcl90K3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0xOTI1NywxMiArMTk5OTQsMTMgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDx3Y2hhci5oPgogCit0eXBlZGVmIHdjaGFyX3QgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKCh3Y2hhcl90ICopIDApCitpZiAoKGFjX190eXBlX25ld18gKikgMCkKICAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mICh3Y2hhcl90KSkKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQogICByZXR1cm4gMDsKICAgOwogICByZXR1cm4gMDsKQEAgLTE5Mjk0LDIwICsyMDAzMiwyMSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl90eXBlX3djaGFyX3Q9bm8KKwlhY19jdl90eXBlX3djaGFyX3Q9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV93Y2hhcl90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3djaGFyX3QiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV93Y2hhcl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3djaGFyX3QiID4mNjsgfQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfd2NoYXJfdCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQogICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV93Y2hhcl90IiA9IHllczsgdGhlbgotICAjIFRoZSBjYXN0IHRvIHVuc2lnbmVkIGxvbmcgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCisgICMgVGhlIGNhc3QgdG8gbG9uZyBpbnQgd29ya3MgYXJvdW5kIGEgYnVnIGluIHRoZSBIUCBDIENvbXBpbGVyCiAgICMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKICAgIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCiAgICMgVGhpcyBidWcgaXMgSFAgU1IgbnVtYmVyIDg2MDYyMjMzNjQuCkBAIC0xOTMyMSwxMCArMjAwNjAsMTEgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDx3Y2hhci5oPgogCisJCSAgIHR5cGVkZWYgd2NoYXJfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKHdjaGFyX3QpKSkgPj0gMCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC0xOTM2MiwxMCArMjAxMDIsMTEgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDx3Y2hhci5oPgogCisJCSAgIHR5cGVkZWYgd2NoYXJfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKHdjaGFyX3QpKSkgPD0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC0xOTM5OCwyMCArMjAxMzksMjEgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCSAgICBpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkgICAgICBhY19sbz0gYWNfaGk9Ci0JCSAgICAgIGJyZWFrCi0JCSAgICBmaQotCQkgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKQEAgLTE5NDE5LDEwICsyMDE2MSwxMSBAQAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2luY2x1ZGUgPHdjaGFyLmg+CiAKKwkJICAgdHlwZWRlZiB3Y2hhcl90IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAod2NoYXJfdCkpKSA8IDApXTsKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC0xOTQ2MCwxMCArMjAyMDMsMTEgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDx3Y2hhci5oPgogCisJCSAgIHR5cGVkZWYgd2NoYXJfdCBhY19fdHlwZV9zaXplb2ZfOwogaW50CiBtYWluICgpCiB7Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcpIChzaXplb2YgKHdjaGFyX3QpKSkgPj0gJGFjX21pZCldOworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07CiB0ZXN0X2FycmF5IFswXSA9IDAKIAogICA7CkBAIC0xOTQ5NiwyMyArMjAyNDAsMjYgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKLQkJICAgICAgIGlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCi0JCQkgYWNfbG89IGFjX2hpPQotCQkJIGJyZWFrCi0JCSAgICAgICBmaQotCQkgICAgICAgYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCisJYWNfaGk9YGV4cHIgJygnICRhY19taWQgJyknIC0gMWAKKwkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCisJCQkgIGFjX2xvPSBhY19oaT0KKwkJCSAgYnJlYWsKKwkJCWZpCisJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz0gYWNfaGk9CisJYWNfbG89IGFjX2hpPQogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KQEAgLTE5NTI1LDEwICsyMDI3MiwxMSBAQAogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2luY2x1ZGUgPHdjaGFyLmg+CiAKKwkJICAgdHlwZWRlZiB3Y2hhcl90IGFjX190eXBlX3NpemVvZl87CiBpbnQKIG1haW4gKCkKIHsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZykgKHNpemVvZiAod2NoYXJfdCkpKSA8PSAkYWNfbWlkKV07CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKIHRlc3RfYXJyYXkgWzBdID0gMAogCiAgIDsKQEAgLTE5NTYxLDI0ICsyMDMwOSwyMCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl93Y2hhcl90PSRhY19sbzs7Ci0nJykgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh3Y2hhcl90KSwgNzcKKycnKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHdjaGFyX3QpCiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHdjaGFyX3QpLCA3NworZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh3Y2hhcl90KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9IDs7CiBlc2FjCiBlbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGludGVybmFsIGVycm9yOiBub3QgcmVhY2hlZCBpbiBjcm9zcy1jb21waWxlIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1lbHNlCiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCiBfQUNFT0YKQEAgLTE5NTg3LDggKzIwMzMxLDkgQEAKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICNpbmNsdWRlIDx3Y2hhci5oPgogCi1sb25nIGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcpIChzaXplb2YgKHdjaGFyX3QpKTsgfQotdW5zaWduZWQgbG9uZyB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZykgKHNpemVvZiAod2NoYXJfdCkpOyB9CisJCSAgIHR5cGVkZWYgd2NoYXJfdCBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiBpbnQKQEAgLTE5NTk3LDIyICsyMDM0MiwyMiBAQAogCiAgIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgIGlmICghIGYpCi0gICAgZXhpdCAoMSk7Ci0gIGlmICgoKGxvbmcpIChzaXplb2YgKHdjaGFyX3QpKSkgPCAwKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCiAgICAgewotICAgICAgbG9uZyBpID0gbG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZykgKHNpemVvZiAod2NoYXJfdCkpKSkKLQlleGl0ICgxKTsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwogICAgIH0KICAgZWxzZQogICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nKSAoc2l6ZW9mICh3Y2hhcl90KSkpKQotCWV4aXQgKDEpOworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKICAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwogICAgIH0KLSAgZXhpdCAoZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDApOworICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7CiAKICAgOwogICByZXR1cm4gMDsKQEAgLTE5NjM2LDIyICsyMDM4MSwyMSBAQAogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCiAoIGV4aXQgJGFjX3N0YXR1cyApCi17IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHdjaGFyX3QpLCA3NworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh3Y2hhcl90KQogU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mICh3Y2hhcl90KSwgNzcKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAod2NoYXJfdCkKIFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogcm0gLWYgY29uZnRlc3QudmFsCiBlbHNlCiAgIGFjX2N2X3NpemVvZl93Y2hhcl90PTAKIGZpCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl93Y2hhcl90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2Zfd2NoYXJfdCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfd2NoYXJfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX3djaGFyX3QiID4mNjsgfQogY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgogI2RlZmluZSBTSVpFT0ZfV0NIQVJfVCAkYWNfY3Zfc2l6ZW9mX3djaGFyX3QKIF9BQ0VPRgpAQCAtMTk2NTksOCArMjA0MDMsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIFVDUy00IHRjbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBVQ1MtNCB0Y2wuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgVUNTLTQgdGNsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIFVDUy00IHRjbC4uLiAkRUNIT19DIiA+JjY7IH0KIGhhdmVfdWNzNF90Y2w9bm8KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogY29uZmRlZnMuaC4gICovCkBAIC0xOTcxNCwxNyArMjA0NTgsMTkgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAorCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGF2ZV91Y3M0X3RjbCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kaGF2ZV91Y3M0X3RjbCIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXZlX3VjczRfdGNsIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRoYXZlX3VjczRfdGNsIiA+JjY7IH0KIAogIyBjaGVjayB3aGV0aGVyIHdjaGFyX3QgaXMgc2lnbmVkIG9yIG5vdAogaWYgdGVzdCAiJHdjaGFyX2giID0geWVzCiB0aGVuCiAgICMgY2hlY2sgd2hldGhlciB3Y2hhcl90IGlzIHNpZ25lZCBvciBub3QKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2NoYXJfdCBpcyBzaWduZWQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdjaGFyX3QgaXMgc2lnbmVkLi4uICRFQ0hPX0MiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdjaGFyX3QgaXMgc2lnbmVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3Y2hhcl90IGlzIHNpZ25lZC4uLiAkRUNIT19DIiA+JjY7IH0KICAgaWYgdGVzdCAiJHthY19jdl93Y2hhcl90X3NpZ25lZCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMTk3NjcsMjMgKzIwNTEzLDI1IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl93Y2hhcl90X3NpZ25lZD1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl93Y2hhcl90X3NpZ25lZCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfd2NoYXJfdF9zaWduZWQiID4mNgorCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hhdCB0eXBlIHRvIHVzZSBmb3IgdW5pY29kZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoYXQgdHlwZSB0byB1c2UgZm9yIHVuaWNvZGUuLi4gJEVDSE9fQyIgPiY2Ci0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdW5pY29kZSBvciAtLWRpc2FibGUtdW5pY29kZSB3YXMgZ2l2ZW4uCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3djaGFyX3Rfc2lnbmVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl93Y2hhcl90X3NpZ25lZCIgPiY2OyB9CitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGF0IHR5cGUgdG8gdXNlIGZvciB1bmljb2RlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hhdCB0eXBlIHRvIHVzZSBmb3IgdW5pY29kZS4uLiAkRUNIT19DIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS11bmljb2RlIHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7ZW5hYmxlX3VuaWNvZGUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3VuaWNvZGUiCi0KKyAgZW5hYmxldmFsPSRlbmFibGVfdW5pY29kZTsKIGVsc2UKICAgZW5hYmxlX3VuaWNvZGU9eWVzCi1maTsKK2ZpCisKIAogaWYgdGVzdCAkZW5hYmxlX3VuaWNvZGUgPSB5ZXMKIHRoZW4KQEAgLTE5ODIwLDggKzIwNTY4LDggQEAKIGlmIHRlc3QgIiRlbmFibGVfdW5pY29kZSIgPSAibm8iCiB0aGVuCiAgIFVOSUNPREVfT0JKUz0iIgotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub3QgdXNlZCIgPiY1Ci1lY2hvICIke0VDSE9fVH1ub3QgdXNlZCIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm90IHVzZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm90IHVzZWQiID4mNjsgfQogZWxzZQogICBVTklDT0RFX09CSlM9Ik9iamVjdHMvdW5pY29kZW9iamVjdC5vIE9iamVjdHMvdW5pY29kZWN0eXBlLm8iCiAKQEAgLTE5ODYxLDEzICsyMDYwOSwxMyBAQAogICBlbHNlCiAgICAgICAgUFlfVU5JQ09ERV9UWVBFPSJubyB0eXBlIGZvdW5kIgogICBmaQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUFlfVU5JQ09ERV9UWVBFIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRQWV9VTklDT0RFX1RZUEUiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRQWV9VTklDT0RFX1RZUEUiID4mNQorZWNobyAiJHtFQ0hPX1R9JFBZX1VOSUNPREVfVFlQRSIgPiY2OyB9CiBmaQogCiAjIGNoZWNrIGZvciBlbmRpYW5uZXNzCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbi4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfY19iaWdlbmRpYW4rc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTE5OTYwLDE0ICsyMDcwOCwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9jX2JpZ2VuZGlhbj1ubworCWFjX2N2X2NfYmlnZW5kaWFuPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLSMgSXQgZG9lcyBub3Q7IGNvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCisJIyBJdCBkb2VzIG5vdDsgY29tcGlsZSBhIHRlc3QgcHJvZ3JhbS4KIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCiAgICMgdHJ5IHRvIGd1ZXNzIHRoZSBlbmRpYW5uZXNzIGJ5IGdyZXBwaW5nIHZhbHVlcyBpbnRvIGFuIG9iamVjdCBmaWxlCiAgIGFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KQEAgLTE5OTc3LDExICsyMDcyNiwxMSBAQAogY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCi1zaG9ydCBhc2NpaV9tbVtdID0geyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07Ci1zaG9ydCBhc2NpaV9paVtdID0geyAweDY5NEMsIDB4NTQ1NCwgMHg2NTZDLCAweDZFNDUsIDB4Njk0NCwgMHg2RTYxLCAwIH07CitzaG9ydCBpbnQgYXNjaWlfbW1bXSA9IHsgMHg0MjQ5LCAweDQ3NjUsIDB4NkU0NCwgMHg2OTYxLCAweDZFNTMsIDB4Nzk1MywgMCB9Oworc2hvcnQgaW50IGFzY2lpX2lpW10gPSB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKIHZvaWQgX2FzY2lpICgpIHsgY2hhciAqcyA9IChjaGFyICopIGFzY2lpX21tOyBzID0gKGNoYXIgKikgYXNjaWlfaWk7IH0KLXNob3J0IGViY2RpY19paVtdID0geyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07Ci1zaG9ydCBlYmNkaWNfbW1bXSA9IHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9Oworc2hvcnQgaW50IGViY2RpY19paVtdID0geyAweDg5RDMsIDB4RTNFMywgMHg4NTkzLCAweDk1QzUsIDB4ODlDNCwgMHg5NTgxLCAwIH07CitzaG9ydCBpbnQgZWJjZGljX21tW10gPSB7IDB4QzJDOSwgMHhDNzg1LCAweDk1QzQsIDB4ODk4MSwgMHg5NUUyLCAweEE4RTIsIDAgfTsKIHZvaWQgX2ViY2RpYyAoKSB7IGNoYXIgKnMgPSAoY2hhciAqKSBlYmNkaWNfbW07IHMgPSAoY2hhciAqKSBlYmNkaWNfaWk7IH0KIGludAogbWFpbiAoKQpAQCAtMjAwMjcsNyArMjA3NzYsOSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCisKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0yMDAzNiwxNyArMjA3ODcsMjIgQEAKIGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKIGludAogbWFpbiAoKQogeworCiAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KICAgdW5pb24KICAgewotICAgIGxvbmcgbDsKLSAgICBjaGFyIGNbc2l6ZW9mIChsb25nKV07CisgICAgbG9uZyBpbnQgbDsKKyAgICBjaGFyIGNbc2l6ZW9mIChsb25nIGludCldOwogICB9IHU7CiAgIHUubCA9IDE7Ci0gIGV4aXQgKHUuY1tzaXplb2YgKGxvbmcpIC0gMV0gPT0gMSk7CisgIHJldHVybiB1LmNbc2l6ZW9mIChsb25nIGludCkgLSAxXSA9PSAxOworCisgIDsKKyAgcmV0dXJuIDA7CiB9CiBfQUNFT0YKIHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dApAQCAtMjAwNjksMTMgKzIwODI1LDE2IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKIGZpCi1ybSAtZiBjb3JlICouY29yZSBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQorCisKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19iaWdlbmRpYW4iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2NfYmlnZW5kaWFuIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2JpZ2VuZGlhbiIgPiY2OyB9CiBjYXNlICRhY19jdl9jX2JpZ2VuZGlhbiBpbgogICB5ZXMpCiAKQEAgLTIwMDk0LDEwICsyMDg1MywxMiBAQAogZXNhYwogCiAKKworCiAjIENoZWNrIHdoZXRoZXIgcmlnaHQgc2hpZnRpbmcgYSBuZWdhdGl2ZSBpbnRlZ2VyIGV4dGVuZHMgdGhlIHNpZ24gYml0CiAjIG9yIGZpbGxzIHdpdGggemVyb3MgKGxpa2UgdGhlIENyYXkgSjkwLCBhY2NvcmRpbmcgdG8gVGltIFBldGVycykuCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciByaWdodCBzaGlmdCBleHRlbmRzIHRoZSBzaWduIGJpdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgcmlnaHQgc2hpZnQgZXh0ZW5kcyB0aGUgc2lnbiBiaXQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHJpZ2h0IHNoaWZ0IGV4dGVuZHMgdGhlIHNpZ24gYml0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciByaWdodCBzaGlmdCBleHRlbmRzIHRoZSBzaWduIGJpdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfcnNoaWZ0X2V4dGVuZHNfc2lnbitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMjAxMzgsMTIgKzIwODk5LDE0IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9yc2hpZnRfZXh0ZW5kc19zaWduPW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9yc2hpZnRfZXh0ZW5kc19zaWduIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9yc2hpZnRfZXh0ZW5kc19zaWduIiA+JjYKKworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcnNoaWZ0X2V4dGVuZHNfc2lnbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcnNoaWZ0X2V4dGVuZHNfc2lnbiIgPiY2OyB9CiBpZiB0ZXN0ICIkYWNfY3ZfcnNoaWZ0X2V4dGVuZHNfc2lnbiIgPSBubwogdGhlbgogCkBAIC0yMDE1NCw4ICsyMDkxNyw4IEBACiBmaQogCiAjIGNoZWNrIGZvciBnZXRjX3VubG9ja2VkIGFuZCByZWxhdGVkIGxvY2tpbmcgZnVuY3Rpb25zCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdldGNfdW5sb2NrZWQoKSBhbmQgZnJpZW5kcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBnZXRjX3VubG9ja2VkKCkgYW5kIGZyaWVuZHMuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ2V0Y191bmxvY2tlZCgpIGFuZCBmcmllbmRzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGNfdW5sb2NrZWQoKSBhbmQgZnJpZW5kcy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0yMDIwNiwxNCArMjA5NjksMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkPW5vCisJYWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhdmVfZ2V0Y191bmxvY2tlZCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hhdmVfZ2V0Y191bmxvY2tlZCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGF2ZV9nZXRjX3VubG9ja2VkIiA+JjY7IH0KIGlmIHRlc3QgIiRhY19jdl9oYXZlX2dldGNfdW5sb2NrZWQiID0geWVzCiB0aGVuCiAKQEAgLTIwMjI3LDggKzIwOTkxLDggQEAKICMgc2F2ZSB0aGUgdmFsdWUgb2YgTElCUyBzbyB3ZSBkb24ndCBhY3R1YWxseSBsaW5rIFB5dGhvbiB3aXRoIHJlYWRsaW5lCiBMSUJTX25vX3JlYWRsaW5lPSRMSUJTCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcmVhZGxpbmUgaW4gLWxyZWFkbGluZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByZWFkbGluZSBpbiAtbHJlYWRsaW5lLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHJlYWRsaW5lIGluIC1scmVhZGxpbmUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcmVhZGxpbmUgaW4gLWxyZWFkbGluZS4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0yMDI0MSwxNyArMjEwMDUsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHJlYWRsaW5lICgpOwogaW50CiBtYWluICgpCiB7Ci1yZWFkbGluZSAoKTsKK3JldHVybiByZWFkbGluZSAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTIwMjgyLDE0ICsyMTA0NiwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfcmVhZGxpbmVfcmVhZGxpbmU9bm8KKwlhY19jdl9saWJfcmVhZGxpbmVfcmVhZGxpbmU9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9yZWFkbGluZV9yZWFkbGluZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9yZWFkbGluZV9yZWFkbGluZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3JlYWRsaW5lX3JlYWRsaW5lIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl9yZWFkbGluZV9yZWFkbGluZSA9IHllczsgdGhlbgogICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiAjZGVmaW5lIEhBVkVfTElCUkVBRExJTkUgMQpAQCAtMjAzMDIsOCArMjEwNjcsOCBAQAogaWYgdGVzdCAiJGFjX2N2X2hhdmVfcmVhZGxpbmVfcmVhZGxpbmUiID0gbm8KIHRoZW4KIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciByZWFkbGluZSBpbiAtbHRlcm1jYXAiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcmVhZGxpbmUgaW4gLWx0ZXJtY2FwLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHJlYWRsaW5lIGluIC1sdGVybWNhcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByZWFkbGluZSBpbiAtbHRlcm1jYXAuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X2xpYl90ZXJtY2FwX3JlYWRsaW5lK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0yMDMxNiwxNyArMjEwODEsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHJlYWRsaW5lICgpOwogaW50CiBtYWluICgpCiB7Ci1yZWFkbGluZSAoKTsKK3JldHVybiByZWFkbGluZSAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTIwMzU3LDE0ICsyMTEyMiwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfdGVybWNhcF9yZWFkbGluZT1ubworCWFjX2N2X2xpYl90ZXJtY2FwX3JlYWRsaW5lPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfdGVybWNhcF9yZWFkbGluZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3Rlcm1jYXBfcmVhZGxpbmUiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3Rlcm1jYXBfcmVhZGxpbmUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl90ZXJtY2FwX3JlYWRsaW5lIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl90ZXJtY2FwX3JlYWRsaW5lID0geWVzOyB0aGVuCiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgSEFWRV9MSUJURVJNQ0FQIDEKQEAgLTIwMzc3LDggKzIxMTQzLDggQEAKIGZpCiAKICMgY2hlY2sgZm9yIHJlYWRsaW5lIDIuMQotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgaW4gLWxyZWFkbGluZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgaW4gLWxyZWFkbGluZS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgaW4gLWxyZWFkbGluZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgaW4gLWxyZWFkbGluZS4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMjAzOTEsMTcgKzIxMTU3LDE3IEBACiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiAKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIgogI2VuZGlmCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogY2hhciBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgKCk7CiBpbnQKIG1haW4gKCkKIHsKLXJsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCAoKTsKK3JldHVybiBybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgKCk7CiAgIDsKICAgcmV0dXJuIDA7CiB9CkBAIC0yMDQzMiwxNCArMjExOTgsMTUgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbD1ubworCWFjX2N2X2xpYl9yZWFkbGluZV9ybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGw9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9yZWFkbGluZV9ybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9yZWFkbGluZV9ybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCIgPiY2OyB9CiBpZiB0ZXN0ICRhY19jdl9saWJfcmVhZGxpbmVfcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCkBAIC0yMDQ4Myw2ICsyMTI1MCw3IEBACiAKICAgaGF2ZV9yZWFkbGluZT1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKIGlmIHRlc3QgJGhhdmVfcmVhZGxpbmUgPSB5ZXMKIHRoZW4KQEAgLTIwNTA4LDggKzIxMjc2LDggQEAKIGZpCiAKICMgY2hlY2sgZm9yIHJlYWRsaW5lIDQuMAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBybF9wcmVfaW5wdXRfaG9vayBpbiAtbHJlYWRsaW5lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHJsX3ByZV9pbnB1dF9ob29rIGluIC1scmVhZGxpbmUuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcmxfcHJlX2lucHV0X2hvb2sgaW4gLWxyZWFkbGluZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBybF9wcmVfaW5wdXRfaG9vayBpbiAtbHJlYWRsaW5lLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfcmVhZGxpbmVfcmxfcHJlX2lucHV0X2hvb2src2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTIwNTIyLDE3ICsyMTI5MCwxNyBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKICNlbmRpZgotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgcmxfcHJlX2lucHV0X2hvb2sgKCk7CiBpbnQKIG1haW4gKCkKIHsKLXJsX3ByZV9pbnB1dF9ob29rICgpOworcmV0dXJuIHJsX3ByZV9pbnB1dF9ob29rICgpOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMjA1NjMsMTQgKzIxMzMxLDE1IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vaz1ubworCWFjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vaz1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX3ByZV9pbnB1dF9ob29rIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcmVhZGxpbmVfcmxfcHJlX2lucHV0X2hvb2siID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX3ByZV9pbnB1dF9ob29rIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcmVhZGxpbmVfcmxfcHJlX2lucHV0X2hvb2siID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX3ByZV9pbnB1dF9ob29rID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCkBAIC0yMDU4MSw4ICsyMTM1MCw4IEBACiAKIAogIyBjaGVjayBmb3IgcmVhZGxpbmUgNC4yCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHJsX2NvbXBsZXRpb25fbWF0Y2hlcyBpbiAtbHJlYWRsaW5lIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHJsX2NvbXBsZXRpb25fbWF0Y2hlcyBpbiAtbHJlYWRsaW5lLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHJsX2NvbXBsZXRpb25fbWF0Y2hlcyBpbiAtbHJlYWRsaW5lIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHJsX2NvbXBsZXRpb25fbWF0Y2hlcyBpbiAtbHJlYWRsaW5lLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9saWJfcmVhZGxpbmVfcmxfY29tcGxldGlvbl9tYXRjaGVzK3NldH0iID0gc2V0OyB0aGVuCiAgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CiBlbHNlCkBAIC0yMDU5NSwxNyArMjEzNjQsMTcgQEAKIGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KIAotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiCiAjZW5kaWYKLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIHJsX2NvbXBsZXRpb25fbWF0Y2hlcyAoKTsKIGludAogbWFpbiAoKQogewotcmxfY29tcGxldGlvbl9tYXRjaGVzICgpOworcmV0dXJuIHJsX2NvbXBsZXRpb25fbWF0Y2hlcyAoKTsKICAgOwogICByZXR1cm4gMDsKIH0KQEAgLTIwNjM2LDE0ICsyMTQwNSwxNSBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9saWJfcmVhZGxpbmVfcmxfY29tcGxldGlvbl9tYXRjaGVzPW5vCisJYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fbWF0Y2hlcz1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fbWF0Y2hlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3JlYWRsaW5lX3JsX2NvbXBsZXRpb25fbWF0Y2hlcyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcmVhZGxpbmVfcmxfY29tcGxldGlvbl9tYXRjaGVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcmVhZGxpbmVfcmxfY29tcGxldGlvbl9tYXRjaGVzIiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X2xpYl9yZWFkbGluZV9ybF9jb21wbGV0aW9uX21hdGNoZXMgPSB5ZXM7IHRoZW4KIAogY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKQEAgLTIwNjg3LDYgKzIxNDU3LDcgQEAKIAogICBoYXZlX3JlYWRsaW5lPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAogaWYgdGVzdCAkaGF2ZV9yZWFkbGluZSA9IHllcwogdGhlbgpAQCAtMjA3MTQsOCArMjE0ODUsOCBAQAogIyBFbmQgb2YgcmVhZGxpbmUgY2hlY2tzOiByZXN0b3JlIExJQlMKIExJQlM9JExJQlNfbm9fcmVhZGxpbmUKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBicm9rZW4gbmljZSgpIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGJyb2tlbiBuaWNlKCkuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYnJva2VuIG5pY2UoKSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBicm9rZW4gbmljZSgpLi4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9icm9rZW5fbmljZStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMjA3NTksMTIgKzIxNTMwLDE0IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9icm9rZW5fbmljZT1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnJva2VuX25pY2UiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Jyb2tlbl9uaWNlIiA+JjYKKworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnJva2VuX25pY2UiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Jyb2tlbl9uaWNlIiA+JjY7IH0KIGlmIHRlc3QgIiRhY19jdl9icm9rZW5fbmljZSIgPSB5ZXMKIHRoZW4KIApAQCAtMjA3NzQsOCArMjE1NDcsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGJyb2tlbiBwb2xsKCkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYnJva2VuIHBvbGwoKS4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBicm9rZW4gcG9sbCgpIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGJyb2tlbiBwb2xsKCkuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgogICBhY19jdl9icm9rZW5fcG9sbD1ubwogZWxzZQpAQCAtMjA4MzEsMTAgKzIxNjA0LDEyIEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl9icm9rZW5fcG9sbD1ubwogZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfYnJva2VuX3BvbGwiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Jyb2tlbl9wb2xsIiA+JjYKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9icm9rZW5fcG9sbCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfYnJva2VuX3BvbGwiID4mNjsgfQogaWYgdGVzdCAiJGFjX2N2X2Jyb2tlbl9wb2xsIiA9IHllcwogdGhlbgogCkBAIC0yMDg0Nyw4ICsyMTYyMiw4IEBACiAjIEJlZm9yZSB3ZSBjYW4gdGVzdCB0enNldCwgd2UgbmVlZCB0byBjaGVjayBpZiBzdHJ1Y3QgdG0gaGFzIGEgdG1fem9uZQogIyAod2hpY2ggaXMgbm90IHJlcXVpcmVkIGJ5IElTTyBDIG9yIFVOSVggc3BlYykgYW5kL29yIGlmIHdlIHN1cHBvcnQKICMgdHpuYW1lW10KLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IHRtLnRtX3pvbmUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IHRtLnRtX3pvbmUuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IHRtLnRtX3pvbmUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IHRtLnRtX3pvbmUuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X21lbWJlcl9zdHJ1Y3RfdG1fdG1fem9uZStzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMjA4OTgsNyArMjE2NzMsNyBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwogX0FDRU9GCiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKQEAgLTIwOTQ0LDE0ICsyMTcxOSwxNiBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmU9bm8KKwlhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmU9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmUiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3RtX3RtX3pvbmUiID4mNjsgfQogaWYgdGVzdCAkYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKQEAgLTIwOTY4LDggKzIxNzQ1LDgyIEBACiBfQUNFT0YKIAogZWxzZQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0em5hbWUuLi4gJEVDSE9fQyIgPiY2CisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdHpuYW1lIGlzIGRlY2xhcmVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0em5hbWUgaXMgZGVjbGFyZWQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hhdmVfZGVjbF90em5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8dGltZS5oPgorCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgdHpuYW1lCisgIGNoYXIgKnAgPSAoY2hhciAqKSB0em5hbWU7CisgIHJldHVybiAhcDsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2NvbXBpbGVcIiIpID4mNQorICAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKKyAgKGV2YWwgJGFjX3RyeSkgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQorICAoZXZhbCAkYWNfdHJ5KSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2hhdmVfZGVjbF90em5hbWU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9oYXZlX2RlY2xfdHpuYW1lPW5vCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX3R6bmFtZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaGF2ZV9kZWNsX3R6bmFtZSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oYXZlX2RlY2xfdHpuYW1lID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1RaTkFNRSAxCitfQUNFT0YKKworCitlbHNlCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1RaTkFNRSAwCitfQUNFT0YKKworCitmaQorCisKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0em5hbWUuLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X3Zhcl90em5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTIwOTgwLDE0ICsyMTgzMSwxNCBAQAogY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgogLyogZW5kIGNvbmZkZWZzLmguICAqLwogI2luY2x1ZGUgPHRpbWUuaD4KLSNpZm5kZWYgdHpuYW1lIC8qIEZvciBTR0kuICAqLwotZXh0ZXJuIGNoYXIgKnR6bmFtZVtdOyAvKiBSUzYwMDAgYW5kIG90aGVycyByZWplY3QgY2hhciAqKnR6bmFtZS4gICovCisjaWYgIUhBVkVfREVDTF9UWk5BTUUKK2V4dGVybiBjaGFyICp0em5hbWVbXTsKICNlbmRpZgogCiBpbnQKIG1haW4gKCkKIHsKLWF0b2koKnR6bmFtZSk7CityZXR1cm4gdHpuYW1lWzBdWzBdOwogICA7CiAgIHJldHVybiAwOwogfQpAQCAtMjEwMTgsMTMgKzIxODY5LDE0IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3Zhcl90em5hbWU9bm8KKwlhY19jdl92YXJfdHpuYW1lPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfdHpuYW1lIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl92YXJfdHpuYW1lIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Zhcl90em5hbWUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3Zhcl90em5hbWUiID4mNjsgfQogICBpZiB0ZXN0ICRhY19jdl92YXJfdHpuYW1lID0geWVzOyB0aGVuCiAKIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCkBAIC0yMTAzNiw4ICsyMTg4OCw4IEBACiAKIAogIyBjaGVjayB0enNldCgzKSBleGlzdHMgYW5kIHdvcmtzIGxpa2Ugd2UgZXhwZWN0IGl0IHRvCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgdHpzZXQoKSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB3b3JraW5nIHR6c2V0KCkuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igd29ya2luZyB0enNldCgpIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgdHpzZXQoKS4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfd29ya2luZ190enNldCtzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMjExMzYsMTIgKzIxOTg4LDE0IEBACiAoIGV4aXQgJGFjX3N0YXR1cyApCiBhY19jdl93b3JraW5nX3R6c2V0PW5vCiBmaQotcm0gLWYgY29yZSAqLmNvcmUgZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl93b3JraW5nX3R6c2V0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl93b3JraW5nX3R6c2V0IiA+JjYKKworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfd29ya2luZ190enNldCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfd29ya2luZ190enNldCIgPiY2OyB9CiBpZiB0ZXN0ICIkYWNfY3Zfd29ya2luZ190enNldCIgPSB5ZXMKIHRoZW4KIApAQCAtMjExNTIsOCArMjIwMDYsOCBAQAogZmkKIAogIyBMb29rIGZvciBzdWJzZWNvbmQgdGltZXN0YW1wcyBpbiBzdHJ1Y3Qgc3RhdAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0dl9uc2VjIGluIHN0cnVjdCBzdGF0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHR2X25zZWMgaW4gc3RydWN0IHN0YXQuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdHZfbnNlYyBpbiBzdHJ1Y3Qgc3RhdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0dl9uc2VjIGluIHN0cnVjdCBzdGF0Li4uICRFQ0hPX0MiID4mNjsgfQogaWYgdGVzdCAiJHthY19jdl9zdGF0X3R2X25zZWMrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTIxMjAxLDEzICsyMjA1NSwxNCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9zdGF0X3R2X25zZWM9bm8KKwlhY19jdl9zdGF0X3R2X25zZWM9bm8KIGZpCisKIHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdGF0X3R2X25zZWMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3N0YXRfdHZfbnNlYyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdGF0X3R2X25zZWMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3N0YXRfdHZfbnNlYyIgPiY2OyB9CiBpZiB0ZXN0ICIkYWNfY3Zfc3RhdF90dl9uc2VjIiA9IHllcwogdGhlbgogCkBAIC0yMTIxOCw4ICsyMjA3Myw4IEBACiBmaQogCiAjIExvb2sgZm9yIEJTRCBzdHlsZSBzdWJzZWNvbmQgdGltZXN0YW1wcyBpbiBzdHJ1Y3Qgc3RhdAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0dl9uc2VjMiBpbiBzdHJ1Y3Qgc3RhdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0dl9uc2VjMiBpbiBzdHJ1Y3Qgc3RhdC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0dl9uc2VjMiBpbiBzdHJ1Y3Qgc3RhdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB0dl9uc2VjMiBpbiBzdHJ1Y3Qgc3RhdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfc3RhdF90dl9uc2VjMitzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMjEyNjcsMTMgKzIyMTIyLDE0IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3N0YXRfdHZfbnNlYzI9bm8KKwlhY19jdl9zdGF0X3R2X25zZWMyPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RhdF90dl9uc2VjMiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc3RhdF90dl9uc2VjMiIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdGF0X3R2X25zZWMyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zdGF0X3R2X25zZWMyIiA+JjY7IH0KIGlmIHRlc3QgIiRhY19jdl9zdGF0X3R2X25zZWMyIiA9IHllcwogdGhlbgogCkBAIC0yMTI4NCw4ICsyMjE0MCw4IEBACiBmaQogCiAjIE9uIEhQL1VYIDExLjAsIG12d2RlbGNoIGlzIGEgYmxvY2sgd2l0aCBhIHJldHVybiBzdGF0ZW1lbnQKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIG12d2RlbGNoIGlzIGFuIGV4cHJlc3Npb24iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIG12d2RlbGNoIGlzIGFuIGV4cHJlc3Npb24uLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIG12d2RlbGNoIGlzIGFuIGV4cHJlc3Npb24iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIG12d2RlbGNoIGlzIGFuIGV4cHJlc3Npb24uLi4gJEVDSE9fQyIgPiY2OyB9CiBpZiB0ZXN0ICIke2FjX2N2X212d2RlbGNoX2lzX2V4cHJlc3Npb24rc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTIxMzMzLDEzICsyMjE4OSwxNCBAQAogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQogCi1hY19jdl9tdndkZWxjaF9pc19leHByZXNzaW9uPW5vCisJYWNfY3ZfbXZ3ZGVsY2hfaXNfZXhwcmVzc2lvbj1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X212d2RlbGNoX2lzX2V4cHJlc3Npb24iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X212d2RlbGNoX2lzX2V4cHJlc3Npb24iID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbXZ3ZGVsY2hfaXNfZXhwcmVzc2lvbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbXZ3ZGVsY2hfaXNfZXhwcmVzc2lvbiIgPiY2OyB9CiAKIGlmIHRlc3QgIiRhY19jdl9tdndkZWxjaF9pc19leHByZXNzaW9uIiA9IHllcwogdGhlbgpAQCAtMjEzNTAsOCArMjIyMDcsOCBAQAogCiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBXSU5ET1cgaGFzIF9mbGFncyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgV0lORE9XIGhhcyBfZmxhZ3MuLi4gJEVDSE9fQyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIFdJTkRPVyBoYXMgX2ZsYWdzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBXSU5ET1cgaGFzIF9mbGFncy4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3Zfd2luZG93X2hhc19mbGFncytzZXR9IiA9IHNldDsgdGhlbgogICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgogZWxzZQpAQCAtMjEzOTksMTMgKzIyMjU2LDE0IEBACiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAKLWFjX2N2X3dpbmRvd19oYXNfZmxhZ3M9bm8KKwlhY19jdl93aW5kb3dfaGFzX2ZsYWdzPW5vCiBmaQorCiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfd2luZG93X2hhc19mbGFncyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfd2luZG93X2hhc19mbGFncyIgPiY2Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl93aW5kb3dfaGFzX2ZsYWdzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl93aW5kb3dfaGFzX2ZsYWdzIiA+JjY7IH0KIAogCiBpZiB0ZXN0ICIkYWNfY3Zfd2luZG93X2hhc19mbGFncyIgPSB5ZXMKQEAgLTIxNDE3LDQyICsyMjI3NSwxMDYgQEAKIAogZmkKIAotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAvZGV2L3B0bXgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgL2Rldi9wdG14Li4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC9kZXYvcHRteCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAvZGV2L3B0bXguLi4gJEVDSE9fQyIgPiY2OyB9CiAKIGlmIHRlc3QgLWUgL2Rldi9wdG14CiB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBIQVZFX0RFVl9QVE1YIDEKIF9BQ0VPRgogCiBlbHNlCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjYKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CiBmaQogCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC9kZXYvcHRjIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC9kZXYvcHRjLi4uICRFQ0hPX0MiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC9kZXYvcHRjIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC9kZXYvcHRjLi4uICRFQ0hPX0MiID4mNjsgfQogCiBpZiB0ZXN0IC1lIC9kZXYvcHRjCiB0aGVuCi0gIGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBIQVZFX0RFVl9QVEMgMQogX0FDRU9GCiAKIGVsc2UKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKLWVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2tsZW5fdC4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAlemQgcHJpbnRmKCkgZm9ybWF0IHN1cHBvcnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJXpkIHByaW50ZigpIGZvcm1hdCBzdXBwb3J0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCBtYWluKCkKK3sKKyAgICBjaGFyIGJ1ZmZlcls0XTsKKworICAgIGlmKHNwcmludGYoYnVmZmVyLCAiJXpkIiwgKHNpemVfdCkxMjMpIDwgMCkKKyAgICAgICAJcmV0dXJuIDE7CisKKyAgICBpZiAoc3RybmNtcChidWZmZXIsICIxMjMiLCAzKSkKKwlyZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX2xpbmtcIiIpID4mNQorICAoZXZhbCAkYWNfbGluaykgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CisgIChldmFsICRhY190cnkpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUFlfRk9STUFUX1NJWkVfVCAieiIKK19BQ0VPRgorCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc29ja2xlbl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2tsZW5fdC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9zb2NrbGVuX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KICAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKIGVsc2UKQEAgLTIxNDcxLDEyICsyMjM5MywxMyBAQAogI2VuZGlmCiAKIAordHlwZWRlZiBzb2NrbGVuX3QgYWNfX3R5cGVfbmV3XzsKIGludAogbWFpbiAoKQogewotaWYgKChzb2NrbGVuX3QgKikgMCkKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQogICByZXR1cm4gMDsKLWlmIChzaXplb2YgKHNvY2tsZW5fdCkpCitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKICAgcmV0dXJuIDA7CiAgIDsKICAgcmV0dXJuIDA7CkBAIC0yMTUwOCwxMiArMjI0MzEsMTMgQEAKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKIHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKIAotYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm8KKwlhY19jdl90eXBlX3NvY2tsZW5fdD1ubwogZmkKKwogcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKLWVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NvY2tsZW5fdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zb2NrbGVuX3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc29ja2xlbl90IiA+JjY7IH0KIGlmIHRlc3QgJGFjX2N2X3R5cGVfc29ja2xlbl90ID0geWVzOyB0aGVuCiAgIDoKIGVsc2UKQEAgLTIxNTM0LDE4ICsyMjQ1OCwxOCBAQAogCiAKIFNSQ0RJUlM9IlBhcnNlciBHcmFtbWFyIE9iamVjdHMgUHl0aG9uIE1vZHVsZXMgTWFjIgotZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBidWlsZCBkaXJlY3RvcmllcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBidWlsZCBkaXJlY3Rvcmllcy4uLiAkRUNIT19DIiA+JjYKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBidWlsZCBkaXJlY3RvcmllcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBidWlsZCBkaXJlY3Rvcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KIGZvciBkaXIgaW4gJFNSQ0RJUlM7IGRvCiAgICAgaWYgdGVzdCAhIC1kICRkaXI7IHRoZW4KICAgICAgICAgbWtkaXIgJGRpcgogICAgIGZpCiBkb25lCi1lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBkb25lIiA+JjUKLWVjaG8gIiR7RUNIT19UfWRvbmUiID4mNgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBkb25lIiA+JjUKK2VjaG8gIiR7RUNIT19UfWRvbmUiID4mNjsgfQogCiAjIGdlbmVyYXRlIG91dHB1dCBmaWxlcwotICAgICAgICAgICAgICAgICAgICBhY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZWZpbGUucHJlIE1vZHVsZXMvU2V0dXAuY29uZmlnIgorYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlLnByZSBNb2R1bGVzL1NldHVwLmNvbmZpZyIKIAogY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCiAjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKQEAgLTIxNTY1LDM5ICsyMjQ4OSw1OCBAQAogCiAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAogIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKyMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCiAjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKICMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi17CisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKwogICAoc2V0KSAyPiYxIHwKLSAgICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAgICphY19zcGFjZT1cICopCisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPScgJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKICAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKICAgICAgICMgc3Vic3RpdHV0aW9uIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgogICAgICAgc2VkIC1uIFwKIAkicy8nLydcXFxcJycvZzsKIAkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKLSAgICAgIDs7CisgICAgICA7OyAjKAogICAgICopCiAgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgICAgc2VkIC1uIFwKLQkicy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT1cXDIvcCIKKyAgICAgIHNlZCAtbiAiL15bXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSo9L3AiCiAgICAgICA7OwotICAgIGVzYWM7Ci19IHwKKyAgICBlc2FjIHwKKyAgICBzb3J0CispIHwKICAgc2VkICcKKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCiAgICAgIHQgY2xlYXIKLSAgICAgOiBjbGVhcgorICAgICA6Y2xlYXIKICAgICAgcy9eXChbXj1dKlwpPVwoLipbe31dLipcKSQvdGVzdCAiJHtcMStzZXR9IiA9IHNldCB8fCAmLwogICAgICB0IGVuZAotICAgICAvXmFjX2N2X2Vudi8hcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCi0gICAgIDogZW5kJyA+PmNvbmZjYWNoZQorICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKyAgICAgOmVuZCcgPj5jb25mY2FjaGUKIGlmIGRpZmYgJGNhY2hlX2ZpbGUgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCiAgIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJiBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KICAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQogICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KICAgZmkKIGZpCiBybSAtZiBjb25mY2FjaGUKQEAgLTIxNjA2LDMyICsyMjU0OSwxOCBAQAogIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCiB0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCiAKLSMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAotIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGZyb20gVlBBVEggaWYgc3JjZGlyIGlzICIuIiwgc3RyaXAgbGVhZGluZyBhbmQKLSMgdHJhaWxpbmcgY29sb25zIGFuZCB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgbGluZSBpZiBWUEFUSCBiZWNvbWVzIGVtcHR5Ci0jIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bCSBdKlZQQVRIWwkgXSo9L3sKLXMvOipcJChzcmNkaXIpOiovOi87Ci1zLzoqXCR7c3JjZGlyfToqLzovOwotcy86KkBzcmNkaXJAOiovOi87Ci1zL15cKFtePV0qPVsJIF0qXCk6Ki9cMS87Ci1zLzoqJC8vOwotcy9eW149XSo9WwkgXSokLy87Ci19JwotZmkKLQogREVGUz0tREhBVkVfQ09ORklHX0gKIAogYWNfbGlib2Jqcz0KIGFjX2x0bGlib2Jqcz0KIGZvciBhY19pIGluIDogJExJQk9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQogICAjIDEuIFJlbW92ZSB0aGUgZXh0ZW5zaW9uLCBhbmQgJFUgaWYgYWxyZWFkeSBpbnN0YWxsZWQuCi0gIGFjX2k9YGVjaG8gIiRhY19pIiB8Ci0JIHNlZCAncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJ2AKLSAgIyAyLiBBZGQgdGhlbS4KLSAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgJGFjX2lcJFUuJGFjX29iamV4dCIKLSAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzICRhY19pIickVS5sbycKKyAgYWNfc2NyaXB0PSdzL1wkVVwuLy4vO3MvXC5vJC8vO3MvXC5vYmokLy8nCisgIGFjX2k9YGVjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCisgIGFjX2xpYm9ianM9IiRhY19saWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorICBhY19sdGxpYm9ianM9IiRhY19sdGxpYm9ianMgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKIGRvbmUKIExJQk9CSlM9JGFjX2xpYm9ianMKIApAQCAtMjE2NjksNjYgKzIyNTk4LDE1IEBACiAgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKICAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KICAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCi1lbGlmIHRlc3QgLW4gIiR7QkFTSF9WRVJTSU9OK3NldH0iICYmIChzZXQgLW8gcG9zaXgpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBzZXQgLW8gcG9zaXgKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKIGZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAogRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAogCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQotZmkKIAotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLSRhc191bnNldCBFTlYgTUFJTCBNQUlMUEFUSAotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1mb3IgYXNfdmFyIGluIFwKLSAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKLSAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKLSAgTENfVEVMRVBIT05FIExDX1RJTUUKLWRvCi0gIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCi0gICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gIGVsc2UKLSAgICAkYXNfdW5zZXQgJGFzX3ZhcgotICBmaQotZG9uZQotCi0jIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJCcgXHwgXAotCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKLWVjaG8gWC8iJDAiIHwKLSAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwvXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwvXChcL1wpLioveyBzLy9cMS87IHE7IH0KLSAgCSAgcy8uKi8uLzsgcSdgCi0KLQotIyBQQVRIIG5lZWRzIENSLCBhbmQgTElORU5PIG5lZWRzIENSIGFuZCBQQVRILgorIyBQQVRIIG5lZWRzIENSCiAjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCiBhc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKIGFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJwpAQCAtMjE3NDksMTI2ICsyMjYyNywxOTggQEAKICAgcm0gLWYgY29uZiQkLnNoCiBmaQogCisjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc191bnNldD11bnNldAorZWxzZQorICBhc191bnNldD1mYWxzZQorZmkKIAotICBhc19saW5lbm9fMT0kTElORU5PCi0gIGFzX2xpbmVub18yPSRMSU5FTk8KLSAgYXNfbGluZW5vXzM9YChleHByICRhc19saW5lbm9fMSArIDEpIDI+L2Rldi9udWxsYAotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieCRhc19saW5lbm9fMyIgID0gIngkYXNfbGluZW5vXzIiICB8fCB7Ci0gICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIHBhdGggYXQgYWxsCi0gICMgcmVsYXRpdmUgb3Igbm90LgotICBjYXNlICQwIGluCi0gICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKworIyBJRlMKKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKyMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorYXNfbmw9JworJworSUZTPSIgIiIJJGFzX25sIgorCisjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorY2FzZSAkMCBpbgorICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7CisgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKIAotICAgICAgIDs7Ci0gIGVzYWMKLSAgIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJwotICAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLSAgaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICAgIGFzX215c2VsZj0kMAotICBmaQotICBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIHBhdGgiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgZmkKLSAgY2FzZSAkQ09ORklHX1NIRUxMIGluCi0gICcnKQotICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gL2JpbiRQQVRIX1NFUEFSQVRPUi91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitmaQorCisjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KK2ZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKK2RvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCitkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQogZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCi0JIGNhc2UgJGFzX2RpciBpbgotCSAvKikKLQkgICBpZiAoIiRhc19kaXIvJGFzX2Jhc2UiIC1jICcKKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgoraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCisKKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworCisKICAgYXNfbGluZW5vXzE9JExJTkVOTwogICBhc19saW5lbm9fMj0kTElORU5PCi0gIGFzX2xpbmVub18zPWAoZXhwciAkYXNfbGluZW5vXzEgKyAxKSAyPi9kZXYvbnVsbGAKICAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCi0gIHRlc3QgIngkYXNfbGluZW5vXzMiICA9ICJ4JGFzX2xpbmVub18yIiAnKSAyPi9kZXYvbnVsbDsgdGhlbgotCSAgICAgJGFzX3Vuc2V0IEJBU0hfRU5WIHx8IHRlc3QgIiR7QkFTSF9FTlYrc2V0fSIgIT0gc2V0IHx8IHsgQkFTSF9FTlY9OyBleHBvcnQgQkFTSF9FTlY7IH0KLQkgICAgICRhc191bnNldCBFTlYgfHwgdGVzdCAiJHtFTlYrc2V0fSIgIT0gc2V0IHx8IHsgRU5WPTsgZXhwb3J0IEVOVjsgfQotCSAgICAgQ09ORklHX1NIRUxMPSRhc19kaXIvJGFzX2Jhc2UKLQkgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLQkgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgJHsxKyIkQCJ9Ci0JICAgZmk7OwotCSBlc2FjCi0gICAgICAgZG9uZQotZG9uZQotOzsKLSAgZXNhYworICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKIAogICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCiAgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKLSAgIyBsaW5lLW51bWJlciBsaW5lIGJlZm9yZSBlYWNoIGxpbmU7IHRoZSBzZWNvbmQgJ3NlZCcgZG9lcyB0aGUgcmVhbAotICAjIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2ggbGluZS1udW1iZXIgbGluZQotICAjIHdpdGggdGhlIG51bWJlcmVkIGxpbmUsIGFuZCBhcHBlbmRzIHRyYWlsaW5nICctJyBkdXJpbmcKLSAgIyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwgY2FzZSBhdCBsaW5lIGVuZC4KKyAgIyBsaW5lLW51bWJlciBsaW5lIGFmdGVyIGVhY2ggbGluZSB1c2luZyAkTElORU5POyB0aGUgc2Vjb25kICdzZWQnCisgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCisgICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKKyAgIyB0cmFpbGluZyAnLScgZHVyaW5nIHN1YnN0aXR1dGlvbiBzbyB0aGF0ICRMSU5FTk8gaXMgbm90IGEgc3BlY2lhbAorICAjIGNhc2UgYXQgbGluZSBlbmQuCiAgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQotICAjIHNlY29uZCAnc2VkJyBzY3JpcHQuICBCbGFtZSBMZWUgRS4gTWNNYWhvbiBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAnPScgPCRhc19teXNlbGYgfAorICAjIHNjcmlwdHMgd2l0aCBvcHRpbWl6YXRpb24gaGVscCBmcm9tIFBhb2xvIEJvbnppbmkuICBCbGFtZSBMZWUKKyAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAogICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KICAgICAgIE4KLSAgICAgIHMsJCwtLAotICAgICAgOiBsb29wCi0gICAgICBzLF5cKFsnJGFzX2NyX2RpZ2l0cyddKlwpXCguKlwpWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX11cKSxcMVwyXDFcMywKKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KICAgICAgIHQgbG9vcAotICAgICAgcywtJCwsCi0gICAgICBzLF5bJyRhc19jcl9kaWdpdHMnXSpcbiwsCisgICAgICBzLy1cbi4qLy8KICAgICAnID4kYXNfbWUubGluZW5vICYmCi0gIGNobW9kICt4ICRhc19tZS5saW5lbm8gfHwKLSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyO30KKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIAogICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwogICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpYmxlIHRvIHRoaXMpLgotICAuIC4vJGFzX21lLmxpbmVubworICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgorICAuICIuLyRhc19tZS5saW5lbm8iCiAgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgogICBleGl0CiB9CiAKIAotY2FzZSBgZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsM2AsYGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsM2AgaW4KLSAgKmMqLC1uKikgRUNIT19OPSBFQ0hPX0M9JwotJyBFQ0hPX1Q9JwknIDs7Ci0gICpjKiwqICApIEVDSE9fTj0tbiBFQ0hPX0M9IEVDSE9fVD0gOzsKLSAgKikgICAgICAgRUNIT19OPSBFQ0hPX0M9J1xjJyBFQ0hPX1Q9IDs7CitpZiAoZGlybmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfZGlybmFtZT1kaXJuYW1lCitlbHNlCisgIGFzX2Rpcm5hbWU9ZmFsc2UKK2ZpCisKK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CitjYXNlIGBlY2hvIC1uIHhgIGluCistbiopCisgIGNhc2UgYGVjaG8gJ3hcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICAqKSAgIEVDSE9fQz0nXGMnOzsKKyAgZXNhYzs7CisqKQorICBFQ0hPX049Jy1uJzs7CiBlc2FjCiAKLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KICAgYXNfZXhwcj1leHByCiBlbHNlCiAgIGFzX2V4cHI9ZmFsc2UKIGZpCiAKIHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKyAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorZWxzZQorICBybSAtZiBjb25mJCQuZGlyCisgIG1rZGlyIGNvbmYkJC5kaXIKK2ZpCiBlY2hvID5jb25mJCQuZmlsZQogaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gICMgV2UgY291bGQganVzdCBjaGVjayBmb3IgREpHUFA7IGJ1dCB0aGlzIHRlc3QgYSkgd29ya3MgYikgaXMgbW9yZSBnZW5lcmljCi0gICMgYW5kIGMpIHdpbGwgcmVtYWluIHZhbGlkIG9uY2UgREpHUFAgc3VwcG9ydHMgc3ltbGlua3MgKERKR1BQIDIuMDQpLgotICBpZiB0ZXN0IC1mIGNvbmYkJC5leGU7IHRoZW4KLSAgICAjIERvbid0IHVzZSBsbiBhdCBhbGw7IHdlIGRvbid0IGhhdmUgYW55IGxpbmtzCisgIGFzX2xuX3M9J2xuIC1zJworICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKyAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKyAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAogICAgIGFzX2xuX3M9J2NwIC1wJwotICBlbHNlCi0gICAgYXNfbG5fcz0nbG4gLXMnCi0gIGZpCiBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgogICBhc19sbl9zPWxuCiBlbHNlCiAgIGFzX2xuX3M9J2NwIC1wJwogZmkKLXJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCitybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCiAKIGlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KICAgYXNfbWtkaXJfcD06CkBAIC0yMTg3Nyw3ICsyMjgyNywxOSBAQAogICBhc19ta2Rpcl9wPWZhbHNlCiBmaQogCi1hc19leGVjdXRhYmxlX3A9InRlc3QgLWYiCisjIEZpbmQgb3V0IHdoZXRoZXIgYGB0ZXN0IC14Jycgd29ya3MuICBEb24ndCB1c2UgYSB6ZXJvLWJ5dGUgZmlsZSwgYXMKKyMgc3lzdGVtcyBtYXkgdXNlIG1ldGhvZHMgb3RoZXIgdGhhbiBtb2RlIGJpdHMgdG8gZGV0ZXJtaW5lIGV4ZWN1dGFiaWxpdHkuCitjYXQgPmNvbmYkJC5maWxlIDw8X0FTRU9GCisjISAvYmluL3NoCitleGl0IDAKK19BU0VPRgorY2htb2QgK3ggY29uZiQkLmZpbGUKK2lmIHRlc3QgLXggY29uZiQkLmZpbGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2V4ZWN1dGFibGVfcD0idGVzdCAteCIKK2Vsc2UKKyAgYXNfZXhlY3V0YWJsZV9wPToKK2ZpCitybSAtZiBjb25mJCQuZmlsZQogCiAjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCiBhc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgpAQCAtMjE4ODYsMzEgKzIyODQ4LDE0IEBACiBhc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgogCiAKLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLgotYXNfbmw9JwotJwotSUZTPSIgCSRhc19ubCIKLQotIyBDRFBBVEguCi0kYXNfdW5zZXQgQ0RQQVRICi0KIGV4ZWMgNj4mMQogCi0jIE9wZW4gdGhlIGxvZyByZWFsIHNvb24sIHRvIGtlZXAgXCRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KICMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgotIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4gIExvZ2dpbmcgLS12ZXJzaW9uIGV0Yy4gaXMgT0suCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLSAgZWNobwotICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotIyMgUnVubmluZyAkYXNfbWUuICMjCi1fQVNCT1gKLX0gPiY1Ci1jYXQgPiY1IDw8X0NTRU9GCi0KKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgogVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBweXRob24gJGFzX21lIDMuMCwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OWQuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKIAogICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCiAgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwpAQCAtMjE5MTgsMzAgKzIyODYzLDE5IEBACiAgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKICAgJCAkMCAkQAogCi1fQ1NFT0YKLWVjaG8gIm9uIGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYCIgPiY1Ci1lY2hvID4mNQorb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisiCisKIF9BQ0VPRgogCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgogIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgotaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19maWxlcyI7IHRoZW4KLSAgZWNobyAiY29uZmlnX2ZpbGVzPVwiJGFjX2NvbmZpZ19maWxlc1wiIiA+PiRDT05GSUdfU1RBVFVTCi1maQorY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKIAotaWYgdGVzdCAtbiAiJGFjX2NvbmZpZ19oZWFkZXJzIjsgdGhlbgotICBlY2hvICJjb25maWdfaGVhZGVycz1cIiRhY19jb25maWdfaGVhZGVyc1wiIiA+PiRDT05GSUdfU1RBVFVTCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfY29uZmlnX2xpbmtzIjsgdGhlbgotICBlY2hvICJjb25maWdfbGlua3M9XCIkYWNfY29uZmlnX2xpbmtzXCIiID4+JENPTkZJR19TVEFUVVMKLWZpCi0KLWlmIHRlc3QgLW4gIiRhY19jb25maWdfY29tbWFuZHMiOyB0aGVuCi0gIGVjaG8gImNvbmZpZ19jb21tYW5kcz1cIiRhY19jb25maWdfY29tbWFuZHNcIiIgPj4kQ09ORklHX1NUQVRVUwotZmkKK19BQ0VPRgogCiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLQogYWNfY3NfdXNhZ2U9IlwKIFxgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZQogY3VycmVudCBjb25maWd1cmF0aW9uLgpAQCAtMjE5NjUsMTkgKzIyODk5LDIxIEBACiAkY29uZmlnX2hlYWRlcnMKIAogUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCi1fQUNFT0YKIAorX0FDRU9GCiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgogYWNfY3NfdmVyc2lvbj0iXFwKIHB5dGhvbiBjb25maWcuc3RhdHVzIDMuMAotY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5LAorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5ZCwKICAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCiAKLUNvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK0NvcHlyaWdodCAoQykgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIFRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgogZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKLXNyY2Rpcj0kc3JjZGlyCi1JTlNUQUxMPSIkSU5TVEFMTCIKKworYWNfcHdkPSckYWNfcHdkJworc3JjZGlyPSckc3JjZGlyJworSU5TVEFMTD0nJElOU1RBTEwnCiBfQUNFT0YKIAogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCkBAIC0yMTk4OCwzOSArMjI5MjQsMjQgQEAKIGRvCiAgIGNhc2UgJDEgaW4KICAgLS0qPSopCi0gICAgYWNfb3B0aW9uPWBleHByICJ4JDEiIDogJ3hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIngkMSIgOiAneFtePV0qPVwoLipcKSdgCisgICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCiAgICAgYWNfc2hpZnQ9OgogICAgIDs7Ci0gIC0qKQorICAqKQogICAgIGFjX29wdGlvbj0kMQogICAgIGFjX29wdGFyZz0kMgogICAgIGFjX3NoaWZ0PXNoaWZ0CiAgICAgOzsKLSAgKikgIyBUaGlzIGlzIG5vdCBhbiBvcHRpb24sIHNvIHRoZSB1c2VyIGhhcyBwcm9iYWJseSBnaXZlbiBleHBsaWNpdAotICAgICAjIGFyZ3VtZW50cy4KLSAgICAgYWNfb3B0aW9uPSQxCi0gICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwogICBlc2FjCiAKICAgY2FzZSAkYWNfb3B0aW9uIGluCiAgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgogICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKICAgICBhY19jc19yZWNoZWNrPTogOzsKLSAgLS12ZXJzaW9uIHwgLS12ZXJzKiB8IC1WICkKLSAgICBlY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgMCA7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGFtYmlndW91cyBvcHRpb246ICQxCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIC0taGVscCB8IC0taGVsIHwgLWggKQotICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAtLWRlYnVnIHwgLS1kKiB8IC1kICkKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgIGVjaG8gIiRhY19jc192ZXJzaW9uIjsgZXhpdCA7OworICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQogICAgIGRlYnVnPTogOzsKICAgLS1maWxlIHwgLS1maWwgfCAtLWZpIHwgLS1mICkKICAgICAkYWNfc2hpZnQKQEAgLTIyMDMwLDE4ICsyMjk1MSwyNCBAQAogICAgICRhY19zaGlmdAogICAgIENPTkZJR19IRUFERVJTPSIkQ09ORklHX0hFQURFUlMgJGFjX29wdGFyZyIKICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIC0taGVscCB8IC0taGVsIHwgLWggKQorICAgIGVjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQogICAgIGFjX2NzX3NpbGVudD06IDs7CiAKICAgIyBUaGlzIGlzIGFuIGVycm9yLgotICAtKikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyO30KKyAgLSopIHsgZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OwogCi0gICopIGFjX2NvbmZpZ190YXJnZXRzPSIkYWNfY29uZmlnX3RhcmdldHMgJDEiIDs7CisgICopIGFjX2NvbmZpZ190YXJnZXRzPSIkYWNfY29uZmlnX3RhcmdldHMgJDEiCisgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKIAogICBlc2FjCiAgIHNoaWZ0CkBAIC0yMjA1NywzMCArMjI5ODQsNDcgQEAKIF9BQ0VPRgogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKIGlmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgotICBlY2hvICJydW5uaW5nICRTSEVMTCAkMCAiICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzICIgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iID4mNgotICBleGVjICRTSEVMTCAkMCAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorICBlY2hvICJydW5uaW5nIENPTkZJR19TSEVMTD0kU0hFTEwgJFNIRUxMICQwICIgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIENPTkZJR19TSEVMTD0kU0hFTEwKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICBleGVjICRTSEVMTCAiJDAiICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCiBmaQogCiBfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCisgIGVjaG8gIiRhY19sb2ciCit9ID4mNQogCi0KLQotCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitfQUNFT0YKIAogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgogZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCiBkbwotICBjYXNlICIkYWNfY29uZmlnX3RhcmdldCIgaW4KLSAgIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCi0gICJNYWtlZmlsZS5wcmUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlLnByZSIgOzsKLSAgIk1vZHVsZXMvU2V0dXAuY29uZmlnIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNb2R1bGVzL1NldHVwLmNvbmZpZyIgOzsKLSAgInB5Y29uZmlnLmgiICkgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBweWNvbmZpZy5oIiA7OworICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisgICAgInB5Y29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIHB5Y29uZmlnLmgiIDs7CisgICAgIk1hYy9PU1gvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFjL09TWC9NYWtlZmlsZSIgOzsKKyAgICAiTWFjL09TWC9QeXRob25MYXVuY2hlci9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWMvT1NYL1B5dGhvbkxhdW5jaGVyL01ha2VmaWxlIiA7OworICAgICJNYWMvT1NYL0lETEUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFjL09TWC9JRExFL01ha2VmaWxlIiA7OworICAgICJNYWtlZmlsZS5wcmUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUucHJlIiA7OworICAgICJNb2R1bGVzL1NldHVwLmNvbmZpZyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNb2R1bGVzL1NldHVwLmNvbmZpZyIgOzsKKwogICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1CiBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CiAgIGVzYWMKIGRvbmUKIAorCiAjIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCiAjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KICMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKQEAgLTIyMDkxLDM1NyArMjMwMzUsNDY4IEBACiBmaQogCiAjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKLSMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIHB1dCBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCiAjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBob29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgorIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCiAkZGVidWcgfHwKIHsKLSAgdHJhcCAnZXhpdF9zdGF0dXM9JD87IHJtIC1yZiAkdG1wICYmIGV4aXQgJGV4aXRfc3RhdHVzJyAwCisgIHRtcD0KKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgeyB0ZXN0IC16ICIkdG1wIiB8fCB0ZXN0ICEgLWQgIiR0bXAiIHx8IHJtIC1mciAiJHRtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAogICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQogfQotCiAjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KIAogewotICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIuL2NvbmZzdGF0WFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgogICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgogfSAgfHwKIHsKLSAgdG1wPS4vY29uZnN0YXQkJC0kUkFORE9NCi0gICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCiB9IHx8CiB7CiAgICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CiB9CiAKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotCiAjCi0jIENPTkZJR19GSUxFUyBzZWN0aW9uLgorIyBTZXQgdXAgdGhlIHNlZCBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KICMKIAogIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCiAjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2hlbiAuL2NvbmZpZy5zdGF0dXMgY29uZmlnLmgKLWlmIHRlc3QgLW4gIlwkQ09ORklHX0ZJTEVTIjsgdGhlbgotICAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotICBzZWQgJ3MvLEAvQEAvOyBzL0AsL0BALzsgcy8sO3QgdFwkL0A7dCB0LzsgL0A7dCB0XCQvcy9bXFxcXCYsXS9cXFxcJi9nOwotICAgcy9AQC8sQC87IHMvQEAvQCwvOyBzL0A7dCB0XCQvLDt0IHQvJyA+XCR0bXAvc3Vicy5zZWQgPDxcXENFT0YKLXMsQFNIRUxMQCwkU0hFTEwsO3QgdAotcyxAUEFUSF9TRVBBUkFUT1JALCRQQVRIX1NFUEFSQVRPUiw7dCB0Ci1zLEBQQUNLQUdFX05BTUVALCRQQUNLQUdFX05BTUUsO3QgdAotcyxAUEFDS0FHRV9UQVJOQU1FQCwkUEFDS0FHRV9UQVJOQU1FLDt0IHQKLXMsQFBBQ0tBR0VfVkVSU0lPTkAsJFBBQ0tBR0VfVkVSU0lPTiw7dCB0Ci1zLEBQQUNLQUdFX1NUUklOR0AsJFBBQ0tBR0VfU1RSSU5HLDt0IHQKLXMsQFBBQ0tBR0VfQlVHUkVQT1JUQCwkUEFDS0FHRV9CVUdSRVBPUlQsO3QgdAotcyxAZXhlY19wcmVmaXhALCRleGVjX3ByZWZpeCw7dCB0Ci1zLEBwcmVmaXhALCRwcmVmaXgsO3QgdAotcyxAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAsJHByb2dyYW1fdHJhbnNmb3JtX25hbWUsO3QgdAotcyxAYmluZGlyQCwkYmluZGlyLDt0IHQKLXMsQHNiaW5kaXJALCRzYmluZGlyLDt0IHQKLXMsQGxpYmV4ZWNkaXJALCRsaWJleGVjZGlyLDt0IHQKLXMsQGRhdGFkaXJALCRkYXRhZGlyLDt0IHQKLXMsQHN5c2NvbmZkaXJALCRzeXNjb25mZGlyLDt0IHQKLXMsQHNoYXJlZHN0YXRlZGlyQCwkc2hhcmVkc3RhdGVkaXIsO3QgdAotcyxAbG9jYWxzdGF0ZWRpckAsJGxvY2Fsc3RhdGVkaXIsO3QgdAotcyxAbGliZGlyQCwkbGliZGlyLDt0IHQKLXMsQGluY2x1ZGVkaXJALCRpbmNsdWRlZGlyLDt0IHQKLXMsQG9sZGluY2x1ZGVkaXJALCRvbGRpbmNsdWRlZGlyLDt0IHQKLXMsQGluZm9kaXJALCRpbmZvZGlyLDt0IHQKLXMsQG1hbmRpckAsJG1hbmRpciw7dCB0Ci1zLEBidWlsZF9hbGlhc0AsJGJ1aWxkX2FsaWFzLDt0IHQKLXMsQGhvc3RfYWxpYXNALCRob3N0X2FsaWFzLDt0IHQKLXMsQHRhcmdldF9hbGlhc0AsJHRhcmdldF9hbGlhcyw7dCB0Ci1zLEBERUZTQCwkREVGUyw7dCB0Ci1zLEBFQ0hPX0NALCRFQ0hPX0MsO3QgdAotcyxARUNIT19OQCwkRUNIT19OLDt0IHQKLXMsQEVDSE9fVEAsJEVDSE9fVCw7dCB0Ci1zLEBMSUJTQCwkTElCUyw7dCB0Ci1zLEBWRVJTSU9OQCwkVkVSU0lPTiw7dCB0Ci1zLEBTT1ZFUlNJT05ALCRTT1ZFUlNJT04sO3QgdAotcyxAQ09ORklHX0FSR1NALCRDT05GSUdfQVJHUyw7dCB0Ci1zLEBQWVRIT05GUkFNRVdPUktALCRQWVRIT05GUkFNRVdPUkssO3QgdAotcyxAUFlUSE9ORlJBTUVXT1JLRElSQCwkUFlUSE9ORlJBTUVXT1JLRElSLDt0IHQKLXMsQFBZVEhPTkZSQU1FV09SS1BSRUZJWEAsJFBZVEhPTkZSQU1FV09SS1BSRUZJWCw7dCB0Ci1zLEBQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSQCwkUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUiw7dCB0Ci1zLEBNQUNIREVQQCwkTUFDSERFUCw7dCB0Ci1zLEBTR0lfQUJJQCwkU0dJX0FCSSw7dCB0Ci1zLEBFWFRSQVBMQVRESVJALCRFWFRSQVBMQVRESVIsO3QgdAotcyxARVhUUkFNQUNIREVQUEFUSEAsJEVYVFJBTUFDSERFUFBBVEgsO3QgdAotcyxAQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVEAsJENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQsO3QgdAotcyxAQ0NALCRDQyw7dCB0Ci1zLEBDRkxBR1NALCRDRkxBR1MsO3QgdAotcyxATERGTEFHU0AsJExERkxBR1MsO3QgdAotcyxAQ1BQRkxBR1NALCRDUFBGTEFHUyw7dCB0Ci1zLEBhY19jdF9DQ0AsJGFjX2N0X0NDLDt0IHQKLXMsQEVYRUVYVEAsJEVYRUVYVCw7dCB0Ci1zLEBPQkpFWFRALCRPQkpFWFQsO3QgdAotcyxAQ1hYQCwkQ1hYLDt0IHQKLXMsQE1BSU5DQ0AsJE1BSU5DQyw7dCB0Ci1zLEBDUFBALCRDUFAsO3QgdAotcyxARUdSRVBALCRFR1JFUCw7dCB0Ci1zLEBCVUlMREVYRUVYVEAsJEJVSUxERVhFRVhULDt0IHQKLXMsQExJQlJBUllALCRMSUJSQVJZLDt0IHQKLXMsQExETElCUkFSWUAsJExETElCUkFSWSw7dCB0Ci1zLEBETExMSUJSQVJZQCwkRExMTElCUkFSWSw7dCB0Ci1zLEBCTERMSUJSQVJZQCwkQkxETElCUkFSWSw7dCB0Ci1zLEBMRExJQlJBUllESVJALCRMRExJQlJBUllESVIsO3QgdAotcyxASU5TVFNPTkFNRUAsJElOU1RTT05BTUUsO3QgdAotcyxAUlVOU0hBUkVEQCwkUlVOU0hBUkVELDt0IHQKLXMsQExJTktDQ0AsJExJTktDQyw7dCB0Ci1zLEBSQU5MSUJALCRSQU5MSUIsO3QgdAotcyxAYWNfY3RfUkFOTElCQCwkYWNfY3RfUkFOTElCLDt0IHQKLXMsQEFSQCwkQVIsO3QgdAotcyxAU1ZOVkVSU0lPTkAsJFNWTlZFUlNJT04sO3QgdAotcyxASU5TVEFMTF9QUk9HUkFNQCwkSU5TVEFMTF9QUk9HUkFNLDt0IHQKLXMsQElOU1RBTExfU0NSSVBUQCwkSU5TVEFMTF9TQ1JJUFQsO3QgdAotcyxASU5TVEFMTF9EQVRBQCwkSU5TVEFMTF9EQVRBLDt0IHQKLXMsQExOQCwkTE4sO3QgdAotcyxAT1BUQCwkT1BULDt0IHQKLXMsQEJBU0VDRkxBR1NALCRCQVNFQ0ZMQUdTLDt0IHQKLXMsQE9USEVSX0xJQlRPT0xfT1BUQCwkT1RIRVJfTElCVE9PTF9PUFQsO3QgdAotcyxATElCVE9PTF9DUlVGVEAsJExJQlRPT0xfQ1JVRlQsO3QgdAotcyxAU09ALCRTTyw7dCB0Ci1zLEBMRFNIQVJFREAsJExEU0hBUkVELDt0IHQKLXMsQEJMRFNIQVJFREAsJEJMRFNIQVJFRCw7dCB0Ci1zLEBDQ1NIQVJFREAsJENDU0hBUkVELDt0IHQKLXMsQExJTktGT1JTSEFSRURALCRMSU5LRk9SU0hBUkVELDt0IHQKLXMsQENGTEFHU0ZPUlNIQVJFREAsJENGTEFHU0ZPUlNIQVJFRCw7dCB0Ci1zLEBTSExJQlNALCRTSExJQlMsO3QgdAotcyxAVVNFX1NJR05BTF9NT0RVTEVALCRVU0VfU0lHTkFMX01PRFVMRSw7dCB0Ci1zLEBTSUdOQUxfT0JKU0AsJFNJR05BTF9PQkpTLDt0IHQKLXMsQFVTRV9USFJFQURfTU9EVUxFQCwkVVNFX1RIUkVBRF9NT0RVTEUsO3QgdAotcyxATERMQVNUQCwkTERMQVNULDt0IHQKLXMsQFRIUkVBRE9CSkAsJFRIUkVBRE9CSiw7dCB0Ci1zLEBETElOQ0xESVJALCRETElOQ0xESVIsO3QgdAotcyxARFlOTE9BREZJTEVALCREWU5MT0FERklMRSw7dCB0Ci1zLEBNQUNIREVQX09CSlNALCRNQUNIREVQX09CSlMsO3QgdAotcyxAVFJVRUAsJFRSVUUsO3QgdAotcyxATElCT0JKU0AsJExJQk9CSlMsO3QgdAotcyxASEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkdALCRIQVZFX0dFVEhPU1RCWU5BTUVfUl82X0FSRyw7dCB0Ci1zLEBIQVZFX0dFVEhPU1RCWU5BTUVfUl81X0FSR0AsJEhBVkVfR0VUSE9TVEJZTkFNRV9SXzVfQVJHLDt0IHQKLXMsQEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHQCwkSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcsO3QgdAotcyxASEFWRV9HRVRIT1NUQllOQU1FX1JALCRIQVZFX0dFVEhPU1RCWU5BTUVfUiw7dCB0Ci1zLEBIQVZFX0dFVEhPU1RCWU5BTUVALCRIQVZFX0dFVEhPU1RCWU5BTUUsO3QgdAotcyxATElCTUAsJExJQk0sO3QgdAotcyxATElCQ0AsJExJQkMsO3QgdAotcyxAVU5JQ09ERV9PQkpTQCwkVU5JQ09ERV9PQkpTLDt0IHQKLXMsQFRIUkVBREhFQURFUlNALCRUSFJFQURIRUFERVJTLDt0IHQKLXMsQFNSQ0RJUlNALCRTUkNESVJTLDt0IHQKLXMsQExUTElCT0JKU0AsJExUTElCT0JKUyw7dCB0Ci1DRU9GCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgogCiBfQUNFT0YKIAotICBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSAgIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSAgIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi0gIGFjX21heF9zZWRfbGluZXM9NDgKLSAgYWNfc2VkX2ZyYWc9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi0gIGFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotICBhY19lbmQ9JGFjX21heF9zZWRfbGluZXMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotICBhY19tb3JlX2xpbmVzPToKLSAgYWNfc2VkX2NtZHM9Ci0gIHdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICAgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiICR0bXAvc3Vicy5zZWQgPiR0bXAvc3Vicy5mcmFnCi0gICAgZWxzZQotICAgICAgc2VkICIke2FjX2VuZH1xIiAkdG1wL3N1YnMuc2VkID4kdG1wL3N1YnMuZnJhZwotICAgIGZpCi0gICAgaWYgdGVzdCAhIC1zICR0bXAvc3Vicy5mcmFnOyB0aGVuCi0gICAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgZWxzZQotICAgICAgIyBUaGUgcHVycG9zZSBvZiB0aGUgbGFiZWwgYW5kIG9mIHRoZSBicmFuY2hpbmcgY29uZGl0aW9uIGlzIHRvCi0gICAgICAjIHNwZWVkIHVwIHRoZSBzZWQgcHJvY2Vzc2luZyAoaWYgdGhlcmUgYXJlIG5vIGBAJyBhdCBhbGwsIHRoZXJlCi0gICAgICAjIGlzIG5vIG5lZWQgdG8gYnJvd3NlIGFueSBvZiB0aGUgc3Vic3RpdHV0aW9ucykuCi0gICAgICAjIFRoZXNlIGFyZSB0aGUgdHdvIGV4dHJhIHNlZCBjb21tYW5kcyBtZW50aW9uZWQgYWJvdmUuCi0gICAgICAoZWNobyAnOnQKLSAgL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYicgJiYgY2F0ICR0bXAvc3Vicy5mcmFnKSA+JHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQKLSAgICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLQlhY19zZWRfY21kcz0ic2VkIC1mICR0bXAvc3Vicy0kYWNfc2VkX2ZyYWcuc2VkIgotICAgICAgZWxzZQotCWFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgJHRtcC9zdWJzLSRhY19zZWRfZnJhZy5zZWQiCi0gICAgICBmaQotICAgICAgYWNfc2VkX2ZyYWc9YGV4cHIgJGFjX3NlZF9mcmFnICsgMWAKLSAgICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2xpbmVzYAotICAgIGZpCi0gIGRvbmUKLSAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgIGFjX3NlZF9jbWRzPWNhdAorCisKK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KKyAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgorU0hFTEwhJFNIRUxMJGFjX2RlbGltCitQQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KK1BBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCitQQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQorUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KK1BBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQorUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCitleGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KK3ByZWZpeCEkcHJlZml4JGFjX2RlbGltCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCitiaW5kaXIhJGJpbmRpciRhY19kZWxpbQorc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQorbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQorZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCitkYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCitzeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCitzaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KK2xvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KK2luY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KK29sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KK2RvY2RpciEkZG9jZGlyJGFjX2RlbGltCitpbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCitodG1sZGlyISRodG1sZGlyJGFjX2RlbGltCitkdmlkaXIhJGR2aWRpciRhY19kZWxpbQorcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KK3BzZGlyISRwc2RpciRhY19kZWxpbQorbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KK2xvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCittYW5kaXIhJG1hbmRpciRhY19kZWxpbQorREVGUyEkREVGUyRhY19kZWxpbQorRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KK0VDSE9fTiEkRUNIT19OJGFjX2RlbGltCitFQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQorTElCUyEkTElCUyRhY19kZWxpbQorYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCitob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCit0YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQorVkVSU0lPTiEkVkVSU0lPTiRhY19kZWxpbQorU09WRVJTSU9OISRTT1ZFUlNJT04kYWNfZGVsaW0KK0NPTkZJR19BUkdTISRDT05GSUdfQVJHUyRhY19kZWxpbQorVU5JVkVSU0FMU0RLISRVTklWRVJTQUxTREskYWNfZGVsaW0KK1BZVEhPTkZSQU1FV09SSyEkUFlUSE9ORlJBTUVXT1JLJGFjX2RlbGltCitQWVRIT05GUkFNRVdPUktESVIhJFBZVEhPTkZSQU1FV09SS0RJUiRhY19kZWxpbQorUFlUSE9ORlJBTUVXT1JLUFJFRklYISRQWVRIT05GUkFNRVdPUktQUkVGSVgkYWNfZGVsaW0KK1BZVEhPTkZSQU1FV09SS0lOU1RBTExESVIhJFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIkYWNfZGVsaW0KK0ZSQU1FV09SS0lOU1RBTExGSVJTVCEkRlJBTUVXT1JLSU5TVEFMTEZJUlNUJGFjX2RlbGltCitGUkFNRVdPUktJTlNUQUxMTEFTVCEkRlJBTUVXT1JLSU5TVEFMTExBU1QkYWNfZGVsaW0KK01BQ0hERVAhJE1BQ0hERVAkYWNfZGVsaW0KK1NHSV9BQkkhJFNHSV9BQkkkYWNfZGVsaW0KK0VYVFJBUExBVERJUiEkRVhUUkFQTEFURElSJGFjX2RlbGltCitFWFRSQU1BQ0hERVBQQVRIISRFWFRSQU1BQ0hERVBQQVRIJGFjX2RlbGltCitDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUISRDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJGFjX2RlbGltCitFWFBPUlRfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUISRFWFBPUlRfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJGFjX2RlbGltCitDQyEkQ0MkYWNfZGVsaW0KK0NGTEFHUyEkQ0ZMQUdTJGFjX2RlbGltCitMREZMQUdTISRMREZMQUdTJGFjX2RlbGltCitDUFBGTEFHUyEkQ1BQRkxBR1MkYWNfZGVsaW0KK2FjX2N0X0NDISRhY19jdF9DQyRhY19kZWxpbQorRVhFRVhUISRFWEVFWFQkYWNfZGVsaW0KK09CSkVYVCEkT0JKRVhUJGFjX2RlbGltCitDWFghJENYWCRhY19kZWxpbQorTUFJTkNDISRNQUlOQ0MkYWNfZGVsaW0KK0NQUCEkQ1BQJGFjX2RlbGltCitHUkVQISRHUkVQJGFjX2RlbGltCitFR1JFUCEkRUdSRVAkYWNfZGVsaW0KK0JVSUxERVhFRVhUISRCVUlMREVYRUVYVCRhY19kZWxpbQorTElCUkFSWSEkTElCUkFSWSRhY19kZWxpbQorTERMSUJSQVJZISRMRExJQlJBUlkkYWNfZGVsaW0KK0RMTExJQlJBUlkhJERMTExJQlJBUlkkYWNfZGVsaW0KK0JMRExJQlJBUlkhJEJMRExJQlJBUlkkYWNfZGVsaW0KK0xETElCUkFSWURJUiEkTERMSUJSQVJZRElSJGFjX2RlbGltCitJTlNUU09OQU1FISRJTlNUU09OQU1FJGFjX2RlbGltCitSVU5TSEFSRUQhJFJVTlNIQVJFRCRhY19kZWxpbQorTElOS0NDISRMSU5LQ0MkYWNfZGVsaW0KK1JBTkxJQiEkUkFOTElCJGFjX2RlbGltCitBUiEkQVIkYWNfZGVsaW0KK1NWTlZFUlNJT04hJFNWTlZFUlNJT04kYWNfZGVsaW0KK0lOU1RBTExfUFJPR1JBTSEkSU5TVEFMTF9QUk9HUkFNJGFjX2RlbGltCitJTlNUQUxMX1NDUklQVCEkSU5TVEFMTF9TQ1JJUFQkYWNfZGVsaW0KK0lOU1RBTExfREFUQSEkSU5TVEFMTF9EQVRBJGFjX2RlbGltCitMTiEkTE4kYWNfZGVsaW0KK09QVCEkT1BUJGFjX2RlbGltCitCQVNFQ0ZMQUdTISRCQVNFQ0ZMQUdTJGFjX2RlbGltCitPVEhFUl9MSUJUT09MX09QVCEkT1RIRVJfTElCVE9PTF9PUFQkYWNfZGVsaW0KK0xJQlRPT0xfQ1JVRlQhJExJQlRPT0xfQ1JVRlQkYWNfZGVsaW0KK1NPISRTTyRhY19kZWxpbQorTERTSEFSRUQhJExEU0hBUkVEJGFjX2RlbGltCitCTERTSEFSRUQhJEJMRFNIQVJFRCRhY19kZWxpbQorQ0NTSEFSRUQhJENDU0hBUkVEJGFjX2RlbGltCitMSU5LRk9SU0hBUkVEISRMSU5LRk9SU0hBUkVEJGFjX2RlbGltCitDRkxBR1NGT1JTSEFSRUQhJENGTEFHU0ZPUlNIQVJFRCRhY19kZWxpbQorU0hMSUJTISRTSExJQlMkYWNfZGVsaW0KK1VTRV9TSUdOQUxfTU9EVUxFISRVU0VfU0lHTkFMX01PRFVMRSRhY19kZWxpbQorU0lHTkFMX09CSlMhJFNJR05BTF9PQkpTJGFjX2RlbGltCitVU0VfVEhSRUFEX01PRFVMRSEkVVNFX1RIUkVBRF9NT0RVTEUkYWNfZGVsaW0KK0xETEFTVCEkTERMQVNUJGFjX2RlbGltCitUSFJFQURPQkohJFRIUkVBRE9CSiRhY19kZWxpbQorX0FDRU9GCisKKyAgaWYgdGVzdCBgZ3JlcCAtYyAiJGFjX2RlbGltXCQiIGNvbmYkJHN1YnMuc2VkYCA9IDk3OyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKICAgZmkKK2RvbmUKKworYWNfZW9mPQoraWYgZ3JlcCAnXkNFT0YkJyBjb25mJCRzdWJzLnNlZCA+L2Rldi9udWxsOyB0aGVuCisgIGFjX2VvZj1gc2VkIC1uICcvXkNFT0ZbMC05XSokL3MvQ0VPRi8vcCcgY29uZiQkc3Vicy5zZWQgfCBzb3J0IC1ucnUgfCBzZWQgMXFgCisgIGFjX2VvZj1gZXhwciAwJGFjX2VvZiArIDFgCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorY2F0ID4iXCR0bXAvc3Vicy0xLnNlZCIgPDxcQ0VPRiRhY19lb2YKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK19BQ0VPRgorc2VkICcKK3MvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2cKK3MvXi9zLEAvOyBzLyEvQCx8I18hIV8jfC8KKzpuCit0IG4KK3MvJyIkYWNfZGVsaW0iJyQvLGcvOyB0CitzLyQvXFwvOyBwCitOOyBzL14uKlxuLy87IHMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2c7IGIgbgorJyA+PiRDT05GSUdfU1RBVFVTIDxjb25mJCRzdWJzLnNlZAorcm0gLWYgY29uZiQkc3Vicy5zZWQKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitDRU9GJGFjX2VvZgorX0FDRU9GCisKKworYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworICBjYXQgPmNvbmYkJHN1YnMuc2VkIDw8X0FDRU9GCitETElOQ0xESVIhJERMSU5DTERJUiRhY19kZWxpbQorRFlOTE9BREZJTEUhJERZTkxPQURGSUxFJGFjX2RlbGltCitNQUNIREVQX09CSlMhJE1BQ0hERVBfT0JKUyRhY19kZWxpbQorVFJVRSEkVFJVRSRhY19kZWxpbQorTElCT0JKUyEkTElCT0JKUyRhY19kZWxpbQorSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkchJEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHJGFjX2RlbGltCitIQVZFX0dFVEhPU1RCWU5BTUVfUl81X0FSRyEkSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkckYWNfZGVsaW0KK0hBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHISRIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRyRhY19kZWxpbQorSEFWRV9HRVRIT1NUQllOQU1FX1IhJEhBVkVfR0VUSE9TVEJZTkFNRV9SJGFjX2RlbGltCitIQVZFX0dFVEhPU1RCWU5BTUUhJEhBVkVfR0VUSE9TVEJZTkFNRSRhY19kZWxpbQorTElCTSEkTElCTSRhY19kZWxpbQorTElCQyEkTElCQyRhY19kZWxpbQorVU5JQ09ERV9PQkpTISRVTklDT0RFX09CSlMkYWNfZGVsaW0KK1RIUkVBREhFQURFUlMhJFRIUkVBREhFQURFUlMkYWNfZGVsaW0KK1NSQ0RJUlMhJFNSQ0RJUlMkYWNfZGVsaW0KK0xUTElCT0JKUyEkTFRMSUJPQkpTJGFjX2RlbGltCitfQUNFT0YKKworICBpZiB0ZXN0IGBncmVwIC1jICIkYWNfZGVsaW1cJCIgY29uZiQkc3Vicy5zZWRgID0gMTY7IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorCithY19lb2Y9CitpZiBncmVwICdeQ0VPRiQnIGNvbmYkJHN1YnMuc2VkID4vZGV2L251bGw7IHRoZW4KKyAgYWNfZW9mPWBzZWQgLW4gJy9eQ0VPRlswLTldKiQvcy9DRU9GLy9wJyBjb25mJCRzdWJzLnNlZCB8IHNvcnQgLW5ydSB8IHNlZCAxcWAKKyAgYWNfZW9mPWBleHByIDAkYWNfZW9mICsgMWAKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitjYXQgPiJcJHRtcC9zdWJzLTIuc2VkIiA8PFxDRU9GJGFjX2VvZgorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYiBlbmQKK19BQ0VPRgorc2VkICcKK3MvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2cKK3MvXi9zLEAvOyBzLyEvQCx8I18hIV8jfC8KKzpuCit0IG4KK3MvJyIkYWNfZGVsaW0iJyQvLGcvOyB0CitzLyQvXFwvOyBwCitOOyBzL14uKlxuLy87IHMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2c7IGIgbgorJyA+PiRDT05GSUdfU1RBVFVTIDxjb25mJCRzdWJzLnNlZAorcm0gLWYgY29uZiQkc3Vicy5zZWQKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCis6ZW5kCitzL3wjXyEhXyN8Ly9nCitDRU9GJGFjX2VvZgorX0FDRU9GCisKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworcy86KlwkKHNyY2Rpcik6Ki86Lworcy86Klwke3NyY2Rpcn06Ki86Lworcy86KkBzcmNkaXJAOiovOi8KK3MvXlwoW149XSo9WwkgXSpcKToqL1wxLworcy86KiQvLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKIGZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKIAotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLWZvciBhY19maWxlIGluIDogJENPTkZJR19GSUxFUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAkYWNfZmlsZSBpbgotICAtIHwgKjotIHwgKjotOiogKSAjIGlucHV0IGZyb20gc3RkaW4KLQljYXQgPiR0bXAvc3RkaW4KLQlhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAotCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7Ci0gICo6KiApIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyxbXjpdKjosLCdgCi0JYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLDouKiwsJ2AgOzsKLSAgKiApICAgYWNfZmlsZV9pbj0kYWNfZmlsZS5pbiA7OworCitmb3IgYWNfdGFnIGluICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMKK2RvCisgIGNhc2UgJGFjX3RhZyBpbgorICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKKyAgZXNhYworICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorICA6W0ZITF0qOiopOzsKKyAgOkwqIHwgOkMqOiopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEludmFsaWQgdGFnICRhY190YWcuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEludmFsaWQgdGFnICRhY190YWcuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgOltGSF0tKSBhY190YWc9LTotOzsKKyAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKyAgZXNhYworICBhY19zYXZlX0lGUz0kSUZTCisgIElGUz06CisgIHNldCB4ICRhY190YWcKKyAgSUZTPSRhY19zYXZlX0lGUworICBzaGlmdAorICBhY19maWxlPSQxCisgIHNoaWZ0CisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6TCkgYWNfc291cmNlPSQxOzsKKyAgOltGSF0pCisgICAgYWNfZmlsZV9pbnB1dHM9CisgICAgZm9yIGFjX2YKKyAgICBkbworICAgICAgY2FzZSAkYWNfZiBpbgorICAgICAgLSkgYWNfZj0iJHRtcC9zdGRpbiI7OworICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKwkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCisJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisJIHRlc3QgLWYgIiRhY19mIiB8fAorCSAgIGNhc2UgJGFjX2YgaW4KKwkgICBbXFwvJF0qKSBmYWxzZTs7CisJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworCSAgIGVzYWMgfHwKKwkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgICAgICBlc2FjCisgICAgICBhY19maWxlX2lucHV0cz0iJGFjX2ZpbGVfaW5wdXRzICRhY19mIgorICAgIGRvbmUKKworICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisgICAgIyB1c2UgJGFzX21lKSwgcGVvcGxlIHdvdWxkIGJlIHN1cnByaXNlZCB0byByZWFkOgorICAgICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCisgICAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgZnJvbSAiYElGUz06CisJICBlY2hvICQqIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZydgIiBieSBjb25maWd1cmUuIgorICAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKyAgICBmaQorCisgICAgY2FzZSAkYWNfdGFnIGluCisgICAgKjotOiogfCAqOi0pIGNhdCA+IiR0bXAvc3RkaW4iOzsKKyAgICBlc2FjCisgICAgOzsKICAgZXNhYwogCi0gICMgQ29tcHV0ZSBAc3JjZGlyQCwgQHRvcF9zcmNkaXJALCBhbmQgQElOU1RBTExAIGZvciBzdWJkaXJlY3Rvcmllcy4KLSAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2ZpbGUiKSAyPi9kZXYvbnVsbCB8fAorICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKICRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCiAJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCiAJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgXAotCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKKwkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiBlY2hvIFgiJGFjX2ZpbGUiIHwKLSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveyBzLy9cMS87IHE7IH0KLSAgCSAgL15YXChcL1wvXClbXi9dLioveyBzLy9cMS87IHE7IH0KLSAgCSAgL15YXChcL1wvXCkkL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cKS4qL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIHMvLiovLi87IHEnYAotICB7IGlmICRhc19ta2Rpcl9wOyB0aGVuCi0gICAgbWtkaXIgLXAgIiRhY19kaXIiCi0gIGVsc2UKLSAgICBhc19kaXI9IiRhY19kaXIiCisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgeyBhc19kaXI9IiRhY19kaXIiCisgIGNhc2UgJGFzX2RpciBpbiAjKAorICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CisgIGVzYWMKKyAgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyAkYXNfbWtkaXJfcCAmJiBta2RpciAtcCAiJGFzX2RpciI7IH0gfHwgewogICAgIGFzX2RpcnM9Ci0gICAgd2hpbGUgdGVzdCAhIC1kICIkYXNfZGlyIjsgZG8KLSAgICAgIGFzX2RpcnM9IiRhc19kaXIgJGFzX2RpcnMiCi0gICAgICBhc19kaXI9YChkaXJuYW1lICIkYXNfZGlyIikgMj4vZGV2L251bGwgfHwKKyAgICB3aGlsZSA6OyBkbworICAgICAgY2FzZSAkYXNfZGlyIGluICMoCisgICAgICAqXCcqKSBhc19xZGlyPWBlY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiAkYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCiAJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKIAkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAotCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKIGVjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQotICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQotICAJICBzLy4qLy4vOyBxJ2AKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKICAgICBkb25lCi0gICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKLSAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9CisgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQotCiAgIGFjX2J1aWxkZGlyPS4KIAotaWYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgorY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKICAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwuLi8sZydgCi1lbHNlCi0gIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcj0KLWZpCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gZWNobyAiJGFjX2Rpcl9zdWZmaXgiIHwgc2VkICdzLC9bXlxcL10qLC8uLixnO3MsLywsJ2AKKyAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisgICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OworICBlc2FjIDs7Citlc2FjCithY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKK2FjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CithY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKIAogY2FzZSAkc3JjZGlyIGluCi0gIC4pICAjIE5vIC0tc3JjZGlyIG9wdGlvbi4gIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgogICAgIGFjX3NyY2Rpcj0uCi0gICAgaWYgdGVzdCAteiAiJGFjX3RvcF9idWlsZGRpciI7IHRoZW4KLSAgICAgICBhY190b3Bfc3JjZGlyPS4KLSAgICBlbHNlCi0gICAgICAgYWNfdG9wX3NyY2Rpcj1gZWNobyAkYWNfdG9wX2J1aWxkZGlyIHwgc2VkICdzLC8kLCwnYAotICAgIGZpIDs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgcGF0aC4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCiAgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciRhY19kaXJfc3VmZml4Ci0gICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyJHNyY2RpciA7OworICAgIGFjX3RvcF9zcmNkaXI9JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIkYWNfZGlyX3N1ZmZpeAorICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7CiBlc2FjCithY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CiAKLSMgRG8gbm90IHVzZSBgY2QgZm9vICYmIHB3ZGAgdG8gY29tcHV0ZSBhYnNvbHV0ZSBwYXRocywgYmVjYXVzZQotIyB0aGUgZGlyZWN0b3JpZXMgbWF5IG5vdCBleGlzdC4KLWNhc2UgYHB3ZGAgaW4KLS4pIGFjX2Fic19idWlsZGRpcj0iJGFjX2RpciI7OwotKikKLSAgY2FzZSAiJGFjX2RpciIgaW4KLSAgLikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgOzsKLSAgW1xcL10qIHwgPzpbXFwvXSogKSBhY19hYnNfYnVpbGRkaXI9IiRhY19kaXIiOzsKLSAgKikgYWNfYWJzX2J1aWxkZGlyPWBwd2RgLyIkYWNfZGlyIjs7Ci0gIGVzYWM7OwotZXNhYwotY2FzZSAkYWNfYWJzX2J1aWxkZGlyIGluCi0uKSBhY19hYnNfdG9wX2J1aWxkZGlyPSR7YWNfdG9wX2J1aWxkZGlyfS47OwotKikKLSAgY2FzZSAke2FjX3RvcF9idWlsZGRpcn0uIGluCi0gIC4pIGFjX2Fic190b3BfYnVpbGRkaXI9JGFjX2Fic19idWlsZGRpcjs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9idWlsZGRpcj0ke2FjX3RvcF9idWlsZGRpcn0uOzsKLSAgKikgYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfYWJzX2J1aWxkZGlyLyR7YWNfdG9wX2J1aWxkZGlyfS47OwotICBlc2FjOzsKLWVzYWMKLWNhc2UgJGFjX2Fic19idWlsZGRpciBpbgotLikgYWNfYWJzX3NyY2Rpcj0kYWNfc3JjZGlyOzsKLSopCi0gIGNhc2UgJGFjX3NyY2RpciBpbgotICAuKSBhY19hYnNfc3JjZGlyPSRhY19hYnNfYnVpbGRkaXI7OwotICBbXFwvXSogfCA/OltcXC9dKiApIGFjX2Fic19zcmNkaXI9JGFjX3NyY2Rpcjs7Ci0gICopIGFjX2Fic19zcmNkaXI9JGFjX2Fic19idWlsZGRpci8kYWNfc3JjZGlyOzsKLSAgZXNhYzs7Ci1lc2FjCi1jYXNlICRhY19hYnNfYnVpbGRkaXIgaW4KLS4pIGFjX2Fic190b3Bfc3JjZGlyPSRhY190b3Bfc3JjZGlyOzsKLSopCi0gIGNhc2UgJGFjX3RvcF9zcmNkaXIgaW4KLSAgLikgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX2Fic19idWlsZGRpcjs7Ci0gIFtcXC9dKiB8ID86W1xcL10qICkgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3RvcF9zcmNkaXI7OwotICAqKSBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfYWJzX2J1aWxkZGlyLyRhY190b3Bfc3JjZGlyOzsKLSAgZXNhYzs7Ci1lc2FjCiAKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKIAogICBjYXNlICRJTlNUQUxMIGluCiAgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkZGlyJElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CiAgIGVzYWMKLQotICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAotICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6Ci0gICMgICAgLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLnN0YXR1cy4gICovCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgPSB4LTsgdGhlbgotICAgIGNvbmZpZ3VyZV9pbnB1dD0KLSAgZWxzZQotICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAiCi0gIGZpCi0gIGNvbmZpZ3VyZV9pbnB1dD0kY29uZmlndXJlX2lucHV0IkdlbmVyYXRlZCBmcm9tIGBlY2hvICRhY19maWxlX2luIHwKLQkJCQkgICAgIHNlZCAncywuKi8sLCdgIGJ5IGNvbmZpZ3VyZS4iCi0KLSAgIyBGaXJzdCBsb29rIGZvciB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlIGJ1aWxkIHRyZWUsIG90aGVyd2lzZSBpbiB0aGUKLSAgIyBzcmMgdHJlZS4KLSAgYWNfZmlsZV9pbnB1dHM9YElGUz06Ci0gICAgZm9yIGYgaW4gJGFjX2ZpbGVfaW47IGRvCi0gICAgICBjYXNlICRmIGluCi0gICAgICAtKSBlY2hvICR0bXAvc3RkaW4gOzsKLSAgICAgIFtcXC8kXSopCi0JICMgQWJzb2x1dGUgKGNhbid0IGJlIERPUy1zdHlsZSwgYXMgSUZTPTopCi0JIHRlc3QgLWYgIiRmIiB8fCB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCSBlY2hvICIkZiI7OwotICAgICAgKikgIyBSZWxhdGl2ZQotCSBpZiB0ZXN0IC1mICIkZiI7IHRoZW4KLQkgICAjIEJ1aWxkIHRyZWUKLQkgICBlY2hvICIkZiIKLQkgZWxpZiB0ZXN0IC1mICIkc3JjZGlyLyRmIjsgdGhlbgotCSAgICMgU291cmNlIHRyZWUKLQkgICBlY2hvICIkc3JjZGlyLyRmIgotCSBlbHNlCi0JICAgIyAvZGV2L251bGwgdHJlZQotCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRmIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0JIGZpOzsKLSAgICAgIGVzYWMKLSAgICBkb25lYCB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KLSAgICBybSAtZiAiJGFjX2ZpbGUiCi0gIGZpCiBfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisjIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCisjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KK2FjX2RhdGFyb290ZGlyX2hhY2s9CisKK2Nhc2UgYHNlZCAtbiAnL2RhdGFyb290ZGlyLyB7CisgIHAKKyAgcQorfQorL0BkYXRhZGlyQC9wCisvQGRvY2RpckAvcAorL0BpbmZvZGlyQC9wCisvQGxvY2FsZWRpckAvcAorL0BtYW5kaXJAL3AKKycgJGFjX2ZpbGVfaW5wdXRzYCBpbgorKmRhdGFyb290ZGlyKikgOzsKKypAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mMjt9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworICBzJkBkYXRhZGlyQCYkZGF0YWRpciZnCisgIHMmQGRvY2RpckAmJGRvY2RpciZnCisgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKyAgcyZAbG9jYWxlZGlyQCYkbG9jYWxlZGlyJmcKKyAgcyZAbWFuZGlyQCYkbWFuZGlyJmcKKyAgICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworZXNhYworX0FDRU9GCisKKyMgTmV1dHJhbGl6ZSBWUEFUSCB3aGVuIGAkc3JjZGlyJyA9IGAuJy4KKyMgU2hlbGwgY29kZSBpbiBjb25maWd1cmUuYWMgbWlnaHQgc2V0IGV4dHJhc3ViLgorIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPwogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKICAgc2VkICIkYWNfdnBzdWIKICRleHRyYXN1YgpAQCAtMjI0NDksMjUyICsyMzUwNCwxMzEgQEAKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgogOnQKIC9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKLXMsQGNvbmZpZ3VyZV9pbnB1dEAsJGNvbmZpZ3VyZV9pbnB1dCw7dCB0Ci1zLEBzcmNkaXJALCRhY19zcmNkaXIsO3QgdAotcyxAYWJzX3NyY2RpckAsJGFjX2Fic19zcmNkaXIsO3QgdAotcyxAdG9wX3NyY2RpckAsJGFjX3RvcF9zcmNkaXIsO3QgdAotcyxAYWJzX3RvcF9zcmNkaXJALCRhY19hYnNfdG9wX3NyY2Rpciw7dCB0Ci1zLEBidWlsZGRpckAsJGFjX2J1aWxkZGlyLDt0IHQKLXMsQGFic19idWlsZGRpckAsJGFjX2Fic19idWlsZGRpciw7dCB0Ci1zLEB0b3BfYnVpbGRkaXJALCRhY190b3BfYnVpbGRkaXIsO3QgdAotcyxAYWJzX3RvcF9idWlsZGRpckAsJGFjX2Fic190b3BfYnVpbGRkaXIsO3QgdAotcyxASU5TVEFMTEAsJGFjX0lOU1RBTEwsO3QgdAotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiR0bXAvb3V0Ci0gIHJtIC1mICR0bXAvc3RkaW4KLSAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgIG12ICR0bXAvb3V0ICRhY19maWxlCi0gIGVsc2UKLSAgICBjYXQgJHRtcC9vdXQKLSAgICBybSAtZiAkdG1wL291dAotICBmaQorcyZAY29uZmlndXJlX2lucHV0QCYkY29uZmlndXJlX2lucHV0Jjt0IHQKK3MmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAorcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKK3MmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0CitzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAorJGFjX2RhdGFyb290ZGlyX2hhY2sKKyIgJGFjX2ZpbGVfaW5wdXRzIHwgc2VkIC1mICIkdG1wL3N1YnMtMS5zZWQiIHwgc2VkIC1mICIkdG1wL3N1YnMtMi5zZWQiID4kdG1wL291dAogCi1kb25lCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotCi0jCi0jIENPTkZJR19IRUFERVIgc2VjdGlvbi4KLSMKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzLF5cKFsJIF0qXCkjXChbCSBdKmRlZmluZVsJIF1bCSBdKlwpJwotYWNfZEI9J1sJIF0uKiQsXDEjXDInCi1hY19kQz0nICcKLWFjX2REPScsO3QnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MsXlwoWwkgXSpcKSNcKFsJIF0qXCl1bmRlZlwoWwkgXVsJIF0qXCknCi1hY191Qj0nJCxcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nLDt0JwotCi1mb3IgYWNfZmlsZSBpbiA6ICRDT05GSUdfSEVBREVSUzsgZG8gdGVzdCAieCRhY19maWxlIiA9IHg6ICYmIGNvbnRpbnVlCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgcm0gLWYgIiR0bXAvc3RkaW4iCiAgIGNhc2UgJGFjX2ZpbGUgaW4KLSAgLSB8ICo6LSB8ICo6LToqICkgIyBpbnB1dCBmcm9tIHN0ZGluCi0JY2F0ID4kdG1wL3N0ZGluCi0JYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUiIHwgc2VkICdzLFteOl0qOiwsJ2AKLQlhY19maWxlPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsOi4qLCwnYCA7OwotICAqOiogKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSIgfCBzZWQgJ3MsW146XSo6LCwnYAotCWFjX2ZpbGU9YGVjaG8gIiRhY19maWxlIiB8IHNlZCAncyw6LiosLCdgIDs7Ci0gICogKSAgIGFjX2ZpbGVfaW49JGFjX2ZpbGUuaW4gOzsKKyAgLSkgY2F0ICIkdG1wL291dCI7IHJtIC1mICIkdG1wL291dCI7OworICAqKSBybSAtZiAiJGFjX2ZpbGUiOyBtdiAiJHRtcC9vdXQiICRhY19maWxlOzsKICAgZXNhYworIDs7CisgIDpIKQorICAjCisgICMgQ09ORklHX0hFQURFUgorICAjCiAKLSAgdGVzdCB4IiRhY19maWxlIiAhPSB4LSAmJiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgUEFSQU1TIEMgVkFMVUUgRCIsIHdoZXJlCisgICMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQsIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyAgIyBQQVJBTVMgaXMgdGhlIHBhcmFtZXRlciBsaXN0IGluIHRoZSBtYWNybyBkZWZpbml0aW9uLS1pbiBtb3N0IGNhc2VzLCBpdCdzCisgICMganVzdCBhbiBlbXB0eSBzdHJpbmcuCisgICMKKyAgYWNfZEE9J3MsXlwoWwkgXSojWwkgXSpcKVteCSBdKlwoWwkgXVsJIF0qJworICBhY19kQj0nXClbCSAoXS4qJCxcMWRlZmluZVwyJworICBhY19kQz0nICcKKyAgYWNfZEQ9JyAsJwogCi0gICMgRmlyc3QgbG9vayBmb3IgdGhlIGlucHV0IGZpbGVzIGluIHRoZSBidWlsZCB0cmVlLCBvdGhlcndpc2UgaW4gdGhlCi0gICMgc3JjIHRyZWUuCi0gIGFjX2ZpbGVfaW5wdXRzPWBJRlM9OgotICAgIGZvciBmIGluICRhY19maWxlX2luOyBkbwotICAgICAgY2FzZSAkZiBpbgotICAgICAgLSkgZWNobyAkdG1wL3N0ZGluIDs7Ci0gICAgICBbXFwvJF0qKQotCSAjIEFic29sdXRlIChjYW4ndCBiZSBET1Mtc3R5bGUsIGFzIElGUz06KQotCSB0ZXN0IC1mICIkZiIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGYiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQkgIyBEbyBxdW90ZSAkZiwgdG8gcHJldmVudCBET1MgcGF0aHMgZnJvbSBiZWluZyBJRlMnZC4KLQkgZWNobyAiJGYiOzsKLSAgICAgICopICMgUmVsYXRpdmUKLQkgaWYgdGVzdCAtZiAiJGYiOyB0aGVuCi0JICAgIyBCdWlsZCB0cmVlCi0JICAgZWNobyAiJGYiCi0JIGVsaWYgdGVzdCAtZiAiJHNyY2Rpci8kZiI7IHRoZW4KLQkgICAjIFNvdXJjZSB0cmVlCi0JICAgZWNobyAiJHNyY2Rpci8kZiIKLQkgZWxzZQotCSAgICMgL2Rldi9udWxsIHRyZWUKLQkgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkZiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCSBmaTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0gICMgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZXMuCi0gIHNlZCAncy9bCSBdKiQvLycgJGFjX2ZpbGVfaW5wdXRzID4kdG1wL2luCi0KKyAgYWNfd29yZF9yZWdleHA9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCiBfQUNFT0YKIAotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIHR3byBzZWQgc2NyaXB0cywgYGNvbmZ0ZXN0LmRlZmluZXMnIGFuZAotIyBgY29uZnRlc3QudW5kZWZzJywgdGhhdCBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvCi0jIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBUaGUgZmlyc3QgaGFuZGxlcyBgI2RlZmluZScKLSMgdGVtcGxhdGVzLCBhbmQgdGhlIHNlY29uZCBgI3VuZGVmJyB0ZW1wbGF0ZXMuCi0jIEFuZCBmaXJzdDogUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluCi0jIGNvbmZpZy5zdGF0dXMuICBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudAotIyBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QuZGVmaW5lcyBjb25mdGVzdC51bmRlZnMKLSMgVXNpbmcgYSBoZXJlIGRvY3VtZW50IGluc3RlYWQgb2YgYSBzdHJpbmcgcmVkdWNlcyB0aGUgcXVvdGluZyBuaWdodG1hcmUuCi0jIFB1dHRpbmcgY29tbWVudHMgaW4gc2VkIHNjcmlwdHMgaXMgbm90IHBvcnRhYmxlLgotIwotIyBgZW5kJyBpcyB1c2VkIHRvIGF2b2lkIHRoYXQgdGhlIHNlY29uZCBtYWluIHNlZCBjb21tYW5kIChtZWFudCBmb3IKLSMgMC1hcnkgQ1BQIG1hY3JvcykgYXBwbGllcyB0byBuLWFyeSBtYWNybyBkZWZpbml0aW9ucy4KLSMgU2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIGZvciBgY2xlYXInLgotY2F0ID5jb25mZGVmMnNlZC5zZWQgPDxcX0FDRU9GCi1zL1tcXCYsXS9cXCYvZwotcyxbXFwkYF0sXFwmLGcKLXQgY2xlYXIKLTogY2xlYXIKLXMsXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgKF1bXgkgKF0qXClcKChbXildKilcKVsJIF0qXCguKlwpJCwke2FjX2RBfVwxJHthY19kQn1cMVwyJHthY19kQ31cMyR7YWNfZER9LGdwCi10IGVuZAotcyxeWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSpcKFteCSBdW14JIF0qXClbCSBdKlwoLipcKSQsJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0sZ3AKLTogZW5kCi1fQUNFT0YKLSMgSWYgc29tZSBtYWNyb3Mgd2VyZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB0aGVyZSBtaWdodCBiZSBzZXZlcmFsIHRpbWVzCi0jIHRoZSBzYW1lICNkZWZpbmVzLCB3aGljaCBpcyB1c2VsZXNzLiAgTmV2ZXJ0aGVsZXNzLCB3ZSBtYXkgbm90IHdhbnQgdG8KLSMgc29ydCB0aGVtLCBzaW5jZSB3ZSB3YW50IHRoZSAqbGFzdCogQUMtREVGSU5FIHRvIGJlIGhvbm9yZWQuCi11bmlxIGNvbmZkZWZzLmggfCBzZWQgLW4gLWYgY29uZmRlZjJzZWQuc2VkID5jb25mdGVzdC5kZWZpbmVzCi1zZWQgJ3MvYWNfZC9hY191L2cnIGNvbmZ0ZXN0LmRlZmluZXMgPmNvbmZ0ZXN0LnVuZGVmcwotcm0gLWYgY29uZmRlZjJzZWQuc2VkCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGBjb25mdGVzdC5kZWZpbmVzJywgdGhhdAorIyBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCitybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKKyMgRmlyc3QsIGFwcGVuZCBhIHNwYWNlIHRvIGV2ZXJ5IHVuZGVmL2RlZmluZSBsaW5lLCB0byBlYXNlIG1hdGNoaW5nLgorZWNobyAncy8kLyAvJyA+Y29uZnRlc3QuZGVmaW5lcworIyBUaGVuLCBwcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QsIG9yIGluCisjIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQsIGluIGNvbmZpZy5zdGF0dXMuICBJZiBzb21lIG1hY3JvcyB3ZXJlCisjIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgI2RlZmluZXMgZm9yIHRoZSBzYW1lCisjIHN5bWJvbCwgd2hpY2ggaXMgdXNlbGVzcy4gIEJ1dCBkbyBub3Qgc29ydCB0aGVtLCBzaW5jZSB0aGUgbGFzdAorIyBBQ19ERUZJTkUgbXVzdCBiZSBob25vcmVkLgorYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKK3VuaXEgY29uZmRlZnMuaCB8CisgIHNlZCAtbiAnCisJdCByc2V0CisJOnJzZXQKKwlzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8vCisJdCBvaworCWQKKwk6b2sKKwlzL1tcXCYsXS9cXCYvZworCXMvW1xcJGBdL1xcJi9nCisJcy9eXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpLyR7YWNfZEF9XDEkYWNfZEJcMiR7YWNfZEN9XDMkYWNfZEQvcAorCXMvXlwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS8ke2FjX2RBfVwxJGFjX2RCJHthY19kQ31cMiRhY19kRC9wCisgICcgPj5jb25mdGVzdC5kZWZpbmVzCiAKLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKyMgUmVtb3ZlIHRoZSBzcGFjZSB0aGF0IHdhcyBhcHBlbmRlZCB0byBlYXNlIG1hdGNoaW5nLgorIyBUaGVuIHJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCiAjIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCiAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PmNvbmZ0ZXN0LnVuZGVmcyA8PFxfQUNFT0YKLXMsXlsJIF0qI1sJIF0qdW5kZWZbCSBdWwkgXSpbYS16QS1aX11bYS16QS1aXzAtOV0qLC8qICYgKi8sCi1fQUNFT0YKKyMgKFRoZSByZWdleHAgY2FuIGJlIHNob3J0LCBzaW5jZSB0aGUgbGluZSBjb250YWlucyBlaXRoZXIgI2RlZmluZSBvciAjdW5kZWYuKQorZWNobyAncy8gJC8vCitzLF5bCSAjXSp1LiosLyogJiAqLywnID4+Y29uZnRlc3QuZGVmaW5lcwogCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LmRlZmluZXMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24gdGhlIHNpemUKLSMgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28gKDEwMCBjbWRzKS4KLWVjaG8gJyAgIyBIYW5kbGUgYWxsIHRoZSAjZGVmaW5lIHRlbXBsYXRlcyBvbmx5IGlmIG5lY2Vzc2FyeS4nID4+JENPTkZJR19TVEFUVVMKLWVjaG8gJyAgaWYgZ3JlcCAiXlsJIF0qI1sJIF0qZGVmaW5lIiAkdG1wL2luID4vZGV2L251bGw7IHRoZW4nID4+JENPTkZJR19TVEFUVVMKLWVjaG8gJyAgIyBJZiB0aGVyZSBhcmUgbm8gZGVmaW5lcywgd2UgbWF5IGhhdmUgYW4gZW1wdHkgaWYvZmknID4+JENPTkZJR19TVEFUVVMKLWVjaG8gJyAgOicgPj4kQ09ORklHX1NUQVRVUwotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgZ3JlcCAuIGNvbmZ0ZXN0LmRlZmluZXMgPi9kZXYvbnVsbAorIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzOgorYWNfbWF4X3NlZF9saW5lcz05NgorCisjIEZpcnN0IHNlZCBjb21tYW5kIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICRhY19maWxlX2lucHV0cyA+IiR0bXAvb3V0MSIKKyMgU2Vjb25kIG9uZSBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQxIiA+IiR0bXAvb3V0MiIKKyMgVGhpcmQgb25lIHdpbGwgYmU6CSBzZWQgLWYgZGVmaW5lcy5zZWQgIiR0bXAvb3V0MiIgPiIkdG1wL291dDEiCisjIGV0IGNldGVyYS4KK2FjX2luPSckYWNfZmlsZV9pbnB1dHMnCithY19vdXQ9JyIkdG1wL291dDEiJworYWNfbnh0PSciJHRtcC9vdXQyIicKKword2hpbGUgOgogZG8KLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvICR0bXAvZGVmaW5lcy5zZWQuCi0gIGVjaG8gJyAgY2F0ID4kdG1wL2RlZmluZXMuc2VkIDw8Q0VPRicgPj4kQ09ORklHX1NUQVRVUwotICAjIFNwZWVkIHVwOiBkb24ndCBjb25zaWRlciB0aGUgbm9uIGAjZGVmaW5lJyBsaW5lcy4KLSAgZWNobyAnL15bCSBdKiNbCSBdKmRlZmluZS8hYicgPj4kQ09ORklHX1NUQVRVUwotICAjIFdvcmsgYXJvdW5kIHRoZSBmb3JnZXQtdG8tcmVzZXQtdGhlLWZsYWcgYnVnLgotICBlY2hvICd0IGNscicgPj4kQ09ORklHX1NUQVRVUwotICBlY2hvICc6IGNscicgPj4kQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LmRlZmluZXMgPj4kQ09ORklHX1NUQVRVUworICAjIFdyaXRlIGEgaGVyZSBkb2N1bWVudDoKKyAgICBlY2hvICcgICAgIyBGaXJzdCwgY2hlY2sgdGhlIGZvcm1hdCBvZiB0aGUgbGluZToKKyAgICBjYXQgPiIkdG1wL2RlZmluZXMuc2VkIiA8PENFT0YKKy9eWwkgXSojWwkgXSp1bmRlZlsJIF1bCSBdKiRhY193b3JkX3JlZ2V4cFsJIF0qJC9iIGRlZgorL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKiRhY193b3JkX3JlZ2V4cFsoCSBdL2IgZGVmCitiCis6ZGVmJyA+PiRDT05GSUdfU1RBVFVTCisgIHNlZCAke2FjX21heF9zZWRfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKICAgZWNobyAnQ0VPRgotICBzZWQgLWYgJHRtcC9kZWZpbmVzLnNlZCAkdG1wL2luID4kdG1wL291dAotICBybSAtZiAkdG1wL2luCi0gIG12ICR0bXAvb3V0ICR0bXAvaW4KLScgPj4kQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAorICAgIHNlZCAtZiAiJHRtcC9kZWZpbmVzLnNlZCInICIkYWNfaW4gPiRhY19vdXQiID4+JENPTkZJR19TVEFUVVMKKyAgYWNfaW49JGFjX291dDsgYWNfb3V0PSRhY19ueHQ7IGFjX254dD0kYWNfaW4KKyAgc2VkIDEsJHthY19tYXhfc2VkX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAorICBncmVwIC4gY29uZnRlc3QudGFpbCA+L2Rldi9udWxsIHx8IGJyZWFrCiAgIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKICAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCiBkb25lCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzCi1lY2hvICcgIGZpICMgZ3JlcCcgPj4kQ09ORklHX1NUQVRVUwotZWNobyA+PiRDT05GSUdfU1RBVFVTCitybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKIAotIyBCcmVhayB1cCBjb25mdGVzdC51bmRlZnMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24gdGhlIHNpemUKLSMgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28gKDEwMCBjbWRzKS4KLWVjaG8gJyAgIyBIYW5kbGUgYWxsIHRoZSAjdW5kZWYgdGVtcGxhdGVzJyA+PiRDT05GSUdfU1RBVFVTCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSBncmVwIC4gY29uZnRlc3QudW5kZWZzID4vZGV2L251bGwKLWRvCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byAkdG1wL3VuZGVmcy5zZWQuCi0gIGVjaG8gJyAgY2F0ID4kdG1wL3VuZGVmcy5zZWQgPDxDRU9GJyA+PiRDT05GSUdfU1RBVFVTCi0gICMgU3BlZWQgdXA6IGRvbid0IGNvbnNpZGVyIHRoZSBub24gYCN1bmRlZicKLSAgZWNobyAnL15bCSBdKiNbCSBdKnVuZGVmLyFiJyA+PiRDT05GSUdfU1RBVFVTCi0gICMgV29yayBhcm91bmQgdGhlIGZvcmdldC10by1yZXNldC10aGUtZmxhZyBidWcuCi0gIGVjaG8gJ3QgY2xyJyA+PiRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJzogY2xyJyA+PiRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudW5kZWZzID4+JENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgJHRtcC91bmRlZnMuc2VkICR0bXAvaW4gPiR0bXAvb3V0Ci0gIHJtIC1mICR0bXAvaW4KLSAgbXYgJHRtcC9vdXQgJHRtcC9pbgotJyA+PiRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC51bmRlZnMgPmNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudW5kZWZzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudW5kZWZzCi1kb25lCi1ybSAtZiBjb25mdGVzdC51bmRlZnMKLQorZWNobyAiYWNfcmVzdWx0PSRhY19pbiIgPj4kQ09ORklHX1NUQVRVUwogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0gICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Ci0gICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKLSAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KLSAgaWYgdGVzdCB4IiRhY19maWxlIiA9IHgtOyB0aGVuCi0gICAgZWNobyAiLyogR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovIiA+JHRtcC9jb25maWcuaAotICBlbHNlCi0gICAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiAgKi8iID4kdG1wL2NvbmZpZy5oCi0gIGZpCi0gIGNhdCAkdG1wL2luID4+JHRtcC9jb25maWcuaAotICBybSAtZiAkdG1wL2luCiAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICBpZiBkaWZmICRhY19maWxlICR0bXAvY29uZmlnLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iID4iJHRtcC9jb25maWcuaCIKKyAgICBjYXQgIiRhY19yZXN1bHQiID4+IiR0bXAvY29uZmlnLmgiCisgICAgaWYgZGlmZiAkYWNfZmlsZSAiJHRtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNQogZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CiAgICAgZWxzZQotICAgICAgYWNfZGlyPWAoZGlybmFtZSAiJGFjX2ZpbGUiKSAyPi9kZXYvbnVsbCB8fAotJGFzX2V4cHIgWCIkYWNfZmlsZSIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkYWNfZmlsZSIgOiAnWFwoL1wpJyBcfCBcCi0JIC4gICAgIDogJ1woLlwpJyAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiRhY19maWxlIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQotICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQotICAJICBzLy4qLy4vOyBxJ2AKLSAgICAgIHsgaWYgJGFzX21rZGlyX3A7IHRoZW4KLSAgICBta2RpciAtcCAiJGFjX2RpciIKLSAgZWxzZQotICAgIGFzX2Rpcj0iJGFjX2RpciIKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIHRlc3QgISAtZCAiJGFzX2RpciI7IGRvCi0gICAgICBhc19kaXJzPSIkYXNfZGlyICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAoZGlybmFtZSAiJGFzX2RpciIpIDI+L2Rldi9udWxsIHx8Ci0kYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgXAotCSAuICAgICA6ICdcKC5cKScgMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYXNfZGlyIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cL1wpW14vXS4qL3sgcy8vXDEvOyBxOyB9Ci0gIAkgIC9eWFwoXC9cL1wpJC97IHMvL1wxLzsgcTsgfQotICAJICAvXlhcKFwvXCkuKi97IHMvL1wxLzsgcTsgfQotICAJICBzLy4qLy4vOyBxJ2AKLSAgICBkb25lCi0gICAgdGVzdCAhIC1uICIkYXNfZGlycyIgfHwgbWtkaXIgJGFzX2RpcnMKLSAgZmkgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgXCIkYWNfZGlyXCIiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KLQogICAgICAgcm0gLWYgJGFjX2ZpbGUKLSAgICAgIG12ICR0bXAvY29uZmlnLmggJGFjX2ZpbGUKKyAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAkYWNfZmlsZQogICAgIGZpCiAgIGVsc2UKLSAgICBjYXQgJHRtcC9jb25maWcuaAotICAgIHJtIC1mICR0bXAvY29uZmlnLmgKKyAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIKKyAgICBjYXQgIiRhY19yZXN1bHQiCiAgIGZpCi1kb25lCi1fQUNFT0YKKyAgcm0gLWYgIiR0bXAvb3V0MTIiCisgOzsKIAotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisKKyAgZXNhYworCitkb25lICMgZm9yIGFjX3RhZworCiAKIHsgKGV4aXQgMCk7IGV4aXQgMDsgfQogX0FDRU9GCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggN2EzYTM3Zi4uMjMyMDc1ZCAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtNjAsNiArNjAsMjkgQEAKIEFDX1NVQlNUKENPTkZJR19BUkdTKQogQ09ORklHX0FSR1M9IiRhY19jb25maWd1cmVfYXJncyIKIAorQUNfQVJHX0VOQUJMRSh1bml2ZXJzYWxzZGssCisJQUNfSEVMUF9TVFJJTkcoLS1lbmFibGUtdW5pdmVyc2Fsc2RrQDw6QFNES0RJUkA6PkAsIEJ1aWxkIGFnYWlucyBNYWMgT1MgWCAxMC40dSBTREsgKHBwYy9pMzg2KSksCitbCisJY2FzZSAkZW5hYmxldmFsIGluCisJeWVzKQorCQllbmFibGV2YWw9L0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkaworCQk7OworCWVzYWMKKwljYXNlICRlbmFibGV2YWwgaW4KKwlubykKKwkJVU5JVkVSU0FMU0RLPQorCQllbmFibGVfdW5pdmVyc2Fsc2RrPQorCQk7OworCSopCisJCVVOSVZFUlNBTFNESz0kZW5hYmxldmFsCisJCTs7CisJZXNhYworXSxbCisgICAJVU5JVkVSU0FMU0RLPQorCWVuYWJsZV91bml2ZXJzYWxzZGs9CitdKQorQUNfU1VCU1QoVU5JVkVSU0FMU0RLKQorCiBkbmwgcXVhZHJpZ3JhcGhzICJAPDpAIiBhbmQgIkA6PkAiIHByb2R1Y2UgIlsiIGFuZCAiXSIgaW4gdGhlIG91dHB1dAogQUNfQVJHX0VOQUJMRShmcmFtZXdvcmssCiAgICAgICAgICAgICAgIEFDX0hFTFBfU1RSSU5HKC0tZW5hYmxlLWZyYW1ld29ya0A8OkA9SU5TVEFMTERJUkA6PkAsIEJ1aWxkIChNYWNPU1h8RGFyd2luKSBmcmFtZXdvcmspLApAQCAtNzQsNiArOTcsOCBAQAogCQlQWVRIT05GUkFNRVdPUktESVI9bm8tZnJhbWV3b3JrCiAJCVBZVEhPTkZSQU1FV09SS1BSRUZJWD0KIAkJUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUj0KKwkJRlJBTUVXT1JLSU5TVEFMTEZJUlNUPQorCQlGUkFNRVdPUktJTlNUQUxMTEFTVD0KIAkJZW5hYmxlX2ZyYW1ld29yaz0KIAkJOzsKIAkqKQpAQCAtODEsMTkgKzEwNiwzMSBAQAogCQlQWVRIT05GUkFNRVdPUktESVI9UHl0aG9uLmZyYW1ld29yawogCQlQWVRIT05GUkFNRVdPUktQUkVGSVg9JGVuYWJsZXZhbAogCQlQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSPSRQWVRIT05GUkFNRVdPUktQUkVGSVgvJFBZVEhPTkZSQU1FV09SS0RJUgorCQlGUkFNRVdPUktJTlNUQUxMRklSU1Q9ImZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmUiCisJCUZSQU1FV09SS0lOU1RBTExMQVNUPSJmcmFtZXdvcmtpbnN0YWxsbWFjbGliIGZyYW1ld29ya2luc3RhbGxhcHBzIGZyYW1ld29ya2luc3RhbGx1bml4dG9vbHMiCiAJCXByZWZpeD0kUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUi9WZXJzaW9ucy8kVkVSU0lPTgorCisJCSMgQWRkIG1ha2VmaWxlcyBmb3IgTWFjIHNwZWNpZmljIGNvZGUgdG8gdGhlIGxpc3Qgb2Ygb3V0cHV0CisJCSMgZmlsZXM6CisJCUFDX0NPTkZJR19GSUxFUyhNYWMvT1NYL01ha2VmaWxlKQorCQlBQ19DT05GSUdfRklMRVMoTWFjL09TWC9QeXRob25MYXVuY2hlci9NYWtlZmlsZSkKKwkJQUNfQ09ORklHX0ZJTEVTKE1hYy9PU1gvSURMRS9NYWtlZmlsZSkKIAllc2FjCiAJXSxbCiAJUFlUSE9ORlJBTUVXT1JLPQogCVBZVEhPTkZSQU1FV09SS0RJUj1uby1mcmFtZXdvcmsKIAlQWVRIT05GUkFNRVdPUktQUkVGSVg9CiAJUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUj0KKwlGUkFNRVdPUktJTlNUQUxMRklSU1Q9CisJRlJBTUVXT1JLSU5TVEFMTExBU1Q9CiAJZW5hYmxlX2ZyYW1ld29yaz0KIF0pCiBBQ19TVUJTVChQWVRIT05GUkFNRVdPUkspCiBBQ19TVUJTVChQWVRIT05GUkFNRVdPUktESVIpCiBBQ19TVUJTVChQWVRIT05GUkFNRVdPUktQUkVGSVgpCiBBQ19TVUJTVChQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSKQorQUNfU1VCU1QoRlJBTUVXT1JLSU5TVEFMTEZJUlNUKQorQUNfU1VCU1QoRlJBTUVXT1JLSU5TVEFMTExBU1QpCiAKICMjQUNfQVJHX1dJVEgoZHlsZCwKICMjICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoLS13aXRoLWR5bGQsCkBAIC0yNTgsNyArMjk1LDkgQEAKICMgaXQgbWF5IGluZmx1ZW5jZSB0aGUgd2F5IHdlIGNhbiBidWlsZCBleHRlbnNpb25zLCBzbyBkaXN0dXRpbHMKICMgbmVlZHMgdG8gY2hlY2sgaXQKIEFDX1NVQlNUKENPTkZJR1VSRV9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQpCitBQ19TVUJTVChFWFBPUlRfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUKQogQ09ORklHVVJFX01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0KK0VYUE9SVF9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9JyMnCiAKICMgY2hlY2tzIGZvciBhbHRlcm5hdGl2ZSBwcm9ncmFtcwogCkBAIC01ODAsNyArNjE5LDE0IEBACiAJICBJTlNUU09OQU1FPSIkTERMSUJSQVJZIi4kU09WRVJTSU9OCiAJICA7OwogICAgIGhwKnxIUCopCi0JICBMRExJQlJBUlk9J2xpYnB5dGhvbiQoVkVSU0lPTikuc2wnCisJICBjYXNlIGB1bmFtZSAtbWAgaW4KKwkJaWE2NCkKKwkJCUxETElCUkFSWT0nbGlicHl0aG9uJChWRVJTSU9OKS5zbycKKwkJCTs7CisJCSopCisJCQlMRExJQlJBUlk9J2xpYnB5dGhvbiQoVkVSU0lPTikuc2wnCisJCQk7OworCSAgZXNhYwogCSAgQkxETElCUkFSWT0nLVdsLCtiLCQoTElCRElSKSAtTC4gLWxweXRob24kKFZFUlNJT04pJwogCSAgUlVOU0hBUkVEPVNITElCX1BBVEg9YHB3ZGA6JHtTSExJQl9QQVRIfQogCSAgOzsKQEAgLTc0MCw2ICs3ODYsMTAgQEAKIAkjIGlzIHRoZXJlIGFueSBvdGhlciBjb21waWxlciBvbiBEYXJ3aW4gYmVzaWRlcyBnY2M/CiAJRGFyd2luKikKIAkgICAgQkFTRUNGTEFHUz0iJEJBU0VDRkxBR1MgLVduby1sb25nLWRvdWJsZSAtbm8tY3BwLXByZWNvbXAgLW1uby1mdXNlZC1tYWRkIgorCSAgICBpZiB0ZXN0ICIke2VuYWJsZV91bml2ZXJzYWxzZGt9IjsgdGhlbgorCQlCQVNFQ0ZMQUdTPSItYXJjaCBwcGMgLWFyY2ggaTM4NiAtaXN5c3Jvb3QgJHtVTklWRVJTQUxTREt9ICR7QkFTRUNGTEFHU30iCisJICAgIGZpCisKIAkgICAgOzsKIAlPU0YqKQogCSAgICBCQVNFQ0ZMQUdTPSIkQkFTRUNGTEFHUyAtbWllZWUiCkBAIC05OTgsOCArMTA0OCw4IEBACiB1bmlzdGQuaCB1dGltZS5oIFwKIHN5cy9hdWRpb2lvLmggc3lzL2JzZHR0eS5oIHN5cy9maWxlLmggc3lzL2xvYWRhdmcuaCBzeXMvbG9jay5oIHN5cy9ta2Rldi5oIFwKIHN5cy9tb2RlbS5oIFwKLXN5cy9wYXJhbS5oIHN5cy9wb2xsLmggc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaCBzeXMvdGltZS5oIHN5cy90aW1lcy5oIFwKLXN5cy91bi5oIHN5cy91dHNuYW1lLmggc3lzL3dhaXQuaCBwdHkuaCBsaWJ1dGlsLmggXAorc3lzL3BhcmFtLmggc3lzL3BvbGwuaCBzeXMvc2VsZWN0Lmggc3lzL3NvY2tldC5oIHN5cy9zdGF0dmZzLmggc3lzL3RpbWUuaCBcCitzeXMvdGltZXMuaCBzeXMvdW4uaCBzeXMvdXRzbmFtZS5oIHN5cy93YWl0LmggcHR5LmggbGlidXRpbC5oIFwKIHN5cy9yZXNvdXJjZS5oIG5ldHBhY2tldC9wYWNrZXQuaCBzeXNleGl0cy5oIGJsdWV0b290aC5oIFwKIGJsdWV0b290aC9ibHVldG9vdGguaCkKIEFDX0hFQURFUl9ESVJFTlQKQEAgLTEyNjMsNyArMTMxMywxMiBAQAogQUNfU1VCU1QoTElCVE9PTF9DUlVGVCkKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCiAgIERhcndpbi9APDpAMDE1NjdAOj5AXC4uKikgCi0gICAgTElCVE9PTF9DUlVGVD0iLWZyYW1ld29yayBTeXN0ZW0gLWxjY19keW5hbWljIC1hcmNoX29ubHkgYGFyY2hgIgorICAgIExJQlRPT0xfQ1JVRlQ9Ii1mcmFtZXdvcmsgU3lzdGVtIC1sY2NfZHluYW1pYyIKKyAgICBpZiB0ZXN0ICIke2VuYWJsZV91bml2ZXJzYWxzZGt9IjsgdGhlbgorCSAgICA6CisgICAgZWxzZQorCUxJQlRPT0xfQ1JVRlQ9IiR7TElCVE9PTF9DUlVGVH0gLWFyY2hfb25seSBgYXJjaGAiCisgICAgZmkKICAgICBMSUJUT09MX0NSVUZUPSRMSUJUT09MX0NSVUZUJyAtaW5zdGFsbF9uYW1lICQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvVmVyc2lvbnMvJChWRVJTSU9OKS8kKFBZVEhPTkZSQU1FV09SSyknCiAgICAgTElCVE9PTF9DUlVGVD0kTElCVE9PTF9DUlVGVCcgLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkKFZFUlNJT04pIC1jdXJyZW50X3ZlcnNpb24gJChWRVJTSU9OKSc7OwogICBEYXJ3aW4vKikKQEAgLTEzMTksNyArMTM3NCwxMiBAQAogaWYgdGVzdCAteiAiJFNPIgogdGhlbgogCWNhc2UgJGFjX3N5c19zeXN0ZW0gaW4KLQlocCp8SFAqKSAgIFNPPS5zbDs7CisJaHAqfEhQKikKKwkJY2FzZSBgdW5hbWUgLW1gIGluCisJCQlpYTY0KSBTTz0uc287OworCSAgCQkqKSAgICBTTz0uc2w7OworCQllc2FjCisJCTs7CiAJQ1lHV0lOKikgICBTTz0uZGxsOzsKIAkqKQkgICBTTz0uc287OwogCWVzYWMKQEAgLTEzMzYsNiArMTM5Niw3IEBACiAJc2xlZXAgMTAKIGZpCiBBQ19NU0dfUkVTVUxUKCRTTykKK0FDX0RFRklORV9VTlFVT1RFRChTSExJQl9FWFQsICIkU08iLCBbRGVmaW5lIHRoaXMgdG8gYmUgZXh0ZW5zaW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMgKGluY2x1ZGluZyB0aGUgZG90ISkuXSkKICMgTERTSEFSRUQgaXMgdGhlIGxkICpjb21tYW5kKiB1c2VkIHRvIGNyZWF0ZSBzaGFyZWQgbGlicmFyeQogIyAtLSAiY2MgLUciIG9uIFN1bk9TIDUueCwgImxkIC1zaGFyZWQiIG9uIElSSVggNQogIyAoU2hhcmVkIGxpYnJhcmllcyBpbiB0aGlzIGluc3RhbmNlIGFyZSBzaGFyZWQgbW9kdWxlcyB0byBiZSBsb2FkZWQgaW50bwpAQCAtMTM4Niw5ICsxNDQ3LDE2IEBACiAJCSMgVXNlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAgd2hlbmV2ZXIgcG9zc2libGUgKDEwLjMgYW5kIGxhdGVyKS4KIAkJIyBUaGlzIGFsbG93cyBhbiBleHRlbnNpb24gdG8gYmUgdXNlZCBpbiBhbnkgUHl0aG9uCiAJCWN1cl90YXJnZXQ9YHN3X3ZlcnMgLXByb2R1Y3RWZXJzaW9uIHwgc2VkICdzL1woMTBcLltbMC05XV0qXCkuKi9cMS8nYAorCQlpZiB0ZXN0ICR7Y3VyX3RhcmdldH0gJz4nIDEwLjI7IHRoZW4KKwkJCWN1cl90YXJnZXQ9MTAuMworCQlmaQogCQlDT05GSUdVUkVfTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPSR7TUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULSR7Y3VyX3RhcmdldH19CisJCUVYUE9SVF9NQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9JycKIAkJaWYgdGVzdCAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0ke2N1cl90YXJnZXR9fSAnPicgMTAuMgogCQl0aGVuCisJCQlpZiB0ZXN0ICIke2VuYWJsZV91bml2ZXJzYWxzZGt9IjsgdGhlbgorCQkJCUxERkxBR1M9Ii1hcmNoIGkzODYgLWFyY2ggcHBjIC1pc3lzcm9vdCAke1VOSVZFUlNBTFNES30gJHtMREZMQUdTfSIKKwkJCWZpCiAJCQlMRFNIQVJFRD0nJChDQykgJChMREZMQUdTKSAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAnCiAJCQlCTERTSEFSRUQ9IiRMRFNIQVJFRCIKIAkJZWxzZQpAQCAtMjg3Myw2ICsyOTQxLDIzIEBACiAKICMgY2hlY2sgZm9yIGVuZGlhbm5lc3MKIEFDX0NfQklHRU5ESUFOCitBSF9WRVJCQVRJTShbV09SRFNfQklHRU5ESUFOXSwKK1sKKyAvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIHByb2Nlc3NvciBzdG9yZXMgd29yZHMgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlCisgICAgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuIAorCisgICAgVGhlIGJsb2NrIGJlbG93IGRvZXMgY29tcGlsZS10aW1lIGNoZWNraW5nIGZvciBlbmRpYW5uZXNzIG9uIHBsYXRmb3JtcworICAgIHRoYXQgdXNlIEdDQyBhbmQgdGhlcmVmb3JlIGFsbG93cyBjb21waWxpbmcgZmF0IGJpbmFyaWVzIG9uIE9TWCBieSB1c2luZyAKKyAgICAnLWFyY2ggcHBjIC1hcmNoIGkzODYnIGFzIHRoZSBjb21waWxlIGZsYWdzLiBUaGUgcGhyYXNpbmcgd2FzIGNob29zZW4KKyAgICBzdWNoIHRoYXQgdGhlIGNvbmZpZ3VyZS1yZXN1bHQgaXMgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgdXNlIEdDQy4KKyAgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fXworI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorI2Vsc2UKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOX18KKyN1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyNlbmRpZgorI2VuZGlmXSkKIAogIyBDaGVjayB3aGV0aGVyIHJpZ2h0IHNoaWZ0aW5nIGEgbmVnYXRpdmUgaW50ZWdlciBleHRlbmRzIHRoZSBzaWduIGJpdAogIyBvciBmaWxscyB3aXRoIHplcm9zIChsaWtlIHRoZSBDcmF5IEo5MCwgYWNjb3JkaW5nIHRvIFRpbSBQZXRlcnMpLgpAQCAtMzE4OSw2ICszMjc0LDI3IEBACiAgIEFDX01TR19SRVNVTFQobm8pCiBmaQogCitBQ19NU0dfQ0hFQ0tJTkcoZm9yICV6ZCBwcmludGYoKSBmb3JtYXQgc3VwcG9ydCkKK0FDX1RSWV9SVU4oWyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitpbnQgbWFpbigpCit7CisgICAgY2hhciBidWZmZXJbNF07CisKKyAgICBpZihzcHJpbnRmKGJ1ZmZlciwgIiV6ZCIsIChzaXplX3QpMTIzKSA8IDApCisgICAgICAgCXJldHVybiAxOworCisgICAgaWYgKHN0cm5jbXAoYnVmZmVyLCAiMTIzIiwgMykpCisJcmV0dXJuIDE7CisgICAgCisgICAgcmV0dXJuIDA7Cit9XSwKK1tBQ19NU0dfUkVTVUxUKHllcykKKyBBQ19ERUZJTkUoUFlfRk9STUFUX1NJWkVfVCwgInoiLCBbRGVmaW5lIHRvIHByaW50ZiBmb3JtYXQgbW9kaWZpZXIgZm9yIFB5X3NzaXplX3RdKV0sCisgQUNfTVNHX1JFU1VMVChubykpCisKIEFDX0NIRUNLX1RZUEUoc29ja2xlbl90LCwKICAgQUNfREVGSU5FKHNvY2tsZW5fdCxpbnQsCiAgICAgICAgICAgICBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy9zb2NrZXQuaD4gZG9lcyBub3QgZGVmaW5lLiksWwpkaWZmIC0tZ2l0IGEvcHljb25maWcuaC5pbiBiL3B5Y29uZmlnLmguaW4KaW5kZXggOGRmN2Y5Yi4uMTQ2OGJmNiAxMDA2NDQKLS0tIGEvcHljb25maWcuaC5pbgorKysgYi9weWNvbmZpZy5oLmluCkBAIC01NzksNiArNTc5LDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX1NZU19TT0NLRVRfSAogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0dmZzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRWRlNfSAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAogCkBAIC03MjcsNiArNzMwLDkgQEAKIC8qIERlZmluZWQgaWYgUFRIUkVBRF9TQ09QRV9TWVNURU0gc3VwcG9ydGVkLiAqLwogI3VuZGVmIFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRAogCisvKiBEZWZpbmUgdG8gcHJpbnRmIGZvcm1hdCBtb2RpZmllciBmb3IgUHlfc3NpemVfdCAqLworI3VuZGVmIFBZX0ZPUk1BVF9TSVpFX1QKKwogLyogRGVmaW5lIGFzIHRoZSBpbnRlZ3JhbCB0eXBlIHVzZWQgZm9yIFVuaWNvZGUgcmVwcmVzZW50YXRpb24uICovCiAjdW5kZWYgUFlfVU5JQ09ERV9UWVBFCiAKQEAgLTc0OCw2ICs3NTQsOSBAQAogLyogRGVmaW5lIGlmIHNldHBncnAoKSBtdXN0IGJlIGNhbGxlZCBhcyBzZXRwZ3JwKDAsIDApLiAqLwogI3VuZGVmIFNFVFBHUlBfSEFWRV9BUkcKIAorLyogRGVmaW5lIHRoaXMgdG8gYmUgZXh0ZW5zaW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMgKGluY2x1ZGluZyB0aGUgZG90ISkuICovCisjdW5kZWYgU0hMSUJfRVhUCisKIC8qIERlZmluZSBpZiBpPj5qIGZvciBzaWduZWQgaW50IGkgZG9lcyBub3QgZXh0ZW5kIHRoZSBzaWduIGJpdCB3aGVuIGkgPCAwICovCiAjdW5kZWYgU0lHTkVEX1JJR0hUX1NISUZUX1pFUk9fRklMTFMKIApAQCAtODQ2LDkgKzg1NSwyMiBAQAogLyogRGVmaW5lIHRvIHByb2ZpbGUgd2l0aCB0aGUgUGVudGl1bSB0aW1lc3RhbXAgY291bnRlciAqLwogI3VuZGVmIFdJVEhfVFNDCiAKLS8qIERlZmluZSB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUKLSAgIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsIGFuZCBWQVgpLiAqLworCisgLyogRGVmaW5lIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQorICAgIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsIGFuZCBWQVgpLiAKKworICAgIFRoZSBibG9jayBiZWxvdyBkb2VzIGNvbXBpbGUtdGltZSBjaGVja2luZyBmb3IgZW5kaWFubmVzcyBvbiBwbGF0Zm9ybXMKKyAgICB0aGF0IHVzZSBHQ0MgYW5kIHRoZXJlZm9yZSBhbGxvd3MgY29tcGlsaW5nIGZhdCBiaW5hcmllcyBvbiBPU1ggYnkgdXNpbmcgCisgICAgJy1hcmNoIHBwYyAtYXJjaCBpMzg2JyBhcyB0aGUgY29tcGlsZSBmbGFncy4gVGhlIHBocmFzaW5nIHdhcyBjaG9vc2VuCisgICAgc3VjaCB0aGF0IHRoZSBjb25maWd1cmUtcmVzdWx0IGlzIHVzZWQgb24gc3lzdGVtcyB0aGF0IGRvbid0IHVzZSBHQ0MuCisgICovCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyNlbHNlCisjaWZuZGVmIF9fTElUVExFX0VORElBTl9fCiAjdW5kZWYgV09SRFNfQklHRU5ESUFOCisjZW5kaWYKKyNlbmRpZgogCiAvKiBEZWZpbmUgdG8gMSBpZiBvbiBBSVggMy4KICAgIFN5c3RlbSBoZWFkZXJzIHNvbWV0aW1lcyBkZWZpbmUgdGhpcy4KZGlmZiAtLWdpdCBhL3NldHVwLnB5IGIvc2V0dXAucHkKaW5kZXggNjFjMWZlYy4uMGFiYWZkOSAxMDA2NDQKLS0tIGEvc2V0dXAucHkKKysrIGIvc2V0dXAucHkKQEAgLTMxNyw2ICszMTcsMjMgQEAKICAgICAgICAgaWYgcGxhdGZvcm0gaW4gWydvc2YxJywgJ3VuaXh3YXJlNycsICdvcGVudW5peDgnXToKICAgICAgICAgICAgIGxpYl9kaXJzICs9IFsnL3Vzci9jY3MvbGliJ10KIAorICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICMgVGhpcyBzaG91bGQgd29yayBvbiBhbnkgdW5peHkgcGxhdGZvcm0gOy0pCisgICAgICAgICAgICAjIElmIHRoZSB1c2VyIGhhcyBib3RoZXJlZCBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgLUkgYW5kIC1MIGZsYWdzCisgICAgICAgICAgICAjIGluIE9QVCBhbmQgTERGTEFHUyB3ZSBtaWdodCBhcyB3ZWxsIHVzZSB0aGVtIGhlcmUuCisgICAgICAgICAgICAjICAgTk9URTogdXNpbmcgc2hsZXguc3BsaXQgd291bGQgdGVjaG5pY2FsbHkgYmUgbW9yZSBjb3JyZWN0LCBidXQKKyAgICAgICAgICAgICMgYWxzbyBnaXZlcyBhIGJvb3RzdHJhcCBwcm9ibGVtLiBMZXQncyBob3BlIG5vYm9keSB1c2VzIGRpcmVjdG9yaWVzCisgICAgICAgICAgICAjIHdpdGggd2hpdGVzcGFjZSBpbiB0aGUgbmFtZSB0byBzdG9yZSBsaWJyYXJpZXMuCisgICAgICAgICAgICBjZmxhZ3MsIGxkZmxhZ3MgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKAorICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTJywgJ0xERkxBR1MnKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gY2ZsYWdzLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgaWYgaXRlbS5zdGFydHN3aXRoKCctSScpOgorICAgICAgICAgICAgICAgICAgICBpbmNfZGlycy5hcHBlbmQoaXRlbVsyOl0pCisKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGxkZmxhZ3Muc3BsaXQoKToKKyAgICAgICAgICAgICAgICBpZiBpdGVtLnN0YXJ0c3dpdGgoJy1MJyk6CisgICAgICAgICAgICAgICAgICAgIGxpYl9kaXJzLmFwcGVuZChpdGVtWzI6XSkKKwogICAgICAgICAjIENoZWNrIGZvciBNYWNPUyBYLCB3aGljaCBkb2Vzbid0IG5lZWQgbGlibS5hIGF0IGFsbAogICAgICAgICBtYXRoX2xpYnMgPSBbJ20nXQogICAgICAgICBpZiBwbGF0Zm9ybSBpbiBbJ2RhcndpbicsICdiZW9zJywgJ21hYyddOgpAQCAtNDU5LDYgKzQ3NiwxNiBAQAogICAgICAgICAgICAgaWYgZmluZF9maWxlKCdyZWFkbGluZS9ybGNvbmYuaCcsIGluY19kaXJzLCBbXSkgaXMgTm9uZToKICAgICAgICAgICAgICAgICBkb19yZWFkbGluZSA9IEZhbHNlCiAgICAgICAgIGlmIGRvX3JlYWRsaW5lOgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgICMgSW4gZXZlcnkgZGlyZWN0b3J5IG9uIHRoZSBzZWFyY2ggcGF0aCBzZWFyY2ggZm9yIGEgZHluYW1pYworICAgICAgICAgICAgICAgICMgbGlicmFyeSBhbmQgdGhlbiBhIHN0YXRpYyBsaWJyYXJ5LCBpbnN0ZWFkIG9mIGZpcnN0IGxvb2tpbmcKKyAgICAgICAgICAgICAgICAjIGZvciBkeW5hbWljIGxpYnJhcmllcyBvbiB0aGUgZW50aXJ5IHBhdGguCisgICAgICAgICAgICAgICAgIyBUaGlzIHdheSBhIHN0YXRpY2x5IGxpbmtlZCBjdXN0b20gcmVhZGxpbmUgZ2V0cyBwaWNrZWQgdXAKKyAgICAgICAgICAgICAgICAjIGJlZm9yZSB0aGUgKGJyb2tlbikgZHluYW1pYyBsaWJyYXJ5IGluIC91c3IvbGliLgorICAgICAgICAgICAgICAgIHJlYWRsaW5lX2V4dHJhX2xpbmtfYXJncyA9ICgnLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QnLCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVhZGxpbmVfZXh0cmFfbGlua19hcmdzID0gKCkKKwogICAgICAgICAgICAgcmVhZGxpbmVfbGlicyA9IFsncmVhZGxpbmUnXQogICAgICAgICAgICAgaWYgc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmN1cnNlc3cnKToKQEAgLTQ3NCw2ICs1MDEsNyBAQAogICAgICAgICAgICAgICAgIHJlYWRsaW5lX2xpYnMuYXBwZW5kKCd0ZXJtY2FwJykKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ3JlYWRsaW5lJywgWydyZWFkbGluZS5jJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1bJy91c3IvbGliL3Rlcm1jYXAnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPXJlYWRsaW5lX2V4dHJhX2xpbmtfYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPXJlYWRsaW5lX2xpYnMpICkKICAgICAgICAgaWYgcGxhdGZvcm0gbm90IGluIFsnbWFjJ106CiAgICAgICAgICAgICAjIGNyeXB0IG1vZHVsZS4KQEAgLTcwOCw3ICs3MzYsMTEgQEAKICAgICAgICAgTUlOX1NRTElURV9WRVJTSU9OX05VTUJFUiA9ICgzLCAwLCA4KQogICAgICAgICBNSU5fU1FMSVRFX1ZFUlNJT04gPSAiLiIuam9pbihbc3RyKHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiBNSU5fU1FMSVRFX1ZFUlNJT05fTlVNQkVSXSkKLSAgICAgICAgZm9yIGQgaW4gc3FsaXRlX2luY19wYXRocyArIGluY19kaXJzOgorCisgICAgICAgICMgU2NhbiB0aGUgZGVmYXVsdCBpbmNsdWRlIGRpcmVjdG9yaWVzIGJlZm9yZSB0aGUgU1FMaXRlIHNwZWNpZmljCisgICAgICAgICMgb25lcy4gVGhpcyBhbGxvd3Mgb25lIHRvIG92ZXJyaWRlIHRoZSBjb3B5IG9mIHNxbGl0ZSBvbiBPU1gsCisgICAgICAgICMgd2hlcmUgL3Vzci9pbmNsdWRlIGNvbnRhaW5zIGFuIG9sZCB2ZXJzaW9uIG9mIHNxbGl0ZS4KKyAgICAgICAgZm9yIGQgaW4gaW5jX2RpcnMgKyBzcWxpdGVfaW5jX3BhdGhzOgogICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihkLCAic3FsaXRlMy5oIikKICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGYpOgogICAgICAgICAgICAgICAgIGlmIHNxbGl0ZV9zZXR1cF9kZWJ1ZzogcHJpbnQgInNxbGl0ZTogZm91bmQgJXMiJWYKQEAgLTc0MywxMCArNzc1LDggQEAKICAgICAgICAgICAgIHNxbGl0ZV9saWJkaXIgPSBbb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzcWxpdGVfbGliZmlsZSkpXQogCiAgICAgICAgIGlmIHNxbGl0ZV9pbmNkaXIgYW5kIHNxbGl0ZV9saWJkaXI6Ci0gICAgICAgICAgICBzcWxpdGVfc3JjcyA9IFsnX3NxbGl0ZS9hZGFwdGVycy5jJywKLSAgICAgICAgICAgICAgICAnX3NxbGl0ZS9jYWNoZS5jJywKKyAgICAgICAgICAgIHNxbGl0ZV9zcmNzID0gWydfc3FsaXRlL2NhY2hlLmMnLAogICAgICAgICAgICAgICAgICdfc3FsaXRlL2Nvbm5lY3Rpb24uYycsCi0gICAgICAgICAgICAgICAgJ19zcWxpdGUvY29udmVydGVycy5jJywKICAgICAgICAgICAgICAgICAnX3NxbGl0ZS9jdXJzb3IuYycsCiAgICAgICAgICAgICAgICAgJ19zcWxpdGUvbWljcm9wcm90b2NvbHMuYycsCiAgICAgICAgICAgICAgICAgJ19zcWxpdGUvbW9kdWxlLmMnLApAQCAtNzU1LDE3ICs3ODUsMjIgQEAKICAgICAgICAgICAgICAgICAnX3NxbGl0ZS9zdGF0ZW1lbnQuYycsCiAgICAgICAgICAgICAgICAgJ19zcWxpdGUvdXRpbC5jJywgXQogCi0gICAgICAgICAgICBQWVNRTElURV9WRVJTSU9OID0gIjIuMi4wIgogICAgICAgICAgICAgc3FsaXRlX2RlZmluZXMgPSBbXQogICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJ3aW4zMiI6CiAgICAgICAgICAgICAgICAgc3FsaXRlX2RlZmluZXMuYXBwZW5kKCgnTU9EVUxFX05BTUUnLCAnInNxbGl0ZTMiJykpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNxbGl0ZV9kZWZpbmVzLmFwcGVuZCgoJ01PRFVMRV9OQU1FJywgJ1xcInNxbGl0ZTNcXCInKSkKIAotICAgICAgICAgICAgc3FsaXRlX2RlZmluZXMuYXBwZW5kKCgnUFlfTUFKT1JfVkVSU0lPTicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHN5cy52ZXJzaW9uX2luZm9bMF0pKSkKLSAgICAgICAgICAgIHNxbGl0ZV9kZWZpbmVzLmFwcGVuZCgoJ1BZX01JTk9SX1ZFUlNJT04nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihzeXMudmVyc2lvbl9pbmZvWzFdKSkpCisKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICAgICAjIEluIGV2ZXJ5IGRpcmVjdG9yeSBvbiB0aGUgc2VhcmNoIHBhdGggc2VhcmNoIGZvciBhIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAjIGxpYnJhcnkgYW5kIHRoZW4gYSBzdGF0aWMgbGlicmFyeSwgaW5zdGVhZCBvZiBmaXJzdCBsb29raW5nCisgICAgICAgICAgICAgICAgIyBmb3IgZHluYW1pYyBsaWJyYXJpZXMgb24gdGhlIGVudGlyeSBwYXRoLgorICAgICAgICAgICAgICAgICMgVGhpcyB3YXkgYSBzdGF0aWNseSBsaW5rZWQgY3VzdG9tIHNxbGl0ZSBnZXRzIHBpY2tlZCB1cAorICAgICAgICAgICAgICAgICMgYmVmb3JlIHRoZSBkeW5hbWljIGxpYnJhcnkgaW4gL3Vzci9saWIuCisgICAgICAgICAgICAgICAgc3FsaXRlX2V4dHJhX2xpbmtfYXJncyA9ICgnLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QnLCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3FsaXRlX2V4dHJhX2xpbmtfYXJncyA9ICgpCiAKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKEV4dGVuc2lvbignX3NxbGl0ZTMnLCBzcWxpdGVfc3JjcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVfbWFjcm9zPXNxbGl0ZV9kZWZpbmVzLApAQCAtNzczLDYgKzgwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGVfaW5jZGlyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9c3FsaXRlX2xpYmRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycz1zcWxpdGVfbGliZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1zcWxpdGVfZXh0cmFfbGlua19hcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1bInNxbGl0ZTMiLF0pKQogCiAgICAgICAgICMgTG9vayBmb3IgQmVya2VsZXkgZGIgMS44NS4gICBOb3RlIHRoYXQgaXQgaXMgYnVpbHQgYXMgYSBkaWZmZXJlbnQKQEAgLTkyMSwyMCArOTU3LDExIEBACiAgICAgICAgICMKICAgICAgICAgIyBNb3JlIGluZm9ybWF0aW9uIG9uIEV4cGF0IGNhbiBiZSBmb3VuZCBhdCB3d3cubGliZXhwYXQub3JnLgogICAgICAgICAjCi0gICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6Ci0gICAgICAgICAgICB4bWxibyA9ICIxMjM0IgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgeG1sYm8gPSAiNDMyMSIKICAgICAgICAgZXhwYXRpbmMgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHNyY2RpciwgJ01vZHVsZXMnLCAnZXhwYXQnKQogICAgICAgICBkZWZpbmVfbWFjcm9zID0gWwotICAgICAgICAgICAgKCdYTUxfTlMnLCAnMScpLAotICAgICAgICAgICAgKCdYTUxfRFREJywgJzEnKSwKLSAgICAgICAgICAgICgnQllURU9SREVSJywgeG1sYm8pLAotICAgICAgICAgICAgKCdYTUxfQ09OVEVYVF9CWVRFUycsJzEwMjQnKSwKLSAgICAgICAgICAgIF0KLSAgICAgICAgZm9yIGZlYXR1cmVfbWFjcm8gaW4gWydIQVZFX01FTU1PVkUnLCAnSEFWRV9CQ09QWSddOgotICAgICAgICAgICAgaWYgY29uZmlnX2hfdmFycy5oYXNfa2V5KGZlYXR1cmVfbWFjcm8pOgotICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3MuYXBwZW5kKChmZWF0dXJlX21hY3JvLCAnMScpKQorICAgICAgICAgICAgKCdIQVZFX0VYUEFUX0NPTkZJR19IJywgJzEnKSwKKyAgICAgICAgXQorCiAgICAgICAgIGV4dHMuYXBwZW5kKEV4dGVuc2lvbigncHlleHBhdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVfbWFjcm9zID0gZGVmaW5lX21hY3JvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IFtleHBhdGluY10sCkBAIC0xMjc1LDcgKzEzMDIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMnLCAnbGliZmZpJykpCiAgICAgICAgICAgICBmZmlfY29uZmlnZmlsZSA9IG9zLnBhdGguam9pbihmZmlfYnVpbGRkaXIsICdmZmljb25maWcucHknKQogCi0gICAgICAgICAgICBpZiBzZWxmLmZvcmNlIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhmZmlfY29uZmlnZmlsZSk6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfZ3JvdXAKKworICAgICAgICAgICAgY29uZmlnX3NvdXJjZXMgPSBbb3MucGF0aC5qb2luKGZmaV9zcmNkaXIsIGZuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZuYW1lIGluIG9zLmxpc3RkaXIoZmZpX3NyY2RpcildCisgICAgICAgICAgICBpZiBzZWxmLmZvcmNlIG9yIG5ld2VyX2dyb3VwKGNvbmZpZ19zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZmlfY29uZmlnZmlsZSk6CiAgICAgICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IG1rcGF0aAogICAgICAgICAgICAgICAgIG1rcGF0aChmZmlfYnVpbGRkaXIpCiAgICAgICAgICAgICAgICAgY29uZmlnX2FyZ3MgPSBbXQpAQCAtMTQ1Niw3ICsxNDg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbF9saWInOlB5QnVpbGRJbnN0YWxsTGlifSwKICAgICAgICAgICAjIFRoZSBzdHJ1Y3QgbW9kdWxlIGlzIGRlZmluZWQgaGVyZSwgYmVjYXVzZSBidWlsZF9leHQgd29uJ3QgYmUKICAgICAgICAgICAjIGNhbGxlZCB1bmxlc3MgdGhlcmUncyBhdCBsZWFzdCBvbmUgZXh0ZW5zaW9uIG1vZHVsZSBkZWZpbmVkLgotICAgICAgICAgIGV4dF9tb2R1bGVzPVtFeHRlbnNpb24oJ3N0cnVjdCcsIFsnc3RydWN0bW9kdWxlLmMnXSldLAorICAgICAgICAgIGV4dF9tb2R1bGVzPVtFeHRlbnNpb24oJ19zdHJ1Y3QnLCBbJ19zdHJ1Y3QuYyddKV0sCiAKICAgICAgICAgICAjIFNjcmlwdHMgdG8gaW5zdGFsbAogICAgICAgICAgIHNjcmlwdHMgPSBbJ1Rvb2xzL3NjcmlwdHMvcHlkb2MnLCAnVG9vbHMvc2NyaXB0cy9pZGxlJywK