ZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvTWFrZWZpbGUgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmMmM4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorTU9EVUxFUyA9IFwKKwlzcmMKKworYWxsIGNsZWFuIGRvY3M6CisJZm9yIGRpciBpbiAkKE1PRFVMRVMpOyBkbyBcCisJCShjZCAkJGRpcjsgJHtNQUtFfSAkQCk7IFwKKwlkb25lCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL2luY2x1ZGUvYmxhbmtfYXBwLmhybCBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvaW5jbHVkZS9ibGFua19hcHAuaHJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL2luY2x1ZGUvYmxhbmtfYXBwLmhybApkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvTWFrZWZpbGUgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xM2IwNmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMTIgQEAKKyMgJElkOiBNYWtlZmlsZSx2IDEuMyAyMDA0LzA4LzEzIDE2OjM1OjU5IG1sb2dhbiBFeHAgJAorIworaW5jbHVkZSAuLi8uLi8uLi9idWlsZC9vdHAubWsKK2luY2x1ZGUgLi4vLi4vLi4vYnVpbGQvY29sb3JzLm1rCitpbmNsdWRlIC4uLy4uLy4uL2J1aWxkL2J1aWxkdGFyZ2V0cy5taworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwbGljYXRpb24gdmVyc2lvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2luY2x1ZGUgLi4vdnNuLm1rCitBUFBfTkFNRT0lJUFQUF9OQU1FJSUKK1BGWD0lJVBGWCUlCitWU049JCglJUFQUF9OQU1FX1VQUEVSX0NBU0UlJV9WU04pCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnN0YWxsIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uCisjIFdBUk5JTkc6IElOU1RBTExfRElSIHRoZSBjb21tYW5kIHRvIGluc3RhbGwgYSBkaXJlY3RvcnkuCisjICAgICAgICAgIElOU1RBTExfRFNUIGlzIHRoZSB0YXJnZXQgZGlyZWN0b3J5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOU1RBTExfRFNUID0gJChFUkxBTkdfT1RQKS9saWIvJChBUFBfTkFNRSktJChWU04pCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUYXJnZXQgU3BlY3MKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK01PRFVMRVMgPSAkKHNoZWxsIGxzICouZXJsIHwgc2VkIHMvLmVybC8vKQorTU9EVUxFU19DT01NQSA9ICQoc2hlbGwgbHMgKi5lcmwgfCBzZWQgcy9cXC5lcmwvLC8pCisKK0hSTF9GSUxFUz0KK0lOVEVSTkFMX0hSTF9GSUxFUz0gJChBUFBfTkFNRSkuaHJsCitFUkxfRklMRVM9ICQoTU9EVUxFUzolPSUuZXJsKQorRE9DX0ZJTEVTPSQoRVJMX0ZJTEVTKQorCitBUFBfRklMRT0gJChBUFBfTkFNRSkuYXBwCitBUFBVUF9GSUxFPSAkKEFQUF9OQU1FKS5hcHB1cAorCitBUFBfU1JDPSAkKEFQUF9GSUxFKS5zcmMKK0FQUFVQX1NSQz0gJChBUFBVUF9GSUxFKS5zcmMKKworQVBQX1RBUkdFVD0gJChFQklOKS8kKEFQUF9GSUxFKQorQVBQVVBfVEFSR0VUPSAkKEVCSU4pLyQoQVBQVVBfRklMRSkKKworQkVBTVM9ICQoTU9EVUxFUzolPSQoRUJJTikvJS4kKEVNVUxBVE9SKSkKK1RBUkdFVF9GSUxFUz0gJChCRUFNUykgJChBUFBfVEFSR0VUKSAkKEFQUFVQX1RBUkdFVCkKKworV0VCX1RBUkdFVD0vdmFyL3lhd3Mvd3d3LyQoQVBQX05BTUUpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGTEFHUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VSTF9GTEFHUyArPQorRVJMX0NPTVBJTEVfRkxBR1MgKz0gLUkuLi9pbmNsdWRlIC1JLi4vLi4vZnNsaWIvaW5jbHVkZSAtSS4uLy4uL3N5c3RlbV9zdGF0dXMvaW5jbHVkZSAKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRhcmdldHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbGwgZGVidWcgb3B0OiAkKEVCSU4pICQoVEFSR0VUX0ZJTEVTKSAKKworIyQoRUJJTikvcm1fbG9nZ2VyLmJlYW06ICQoQVBQX05BTUUpLmhybAoraW5jbHVkZSAuLi8uLi8uLi9idWlsZC9kb2NzLm1rCisKKyMgTm90ZTogSW4gdGhlIG9wZW4tc291cmNlIGJ1aWxkIGNsZWFuIG11c3Qgbm90IGRlc3Ryb3kgdGhlIHByZWxvYWRlZAorIyBiZWFtIGZpbGVzLgorY2xlYW46CisJcm0gLWYgJChUQVJHRVRfRklMRVMpCisJcm0gLWYgY29yZQorCXJtIC1yZiAkKEVCSU4pCisJcm0gLXJmICpodG1sCisKKyQoRUJJTik6CisJbWtkaXIgJChFQklOKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU3BlY2lhbCBCdWlsZCBUYXJnZXRzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJChBUFBfVEFSR0VUKTogJChBUFBfU1JDKSAuLi92c24ubWsgJChCRUFNUykKKwlzZWQgLWUgJ3M7JVZTTiU7JChWU04pOycgXAorCQktZSAnczslUEZYJTskKFBGWCk7JyBcCisJCS1lICdzOyVBUFBfTkFNRSU7JChBUFBfTkFNRSk7JyBcCisJCS1lICdzOyVNT0RVTEVTJTslTU9EVUxFUyUkKE1PRFVMRVNfQ09NTUEpOycgXAorCQkkPCA+ICQ8Ii50bXAiIAorCXNlZCAtZSAncy8lTU9EVUxFUyVcKC4qXCksL1wxLycgXAorCQkkPCIudG1wIiA+ICRAIAorCXJtICQ8Ii50bXAiCisKKworJChBUFBVUF9UQVJHRVQpOiAkKEFQUFVQX1NSQykgLi4vdnNuLm1rCisJc2VkIC1lICdzOyVWU04lOyQoVlNOKTsnICQ8ID4gJEAKKworJChXRUJfVEFSR0VUKTogLi4vbWFya3VwLyogCisJcm0gLXJmICQoV0VCX1RBUkdFVCkgCisJbWtkaXIgJChXRUJfVEFSR0VUKSAKKwljcCAtciAuLi9tYXJrdXAvICQoV0VCX1RBUkdFVCkKKwljcCAtciAuLi9za2lucy8gJChXRUJfVEFSR0VUKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW5zdGFsbCBUYXJnZXQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworaW5zdGFsbDogYWxsICQoV0VCX1RBUkdFVCkKKyMJJChJTlNUQUxMX0RJUikgJChJTlNUQUxMX0RTVCkvc3JjCisjCSQoSU5TVEFMTF9EQVRBKSAkKEVSTF9GSUxFUykgJChJTlNUQUxMX0RTVCkvc3JjCisjCSQoSU5TVEFMTF9EQVRBKSAkKElOVEVSTkFMX0hSTF9GSUxFUykgJChJTlNUQUxMX0RTVCkvc3JjCisjCSQoSU5TVEFMTF9ESVIpICQoSU5TVEFMTF9EU1QpL2luY2x1ZGUKKyMJJChJTlNUQUxMX0RBVEEpICQoSFJMX0ZJTEVTKSAkKElOU1RBTExfRFNUKS9pbmNsdWRlCisjCSQoSU5TVEFMTF9ESVIpICQoSU5TVEFMTF9EU1QpL2ViaW4KKyMJJChJTlNUQUxMX0RBVEEpICQoVEFSR0VUX0ZJTEVTKSAkKElOU1RBTExfRFNUKS9lYmluCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9iYV9zZXJ2ZXIuZXJsIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmFfc2VydmVyLmVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTk4ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmFfc2VydmVyLmVybApAQCAtMCwwICsxLDEyNCBAQAorJSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUlIEBkb2MgIAorJSUlIEBlbmQKKyUlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy1tb2R1bGUoJSVQRlglJV9zZXJ2ZXIpLgorCistYmVoYXZpb3VyKGdlbl9zZXJ2ZXIpLgorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgSW5jbHVkZSBmaWxlcworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLWluY2x1ZGUoIiUlQVBQX05BTUUlJS5ocmwiKS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRXh0ZXJuYWwgZXhwb3J0cworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLWV4cG9ydChbCisJIHN0YXJ0X2xpbmsvMCwKKwkgc3RvcC8wCisJIF0pLgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBnZW5fc2VydmVyIGNhbGxiYWNrcworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfY2FsbC8zLCBoYW5kbGVfY2FzdC8yLCBoYW5kbGVfaW5mby8yLCB0ZXJtaW5hdGUvMiwgY29kZV9jaGFuZ2UvM10pLgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSByZWNvcmQgZGVmaW5pdGlvbnMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy1yZWNvcmQoc3RhdGUsIHt9KS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgbWFjcm8gZGVmaW5pdGlvbnMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4KKworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorJSUgRXh0ZXJuYWwgZnVuY3Rpb25zCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBAZG9jIFN0YXJ0cyB0aGUgc2VydmVyLgorJSUgQHNwZWMgc3RhcnRfbGluaygpIC0+IHtvaywgcGlkKCl9IHwge2Vycm9yLCBSZWFzb259CislJSBAZW5kCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGFydF9saW5rKCkgLT4KKyAgICBnZW5fc2VydmVyOnN0YXJ0X2xpbmsoe2xvY2FsLCA/U0VSVkVSfSwgP01PRFVMRSwgW10sIFtdKS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgQGRvYyBTdG9wcyB0aGUgc2VydmVyLgorJSUgQHNwZWMgc3RvcCgpIC0+IG9rCislJSBAZW5kCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdG9wKCkgLT4KKyAgICBnZW5fc2VydmVyOmNhc3QoP1NFUlZFUiwgc3RvcCkuCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIFNlcnZlciBmdW5jdGlvbnMKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGluaXQvMQorJSUgRGVzY3JpcHRpb246IEluaXRpYXRlcyB0aGUgc2VydmVyCislJSBSZXR1cm5zOiB7b2ssIFN0YXRlfSAgICAgICAgICB8CislJSAgICAgICAgICB7b2ssIFN0YXRlLCBUaW1lb3V0fSB8CislJSAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICB8CislJSAgICAgICAgICB7c3RvcCwgUmVhc29ufQorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5pdChbXSkgLT4KKyAgICB7b2ssICNzdGF0ZXt9fS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGhhbmRsZV9jYWxsLzMKKyUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYWxsIG1lc3NhZ2VzCislJSBSZXR1cm5zOiB7cmVwbHksIFJlcGx5LCBTdGF0ZX0gICAgICAgICAgfAorJSUgICAgICAgICAge3JlcGx5LCBSZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKKyUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZX0gICAgICAgICAgICAgICB8CislJSAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9ICAgICAgfAorJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIFN0YXRlfSAgIHwgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkKKyUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4KKyAgICBSZXBseSA9IG9rLAorICAgIHtyZXBseSwgUmVwbHksIFN0YXRlfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGhhbmRsZV9jYXN0LzIKKyUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBjYXN0IG1lc3NhZ2VzCislJSBSZXR1cm5zOiB7bm9yZXBseSwgU3RhdGV9ICAgICAgICAgIHwKKyUlICAgICAgICAgIHtub3JlcGx5LCBTdGF0ZSwgVGltZW91dH0gfAorJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9ICAgICAgICAgICAgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2hhbmRsZV9jYXN0KHN0b3AsIFN0YXRlKSAtPgorICAgIHtzdG9wLCBub3JtYWwsIFN0YXRlfTsKK2hhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0+CisgICAge25vcmVwbHksIFN0YXRlfS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvLzIKKyUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcworJSUgUmV0dXJuczoge25vcmVwbHksIFN0YXRlfSAgICAgICAgICB8CislJSAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwKKyUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZSkgLT4KKyAgICB7bm9yZXBseSwgU3RhdGV9LgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBGdW5jdGlvbjogdGVybWluYXRlLzIKKyUlIERlc2NyaXB0aW9uOiBTaHV0ZG93biB0aGUgc2VydmVyCislJSBSZXR1cm5zOiBhbnkgKGlnbm9yZWQgYnkgZ2VuX3NlcnZlcikKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3Rlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPgorICAgIG9rLgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBGdW5jOiBjb2RlX2NoYW5nZS8zCislJSBQdXJwb3NlOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQKKyUlIFJldHVybnM6IHtvaywgTmV3U3RhdGV9CislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4KKyAgICB7b2ssIFN0YXRlfS4KKworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorJSUlIEludGVybmFsIGZ1bmN0aW9ucworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmFfc3VwLmVybCBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JhX3N1cC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjVmNDhkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JhX3N1cC5lcmwKQEAgLTAsMCArMSw3NCBAQAorJSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUlIEBkb2MgIAorJSUlIEBlbmQKKyUlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy1tb2R1bGUoJSVQRlglJV9zdXApLgorCistYmVoYXZpb3VyKHN1cGVydmlzb3IpLgorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgSW5jbHVkZSBmaWxlcworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBFeHRlcm5hbCBleHBvcnRzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistZXhwb3J0KFsKKwkgc3RhcnRfbGluay8xCisgICAgICAgIF0pLgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBJbnRlcm5hbCBleHBvcnRzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistZXhwb3J0KFsKKwkgaW5pdC8xCisgICAgICAgIF0pLgorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBNYWNyb3MKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgUmVjb3JkcworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CislJSBFeHRlcm5hbCBmdW5jdGlvbnMKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEBkb2MgU3RhcnRzIHRoZSBzdXBlcnZpc29yLgorJSUgQHNwZWMgc3RhcnRfbGluayhTdGFydEFyZ3MpIC0+IHtvaywgcGlkKCl9IHwgRXJyb3IKKyUlIEBlbmQKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXJ0X2xpbmsoU3RhcnRBcmdzKSAtPgorICAgIHN1cGVydmlzb3I6c3RhcnRfbGluayh7bG9jYWwsID9TRVJWRVJ9LCA/TU9EVUxFLCBbXSkuCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIFNlcnZlciBmdW5jdGlvbnMKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEZ1bmM6IGluaXQvMQorJSUgUmV0dXJuczoge29rLCAge1N1cEZsYWdzLCAgW0NoaWxkU3BlY119fSB8CislJSAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyUlICAgICAgICAgIHtlcnJvciwgUmVhc29ufSAgIAorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5pdChbXSkgLT4KKyAgICBSZXN0YXJ0U3RyYXRlZ3kgICAgPSBvbmVfZm9yX29uZSwKKyAgICBNYXhSZXN0YXJ0cyAgICAgICAgPSAxMDAwLAorICAgIE1heFRpbWVCZXRSZXN0YXJ0cyA9IDM2MDAsCisgICAgCisgICAgU3VwRmxhZ3MgPSB7UmVzdGFydFN0cmF0ZWd5LCBNYXhSZXN0YXJ0cywgTWF4VGltZUJldFJlc3RhcnRzfSwKKyAgICAKKyAgICBDaGlsZFNwZWNzID0KKwlbCisJIHslJVBGWCUlX3NlcnZlciwKKwkgIHslJVBGWCUlX3NlcnZlciwgc3RhcnRfbGluaywgW119LAorCSAgcGVybWFuZW50LAorCSAgMTAwMCwKKwkgIHdvcmtlciwKKwkgIFslJVBGWCUlX3NlcnZlcl19CisJIF0sCisgICAge29rLHtTdXBGbGFncywgQ2hpbGRTcGVjc319LgorJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorJSUgSW50ZXJuYWwgZnVuY3Rpb25zCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuYXBwLnNyYyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvc3JjL2JsYW5rX2FwcC5hcHAuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmExNTEzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuYXBwLnNyYwpAQCAtMCwwICsxLDQxIEBACislJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQore2FwcGxpY2F0aW9uLCAlQVBQX05BTUUlLAorIFsKKyAgJSBBIHF1aWNrIGRlc2NyaXB0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAge2Rlc2NyaXB0aW9uLCAiQW4gRXJsYW5nIEFwcGxpY2F0aW9uLiJ9LAorCisgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KKyAge3ZzbiwgIiVWU04lIn0sCisKKyAgJSBBbGwgbW9kdWxlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gCisgIHttb2R1bGVzLAorICAgWworCSVNT0RVTEVTJQorICAgXX0sCisKKyAgJSBBbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbmFtZXMgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIFRoaXMgY2FuIGJlIGlnbm9yZWQuCisgIHtyZWdpc3RlcmVkLCBbXX0sCisKKyAgJSBBcHBsaWNhdGlvbnMgdGhhdCBhcmUgdG8gYmUgc3RhcnRlZCBwcmlvciB0byB0aGlzIG9uZS4gVGhpcyBjYW4gYmUgaWdub3JlZAorICAlIGxlYXZlIGl0IGFsb25lIHVubGVzcyB5b3UgdW5kZXJzdGFuZCBpdCB3ZWxsIGFuZCBsZXQgdGhlIC5yZWwgZmlsZXMgaW4gCisgICUgeW91ciByZWxlYXNlIGhhbmRsZSB0aGlzLiAKKyAge2FwcGxpY2F0aW9ucywKKyAgIFsKKyAgICBrZXJuZWwsIAorICAgIHN0ZGxpYgorICAgXX0sCisKKyAgJSBPVFAgYXBwbGljYXRpb24gbG9hZGVyIHdpbGwgbG9hZCwgYnV0IG5vdCBzdGFydCwgaW5jbHVkZWQgYXBwcy4gQWdhaW4KKyAgJSB0aGlzIGNhbiBiZSBpZ25vcmVkIGFzIHdlbGwuICBUbyBsb2FkIGJ1dCBub3Qgc3RhcnQgYW4gYXBwbGljYXRpb24gaXQKKyAgJSBpcyBlYXNpZXIgdG8gaW5jbHVkZSBpdCBpbiB0aGUgLnJlbCBmaWxlIGZvbGxvd2VkIGJ5IHRoZSBhdG9tICdub25lJworICB7aW5jbHVkZWRfYXBwbGljYXRpb25zLCBbXX0sCisKKyAgJSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgc2ltaWxhciB0byB0aG9zZSBpbiB0aGUgY29uZmlnIGZpbGUgc3BlY2lmaWVkCisgICUgb24gdGhlIGNvbW1hbmQgbGluZS4gY2FuIGJlIGZldGNoZWQgd2l0aCBnYXM6Z2V0X2VudgorICB7ZW52LCBbXX0sCisKKyAgJSBUaGUgTW9kdWxlIGFuZCBBcmdzIHVzZWQgdG8gc3RhcnQgdGhpcyBhcHBsaWNhdGlvbi4KKyAge21vZCwgeyVBUFBfTkFNRSUsIFtdfX0KKyBdCit9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuYXBwdXAuc3JjIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmxhbmtfYXBwLmFwcHVwLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NGE2MzgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmxhbmtfYXBwLmFwcHVwLnNyYwpAQCAtMCwwICsxIEBACit7IiVWU04lIixbXSxbXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3NyYy9ibGFua19hcHAuZXJsIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmxhbmtfYXBwLmVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZGI2ZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcC9zcmMvYmxhbmtfYXBwLmVybApAQCAtMCwwICsxLDYzIEBACislJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSUgQGRvYyAgCislJSUgQGVuZAorJSUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLW1vZHVsZSglJUFQUF9OQU1FJSUpLgorCistYmVoYXZpb3VyKGFwcGxpY2F0aW9uKS4KKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEluY2x1ZGUgZmlsZXMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy1pbmNsdWRlKCIlJUFQUF9OQU1FJSUuaHJsIikuCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEV4dGVybmFsIGV4cG9ydHMKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy1leHBvcnQoWworCSBzdGFydC8yLAorCSBzaHV0ZG93bi8wLAorCSBzdG9wLzEKKwkgXSkuCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIE1hY3JvcworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislJSBSZWNvcmRzCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyUlIEV4dGVybmFsIGZ1bmN0aW9ucworJSU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgQGRvYyBUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGFuIGVybGFuZyBhcHBsaWNhdGlvbi4KKyUlIEBzcGVjIHN0YXJ0KFR5cGUsIFN0YXJ0QXJncykgLT4ge29rLCBQaWR9IHwge29rLCBQaWQsIFN0YXRlfSB8IHtlcnJvciwgUmVhc29ufQorJSUgQGVuZAorJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhcnQoVHlwZSwgU3RhcnRBcmdzKSAtPgorICAgIGNhc2UgJSVQRlglJV9zdXA6c3RhcnRfbGluayhTdGFydEFyZ3MpIG9mCisJe29rLCBQaWR9IC0+IAorCSAgICB7b2ssIFBpZH07CisJRXJyb3IgLT4KKwkgICAgRXJyb3IKKyAgICBlbmQuCisKKyUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUlIEBkb2MgQ2FsbGVkIHRvIHNodWRvd24gdGhlICUlQVBQX05BTUUlJSBhcHBsaWNhdGlvbi4KKyUlIEBzcGVjIHNodXRkb3duKCkgLT4gb2sgCislJSBAZW5kCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzaHV0ZG93bigpIC0+CisgICAgYXBwbGljYXRpb246c3RvcCglJUFQUF9OQU1FJSUpLgorCislJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CislJSBJbnRlcm5hbCBmdW5jdGlvbnMKKyUlPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSUgQ2FsbGVkIHVwb24gdGhlIHRlcm1pbnRpb24gb2YgYW4gYXBwbGljYXRpb24uCislJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdG9wKFN0YXRlKSAtPgorICAgIG9rLgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3Zzbi5tayBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHAvdnNuLm1rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliYTE3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwL3Zzbi5tawpAQCAtMCwwICsxIEBACislJUFQUF9OQU1FX1VQUEVSX0NBU0UlJV9WU049MS4wCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC9NYWtlZmlsZSBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkMzU5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC9NYWtlZmlsZQpAQCAtMCwwICsxLDI5OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1ha2UgZmlsZSBmb3IgY3JlYXRpbmcgYW4gb3RwIHJlbGVhc2UuIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIEJhc2VuYW1lIG9mIHRoaXMgcmVsZWFzZS4KKyMjCitSRUxTPSQoc2hlbGwgYmFzZW5hbWUgYHB3ZGApCitBUFBfTkFNRT0kKHNoZWxsIGVjaG8gJChSRUxTKSB8IHNlZCBzL19yZWwkJC8vKQorCitpbmNsdWRlIC4uLy4uL2J1aWxkL290cC5taworCitpbmNsdWRlIC4vdnNuLm1rCisKKyNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS90YXJnZXQubWsKKyNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS8kKFRBUkdFVCkvb3RwLm1rCisKK1VTUl9MSUJQQVRIPS4uLy4uL2xpYgorSU5TVEFMTF9ESVI9L3Vzci9sb2NhbC9saWIKK0FCU19VU0VSX0xJQlBBVEg9JChzaGVsbCBjZCAuLi8uLi9saWI7cHdkKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ1JFQVRFIERJUiBTVFJVQ1RVUkUgSEVSRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hURE9DUz0kKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyouaHRtbCkgXAorCSQod2lsZGNhcmQgJChBQlNfVVNFUl9MSUJQQVRIKS8kKEFQUF9OQU1FKS9odGRvY3MvKi5odG0pIFwKKwkkKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyoueWF3cykKK0JVSUxEX0ZJTEVTPWZzX2Jvb3Rfc21pdGhlLmJlYW0gZnNfbGlzdHMuYmVhbSBmc19saWIuYmVhbQorCitMT0NBTF9ESVI9bG9jYWwKKyNMT0NBTF9ESVI9JChzaGVsbCBjYXQgJChSRUxTKS5yZWwuc3JjIHxncmVwIC1tIDEgJyQoQVBQX05BTUUpJyB8YXdrIC1GICciJyAne3ByaW50ZiAiJXMtJXMiLCAkJDIsJCQ0fScpCisKK0RJUl9TVFJVQ1RVUkU9IFwKKwkkKExPQ0FMX0RJUikgXAorCSQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKSBcCisJJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pIFwKKwkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYgXAorCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvaHRkb2NzIAorCitQUk9EVUNUSU9OX0RJUl9TVFJVQ1RVUkU9IFwKKwkkKFJFTFMpIFwKKwkkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKSBcCisJJChSRUxTKS9zdGFnZSBcCisJJChSRUxTKS9sb2cvJChSRUxfVlNOKSBcCisJJChSRUxTKS92YXIvJChSRUxfVlNOKSBcCisJJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cgXAorCSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcyBcCisJJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NDUklQVF9BTkRfQk9PVF9GSUxFUz0gXAorCSQoUkVMUykuc2NyaXB0IFwKKwkkKFJFTFMpLmJvb3QKKworTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTPSBcCisJJChMT0NBTF9ESVIpLyQoUkVMUykuc2NyaXB0IFwKKwkkKExPQ0FMX0RJUikvJChSRUxTKS5ib290CisKK0xPQ0FMX0hUVFBfQ09ORj0gXAorCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi95YXdzLmNvbmYgXAorCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzICAKKworUFJPRFVDVElPTl9IVFRQX0NPTkY9IFwKKwkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mIFwKKwkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlcyAgCisKK0xPQ0FMX1RBUkdFVF9GSUxFUz0kKExPQ0FMX0hUVFBfQ09ORikgJChMT0NBTF9ESVIpLyQoUkVMUykuY29uZmlnICQoTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTKQorCitMT0NBTF9UQVJHRVRTPSQoTE9DQUxfRElSKS8kKFJFTFMpLnNoIHZzbml0ICQoTE9DQUxfVEFSR0VUX0ZJTEVTKSAKKworUFJPRFVDVElPTl9UQVJHRVRTPSQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCisJICAgICAgICAgICAkKFJFTFMpL2xpYiBcCisgICAgICAgICAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmMgXAorCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLmNvbmZpZy5zcmMgXAorCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjIFwKKwkJICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnNoLnNyYyAgXAorCQkgICAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3MgXAorCQkgICAkKFJFTFMpL2luc3RhbGwuc2ggXAorCQkgICAkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlIAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVEFSR0VUUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FsbCBkZWJ1ZyBvcHQgaW5zdHIgc2NyaXB0OiAgJChESVJfU1RSVUNUVVJFKSAkKExPQ0FMX1RBUkdFVFMpICQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKSAkKFBST0RVQ1RJT05fVEFSR0VUUykKKwlAZWNobyAkKEhURE9DUykKKworaW5zdGFsbDogIHN0YWdlCisKK3RhcjogJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnegorCiskKERJUl9TVFJVQ1RVUkUpOgorCW1rZGlyIC1wICRACisKKyQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKToKKwlta2RpciAtcCAkQAorCQorY2xlYW46CisJJChSTSkgJChSRUxfU0NSSVBUUykgJChUQVJHRVRfRklMRVMpCisJJChSTSkgLXIgJChMT0NBTF9ESVIpICQoUFJPRE5fRElSKQorCSQoUk0pICQoUkVMUykucmVsCisJJChSTSkgLXIgJChSRUxTKQorCSQoUk0pICQoUkVMUykqLnRnegorCSQoUk0pICQoUkVMUykucmVsLnNyYy50bXAKKwkkKFJNKSAkKFNDUklQVF9BTkRfQk9PVF9GSUxFUykKKworZG9jczoKKwkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUQVJHRVRTIEZPUiBMT0NBTCBNT0RFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBzdGFydHVwIHNjcmlwdCBmb3IgbG9jYWwgbW9kZQorJChMT0NBTF9ESVIpLyQoUkVMUykuc2g6IAorCUBlY2hvICcjIS9iaW4vc2gnID4gJEAKKwlAZWNobyAiY2QgJChDVVJESVIpLyQoTE9DQUxfRElSKSIgPj4gJEAKKwlAZWNobyAiZXJsIC1uYW1lICQke1VTRVJ9XyQoUkVMUykgLWJvb3QgJChSRUxTKSAtY29uZmlnICQoUkVMUykuY29uZmlnIFwkJEAiID4+ICRACisJY2htb2QgK3ggJEAKKwlAZWNobworCUBlY2hvICI9PT09IFN0YXJ0IGxvY2FsIG5vZGUgd2l0aCBcInNoICRAXCIgPT09PSIKKwlAZWNobworCisjIENyZWF0ZSB0aGUgY29uZmlnIGZpbGUgZm9yIGxvY2FsIG1vZGUuCiskKExPQ0FMX0RJUikvJChSRUxTKS5jb25maWc6ICQoUkVMUykuY29uZmlnLnNyYworCXNlZCAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKKwkgICAgLWUgJ3M7JVZBUl9PVFAlOyQoQ1VSRElSKS8kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTik7JyBcCisgICAgICAgICAgICAtZSAnczslUkVMUyU7JChSRUxTKTtnJyBcCisgICAgICAgICAgICAtZSAnczslSE9NRSU7JChIT01FKTtnJyBcCisgICAgICAgICAgICAtZSAnczslQlJPQURDQVNUX0FERFJFU1MlOyQoQlJPQURDQVNUX0FERFJFU1MpO2cnIFwKKyAgICAgICAgICAgIC1lICdzOyVDT05UQUNUX05PREUlOyQoQ09OVEFDVF9OT0RFKTtnJyBcCisJICAgIC1lICJzOyVIT1NUTkFNRSU7YGhvc3RuYW1lIC0tbG9uZ2A7IiBcCisgICAgICAgICAgICAtZSAnczslQVBQX05BTUUlOyQoQVBQX05BTUUpOycgXAorCSAgICAtZSAnczslQVBQX1ZFUlNJT04lOyQoQVBQX1ZFUlNJT04pO2cnIFwKKyAgICAgICAgICAgICAkPCA+ICRACisKKyMgQ3JlYXRlIHRoZSBodHRwZCBjb25mIGZpbGUgZm9yIGxvY2FsIG1vZGUuCiskKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mOiB5YXdzLmNvbmYuc3JjCisJc2VkIC1lICdzOyVWQVJfT1RQJTskKENVUkRJUikvJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pOycgXAorCSAgICAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKKwkgICAgLWUgJ3M7JUhURE9DX1JPT1QlOyQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzOycgXAorICAgICAgICAgICAgLWUgJ3M7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTsnIFwKKyAgICAgICAgICAgIC1lICdzOyVSRUxTJTskKFJFTFMpOycgXAorICAgICAgICAgICAgLWUgJ3M7JVVTRVIlOyQoVVNFUik7JyBcCisJICAgIC1lICdzOyVIVERPQ19ST09UJTskKEFCU19VU0VSX0xJQlBBVEgpOycgXAorICAgICAgICAgICAgLWUgJ3M7JU1IT1NUJTskKE1IT1NUKTsnIFwKKyAgICAgICAgICAgICQ8ID4gJEAKKworIyBDcmVhdGUgdGhlIGNvbmZpZyBmaWxlIGZvciBsb2NhbCBtb2RlLgordnNuaXQ6ICQoUkVMUykucmVsLnNyYyAKKwlzZWQgLWUgJ3M7JVJFTF9WU04lOyQoUkVMX1ZTTik7JyBcCisJICAgICAgICQ8ID4gJDwudG1wCisKKyMgQ3JlYXRlIGFuZCBwb3NpdGlvbiBzY3JpcHQgYW5kIGJvb3QgZmlsZXMgZm9yIGxvY2FsIG1vZGUuCiskKExPQ0FMX1NDUklQVF9BTkRfQk9PVF9GSUxFUyk6IAorCUAgZXJsIC1weiAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluIFwKKwkgICAgICAtbm9zaGVsbCBcCisJICAgICAgLXMgZnNfbGliIHNfYXBwbHkgZnNfYm9vdF9zbWl0aGUgbWFrZV9zY3JpcHRfYW5kX2Jvb3QgIltcIiQoRVJMX1JVTl9UT1ApLypcIiwgIFwiJChVU1JfTElCUEFUSClcIl0uICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkJChiYXNlbmFtZSBgcHdkYCkiLnJlbC5zcmMudG1wXCIuICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltsb2NhbF0uICIgXAorCSAgICAgIC1zIGluaXQgc3RvcAorCWNwICQoU0NSSVBUX0FORF9CT09UX0ZJTEVTKSAkKExPQ0FMX0RJUikvIAorCiskKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlczogLi4vLi4vYnVpbGQvbWltZS50eXBlcworCWNwICQ8ICRACisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUQVJHRVRTIEZPUiBQUk9EVUNUSU9OIE1PREUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJChSRUxTKS9saWI6IAorCSMgRm9yIHNvbWUgcmVhc29uIHRoaXMgd2lsbCBub3QgaGFwcGVuIGlmIGFkZGVkIHRvIFBST0RVQ1RJT05fRElSX1NUUlVDVFVSRQorCW1rZGlyICRACisJQCBlcmwgLXB6ICQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCisJICAgICAgLW5vc2hlbGwgXAorCSAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIHN0YWdlX2Zyb21fcmVsc3JjICJbXCIkKFVTUl9MSUJQQVRIKVwiXS4gIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiJCQoYmFzZW5hbWUgYHB3ZGApIi5yZWwuc3JjXCIuICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiRAXCIiLiAiIFwKKwkgICAgICAtcyBpbml0IHN0b3AKKworIyBNb3ZlIHRoZSBodGRvY3MgZnJvbSB0aGUgbG9jYWwgYXBwcyB0byB0aGUgcHJvZHVjdGlvbiBodGRvYyByb290IGRpcmVjdG9yeS4KKyQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcy86ICQoSFRET0NTKQorCUBta2RpciAtcCAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7IFwKKwlmb3IgeCBpbiAkKEhURE9DUyk7ZG8gXAorIAkJY3AgICQkeCAkQDsgXAorCWRvbmUKKworIyBzdGFydHVwIHNjcmlwdCBmb3IgcHJvZHVjdGlvbiBtb2RlCiskKFJFTFMpL3N0YWdlLyQoUkVMUykuc2guc3JjOiAKKwlAZWNobyAnIyEvYmluL3NoJyA+ICRACisJQGVjaG8gImNkICVJTlNUQUxMX0RJUiUvJChSRUxTKS9yZWxlYXNlLyQoUkVMX1ZTTikiID4+ICRACisJQGVjaG8gImVybCAtbmFtZSAkKFJFTFMpIC1ib290ICQoUkVMUykgLWNvbmZpZyAkKFJFTFMpLmNvbmZpZyAtZGV0YWNoZWQgXCQkQCIgPj4gJEAKKwljaG1vZCAreCAkQAorCiskKFJFTFMpL2J1aWxkLyQoUkVMX1ZTTik6ICAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluCisJbWtkaXIgLXAgJChSRUxTKS9idWlsZC8kKFJFTF9WU04pIAorCWNwICQ8L2ZzX2Jvb3Rfc21pdGhlLmJlYW0gJEAKKwljcCAkPC9mc19saWIuYmVhbSAkQAorCWNwICQ8L2ZzX2xpc3RzLmJlYW0gJEAKKworJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmM6ICQoUkVMUykucmVsLnNyYy50bXAKKwljcCAkPCAkQAorCiskKFJFTFMpL3N0YWdlLyQoUkVMUykuY29uZmlnLnNyYzogJChSRUxTKS5jb25maWcuc3JjCisJY3AgJDwgJEAKKworJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjOiB5YXdzLmNvbmYuc3JjCisJY3AgJDwgJEAKKworJChSRUxTKS9pbnN0YWxsLnNoOiAKKwlAZWNobyAnIyEvYmluL3NoJyA+ICRACisJQGVjaG8gIiIgPj4gJEAKKwlAZWNobyAiaWYgWyBcJCQjIC1lcSAxIF07dGhlbiIgPj4gJEAKKwlAZWNobyAiICAgIElOU1RBTExfRElSPVwkJDE7IiA+PiAkQAorCUBlY2hvICJlbHNlIiA+PiAkQAorCUBlY2hvICIgICAgSU5TVEFMTF9ESVI9JChJTlNUQUxMX0RJUik7IiA+PiAkQAorCUBlY2hvICJmaSIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJmdW5jdGlvbiBtdW5nZSgpIHsiID4+ICRACisJQGVjaG8gIiAgICBzZWQgLWUgXCJzOyVMT0dfT1RQJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2xvZy8kKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JVZBUl9PVFAlO1wkJElOU1RBTExfRElSLyQoUkVMUykvdmFyLyQoUkVMX1ZTTik7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICIgICAgICAgIC1lIFwiczslUkVMUyU7JChSRUxTKTtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVSRUxfVlNOJTskKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JVVTRVIlOyQkVVNFUjtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVIVERPQ19ST09UJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICIgICAgICAgIC1lIFwiczslTUhPU1QlO1xgaG9zdG5hbWVcYDtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVCUk9BRENBU1RfQUREUkVTUyU7JChCUk9BRENBU1RfQUREUkVTUyk7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICIgICAgICAgIC1lIFwiczslSU5TVEFMTF9ESVIlO1wkJElOU1RBTExfRElSO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JUNPTlRBQ1RfTk9ERSU7JChDT05UQUNUX05PREUpO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JUhPU1ROQU1FJTtcYGhvc3RuYW1lIC0tbG9uZ1xgO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVBUFBfVkVSU0lPTiU7JChBUFBfVkVSU0lPTik7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICcgICAgICAgICQkMSA+ICQkMicgPj4gJEAKKwlAZWNobyAifSIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJtdW5nZSBzdGFnZS95YXdzLmNvbmYuc3JjIHZhci8kKFJFTF9WU04pL3d3dy9jb25mL3lhd3MuY29uZjsiID4+ICRACisJQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykuY29uZmlnLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5jb25maWc7IiA+PiAkQAorCUBlY2hvICJtdW5nZSBzdGFnZS8kKFJFTFMpLnNoLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACisJQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykucmVsLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5yZWw7IiA+PiAkQAorCUBlY2hvICJjaG1vZCAreCByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACisJQGVjaG8gIiIgPj4gJEAKKwlAZWNobyAiY2QgLi47IiA+PiAkQAorCUBlY2hvICJmaW5kICQoUkVMUykgfCBjcGlvIC1vID4gXCQkSU5TVEFMTF9ESVIvJChSRUxTKS5jcGlvOyIgPj4gJEAKKwlAZWNobyAiY2QgLTsiID4+ICRACisJQGVjaG8gImNkIFwkJElOU1RBTExfRElSOyAiID4+ICRACisJQGVjaG8gImVjaG8gLW4gXCJVbnBhY2tlZDogXCIiID4+ICRACisJQGVjaG8gImNwaW8gLXVpZCA8ICQoUkVMUykuY3BpbzsiID4+ICRACisJQGVjaG8gInJtICQoUkVMUykuY3BpbzsiID4+ICRACisJQGVjaG8gIiIgPj4gJEAKKwlAZWNobyAiZWNobyBcInB3ZCBpcyBcYHB3ZFxgXCI7IiA+PiAkQAorCUBlY2hvICJjZCAkKFJFTFMpOyIgPj4gJEAKKwlAZWNobyAiIGVybCAtcHogYnVpbGQvJChSRUxfVlNOKSBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgLW5vc2hlbGwgXFwiID4+ICRACisJQGVjaG8gLW4gIiAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIG1ha2Vfc2NyaXB0X2FuZF9ib290IFwiW1xcXCIkKEVSTF9SVU5fVE9QKS8qXFxcIiwgIFxcXCJsaWIvXFxcIl0uIFwiICIgPj4gJEAKKwlAZWNobyAtbiAgICAgICAgIlwiXFxcInN0YWdlLyQkKGJhc2VuYW1lIGBwd2RgKS5yZWwuc3JjXFxcIi4gXCIgIiA+PiAkQAorCUBlY2hvIC1uICAgICAgICAiXCJbbG9jYWxdLiBcIiAiID4+ICRACisJQGVjaG8gICAgICAgICAgICItcyBpbml0IHN0b3AgfCBlZ3JlcCAnKnRlcm1pbmF0ZSp8RVJST1InIiA+PiAkQAorCUBlY2hvICJpZiBbIFwkJD8gLWVxIDAgXTsgdGhlbiIgPj4gJEAKKwlAZWNobyAiZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCI7IiA+PiAkQAorCUBlY2hvICJlY2hvIFwiU1RBR0UgRkFJTFVSRSBcJCQ/ICAtIFNpbGVuY2UgdGhlIGRpc2NvcmQuXCI7IiA+PiAkQAorCUBlY2hvICJlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIjsiID4+ICRACisJQGVjaG8gImV4aXQgMTsiID4+ICRACisJQGVjaG8gImZpIiA+PiAkQAorCUBlY2hvICIiID4+ICRACisJQGVjaG8gIm12ICQoUkVMUykucmVsICQoUkVMUykuc2NyaXB0ICQoUkVMUykuYm9vdCByZWxlYXNlLyQoUkVMX1ZTTik7IiA+PiAkQAorCUBlY2hvICIiID4+ICRACisJQGVjaG8gInJtIC1yIHN0YWdlOyIgPj4gJEAKKwlAZWNobyAicm0gLXIgYnVpbGQ7IiA+PiAkQAorCUBlY2hvICJjZCAtOyIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJjaGdycCAtUiBlcnRzICQoUkVMUyk7ICIgPj4gJEAKKwlAZWNobyAiY2htb2QgLVIgNzc1ICQoUkVMUyk7ICIgPj4gJEAKKwlAZWNobyAiY2QgLSIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJybSAtZiAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsiID4+ICRACisJQGVjaG8gImxuIC1zIFwkJElOU1RBTExfRElSLyQoUkVMUykvcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykuc2ggL3Vzci9sb2NhbC9iaW4vJChBUFBfTkFNRSk7IiA+PiAkQAorCUBlY2hvICJjaGdycCAtUiBlcnRzIC91c3IvbG9jYWwvYmluLyQoQVBQX05BTUUpOyAiID4+ICRACisJQGVjaG8gImNobW9kIC1SIDc3NSAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsgIiA+PiAkQAorCUBlY2hvICJybSBcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2luc3RhbGwuc2g7IiA+PiAkQAorCUBlY2hvICJlY2hvIC1uICQkJ1xlWzA7MzJtJyIgPj4gJEAKKwlAZWNobyAiZWNobyBcIiQoQVBQX05BTUUpIGluc3RhbGxhdGlvbiB0byBcJCRJTlNUQUxMX0RJUiBjb21wbGV0ZS5cIiIgPj4gJEAKKwlAZWNobyAiZWNobyAtbiAkJCdcZVswbSciID4+ICRACisJY2htb2QgK3ggJEAKKwkJCisKK3N0YWdlOiAkKFJFTFMpCisJY2QgJChSRUxTKTsgXAorCS4vaW5zdGFsbC5zaDsgXAorCWNkIC0KKworJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzOiAuLi8uLi9idWlsZC9taW1lLnR5cGVzCisJY3AgJDwgJEAKKworJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnejogJChSRUxTKQorCXRhciAtemN2ZiAkQCAkPAorCiskKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlOiAuLi8uLi90b29scy91dGlsaXRpZXMvY2xlYW5fcmVsZWFzZQorCWNwICQ8ICRACisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL2JsYW5rX2FwcF9yZWwuY29uZmlnLnNyYyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL2JsYW5rX2FwcF9yZWwuY29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzAxYzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvYmxhbmtfYXBwX3JlbC5jb25maWcuc3JjCkBAIC0wLDAgKzEsMjYgQEAKKyUlJSAtKi0gbW9kZTplcmxhbmcgLSotCislJSUgUGFyYW1ldGVyIHNldHRpbmdzIGZvciBhcHBzIG9uICVBUFBfTkFNRSUKKyUlJSBXYXJuaW5nIC0gdGhpcyBjb25maWcgZmlsZSAqbXVzdCogZW5kIHdpdGggPGRvdD48d2hpdGVzcGFjZT4KKworJSUgd3JpdGUgbG9nIGZpbGVzIHRvIHNhc2xfZGlyCitbCisge3Nhc2wsCisgIFsKKyAgIHtzYXNsX2Vycm9yX2xvZ2dlciwge2ZpbGUsICIlTE9HX09UUCUvc2FzbF9sb2cifX0KKyAgXX0sCisKKworIHtnYXMsCisgIFsKKyAgIHttb2Rfc3BlY3MsIFt7ZWx3cmFwLCB7ZnNfZWx3cmFwX2gsIHN0YXJ0X2xpbmt9fV19LAorCisgICAlIGVsd3JhcCBjb25maWcuCisgICB7ZXJyX2xvZywgIiVMT0dfT1RQJS9lcnJfbG9nIn0sCisgICB7ZXJyX2xvZ193cmFwX2luZm8sIHt7ZXJyLDUwMDAwMDAsMTB9LHtzYXNsLDUwMDAwMDAsMTB9fX0sIAorICAge2Vycl9sb2dfdHR5LCB0cnVlfSAlIExvZyB0byB0aGUgc2NyZWVuCisgICBdfSwKKworIHslQVBQX05BTUUlLAorICBbCisgIF19CitdLiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL2JsYW5rX2FwcF9yZWwucmVsLnNyYyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL2JsYW5rX2FwcF9yZWwucmVsLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNjk1NzhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvYmxhbmtfYXBwX3JlbC5yZWwuc3JjCkBAIC0wLDAgKzEsMTQgQEAKKyUlJSAtKi0gbW9kZTplcmxhbmcgLSotCit7cmVsZWFzZSwgCisgeyIlJUFQUF9OQU1FJSVfcmVsIiwgIiVSRUxfVlNOJSJ9LAorIGVydHMsCisgWworICBrZXJuZWwsCisgIHN0ZGxpYiwKKyAgc2FzbCwKKyAgZnNsaWIsCisgIGdhcywKKyAgJSVBUFBfTkFNRSUlCisgXQorfS4gCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL3Zzbi5tayBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9ibGFua19hcHBfcmVsL3Zzbi5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWM4ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwvdnNuLm1rCkBAIC0wLDAgKzEgQEAKK1JFTF9WU049MS4wCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vYmxhbmtfYXBwX3JlbC95YXdzLmNvbmYuc3JjIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwveWF3cy5jb25mLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU3YWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL2JsYW5rX2FwcF9yZWwveWF3cy5jb25mLnNyYwpAQCAtMCwwICsxLDE2NiBAQAorCisjIGNvbmYgZm9yIHlhd3MKKworCisjIGZpcnN0IHdlIGhhdmUgYSBzZXQgb2YgZ2xvYmFscworIyBUaGF0IGFwcGx5IHRvIGFsbCB2aXJ0dWFsIHNlcnZlcnMKKworCisjIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgbG9nZmlsZXMgZm9yCisjIGFsbCB2aXJ0dWFsIHNlcnZlcnMgd2lsbCBiZSB3cml0dGVuCisKK2xvZ2RpciA9IC92YXIvbG9nL3lhd3MKKworIyBUaGlzIHRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoZXJlIGFkZGl0aW9uYWwKKyMgYmVhbSBjb2RlIGNhbiBiZSBwbGFjZWQuIFRoZSBkYWVtb24gd2lsbCBhZGQgdGhpcworIyBkaXJlY3RvcnkgdG8gaXRzIHNlYXJjaCBwYXRoCisKK2ViaW5fZGlyID0gL3Zhci95YXdzL2ViaW4KKworCisjIFRoaXMgaXMgYSBkaXJlY3Rvcnkgd2hlcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgLmhybAorIyBmaWxlcyBjYW4gYmUgcGxhY2VkLiBhcHBsaWNhdGlvbiBzcGVjaWZpZyAueWF3cyBjb2RlIGNhbgorIyB0aGVuIGluY2x1ZGUgdGhlc2UgLmhybCBmaWxlcworCitpbmNsdWRlX2RpciA9IC92YXIveWF3cy9pbmNsdWRlCisKKworCisKKworIyBUaGlzIGlzIGEgZGVidWcgdmFyaWFibGUsIHBvc3NpYmxlIHZhbHVlcyBhcmUgaHR0cCB8IHRyYWZmaWMgfCBmYWxzZQorIyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNldCB0aGUgdHJhY2UgKHBvc3NpYmx5IHRvIHRoZSB0dHkpIHdoaWxlCisjIGludm9raW5nIHlhd3MgZnJvbSB0aGUgc2hlbGwgYXMgaW4KKyMgeWF3cyAtaSAtVCAteCAoc2VlIG1hbiB5YXdzKQorCit0cmFjZSA9IGZhbHNlCisKKworCisKKworIyBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIHlhd3Mgc3RhcnQgYWRkaXRpb25hbCAKKyMgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSBhdCBzdGFydHVwCisjIAorIyBydW5tb2QgPSBteW1vZHVsZQorCisKKyMgQnkgZGVmYXVsdCB5YXdzIHdpbGwgY29weSB0aGUgZXJsYW5nIGVycm9yX2xvZyBhbmQKKyMgZW5kIHdyaXRlIGl0IHRvIGEgd3JhcCBsb2cgY2FsbGVkIHJlcG9ydC5sb2cgKGluIHRoZSBsb2dkaXIpCisjIHRoaXMgZmVhdHVyZSBjYW4gYmUgdHVybmVkIG9mZi4gVGhpcyB3b3VsZCB0eXBpY2FsbHkKKyMgYmUgdGhlIGNhc2Ugd2hlbiB5YXdzIHJ1bnMgd2l0aGluIGFub3RoZXIgbGFyZ2VyIGFwcAorCitjb3B5X2Vycm9yX2xvZyA9IHRydWUKKworCisjIExvZ3MgYXJlIHdyYXAgbG9ncworCitsb2dfd3JhcF9zaXplID0gMTAwMDAwMAorCisKKyMgUG9zc2libHkgcmVzb2x2ZSBhbGwgaG9zdG5hbWVzIGluIGxvZ2ZpbGVzIHNvIHdlYmFsaXplcgorIyBjYW4gcHJvZHVjZSB0aGUgbmljZSBnZW9ncmFwaHkgcGllY2hhcnQKKworbG9nX3Jlc29sdmVfaG9zdG5hbWUgPSBmYWxzZQorCisKKworIyBmYWlsIGNvbXBsZXRlbHkgb3Igbm90IGlmIHlhd3MgZmFpbHMgCisjIHRvIGJpbmQgYSBsaXN0ZW4gc29ja2V0CitmYWlsX29uX2JpbmRfZXJyID0gdHJ1ZQorCisKKworIyBJZiB5YXdzIGlzIHN0YXJ0ZWQgYXMgcm9vdCwgaXQgY2FuLCBvbmNlIGl0IGhhcyBvcGVuZWQKKyMgYWxsIHJlbGV2YW50IHNvY2tldHMgZm9yIGxpc3RlbmluZywgY2hhbmdlIHRoZSB1aWQgdG8gYSAKKyMgdXNlciB3aXRoIGxvd2VyIGFjY2Vzc3JpZ2h0cyB0aGFuIHJvb3QgCisKKyMgdXNlcm5hbWUgPSBub2JvZHkKKworCisjIElmIEhUVFAgYXV0aCBpcyB1c2VkLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3BlY2lmaWMKKyMgYXV0aCBsb2cuCisKK2F1dGhfbG9nID0gdHJ1ZQorCisKKyMgV2hlbiB3ZSdyZSBydW5uaW5nIG11bHRpcGxlIHlhd3Mgc3lzdGVtcyBvbiB0aGUgc2FtZSAKKyMgaG9zdCwgd2UgbmVlZCB0byBnaXZlIGVhY2ggeWF3cyBzeXN0ZW0gYW4gaW5kaXZpZHVhbAorIyBuYW1lLiBZYXdzIHdpbGwgd3JpdGUgYSBudW1iZXIgb2YgcnVudGltZSBmaWxlcyB1bmRlcgorIyAvdG1wL3lhd3MvJHtpZH0KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXMgImRlZmF1bHQiCisKKworIyBpZCA9IG15bmFtZQorCisKKyMgZWFybGllciB2ZXJzaW9ucyBvZiBZYXdzIHBpY2tlZCB0aGUgZmlyc3QgdmlydHVhbCBob3N0CisjIGluIGEgbGlzdCBvZiBob3N0cyB3aXRoIHRoZSBzYW1lIElQL1BPUlQgd2hlbiB0aGUgSG9zdDoKKyMgaGVhZGVyIGRvZXNuJ3QgbWF0Y2ggYW55IG5hbWUgb24gYW55IEhvc3QKKyMgVGhpcyBpcyBvZnRlbiBuaWNlIGluIHRlc3RpbmcgZW52aXJvbm1lbnRzIGJ1dCBub3QKKyMgYWNjZXB0YWJsZSBpbiByZWFsIGxpdmUgaG9zdGluZyBzY2VuYXJpb3MKKworcGlja19maXJzdF92aXJ0aG9zdF9vbl9ub21hdGNoID0gdHJ1ZQorCisKKyMgQWxsIHVuaWNlcyBhcmUgYnJva2VuIHNpbmNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGJpbmQgdG8KKyMgYSBwcml2aWxlZ2VkIHBvcnQgKDwgMTAyNCkgdW5sZXNzIHVpZD09MAorIyBUaGVyZSBpcyBhIGNvbnRyaWIgaW4ganVuZ2VybCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSBieSBtZWFucyAKKyMgb2YgYW4gZXh0ZXJuYWwgc2V0dWlkIHJvb3QgcHJvZ3JhbW0gY2FsbGVkIGZkc3J2IHRvIGxpc3RlbiB0bworIyB0byBwcml2aWxlZ2VkIHBvcnQuCisjIElmIHdlIHVzZSB0aGlzIGZlYXR1cmUsIGl0IHJlcXVpcmVzIGZkc3J2IHRvIGJlIHByb3Blcmx5IGluc3RhbGxlZC4KKyMgRG9lc24ndCB5ZXQgd29yayB3aXRoIFNTTC4KKwordXNlX2Zkc3J2ID0gZmFsc2UKKworCisKKworIyBlbmQgdGhlbiBhIHNldCBvZiB2aXJ0dWFsIHNlcnZlcnMKKyMgRmlyc3QgdHdvIHZpcnRob3N0ZWQgc2VydmVycyBvbiB0aGUgc2FtZSBJUCAoMC4wLjAuMCkKKyMgaW4gdGhpcyBjYXNlLCBidXQgYW4gZXhwbGljaXQgSVAgY2FuIGJlIGdpdmVuIGFzIHdlbGwKKworPHNlcnZlciBjb3JlLm1hcnRpbmpsb2dhbi5jb20+CisJcG9ydCA9IDgwCisJbGlzdGVuID0gMC4wLjAuMAorCWRvY3Jvb3QgPSAvdmFyL3lhd3Mvd3d3CisJYXJnX3Jld3JpdGVfbW9kID0gcHdyX2FyZ19yZXdyaXRlX21vZAorCWFwcG1vZHMgPSA8cHdyLCBwd3JfbWFpbl9jb250cm9sbGVyX2FwcG1vZD4KKzwvc2VydmVyPgorCis8c2VydmVyIGxvY2FsaG9zdD4KKwlwb3J0ID0gODAKKwlsaXN0ZW4gPSAwLjAuMC4wCisJZG9jcm9vdCA9IC90bXAKKwlkaXJfbGlzdGluZ3MgPSB0cnVlCisJZGF2ID0gdHJ1ZQorCTxhdXRoPgorCQlyZWFsbSA9IGZvb2JhcgorCQlkaXIgPSAvCisJCXVzZXIgPSBmb286YmFyCisJCXVzZXIgPSBiYXo6YmFyCisJPC9hdXRoPgorPC9zZXJ2ZXI+CisKKworCisjIEFuZCB0aGVuIGFuIHNzbCBzZXJ2ZXIKKworPHNlcnZlciBjb3JlLm1hcnRpbmpsb2dhbi5jb20+CisJcG9ydCA9IDQ0MworCWRvY3Jvb3QgPSAvdG1wCisJbGlzdGVuID0gMC4wLjAuMAorCWRpcl9saXN0aW5ncyA9IHRydWUKKwk8c3NsPiAgCisJICAgICAgICBrZXlmaWxlID0gL3Vzci9sb2NhbC95YXdzL2V0Yy95YXdzLWtleS5wZW0KKwkgICAgICAgIGNlcnRmaWxlID0gL3Vzci9sb2NhbC95YXdzL2V0Yy95YXdzLWNlcnQucGVtCisJPC9zc2w+Cis8L3NlcnZlcj4KKwkJCQkKKwkKKworCisKKworCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi9yZW5hbWUuc2ggYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vcmVuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmMDc3YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vcmVuYW1lLnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9zaAorCitpZiBbICQjIC1lcSAzIF07IHRoZW4KKwlPTERfUFJFRklYPSQxCisJTkVXX1BSRUZJWD0kMgorCUZJTEVOQU1FPSQzCisJTkVXX0ZJTEVOQU1FPSQoZWNobyAkRklMRU5BTUUgfCBzZWQgLWUgInMvJE9MRF9QUkVGSVgvJE5FV19QUkVGSVgvIikKKwllY2hvICJtb3ZpbmcgJEZJTEVOQU1FIHRvICRORVdfRklMRU5BTUUiCisJbXYgJEZJTEVOQU1FICRORVdfRklMRU5BTUUKKwlleGl0IDA7CitmaQorCisKK2lmIFsgJCMgLWVxIDIgXTsgdGhlbgorCXdoaWxlIHJlYWQgbGluZTsgCisJZG8gCisJCU9MRF9QUkVGSVg9JDEKKwkJTkVXX1BSRUZJWD0kMgorCQlORVdfRklMRU5BTUU9JChlY2hvICR7bGluZX0gfCBzZWQgLWUgInMvJE9MRF9QUkVGSVgvJE5FV19QUkVGSVgvIikKKwkJZWNobyAibW92aW5nICR7bGluZX0gdG8gJE5FV19GSUxFTkFNRSIKKwkJbXYgJHtsaW5lfSAkTkVXX0ZJTEVOQU1FCisJZG9uZQorCWV4aXQgMAorZmkKKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy8uYXBwZ2VuL3N1YnN0aXR1dGUuc2ggYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vc3Vic3RpdHV0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MzA1Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3N1YnN0aXR1dGUuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKKworaWYgWyAkIyAtbHQgMiBdOyB0aGVuCisJZWNobyAidXNhZ2U6IHN1YnN0aXR1dGUuc2ggPHZhcmlhYmxlIHRvIHJlcGxhY2U+IDx2YWx1ZSB0byByZXBsYWNlIHdpdGg+IDxmaWxlbmFtZSB8IFNURElOPiIKKwlleGl0IDEKK2ZpCisKK2lmIFsgJCMgLWVxIDMgXTsgdGhlbgorCVZBUklBQkxFPSQxCisJVkFMVUU9JDIKKwlGSUxFTkFNRT0kMworCQorCWVjaG8gInJlcGxhY2luZyAkVkFSSUFCTEUgd2l0aCAkVkFMVUUgaW4gJEZJTEVOQU1FIgorCXNlZCAtZSAicy8kVkFSSUFCTEUvJFZBTFVFLyIgJEZJTEVOQU1FID4gIiRGSUxFTkFNRSJfdG1wIAorCW12ICIkRklMRU5BTUUiX3RtcCAkRklMRU5BTUUKKwlleGl0IDAKK2ZpCisKK2lmIFsgJCMgLWVxIDIgXTsgdGhlbgorICAgIHdoaWxlIHJlYWQgbGluZTsgCisgICAgZG8KKwkJVkFSSUFCTEU9JDEKKwkJVkFMVUU9JDIKKwkJRklMRU5BTUU9JHtsaW5lfQorCQorCQllY2hvICJyZXBsYWNpbmcgJFZBUklBQkxFIHdpdGggJFZBTFVFIGluICRGSUxFTkFNRSIKKwkJc2VkIC1lICJzLyRWQVJJQUJMRS8kVkFMVUUvIiAkRklMRU5BTUUgPiAiJEZJTEVOQU1FIl90bXAgCisJCW12ICIkRklMRU5BTUUiX3RtcCAkRklMRU5BTUUKKyAgICBkb25lCisgICAgZXhpdCAwCitmaQorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vdGhyaWZ0X3JlbC9NYWtlZmlsZSBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkMzU5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vdGhyaWZ0X3JlbC9NYWtlZmlsZQpAQCAtMCwwICsxLDI5OCBAQAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1ha2UgZmlsZSBmb3IgY3JlYXRpbmcgYW4gb3RwIHJlbGVhc2UuIAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIEJhc2VuYW1lIG9mIHRoaXMgcmVsZWFzZS4KKyMjCitSRUxTPSQoc2hlbGwgYmFzZW5hbWUgYHB3ZGApCitBUFBfTkFNRT0kKHNoZWxsIGVjaG8gJChSRUxTKSB8IHNlZCBzL19yZWwkJC8vKQorCitpbmNsdWRlIC4uLy4uL2J1aWxkL290cC5taworCitpbmNsdWRlIC4vdnNuLm1rCisKKyNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS90YXJnZXQubWsKKyNpbmNsdWRlICQoRVJMX1RPUCkvbWFrZS8kKFRBUkdFVCkvb3RwLm1rCisKK1VTUl9MSUJQQVRIPS4uLy4uL2xpYgorSU5TVEFMTF9ESVI9L3Vzci9sb2NhbC9saWIKK0FCU19VU0VSX0xJQlBBVEg9JChzaGVsbCBjZCAuLi8uLi9saWI7cHdkKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ1JFQVRFIERJUiBTVFJVQ1RVUkUgSEVSRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hURE9DUz0kKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyouaHRtbCkgXAorCSQod2lsZGNhcmQgJChBQlNfVVNFUl9MSUJQQVRIKS8kKEFQUF9OQU1FKS9odGRvY3MvKi5odG0pIFwKKwkkKHdpbGRjYXJkICQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzLyoueWF3cykKK0JVSUxEX0ZJTEVTPWZzX2Jvb3Rfc21pdGhlLmJlYW0gZnNfbGlzdHMuYmVhbSBmc19saWIuYmVhbQorCitMT0NBTF9ESVI9bG9jYWwKKyNMT0NBTF9ESVI9JChzaGVsbCBjYXQgJChSRUxTKS5yZWwuc3JjIHxncmVwIC1tIDEgJyQoQVBQX05BTUUpJyB8YXdrIC1GICciJyAne3ByaW50ZiAiJXMtJXMiLCAkJDIsJCQ0fScpCisKK0RJUl9TVFJVQ1RVUkU9IFwKKwkkKExPQ0FMX0RJUikgXAorCSQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKSBcCisJJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pIFwKKwkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYgXAorCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvaHRkb2NzIAorCitQUk9EVUNUSU9OX0RJUl9TVFJVQ1RVUkU9IFwKKwkkKFJFTFMpIFwKKwkkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKSBcCisJJChSRUxTKS9zdGFnZSBcCisJJChSRUxTKS9sb2cvJChSRUxfVlNOKSBcCisJJChSRUxTKS92YXIvJChSRUxfVlNOKSBcCisJJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cgXAorCSQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcyBcCisJJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NDUklQVF9BTkRfQk9PVF9GSUxFUz0gXAorCSQoUkVMUykuc2NyaXB0IFwKKwkkKFJFTFMpLmJvb3QKKworTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTPSBcCisJJChMT0NBTF9ESVIpLyQoUkVMUykuc2NyaXB0IFwKKwkkKExPQ0FMX0RJUikvJChSRUxTKS5ib290CisKK0xPQ0FMX0hUVFBfQ09ORj0gXAorCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi95YXdzLmNvbmYgXAorCSQoTE9DQUxfRElSKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzICAKKworUFJPRFVDVElPTl9IVFRQX0NPTkY9IFwKKwkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mIFwKKwkkKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlcyAgCisKK0xPQ0FMX1RBUkdFVF9GSUxFUz0kKExPQ0FMX0hUVFBfQ09ORikgJChMT0NBTF9ESVIpLyQoUkVMUykuY29uZmlnICQoTE9DQUxfU0NSSVBUX0FORF9CT09UX0ZJTEVTKQorCitMT0NBTF9UQVJHRVRTPSQoTE9DQUxfRElSKS8kKFJFTFMpLnNoIHZzbml0ICQoTE9DQUxfVEFSR0VUX0ZJTEVTKSAKKworUFJPRFVDVElPTl9UQVJHRVRTPSQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCisJICAgICAgICAgICAkKFJFTFMpL2xpYiBcCisgICAgICAgICAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmMgXAorCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLmNvbmZpZy5zcmMgXAorCSAgICAgICAgICAgJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjIFwKKwkJICAgJChSRUxTKS9zdGFnZS8kKFJFTFMpLnNoLnNyYyAgXAorCQkgICAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3MgXAorCQkgICAkKFJFTFMpL2luc3RhbGwuc2ggXAorCQkgICAkKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlIAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVEFSR0VUUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FsbCBkZWJ1ZyBvcHQgaW5zdHIgc2NyaXB0OiAgJChESVJfU1RSVUNUVVJFKSAkKExPQ0FMX1RBUkdFVFMpICQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKSAkKFBST0RVQ1RJT05fVEFSR0VUUykKKwlAZWNobyAkKEhURE9DUykKKworaW5zdGFsbDogIHN0YWdlCisKK3RhcjogJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnegorCiskKERJUl9TVFJVQ1RVUkUpOgorCW1rZGlyIC1wICRACisKKyQoUFJPRFVDVElPTl9ESVJfU1RSVUNUVVJFKToKKwlta2RpciAtcCAkQAorCQorY2xlYW46CisJJChSTSkgJChSRUxfU0NSSVBUUykgJChUQVJHRVRfRklMRVMpCisJJChSTSkgLXIgJChMT0NBTF9ESVIpICQoUFJPRE5fRElSKQorCSQoUk0pICQoUkVMUykucmVsCisJJChSTSkgLXIgJChSRUxTKQorCSQoUk0pICQoUkVMUykqLnRnegorCSQoUk0pICQoUkVMUykucmVsLnNyYy50bXAKKwkkKFJNKSAkKFNDUklQVF9BTkRfQk9PVF9GSUxFUykKKworZG9jczoKKwkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUQVJHRVRTIEZPUiBMT0NBTCBNT0RFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBzdGFydHVwIHNjcmlwdCBmb3IgbG9jYWwgbW9kZQorJChMT0NBTF9ESVIpLyQoUkVMUykuc2g6IAorCUBlY2hvICcjIS9iaW4vc2gnID4gJEAKKwlAZWNobyAiY2QgJChDVVJESVIpLyQoTE9DQUxfRElSKSIgPj4gJEAKKwlAZWNobyAiZXJsIC1uYW1lICQke1VTRVJ9XyQoUkVMUykgLWJvb3QgJChSRUxTKSAtY29uZmlnICQoUkVMUykuY29uZmlnIFwkJEAiID4+ICRACisJY2htb2QgK3ggJEAKKwlAZWNobworCUBlY2hvICI9PT09IFN0YXJ0IGxvY2FsIG5vZGUgd2l0aCBcInNoICRAXCIgPT09PSIKKwlAZWNobworCisjIENyZWF0ZSB0aGUgY29uZmlnIGZpbGUgZm9yIGxvY2FsIG1vZGUuCiskKExPQ0FMX0RJUikvJChSRUxTKS5jb25maWc6ICQoUkVMUykuY29uZmlnLnNyYworCXNlZCAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKKwkgICAgLWUgJ3M7JVZBUl9PVFAlOyQoQ1VSRElSKS8kKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTik7JyBcCisgICAgICAgICAgICAtZSAnczslUkVMUyU7JChSRUxTKTtnJyBcCisgICAgICAgICAgICAtZSAnczslSE9NRSU7JChIT01FKTtnJyBcCisgICAgICAgICAgICAtZSAnczslQlJPQURDQVNUX0FERFJFU1MlOyQoQlJPQURDQVNUX0FERFJFU1MpO2cnIFwKKyAgICAgICAgICAgIC1lICdzOyVDT05UQUNUX05PREUlOyQoQ09OVEFDVF9OT0RFKTtnJyBcCisJICAgIC1lICJzOyVIT1NUTkFNRSU7YGhvc3RuYW1lIC0tbG9uZ2A7IiBcCisgICAgICAgICAgICAtZSAnczslQVBQX05BTUUlOyQoQVBQX05BTUUpOycgXAorCSAgICAtZSAnczslQVBQX1ZFUlNJT04lOyQoQVBQX1ZFUlNJT04pO2cnIFwKKyAgICAgICAgICAgICAkPCA+ICRACisKKyMgQ3JlYXRlIHRoZSBodHRwZCBjb25mIGZpbGUgZm9yIGxvY2FsIG1vZGUuCiskKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYveWF3cy5jb25mOiB5YXdzLmNvbmYuc3JjCisJc2VkIC1lICdzOyVWQVJfT1RQJTskKENVUkRJUikvJChMT0NBTF9ESVIpL3Zhci8kKFJFTF9WU04pOycgXAorCSAgICAtZSAnczslTE9HX09UUCU7JChDVVJESVIpLyQoTE9DQUxfRElSKS9sb2cvJChSRUxfVlNOKTsnIFwKKwkgICAgLWUgJ3M7JUhURE9DX1JPT1QlOyQoQUJTX1VTRVJfTElCUEFUSCkvJChBUFBfTkFNRSkvaHRkb2NzOycgXAorICAgICAgICAgICAgLWUgJ3M7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTsnIFwKKyAgICAgICAgICAgIC1lICdzOyVSRUxTJTskKFJFTFMpOycgXAorICAgICAgICAgICAgLWUgJ3M7JVVTRVIlOyQoVVNFUik7JyBcCisJICAgIC1lICdzOyVIVERPQ19ST09UJTskKEFCU19VU0VSX0xJQlBBVEgpOycgXAorICAgICAgICAgICAgLWUgJ3M7JU1IT1NUJTskKE1IT1NUKTsnIFwKKyAgICAgICAgICAgICQ8ID4gJEAKKworIyBDcmVhdGUgdGhlIGNvbmZpZyBmaWxlIGZvciBsb2NhbCBtb2RlLgordnNuaXQ6ICQoUkVMUykucmVsLnNyYyAKKwlzZWQgLWUgJ3M7JVJFTF9WU04lOyQoUkVMX1ZTTik7JyBcCisJICAgICAgICQ8ID4gJDwudG1wCisKKyMgQ3JlYXRlIGFuZCBwb3NpdGlvbiBzY3JpcHQgYW5kIGJvb3QgZmlsZXMgZm9yIGxvY2FsIG1vZGUuCiskKExPQ0FMX1NDUklQVF9BTkRfQk9PVF9GSUxFUyk6IAorCUAgZXJsIC1weiAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluIFwKKwkgICAgICAtbm9zaGVsbCBcCisJICAgICAgLXMgZnNfbGliIHNfYXBwbHkgZnNfYm9vdF9zbWl0aGUgbWFrZV9zY3JpcHRfYW5kX2Jvb3QgIltcIiQoRVJMX1JVTl9UT1ApLypcIiwgIFwiJChVU1JfTElCUEFUSClcIl0uICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkJChiYXNlbmFtZSBgcHdkYCkiLnJlbC5zcmMudG1wXCIuICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltsb2NhbF0uICIgXAorCSAgICAgIC1zIGluaXQgc3RvcAorCWNwICQoU0NSSVBUX0FORF9CT09UX0ZJTEVTKSAkKExPQ0FMX0RJUikvIAorCiskKExPQ0FMX0RJUikvdmFyLyQoUkVMX1ZTTikvd3d3L2NvbmYvbWltZS50eXBlczogLi4vLi4vYnVpbGQvbWltZS50eXBlcworCWNwICQ8ICRACisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUQVJHRVRTIEZPUiBQUk9EVUNUSU9OIE1PREUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJChSRUxTKS9saWI6IAorCSMgRm9yIHNvbWUgcmVhc29uIHRoaXMgd2lsbCBub3QgaGFwcGVuIGlmIGFkZGVkIHRvIFBST0RVQ1RJT05fRElSX1NUUlVDVFVSRQorCW1rZGlyICRACisJQCBlcmwgLXB6ICQoUkVMUykvYnVpbGQvJChSRUxfVlNOKSBcCisJICAgICAgLW5vc2hlbGwgXAorCSAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIHN0YWdlX2Zyb21fcmVsc3JjICJbXCIkKFVTUl9MSUJQQVRIKVwiXS4gIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiJCQoYmFzZW5hbWUgYHB3ZGApIi5yZWwuc3JjXCIuICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiRAXCIiLiAiIFwKKwkgICAgICAtcyBpbml0IHN0b3AKKworIyBNb3ZlIHRoZSBodGRvY3MgZnJvbSB0aGUgbG9jYWwgYXBwcyB0byB0aGUgcHJvZHVjdGlvbiBodGRvYyByb290IGRpcmVjdG9yeS4KKyQoUkVMUykvdmFyLyQoUkVMX1ZTTikvd3d3L2h0ZG9jcy86ICQoSFRET0NTKQorCUBta2RpciAtcCAkKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7IFwKKwlmb3IgeCBpbiAkKEhURE9DUyk7ZG8gXAorIAkJY3AgICQkeCAkQDsgXAorCWRvbmUKKworIyBzdGFydHVwIHNjcmlwdCBmb3IgcHJvZHVjdGlvbiBtb2RlCiskKFJFTFMpL3N0YWdlLyQoUkVMUykuc2guc3JjOiAKKwlAZWNobyAnIyEvYmluL3NoJyA+ICRACisJQGVjaG8gImNkICVJTlNUQUxMX0RJUiUvJChSRUxTKS9yZWxlYXNlLyQoUkVMX1ZTTikiID4+ICRACisJQGVjaG8gImVybCAtbmFtZSAkKFJFTFMpIC1ib290ICQoUkVMUykgLWNvbmZpZyAkKFJFTFMpLmNvbmZpZyAtZGV0YWNoZWQgXCQkQCIgPj4gJEAKKwljaG1vZCAreCAkQAorCiskKFJFTFMpL2J1aWxkLyQoUkVMX1ZTTik6ICAkKFVTUl9MSUJQQVRIKS9mc2xpYi9lYmluCisJbWtkaXIgLXAgJChSRUxTKS9idWlsZC8kKFJFTF9WU04pIAorCWNwICQ8L2ZzX2Jvb3Rfc21pdGhlLmJlYW0gJEAKKwljcCAkPC9mc19saWIuYmVhbSAkQAorCWNwICQ8L2ZzX2xpc3RzLmJlYW0gJEAKKworJChSRUxTKS9zdGFnZS8kKFJFTFMpLnJlbC5zcmM6ICQoUkVMUykucmVsLnNyYy50bXAKKwljcCAkPCAkQAorCiskKFJFTFMpL3N0YWdlLyQoUkVMUykuY29uZmlnLnNyYzogJChSRUxTKS5jb25maWcuc3JjCisJY3AgJDwgJEAKKworJChSRUxTKS9zdGFnZS95YXdzLmNvbmYuc3JjOiB5YXdzLmNvbmYuc3JjCisJY3AgJDwgJEAKKworJChSRUxTKS9pbnN0YWxsLnNoOiAKKwlAZWNobyAnIyEvYmluL3NoJyA+ICRACisJQGVjaG8gIiIgPj4gJEAKKwlAZWNobyAiaWYgWyBcJCQjIC1lcSAxIF07dGhlbiIgPj4gJEAKKwlAZWNobyAiICAgIElOU1RBTExfRElSPVwkJDE7IiA+PiAkQAorCUBlY2hvICJlbHNlIiA+PiAkQAorCUBlY2hvICIgICAgSU5TVEFMTF9ESVI9JChJTlNUQUxMX0RJUik7IiA+PiAkQAorCUBlY2hvICJmaSIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJmdW5jdGlvbiBtdW5nZSgpIHsiID4+ICRACisJQGVjaG8gIiAgICBzZWQgLWUgXCJzOyVMT0dfT1RQJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2xvZy8kKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JVZBUl9PVFAlO1wkJElOU1RBTExfRElSLyQoUkVMUykvdmFyLyQoUkVMX1ZTTik7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICIgICAgICAgIC1lIFwiczslUkVMUyU7JChSRUxTKTtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVSRUxfVlNOJTskKFJFTF9WU04pO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JVVTRVIlOyQkVVNFUjtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVIVERPQ19ST09UJTtcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL3Zhci8kKFJFTF9WU04pL3d3dy9odGRvY3M7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICIgICAgICAgIC1lIFwiczslTUhPU1QlO1xgaG9zdG5hbWVcYDtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVCUk9BRENBU1RfQUREUkVTUyU7JChCUk9BRENBU1RfQUREUkVTUyk7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICIgICAgICAgIC1lIFwiczslSU5TVEFMTF9ESVIlO1wkJElOU1RBTExfRElSO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JUNPTlRBQ1RfTk9ERSU7JChDT05UQUNUX05PREUpO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JUhPU1ROQU1FJTtcYGhvc3RuYW1lIC0tbG9uZ1xgO2dcIiBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgICAtZSBcInM7JUFQUF9OQU1FJTskKEFQUF9OQU1FKTtnXCIgXFwiID4+ICRACisJQGVjaG8gIiAgICAgICAgLWUgXCJzOyVBUFBfVkVSU0lPTiU7JChBUFBfVkVSU0lPTik7Z1wiIFxcIiA+PiAkQAorCUBlY2hvICcgICAgICAgICQkMSA+ICQkMicgPj4gJEAKKwlAZWNobyAifSIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJtdW5nZSBzdGFnZS95YXdzLmNvbmYuc3JjIHZhci8kKFJFTF9WU04pL3d3dy9jb25mL3lhd3MuY29uZjsiID4+ICRACisJQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykuY29uZmlnLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5jb25maWc7IiA+PiAkQAorCUBlY2hvICJtdW5nZSBzdGFnZS8kKFJFTFMpLnNoLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACisJQGVjaG8gIm11bmdlIHN0YWdlLyQoUkVMUykucmVsLnNyYyByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5yZWw7IiA+PiAkQAorCUBlY2hvICJjaG1vZCAreCByZWxlYXNlLyQoUkVMX1ZTTikvJChSRUxTKS5zaDsiID4+ICRACisJQGVjaG8gIiIgPj4gJEAKKwlAZWNobyAiY2QgLi47IiA+PiAkQAorCUBlY2hvICJmaW5kICQoUkVMUykgfCBjcGlvIC1vID4gXCQkSU5TVEFMTF9ESVIvJChSRUxTKS5jcGlvOyIgPj4gJEAKKwlAZWNobyAiY2QgLTsiID4+ICRACisJQGVjaG8gImNkIFwkJElOU1RBTExfRElSOyAiID4+ICRACisJQGVjaG8gImVjaG8gLW4gXCJVbnBhY2tlZDogXCIiID4+ICRACisJQGVjaG8gImNwaW8gLXVpZCA8ICQoUkVMUykuY3BpbzsiID4+ICRACisJQGVjaG8gInJtICQoUkVMUykuY3BpbzsiID4+ICRACisJQGVjaG8gIiIgPj4gJEAKKwlAZWNobyAiZWNobyBcInB3ZCBpcyBcYHB3ZFxgXCI7IiA+PiAkQAorCUBlY2hvICJjZCAkKFJFTFMpOyIgPj4gJEAKKwlAZWNobyAiIGVybCAtcHogYnVpbGQvJChSRUxfVlNOKSBcXCIgPj4gJEAKKwlAZWNobyAiICAgICAgLW5vc2hlbGwgXFwiID4+ICRACisJQGVjaG8gLW4gIiAgICAgIC1zIGZzX2xpYiBzX2FwcGx5IGZzX2Jvb3Rfc21pdGhlIG1ha2Vfc2NyaXB0X2FuZF9ib290IFwiW1xcXCIkKEVSTF9SVU5fVE9QKS8qXFxcIiwgIFxcXCJsaWIvXFxcIl0uIFwiICIgPj4gJEAKKwlAZWNobyAtbiAgICAgICAgIlwiXFxcInN0YWdlLyQkKGJhc2VuYW1lIGBwd2RgKS5yZWwuc3JjXFxcIi4gXCIgIiA+PiAkQAorCUBlY2hvIC1uICAgICAgICAiXCJbbG9jYWxdLiBcIiAiID4+ICRACisJQGVjaG8gICAgICAgICAgICItcyBpbml0IHN0b3AgfCBlZ3JlcCAnKnRlcm1pbmF0ZSp8RVJST1InIiA+PiAkQAorCUBlY2hvICJpZiBbIFwkJD8gLWVxIDAgXTsgdGhlbiIgPj4gJEAKKwlAZWNobyAiZWNobyBcIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XCI7IiA+PiAkQAorCUBlY2hvICJlY2hvIFwiU1RBR0UgRkFJTFVSRSBcJCQ/ICAtIFNpbGVuY2UgdGhlIGRpc2NvcmQuXCI7IiA+PiAkQAorCUBlY2hvICJlY2hvIFwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cIjsiID4+ICRACisJQGVjaG8gImV4aXQgMTsiID4+ICRACisJQGVjaG8gImZpIiA+PiAkQAorCUBlY2hvICIiID4+ICRACisJQGVjaG8gIm12ICQoUkVMUykucmVsICQoUkVMUykuc2NyaXB0ICQoUkVMUykuYm9vdCByZWxlYXNlLyQoUkVMX1ZTTik7IiA+PiAkQAorCUBlY2hvICIiID4+ICRACisJQGVjaG8gInJtIC1yIHN0YWdlOyIgPj4gJEAKKwlAZWNobyAicm0gLXIgYnVpbGQ7IiA+PiAkQAorCUBlY2hvICJjZCAtOyIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJjaGdycCAtUiBlcnRzICQoUkVMUyk7ICIgPj4gJEAKKwlAZWNobyAiY2htb2QgLVIgNzc1ICQoUkVMUyk7ICIgPj4gJEAKKwlAZWNobyAiY2QgLSIgPj4gJEAKKwlAZWNobyAiIiA+PiAkQAorCUBlY2hvICJybSAtZiAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsiID4+ICRACisJQGVjaG8gImxuIC1zIFwkJElOU1RBTExfRElSLyQoUkVMUykvcmVsZWFzZS8kKFJFTF9WU04pLyQoUkVMUykuc2ggL3Vzci9sb2NhbC9iaW4vJChBUFBfTkFNRSk7IiA+PiAkQAorCUBlY2hvICJjaGdycCAtUiBlcnRzIC91c3IvbG9jYWwvYmluLyQoQVBQX05BTUUpOyAiID4+ICRACisJQGVjaG8gImNobW9kIC1SIDc3NSAvdXNyL2xvY2FsL2Jpbi8kKEFQUF9OQU1FKTsgIiA+PiAkQAorCUBlY2hvICJybSBcJCRJTlNUQUxMX0RJUi8kKFJFTFMpL2luc3RhbGwuc2g7IiA+PiAkQAorCUBlY2hvICJlY2hvIC1uICQkJ1xlWzA7MzJtJyIgPj4gJEAKKwlAZWNobyAiZWNobyBcIiQoQVBQX05BTUUpIGluc3RhbGxhdGlvbiB0byBcJCRJTlNUQUxMX0RJUiBjb21wbGV0ZS5cIiIgPj4gJEAKKwlAZWNobyAiZWNobyAtbiAkJCdcZVswbSciID4+ICRACisJY2htb2QgK3ggJEAKKwkJCisKK3N0YWdlOiAkKFJFTFMpCisJY2QgJChSRUxTKTsgXAorCS4vaW5zdGFsbC5zaDsgXAorCWNkIC0KKworJChSRUxTKS92YXIvJChSRUxfVlNOKS93d3cvY29uZi9taW1lLnR5cGVzOiAuLi8uLi9idWlsZC9taW1lLnR5cGVzCisJY3AgJDwgJEAKKworJChSRUxTKS0kKExPQ0FUSU9OKS0kKFJFTF9WU04pLnRnejogJChSRUxTKQorCXRhciAtemN2ZiAkQCAkPAorCiskKFJFTFMpL3JlbGVhc2UvJChSRUxfVlNOKS9jbGVhbl9yZWxlYXNlOiAuLi8uLi90b29scy91dGlsaXRpZXMvY2xlYW5fcmVsZWFzZQorCWNwICQ8ICRACisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3RocmlmdF9yZWwuY29uZmlnLnNyYyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3RocmlmdF9yZWwuY29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzAxYzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5jb25maWcuc3JjCkBAIC0wLDAgKzEsMjYgQEAKKyUlJSAtKi0gbW9kZTplcmxhbmcgLSotCislJSUgUGFyYW1ldGVyIHNldHRpbmdzIGZvciBhcHBzIG9uICVBUFBfTkFNRSUKKyUlJSBXYXJuaW5nIC0gdGhpcyBjb25maWcgZmlsZSAqbXVzdCogZW5kIHdpdGggPGRvdD48d2hpdGVzcGFjZT4KKworJSUgd3JpdGUgbG9nIGZpbGVzIHRvIHNhc2xfZGlyCitbCisge3Nhc2wsCisgIFsKKyAgIHtzYXNsX2Vycm9yX2xvZ2dlciwge2ZpbGUsICIlTE9HX09UUCUvc2FzbF9sb2cifX0KKyAgXX0sCisKKworIHtnYXMsCisgIFsKKyAgIHttb2Rfc3BlY3MsIFt7ZWx3cmFwLCB7ZnNfZWx3cmFwX2gsIHN0YXJ0X2xpbmt9fV19LAorCisgICAlIGVsd3JhcCBjb25maWcuCisgICB7ZXJyX2xvZywgIiVMT0dfT1RQJS9lcnJfbG9nIn0sCisgICB7ZXJyX2xvZ193cmFwX2luZm8sIHt7ZXJyLDUwMDAwMDAsMTB9LHtzYXNsLDUwMDAwMDAsMTB9fX0sIAorICAge2Vycl9sb2dfdHR5LCB0cnVlfSAlIExvZyB0byB0aGUgc2NyZWVuCisgICBdfSwKKworIHslQVBQX05BTUUlLAorICBbCisgIF19CitdLiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3RocmlmdF9yZWwucmVsLnNyYyBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3RocmlmdF9yZWwucmVsLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTFkMjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwvdGhyaWZ0X3JlbC5yZWwuc3JjCkBAIC0wLDAgKzEsMTQgQEAKKyUlJSAtKi0gbW9kZTplcmxhbmcgLSotCit7cmVsZWFzZSwgCisgeyJ0aHJpZnRfcmVsIiwgIiVSRUxfVlNOJSJ9LAorIGVydHMsCisgWworICBrZXJuZWwsCisgIHN0ZGxpYiwKKyAgc2FzbCwKKyAgZnNsaWIsCisgIGdhcywKKyAgdGhyaWZ0CisgXQorfS4gCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3Zzbi5tayBiL2xpYi9lcmwvdG9vbHMvLmFwcGdlbi90aHJpZnRfcmVsL3Zzbi5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWM4ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwvdnNuLm1rCkBAIC0wLDAgKzEgQEAKK1JFTF9WU049MS4wCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzLy5hcHBnZW4vdGhyaWZ0X3JlbC95YXdzLmNvbmYuc3JjIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwveWF3cy5jb25mLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU3YWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy8uYXBwZ2VuL3RocmlmdF9yZWwveWF3cy5jb25mLnNyYwpAQCAtMCwwICsxLDE2NiBAQAorCisjIGNvbmYgZm9yIHlhd3MKKworCisjIGZpcnN0IHdlIGhhdmUgYSBzZXQgb2YgZ2xvYmFscworIyBUaGF0IGFwcGx5IHRvIGFsbCB2aXJ0dWFsIHNlcnZlcnMKKworCisjIFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSBhbGwgbG9nZmlsZXMgZm9yCisjIGFsbCB2aXJ0dWFsIHNlcnZlcnMgd2lsbCBiZSB3cml0dGVuCisKK2xvZ2RpciA9IC92YXIvbG9nL3lhd3MKKworIyBUaGlzIHRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoZXJlIGFkZGl0aW9uYWwKKyMgYmVhbSBjb2RlIGNhbiBiZSBwbGFjZWQuIFRoZSBkYWVtb24gd2lsbCBhZGQgdGhpcworIyBkaXJlY3RvcnkgdG8gaXRzIHNlYXJjaCBwYXRoCisKK2ViaW5fZGlyID0gL3Zhci95YXdzL2ViaW4KKworCisjIFRoaXMgaXMgYSBkaXJlY3Rvcnkgd2hlcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgLmhybAorIyBmaWxlcyBjYW4gYmUgcGxhY2VkLiBhcHBsaWNhdGlvbiBzcGVjaWZpZyAueWF3cyBjb2RlIGNhbgorIyB0aGVuIGluY2x1ZGUgdGhlc2UgLmhybCBmaWxlcworCitpbmNsdWRlX2RpciA9IC92YXIveWF3cy9pbmNsdWRlCisKKworCisKKworIyBUaGlzIGlzIGEgZGVidWcgdmFyaWFibGUsIHBvc3NpYmxlIHZhbHVlcyBhcmUgaHR0cCB8IHRyYWZmaWMgfCBmYWxzZQorIyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNldCB0aGUgdHJhY2UgKHBvc3NpYmx5IHRvIHRoZSB0dHkpIHdoaWxlCisjIGludm9raW5nIHlhd3MgZnJvbSB0aGUgc2hlbGwgYXMgaW4KKyMgeWF3cyAtaSAtVCAteCAoc2VlIG1hbiB5YXdzKQorCit0cmFjZSA9IGZhbHNlCisKKworCisKKworIyBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIHlhd3Mgc3RhcnQgYWRkaXRpb25hbCAKKyMgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSBhdCBzdGFydHVwCisjIAorIyBydW5tb2QgPSBteW1vZHVsZQorCisKKyMgQnkgZGVmYXVsdCB5YXdzIHdpbGwgY29weSB0aGUgZXJsYW5nIGVycm9yX2xvZyBhbmQKKyMgZW5kIHdyaXRlIGl0IHRvIGEgd3JhcCBsb2cgY2FsbGVkIHJlcG9ydC5sb2cgKGluIHRoZSBsb2dkaXIpCisjIHRoaXMgZmVhdHVyZSBjYW4gYmUgdHVybmVkIG9mZi4gVGhpcyB3b3VsZCB0eXBpY2FsbHkKKyMgYmUgdGhlIGNhc2Ugd2hlbiB5YXdzIHJ1bnMgd2l0aGluIGFub3RoZXIgbGFyZ2VyIGFwcAorCitjb3B5X2Vycm9yX2xvZyA9IHRydWUKKworCisjIExvZ3MgYXJlIHdyYXAgbG9ncworCitsb2dfd3JhcF9zaXplID0gMTAwMDAwMAorCisKKyMgUG9zc2libHkgcmVzb2x2ZSBhbGwgaG9zdG5hbWVzIGluIGxvZ2ZpbGVzIHNvIHdlYmFsaXplcgorIyBjYW4gcHJvZHVjZSB0aGUgbmljZSBnZW9ncmFwaHkgcGllY2hhcnQKKworbG9nX3Jlc29sdmVfaG9zdG5hbWUgPSBmYWxzZQorCisKKworIyBmYWlsIGNvbXBsZXRlbHkgb3Igbm90IGlmIHlhd3MgZmFpbHMgCisjIHRvIGJpbmQgYSBsaXN0ZW4gc29ja2V0CitmYWlsX29uX2JpbmRfZXJyID0gdHJ1ZQorCisKKworIyBJZiB5YXdzIGlzIHN0YXJ0ZWQgYXMgcm9vdCwgaXQgY2FuLCBvbmNlIGl0IGhhcyBvcGVuZWQKKyMgYWxsIHJlbGV2YW50IHNvY2tldHMgZm9yIGxpc3RlbmluZywgY2hhbmdlIHRoZSB1aWQgdG8gYSAKKyMgdXNlciB3aXRoIGxvd2VyIGFjY2Vzc3JpZ2h0cyB0aGFuIHJvb3QgCisKKyMgdXNlcm5hbWUgPSBub2JvZHkKKworCisjIElmIEhUVFAgYXV0aCBpcyB1c2VkLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3BlY2lmaWMKKyMgYXV0aCBsb2cuCisKK2F1dGhfbG9nID0gdHJ1ZQorCisKKyMgV2hlbiB3ZSdyZSBydW5uaW5nIG11bHRpcGxlIHlhd3Mgc3lzdGVtcyBvbiB0aGUgc2FtZSAKKyMgaG9zdCwgd2UgbmVlZCB0byBnaXZlIGVhY2ggeWF3cyBzeXN0ZW0gYW4gaW5kaXZpZHVhbAorIyBuYW1lLiBZYXdzIHdpbGwgd3JpdGUgYSBudW1iZXIgb2YgcnVudGltZSBmaWxlcyB1bmRlcgorIyAvdG1wL3lhd3MvJHtpZH0KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXMgImRlZmF1bHQiCisKKworIyBpZCA9IG15bmFtZQorCisKKyMgZWFybGllciB2ZXJzaW9ucyBvZiBZYXdzIHBpY2tlZCB0aGUgZmlyc3QgdmlydHVhbCBob3N0CisjIGluIGEgbGlzdCBvZiBob3N0cyB3aXRoIHRoZSBzYW1lIElQL1BPUlQgd2hlbiB0aGUgSG9zdDoKKyMgaGVhZGVyIGRvZXNuJ3QgbWF0Y2ggYW55IG5hbWUgb24gYW55IEhvc3QKKyMgVGhpcyBpcyBvZnRlbiBuaWNlIGluIHRlc3RpbmcgZW52aXJvbm1lbnRzIGJ1dCBub3QKKyMgYWNjZXB0YWJsZSBpbiByZWFsIGxpdmUgaG9zdGluZyBzY2VuYXJpb3MKKworcGlja19maXJzdF92aXJ0aG9zdF9vbl9ub21hdGNoID0gdHJ1ZQorCisKKyMgQWxsIHVuaWNlcyBhcmUgYnJva2VuIHNpbmNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGJpbmQgdG8KKyMgYSBwcml2aWxlZ2VkIHBvcnQgKDwgMTAyNCkgdW5sZXNzIHVpZD09MAorIyBUaGVyZSBpcyBhIGNvbnRyaWIgaW4ganVuZ2VybCB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSBieSBtZWFucyAKKyMgb2YgYW4gZXh0ZXJuYWwgc2V0dWlkIHJvb3QgcHJvZ3JhbW0gY2FsbGVkIGZkc3J2IHRvIGxpc3RlbiB0bworIyB0byBwcml2aWxlZ2VkIHBvcnQuCisjIElmIHdlIHVzZSB0aGlzIGZlYXR1cmUsIGl0IHJlcXVpcmVzIGZkc3J2IHRvIGJlIHByb3Blcmx5IGluc3RhbGxlZC4KKyMgRG9lc24ndCB5ZXQgd29yayB3aXRoIFNTTC4KKwordXNlX2Zkc3J2ID0gZmFsc2UKKworCisKKworIyBlbmQgdGhlbiBhIHNldCBvZiB2aXJ0dWFsIHNlcnZlcnMKKyMgRmlyc3QgdHdvIHZpcnRob3N0ZWQgc2VydmVycyBvbiB0aGUgc2FtZSBJUCAoMC4wLjAuMCkKKyMgaW4gdGhpcyBjYXNlLCBidXQgYW4gZXhwbGljaXQgSVAgY2FuIGJlIGdpdmVuIGFzIHdlbGwKKworPHNlcnZlciBjb3JlLm1hcnRpbmpsb2dhbi5jb20+CisJcG9ydCA9IDgwCisJbGlzdGVuID0gMC4wLjAuMAorCWRvY3Jvb3QgPSAvdmFyL3lhd3Mvd3d3CisJYXJnX3Jld3JpdGVfbW9kID0gcHdyX2FyZ19yZXdyaXRlX21vZAorCWFwcG1vZHMgPSA8cHdyLCBwd3JfbWFpbl9jb250cm9sbGVyX2FwcG1vZD4KKzwvc2VydmVyPgorCis8c2VydmVyIGxvY2FsaG9zdD4KKwlwb3J0ID0gODAKKwlsaXN0ZW4gPSAwLjAuMC4wCisJZG9jcm9vdCA9IC90bXAKKwlkaXJfbGlzdGluZ3MgPSB0cnVlCisJZGF2ID0gdHJ1ZQorCTxhdXRoPgorCQlyZWFsbSA9IGZvb2JhcgorCQlkaXIgPSAvCisJCXVzZXIgPSBmb286YmFyCisJCXVzZXIgPSBiYXo6YmFyCisJPC9hdXRoPgorPC9zZXJ2ZXI+CisKKworCisjIEFuZCB0aGVuIGFuIHNzbCBzZXJ2ZXIKKworPHNlcnZlciBjb3JlLm1hcnRpbmpsb2dhbi5jb20+CisJcG9ydCA9IDQ0MworCWRvY3Jvb3QgPSAvdG1wCisJbGlzdGVuID0gMC4wLjAuMAorCWRpcl9saXN0aW5ncyA9IHRydWUKKwk8c3NsPiAgCisJICAgICAgICBrZXlmaWxlID0gL3Vzci9sb2NhbC95YXdzL2V0Yy95YXdzLWtleS5wZW0KKwkgICAgICAgIGNlcnRmaWxlID0gL3Vzci9sb2NhbC95YXdzL2V0Yy95YXdzLWNlcnQucGVtCisJPC9zc2w+Cis8L3NlcnZlcj4KKwkJCQkKKwkKKworCisKKworCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvZW1hY3MvZXJsYW5nLXN0YXJ0LmVsIGIvbGliL2VybC90b29scy9lbWFjcy9lcmxhbmctc3RhcnQuZWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE4MWI5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdG9vbHMvZW1hY3MvZXJsYW5nLXN0YXJ0LmVsCkBAIC0wLDAgKzEsMTE1IEBACis7OyBlcmxhbmctc3RhcnQuZWwgLS0tIExvYWQgdGhpcyBmaWxlIHRvIGluaXRpYWxpemUgdGhlIEVybGFuZyBwYWNrYWdlLgorCis7OyBDb3B5cmlnaHQgKEMpIDE5OTggIEVyaWNzc29uIFRlbGVjb20gQUIKKworOzsgQXV0aG9yOiAgIEFuZGVycyBMaW5kZ3JlbgorOzsgVmVyc2lvbjogIDIuMworOzsgS2V5d29yZHM6IGVybGFuZywgbGFuZ3VhZ2VzLCBwcm9jZXNzZXMKKzs7IENyZWF0ZWQ6ICAxOTk2LTA5LTE4Cis7OyBEYXRlOiAgICAgMTk5OC0wMy0xNgorCis7OzsgQ29tbWVudGFyeToKKworOzsgSW50cm9kdWN0aW9uOgorOzsgLS0tLS0tLS0tLS0tCis7OworOzsgVGhpcyBwYWNrYWdlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSBFcmxhbmcuCis7OyBUaGUgcGFja2FnZSBwcm92aWRlcyBhbiBlZGl0aW5nIG1vZGUgd2l0aCBsb3RzIG9mIGJlbGxzIGFuZAorOzsgd2hpc3RsZXMsIGNvbXBpbGF0aW9uIHN1cHBvcnQsIGFuZCBpdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhlCis7OyB1c2VyIHRvIHN0YXJ0IEVybGFuZyBzaGVsbHMgdGhhdCBydW4gaW5zaWRlIEVtYWNzLgorOzsKKzs7IFNlZSB0aGUgRXJsYW5nIGRpc3RyaWJ1dGlvbiBmb3IgZnVsbCBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcGFja2FnZS4KKworOzsgSW5zdGFsbGF0aW9uOgorOzsgLS0tLS0tLS0tLS0tCis7OworOzsgUGxhY2UgdGhpcyBmaWxlIGluIEVtYWNzIGxvYWQgcGF0aCwgYnl0ZS1jb21waWxlIGl0LCBhbmQgYWRkIHRoZQorOzsgZm9sbG93aW5nIGxpbmUgdG8gdGhlIGFwcHJvcHJpYXRlIGluaXQgZmlsZToKKzs7Cis7OyAgICAocmVxdWlyZSAnZXJsYW5nLXN0YXJ0KQorOzsKKzs7IFRoZSBmdWxsIGRvY3VtZW50YXRpb24gY29udGFpbnMgbXVjaCBtb3JlIGV4dGVuc2l2ZSBkZXNjcmlwdGlvbiBvZgorOzsgdGhlIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUuCisKKzs7IFJlcG9ydGluZyBCdWdzOgorOzsgLS0tLS0tLS0tLS0tLS0KKzs7Cis7OyBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0byB0aGUgZm9sbG93aW5nIGVtYWlsIGFkZHJlc3M6Cis7OyAgICAgc3VwcG9ydEBlcmxhbmcuZXJpY3Nzb24uc2UKKzs7Cis7OyBQbGVhc2Ugc3RhdGUgYXMgZXhhY3RseSBhcyBwb3NzaWJsZToKKzs7ICAgIC0gVmVyc2lvbiBudW1iZXIgb2YgRXJsYW5nIE1vZGUgKHNlZSB0aGUgbWVudSksIEVtYWNzLCBFcmxhbmcsCis7OwlhbmQgb2YgYW55IG90aGVyIHJlbGV2YW50IHNvZnR3YXJlLgorOzsgICAgLSBXaGF0IHRoZSBleHBlY3RlZCByZXN1bHQgd2FzLgorOzsgICAgLSBXaGF0IHlvdSBkaWQsIHByZWZlcmFibHkgaW4gYSByZXBlYXRhYmxlIHN0ZXAtYnktc3RlcCBmb3JtLgorOzsgICAgLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSB1bmV4cGVjdGVkIHJlc3VsdC4KKzs7ICAgIC0gUmVsZXZhbnQgcGllY2VzIG9mIEVybGFuZyBjb2RlIGNhdXNpbmcgdGhlIHByb2JsZW0uCis7OyAgICAtIFBlcnNvbmFsIEVtYWNzIGN1c3RvbWlzYXRpb25zLCBpZiBhbnkuCis7OworOzsgU2hvdWxkIHRoZSBFbWFjcyBnZW5lcmF0ZSBhbiBlcnJvciwgcGxlYXNlIHNldCB0aGUgZW1hY3MgdmFyaWFibGUKKzs7IGBkZWJ1Zy1vbi1lcnJvcicgdG8gYHQnLiAgUmVwZWF0IHRoZSBlcnJvciBhbmQgZW5jbG9zZSB0aGUgZGVidWcKKzs7IGluZm9ybWF0aW9uIGluIHlvdXIgYnVnLXJlcG9ydC4KKzs7Cis7OyBUbyBzZXQgdGhlIHZhcmlhYmxlIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKzs7ICAgICBNLXggc2V0LXZhcmlhYmxlIFJFVCBkZWJ1Zy1vbi1lcnJvciBSRVQgdCBSRVQKKzs7OyBDb2RlOgorCis7OworOzsgRGVjbGFyZSBmdW5jdGlvbnMgaW4gImVybGFuZy5lbCIuCis7OworCisoYXV0b2xvYWQgJ2VybGFuZy1tb2RlICJlcmxhbmciICJNYWpvciBtb2RlIGZvciBlZGl0aW5nIEVybGFuZyBjb2RlLiIgdCkKKyhhdXRvbG9hZCAnZXJsYW5nLXZlcnNpb24gImVybGFuZyIgCisgICJSZXR1cm4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBFcmxhbmcgbW9kZS4iIHQpCisoYXV0b2xvYWQgJ2VybGFuZy1zaGVsbCAiZXJsYW5nIiAiU3RhcnQgYSBuZXcgRXJsYW5nIHNoZWxsLiIgdCkKKyhhdXRvbG9hZCAncnVuLWVybGFuZyAiZXJsYW5nIiAiU3RhcnQgYSBuZXcgRXJsYW5nIHNoZWxsLiIgdCkKKworKGF1dG9sb2FkICdlcmxhbmctY29tcGlsZSAiZXJsYW5nIgorICAiQ29tcGlsZSBFcmxhbmcgbW9kdWxlIGluIGN1cnJlbnQgYnVmZmVyLiIgdCkKKworKGF1dG9sb2FkICdlcmxhbmctbWFuLW1vZHVsZSAiZXJsYW5nIiAKKyAgIkZpbmQgbWFudWFsIHBhZ2UgZm9yIE1PRFVMRS4iIHQpCisoYXV0b2xvYWQgJ2VybGFuZy1tYW4tZnVuY3Rpb24gImVybGFuZyIKKyAgIkZpbmQgbWFudWFsIHBhZ2UgZm9yIE5BTUUsIHdoZXJlIE5BTUUgaXMgbW9kdWxlOmZ1bmN0aW9uLiIgdCkKKworKGF1dG9sb2FkICdlcmxhbmctZmluZC10YWcgImVybGFuZyIKKyAgIkxpa2UgYGZpbmQtdGFnJy4gIENhcGFibGUgb2YgcmV0cmVpdmluZyBFcmxhbmcgbW9kdWxlcy4iKQorKGF1dG9sb2FkICdlcmxhbmctZmluZC10YWctb3RoZXItd2luZG93ICJlcmxhbmciCisgICJMaWtlIGBmaW5kLXRhZy1vdGhlci13aW5kb3cnLiAgQ2FwYWJsZSBvZiByZXRyZWl2aW5nIEVybGFuZyBtb2R1bGVzLiIpCisKKworOzsKKzs7IEFzc29jaWF0ZSBmaWxlcyBleHRlbnNpb25zICIuZXJsIiBhbmQgIi5ocmwiIHdpdGggRXJsYW5nIG1vZGUuCis7OworCisobGV0ICgoYSAnKCJcXC5lcmxcXCciIC4gZXJsYW5nLW1vZGUpKQorICAgICAgKGIgJygiXFwuaHJsXFwnIiAuIGVybGFuZy1tb2RlKSkpCisgIChvciAoYXNzb2MgKGNhciBhKSBhdXRvLW1vZGUtYWxpc3QpCisgICAgICAoc2V0cSBhdXRvLW1vZGUtYWxpc3QgKGNvbnMgYSBhdXRvLW1vZGUtYWxpc3QpKSkKKyAgKG9yIChhc3NvYyAoY2FyIGIpIGF1dG8tbW9kZS1hbGlzdCkKKyAgICAgIChzZXRxIGF1dG8tbW9kZS1hbGlzdCAoY29ucyBiIGF1dG8tbW9kZS1hbGlzdCkpKSkKKworCis7OworOzsgSWdub3JlIGZpbGVzIGVuZGluZyBpbiAiLmphbSIsICIudmVlIiwgYW5kICIuYmVhbSIgd2hlbiBwZXJmb3JtaW5nCis7OyBmaWxlIGNvbXBsZXRpb24uCis7OworCisobGV0ICgoZXJsLWV4dCAnKCIuamFtIiAiLnZlZSIgIi5iZWFtIikpKQorICAod2hpbGUgZXJsLWV4dAorICAgIChsZXQgKChjaWUgY29tcGxldGlvbi1pZ25vcmVkLWV4dGVuc2lvbnMpKQorICAgICAgKHdoaWxlIChhbmQgY2llIChub3QgKHN0cmluZy1lcXVhbCAoY2FyIGNpZSkgKGNhciBlcmwtZXh0KSkpKQorCShzZXRxIGNpZSAoY2RyIGNpZSkpKQorICAgICAgKGlmIChudWxsIGNpZSkKKwkgIChzZXRxIGNvbXBsZXRpb24taWdub3JlZC1leHRlbnNpb25zCisJCShjb25zIChjYXIgZXJsLWV4dCkgY29tcGxldGlvbi1pZ25vcmVkLWV4dGVuc2lvbnMpKSkpCisgICAgKHNldHEgZXJsLWV4dCAoY2RyIGVybC1leHQpKSkpCisKKworOzsKKzs7IFRoZSBlbmQuCis7OworCisocHJvdmlkZSAnZXJsYW5nLXN0YXJ0KQorCis7OyBlcmxhbmctc3RhcnQuZWwgZW5kcyBoZXJlLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90b29scy9lbWFjcy9lcmxhbmcuZWwgYi9saWIvZXJsL3Rvb2xzL2VtYWNzL2VybGFuZy5lbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OTE2ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90b29scy9lbWFjcy9lcmxhbmcuZWwKQEAgLTAsMCArMSw2MjkxIEBACis7OyAkSWQ6IGVybGFuZy5lbCx2IDEuMjEgMjAwNC8wOC8wMyAyMDozODo0MyBtbG9nYW4gRXhwICQKKzs7IGVybGFuZy5lbCAtLS0gTWFqb3IgbW9kZXMgZm9yIGVkaXRpbmcgYW5kIHJ1bm5pbmcgRXJsYW5nCisKKzs7IENvcHlyaWdodCAoQykgMTk5NS0xOTk4LDIwMDAgIEVyaWNzc29uIFRlbGVjb20gQUIKKworOzsgQXV0aG9yOiAgIEFuZGVycyBMaW5kZ3JlbgorOzsgVmVyc2lvbjogIDIuNAorOzsgS2V5d29yZHM6IGVybGFuZywgbGFuZ3VhZ2VzLCBwcm9jZXNzZXMKKzs7IERhdGU6ICAgICAyMDAwLTA5LTExCisKKzs7IExhcnMgVGhvcnPpbidzIG1vZGlmaWNhdGlvbnMgb2YgMjAwMC0wNi0wNyBpbmNsdWRlZC4KKyAKKzs7IFRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZSB3YXMgd3JpdHRlbiBieSBSb2JlcnQgVmlyZGluZy4KKzs7Cis7OyBNb3N0IHNrZWxldG9ucyBoYXMgYmVlbiB3cml0dGVuIGF0IEVyaWNzc29uIFRlbGVjb20gYnkKKzs7IG1hZ251c0Blcml4LmVyaWNzc29uLnNlIGFuZCBqYW5uZUBlcml4LmVyaWNzc29uLnNlCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBJbnRyb2R1Y3Rpb246Cis7OyAtLS0tLS0tLS0tLS0KKzs7Cis7OyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIEVybGFuZy4KKzs7IFRoZSBwYWNrYWdlIHByb3ZpZGVzIGFuIGVkaXRpbmcgbW9kZSB3aXRoIGxvdHMgb2YgYmVsbHMgYW5kCis7OyB3aGlzdGxlcywgY29tcGlsYXRpb24gc3VwcG9ydCwgYW5kIGl0IG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUKKzs7IHVzZXIgdG8gc3RhcnQgRXJsYW5nIHNoZWxscyB0aGF0IHJ1biBpbnNpZGUgRW1hY3MuCis7OworOzsgU2VlIHRoZSBFcmxhbmcgZGlzdHJpYnV0aW9uIGZvciBmdWxsIGRvY3VtZW50YXRpb24gb2YgdGhpcyBwYWNrYWdlLgorCis7OyBJbnN0YWxsYXRpb246Cis7OyAtLS0tLS0tLS0tLS0KKzs7Cis7OyBQbGFjZSB0aGlzIGZpbGUgaW4gRW1hY3MgbG9hZCBwYXRoLCBieXRlLWNvbXBpbGUgaXQsIGFuZCBhZGQgdGhlCis7OyBmb2xsb3dpbmcgbGluZSB0byB0aGUgYXBwcm9wcmlhdGUgaW5pdCBmaWxlOgorOzsKKzs7ICAgIChyZXF1aXJlICdlcmxhbmctc3RhcnQpCis7OworOzsgVGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBjb250YWlucyBtdWNoIG1vcmUgZXh0ZW5zaXZlIGRlc2NyaXB0aW9uIG9mCis7OyB0aGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZS4KKworOzsgUmVwb3J0aW5nIEJ1Z3M6Cis7OyAtLS0tLS0tLS0tLS0tLQorOzsKKzs7IFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIHRvIHRoZSBmb2xsb3dpbmcgZW1haWwgYWRkcmVzczoKKzs7ICAgICBzdXBwb3J0QGVybGFuZy5lcmljc3Nvbi5zZQorOzsKKzs7IFBsZWFzZSBzdGF0ZSBhcyBleGFjdGx5IGFzIHBvc3NpYmxlOgorOzsgICAgLSBWZXJzaW9uIG51bWJlciBvZiBFcmxhbmcgTW9kZSAoc2VlIHRoZSBtZW51KSwgRW1hY3MsIEVybGFuZywKKzs7CWFuZCBvZiBhbnkgb3RoZXIgcmVsZXZhbnQgc29mdHdhcmUuCis7OyAgICAtIFdoYXQgdGhlIGV4cGVjdGVkIHJlc3VsdCB3YXMuCis7OyAgICAtIFdoYXQgeW91IGRpZCwgcHJlZmVyYWJseSBpbiBhIHJlcGVhdGFibGUgc3RlcC1ieS1zdGVwIGZvcm0uCis7OyAgICAtIEEgZGVzY3JpcHRpb24gb2YgdGhlIHVuZXhwZWN0ZWQgcmVzdWx0LgorOzsgICAgLSBSZWxldmFudCBwaWVjZXMgb2YgRXJsYW5nIGNvZGUgY2F1c2luZyB0aGUgcHJvYmxlbS4KKzs7ICAgIC0gUGVyc29uYWwgRW1hY3MgY3VzdG9taXNhdGlvbnMsIGlmIGFueS4KKzs7Cis7OyBTaG91bGQgdGhlIEVtYWNzIGdlbmVyYXRlIGFuIGVycm9yLCBwbGVhc2Ugc2V0IHRoZSBlbWFjcyB2YXJpYWJsZQorOzsgYGRlYnVnLW9uLWVycm9yJyB0byBgdCcuICBSZXBlYXQgdGhlIGVycm9yIGFuZCBlbmNsb3NlIHRoZSBkZWJ1ZworOzsgaW5mb3JtYXRpb24gaW4geW91ciBidWctcmVwb3J0LgorOzsKKzs7IFRvIHNldCB0aGUgdmFyaWFibGUgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorOzsgICAgIE0teCBzZXQtdmFyaWFibGUgUkVUIGRlYnVnLW9uLWVycm9yIFJFVCB0IFJFVAorDAorOzs7IENvZGU6CisKKzs7IFZhcmlhYmxlczoKKworKGRlZmNvbnN0IGVybGFuZy12ZXJzaW9uICIyLjQiCisgICJUaGUgdmVyc2lvbiBudW1iZXIgb2YgRXJsYW5nIG1vZGUuIikKKworKGRlZnZhciBlcmxhbmctcm9vdC1kaXIgbmlsCisgICJUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBFcmxhbmcgc3lzdGVtIGlzIGluc3RhbGxlZC4KK1RoZSBuYW1lIHNob3VsZCBub3QgY29udGFpbiB0aGUgZW5kaW5nIHNsYXNoLgorCitTaG91bGQgdGhpcyB2YXJpYWJsZSBiZSBuaWwsIG5vIG1hbnVhbCBwYWdlcyB3aWxsIHNob3cgdXAgaW4gdGhlCitFcmxhbmcgbW9kZSBtZW51LiIpCisKKyhkZWZ2YXIgZXJsYW5nLW1lbnUtaXRlbXMgJyhlcmxhbmctbWVudS1iYXNlLWl0ZW1zCisJCQkgICAgZXJsYW5nLW1lbnUtc2tlbC1pdGVtcworCQkJICAgIGVybGFuZy1tZW51LXNoZWxsLWl0ZW1zCisJCQkgICAgZXJsYW5nLW1lbnUtY29tcGlsZS1pdGVtcworCQkJICAgIGVybGFuZy1tZW51LW1hbi1pdGVtcworCQkJICAgIGVybGFuZy1tZW51LXBlcnNvbmFsLWl0ZW1zCisJCQkgICAgZXJsYW5nLW1lbnUtdmVyc2lvbi1pdGVtcykKKyAgIipMaXN0IG9mIG1lbnUgaXRlbSBsaXN0IHRvIGNvbWJpbmUgdG8gY3JlYXRlIEVybGFuZCBtb2RlIG1lbnUuCisKK0V4dGVybmFsIHByb2dyYW1zIHdoaWNoIHRlbXBvcmFyeSBhZGRzIG1lbnUgaXRlbXMgdG8gdGhlIEVybGFuZCBtb2RlCittZW51IHVzZSB0aGlzIHZhcmlhYmxlLiAgUGxlYXNlIHVzZSB0aGUgZnVuY3Rpb24gYGFkZC1ob29rJyB0byBhZGQKK2l0ZW1zLgorCitQbGVhc2UgY2FsbCB0aGUgZnVuY3Rpb24gYGVybGFuZy1tZW51LWluaXQnIGFmdGVyIGV2ZXJ5IGNoYW5nZSB0byB0aGlzCit2YXJpYWJsZS4iKQorCisoZGVmdmFyIGVybGFuZy1tZW51LWJhc2UtaXRlbXMKKyAgJygoIkluZGVudCIKKyAgICAgKCgiSW5kZW50IExpbmUiIGVybGFuZy1pbmRlbnQtY29tbWFuZCkKKyAgICAgICgiSW5kZW50IFJlZ2lvbiAiIGVybGFuZy1pbmRlbnQtcmVnaW9uCisgICAgICAgKGlmIGVybGFuZy14ZW1hY3MtcCAobWFyaykgbWFyay1hY3RpdmUpKQorICAgICAgKCJJbmRlbnQgQ2xhdXNlIiBlcmxhbmctaW5kZW50LWNsYXVzZSkKKyAgICAgICgiSW5kZW50IEZ1bmN0aW9uIiBlcmxhbmctaW5kZW50LWZ1bmN0aW9uKQorICAgICAgKCJJbmRlbnQgQnVmZmVyIiBlcmxhbmctaW5kZW50LWN1cnJlbnQtYnVmZmVyKSkpCisgICAgKCJFZGl0IgorICAgICAoKCJGaWxsIENvbW1lbnQiIGVybGFuZy1maWxsLXBhcmFncmFwaCkKKyAgICAgICgiQ29tbWVudCBSZWdpb24iIGNvbW1lbnQtcmVnaW9uCisgICAgICAgKGlmIGVybGFuZy14ZW1hY3MtcCAobWFyaykgbWFyay1hY3RpdmUpKQorICAgICAgKCJVbmNvbW1lbnQgUmVnaW9uIiBlcmxhbmctdW5jb21tZW50LXJlZ2lvbgorICAgICAgIChpZiBlcmxhbmcteGVtYWNzLXAgKG1hcmspIG1hcmstYWN0aXZlKSkKKyAgICAgIG5pbAorICAgICAgKCJCZWdpbm5pbmcgb2YgRnVuY3Rpb24iIGVybGFuZy1iZWdpbm5pbmctb2YtZnVuY3Rpb24pCisgICAgICAoIkVuZCBvZiBGdW5jdGlvbiIgZXJsYW5nLWVuZC1vZi1mdW5jdGlvbikKKyAgICAgICgiTWFyayBGdW5jdGlvbiIgZXJsYW5nLW1hcmstZnVuY3Rpb24pCisgICAgICBuaWwKKyAgICAgICgiQmVnaW5uaW5nIG9mIENsYXVzZSIgZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCisgICAgICAoIkVuZCBvZiBDbGF1c2UiIGVybGFuZy1lbmQtb2YtY2xhdXNlKQorICAgICAgKCJNYXJrIENsYXVzZSIgZXJsYW5nLW1hcmstY2xhdXNlKQorICAgICAgbmlsCisgICAgICAoIk5ldyBDbGF1c2UiIGVybGFuZy1nZW5lcmF0ZS1uZXctY2xhdXNlKQorICAgICAgKCJDbG9uZSBBcmd1bWVudHMiIGVybGFuZy1jbG9uZS1hcmd1bWVudHMpKSkKKyAgICAoIlN5bnRheCBIaWdobGlnaHRpbmciCisgICAgICgoIkxldmVsIDMiIGVybGFuZy1mb250LWxvY2stbGV2ZWwtMykKKyAgICAgICgiTGV2ZWwgMiIgZXJsYW5nLWZvbnQtbG9jay1sZXZlbC0yKQorICAgICAgKCJMZXZlbCAxIiBlcmxhbmctZm9udC1sb2NrLWxldmVsLTEpCisgICAgICAoIk9mZiIgZXJsYW5nLWZvbnQtbG9jay1sZXZlbC0wKSkpCisgICAgKCJUQUdTIgorICAgICAoKCJGaW5kIFRhZyIgZmluZC10YWcpCisgICAgICAoIkZpbmQgTmV4dCBUYWciIGVybGFuZy1maW5kLW5leHQtdGFnKQorICAgICAgOygiRmluZCBSZWdleHAiIGZpbmQtdGFnLXJlZ2V4cCkKKyAgICAgICgiQ29tcGxldGUgV29yZCIgZXJsYW5nLWNvbXBsZXRlLXRhZykKKyAgICAgICgiVGFncyBBcHJvcG9zIiB0YWdzLWFwcm9wb3MpCisgICAgICAoIlNlYXJjaCBGaWxlcyIgdGFncy1zZWFyY2gpKSkpCisgICIqRGVzY3JpcHRpb24gb2YgbWVudSB1c2VkIGluIEVybGFuZyBtb2RlLgorCitUaGlzIHZhcmlhYmxlIG11c3QgYmUgYSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGVpdGhlciBuaWwgcmVwcmVzZW50aW5nCithIGhvcmlzb250YWwgbGluZSBvciBhIGxpc3Qgd2l0aCB0d28gb3IgdGhyZWUgZWxlbWVudHMuICBUaGUgZmlyc3QgaXMKK3RoZSBuYW1lIG9mIHRoZSBtZW51IGl0ZW0sIHRoZSBzZWNvbmQgaXMgdGhlIGZ1bmN0aW9uIHRvIGNhbGwsIG9yIGEKK3N1Ym1lbnUsIG9uIHRoZSBzYW1lIHNhbWUgZm9ybSBhcyBJVEVNUy4gIFRoZSB0aGlyZCBvcHRpb25hbCBhcmd1bWVudAoraXMgYW4gZXhwcmVzc2lvbiB3aGljaCBpcyBldmFsdWF0ZWQgZXZlcnkgdGltZSB0aGUgbWVudSBpcyBkaXNwbGF5ZWQuCitTaG91bGQgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGUgdG8gbmlsIHRoZSBtZW51IGl0ZW0gaXMgZ2hvc3RlZC4KKworRXhhbXBsZToKKyAgICAnKChcIkZ1bmMxXCIgZnVuY3Rpb24tb25lKQorICAgICAgKFwiU3ViSXRlbVwiCisgICAgICAgKChcIlllbGxvd1wiIGZ1bmN0aW9uLXllbGxvdykKKyAgICAgICAgKFwiQmx1ZVwiIGZ1bmN0aW9uLWJsdWUpKSkKKyAgICAgIG5pbAorICAgICAgKFwiUmVnaW9uIEZ1bnRpb25cIiBzcG9vay1mdW5jdGlvbiBtaWRuaWdodC12YXJpYWJsZSkpCisKK0NhbGwgdGhlIGZ1bmN0aW9uIGBlcmxhbmctbWVudS1pbml0JyBhZnRlciBtb2RpZnlpbmcgdGhpcyB2YXJpYWJsZS4iKQorCisoZGVmdmFyIGVybGFuZy1tZW51LXNoZWxsLWl0ZW1zCisgICcobmlsCisgICAgKCJTaGVsbCIKKyAgICAgKCgiU3RhcnQgTmV3IFNoZWxsIiBlcmxhbmctc2hlbGwpCisgICAgICAoIkRpc3BsYXkgU2hlbGwiICAgZXJsYW5nLXNoZWxsLWRpc3BsYXkpKSkpCisgICIqRGVzY3JpcHRpb24gb2YgdGhlIFNoZWxsIG1lbnUgdXNlZCBieSBFcmxhbmcgbW9kZS4KKworUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBgZXJsYW5nLW1lbnUtYmFzZS1pdGVtcycuIikKKworKGRlZnZhciBlcmxhbmctbWVudS1jb21waWxlLWl0ZW1zCisgICcoKCJDb21waWxlIgorICAgICAoKCJDb21waWxlIEJ1ZmZlciIgZXJsYW5nLWNvbXBpbGUpCisgICAgICAoIkRpc3BsYXkgUmVzdWx0IiBlcmxhbmctY29tcGlsZS1kaXNwbGF5KQorICAgICAgKCJOZXh0IEVycm9yIiAgICAgZXJsYW5nLW5leHQtZXJyb3IpKSkpCisgICIqRGVzY3JpcHRpb24gb2YgdGhlIENvbXBpbGUgbWVudSB1c2VkIGJ5IEVybGFuZyBtb2RlLgorCitQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIGBlcmxhbmctbWVudS1iYXNlLWl0ZW1zJy4iKQorCisoZGVmdmFyIGVybGFuZy1tZW51LXZlcnNpb24taXRlbXMKKyAgJyhuaWwKKyAgICAoIlZlcnNpb24iIGVybGFuZy12ZXJzaW9uKSkKKyAgIipEZXNjcmlwdGlvbiBvZiB0aGUgdmVyc2lvbiBtZW51IHVzZWQgaW4gRXJsYW5nIG1vZGUuIikKKworKGRlZnZhciBlcmxhbmctbWVudS1wZXJzb25hbC1pdGVtcyBuaWwKKyAgIipEZXNjcmlwdGlvbiBvZiBwZXJzb25hbCBtZW51IGl0ZW1zIHVzZWQgaW4gRXJsYW5nIG1vZGUuCisKK1BsZWFzZSBzZWUgdGhlIHZhcmlhYmxlIGBlcmxhbmctbWVudS1iYXNlLWl0ZW1zJyBmb3IgYSBkZXNjcmlwdGlvbgorb2YgdGhlIGZvcm1hdC4iKQorCisoZGVmdmFyIGVybGFuZy1tZW51LW1hbi1pdGVtcyBuaWwKKyAgIlRoZSBtZW51IGNvbnRhaW5pbmcgbWFuIHBhZ2VzLgorCitUaGUgZm9ybWF0IG9mIHRoZSBtZW51IHNob3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYGVybGFuZy1tZW51LWJhc2UtaXRlbXMnLgorVGhpcyB2YXJpYWJsZSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiBFcmxhbmcgbWVudXMgc3RvcmVkIGluCitgZXJsYW5nLW1lbnUtaXRlbXMnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLW1lbnUtc2tlbC1pdGVtcyAnKCkKKyAgIkRlc2NyaXB0aW9uIG9mIHRoZSBtZW51IGNvbnRhaW5pbmcgdGhlIHNrZWxldG9uIGVudHJpZXMuCitUaGUgbWVudSBpcyBpbiB0aGUgZm9ybSBkZXNjcmliZWQgYnkgdGhlIHZhcmlhYmxlIGBlcmxhbmctbWVudS1iYXNlLWl0ZW1zJy4iKQorCisoZGVmdmFyIGVybGFuZy1tb2RlLWhvb2sgbmlsCisgICIqRnVuY3Rpb25zIHRvIHJ1biB3aGVuIEVybGFuZyBtb2RlIGlzIGFjdGl2YXRlZC4KKworVGhpcyBob29rIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIgb2YgRXJsYW5nIG1vZGUuICBJdCBpcworbm9ybWFsbHkgdXNlZCBieSB0aGUgdXNlciB0byBwZXJzb25hbGlzZSB0aGUgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQuCitXaGVuIHVzZWQgaW4gYSBzaXRlIGluaXQgZmlsZSwgaXQgY291bGQgYmUgdXNlZCB0byBjdXN0b21pc2UgRXJsYW5nCittb2RlIGZvciBhbGwgdXNlcnMgb24gdGhlIHN5c3RlbS4KKworVGhlIGZ1bmN0aW9ucyBhZGRlZCB0byB0aGlzIGhvb2sgaXMgcnVuZWQgZXZlcnkgdGltZSBFcmxhbmcgbW9kZSBpcworc3RhcnRlZC4gIFNlZSBhbHNvIGBlcmxhbmctbG9hZC1ob29rJywgYSBob29rIHdoaWNoIGlzIHJ1bmVkIG9uY2UsCit3aGVuIEVybGFuZyBtb2RlIGlzIGxvYWRlZCBpbnRvIEVtYWNzLCBhbmQgYGVybGFuZy1zaGVsbC1tb2RlLWhvb2snCit3aGljaCBpcyBydW4gZXZlcnkgdGltZSBhIG5ldyBpbmZlcmlvciBFcmxhbmcgc2hlbGwgaXMgc3RhcnRlZC4KKworVG8gdXNlIGEgaG9vaywgY3JlYXRlIGFuIEVtYWNzIGxpc3AgZnVuY3Rpb24gdG8gcGVyZm9ybSB5b3VyIGFjdGlvbnMKK2FuZCBhZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSBob29rIGJ5IGNhbGxpbmcgYGFkZC1ob29rJy4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIGJpbmRzIHRoZSBrZXkgc2VxdWVuY2UgQy1jIEMtYyB0byB0aGUgY29tbWFuZAorYGVybGFuZy1jb21waWxlJyAobm9ybWFsbHkgYm91bmQgdG8gQy1jIEMtaykuICBUaGUgZXhhbXBsZSBhbHNvCithY3RpdmF0ZXMgRm9udCBMb2NrIG1vZGUgdG8gZm9udGlmeSB0aGUgYnVmZmVyIGFuZCBhZGRzIGEgbWVudQorY29udGFpbmluZyBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgorCitUbyB1c2UgdGhlIGV4YW1wbGUsIGNvcHkgdGhlIGZvbGxvd2luZyBsaW5lcyB0byB5b3VyIGB+Ly5lbWFjcycgZmlsZToKKworICAgIChhZGQtaG9vayAnZXJsYW5nLW1vZGUtaG9vayAnbXktZXJsYW5nLW1vZGUtaG9vaykKKworICAgIChkZWZ1biBteS1lcmxhbmctbW9kZS1ob29rICgpCisgICAgICAobG9jYWwtc2V0LWtleSBcIlxcQy1jXFxDLWNcIiAnZXJsYW5nLWNvbXBpbGUpCisgICAgICAoaWYgd2luZG93LXN5c3RlbQorICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgKHNldHEgZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbiB0KQorICAgICAgICAgICAgKGZvbnQtbG9jay1tb2RlIDEpKSkKKyAgICAgIChpZiAoYW5kIHdpbmRvdy1zeXN0ZW0gKGZib3VuZHAgJ2ltZW51LWFkZC10by1tZW51YmFyKSkKKyAgICAgICAgICAoaW1lbnUtYWRkLXRvLW1lbnViYXIgXCJJbWVudVwiKSkpIikKKworKGRlZnZhciBlcmxhbmctbG9hZC1ob29rIG5pbAorICAiKkZ1bmN0aW9ucyB0byBydW4gd2hlbiBFcmxhbmcgbW9kZSBpcyBsb2FkZWQuCisKK1RoaXMgaG9vayBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIEVybGFuZyBtb2RlLiAgSXQgaXMKK25vcm1hbGx5IHVzZWQgYnkgdGhlIHVzZXIgdG8gcGVyc29uYWxpc2UgdGhlIHByb2dyYW1taW5nIGVudmlyb25tZW50LgorV2hlbiB1c2VkIGluIGEgc2l0ZSBpbml0IGZpbGUsIGl0IGNvdWxkIGJlIHVzZWQgdG8gY3VzdG9taXplIEVybGFuZworbW9kZSBmb3IgYWxsIHVzZXJzIG9uIHRoZSBzeXN0ZW0uCisKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBob29rIGFuZCBgZXJsYW5nLW1vZGUtaG9vaycgYW5kCitgZXJsYW5nLXNoZWxsLW1vZGUtaG9vaycgaXMgdGhhdCB0aGUgZnVuY3Rpb25zIGluIHRoaXMgaG9vaworaXMgb25seSBjYWxsZWQgb25jZSwgd2hlbiB0aGUgRXJsYW5nIG1vZGUgaXMgbG9hZGVkIGludG8gRW1hY3MKK3RoZSBmaXJzdCB0aW1lLgorCitOYXR1cmFsIGFjdGlvbnMgZm9yIHRoZSBmdW5jdGlvbnMgYWRkZWQgdG8gdGhpcyBob29rIGFyZSBhY3Rpb25zIHdoaWNoCitvbmx5IHNob3VsZCBiZSBwZXJmb3JtZWQgb25jZSwgYW5kIGFjdGlvbnMgd2hpY2ggc2hvdWxkIGJlIHBlcmZvcm1lZAorYmVmb3JlIHN0YXJ0aW5nIEVybGFuZyBtb2RlLiAgRm9yIGV4YW1wbGUsIGEgbnVtYmVyIG9mIHZhcmlhYmxlcyBhcmUKK3VzZWQgYnkgRXJsYW5nIG1vZGUgYmVmb3JlIGBlcmxhbmctbW9kZS1ob29rJyBpcyBydW5lZC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgdGhlIHZhcmlhYmxlIGBlcmxhbmctcm9vdC1kaXInIHNvIHRoYXQgdGhlCittYW51YWwgcGFnZXMgY2FuIGJlIHJldHJpZXZlZCAobm90ZSB0aGF0IHlvdSBtdXN0IHNldCB0aGUgdmFsdWUgb2YKK2Blcmxhbmctcm9vdC1kaXInIHRvIG1hdGNoIHRoZSBsb2F0aW9uIG9mIEVybGFuZyBvbiB5b3VyIHN5c3RlbSk6CisKKyAgICAoYWRkLWhvb2sgJ2VybGFuZy1sb2FkLWhvb2sgJ215LWVybGFuZy1sb2FkLWhvb2spCisKKyAgICAoZGVmdW4gbXktZXJsYW5nLWxvYWQtaG9vayAoKQorICAgICAgIChzZXRxIGVybGFuZy1yb290LWRpciBcIi91c3IvbG9jYWwvZXJsYW5nXCIpKSIpCisKKyhkZWZ2YXIgZXJsYW5nLW5ldy1maWxlLWhvb2sgbmlsCisgICJGdW5jdGlvbnMgdG8gcnVuIHdoZW4gYSBuZXcgRXJsYW5nIHNvdXJjZSBmaWxlIGlzIGJlaW5nIGVkaXRlZC4KKworQSB1c2VmdWwgZnVuY3Rpb24gaXMgYHRlbXBvLXRlbXBsYXRlLWVybGFuZy1ub3JtYWwtaGVhZGVyJy4KK1woVGhpcyBmdW5jdGlvbiBvbmx5IGV4aXN0cyB3aGVuIHRoZSBgdGVtcG8nIHBhY2thZ3MgaXMgYXZhaWxhYmxlLikiKQorCisoZGVmdmFyIGVybGFuZy1jaGVjay1tb2R1bGUtbmFtZSAnYXNrCisgICIqTm9uLW5pbCBtZWFucyBjaGVjayB0aGF0IG1vZHVsZSBuYW1lIGFuZCBmaWxlIG5hbWUgYWdyZWVzIHdoZW4gc2F2aW5nLgorCitJZiB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyB0aGUgYXRvbSBgYXNrJywgdGhlIHVzZXIgaXMKK3Byb21wdGVkLiAgSWYgdGhlIHZhbHVlIGlzIHQgdGhlIHNvdXJjZSBpcyBzaWxlbnRseSBjaGFuZ2VkLiIpCisKKyhkZWZ2YXIgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzCisgICcoZXJsYW5nLWVsZWN0cmljLWNvbW1hCisgICAgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbgorICAgIGVybGFuZy1lbGVjdHJpYy1ndCkKKyAgIipMaXN0IG9mIGFjdGl2YXRlZCBlbGVjdHJpYyBjb21tYW5kcy4KKworVGhlIGxpc3Qgc2hvdWxkIGNvbnRhaW4gdGhlIGVsZWN0cmljIGNvbW1hbmRzIHdoaWNoIHNob3VsZCBiZSBhY3RpdmUuCitDdXJyZW50bHksIHRoZSBhdmFpbGFibGUgZWxlY3RyaWMgY29tbWFuZHMgYXJlOgorICAgIGVybGFuZy1lbGVjdHJpYy1jb21tYQorICAgIGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24KKyAgICBlcmxhbmctZWxlY3RyaWMtZ3QKKyAgICBlcmxhbmctZWxlY3RyaWMtbmV3bGluZQorCitTaG91bGQgdGhlIHZhcmlhYmxlIGJlIGJvdW5kIHRvIHQsIGFsbCBlbGVjdHJpYyBjb21tYW5kcworYXJlIGFjdGl2YXRlZC4KKworVG8gZGVhY3RpdmF0ZSBhbGwgZWxlY3RyaWMgY29tbWFuZHMsIHNldCB0aGlzIHZhcmlhYmxlIHRvIG5pbC4iKQorCisoZGVmdmFyIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQgdAorICAiKlNldCB0byBub24tbmlsIHRvIGluaGliaXQgbmV3bGluZSBhZnRlciBlbGVjdHJpYyBjb21tYW5kLgorCitUaGlzIGlzIHVzZWZ1bCBzaW5jZSBhIGxvdCBvZiBwZW9wbGUgcHJlc3MgcmV0dXJuIGFmdGVyIGV4ZWN1dGluZyBhbgorZWxlY3RyaWMgY29tbWFuZC4KKworSW4gb3JkZXIgdG8gd29yaywgdGhlIGNvbW1hbmQgbXVzdCBhbHNvIGJlIGluIHRoZQorbGlzdCBgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdC1saXN0Jy4KKworTm90ZSB0aGF0IGNvbW1hbmRzIGluIHRoaXMgbGlzdCBhcmUgcmVxdWlyZWQgdG8gc2V0IHRoZSB2YXJpYWJsZQorYGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQnIHRvIG5pbCB3aGVuIHRoZSBuZXdsaW5lIHNob3VsZG4ndCBiZQoraW5oaWJpdGVkLiIpCisKKyhkZWZ2YXIgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdC1saXN0CisgICcoZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbgorICAgIGVybGFuZy1lbGVjdHJpYy1jb21tYQorICAgIGVybGFuZy1lbGVjdHJpYy1ndCkKKyAgIipDb21tYW5kIHdoaWNoIGNhbiBpbmhpYml0IHRoZSBuZXh0IG5ld2xpbmUuIikKKworKGRlZnZhciBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uLWluc2VydC1ibGFuay1saW5lcyBuaWwKKyAgIipOdW1iZXIgb2YgYmxhbmsgbGluZXMgaW5zZXJ0ZWQgYmVmb3JlIGhlYWRlciwgb3IgbmlsLgorCitUaGlzIHZhcmlhYmxlIGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2YgYGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24nCit3aGVuIGEgbmV3IGZ1bmN0aW9uIGhlYWRlciBpcyBnZW5lcmF0ZWQuICBXaGVuIG5pbCwgbm8gYmxhbmsgbGluZSBpcworaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgY3VycmVudCBsaW5lIGFuZCB0aGUgbmV3IGhlYWRlci4gIFdoZW4gYm91bmQgdG8gYQorbnVtYmVyIGl0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBibGFuayBsaW5lcyB3aGljaCBzaG91bGQgYmUKK2luc2VydGVkLiIpCisKKyhkZWZ2YXIgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbi1jcml0ZXJpYQorICAnKGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXAKKyAgICBlcmxhbmctYXQta2V5d29yZC1lbmQtcAorICAgIGVybGFuZy1hdC1lbmQtb2YtZnVuY3Rpb24tcCkKKyAgIipMaXN0IG9mIGZ1bmN0aW9ucyBjb250cm9sbGluZyBgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbicuCitUaGUgZnVuY3Rpb25zIGluIHRoaXMgbGlzdCBhcmUgY2FsbGVkLCBpbiBvcmRlciwgd2hlbmV2ZXIgYSBzZW1pY29sb24KK2lzIHR5cGVkLiAgRWFjaCBmdW5jdGlvbiBpbiB0aGUgbGlzdCBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsCithbmQgc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgbmlsICAgICAgICAgICAgIC0tIG5vIGRldGVybWluYXRpb24gbWFkZSwgY29udGludWUgY2hlY2tpbmcKKyAgJ3N0b3AgICAgICAgICAgIC0tIGRvIG5vdCBjcmVhdGUgcHJvdG90eXBlIGZvciBuZXh0IGxpbmUKKyAgKGFueXRoaW5nIGVsc2UpIC0tIGluc2VydCBwcm90b3R5cGUsIGFuZCBzdG9wIGNoZWNraW5nCisKK0lmIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaXN0IGlzIGNhbGxlZCB3aXRoIG5vIGRldGVybWluYXRpb24gbWFkZSwKK3RoZW4gbm8gcHJvdG90eXBlIGlzIGluc2VydGVkLgorCitUaGUgdGVzdCBpcyBwZXJmb3JtZWQgYnkgdGhlIGZ1bmN0aW9uIGBlcmxhbmctdGVzdC1jcml0ZXJpYS1saXN0Jy4iKQorCisoZGVmdmFyIGVybGFuZy1lbGVjdHJpYy1jb21tYS1jcml0ZXJpYQorICAnKGVybGFuZy1zdG9wLXdoZW4taW5zaWRlLWFyZ3VtZW50LWxpc3QKKyAgICBlcmxhbmctc3RvcC13aGVuLWF0LWd1YXJkCisgICAgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktcAorICAgIGVybGFuZy1hdC1rZXl3b3JkLWVuZC1wCisgICAgZXJsYW5nLWF0LWVuZC1vZi1mdW5jdGlvbi1wKQorICAiKkxpc3Qgb2YgZnVuY3Rpb25zIGNvbnRyb2xsaW5nIGBlcmxhbmctZWxlY3RyaWMtY29tbWEnLgorVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGxpc3QgYXJlIGNhbGxlZCwgaW4gb3JkZXIsIHdoZW5ldmVyIGEgY29tbWEKK2lzIHR5cGVkLiAgRWFjaCBmdW5jdGlvbiBpbiB0aGUgbGlzdCBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsCithbmQgc2hvdWxkIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgbmlsICAgICAgICAgICAgIC0tIG5vIGRldGVybWluYXRpb24gbWFkZSwgY29udGludWUgY2hlY2tpbmcKKyAgJ3N0b3AgICAgICAgICAgIC0tIGRvIG5vdCBjcmVhdGUgcHJvdG90eXBlIGZvciBuZXh0IGxpbmUKKyAgKGFueXRoaW5nIGVsc2UpIC0tIGluc2VydCBwcm90b3R5cGUsIGFuZCBzdG9wIGNoZWNraW5nCisKK0lmIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBsaXN0IGlzIGNhbGxlZCB3aXRoIG5vIGRldGVybWluYXRpb24gbWFkZSwKK3RoZW4gbm8gcHJvdG90eXBlIGlzIGluc2VydGVkLgorCitUaGUgdGVzdCBpcyBwZXJmb3JtZWQgYnkgdGhlIGZ1bmN0aW9uIGBlcmxhbmctdGVzdC1jcml0ZXJpYS1saXN0Jy4iKQorCisoZGVmdmFyIGVybGFuZy1lbGVjdHJpYy1hcnJvdy1jcml0ZXJpYQorICAnKGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXAKKyAgICBlcmxhbmctYXQtZW5kLW9mLWZ1bmN0aW9uLXApCisgICIqTGlzdCBvZiBmdW5jdGlvbnMgY29udHJvbGxpbmcgdGhlIGFycm93IGFzcGVjdCBvZiBgZXJsYW5nLWVsZWN0cmljLWd0Jy4KK1RoZSBmdW5jdGlvbnMgaW4gdGhpcyBsaXN0IGFyZSBjYWxsZWQsIGluIG9yZGVyLCB3aGVuZXZlciBhIGA+JworaXMgdHlwZWQuICBFYWNoIGZ1bmN0aW9uIGluIHRoZSBsaXN0IGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywKK2FuZCBzaG91bGQgcmV0dXJuIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICBuaWwgICAgICAgICAgICAgLS0gbm8gZGV0ZXJtaW5hdGlvbiBtYWRlLCBjb250aW51ZSBjaGVja2luZworICAnc3RvcCAgICAgICAgICAgLS0gZG8gbm90IGNyZWF0ZSBwcm90b3R5cGUgZm9yIG5leHQgbGluZQorICAoYW55dGhpbmcgZWxzZSkgLS0gaW5zZXJ0IHByb3RvdHlwZSwgYW5kIHN0b3AgY2hlY2tpbmcKKworSWYgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QgaXMgY2FsbGVkIHdpdGggbm8gZGV0ZXJtaW5hdGlvbiBtYWRlLAordGhlbiBubyBwcm90b3R5cGUgaXMgaW5zZXJ0ZWQuCisKK1RoZSB0ZXN0IGlzIHBlcmZvcm1lZCBieSB0aGUgZnVuY3Rpb24gYGVybGFuZy10ZXN0LWNyaXRlcmlhLWxpc3QnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtY3JpdGVyaWEKKyAgJyh0KQorICAiKkxpc3Qgb2YgZnVuY3Rpb25zIGNvbnRyb2xsaW5nIGBlcmxhbmctZWxlY3RyaWMtbmV3bGluZScuCisKK1RoZSBlbGVjdHJpYyBuZXdsaW5lIGNvbW1hbmRzIGluZGVudHMgdGhlIG5leHQgbGluZS4gIFNob3VsZCB0aGUKK2N1cnJlbnQgbGluZSBiZWdpbiB3aXRoIGEgY29tbWVudCB0aGUgY29tbWVudCBzdGFydCBpcyBjb3BpZWQgdG8KK3RoZSBuZXdseSBjcmVhdGVkIGxpbmUuCisKK1RoZSBmdW5jdGlvbnMgaW4gdGhpcyBsaXN0IGFyZSBjYWxsZWQsIGluIG9yZGVyLCB3aGVuZXZlciBhIGNvbW1hCitpcyB0eXBlZC4gIEVhY2ggZnVuY3Rpb24gaW4gdGhlIGxpc3QgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLAorYW5kIHNob3VsZCByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisgIG5pbCAgICAgICAgICAgICAtLSBubyBkZXRlcm1pbmF0aW9uIG1hZGUsIGNvbnRpbnVlIGNoZWNraW5nCisgICdzdG9wICAgICAgICAgICAtLSBkbyBub3QgY3JlYXRlIHByb3RvdHlwZSBmb3IgbmV4dCBsaW5lCisgIChhbnl0aGluZyBlbHNlKSAtLSB0cmlnZ2VyIHRoZSBlbGVjdHJpYyBjb21tYW5kLgorCitJZiBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbGlzdCBpcyBjYWxsZWQgd2l0aCBubyBkZXRlcm1pbmF0aW9uIG1hZGUsCit0aGVuIG5vIHByb3RvdHlwZSBpcyBpbnNlcnRlZC4gIFNob3VsZCB0aGUgYXRvbSB0IGJlIGEgbWVtYmVyIG9mIHRoZQorbGlzdCwgaXQgaXMgdHJlYXRlZCBhcyBhIGZ1bmN0aW9uIHRyaWdnZXJpbmcgdGhlIGVsZWN0cmljIGNvbW1hbmQuCisKK1RoZSB0ZXN0IGlzIHBlcmZvcm1lZCBieSB0aGUgZnVuY3Rpb24gYGVybGFuZy10ZXN0LWNyaXRlcmlhLWxpc3QnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktdGhyZXNob2xkIDIKKyAgIipOdW1iZXIgb2YgYmxhbmsgbGluZXMgcmVxdWlyZWQgdG8gYWN0aXZhdGUgYW4gZWxlY3RyaWMgY29tbWFuZC4KKworQWN0dWFsbHksIHRoaXMgdmFsdWUgY29udHJvbHMgdGhlIGJlaGF2aW91ciBvZiB0aGUgZnVuY3Rpb24KK2BlcmxhbmctbmV4dC1saW5lcy1lbXB0eS1wJyB3aGljaCBub3JtYWxseSBpcyBhIG1lbWJlciBvZiB0aGUKK2NyaXRlcmlhIGxpc3RzIGNvbnRyb2xsaW5nIHRoZSBlbGVjdHJpYyBjb21tYW5kcy4gIChQbGVhc2Ugc2VlCit0aGUgdmFyaWFibGVzIGBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uLWNyaXRlcmlhJyBhbmQKK2BlcmxhbmctZWxlY3RyaWMtY29tbWEtY3JpdGVyaWEnLikKKworVGhlIHZhcmlhYmxlIGlzIGJvdW5kIHRvIGEgdGhyZXNob2xkIHZhbHVlLCBhIG51bWJlciwgcmVwcmVzZW50aW5nIHRoZQorbnVtYmVyIG9mIGxpbmVzIHdoaWNoIG11c3QgYmUgZW1wdHkuCisKK1NldHRpbmcgdGhpcyB2YXJpYWJsZSB0byB6ZXJvLCBlbGVjdHJpYyBjb21tYW5kcyB3aWxsIGFsd2F5cyBiZQordHJpZ2dlcmVkIGJ5IGBlcmxhbmctbmV4dC1saW5lcy1lbXB0eS1wJywgdW5sZXNzIGluaGliaXRlZCBieSBvdGhlcgorcnVsZXMuCisKK1Nob3VsZCB0aGlzIHZhcmlhYmxlIGJlIGBuaWwnLCBgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktcCcgd2lsbCBuZXZlcgordHJpZ2dlciBhbiBlbGVjdHJpYyBjb21tYW5kLiAgVGhlIHNhbWUgZWZmZWN0IHdvdWxkIGJlIHJlYWNoZWQgaWYgdGhlCitmdW5jdGlvbiBgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktcCcgd291bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjcml0ZXJpYQorbGlzdHMuCisKK05vdGUgdGhhdCBldmVuIGlmIGBlcmxhbmctbmV4dC1saW5lcy1lbXB0eS1wJyBzaG91bGQgbm90IHRyaWdnZXIgYW4KK2VsZWN0cmljIGNvbW1hbmQsIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgY3JpdGVyaWEgbGlzdCBjb3VsZC4iKQorCisoZGVmdmFyIGVybGFuZy1uZXctY2xhdXNlLXdpdGgtYXJndW1lbnRzIG5pbAorICAiKk5vbi1uaWwgbWVhbnMgdGhhdCB0aGUgYXJndW1lbnRzIGFyZSBjbG9uZWQgd2hlbiBhIGNsYXVzZSBpcyBnZW5lcmF0ZWQuCisKK0EgbmV3IGZ1bmN0aW9uIGhlYWRlciBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGNhbGxzIHRvIHRoZSBmdW5jdGlvbgorYGVybGFuZy1nZW5lcmF0ZS1uZXctY2xhdXNlJyBhbmQgYnkgdXNlIG9mIHRoZSBlbGVjdHJpYyBzZW1pY29sb24uIikKKworKGRlZnZhciBlcmxhbmctY29tcGlsZS11c2Utb3V0ZGlyIHQKKyAgIipXaGVuIG5pbCwgZ28gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHNvdXJjZSBmaWxlIHdoZW4gY29tcGlsaW5nLgorCitUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gdGhlIGBvdXRkaXInIG9wdGlvbiBvZiBjb21waWxlLiAgSWYgdGhlCitvdXRkaXIgaXMgbm90IGluIHRoZSBjdXJyZW50IGxvYWQgcGF0aCwgRXJsYW5nIGRvZXNuJ3QgbG9hZCB0aGUgb2JqZWN0Cittb2R1bGUgYWZ0ZXIgaXQgaGFzIGJlZW4gY29tcGlsZWQuCisKK1RvIGFjdGl2YXRlIHRoZSB3b3JrYXJvdW5kLCBwbGFjZSB0aGUgZm9sbG93aW5nIGluIHlvdXIgYH4vLmVtYWNzJyBmaWxlOgorICAgIChzZXRxIGVybGFuZy1jb21waWxlLXVzZS1vdXRkaXIgbmlsKSIpCisKKyhkZWZ2YXIgZXJsYW5nLWluZGVudC1sZXZlbCA0CisgICIqSW5kZW50YXRpb24gb2YgRXJsYW5nIGNhbGxzL2NsYXVzZXMgd2l0aGluIGJsb2Nrcy4iKQorCisoZGVmdmFyIGVybGFuZy1pbmRlbnQtZ3VhcmQgMgorICAiKkluZGVudGF0aW9uIG9mIEVybGFuZyBndWFyZHMuIikKKworKGRlZnZhciBlcmxhbmctYXJndW1lbnQtaW5kZW50IDIKKyAgIipJbmRlbnRhdGlvbiBvZiB0aGUgZmlyc3QgYXJndW1lbnQgaW4gYSBmdW5jdGlvbiBjYWxsLgorV2hlbiBuaWwsIGluZGVudCB0byB0aGUgY29sdW1uIGFmdGVyIHRoZSBgKCcgb2YgdGhlCitmdW5jdGlvbi4iKQorCisoZGVmdmFyIGVybGFuZy10YWItYWx3YXlzLWluZGVudCB0CisgICIqTm9uLW5pbCBtZWFucyBUQUIgaW4gRXJsYW5nIG1vZGUgc2hvdWxkIGFsd2F5cyByZWluZGVudCB0aGUgY3VycmVudCBsaW5lLAorcmVnYXJkbGVzcyBvZiB3aGVyZSBpbiB0aGUgbGluZSBwb2ludCBpcyB3aGVuIHRoZSBUQUIgY29tbWFuZCBpcyB1c2VkLiIpCisKKyhkZWZ2YXIgZXJsYW5nLWVycm9yLXJlZ2V4cC1hbGlzdAorICAnKCgiXlxcKFteOiggXHRcbl0rXFwpWzooXVsgXHRdKlxcKFswLTldK1xcKVs6KSBcdF0iIC4gKDEgMikpKQorICAiKlBhdHRlcm5zIGZvciBtYXRjaGluZyBFcmxhbmcgZXJyb3JzLiIpCisKKyhkZWZ2YXIgZXJsYW5nLW1hbi1pbmhpYml0IChlcSBzeXN0ZW0tdHlwZSAnd2luZG93cy1udCkKKyAgIkluaGliaXQgdGhlIGNyZWF0aW9uIG9mIHRoZSBFcmxhbmcgTWFudWFsIFBhZ2VzIG1lbnUuCisKK1RoZSBXaW5kb3dzIGRpc3RyaWJ1dGlvbiBvZiBFcmxhbmcgZG9lcyBub3QgaW5jbHVkZSBtYW4gcGFnZXMsIGhlbmNlCit0aGVyZSBpcyBubyBpZGVhIHRvIGNyZWF0ZSB0aGUgbWVudS4iKQorCisoZGVmdmFyIGVybGFuZy1tYW4tZGlycworICAnKCgiTWFuIC0gQ29tbWFuZHMiICIvbWFuL21hbjEiIHQpCisgICAgKCJNYW4gLSBNb2R1bGVzIiAiL21hbi9tYW4zIiB0KQorICAgICgiTWFuIC0gVW5zdXBwb3J0ZWQiICIvdWMvbWFuL21hbjMiIHQpKQorICAiKlRoZSBtYW4gZGlyZWN0b3JpZXMgZGlzcGxheWVkIGluIHRoZSBFcmxhbmcgbWVudS4KKworRWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBiZSBhIGxpc3Qgd2l0aCB0aHJlZSBlbGVtZW50cywgdGhlIGZpcnN0Cit0aGUgbmFtZSBvZiB0aGUgbWVudSwgdGhlIHNlY29uZCB0aGUgZGlyZWN0b3J5LCBhbmQgdGhlIGxhc3QgYSBmbGFnLgorU2hvdWxkIHRoZSBmbGFnIHRoZSBuaWwsIHRoZSBkaXJlY3RvcnkgaXMgYWJzb2x1dGUsIHNob3VsZCBpdCBiZSBub24tbmlsCit0aGUgZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZSB2YXJpYWJsZSBgZXJsYW5nLXJvb3QtZGlyJy4iKQorCisoZGVmdmFyIGVybGFuZy1tYW4tbWF4LW1lbnUtc2l6ZSAyMAorICAiKlRoZSBtYXhpbXVtIG51bWJlciBvZiBtZW51IGl0ZW1zIGluIG9uZSBtZW51IGFsbG93ZWQuIikKKworKGRlZnZhciBlcmxhbmctbWFuLWRpc3BsYXktZnVuY3Rpb24gJ2VybGFuZy1tYW4tZGlzcGxheQorICAiKkZ1bmN0aW9uIHVzZWQgdG8gZGlzcGxheSBtYW4gcGFnZS4KKworVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwgdGhlIG5hbWUgb2YgdGhlIGZpbGUKK2NvbnRhaW5pbmcgdGhlIG1hbiBwYWdlLiAgVXNlIHRoaXMgdmFyaWFibGUgd2hlbiB0aGUgZGVmYXVsdAorZnVuY3Rpb24sIGVybGFuZy1tYW4tZGlzcGxheSwgZG9lcyBub3Qgd29yayBvbiB5b3VyIHN5c3RlbS4iKQorCisoZGVmY29uc3QgZXJsYW5nLWF0b20tcmVnZXhwICJcXChbYS16XVthLXpBLVowLTlfXSpcXHwnW15cbiddKlteXFxdJ1xcKSIKKyAgIlJlZ2V4cCB3aGljaCBzaG91bGQgbWF0Y2ggYW4gRXJsYW5nIGF0b20uCisKK1RoZSByZWdleHAgbXVzdCBiZSBzdXJyb3VuZGVkIHdpdGggYSBwYWlyIG9mIHJlZ2V4cCBwYXJlbnRoZXNlcy4iKQorKGRlZmNvbnN0IGVybGFuZy1hdG9tLXJlZ2V4cC1tYXRjaGVzIDEKKyAgIk51bWJlciBvZiByZWdleHAgcGFyZW50aGVzaXMgcGFpcnMgaW4gYGVybGFuZy1hdG9tLXJlZ2V4cCcuCisKK1RoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgcGFyZW50aGVzaXMgbWF0Y2hlcyBpbiBjb21wbGV4IHJlZ2V4cHMgd2hpY2gKK2NvbnRhaW5zIGBlcmxhbmctYXRvbS1yZWdleHAnLiIpCisKKyhkZWZjb25zdCBlcmxhbmctdmFyaWFibGUtcmVnZXhwICJcXChbQS1aX11bYS16QS1aMC05X10qXFwpIgorICAiUmVnZXhwIHdoaWNoIHNob3VsZCBtYXRjaCBhbiBFcmxhbmcgdmFyaWFibGUuCisKK1RoZSByZWdleHAgbXVzdCBiZSBzdXJyb3VuZGVkIHdpdGggYSBwYWlyIG9mIHJlZ2V4cCBwYXJlbnRoZXNpcy4iKQorKGRlZmNvbnN0IGVybGFuZy12YXJpYWJsZS1yZWdleHAtbWF0Y2hlcyAxCisgICJOdW1iZXIgb2YgcmVnZXhwIHBhcmVudGhlc2lzIHBhaXJzIGluIGBlcmxhbmctdmFyaWFibGUtcmVnZXhwJy4KKworVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBtYXRjaGVzIGluIGNvbXBsZXggcmV4ZXBzIHdoaWNoIGNvbnRhaW5zCitgZXJsYW5nLXZhcmlhYmxlLXJlZ2V4cCcuIikKKworKGRlZnZhciBlcmxhbmctZGVmdW4tcHJvbXB0LXJlZ2V4cCAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIlxccyAqKCIpCisgICIqUmVnZXhwIHdoaWNoIHNob3VsZCBtYXRjaCBiZWdpbm5pbmcgb2YgYSBjbGF1c2UuIikKKworKGRlZnZhciBlcmxhbmctZmlsZS1uYW1lLWV4dGVuc2lvbi1yZWdleHAgIlxcLltlaF1ybCQiCisgICIqUmVnZXhwIHdoaWNoIHNob3VsZCBtYXRjaCBhbiBlcmxhbmcgZmlsZSBuYW1lLgorCitUaGlzIHJlZ2V4cCBpcyB1c2VkIHdoZW4gYW4gRXJsYW5nIG1vZHVsZSBuYW1lIGlzIGV4dHJhY3RlZCBmcm9tIHRoZQorbmFtZSBvZiBhbiBFcmxhbmcgc291cmNlIGZpbGUuCisKK1RoZSByZWdleHAgc2hvdWxkIG9ubHkgbWF0Y2ggdGhlIHNlY3Rpb24gb2YgdGhlIGZpbGUgbmFtZSB3aGljaCBzaG91bGQKK2JlIGV4Y2x1ZGVkIGZyb20gdGhlIG1vZHVsZSBuYW1lLgorCitUbyBtYXRjaCBhbGwgZmlsZXMgc2V0IHRoaXMgdmFyaWFibGUgdG8gXCJcXFxcKFxcXFwuLipcXFxcfFxcXFwpJFwiLgorVGhlIG1hdGNoZXMgYWxsIGV4Y2VwdCB0aGUgZXh0ZW5zaW9uLiAgVGhpcyBpcyB1c2VmdWwgaWYgdGhlIEVybGFuZwordGFncyBzeXN0ZW0gc2hvdWxkIGludGVycHJldGF0ZSB0YWdzIG9uIHRoZSBmb3JtIGBtb2R1bGU6dGFnJyBmb3IKK2ZpbGVzIHdyaXR0ZW4gaW4gb3RoZXIgbGFuZ3VhZ2VzIHRoYW4gRXJsYW5nLiIpCisKKyhkZWZ2YXIgZXJsYW5nLW1vZGUtbWFwIG5pbAorICAiKktleW1hcCB1c2VkIGluIEVybGFuZyBtb2RlLiIpCisoZGVmdmFyIGVybGFuZy1tb2RlLWFiYnJldi10YWJsZSBuaWwKKyAgIkFiYnJldiB0YWJsZSBpbiB1c2UgaW4gRXJsYW5nLW1vZGUgYnVmZmVycy4iKQorKGRlZnZhciBlcmxhbmctbW9kZS1zeW50YXgtdGFibGUgbmlsCisgICJTeW50YXggdGFibGUgaW4gdXNlIGluIEVybGFuZy1tb2RlIGJ1ZmZlcnMuIikKKworKGRlZmNvbnN0IGVybGFuZy1lbWFjcy1tYWpvci12ZXJzaW9uCisgIChpZiAoYm91bmRwICdlbWFjcy1tYWpvci12ZXJzaW9uKQorICAgICAgZW1hY3MtbWFqb3ItdmVyc2lvbgorICAgIChzdHJpbmctbWF0Y2ggIlxcKFswLTldK1xcKVxcLlxcKFswLTldK1xcKSIgZW1hY3MtdmVyc2lvbikKKyAgICAoc3RyaW5nLXRvLWludCAoc3Vic3RyaW5nIGVtYWNzLXZlcnNpb24KKwkJCSAgICAgIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkpKQorICAiTWFqb3IgdmVyc2lvbiBudW1iZXIgb2YgRW1hY3MuIikKKworKGRlZmNvbnN0IGVybGFuZy1lbWFjcy1taW5vci12ZXJzaW9uCisgIChpZiAoYm91bmRwICdlbWFjcy1taW5vci12ZXJzaW9uKQorICAgICAgZW1hY3MtbWlub3ItdmVyc2lvbgorICAgIChzdHJpbmctbWF0Y2ggIlxcKFswLTldK1xcKVxcLlxcKFswLTldK1xcKSIgZW1hY3MtdmVyc2lvbikKKyAgICAoc3RyaW5nLXRvLWludCAoc3Vic3RyaW5nIGVtYWNzLXZlcnNpb24KKwkJCSAgICAgIChtYXRjaC1iZWdpbm5pbmcgMikgKG1hdGNoLWVuZCAyKSkpKQorICAiTWlub3IgdmVyc2lvbiBudW1iZXIgb2YgRW1hY3MuIikKKworKGRlZmNvbnN0IGVybGFuZy14ZW1hY3MtcCAoc3RyaW5nLW1hdGNoICJMdWNpZFxcfFhFbWFjcyIgZW1hY3MtdmVyc2lvbikKKyAgIk5vbi1uaWwgd2hlbiBydW5uaW5nIHVuZGVyIFhFbWFjcyBvciBMdWNpZCBFbWFjcy4iKQorCisoZGVmdmFyIGVybGFuZy14ZW1hY3MtcG9wdXAtbWVudSAnKCJFcmxhbmcgTW9kZSBDb21tYW5kcyIgLiBuaWwpCisgICJDb21tb24gcG9wdXAgbWVudSBmb3IgYWxsIGJ1ZmZlcnMgaW4gRXJsYW5nIG1vZGUuCisKK1RoaXMgdmFyaWFibGUgaXMgZGVzdHJ1Y3RpdmVseSBtb2RpZmllZCBldmVyeSB0aW1lIHRoZSBFcmxhbmcgbWVudQoraXMgbW9kaWZpZWQuICBUaGUgZWZmZWN0IGlzIHRoYXQgYWxsIGNoYW5nZXMgdGFrZSBlZmZla3QgaW4gYWxsCitidWZmZXJzIGluIEVybGFuZyBtb2RlLCBqdXN0IGxpa2UgdW5kZXIgR05VIEVtYWNzLgorCitOZXZlciBFVkVSIHNldCB0aGlzIHZhcmlhYmxlISIpCisKKwwKKzs7IFRlbXBvIHNrZWxldG9uIHRlbXBsYXRlczoKKworKGRlZnZhciBlcmxhbmctc2tlbAorICAnKCgiSWYiICAgICAgICAgICAgImlmIiAgICAgICAgICAgIGVybGFuZy1za2VsLWlmKQorICAgICgiQ2FzZSIgICAgICAgICAgImNhc2UiICAgICAgICAgIGVybGFuZy1za2VsLWNhc2UpCisgICAgKCJSZWNlaXZlIiAgICAgICAicmVjZWl2ZSIgICAgICAgZXJsYW5nLXNrZWwtcmVjZWl2ZSkKKyAgICAoIlJlY2VpdmUgQWZ0ZXIiICJhZnRlciIgICAgICAgICBlcmxhbmctc2tlbC1yZWNlaXZlLWFmdGVyKQorICAgICgiUmVjZWl2ZSBMb29wIiAgImxvb3AiICAgICAgICAgIGVybGFuZy1za2VsLXJlY2VpdmUtbG9vcCkKKyAgICAoIk1vZHVsZSIgICAgICAgICJtb2R1bGUiICAgICAgICBlcmxhbmctc2tlbC1tb2R1bGUpCisgICAgKCJBdXRob3IiICAgICAgICAiYXV0aG9yIiAgICAgICAgZXJsYW5nLXNrZWwtYXV0aG9yKQorICAgICgpCisgICAgKCJTbWFsbCBIZWFkZXIiICAic21hbGwtaGVhZGVyIgorICAgICBlcmxhbmctc2tlbC1zbWFsbC1oZWFkZXIgZXJsYW5nLXNrZWwtaGVhZGVyKQorICAgICgiTm9ybWFsIEhlYWRlciIgIm5vcm1hbC1oZWFkZXIiCisgICAgIGVybGFuZy1za2VsLW5vcm1hbC1oZWFkZXIgZXJsYW5nLXNrZWwtaGVhZGVyKQorICAgICgiTGFyZ2UgSGVhZGVyIiAgImxhcmdlLWhlYWRlciIKKyAgICAgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyIGVybGFuZy1za2VsLWhlYWRlcikKKyAgICAoKQorICAgICgiU21hbGwgU2VydmVyIiAgICJzbWFsbC1zZXJ2ZXIiCisgICAgIGVybGFuZy1za2VsLXNtYWxsLXNlcnZlciBlcmxhbmctc2tlbC1oZWFkZXIpCisgICAgKCkKKyAgICAoIkFwcGxpY2F0aW9uIiAiYXBwbGljYXRpb24iCisgICAgIGVybGFuZy1za2VsLWFwcGxpY2F0aW9uIGVybGFuZy1za2VsLWhlYWRlcikKKyAgICAoIkdlbmVyYWwgVGNwIFJlY2VpdmUiICJmc19nZW5fdGNwX3JlY3YiCisgICAgIGVybGFuZy1za2VsLWZzLWdlbi10Y3AtcmVjdiBlcmxhbmctc2tlbC1oZWFkZXIpCisgICAgKCJUZXN0IFN1aXRlIiAidGVzdC1zdWl0ZSIKKyAgICAgZXJsYW5nLXNrZWwtdGVzdC1zdWl0ZSBlcmxhbmctc2tlbC1oZWFkZXIpCisgICAgKCJUY3AgR2F0ZXdheSIgImZzX3RjcF9nYXRld2F5IgorICAgICBlcmxhbmctc2tlbC1mcy10Y3AtZ2F0ZXdheSBlcmxhbmctc2tlbC1oZWFkZXIpCisgICAgKCJFZG9jIGZ1bmN0aW9uIiAiZnNfZWRvY19oZWFkZXIiCisgICAgIGVybGFuZy1za2VsLWZzLWVkb2MtaGVhZGVyIGVybGFuZy1za2VsLWhlYWRlcikKKyAgICAoIkRCIEluaXRpYWxpemUiICJmc19kYl9pbml0IgorICAgICBlcmxhbmctc2tlbC1mcy1kYi1pbml0IGVybGFuZy1za2VsLWhlYWRlcikKKyAgICAoImdlbl9sZWFkZXIiICJnZW5lcmljLWxlYWRlciIKKyAgICAgZXJsYW5nLXNrZWwtZ2VuZXJpYy1sZWFkZXIgZXJsYW5nLXNrZWwtaGVhZGVyKQorICAgICgiU3VwZXJ2aXNvciIgInN1cGVydmlzb3IiCisgICAgIGVybGFuZy1za2VsLXN1cGVydmlzb3IgZXJsYW5nLXNrZWwtaGVhZGVyKQorICAgICgic3VwZXJ2aXNvcl9icmlkZ2UiICJzdXBlcnZpc29yLWJyaWRnZSIKKyAgICAgZXJsYW5nLXNrZWwtc3VwZXJ2aXNvci1icmlkZ2UgZXJsYW5nLXNrZWwtaGVhZGVyKQorICAgICgiZ2VuX3NlcnZlciIgImdlbmVyaWMtc2VydmVyIgorICAgICBlcmxhbmctc2tlbC1nZW5lcmljLXNlcnZlciBlcmxhbmctc2tlbC1oZWFkZXIpCisgICAgKCJnZW5fZXZlbnQiICJnZW4tZXZlbnQiCisgICAgIGVybGFuZy1za2VsLWdlbi1ldmVudCBlcmxhbmctc2tlbC1oZWFkZXIpCisgICAgKCJnZW5fZnNtIiAiZ2VuLWZzbSIKKyAgICAgZXJsYW5nLXNrZWwtZ2VuLWZzbSBlcmxhbmctc2tlbC1oZWFkZXIpCisgICAgKCJMaWJyYXJ5IG1vZHVsZSIgImdlbi1saWIiCisgICAgIGVybGFuZy1za2VsLWxpYiBlcmxhbmctc2tlbC1oZWFkZXIpCisJKCJDb3JiYSBjYWxsYmFjayIgImdlbi1jb3JiYS1jYiIKKyAgICAgZXJsYW5nLXNrZWwtY29yYmEtY2FsbGJhY2sgZXJsYW5nLXNrZWwtaGVhZGVyKSkKKyAgIipEZXNjcmlwdGlvbiBvZiBhbGwgc2tlbGV0b25zIHRlbXBsYXRlcy4KK0JvdGggZnVuY3Rpb25zIGFuZCBtZW51IGVudHJpZXMgd2lsbCBiZSBjcmVhdGVkLgorCitFYWNoIGVudHJ5IGluIGBlcmxhbmctc2tlbCcgc2hvdWxkIGJlIGEgbGlzdCB3aXRoIHRocmVlIG9yIGZvdXIKK2VsZW1lbnRzLCBvciB0aGUgZW1wdHkgbGlzdC4KKworVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIG5hbWUgd2hpY2ggc2hvd3MgdXAgaW4gdGhlIG1lbnUuICBUaGUgc2Vjb25kCitpcyB0aGUgYHRlbXBvJyBpZGVudGZpZXIgKFRoZSBzdHJpbmcgXCJlcmxhbmctXCIgd2lsbCBiZSBhZGRlZCBpbgorZnJvbnQgb2YgaXQpLiAgVGhlIHRoaXJkIGlzIHRoZSBza2VsZXRvbiBkZXNjcmlwdG9yLCBhIHZhcmlhYmxlCitjb250YWluaW5nIGB0ZW1wbycgYXR0cmlidXRlcyBhcyBkZXNjcmliZWQgaW4gdGhlIGZ1bmN0aW9uCitgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4gIFRoZSBvcHRpb25hbCBmb3VydGggZWxlbWVudHMgZGVub3RlcyBhCitmdW5jdGlvbiB3aGljaCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIG1lbnUgaXMgc2VsZWN0ZWQuCisKK0Z1bmN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGV2ZXJ5IHRlbXBsYXRlIHdpbGwgYmUgY3JlYXRlZC4gIFRoZSBuYW1lCitvZiB0aGUgZnVuY3Rpb24gd2lsbCBiZSBgdGVtcG8tdGVtcGxhdGUtZXJsYW5nLVgnIHdoZXJlIGBYJyBpcyB0aGUKK3RlbXBvIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGVsZW1lbnRzCitpbiB0aGlzIGxpc3QuCisKK0EgbGlzdCB3aXRoIHplcm8gZWxlbWVudHMgbWVhbnMgdGhhdCB0aGUgYSBob3Jpc29udGFsIGxpbmUgc2hvdWxkCitiZSBwbGFjZWQgaW4gdGhlIG1lbnUuIikKKworOzsgSW4gWEVtYWNzIGB1c2VyLW1haWwtYWRkcmVzcycgcmV0dXJucyAieEB5LnogKEZvbyBCYXIpIiBBUkdIIQorOzsgV2hhdCdzIHdyb25nIHdpdGggdGhhdD8gUkZDIDgyMiBzYXlzIGl0J3MgbGVnYWwuICAgW3N2ZXJrZXJ3XQorKGRlZnZhciBlcmxhbmctc2tlbC1tYWlsLWFkZHJlc3MKKyAgKGNvbmNhdCAodXNlci1sb2dpbi1uYW1lKSAiQCIKKwkgIChvciAoYW5kIChib3VuZHAgJ21haWwtaG9zdC1hZGRyZXNzKQorCQkgICAoc3ltYm9sLXZhbHVlICdtYWlsLWhvc3QtYWRkcmVzcykpCisJICAgICAgKHN5c3RlbS1uYW1lKSkpCisgICJNYWlsIGFkZHJlc3Mgb2YgdGhlIHVzZXIuIikKKworOzsgRXhwcmVzc2lvbiB0ZW1wbGF0ZXM6CisoZGVmdmFyIGVybGFuZy1za2VsLWNhc2UKKyAgJygoZXJsYW5nLXNrZWwtc2tpcC1ibGFuaykgbyA+CisgICAgImNhc2UgIiBwICIgb2YiIG4+IHAgIl8gLT4iIG4+IHAgIm9rIiBuPiAiZW5kIiBwKQorICAiKlRoZSBza2VsZXRvbiBvZiBhIGBjYXNlJyBleHByZXNzaW9uLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworKGRlZnZhciBlcmxhbmctc2tlbC1pZgorICAnKChlcmxhbmctc2tlbC1za2lwLWJsYW5rKSBvID4KKyAgICAiaWYiICBuPiBwICIgLT4iIG4+IHAgIm9rIiBuPiAiZW5kIiBwKQorICAiVGhlIHNrZWxldG9uIG9mIGFuIGBpZicgZXhwcmVzc2lvbi4KK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtcmVjZWl2ZQorICAnKChlcmxhbmctc2tlbC1za2lwLWJsYW5rKSBvID4KKyAgICAicmVjZWl2ZSIgbj4gcCAiXyAtPiIgbj4gcCAib2siIG4+ICJlbmQiIHApCisgICIqVGhlIHNrZWxldG9uIG9mIGEgYHJlY2VpdmUnIGV4cHJlc3Npb24uCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLXJlY2VpdmUtYWZ0ZXIKKyAgJygoZXJsYW5nLXNrZWwtc2tpcC1ibGFuaykgbyA+CisgICAgInJlY2VpdmUiIG4+IHAgIl8gLT4iIG4+IHAgIm9rIiBuPiAiYWZ0ZXIgIiBwICJUIC0+IiBuPgorICAgIHAgIm9rIiBuPiAiZW5kIiBwKQorICAiKlRoZSBza2VsZXRvbiBvZiBhIGByZWNlaXZlJyBleHByZXNzaW9uIHdpdGggYW4gYGFmdGVyJyBjbGF1c2UuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLXJlY2VpdmUtbG9vcAorICAnKCYgbyAibG9vcCgiIHAgIikgLT4iIG4+ICJyZWNlaXZlIiBuPiBwICJfIC0+IiBuPgorICAgICAgImxvb3AoIiBwICIpIiBuPiAiZW5kLiIpCisgICIqVGhlIHNrZWxldG9uIG9mIGEgc2ltcGxlIGByZWNpZXZlJyBsb29wLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworCis7OyBBdHRyaWJ1dGUgdGVtcGxhdGVzCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtbW9kdWxlCisgICcoJiAiLW1vZHVsZSgiCisgICAgICAoZXJsYW5nLWFkZC1xdW90ZXMtaWYtbmVlZGVkIChlcmxhbmctZ2V0LW1vZHVsZS1mcm9tLWZpbGUtbmFtZSkpCisgICAgICAiKS4iIG4pCisgICIqVGhlIHNrZWxldG9uIG9mIGEgYG1vZHVsZScgYXR0cmlidXRlLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworKGRlZnZhciBlcmxhbmctc2tlbC1hdXRob3IKKyAgJygmICItYXV0aG9yKCciIGVybGFuZy1za2VsLW1haWwtYWRkcmVzcyAiJykuIiBuKQorICAiKlRoZSBza2VsZXRvbiBvZiBhIGBhdXRob3InIGF0dHJpYnV0ZS4KK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtdmMgbmlsCisgICIqVGhlIHNrZWxldG9uIHRlbXBsYXRlIHRvIGdlbmVyYXRlIGEgdmVyc2lvbiBjb250cm9sIGF0dHJpYnV0ZS4KK1RoZSBkZWZhdWx0IGlzIHRvIGluc2VydCBub3RoaW5nLiAgRXhhbXBsZSBvZiB1c2FnZToKKworICAgIChzZXRxIGVybGFuZy1za2VsLXZjICcoJiBcIi1yY3MoXFxcIiRcSWQ6ICQgXFxcIikuXCIpIG4pCisKK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtZXhwb3J0CisgICcoJiAiLWV4cG9ydChbIiBuPiAiXSkuIiBuKQorICAiKlRoZSBza2VsZXRvbiBvZiBhbiBgZXhwb3J0JyBhdHRyaWJ1dGUuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLWltcG9ydAorICAnKCYgIiUlLWltcG9ydChNb2R1bGUsIFtGdW5jdGlvbi9Bcml0eSwgLi4uXSkuIiBuKQorICAiKlRoZSBza2VsZXRvbiBvZiBhbiBgaW1wb3J0JyBhdHRyaWJ1dGUuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLWNvbXBpbGUgbmlsCis7OyAgJygmICIlJS1jb21waWxlKGV4cG9ydF9hbGwpLiIgbikKKyAgIipUaGUgc2tlbGV0b24gb2YgYSBgY29tcGlsZScgYXR0cmlidXRlLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworCis7OyBDb21tZW50IHRlbXBsYXRlcy4KKworKGRlZnZhciBlcmxhbmctc2tlbC1kYXRlLWZ1bmN0aW9uICdlcmxhbmctc2tlbC1kZC1tbW0teXl5eQorICAiKkZ1bmN0aW9uIHdoaWNoIHJldHVybnMgZGF0ZSBzdHJpbmcuCitMb29rIGluIHRoZSBtb2R1bGUgYHRpbWUtc3RhbXAnIGZvciBhIGJhdHRlcnkgb2YgZnVuY3Rpb25zLiIpCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtY29weXJpZ2h0LWNvbW1lbnQgJygpCisgICIqVGhlIHRlbXBsYXRlIGZvciBhIGNvcHlyaWdodCBsaW5lIGluIHRoZSBoZWFkZXIsIG5vcm1hbGx5IGVtcHR5LgorVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgYm91bmQgdG8gYSBgdGVtcG8nIHRlbXBsYXRlLCBmb3IgZXhhbXBsZToKKyAgJygmIFwiJSUlIENvcHlyaWdodCAoQykgMjAwMCwgWW95b2R5bmUsIEluYy5cIiBuKQorCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLWNyZWF0ZWQtY29tbWVudAorICAnKCYgIiUlJSBDcmVhdGVkIDogIiAoZnVuY2FsbCBlcmxhbmctc2tlbC1kYXRlLWZ1bmN0aW9uKSAiIGJ5ICIKKyAgICAgICh1c2VyLWZ1bGwtbmFtZSkgIiA8IiBlcmxhbmctc2tlbC1tYWlsLWFkZHJlc3MgIj4iIG4pCisgICIqVGhlIHRlbXBsYXRlIGZvciB0aGUgXCJDcmVhdGVkOlwiIGNvbW1lbnQgbGluZS4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLWF1dGhvci1jb21tZW50CisgICcoJiAiJSUlIEF1dGhvciAgOiAiICh1c2VyLWZ1bGwtbmFtZSkgIiA8IiBlcmxhbmctc2tlbC1tYWlsLWFkZHJlc3MgIj4iIG4pCisgICIqVGhlIHRlbXBsYXRlIGZvciBjcmVhdGluZyB0aGUgXCJBdXRob3I6XCIgbGluZSBpbiB0aGUgaGVhZGVyLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworKGRlZnZhciBlcmxhbmctc2tlbC1maWxlLWNvbW1lbnQKKyAgJygmICIlJSUgRmlsZSAgICA6ICIgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgYnVmZmVyLWZpbGUtbmFtZSkgbikKKyAgIipUaGUgdGVtcGxhdGUgZm9yIGNyZWF0aW5nIHRoZSBcIk1vZHVsZTpcIiBsaW5lIGluIHRoZSBoZWFkZXIuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLXNtYWxsLWhlYWRlcgorICAnKG8gKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbW9kdWxlKQorOzsgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmctc2tlbC1hdXRob3IpCisgICAgICBuCisgICAgICAoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1jb21waWxlCis7OwkJCSAgIGVybGFuZy1za2VsLWV4cG9ydAorCQkJICAgZXJsYW5nLXNrZWwtdmMpKQorICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIHNtYWxsIGhlYWRlciB3aXRob3V0IGFueSBjb21tZW50cy4KK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtbm9ybWFsLWhlYWRlcgorICAnKG8gKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtY29weXJpZ2h0LWNvbW1lbnQKKwkJCSAgIGVybGFuZy1za2VsLWZpbGUtY29tbWVudAorCQkJICAgZXJsYW5nLXNrZWwtYXV0aG9yLWNvbW1lbnQpCisgICAgICAiJSUlIERlc2NyaXB0aW9uIDogIiBwIG4KKyAgICAgIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWNyZWF0ZWQtY29tbWVudCkgbgorICAgICAgKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtc21hbGwtaGVhZGVyKSBuKQorICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIG5vcm1hbCBoZWFkZXIuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcgorICAnKG8gIiUlJSAkSWQ6IGVybGFuZy5lbCx2IDEuMjEgMjAwNC8wOC8wMyAyMDozODo0MyBtbG9nYW4gRXhwICQiIG4gKGVybGFuZy1za2VsLXNlcGFyYXRvcikKKyAgICAgIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWNvcHlyaWdodC1jb21tZW50CisJCQkgICBlcmxhbmctc2tlbC1maWxlLWNvbW1lbnQKKwkJCSAgIGVybGFuZy1za2VsLWF1dGhvci1jb21tZW50KQorCSAgIiUlJSIgbgorICAgICAgIiUlJSBAZG9jICAiIHAgbiAKKwkgICIlJSUgQGVuZCIgbgorCSAgIiUlJSIgbgorICAgICAgKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtY3JlYXRlZC1jb21tZW50KQorICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvcikgCisgICAgICAoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1zbWFsbC1oZWFkZXIpICkKKyAgIipUaGUgdGVtcGxhdGUgb2YgYSBsYXJnZSBoZWFkZXIuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisKKzs7IFNlcnZlciB0ZW1wbGF0ZXMuCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtc21hbGwtc2VydmVyCisgICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQorIAkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJIiUlIEluY2x1ZGUgZmlsZXMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEV4dGVybmFsIGV4cG9ydHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItZXhwb3J0KFtzdGFydF9saW5rLzBdKS4iIG4gbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW50ZXJuYWwgZXhwb3J0cyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1leHBvcnQoW2luaXQvMV0pLiIgbiBuCisgICAgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgTWFjcm9zIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgorCW4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIFJlY29yZHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorCW4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MgVGhlIHN0YXJ0aW5nIHBvaW50LiIgbgorICAgICIlJSBAc3BlYyBzdGFydF9saW5rKCkgLT4ge29rLCBQaWR9IiBuCisgICAgIiUlIEBlbmQiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInN0YXJ0X2xpbmsoKSAtPiIgbj4KKyAgICAicHJvY19saWI6c3RhcnRfbGluayg/TU9EVUxFLCBpbml0LCBbc2VsZigpXSkuIiBuIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBTZXJ2ZXIgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIERlc2NyaXB0aW9uOiBJbml0aWFsaXplcyB0aGlzIHNlcnZlci4iIG4KKyAgICAiJSUgVmFyaWFibGVzOiIgbgorICAgICIlJSAgRnJvbSAtIFRoZSBwaWQgb2YgdGhlIHBhcmVudCBwcm9jZXNzLiIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiaW5pdChGcm9tKSAtPiIgbj4KKyAgICAicmVnaXN0ZXIoP1NFUlZFUiwgc2VsZigpKSwiIG4+CisgICAgInByb2NfbGliOmluaXRfYWNrKEZyb20sIHtvaywgc2VsZigpfSksIiBuPgorICAgICJsb29wKEZyb20pLiIgbiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAibG9vcChGcm9tKSAtPiIgbj4KKyAgICAicmVjZWl2ZSIgbj4KKyAgICBwICJfIC0+IiBuPgorICAgICJsb29wKEZyb20pIiBuPgorICAgICJlbmQuIgorICAgICkKKyAgIipUZW1wbGF0ZSBvZiBhIHNtYWxsIHNlcnZlci4KK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKzs7IEJlaGF2aW91ciB0ZW1wbGF0ZXMuCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtYXBwbGljYXRpb24KKyAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCisgICAgIi1iZWhhdmlvdXIoYXBwbGljYXRpb24pLiIgbgorIAkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJIiUlIEluY2x1ZGUgZmlsZXMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1leHBvcnQoWyIgbj4gCisgICAgCSJzdGFydC8yLCIgbj4KKwkic2h1dGRvd24vMCwiIG4+CisJInN0b3AvMSIgbj4KKwkiXSkuIiBuCisgICAgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgTWFjcm9zIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKwluCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBSZWNvcmRzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MgVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBhbiBlcmxhbmcgYXBwbGljYXRpb24uIiBuCisgICAgIiUlIEBzcGVjIHN0YXJ0KFR5cGUsIFN0YXJ0QXJncykgLT4ge29rLCBQaWR9IHwge29rLCBQaWQsIFN0YXRlfSB8IHtlcnJvciwgUmVhc29ufSIgbgorICAgICIlJSBAZW5kIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJzdGFydChUeXBlLCBTdGFydEFyZ3MpIC0+IiBuPgorICAgICJjYXNlICIoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUpIl9zdXA6c3RhcnRfbGluayhTdGFydEFyZ3MpIG9mIiBuPgorICAgICJ7b2ssIFBpZH0gLT4gIiBuPgorICAgICJ7b2ssIFBpZH07IiBuPgorICAgICJFcnJvciAtPiIgbj4KKyAgICAiRXJyb3IiIG4+CisgICAgImVuZC4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBAZG9jIENhbGxlZCB0byBzaHVkb3duIHRoZSAiKGVybGFuZy1nZXQtbW9kdWxlLWZyb20tZmlsZS1uYW1lKSIgYXBwbGljYXRpb24uIiBuCisgICAgIiUlIEBzcGVjIHNodXRkb3duKCkgLT4gb2sgIm4KKyAgICAiJSUgQGVuZCJuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJzaHV0ZG93bigpIC0+IiBuPgorICAgICJhcHBsaWNhdGlvbjpzdG9wKCIoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUpIikuIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgIiUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQ2FsbGVkIHVwb24gdGhlIHRlcm1pbnRpb24gb2YgYW4gYXBwbGljYXRpb24uIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJzdG9wKFN0YXRlKSAtPiIgbj4KKyAgICAib2suIiBuCisgICAgbgorICAgICkKKyAgIipUaGUgdGVtcGxhdGUgb2YgYW4gYXBwbGljYXRpb24gYmVoYXZpb3VyLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworOzsgTWFydGlucyB3b3JrCisKKzs7IHRlc3Qgc2VydmVyIHRlc3Qgc3VpdGUgdGVtcGxhdGUKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtdGVzdC1zdWl0ZQorICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWNvcHlyaWdodC1jb21tZW50CisJCQkgICBlcmxhbmctc2tlbC1maWxlLWNvbW1lbnQKKwkJCSAgIGVybGFuZy1za2VsLWF1dGhvci1jb21tZW50KQorICAgICIlJSUiIG4KKyAgICAiJSUlIEBkb2MgICIgcCBuIAorICAgICIlJSUgPHA+QSB0ZXN0IHNwZWMgY29uc2lzdHMgb2YgdGhlIHRlc3Qgc2VydmVyIHJlcXVpcmVkIGZ1bmN0aW9ucyBhcyBkZXRhaWxlZCIgbgorICAgICIlJSUgYnkgdGhlIGNvbW1lbnRzIGZvciB0aGUgZnVuY3Rpb25zIHRoZW1zZWx2ZXMgZnVydGhlciBkb3duIGluIHRoaXMiIG4KKyAgICAiJSUlIGZpbGUuIFRoZSByZXN0IG9mIGEgdGVzdCBzdWl0ZSBjb25zaXN0cyBvZiB1c2VyIGRlZmluZWQgQ2FzZSBmdW5jdGlvbnMiIG4KKyAgICAiJSUlIGFzIHJlZmVyZW5jZWQgYnkgdGhlIHN1aXRlIGNsYXVzZSBvZiB0aGUgYWxsLzEgZnVuY3Rpb24gYW5kICJuCisgICAgIiUlJSBkZXNjcmliZWQgYmVsb3cuPC9wPiJuCisgICAgIiUlJSJuCisgICAgIiUlJSA8c3Ryb25nPiIKKyAgICAiJSUlIENhc2UoZG9jKSAgICAtPiBbRGVjcmlwdGlvbl0iIG4KKyAgICAiJSUlIENhc2Uoc3VpdGUpICAtPiBbXSB8IFRlc3RTcGVjIHwge3NraXAsIENvbW1lbnR9IiBuCisgICAgIiUlJSBDYXNlKENvbmZpZykgLT4ge3NraXAsIENvbW1lbnR9IHwge2NvbW1lbnQsIENvbW1lbnR9IHwgT2siIG4KKyAgICAiJSUlIDwvc3Ryb25nPjxwcmU+Im4KKyAgICAiJSUlIm4KKyAgICAiJSUlIFZhcmlhYmxlczoiIG4KKyAgICAiJSUlICBEZXNjcmlwdGlvbiAtIFNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IGNhc2UgVGVzdFNwZWMiIG4KKyAgICAiJSUlICBDb21tZW50IC0gVGhpcyBjb21tZW50IHdpbGwgYmUgcHJpbnRlZCBvbiB0aGUgSFRNTCByZXN1bHQgcGFnZSAiIG4KKyAgICAiJSUlIm4KKyAgICAiJSUlIFR5cGVzOiIgbgorICAgICIlJSUgIERlc2NyaXB0aW9uID0gc3RyaW5nKCkiIG4KKyAgICAiJSUlICBUZXN0U3BlYyA9IGxpc3QoKSIgbgorICAgICIlJSUgIE9rID0gdGVybSgpIiBuCisgICAgIiUlJSAgQ29tbWVudCA9IHN0cmluZygpIiBuCisgICAgIiUlJSAgQ29uZmlnID0gdGVybSgpIiBuCisgICAgIiUlJSA8L3ByZT4iIG4KKyAgICAiJSUlIDxwPlRoZSBkb2N1bWVudGF0aW9uIGNsYXVzZSAoYXJndW1lbnQgZG9jKSBjYW4gYmUgdXNlZCBmb3IiIG4KKyAgICAiJSUlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIHRlc3QgZG9jdW1lbnRhdGlvbiBvciB0ZXN0IGRlc2NyaXB0aW9ucy48L3A+IiBuCisgICAgIiUlJSJuCisgICAgIiUlJSA8cD5UaGUgc3BlY2lmaWNhdGlvbiBjbGF1c2UgKGFyZ3VtZW50IHNwZWMpIHNoYWxsIHJldHVybiBhbiBlbXB0eSIgbiAKKyAgICAiJSUlIGxpc3QsIHRoZSB0ZXN0IHNwZWNpZmljYXRpb24gZm9yIHRoZSB0ZXN0IGNhc2Ugb3Ige3NraXAsQ29tbWVudH0uIiBuCisgICAgIiUlJSBUaGUgc3ludGF4IG9mIGEgdGVzdCBzcGVjaWZpY2F0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgcmVmZXJlbmNlICIgbgorICAgICIlJSUgbWFudWFsIGZvciB0aGUgVGVzdCBTZXJ2ZXIgYXBwbGljYXRpb24uPC9wPiIgbgorICAgICIlJSUibgorICAgICIlJSUgPHA+Tm90ZSB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uIGNsYXVzZSBhbHdheXMgaXMgZXhlY3V0ZWQgb24gIm4KKyAgICAiJSUlIHRoZSBjb250cm9sbGVyIGhvc3QuPC9wPiJuCisgICAgIiUlJSJuCisgICAgIiUlJSA8cD5UaGUgZXhlY3V0aW9uIGNsYXVzZSAoYXJndW1lbnQgQ29uZmlnKSBpcyBvbmx5IGNhbGxlZCBpZiAibgorICAgICIlJSUgdGhlIHNwZWNpZmljYXRpb24gY2xhdXNlIHJldHVybnMgYW4gZW1wdHkgbGlzdC4gVGhlIGV4ZWN1dGlvbiAibgorICAgICIlJSUgY2xhdXNlIGlzIHRoZSByZWFsIHRlc3QgY2FzZS4gSGVyZSB5b3UgbXVzdCBjYWxsIHRoZSBmdW5jdGlvbnMgIm4KKyAgICAiJSUlIHlvdSB3YW50IHRvIHRlc3QsIGFuZCBkbyB3aGF0ZXZlciB5b3UgbmVlZCB0byBjaGVjayB0aGUgcmVzdWx0LiAibgorICAgICIlJSUgSWYgc29tZXRpbmcgZmFpbHMsIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBjcmFzaGVzIG9yIGNhbGwgIm4KKyAgICAiJSUlIHRlc3Rfc2VydmVyOmZhaWwvMC8xICh3aGljaCBhbHNvIHdpbGwgY2F1c2UgdGhlIHByb2Nlc3MgdG8gY3Jhc2gpLjwvcD4ibgorICAgICIlJSUibgorICAgICIlJSUgPHA+WW91IGNhbiByZXR1cm4ge3NraXAsQ29tbWVudH0gaWYgeW91IGRlY2lkZSBub3QgdG8gcnVuIHRoZSAibgorICAgICIlJSUgdGVzdCBjYXNlIGFmdGVyIGFsbCwgZS5nLiBpZiBpdCBpcyBub3QgYXBwbGljYWJsZSBvbiB0aGlzIHBsYXRmb3JtLjwvcD4ibgorICAgICIlJSUibgorICAgICIlJSUgPHA+WW91IGNhbiByZXR1cm4ge2NvbW1lbnQsQ29tbWVudH0gaWYgeW91IHdpc2ggdG8gcHJpbnQgc29tZSAibgorICAgICIlJSUgaW5mb3JtYXRpb24gaW4gdGhlICdDb21tZW50JyBmaWVsZCBvbiB0aGUgSFRNTCByZXN1bHQgcGFnZS48L3A+Im4KKyAgICAiJSUlIm4KKyAgICAiJSUlIDxwPklmIHRoZSBleGVjdXRpb24gY2xhdXNlIHJldHVybnMgYW55dGhpbmcgZWxzZSwgaXQgaXMgY29uc2lkZXJlZCAibgorICAgICIlJSUgYSBzdWNjZXNzLiA8L3A+Im4KKyAgICAiJSUlIEBlbmQiIG4KKyAgICAiJSUlIiBuCisgICAgKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtY3JlYXRlZC1jb21tZW50KQorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IpIAorICAgIChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLXNtYWxsLWhlYWRlcikKKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEluY2x1ZGUgZmlsZXMiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIE1hY3JvIERlZmluaXRpb25zIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBUZXN0IFN1aXRlIEV4cG9ydHMiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItZXhwb3J0KFsibj4iYWxsLzEsIm4+ImluaXRfcGVyX3Rlc3RjYXNlLzIsIm4+ImZpbl9wZXJfdGVzdGNhc2UvMiJuPiJdKS4iIG4gCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgRXhwb3J0cyAtIHRlc3QgY2FzZXMgbXVzdCBiZSBleHBvcnRlZC4iIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItZXhwb3J0KFsibj4iXSkuIm4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgVGVzdCBTZXJ2ZXIgRnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBAZG9jIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGVzdCBzcGVjaWZpY2F0aW9uIGZvciB0aGUgdGVzdCBzdWl0ZSBtb2R1bGUuIm4KKyAgICAiJSUgPHByZT4ibgorICAgICIlJSBUeXBlczoibgorICAgICIlJSAgVGVzdFNwZWMgPSBsaXN0KCkibgorICAgICIlJSAgQ29tbWVudCA9IHN0cmluZygpIm4KKyAgICAiJSUibgorICAgICIlJSA8L3ByZT4ibgorICAgICIlJSBAc3BlYyBhbGwoc3VpdGUpIC0+IFRlc3RTcGVjIHwge3NraXAsIENvbW1lbnR9Im4KKyAgICAiJSUgQGVuZCJuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJhbGwoZG9jKSAgIC0+IFtdOyJuIAorICAgICJhbGwoc3VpdGUpIC0+IFtdLiJuIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBAZG9jIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBlYWNoIHRlc3QgY2FzZS4ibgorICAgICIlJSA8cHJlPiJuCisgICAgIiUlIFR5cGVzOiJuCisgICAgIiUlICBDYXNlID0gYXRvbSgpIm4KKyAgICAiJSUgIENvbmZpZyA9IE5ld0NvbmZpZyA9IHRlcm0oKSJuCisgICAgIiUlIm4KKyAgICAiJSUgPC9wcmU+Im4KKyAgICAiJSUgQHNwZWMgaW5pdF9wZXJfdGVzdGNhc2UoQ2FzZSwgQ29uZmlnKSAtPiBOZXdDb25maWcibgorICAgICIlJSBAZW5kIm4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImluaXRfcGVyX3Rlc3RjYXNlKENhc2UsIENvbmZpZykgLT4gW10uIm4gbiAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBAZG9jIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGVhY2ggdGVzdCBjYXNlLiJuCisgICAgIiUlIDxwcmU+Im4KKyAgICAiJSUgVHlwZXM6Im4KKyAgICAiJSUgIENhc2UgPSBhdG9tKCkibgorICAgICIlJSAgQ29uZmlnID0gdGVybSgpIm4KKyAgICAiJSUibgorICAgICIlJSA8L3ByZT4ibgorICAgICIlJSBAc3BlYyBmaW5fcGVyX3Rlc3RjYXNlKENhc2UsIENvbmZpZykgLT4gdm9pZCgpIm4KKyAgICAiJSUgQGVuZCJuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJmaW5fcGVyX3Rlc3RjYXNlKENhc2UsIENvbmZpZykgLT4gb2suIm4gbiAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW5kaXZpZHVhbCBUZXN0IENhc2UgRnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBAZG9jIC4iIG4KKyAgICAiJSUgQGVuZCIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiQ2FzZShkb2MpICAgICAgICAgICAgICAgICAgICAgIC0+IFtdOyJuCisgICAgIkNhc2Uoc3VpdGUpICAgICAgICAgICAgICAgICAgICAtPiBbXTsibgorICAgICJDYXNlKENvbmZpZykgd2hlbiBsaXN0KENvbmZpZykgLT4gb2suIm4gbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBJbnRlcm5hbCBGdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICkKKyAgIipUaGUgdGVtcGxhdGUgb2YgYW4gYXBwbGljYXRpb24gYmVoYXZpb3VyLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworCis7OyBmc190Y3BfZ2F0ZXdheSB0ZW1wbGF0ZQorKGRlZnZhciBlcmxhbmctc2tlbC1mcy10Y3AtZ2F0ZXdheQorICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKKyAgICAiJSUgVE9ETyBJbXBsZW1lbnQgdGhpcyBiZWhhdmlvdXIiIG4KKyAgICAiJSUgLWJlaGF2aW91cih0Y3BfZ2F0ZXdheSkuIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBJbmNsdWRlIGZpbGVzIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAiLWV4cG9ydChbIiBuPiAic3RhcnRfbGluay8xLCBpbml0LzAsIHN5bmNfcmVxdWVzdC81LCBhc3luY19yZXF1ZXN0LzUsIHRlcm1pbmF0ZS8yIiBuCisgICAgIiAgICAgICAgXSkuIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgTWFjcm9zIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICItZGVmaW5lKFNFUlZFUiwgP01PRFVMRSkuIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgUmVjb3JkcyIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1yZWNvcmQoc3RhdGUsIHt9KS4ibgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQGRvYyBTdGFydHMgdGhlIGdhdGV3YXkgc2VydmVyLiJuCisgICAgIiUlIDxwcmU+Im4KKyAgICAiJSUibgorICAgICIlJSBFeHBlY3RzOiJuCisgICAgIiUlICBQb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGJpbmQgdG8uIm4KKyAgICAiJSUibgorICAgICIlJSBUeXBlczoibgorICAgICIlJSAgUG9ydCA9IGludGVnZXIoKSJuCisgICAgIiUlIm4KKyAgICAiJSUgPC9wcmU+Im4KKyAgICAiJSUibgorICAgICIlJSBAc3BlYyBzdGFydF9saW5rKFBvcnQpIC0+IHtvaywgcGlkKCl9Im4KKyAgICAiJSUgQGVuZCJuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJzdGFydF9saW5rKFBvcnQpIC0+IiBuPgorICAgICJDYWxsQmFja01vZHVsZSA9ID9NT0RVTEUsIm4+CisgICAgIiAgICBmc190Y3BfZ2F0ZXdheTpzdGFydF9saW5rKENhbGxCYWNrTW9kdWxlLCBQb3J0KS4ibgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBDYWxsYmFja3MiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQGRvYyBJbml0aWFsaXphdGlvbiBzdGFnZSBmb3IgZWFjaCBuZXcgY29ubmVjdGlvbiB0byB0aGUgZ2F0ZXdheSBzZXJ2ZXIuIm4KKyAgICAiJSUgPHByZT4ibgorICAgICIlJSJuCisgICAgIiUlIFR5cGVzOiJuCisgICAgIiUlICBTdGF0ZSA9IHRlcm0oKSJuCisgICAgIiUlIm4KKyAgICAiJSUgPC9wcmU+Im4KKyAgICAiJSUibgorICAgICIlJSBAc3BlYyBpbml0KCkgLT4ge29rLCBTdGF0ZX0ibgorICAgICIlJSBAZW5kIm4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImluaXQoKSAtPiJuPgorICAgICJ7b2ssICNzdGF0ZXt9fS4ibgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MgQ2FsbGVkIHdoZW4gdGhlIHNlcnZlciByZWNlaXZlcyBhIHN5bmNyb25vdXMgcmVxdWVzdCBmcm9tIGEgY2xpZW50LiJuCisgICAgIiUlIDxwcmU+Im4KKyAgICAiJSUibgorICAgICIlJSBFeHBlY3RzOiJuCisgICAgIiUlICBJRCAtIFRoZSByZXF1ZXN0IElEIG51bWJlciJuCisgICAgIiUlICBNIC0gbW9kdWxlIG5hbWUibgorICAgICIlJSAgRiAtIGZ1bmN0aW9uIG5hbWUibgorICAgICIlJSAgQSAtIExpc3Qgb2YgYXJndW1lbnRzIm4KKyAgICAiJSUgIFJlcGx5IC0gQSBtZXNzYWdlIHNlbnQgYmFjayBvdmVyIHRoZSB0Y3Agc3RyZWFtIHRvIHRoZSBjbGllbnQibgorICAgICIlJSJuCisgICAgIiUlIFR5cGVzOiJuCisgICAgIiUlICBJRCA9IE0gPSBGID0gUmVwbHkgPSBzdHJpbmcoKSJuCisgICAgIiUlICBBID0gW3N0cmluZygpXSJuCisgICAgIiUlICBTdGF0ZSA9IHRlcm0oKSJuCisgICAgIiUlICBSZXBseSA9IHN0cmluZygpIm4KKyAgICAiJSUibgorICAgICIlJSA8L3ByZT4ibgorICAgICIlJSJuCisgICAgIiUlIEBzcGVjIHN5bmNfcmVxdWVzdChJRCwgTSwgRiwgQSwgU3RhdGUpIC0+Im4KKyAgICAiJSUge3JlcGx5LCBSZXBseSwgU3RhdGV9IHwge3N0b3AsIFJlcGx5LCBSZWFzb24sIFN0YXRlfSB8IHtub3JlcGx5LCBTdGF0ZX0ibgorICAgICIlJSBAZW5kIm4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInN5bmNfcmVxdWVzdChJRCwgTSwgRiwgQSwgU3RhdGUpIC0+Im4+CisgICAgIntyZXBseSwgXCJzeW5jIG9rXCIsIFN0YXRlfS4ibgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MgQ2FsbGVkIHdoZW4gdGhlIHNlcnZlciByZWNlaXZlcyBhIGFzeW5jcm9ub3VzIHJlcXVlc3QgZnJvbSBhIGNsaWVudC4ibgorICAgICIlJSA8cHJlPiJuCisgICAgIiUlIm4KKyAgICAiJSUgRXhwZWN0czoibgorICAgICIlJSAgSUQgLSBUaGUgcmVxdWVzdCBJRCBudW1iZXIibgorICAgICIlJSAgTSAtIG1vZHVsZSBuYW1lIm4KKyAgICAiJSUgIEYgLSBmdW5jdGlvbiBuYW1lIm4KKyAgICAiJSUgIEEgLSBMaXN0IG9mIGFyZ3VtZW50cyJuCisgICAgIiUlICBSZXBseSAtIEEgbWVzc2FnZSBzZW50IGJhY2sgb3ZlciB0aGUgdGNwIHN0cmVhbSB0byB0aGUgY2xpZW50Im4KKyAgICAiJSUibgorICAgICIlJSBUeXBlczoibgorICAgICIlJSAgSUQgPSBNID0gRiA9IHN0cmluZygpIm4KKyAgICAiJSUgIEEgPSBbc3RyaW5nKCldIm4KKyAgICAiJSUgIFN0YXRlID0gdGVybSgpIm4KKyAgICAiJSUgIFJlcGx5ID0gc3RyaW5nKCkibgorICAgICIlJSJuCisgICAgIiUlIDwvcHJlPiJuCisgICAgIiUlIm4KKyAgICAiJSUgQHNwZWMgYXN5bmNfcmVxdWVzdChJRCwgTSwgRiwgQSwgU3RhdGUpIC0+Im4gCisgICAgIiUlIHtzdG9wLCBSZWFzb24sIFN0YXRlfSB8IHtub3JlcGx5LCBTdGF0ZX0ibgorICAgICIlJSBAZW5kIm4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImFzeW5jX3JlcXVlc3QoSUQsIE0sIEYsIEEsIFN0YXRlKSAtPiJuPgorICAgICJ7bm9yZXBseSwgU3RhdGV9LiJuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQGRvYyBDYWxsZWQgdXBvbiB0aGUgc2h1dGRvd24gb2YgYSBjb25uZWN0aW9uLiJuCisgICAgIiUlIEBzcGVjIHRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiB2b2lkKCkibgorICAgICIlJSBAZW5kIm4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiJuPgorICAgICJvay4ibgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBJbnRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgKQorICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGZzX3RjcF9nYXRld2F5IGJlaGF2aW91ci4KK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKworOzsgZ2VuX3RjcF9yZWN2IHRlbXBsYXRlCisoZGVmdmFyIGVybGFuZy1za2VsLWZzLWdlbi10Y3AtcmVjdgorICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKKyAgICAiJSUgVE9ETyBJbXBsZW1lbnQgdGhpcyBiZWhhdmlvdXIiIG4KKyAgICAiJSUgLWJlaGF2aW91cihnZW5fdGNwX3JlY3YpLiIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1leHBvcnQoWyIgbj4gInN0YXJ0X2xpbmsvMCIgbj4gIl0pLiIgbiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBTZXJ2ZXIgQ2FsbGJhY2tzIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAiLWV4cG9ydChbIiBuPiAiaW5pdC8xLCIgbj4gImhhbmRsZV9wYWNrZXQvMywiIG4+ICJoYW5kbGVfY2FsbC80IiBuPiAKKyAgICAiaGFuZGxlX2luZm8vMyIgbj4gInRlcm1pbmF0ZS8yIiBuPiAiXSkuIiBuIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEluY2x1ZGUgZmlsZXMiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEFQSSAtIEV4dGVybmFsIEV4cG9ydHMiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItZXhwb3J0KFsiIG4+IAorICAgICJzdGFydF9saW5rLzEiIG4+CisgICAgIl0pLiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIE1hY3JvcyIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIFJlY29yZHMiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKSBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBAZG9jIFN0YXJ0cyB0aGUgZnNfZ2VuX3RjcF9yZWN2IHNlcnZlci4iIG4KKyAgICAiJSUgQHNwZWMgc3RhcnRfbGluaygpIC0+IHtvaywgUGlkfSIgbgorICAgICIlJSBAZW5kIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJzdGFydF9saW5rKCkgLT4iIG4+CisgICAgImZzX2dlbl90Y3BfcmVjdjpzdGFydF9saW5rKENhbGxiYWNrTW9kdWxlLCA/VENQX1BPUlQsIFtdLCBbXSwgW10pLiIgbiBuIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBTZXJ2ZXIgRnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW5pdGlhbGl6ZXMgdGhlIHN0YXRlIGZvciBhIGdlbl90Y3BfcmVjdiBzZXJ2ZXIuIiBuCisgICAgIiUlIFJldHVybnM6IHtvaywgU3RhdGV9IiBuCisgICAgIiUlIFN0YXRlID0gdGVybSgpIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJpbml0KFtdKSAtPiIgbj4KKyAgICAie29rLCBbXX0uIiBuIG4gbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgUmVjZWl2ZXMgcGFja2V0cyBmcm9tIHRoZSBzb2NrZXQuIEFsc28gcmVjZWl2ZXMgdGltb3V0IG1lc3NhZ2VzLiIgbgorICAgICIlJSBUeXBlczoiIG4KKyAgICAiJSUgIFNvY2tldCA9IHNvY2tldCgpIiBuCisgICAgIiUlICBQYWNrZXQgPSBiaW5hcnkoKSB8IHN0cmluZygpLiBDYW4gYmUgYWx0ZXJlZCBpbiBUQ1BPcHRpb25zIiBuCisgICAgIiUlICBSZXBseSA9IGJpbmFyeSgpIHwgc3RyaW5nKCkuIENhbiBiZSBhbHRlcmVkIGluIFRDUE9wdGlvbnMiIG4KKyAgICAiJSUgIFN0YXRlID0gTmV3U3RhdGUgPSB0ZXJtKCkiIG4KKyAgICAiJSUgIFRpbWVvdXQgPSBpbnRlZ2VyKCkgaW4gbWlsaXNlY29uZHMuIiBuCisgICAgIiUlIFJldHVybnM6ICIgbgorICAgICIlJSAge25vcmVwbHksIE5ld1N0YXRlfSB7bm9yZXBseSwgTmV3U3RhdGUsIFRpbWVvdXR9IiBuCisgICAgIiUlICB7cmVwbHksIFJlcGx5LCBOZXdTdGF0ZX0ge3JlcGx5LCBSZXBseSwgTmV3U3RhdGUsIFRpbWVvdXR9IiBuCisgICAgIiUlICB7c3RvcCwgUmVhc29uLCBOZXdTdGF0ZX0iIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImhhbmRsZV9wYWNrZXQoU29ja2V0LCBQYWNrZXQsIFN0YXRlKSAtPiIgbj4KKyAgICAie25vcmVwbHksIFN0YXRlfS4iIG4gbiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBSZWNlaXZlcyBzeW5jIGNhbGxzIGZyb20gYSBjbGllbnQuIiBuCisgICAgIiUlIFZhcmlhYmxlczoiIG4KKyAgICAiJSUgIFJlcGx5IC0gQSBtZXNzYWdlIHNlbnQgYmFjayB0byB0aGUgY2FsbGVyLiIgbgorICAgICIlJSAiIG4KKyAgICAiJSUgVHlwZXM6IiBuCisgICAgIiUlICBTb2NrZXQgPSBzb2NrZXQoKSIgbgorICAgICIlJSAgTXNnID0gUmVwbHkgPSB0ZXJtKCkiIG4KKyAgICAiJSUgIFN0YXRlID0gTmV3U3RhdGUgPSB0ZXJtKCkiIG4KKyAgICAiJSUgIFRpbWVvdXQgPSBpbnRlZ2VyKCkgaW4gbWlsaXNlY29uZHMuIiBuCisgICAgIiUlIFJldHVybnM6ICIgbgorICAgICIlJSAge25vcmVwbHksIE5ld1N0YXRlfSB7bm9yZXBseSwgTmV3U3RhdGUsIFRpbWVvdXR9IiBuCisgICAgIiUlICB7cmVwbHksIFJlcGx5LCBOZXdTdGF0ZX0ge3JlcGx5LCBSZXBseSwgTmV3U3RhdGUsIFRpbWVvdXR9IiBuCisgICAgIiUlICB7c3RvcCwgUmVhc29uLCBOZXdTdGF0ZX0gfCB7c3RvcCwgUmVhc29uLCBSZXBseSwgTmV3U3RhdGV9IiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJoYW5kbGVfY2FsbChTb2NrZXQsIEZyb20sIE1zZywgU3RhdGUpIC0+IiBuPgorICAgICJ7cmVwbHksIFJlcGx5LCBTdGF0ZX0uIiBuIG4gbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgUmVjZWl2ZXMgbWVzc2FnZXMgZnJvbSBvdGhlciBwcm9jZXNzZXMgYW5kIHRpbWVvdXRzLiIgbgorICAgICIlJSBUeXBlczoiIG4KKyAgICAiJSUgIFNvY2tldCA9IHNvY2tldCgpIiBuCisgICAgIiUlICBNc2cgPSB0ZXJtKCkgfCB0aW1lb3V0IiBuCisgICAgIiUlICBTdGF0ZSA9IE5ld1N0YXRlID0gdGVybSgpIiBuCisgICAgIiUlICBUaW1lb3V0ID0gaW50ZWdlcigpIGluIG1pbGlzZWNvbmRzLiIgbgorICAgICIlJSBSZXR1cm5zOiAiIG4KKyAgICAiJSUgIHtub3JlcGx5LCBOZXdTdGF0ZX0ge25vcmVwbHksIE5ld1N0YXRlLCBUaW1lb3V0fSIgbgorICAgICIlJSAge3N0b3AsIFJlYXNvbiwgTmV3U3RhdGV9IiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJoYW5kbGVfaW5mbyhTb2NrZXQsIE1zZywgU3RhdGUpIC0+IiBuPgorICAgICJ7bm9yZXBseSwgU3RhdGV9LiIgbiBuIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIENhbGxlZCBhZnRlciBhIHNvY2tldCBjbG9zZXMgb3Ige3N0b3AsIFJlYXNvbiwgTmV3U3RhdGV9IiBuCisgICAgIiUlIFR5cGVzOiIgbgorICAgICIlJSAgU29ja2V0ID0gc29ja2V0KCkiIG4KKyAgICAiJSUgIFN0YXRlID0gTmV3U3RhdGUgPSB0ZXJtKCkiIG4KKyAgICAiJSUgUmV0dXJuczogdGVybSgpIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJ0ZXJtaW5hdGUoU29ja2V0LCBTdGF0ZSkgLT4iIG4+CisgICAgICAgICJvay4iIG4gbiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUlIEludGVybmFsIEZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICApCisgICIqVGhlIHRlbXBsYXRlIG9mIGEgZnNfZ2VuX3RjcF9yZWN2IGJlaGF2aW91ci4KK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKzs7IGZzX2Vkb2NfaGVhZGVyIHRlbXBsYXRlCisoZGVmdmFyIGVybGFuZy1za2VsLWZzLWVkb2MtaGVhZGVyCisgICcoKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBAZG9jIiBuCisgICAgIiUlIDxwcmU+IiBuCisgICAgIiUlIFZhcmlhYmxlczoiIG4KKyAgICAiJSUgVHlwZXM6IiBuCisgICAgIiUlIDwvcHJlPiB0ZXJtKCkiIG4KKyAgICAiJSUgQHNwZWMiIG4KKyAgICAiJSUgQGVuZCIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICkKKyAgIipUaGUgdGVtcGxhdGUgb2YgYW4gZWRvYyBmdW5jdGlvbiBoZWFkZXIuIAorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworOzsgZnNfZGJfaW5pdCB0ZW1wbGF0ZQorKGRlZnZhciBlcmxhbmctc2tlbC1mcy1kYi1pbml0CisgICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQorICAgICIlJSBUT0RPIEltcGxlbWVudCB0aGlzIGJlaGF2aW91ciIgbgorICAgICIlJSAtYmVoYXZpb3VyKGRiX2luaXQpLiIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiJSUgSW5jbHVkZSBmaWxlcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisJbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1leHBvcnQoWyIgbj4gInN0YXJ0X2xpbmsvMSwgc3RhcnRfbGluay8zLCBpbml0LzEsIGxvY2FsX2luaXQvMCwgcmVtb3RlX2luaXQvMCIgbgorCSIgICAgICAgIF0pLiIgbgorICAgIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIE1hY3JvcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgorCW4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIFJlY29yZHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MgU3RhcnRzIHRoZSBzZXJ2ZXIuICIgbj4KKyAgICAiJSUgPHByZT4iIG4+CisgICAgIiUlIFZhcmlhYmxlczoiIG4+CisgICAgIiUlICBDYWxsQmFja01vZHVsZSAtIFRoZSBtb2R1bGUgdGhhdCBleGhpYml0cyB0aGUgZGIgaW5pdCBiZWhhdmlvdXIuIiBuPgorICAgICIlJSAgQXJncyAtIEEgbGlzdCBvZiBhcmd1bWVudHMgZGVsaXZlcmVkIHRvIHRoZSBDYWxsQmFja01vZHVsZTppbml0LzEgZnVuY3Rpb24uIiBuPgorICAgICIlJSAgT3B0aW9ucyAtIEEgbGlzdCBvZiBvcHRpb25zIGZvciBmc19kYl9pbml0LiIgbj4KKyAgICAiJSUiIG4+CisgICAgIiUlIFRoZSBvcHRpb25zIGFyZSBhcyBmb2xsb3dzOiIgbj4KKyAgICAiJSUgIHtzY2hlbWFfdHlwZSwgVHlwZX0iIG4+CisgICAgIiUlIiBuPgorICAgICIlJSBUeXBlczoiIG4+CisgICAgIiUlICBBcmdzID0gbGlzdCgpIiBuPgorICAgICIlJSAgT3B0aW9ucyA9IGxpc3QoKSIgbj4KKyAgICAiJSUgIFR5cGUgPSByYW1fY29waWVzIHwgZGlzY19jb3BpZXMgfCBkaXNjX29ubHlfY29waWVzIiBuPgorICAgICIlJSIgbj4KKyAgICAiJSUgPC9wcmU+IiBuPgorICAgICIlJSBAc3BlYyBzdGFydF9saW5rKENhbGxCYWNrTW9kdWxlLCBBcmdzLCBPcHRpb25zKSAtPiB7b2ssIHBpZCgpfSB8IHtlcnJvciwgUmVhc29ufSIgbj4KKyAgICAiJSUgQGVuZCIgbj4KKyAgICAiKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSIKKyAgICAic3RhcnRfbGluayhDYWxsQmFja01vZHVsZSwgQXJncywgT3B0aW9ucykgLT4iIG4+CisgICAgInByb2NfbGliOnN0YXJ0X2xpbmsoP01PRFVMRSwgZGJfaW5pdCwgW3NlbGYoKSwgQ2FsbEJhY2tNb2R1bGUsIEFyZ3MsIE9wdGlvbnNdKS4iIG4+CisgICAgbgorICAgICIlJSBAc3BlYyBzdGFydF9saW5rKENhbGxCYWNrTW9kdWxlKSAtPiB7b2ssIHBpZCgpfSB8IHtlcnJvciwgUmVhc29ufSIgbj4KKyAgICAiJSUgQGVxdWl2IHN0YXJ0X2xpbmsoQ2FsbEJhY2tNb2R1bGUsIFtdLCBbXSkiIG4+CisgICAgInN0YXJ0X2xpbmsoQ2FsbEJhY2tNb2R1bGUpIC0+IiBuPgorICAgICJzdGFydF9saW5rKENhbGxCYWNrTW9kdWxlLCBbXSwgW10pLiIgbj4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgQ2FsbGJhY2tzIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MiIG4KKyAgICAiJSUgUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBkYl9pbml0IHNob3VsZCB0cnkgdG8gcmVwbGljYXRlIHdpdGguIiBuCisgICAgIiUlIiBuCisgICAgIiUlIDxwcmU+IiAgbgorICAgICIlJSBUeXBlczoiIG4KKyAgICAiJSUgIERCTm9kZXMgPSBbbm9kZSgpXSIgbgorICAgICIlJSA8L3ByZT4iICBuCisgICAgIiUlIiBuCisgICAgIiUlIEBzcGVjIGluaXQoQXJncykgLT4ge29rLCBEQk5vZGVzfSB8IG5vX2luaXQiIG4KKyAgICAiJSUgQGVuZCIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiaW5pdChBcmdzKSAtPiIgbgorICAgICIgICAge29rLCBEQk5vZGVzVG9SZXBsaWNhdGVGcm9tID0gW119LiIgbiAKKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MiIG4KKyAgICAiJSUgQ3JlYXRlZCBhIHNjaGVtYSBhbmQgc2VlZHMgdGhlIGxvY2FsIGRhdGFiYXNlLiIgbgorICAgICIlJSBSZXR1cm5zIGEgbGlzdCBvZiByZWNvcmRzIHdpdGggdGhlaXIgaW5pdGlhbCBkYXRhLiIgbgorICAgICIlJSBUaGVzZSBhcmUgdG8gYmUgdGhlIHRhYmxlcyBhbmQgaW5pdGlhbCB2YWx1ZXMgZm9yIHRoZSBkYXRhYmFzZS4iIG4KKyAgICAiJSUiIG4KKyAgICAiJSUgPHByZT4iIG4KKyAgICAiJSUgUmVjbGlzdCA9IFtyZWNvcmQoKV0iIG4KKyAgICAiJSUgUmVhc29uID0gYXRvbSgpIiBuCisgICAgIiUlIDwvcHJlPiIgbgorICAgICIlJSIgbgorICAgICIlJSBAc3BlYyBsb2NhbF9pbml0KCkgLT4ge29rLCBSZWNMaXN0fSB8IHtlcnJvciwgUmVhc29ufSIgbgorICAgICIlJSBAZW5kIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJsb2NhbF9pbml0KCkgLT4iIG4KKyAgICAiICAgIHtvaywgW119LiIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQGRvYyBQdXNoZXMgdGhlIHNjaGVtYSBhbmQgdGhlIHRhYmxlIGRlZmluaXRpb25zIHRvIHRoZSBub2RlIiBuCisgICAgIiUlIHNwZWNpZmllZCBieSB0aGUgdmFyaWFibGUgbm9kZS4iIG4KKyAgICAiJSUgTk9URTogRG8gbm90IGluY2x1ZGUgdGhlIHNjaGVtYSBpbiB0aGlzIGxpc3QuIiBuCisgICAgIiUlIiBuCisgICAgIiUlIDxwcmU+IiBuCisgICAgIiUlIFR5cGVzICIgbgorICAgICIlJSAgTm9kZSA9IG5vZGUoKSIgbgorICAgICIlJSAgVGFibGVMaXN0ID0gW3tUYWJsZSwgVHlwZX1dIiBuCisgICAgIiUlICAgVGFibGUgPSBhdG9tKCkiIG4KKyAgICAiJSUgICBUeXBlID0gcmFtX2NvcGllcywgZGlzY19jb3BpZXMiIG4KKyAgICAiJSUgIFJlYXNvbiA9IGF0b20oKSIgbgorICAgICIlJSA8L3ByZT4iIG4KKyAgICAiJSUiIG4KKyAgICAiJSUgQHNwZWMgcmVtb3RlX2luaXQoKSAtPiB7b2ssIFRhYmxlTGlzdH0gfCB7ZXJyb3IsIFJlYXNvbn0iIG4KKyAgICAiJSUgQGVuZCIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAicmVtb3RlX2luaXQoKSAtPiIgbgorICAgICIgICAge29rLCBbe2luaSwgcmFtX2NvcGllc31dfS4iIG4KKyAgICBuCisgICApCisgICIqVGhlIHRlbXBsYXRlIG9mIGEgZnNfZGJfaW5pdCBiZWhhdmlvdXIuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLXN1cGVydmlzb3IKKyAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCisgICAgIi1iZWhhdmlvdXIoc3VwZXJ2aXNvcikuIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorCSIlJSBJbmNsdWRlIGZpbGVzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorCW4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEV4dGVybmFsIGV4cG9ydHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItZXhwb3J0KFsiIG4+ICJzdGFydF9saW5rLzEiIG4KKwkiICAgICAgICBdKS4iIG4KKyAgICBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBJbnRlcm5hbCBleHBvcnRzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAiLWV4cG9ydChbIiBuPiAiaW5pdC8xIiBuCisJIiAgICAgICAgXSkuIiBuCisJbiAKKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIE1hY3JvcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgorCW4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIFJlY29yZHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQGRvYyBTdGFydHMgdGhlIHN1cGVydmlzb3IuIiBuCisgICAgIiUlIEBzcGVjIHN0YXJ0X2xpbmsoU3RhcnRBcmdzKSAtPiB7b2ssIHBpZCgpfSB8IEVycm9yIiBuCisgICAgIiUlIEBlbmQiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInN0YXJ0X2xpbmsoU3RhcnRBcmdzKSAtPiIgbj4KKyAgICAic3VwZXJ2aXNvcjpzdGFydF9saW5rKHtsb2NhbCwgP1NFUlZFUn0sID9NT0RVTEUsIFtdKS4iIG4gCisgICAgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgIiUlIFNlcnZlciBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuYzogaW5pdC8xIiBuCisgICAgIiUlIFJldHVybnM6IHtvaywgIHtTdXBGbGFncywgIFtDaGlsZFNwZWNdfX0gfCIgbgorICAgICIlJSAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICAgICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge2Vycm9yLCBSZWFzb259ICAgIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJpbml0KFtdKSAtPiIgbj4KKyAgICAiUmVzdGFydFN0cmF0ZWd5ICAgID0gb25lX2Zvcl9vbmUsIiBuPgorICAgICJNYXhSZXN0YXJ0cyAgICAgICAgPSAxMDAwLCIgbj4KKyAgICAiTWF4VGltZUJldFJlc3RhcnRzID0gMzYwMCwiIG4+CisgICAgbj4KKyAgICAiU3VwRmxhZ3MgPSB7UmVzdGFydFN0cmF0ZWd5LCBNYXhSZXN0YXJ0cywgTWF4VGltZUJldFJlc3RhcnRzfSwiIG4+CisgICAgbj4KKyAgICAiQ2hpbGRTcGVjcyA9IiBuPgorICAgICJbIiBuPgorICAgICJ7QXBwTmFtZSwiIG4+CisgICAgIntBcHBOYW1lLCBzdGFydF9saW5rLCBbXX0sIiBuPgorICAgICJwZXJtYW5lbnQsIiBuPgorICAgICIxMDAwLCIgbj4KKyAgICAid29ya2VyLCIgbj4KKyAgICAiW0FwcE5hbWVdfSIgbj4KKyAgICAiXSwiIG4+CisgICAgIntvayx7U3VwRmxhZ3MsIENoaWxkU3BlY3N9fS4iIG4KKworICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgIiUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgKQorICAiKlRoZSB0ZW1wbGF0ZSBvZiBhbiBzdXBlcnZpc29yIGJlaGF2aW91ci4KK1BsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGB0ZW1wby1kZWZpbmUtdGVtcGxhdGUnLiIpCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtc3VwZXJ2aXNvci1icmlkZ2UKKyAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCisgICAgIi1iZWhhdmlvdXIoc3VwZXJ2aXNvcl9icmlkZ2UpLiIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiJSUgSW5jbHVkZSBmaWxlcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwluCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAiLWV4cG9ydChbIiBuPiAic3RhcnRfbGluay8wIiBuCisJIiAgICAgICAgXSkuIiBuCisgICAgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW50ZXJuYWwgZXhwb3J0cyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1leHBvcnQoWyIgbj4gImluaXQvMSwgIiBuPiAidGVybWluYXRlLzIiIG4KKwkiICAgICAgICBdKS4iIG4KKwluIAorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgTWFjcm9zIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKwkiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgorCW4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIFJlY29yZHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItcmVjb3JkKHN0YXRlLCB7fSkuIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgIiUlIEV4dGVybmFsIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jdGlvbjogc3RhcnRfbGluay8wIiBuCisgICAgIiUlIERlc2NyaXB0aW9uOiBTdGFydHMgdGhlIHN1cGVydmlzb3IgYnJpZGdlIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAic3RhcnRfbGluaygpIC0+IiBuPgorCSJzdXBlcnZpc29yX2JyaWRnZTpzdGFydF9saW5rKHtsb2NhbCwgP1NFUlZFUn0sID9NT0RVTEUsIFtdKS4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgU2VydmVyIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jOiBpbml0LzEiIG4KKyAgICAiJSUgUmV0dXJuczoge29rLCAgUGlkLCBTdGF0ZX0gfCIgbgorICAgICIlJSAgICAgICAgICBpZ25vcmUgICAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtlcnJvciwgUmVhc29ufSAgICAiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImluaXQoW10pIC0+IiBuPgorICAgICJjYXNlICdBTW9kdWxlJzpzdGFydF9saW5rKCkgb2YiIG4+CisgICAgIntvaywgUGlkfSAtPiIgbj4KKyAgICAie29rLCBQaWQsICNzdGF0ZXt9fTsiIG4+CisgICAgIkVycm9yIC0+IiBuPgorICAgICJFcnJvciIgbj4KKyAgICAiZW5kLiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmM6IHRlcm1pbmF0ZS8yIiBuCisgICAgIiUlIFB1cnBvc2U6IFN5bmNocm9uaXplZCBzaHV0ZG93biBvZiB0aGUgdW5kZXJseWluZyBzdWIgc3lzdGVtLiIgbgorICAgICIlJSBSZXR1cm5zOiBhbnkiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiIgbj4KKyAgICAiJ0FNb2R1bGUnOnN0b3AoKSwiIG4+CisgICAgIm9rLiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBJbnRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICkKKyAgIipUaGUgdGVtcGxhdGUgb2YgYW4gc3VwZXJ2aXNvcl9icmlkZ2UgYmVoYXZpb3VyLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworKGRlZnZhciBlcmxhbmctc2tlbC1nZW5lcmljLXNlcnZlcgorICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKKyAgICAiLWJlaGF2aW91cihnZW5fc2VydmVyKS4iIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJIiUlIEluY2x1ZGUgZmlsZXMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiLWV4cG9ydChbIiBuPiJzdGFydF9saW5rLzAsIm4+InN0b3AvMCJuPiJdKS4iIG4KKyAgICBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBnZW5fc2VydmVyIGNhbGxiYWNrcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiLWV4cG9ydChbaW5pdC8xLCBoYW5kbGVfY2FsbC8zLCBoYW5kbGVfY2FzdC8yLCAiCisgICAgImhhbmRsZV9pbmZvLzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zXSkuIiBuIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIHJlY29yZCBkZWZpbml0aW9ucyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiLXJlY29yZChzdGF0ZSwge30pLiIgbiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBtYWNybyBkZWZpbml0aW9ucyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiLWRlZmluZShTRVJWRVIsID9NT0RVTEUpLiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQGRvYyBTdGFydHMgdGhlIHNlcnZlci4iIG4KKyAgICAiJSUgQHNwZWMgc3RhcnRfbGluaygpIC0+IHtvaywgcGlkKCl9IHwge2Vycm9yLCBSZWFzb259IiBuCisgICAgIiUlIEBlbmQibgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgInN0YXJ0X2xpbmsoKSAtPiIgbj4KKyAgICAiZ2VuX3NlcnZlcjpzdGFydF9saW5rKHtsb2NhbCwgP1NFUlZFUn0sID9NT0RVTEUsIFtdLCBbXSkuIiBuCisgICAgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgQGRvYyBTdG9wcyB0aGUgc2VydmVyLiIgbgorICAgICIlJSBAc3BlYyBzdG9wKCkgLT4gb2siIG4KKyAgICAiJSUgQGVuZCJuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAic3RvcCgpIC0+IiBuPgorICAgICJnZW5fc2VydmVyOmNhc3QoP1NFUlZFUiwgc3RvcCkuIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgIiUlIFNlcnZlciBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorCW4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmN0aW9uOiBpbml0LzEiIG4KKyAgICAiJSUgRGVzY3JpcHRpb246IEluaXRpYXRlcyB0aGUgc2VydmVyIiBuCisgICAgIiUlIFJldHVybnM6IHtvaywgU3RhdGV9ICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge29rLCBTdGF0ZSwgVGltZW91dH0gfCIgbgorICAgICIlJSAgICAgICAgICBpZ25vcmUgICAgICAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb259IiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJpbml0KFtdKSAtPiIgbj4KKyAgICAie29rLCAjc3RhdGV7fX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuY3Rpb246IGhhbmRsZV9jYWxsLzMiIG4KKyAgICAiJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhbGwgbWVzc2FnZXMiIG4KKyAgICAiJSUgUmV0dXJuczoge3JlcGx5LCBSZXBseSwgU3RhdGV9ICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge3JlcGx5LCBSZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwiIG4KKyAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlfSAgICAgICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIFN0YXRlfSAgIHwgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkiIG4KKyAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9ICAgICAgICAgICAgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImhhbmRsZV9jYWxsKFJlcXVlc3QsIEZyb20sIFN0YXRlKSAtPiIgbj4KKyAgICAiUmVwbHkgPSBvaywiIG4+CisgICAgIntyZXBseSwgUmVwbHksIFN0YXRlfS4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jdGlvbjogaGFuZGxlX2Nhc3QvMiIgbgorICAgICIlJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FzdCBtZXNzYWdlcyIgbgorICAgICIlJSBSZXR1cm5zOiB7bm9yZXBseSwgU3RhdGV9ICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8IiBuCisgICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJoYW5kbGVfY2FzdChzdG9wLCBTdGF0ZSkgLT4iIG4+CisgICAgIntzdG9wLCBub3JtYWwsIFN0YXRlfTsiIG4KKyAgICAiaGFuZGxlX2Nhc3QoTXNnLCBTdGF0ZSkgLT4iIG4+CisgICAgIntub3JlcGx5LCBTdGF0ZX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvLzIiIG4KKyAgICAiJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGFsbCBub24gY2FsbC9jYXN0IG1lc3NhZ2VzIiBuCisgICAgIiUlIFJldHVybnM6IHtub3JlcGx5LCBTdGF0ZX0gICAgICAgICAgfCIgbgorICAgICIlJSAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwiIG4KKyAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9ICAgICAgICAgICAgKHRlcm1pbmF0ZS8yIGlzIGNhbGxlZCkiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiIgbj4KKyAgICAie25vcmVwbHksIFN0YXRlfS4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jdGlvbjogdGVybWluYXRlLzIiIG4KKyAgICAiJSUgRGVzY3JpcHRpb246IFNodXRkb3duIHRoZSBzZXJ2ZXIiIG4KKyAgICAiJSUgUmV0dXJuczogYW55IChpZ25vcmVkIGJ5IGdlbl9zZXJ2ZXIpIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJ0ZXJtaW5hdGUoUmVhc29uLCBTdGF0ZSkgLT4iIG4+CisgICAgIm9rLiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmM6IGNvZGVfY2hhbmdlLzMiIG4KKyAgICAiJSUgUHVycG9zZTogQ29udmVydCBwcm9jZXNzIHN0YXRlIHdoZW4gY29kZSBpcyBjaGFuZ2VkIiBuCisgICAgIiUlIFJldHVybnM6IHtvaywgTmV3U3RhdGV9IiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlLCBFeHRyYSkgLT4iIG4+CisgICAgIntvaywgU3RhdGV9LiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICApCisgICIqVGhlIHRlbXBsYXRlIG9mIGEgZ2VuZXJpYyBzZXJ2ZXIuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLWdlbi1ldmVudAorICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKKyAgICAiLWJlaGF2aW91cihnZW5fZXZlbnQpLiIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiJSUgSW5jbHVkZSBmaWxlcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwluCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICItZXhwb3J0KFtzdGFydF9saW5rLzAsIGFkZF9oYW5kbGVyLzBdKS4iIG4KKyAgICBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBnZW5fZXZlbnQgY2FsbGJhY2tzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICItZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9ldmVudC8yLCBoYW5kbGVfY2FsbC8yLCAiCisgICAgImhhbmRsZV9pbmZvLzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zXSkuIiBuIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJIiUlIFJlY29yZCBEZWZpbml0aW9ucyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiLXJlY29yZChzdGF0ZSwge30pLiIgbiBuIAorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiJSUgTWFjcm8gRGVmaW5pdGlvbnMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJIi1kZWZpbmUoU0VSVkVSLCA/TU9EVUxFKS4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MgU3RhcnRzIHRoZSBzZXJ2ZXIiIG4KKyAgICAiJSUgQHNwZWMgc3RhcnRfbGluaygpIC0+IHtvaywgUGlkfSB8IHtlcnJvciwge2FscmVhZHlfc3RhcnRlZCwgUGlkfX0iIG4KKyAgICAiJSUgQGVuZCIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgInN0YXJ0X2xpbmsoKSAtPiIgbj4KKyAgICAiZ2VuX2V2ZW50OnN0YXJ0X2xpbmsoe2xvY2FsLCA/U0VSVkVSfSkuICIgbgorICAgIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MgQWRkcyBhbiBldmVudCBoYW5kbGVyIiBuCisgICAgIiUlIEBzcGVjIGFkZF9oYW5kbGVyKCkgLT4gb2sgfCB7J0VYSVQnLCBSZWFzb259IiBuCisgICAgIiUlIEBlbmQiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICJhZGRfaGFuZGxlcigpIC0+IiBuPgorICAgICJnZW5fZXZlbnQ6YWRkX2hhbmRsZXIoP1NFUlZFUiwgP01PRFVMRSwgW10pLiIgbiAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgU2VydmVyIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jOiBpbml0LzEiIG4KKyAgICAiJSUgUmV0dXJuczoge29rLCBTdGF0ZX0gICAgICAgICAgfCIgbgorICAgICIlJSAgICAgICAgICBPdGhlciIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiaW5pdChbXSkgLT4iIG4+CisgICAgIntvaywgI3N0YXRle319LiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmM6IGhhbmRsZV9ldmVudC8yIiBuCisgICAgIiUlIFJldHVybnM6IHtvaywgU3RhdGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtzd2FwX2hhbmRsZXIsIEFyZ3MxLCBTdGF0ZTEsIE1vZDIsIEFyZ3MyfSB8IiBuCisgICAgIiUlICAgICAgICAgIHJlbW92ZV9oYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJoYW5kbGVfZXZlbnQoRXZlbnQsIFN0YXRlKSAtPiIgbj4KKyAgICAie29rLCBTdGF0ZX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuYzogaGFuZGxlX2NhbGwvMiIgbgorICAgICIlJSBSZXR1cm5zOiB7b2ssIFJlcGx5LCBTdGF0ZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge3N3YXBfaGFuZGxlciwgUmVwbHksIEFyZ3MxLCBTdGF0ZTEsIE1vZDIsIEFyZ3MyfSB8IiBuCisgICAgIiUlICAgICAgICAgIHtyZW1vdmVfaGFuZGxlciwgUmVwbHl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiaGFuZGxlX2NhbGwoUmVxdWVzdCwgU3RhdGUpIC0+IiBuPgorICAgICJSZXBseSA9IG9rLCIgbj4KKyAgICAie29rLCBSZXBseSwgU3RhdGV9LiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmM6IGhhbmRsZV9pbmZvLzIiIG4KKyAgICAiJSUgUmV0dXJuczoge29rLCBTdGF0ZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge3N3YXBfaGFuZGxlciwgQXJnczEsIFN0YXRlMSwgTW9kMiwgQXJnczJ9IHwiIG4KKyAgICAiJSUgICAgICAgICAgcmVtb3ZlX2hhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiIgbj4KKyAgICAie29rLCBTdGF0ZX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuYzogdGVybWluYXRlLzIiIG4KKyAgICAiJSUgUHVycG9zZTogU2h1dGRvd24gdGhlIHNlcnZlciIgbgorICAgICIlJSBSZXR1cm5zOiBhbnkiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiIgbj4KKyAgICAib2suIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuYzogY29kZV9jaGFuZ2UvMyIgbgorICAgICIlJSBQdXJwb3NlOiBDb252ZXJ0IHByb2Nlc3Mgc3RhdGUgd2hlbiBjb2RlIGlzIGNoYW5nZWQiIG4KKyAgICAiJSUgUmV0dXJuczoge29rLCBOZXdTdGF0ZX0iIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgImNvZGVfY2hhbmdlKE9sZFZzbiwgU3RhdGUsIEV4dHJhKSAtPiIgbj4KKyAgICAie29rLCBTdGF0ZX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUlIEludGVybmFsIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICApCisgICIqVGhlIHRlbXBsYXRlIG9mIGEgZ2VuX2V2ZW50LgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworKGRlZnZhciBlcmxhbmctc2tlbC1nZW4tZnNtCisgICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQorICAgICItYmVoYXZpb3VyKGdlbl9mc20pLiIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiJSUgSW5jbHVkZSBmaWxlcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwluCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCisgICAgIi1leHBvcnQoW3N0YXJ0X2xpbmsvMF0pLiIgbgorICAgIG4KKyAgICAiJSUgZ2VuX2ZzbSBjYWxsYmFja3MiIG4KKyAgICAiLWV4cG9ydChbaW5pdC8xLCBzdGF0ZV9uYW1lLzIsIHN0YXRlX25hbWUvMywgaGFuZGxlX2V2ZW50LzMsIiBuPgorICAgICJoYW5kbGVfc3luY19ldmVudC80LCBoYW5kbGVfaW5mby8zLCB0ZXJtaW5hdGUvMywgY29kZV9jaGFuZ2UvNF0pLiIgbiBuCisgICAgIi1yZWNvcmQoc3RhdGUsIHt9KS4iIG4gCisgICAgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgIiUlIEV4dGVybmFsIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jdGlvbjogc3RhcnRfbGluay8wIiBuCisgICAgIiUlIERlc2NyaXB0aW9uOiBTdGFydHMgdGhlIHNlcnZlciIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgInN0YXJ0X2xpbmsoKSAtPiIgbj4KKyAgICAiZ2VuX2ZzbTpzdGFydF9saW5rKHtsb2NhbCwgP1NFUlZFUn0sID9NT0RVTEUsIFtdLCBbXSkuIiBuIAorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorICAgICIlJSBTZXJ2ZXIgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmM6IGluaXQvMSIgbgorICAgICIlJSBSZXR1cm5zOiB7b2ssIFN0YXRlTmFtZSwgU3RhdGVEYXRhfSAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtvaywgU3RhdGVOYW1lLCBTdGF0ZURhdGEsIFRpbWVvdXR9IHwiIG4KKyAgICAiJSUgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCIgbgorICAgICIlJSAgICAgICAgICB7c3RvcCwgU3RvcFJlYXNvbn0gICAgICAgICAgICAgICAgICAgIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJpbml0KFtdKSAtPiIgbj4KKyAgICAie29rLCBzdGF0ZV9uYW1lLCAjc3RhdGV7fX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuYzogU3RhdGVOYW1lLzIiIG4KKyAgICAiJSUgUmV0dXJuczoge25leHRfc3RhdGUsIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGF9ICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge25leHRfc3RhdGUsIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGEsIFRpbWVvdXR9IHwiIG4KKyAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgTmV3U3RhdGVEYXRhfSAgICAgICAgICAgICAgICAgICAgICAgICAiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInN0YXRlX25hbWUoRXZlbnQsIFN0YXRlRGF0YSkgLT4iIG4+CisgICAgIntuZXh0X3N0YXRlLCBzdGF0ZV9uYW1lLCBTdGF0ZURhdGF9LiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmM6IFN0YXRlTmFtZS8zIiBuCisgICAgIiUlIFJldHVybnM6IHtuZXh0X3N0YXRlLCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhfSAgICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge25leHRfc3RhdGUsIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGEsIFRpbWVvdXR9ICAgfCIgbgorICAgICIlJSAgICAgICAgICB7cmVwbHksIFJlcGx5LCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhfSAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtyZXBseSwgUmVwbHksIE5leHRTdGF0ZU5hbWUsIE5leHRTdGF0ZURhdGEsIFRpbWVvdXR9IHwiIG4KKyAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgTmV3U3RhdGVEYXRhfSAgICAgICAgICAgICAgICAgICAgICAgICAgfCIgbgorICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBSZXBseSwgTmV3U3RhdGVEYXRhfSAgICAgICAgICAgICAgICAgICAgIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJzdGF0ZV9uYW1lKEV2ZW50LCBGcm9tLCBTdGF0ZURhdGEpIC0+IiBuPgorICAgICJSZXBseSA9IG9rLCIgbj4KKyAgICAie3JlcGx5LCBSZXBseSwgc3RhdGVfbmFtZSwgU3RhdGVEYXRhfS4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jOiBoYW5kbGVfZXZlbnQvMyIgbgorICAgICIlJSBSZXR1cm5zOiB7bmV4dF9zdGF0ZSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YX0gICAgICAgICAgfCIgbgorICAgICIlJSAgICAgICAgICB7bmV4dF9zdGF0ZSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YSwgVGltZW91dH0gfCIgbgorICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBOZXdTdGF0ZURhdGF9ICAgICAgICAgICAgICAgICAgICAgICAgICIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiaGFuZGxlX2V2ZW50KEV2ZW50LCBTdGF0ZU5hbWUsIFN0YXRlRGF0YSkgLT4iIG4+CisgICAgIntuZXh0X3N0YXRlLCBTdGF0ZU5hbWUsIFN0YXRlRGF0YX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuYzogaGFuZGxlX3N5bmNfZXZlbnQvNCIgbgorICAgICIlJSBSZXR1cm5zOiB7bmV4dF9zdGF0ZSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YX0gICAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtuZXh0X3N0YXRlLCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhLCBUaW1lb3V0fSAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge3JlcGx5LCBSZXBseSwgTmV4dFN0YXRlTmFtZSwgTmV4dFN0YXRlRGF0YX0gICAgICAgICAgfCIgbgorICAgICIlJSAgICAgICAgICB7cmVwbHksIFJlcGx5LCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhLCBUaW1lb3V0fSB8IiBuCisgICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIE5ld1N0YXRlRGF0YX0gICAgICAgICAgICAgICAgICAgICAgICAgIHwiIG4KKyAgICAiJSUgICAgICAgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIE5ld1N0YXRlRGF0YX0gICAgICAgICAgICAgICAgICAgICIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiaGFuZGxlX3N5bmNfZXZlbnQoRXZlbnQsIEZyb20sIFN0YXRlTmFtZSwgU3RhdGVEYXRhKSAtPiIgbj4KKyAgICAiUmVwbHkgPSBvaywiIG4+CisgICAgIntyZXBseSwgUmVwbHksIFN0YXRlTmFtZSwgU3RhdGVEYXRhfS4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jOiBoYW5kbGVfaW5mby8zIiBuCisgICAgIiUlIFJldHVybnM6IHtuZXh0X3N0YXRlLCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhfSAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtuZXh0X3N0YXRlLCBOZXh0U3RhdGVOYW1lLCBOZXh0U3RhdGVEYXRhLCBUaW1lb3V0fSB8IiBuCisgICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIE5ld1N0YXRlRGF0YX0gICAgICAgICAgICAgICAgICAgICAgICAgIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJoYW5kbGVfaW5mbyhJbmZvLCBTdGF0ZU5hbWUsIFN0YXRlRGF0YSkgLT4iIG4+CisgICAgIntuZXh0X3N0YXRlLCBTdGF0ZU5hbWUsIFN0YXRlRGF0YX0uIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuYzogdGVybWluYXRlLzMiIG4KKyAgICAiJSUgUHVycG9zZTogU2h1dGRvd24gdGhlIGZzbSIgbgorICAgICIlJSBSZXR1cm5zOiBhbnkiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInRlcm1pbmF0ZShSZWFzb24sIFN0YXRlTmFtZSwgU3RhdERhdGEpIC0+IiBuPgorICAgICJvay4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jOiBjb2RlX2NoYW5nZS80IiBuCisgICAgIiUlIFB1cnBvc2U6IENvbnZlcnQgcHJvY2VzcyBzdGF0ZSB3aGVuIGNvZGUgaXMgY2hhbmdlZCIgbgorICAgICIlJSBSZXR1cm5zOiB7b2ssIE5ld1N0YXRlLCBOZXdTdGF0ZURhdGF9IiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICJjb2RlX2NoYW5nZShPbGRWc24sIFN0YXRlTmFtZSwgU3RhdGVEYXRhLCBFeHRyYSkgLT4iIG4+CisgICAgIntvaywgU3RhdGVOYW1lLCBTdGF0ZURhdGF9LiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlJSBJbnRlcm5hbCBmdW5jdGlvbnMiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgKQorICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGdlbl9mc20uCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisoZGVmdmFyIGVybGFuZy1za2VsLWxpYgorICAnKChlcmxhbmctc2tlbC1pbmNsdWRlIGVybGFuZy1za2VsLWxhcmdlLWhlYWRlcikKKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJIiUlIEluY2x1ZGUgZmlsZXMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisJbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZXhwb3J0cyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1leHBvcnQoWyIgbgorCSIgICAgICAgIF0pLiIgbgorICAgIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEludGVybmFsIGV4cG9ydHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItZXhwb3J0KFsiIG4KKwkiICAgICAgICBdKS4iIG4KKwluIAorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgTWFjcm9zIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKwluCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBSZWNvcmRzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgRXh0ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEBkb2MiIG4KKyAgICAiJSUgQHNwZWMgIiBuCisgICAgIiUlIEBlbmQgIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICApCisgICIqVGhlIHRlbXBsYXRlIG9mIGEgbGlicmFyeSBtb2R1bGUuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisKKyhkZWZ2YXIgZXJsYW5nLXNrZWwtZ2VuZXJpYy1sZWFkZXIKKyAgJygoZXJsYW5nLXNrZWwtaW5jbHVkZSBlcmxhbmctc2tlbC1sYXJnZS1oZWFkZXIpCisgICAgIi1iZWhhdmlvdXIoZnNfZ2VuX2xlYWRlcikuIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBJbmNsdWRlIGZpbGVzIiBuCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorCW4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgIi1leHBvcnQoWyIgbj4ic3RhcnRfbGluay8wLCJuPiJzdG9wLzAibj4iXSkuIiBuCisgICAgICAgIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSBnZW5fbGVhZGVyIGNhbGxiYWNrcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgIi1leHBvcnQoW2luaXQvMSwiIG4+CisgICAgICAgICJlbGVjdGVkLzIsIiBuPgorICAgICAgICAic3VycmVuZGVyZWQvMywiIG4+CisgICAgICAgICJoYW5kbGVfRE9XTi8zLCIgbj4KKyAgICAgICAgImhhbmRsZV9sZWFkZXJfY2FsbC80LCIgbj4KKyAgICAgICAgImhhbmRsZV9sZWFkZXJfY2FzdC8zLCIgbj4KKyAgICAgICAgImZyb21fbGVhZGVyLzMsIiBuPgorICAgICAgICAiaGFuZGxlX2NhbGwvMywiIG4+CisgICAgICAgICJoYW5kbGVfY2FzdC8yLCIgbj4KKyAgICAgICAgImhhbmRsZV9pbmZvLzIsIiBuPgorICAgICAgICAidGVybWluYXRlLzIsIiBuPgorICAgICAgICAiY29kZV9jaGFuZ2UvNCIgbj4KKyAgICAgICAgIl0pLiIgbj4KKyAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiJSUgcmVjb3JkIGRlZmluaXRpb25zIiBuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgIi1yZWNvcmQoc3RhdGUsIHt9KS4iIG4gbgorICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSBtYWNybyBkZWZpbml0aW9ucyIgbgorICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICItZGVmaW5lKFNFUlZFUiwgP01PRFVMRSkuIiBuCisgICAgICAgIG4KKyAgICAgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAgICAgIiUlIEV4dGVybmFsIGZ1bmN0aW9ucyIgbgorICAgICAgICAoZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAyKQorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgIiUlIEBkb2MgU3RhcnRzIHRoZSBnZW5fbGVhZGVyLiIgbgorICAgICAgICAiJSUgQHNwZWMgc3RhcnRfbGluaygpIC0+IHtvaywgcGlkKCl9IHwge2Vycm9yLCBSZWFzb259IiBuCisgICAgICAgICIlJSBAZW5kIm4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICAgICAic3RhcnRfbGluaygpIC0+IiBuPgorICAgICAgICAiQ2FuZGlkYXRlcyA9IFtub2RlKCl8bm9kZXMoKV0sIiBuPgorICAgICAgICAiV29ya2VycyAgICA9IFtdLCIgbj4KKyAgICAgICAgImdlbl9sZWFkZXI6c3RhcnRfbGluayh7bG9jYWwsID9TRVJWRVJ9LCBDYW5kaWRhdGVzLCBXb3JrZXJzLCA/TU9EVUxFLCBbXSwgW10pLiIgbgorICAgICAgICBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiJSUgQGRvYyBTdG9wcyB0aGUgZ2VuX2xlYWRlci4iIG4KKyAgICAgICAgIiUlIEBzcGVjIHN0b3AoKSAtPiBvayIgbgorICAgICAgICAiJSUgQGVuZCJuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgICAgICJzdG9wKCkgLT4iIG4+CisgICAgICAgICJnZW5fbGVhZGVyOmNhc3QoP1NFUlZFUiwgc3RvcCkuIiBuCisgICAgICAgIG4KKyAgICAgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAgICAgIiUlIFNlcnZlciBmdW5jdGlvbnMiIG4KKyAgICAgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAgICAgbgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgIiUlIEZ1bmN0aW9uOiBpbml0LzEiIG4+CisgICAgICAgICIlJSBEZXNjcmlwdGlvbjogSW5pdGlhdGVzIHRoZSBzZXJ2ZXIiIG4+CisgICAgICAgICIlJSBSZXR1cm5zOiB7b2ssIFN0YXRlfSAgICAgICAgICB8IiBuPgorICAgICAgICAiJSUgICAgICAgICAge29rLCBTdGF0ZSwgVGltZW91dH0gfCIgbj4KKyAgICAgICAgIiUlICAgICAgICAgIGlnbm9yZSAgICAgICAgICAgICAgIHwiIG4+CisgICAgICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29ufSIgbj4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICJpbml0KFtdKSAtPiIgbj4KKyAgICAgICAgIntvaywgI3N0YXRle319LiIgbgorICAgICAgICBuCisKKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSBDYWxsZWQgd2hlbiB3ZSBiZWNvbWUgdGhlIGxlYWRlci4iIG4+CisgICAgICAgICIlJSIgbj4KKyAgICAgICAgIiUlIGVsZWN0ZWQoU3RhdGU6OnN0YXRlKCksIEU6OmVsZWN0aW9uKCkpIC0+IHtvaywgQnJvYWRjYXN0LCBOU3RhdGV9IiBuPgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgImVsZWN0ZWQoU3RhdGUsIEUpIC0+IiBuPgorICAgICAgICAiQnJvYWRjYXN0VG9BbGxDYW5kaWRhdGVzID0gW10sIm4+CisgICAgICAgICJ7b2ssIEJyb2FkY2FzdFRvQWxsQ2FuZGlkYXRlcyAsIFN0YXRlfS4iIG4KKyAgICAgICAgbgorCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiJSUgQ2FsbGVkIGJ5IGVhY2ggY2FuZGlkYXRlIHdoZW4gaXQgcmVjb2duaXplcyBhbm90aGVyIGluc3RhbmNlIGFzIGxlYWRlci4iIG4+CisgICAgICAgICIlJSBTdHJpY3RseSBzcGVha2luZywgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgY2FuZGlkYXRlICIgbj4KKyAgICAgICAgIiUlIGFja25vd2xlZGdlcyBhIGxlYWRlciBhbmQgcmVjZWl2ZXMgYSBTeW5jaCBtZXNzYWdlIGluIHJldHVybi4iIG4+CisgICAgICAgICIlJSIgbj4KKyAgICAgICAgIiUlIHN1cnJlbmRlcmVkKFN0YXRlOjpzdGF0ZSgpLCBTeW5jaDo6YnJvYWRjYXN0KCksIEU6OmVsZWN0aW9uKCkpIC0+IHtvaywgTlN0YXRlfSIgbj4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICJzdXJyZW5kZXJlZChTdGF0ZSwgQkNhc3RGcm9tTGVhZGVyRWxlY3RlZENhbGwsIEUpIC0+IiBuPgorICAgICAgICAie29rLCBTdGF0ZSNzdGF0ZXtsZWFkZXJfbm9kZSA9IExlYWRlck5vZGV9fS4ibgorICAgICAgICBuCisKKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSBDYWxsZWQgYnkgdGhlIGxlYWRlciB3aGVuIGl0IGRldGVjdHMgbG9zcyBvZiBhIGNhbmRpZGF0ZSBub2RlLiIgbj4KKyAgICAgICAgIiUlIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgYnJvYWRjYXN0KCkgb2JqZWN0LCB0aGlzIHdpbGwiIG4+CisgICAgICAgICIlJSBiZSBzZW50IHRvIGFsbCBjYW5kaWRhdGVzLCBhbmQgdGhleSB3aWxsIHJlY2VpdmUgaXQgaW4gdGhlIGZ1bmN0aW9uIiBuPgorICAgICAgICAiJSUgbGluayBmcm9tX2xlYWRlci8zLiBmcm9tX2xlYWRlci8zIiBuPgorICAgICAgICAiJSUiIG4+CisgICAgICAgICIlJSBoYW5kbGVfRE9XTihOb2RlOjpub2RlKCksIFN0YXRlOjpzdGF0ZSgpLCBFOjplbGVjdGlvbigpKSAtPiB7b2ssIE5TdGF0ZX0gfCB7b2ssIEJyb2FkY2FzdCwgTlN0YXRlfSIgbj4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICJoYW5kbGVfRE9XTihOb2RlLCBTdGF0ZSwgX0UpIC0+IiBuPgorICAgICAgICAie29rLCBTdGF0ZX0uIiBuPgorCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiJSUgIGhhbmRsZV9sZWFkZXJfY2FsbChNc2c6OnRlcm0oKSwgRnJvbTo6Y2FsbGVyUmVmKCksIFN0YXRlOjpzdGF0ZSgpLCBFOjplbGVjdGlvbigpKSAtPiAiIG4+CisgICAgICAgICIlJSAgICB7cmVwbHksIFJlcGx5LCBOU3RhdGV9IHwiIG4+CisgICAgICAgICIlJSAgICB7cmVwbHksIFJlcGx5LCBCcm9hZGNhc3QsIE5TdGF0ZX0gfCIgbj4KKyAgICAgICAgIiUlICAgIHtub3JlcGx5LCBzdGF0ZSgpfSB8IiBuPgorICAgICAgICAiJSUgICAge3N0b3AsIFJlYXNvbiwgUmVwbHksIE5TdGF0ZX0gfCIgbj4KKyAgICAgICAgIiUlICAgIGNvbW1vblJlcGx5KCkiIG4+CisgICAgICAgICIlJSIgbj4KKyAgICAgICAgIiUlIENhbGxlZCBieSB0aGUgbGVhZGVyIGluIHJlc3BvbnNlIHRvIGEgZ2VuX2xlYWRlcjpsZWFkZXJfY2FsbC8yLiBsZWFkZXJfY2FsbCgpLiIgbj4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICJoYW5kbGVfbGVhZGVyX2NhbGwoTXNnLCBfRnJvbSwgU3RhdGUsIF9FKSAtPiIgbj4KKyAgICAgICAgIntyZXBseSwgUmVwbHkgPSBbXSwgU3RhdGV9LiIgbgorICAgICAgICBuCisKKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSBDYWxsZWQgYnkgdGhlIGxlYWRlciBpbiByZXNwb25zZSB0byBhIGdlbl9sZWFkZXI6bGVhZGVyX2Nhc3QvMiBsZWFkZXJfY2FzdCgpIiBuPgorICAgICAgICAiJSUgaGFuZGxlX2xlYWRlcl9jYXN0KE1zZzo6dGVybSgpLCBTdGF0ZTo6dGVybSgpLCBFOjplbGVjdGlvbigpKSAtPiBjb21tb25SZXBseSgpIiBuPgorICAgICAgICAiJSUiIG4+CisgICAgICAgICIlJSBCVUc6IFRoaXMgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZC4iIG4+CisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiaGFuZGxlX2xlYWRlcl9jYXN0KF9Nc2csIFN0YXRlLCBfRSkgLT4iIG4+CisgICAgICAgICJ7b2ssIFN0YXRlfS4iIG4KKyAgICAgICAgbgorCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiJSUgQ2FsbGVkIGJ5IGVhY2ggY2FuZGlkYXRlIGluIHJlc3BvbnNlIHRvIGEgbWVzc2FnZSBmcm9tIHRoZSBsZWFkZXIuICIgbj4KKyAgICAgICAgIiUlIEluIHRoaXMgcGFydGljdWxhciBtb2R1bGUsIHRoZSBsZWFkZXIgcGFzc2VzIGFuIHVwZGF0ZSBmdW5jdGlvbiB0byBiZSAiIG4+CisgICAgICAgICIlJSBhcHBsaWVkIHRvIHRoZSBjYW5kaWRhdGUncyBzdGF0ZS4gIiBuPgorICAgICAgICAiJSUgIiBuPgorICAgICAgICAiJSUgZnJvbV9sZWFkZXIoTXNnOjp0ZXJtKCksIFN0YXRlOjpzdGF0ZSgpLCBFOjplbGVjdGlvbigpKSAtPiB7b2ssIE5TdGF0ZX0gIiBuPgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgImZyb21fbGVhZGVyKE1TRywgU3RhdGUsIF9FKSAtPiAiIG4+CisgICAgICAgICJ7b2ssIFN0YXRlfS4gIiBuCisgICAgICAgIG4KKworICAgICAgICBuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgIiUlIEZ1bmN0aW9uOiBoYW5kbGVfY2FsbC8zIiBuCisgICAgICAgICIlJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgY2FsbCBtZXNzYWdlcyIgbgorICAgICAgICAiJSUgUmV0dXJuczoge3JlcGx5LCBSZXBseSwgU3RhdGV9ICAgICAgICAgIHwiIG4KKyAgICAgICAgIiUlICAgICAgICAgIHtyZXBseSwgUmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8IiBuCisgICAgICAgICIlJSAgICAgICAgICB7bm9yZXBseSwgU3RhdGV9ICAgICAgICAgICAgICAgfCIgbgorICAgICAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSAgICAgIHwiIG4KKyAgICAgICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFJlcGx5LCBTdGF0ZX0gICB8ICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpIiBuCisgICAgICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0gICAgICAgICAgICAodGVybWluYXRlLzIgaXMgY2FsbGVkKSIgbgorICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICJoYW5kbGVfY2FsbChSZXF1ZXN0LCBGcm9tLCBTdGF0ZSkgLT4iIG4+CisgICAgICAgICJSZXBseSA9IG9rLCIgbj4KKyAgICAgICAgIntyZXBseSwgUmVwbHksIFN0YXRlfS4iIG4KKyAgICAgICAgbgorICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSBGdW5jdGlvbjogaGFuZGxlX2Nhc3QvMiIgbgorICAgICAgICAiJSUgRGVzY3JpcHRpb246IEhhbmRsaW5nIGNhc3QgbWVzc2FnZXMiIG4KKyAgICAgICAgIiUlIFJldHVybnM6IHtub3JlcGx5LCBTdGF0ZX0gICAgICAgICAgfCIgbgorICAgICAgICAiJSUgICAgICAgICAge25vcmVwbHksIFN0YXRlLCBUaW1lb3V0fSB8IiBuCisgICAgICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29uLCBTdGF0ZX0gICAgICAgICAgICAodGVybWluYXRlLzIgaXMgY2FsbGVkKSIgbgorICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICJoYW5kbGVfY2FzdChzdG9wLCBTdGF0ZSkgLT4iIG4+CisgICAgICAgICJ7c3RvcCwgbm9ybWFsLCBTdGF0ZX07IiBuCisgICAgICAgICJoYW5kbGVfY2FzdChNc2csIFN0YXRlKSAtPiIgbj4KKyAgICAgICAgIntub3JlcGx5LCBTdGF0ZX0uIiBuCisgICAgICAgIG4KKyAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiJSUgRnVuY3Rpb246IGhhbmRsZV9pbmZvLzIiIG4KKyAgICAgICAgIiUlIERlc2NyaXB0aW9uOiBIYW5kbGluZyBhbGwgbm9uIGNhbGwvY2FzdCBtZXNzYWdlcyIgbgorICAgICAgICAiJSUgUmV0dXJuczoge25vcmVwbHksIFN0YXRlfSAgICAgICAgICB8IiBuCisgICAgICAgICIlJSAgICAgICAgICB7bm9yZXBseSwgU3RhdGUsIFRpbWVvdXR9IHwiIG4KKyAgICAgICAgIiUlICAgICAgICAgIHtzdG9wLCBSZWFzb24sIFN0YXRlfSAgICAgICAgICAgICh0ZXJtaW5hdGUvMiBpcyBjYWxsZWQpIiBuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgImhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtPiIgbj4KKyAgICAgICAgIntub3JlcGx5LCBTdGF0ZX0uIiBuCisgICAgICAgIG4KKyAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiJSUgRnVuY3Rpb246IHRlcm1pbmF0ZS8yIiBuCisgICAgICAgICIlJSBEZXNjcmlwdGlvbjogU2h1dGRvd24gdGhlIHNlcnZlciIgbgorICAgICAgICAiJSUgUmV0dXJuczogYW55IChpZ25vcmVkIGJ5IGdlbl9zZXJ2ZXIpIiBuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgInRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiIgbj4KKyAgICAgICAgIm9rLiIgbgorICAgICAgICBuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgIiUlIEZ1bmM6IGNvZGVfY2hhbmdlLzMiIG4KKyAgICAgICAgIiUlIFB1cnBvc2U6IENvbnZlcnQgcHJvY2VzcyBzdGF0ZSB3aGVuIGNvZGUgaXMgY2hhbmdlZCIgbgorICAgICAgICAiJSUgUmV0dXJuczoge29rLCBOZXdTdGF0ZX0iIG4KKyAgICAgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICAgICAiY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgX0UsIF9FeHRyYSkgLT4iIG4+CisgICAgICAgICJ7b2ssIFN0YXRlfS4iIG4KKyAgICAgICAgbgorICAgICAgICAKKyAgICAgICAgbgorICAgICAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgICAgICIlJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAgICAgKQorICAiKlRoZSB0ZW1wbGF0ZSBvZiBhIGdlbmVyaWMgbGVhZGVyLgorUGxlYXNlIHNlZSB0aGUgZnVuY3Rpb24gYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScuIikKKworCisoZGVmdmFyIGVybGFuZy1za2VsLWNvcmJhLWNhbGxiYWNrCisgICcoKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtbGFyZ2UtaGVhZGVyKQorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwkiJSUgSW5jbHVkZSBmaWxlcyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKwluCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBFeHRlcm5hbCBleHBvcnRzIiBuCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKSAKKyAgICAiLWV4cG9ydChbIiBuPiAiaW5pdC8xLCAiIG4+ICJ0ZXJtaW5hdGUvMiwiIG4+ICJjb2RlX2NoYW5nZS8zIiBuCisJIiAgICAgICAgXSkuIiBuCisgICAgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW50ZXJuYWwgZXhwb3J0cyIgbgorCShlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikgCisgICAgIi1leHBvcnQoWyIgbgorCSIgICAgICAgIF0pLiIgbgorCW4gCisJKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBNYWNyb3MiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorCW4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIFJlY29yZHMiIG4KKwkoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpIAorICAgICItcmVjb3JkKHN0YXRlLCB7fSkuIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgIiUlIEV4dGVybmFsIGZ1bmN0aW9ucyIgbgorICAgIChlcmxhbmctc2tlbC1kb3VibGUtc2VwYXJhdG9yIDIpCisgICAgKGVybGFuZy1za2VsLXNlcGFyYXRvciAyKQorICAgICIlJSBGdW5jdGlvbjogaW5pdC8xIiBuCisgICAgIiUlIERlc2NyaXB0aW9uOiBJbml0aWF0ZXMgdGhlIHNlcnZlciIgbgorICAgICIlJSBSZXR1cm5zOiB7b2ssIFN0YXRlfSAgICAgICAgICB8IiBuCisgICAgIiUlICAgICAgICAgIHtvaywgU3RhdGUsIFRpbWVvdXR9IHwiIG4KKyAgICAiJSUgICAgICAgICAgaWdub3JlICAgICAgICAgICAgICAgfCIgbgorICAgICIlJSAgICAgICAgICB7c3RvcCwgUmVhc29ufSIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiaW5pdChbXSkgLT4iIG4+CisgICAgIntvaywgI3N0YXRle319LiIgbgorICAgIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgIiUlIEZ1bmN0aW9uOiB0ZXJtaW5hdGUvMiIgbgorICAgICIlJSBEZXNjcmlwdGlvbjogU2h1dGRvd24gdGhlIHNlcnZlciIgbgorICAgICIlJSBSZXR1cm5zOiBhbnkgKGlnbm9yZWQgYnkgZ2VuX3NlcnZlcikiIG4KKyAgICAoZXJsYW5nLXNrZWwtc2VwYXJhdG9yIDIpCisgICAgInRlcm1pbmF0ZShSZWFzb24sIFN0YXRlKSAtPiIgbj4KKyAgICAib2suIiBuCisgICAgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiJSUgRnVuY3Rpb246IGNvZGVfY2hhbmdlLzMiIG4KKyAgICAiJSUgRGVzY3JpcHRpb246IENvbnZlcnQgcHJvY2VzcyBzdGF0ZSB3aGVuIGNvZGUgaXMgY2hhbmdlZCIgbgorICAgICIlJSBSZXR1cm5zOiB7b2ssIE5ld1N0YXRlfSIgbgorICAgIChlcmxhbmctc2tlbC1zZXBhcmF0b3IgMikKKyAgICAiY29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0+IiBuPgorICAgICJ7b2ssIFN0YXRlfS4iIG4KKyAgICBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICAiJSUgSW50ZXJuYWwgZnVuY3Rpb25zIiBuCisgICAgKGVybGFuZy1za2VsLWRvdWJsZS1zZXBhcmF0b3IgMikKKyAgICApCisgICIqVGhlIHRlbXBsYXRlIG9mIGEgbGlicmFyeSBtb2R1bGUuCitQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbiBgdGVtcG8tZGVmaW5lLXRlbXBsYXRlJy4iKQorCisKKwwKKzs7IEZvbnQtbG9jayB2YXJpYWJsZXMKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLW1vZGVybi1wCisgIChjb25kICgoPj0gZXJsYW5nLWVtYWNzLW1ham9yLXZlcnNpb24gMjApIHQpCisJKGVybGFuZy14ZW1hY3MtcCAoPj0gZXJsYW5nLWVtYWNzLW1pbm9yLXZlcnNpb24gMTQpKQorCSgoPSBlcmxhbmctZW1hY3MtbWFqb3ItdmVyc2lvbiAxOSkgKD49IGVybGFuZy1lbWFjcy1taW5vci12ZXJzaW9uIDI5KSkKKwkodCBuaWwpKQorICAiTm9uLW5pbCB3aGVuIHRoaXMgdmVyc2lvbiBvZiBFbWFjcyB1c2VzIGEgbW9kZXJuIHZlcnNpb24gb2YgRm9udCBMb2NrLgorCitUaGlzIGlzIGRldGVybWluYXRlZCBieSBjaGVja2luZyB0aGUgdmVyc2lvbiBvZiBFbWFjcyB1c2VkLCB0aGUgYWN0dWFsCitmb250LWxvY2sgY29kZSBpcyBub3QgbG9hZGVkLiIpCisKKworOzsgVGhlIG5leHQgZmV3IHZhcmlhYmxlcyBkZWZpbmUgZGlmZmVyZW50IEVybGFuZyBmb250LWxvY2sgcGF0dGVybnMuCis7OyBUaGV5IGNvdWxkIGJlIGFwcGVuZGVkIHRvIGZvcm0gYSBjdXN0b20gZm9udC1sb2NrIGFwcGVhcmVuY2UuCis7OworOzsgVGhlIGZ1bmN0aW9uIGBlcmxhbmctZm9udC1sb2NrLXNldC1mYWNlJyBjb3VsZCBiZSB1c2VkIHRvIGNoYW5nZQorOzsgdGhlIGZhY2Ugb2YgYSBwYXR0ZXJuLgorOzsKKzs7IE5vdGUgdGhhdCBFcmxhbmcgc3RyaW5ncyBhbmQgYXRvbXMgYXJlIGhpZ2h0bGlnaHRlZCB3aXRoIHVzaW5nCis7OyBzeW50YWN0aXggYW5hbHlzaXMuCisKKyhkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1mdW5jCisgIChsaXN0CisgICAobGlzdCAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIlxccyAqKCIpCisJIDEgJ2ZvbnQtbG9jay1mdW5jdGlvbi1uYW1lLWZhY2UgdCkpCisgICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgYSBmdW5jdGlvbiBoZWFkZXIuIikKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWRvbGxhcgorICAobGlzdAorICAgKGxpc3QgIlxcKFxcJFxcKFteXFxdXFx8XFxcXFxcKFteMC03XlxuXVxcfFswLTddK1xcfFxcXlthLXpBLVpdXFwpXFwpXFwpIgorCSAxICdmb250LWxvY2stc3RyaW5nLWZhY2UpKQorICAiRm9udCBsb2NrIGtleXdvcmQgaGlnaGxpZ2h0aW5nIG51bWJlcnMgaW4gYXNjaWktZm9ybSAoZS5nLiAkQSkuIikKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWFycm93CisgIChsaXN0CisgICAobGlzdCAiXFwoLT5cXHw6LVxcKVxcKFxccyBcXHwkXFwpIiAyICdmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKSkKKyAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBjbGF1c2UgYXJyb3cuIikKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWxjCisgIChsaXN0CisgICAobGlzdCAiXFwoPC1cXClcXChcXHMgXFx8JFxcKSIgMSAnZm9udC1sb2NrLWtleXdvcmQtZmFjZSkKKyAgIChsaXN0ICJcXCh8fFxcKVxcKFxccyBcXHwkXFwpIiAxICdmb250LWxvY2sta2V5d29yZC1mYWNlKSkKKyAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBsaXN0IGNvbXByZWhlbnNpb24gb3BlcmF0b3JzLiIpCisKKyhkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1rZXl3b3JkcworICAobGlzdAorICAgKGxpc3QgKGNvbmNhdCAiXFw8XFwoYWZ0ZXJcXHxiZWdpblxcfGNcXChhdGNoXFx8YXNlXFwpXFx8ZW5kXFx8ZnVuXFx8aWYiCisJCSAiXFx8b2ZcXHxyZWNlaXZlXFx8d2hlblxcfHF1ZXJ5XFwpXFwoW15hLXpBLVowLTlfXVxcfCRcXCkiKQorCSAxICdmb250LWxvY2sta2V5d29yZC1mYWNlKSkKKyAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBFcmxhbmcga2V5d29yZHMuIikKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWF0dHIKKyAgKGxpc3QKKyAgICAobGlzdCAoY29uY2F0ICJeXFwoLSIgZXJsYW5nLWF0b20tcmVnZXhwICJcXClcXHMgKlxcKFxcLlxcfChcXCkiKQorCSAgMSAnZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkpCisgICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgYXR0cmlidWVzLiIpCisKKyhkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1xdW90ZXMKKyAgKGxpc3QKKyAgICAobGlzdCAiYFxcKFstK2EtekEtWjAtOV86Kl1bLSthLXpBLVowLTlfOipdK1xcKSciCisJICAxCisJICAoaWYgZXJsYW5nLWZvbnQtbG9jay1tb2Rlcm4tcAorCSAgICAgICdmb250LWxvY2stcmVmZXJlbmNlLWZhY2UKKwkgICAgJ2ZvbnQtbG9jay1rZXl3b3JkLWZhY2UpCisJICB0KSkKKyAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyB3b3JkcyBpbiBzaW5nbGUgcXVvdGVzIGluIGNvbW1lbnRzLgorCitUaGlzIGlzIG5vdCB0aGUga2V5d29yZCBoaWdodGxpZ2h0aW5nIEVybGFuZyBzdHJpbmdzIGFuZCBhdG9tcywgdGhleQorYXJlIGhpZ2hsaWdodGVkIGJ5IHN5bnRhY3RpYyBhbmFseXNpcy4iKQorCis7OyBOb3RlOiBUaGUgZ3VhcmQgYGZsb2F0JyBjb2xsaWRlcyB3aXRoIHRoZSBiaWYgYGZsb2F0Jy4KKyhkZWZ2YXIgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1ndWFyZHMKKyAgKGxpc3QKKyAgIChsaXN0CisKKyAgICA7OyBYWFg6IAorOyAgICAgKGNvbmNhdCAiXFw8IgorOyAJICAgIChyZWdleHAtb3B0ICcoImF0b20iICJiaW5hcnkiICJjb25zdGFudCIgImZsb2F0IiAiaW50ZWdlciIgImxpc3QiIAorOyAJCQkgICJudW1iZXIiICJwaWQiICJwb3J0IiAicmVmZXJlbmNlIiAicmVjb3JkIiAidHVwbGUiKSAKKzsgCQkJdCkKKzsgCSAgICAiXFw+IikKKworICAgIChjb25jYXQgIlxcPFxcKGF0b21cXHxiaW5hcnlcXHxjb25zdGFudFxcfGZsb2F0XFx8aW50ZWdlclxcfGxpc3RcXHwiCisJICAgICJudW1iZXJcXHxwXFwoaWRcXHxvcnRcXClcXHxyZVxcKGZlcmVuY2VcXHxjb3JkXFwpXFx8dHVwbGUiCisJICAgICJcXClcXHMgKigiKQorCisJIDEKKwkgKGlmIGVybGFuZy1mb250LWxvY2stbW9kZXJuLXAKKwkgICAgICdmb250LWxvY2stcmVmZXJlbmNlLWZhY2UKKwkgICAnZm9udC1sb2NrLWtleXdvcmQtZmFjZSkpKQorICAiRm9udCBsb2NrIGtleXdvcmQgaGlnaGxpZ2h0aW5nIGd1YXJkcy4iKQorCisoZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtYmlmcworICAobGlzdAorICAgIChsaXN0CisgICAgIChjb25jYXQKKyAgICAgICJcXDxcXCgiCisgICAgICAiYVxcKGJzXFx8bGl2ZVxcfHBwbHlcXHx0b21fdG9fbGlzdFxcKVxcfCIKKyAgICAgICJiaW5hcnlfdG9fXFwobGlzdFxcfHRlcm1cXClcXHwiCisgICAgICAiY29uY2F0X2JpbmFyeVxcfGRcXChhdGVcXHxpc2Nvbm5lY3Rfbm9kZVxcKVxcfCIKKyAgICAgICJlXFwobGVtZW50XFx8cmFzZVxcfHhpdFxcKVxcfCIKKyAgICAgICJmbG9hdFxcKFxcfF90b19saXN0XFwpXFx8IgorICAgICAgImdcXChhcmJhZ2VfY29sbGVjdFxcfGV0XFwoXFx8X2tleXNcXClcXHxyb3VwX2xlYWRlclxcKVxcfCIKKyAgICAgICJoXFwoYWx0XFx8ZFxcKVxcfCIKKyAgICAgICJpXFwobnRlXFwoZ2VyX3RvX2xpc3RcXHxybmFsX2JpZlxcKVxcfHNfYWxpdmVcXClcXHwiCisgICAgICAibFxcKGVuZ3RoXFx8aVxcKG5rXFx8c3RfdG9fXFwoYXRvbVxcfGJpbmFyeVxcfGZsb2F0XFx8aW50ZWdlciIKKyAgICAgICJcXHxwaWRcXHx0dXBsZVxcKVxcKVxcKVxcfCIKKyAgICAgICJtYWtlX3JlZlxcfG5vXFwoZGVcXChcXHxfXFwobGlua1xcfHVubGlua1xcKVxcfHNcXClcXHx0YWxpdmVcXClcXHwiCisgICAgICAib3Blbl9wb3J0XFx8IgorICAgICAgInBcXChpZF90b19saXN0XFx8cm9jZXNzXFwoX1xcKGZsYWdcXHxpbmZvXFwpXFx8ZXNcXClcXHx1dFxcKVxcfCIKKyAgICAgICJyXFwoZWdpc3RlclxcKFxcfGVkXFwpXFx8b3VuZFxcKVxcfCIKKyAgICAgICJzXFwoZVxcKGxmXFx8dGVsZW1lbnRcXClcXHxpemVcXHwiCisgICAgICAicFxcKGF3blxcKFxcfF9saW5rXFwpXFx8bGl0X2JpbmFyeVxcKVxcfHRhdGlzdGljc1xcKVxcfCIKKyAgICAgICJ0XFwoZXJtX3RvX2JpbmFyeVxcfGhyb3dcXHxpbWVcXHxsXFx8IgorICAgICAgInJcXChhY2VcXHx1bmNcXClcXHx1cGxlX3RvX2xpc3RcXClcXHwiCisgICAgICAidW5cXChsaW5rXFx8cmVnaXN0ZXJcXClcXHx3aGVyZWlzIgorICAgICAgIlxcKVxccyAqKCIpCisgICAgIDEKKyAgICAgJ2ZvbnQtbG9jay1rZXl3b3JkLWZhY2UpKQorICAiRm9udCBsb2NrIGtleXdvcmQgaGlnaGxpZ2h0aW5nIGJ1aWx0IGluIGZ1bmN0aW9ucy4iKQorCisoZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtbWFjcm9zCisgIChsaXN0CisgICAobGlzdCAoY29uY2F0ICI/XFxzICpcXCgiIGVybGFuZy1hdG9tLXJlZ2V4cAorCQkgIlxcfCIgZXJsYW5nLXZhcmlhYmxlLXJlZ2V4cCAiXFwpXFw+IikKKwkgMSAoaWYgZXJsYW5nLWZvbnQtbG9jay1tb2Rlcm4tcAorCSAgICAgICAnZm9udC1sb2NrLXJlZmVyZW5jZS1mYWNlCisJICAgICAnZm9udC1sb2NrLXR5cGUtZmFjZSkpCisgICAobGlzdCAoY29uY2F0ICJeLVxcKGRlZmluZVxcfGlmbj9kZWZcXClcXHMgKihcXHMgKlxcKCIgZXJsYW5nLWF0b20tcmVnZXhwCisJCSAiXFx8IiBlcmxhbmctdmFyaWFibGUtcmVnZXhwICJcXClcXD4iKQorCSAyIChpZiBlcmxhbmctZm9udC1sb2NrLW1vZGVybi1wCisJICAgICAgICdmb250LWxvY2stcmVmZXJlbmNlLWZhY2UKKwkgICAgICdmb250LWxvY2stdHlwZS1mYWNlKSkpCisgICJGb250IGxvY2sga2V5d29yZCBoaWdobGlnaHRpbmcgbWFjcm9zLgorVGhpcyBtdXN0IGJlIHBsYWNlZCBpbiBmcm9udCBvZiBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy12YXJzJy4iKQorCisoZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtcmVjb3JkcworICAobGlzdAorICAgKGxpc3QgKGNvbmNhdCAiI1xccyAqIiBlcmxhbmctYXRvbS1yZWdleHAgIlxcPiIpCisJIDEgJ2ZvbnQtbG9jay10eXBlLWZhY2UpCisgICA7OyBEb24ndCBoaWdobGlnaHQgbnVtZXJpY2FsIGNvbnN0YW50cy4KKyAgIChsaXN0ICJcXDxbMC05XVswLTldPyNcXChbMC05YS1mQV9GXStcXClcXD4iCisJIDEgbmlsIHQpCisgICAobGlzdCAoY29uY2F0ICJeLXJlY29yZChcXHMgKiIgZXJsYW5nLWF0b20tcmVnZXhwICJcXD4iKQorCSAxICdmb250LWxvY2stdHlwZS1mYWNlKSkKKyAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBFcmxhbmcgcmVjb3Jkcy4KK1RoaXMgbXVzdCBiZSBwbGFjZWQgaW4gZnJvbnQgb2YgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtdmFycycuIikKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLXZhcnMKKyAgKGxpc3QKKyAgICAobGlzdCAoY29uY2F0ICJcXDwiIGVybGFuZy12YXJpYWJsZS1yZWdleHAgIlxcPiIpCisJICAxIChpZiBlcmxhbmctZm9udC1sb2NrLW1vZGVybi1wCisJCSdmb250LWxvY2stdmFyaWFibGUtbmFtZS1mYWNlCisJICAgICAgJ2ZvbnQtbG9jay10eXBlLWZhY2UpKSkKKyAgIkZvbnQgbG9jayBrZXl3b3JkIGhpZ2hsaWdodGluZyBFcmxhbmcgdmFyaWFibGVzLgorTXVzdCBiZSBwcmVjZWRlZCBieSBgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1tYWNyb3MnIGFuZCBgLXJlY29yZHMnCit0byB3b3JrIHByb3Blcmx5LiIpCisKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEKKyAgKGFwcGVuZCBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWZ1bmMKKwkgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtZG9sbGFyCisJICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWFycm93CisJICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWtleXdvcmRzKQorICA7OyBEb2NTdHJpbmdPcmlnOiBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzCisgICJGb250LWxvY2sga2V5d29yZHMgdXNlZCBieSBFcmxhbmcgTW9kZS4KKworVGhlcmUgZXhpc3RzIHRocmVlIGxldmVscyBvZiBGb250IExvY2sga2V5d29yZHMgZm9yIEVybGFuZzoKKyAgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMScgLSBGdW5jdGlvbiBoZWFkZXJzIGFuZCByZXNlcnZlZCBrZXl3b3Jkcy4KKyAgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMicgLSBCaWZzLCBndWFyZHMgYW5kIGBzaW5nZWwgcXVvdGVzJy4KKyAgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMycgLSBWYXJpYWJsZXMsIG1hY3JvcyBhbmQgcmVjb3Jkcy4KKworVG8gdXNlIGEgc3BlY2lmaWMgbGV2ZWwsIHBsZWFzZSBzZXQgdGhlIHZhcmlhYmxlCitgZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbicgdG8gdGhlIGFwcHJvcHJpYXRlIGxldmVsLiAgTm90ZSB0aGF0IHRoZQordmFyaWFibGUgbXVzdCBiZSBzZXQgYmVmb3JlIEVybGFuZyBtb2RlIGlzIGFjdGl2YXRlZC4KKworRXhhbXBsZToKKyAgICAoc2V0cSBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uIDIpIikKKworCisoZGVmdmFyIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMgorICAoYXBwZW5kIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMQorCSAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1hdHRyCisJICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLXF1b3RlcworCSAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1ndWFyZHMKKwkgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtYmlmcykKKyAgOzsgRG9jU3RyaW5nQ29weTogZXJsYW5nLWZvbnQtbG9jay1rZXl3b3JkcworICAiRm9udC1sb2NrIGtleXdvcmRzIHVzZWQgYnkgRXJsYW5nIE1vZGUuCisKK1RoZXJlIGV4aXN0cyB0aHJlZSBsZXZlbHMgb2YgRm9udCBMb2NrIGtleXdvcmRzIGZvciBFcmxhbmc6CisgIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEnIC0gRnVuY3Rpb24gaGVhZGVycyBhbmQgcmVzZXJ2ZWQga2V5d29yZHMuCisgIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTInIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2xlIHF1b3RlcycuCisgIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMnIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCisKK1RvIHVzZSBhIHNwZWNpZmljIGxldmVsLCBwbGVhc2Ugc2V0IHRoZSB2YXJpYWJsZQorYGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24nIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXZlbC4gIE5vdGUgdGhhdCB0aGUKK3ZhcmlhYmxlIG11c3QgYmUgc2V0IGJlZm9yZSBFcmxhbmcgbW9kZSBpcyBhY3RpdmF0ZWQuCisKK0V4YW1wbGU6CisgICAgKHNldHEgZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbiAyKSIpCisKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMKKyAgKGFwcGVuZCBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTIKKwkgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtbWFjcm9zCisJICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLXJlY29yZHMKKwkgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtdmFycykKKyAgOzsgRG9jU3RyaW5nQ29weTogZXJsYW5nLWZvbnQtbG9jay1rZXl3b3JkcworICAiRm9udC1sb2NrIGtleXdvcmRzIHVzZWQgYnkgRXJsYW5nIE1vZGUuCisKK1RoZXJlIGV4aXN0cyB0aHJlZSBsZXZlbHMgb2YgRm9udCBMb2NrIGtleXdvcmRzIGZvciBFcmxhbmc6CisgIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTEnIC0gRnVuY3Rpb24gaGVhZGVycyBhbmQgcmVzZXJ2ZWQga2V5d29yZHMuCisgIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTInIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2xlIHF1b3RlcycuCisgIGBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMnIC0gVmFyaWFibGVzLCBtYWNyb3MgYW5kIHJlY29yZHMuCisKK1RvIHVzZSBhIHNwZWNpZmljIGxldmVsLCBwbGVhc2Ugc2V0IHRoZSB2YXJpYWJsZQorYGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24nIHRvIHRoZSBhcHByb3ByaWF0ZSBsZXZlbC4gIE5vdGUgdGhhdCB0aGUKK3ZhcmlhYmxlIG11c3QgYmUgc2V0IGJlZm9yZSBFcmxhbmcgbW9kZSBpcyBhY3RpdmF0ZWQuCisKK0V4YW1wbGU6CisgICAgKHNldHEgZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbiAyKSIpCisKKworKGRlZnZhciBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMworICA7OyBEb2NTdHJpbmdDb3B5OiBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzCisgICJGb250LWxvY2sga2V5d29yZHMgdXNlZCBieSBFcmxhbmcgTW9kZS4KKworVGhlcmUgZXhpc3RzIHRocmVlIGxldmVscyBvZiBGb250IExvY2sga2V5d29yZHMgZm9yIEVybGFuZzoKKyAgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMScgLSBGdW5jdGlvbiBoZWFkZXJzIGFuZCByZXNlcnZlZCBrZXl3b3Jkcy4KKyAgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMicgLSBCaWZzLCBndWFyZHMgYW5kIGBzaW5nbGUgcXVvdGVzJy4KKyAgYGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMycgLSBWYXJpYWJsZXMsIG1hY3JvcyBhbmQgcmVjb3Jkcy4KKworVG8gdXNlIGEgc3BlY2lmaWMgbGV2ZWwsIHBsZWFzZSBzZXQgdGhlIHZhcmlhYmxlCitgZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbicgdG8gdGhlIGFwcHJvcHJpYXRlIGxldmVsLiAgTm90ZSB0aGF0IHRoZQordmFyaWFibGUgbXVzdCBiZSBzZXQgYmVmb3JlIEVybGFuZyBtb2RlIGlzIGFjdGl2YXRlZC4KKworRXhhbXBsZToKKyAgICAoc2V0cSBmb250LWxvY2stbWF4aW11bS1kZWNvcmF0aW9uIDIpIikKKworCisoZGVmdmFyIGVybGFuZy1mb250LWxvY2stc3ludGF4LXRhYmxlIG5pbAorICAiU3ludGF4IHRhYmxlIHVzZWQgYnkgRm9udCBMb2NrIG1vZGUuCisKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgdGhlIHN0YW5kYXJkIEVybGFuZyBNb2RlCitzeW50YXggdGFibGUgaXMgdGhhdCBgXycgaXMgdHJlYXRlZCBhcyBwYXJ0IG9mIHdvcmRzIGJ5Cit0aGlzIHN5bnRheCB0YWJsZS4KKworVW5mb3J0dWFudGVseSwgWEVtYWNzIGhhc24ndCBnb3Qgc3VwcG9ydCBmb3IgYSBzcGVjaWFsIEZvbnQKK0xvY2sgc3ludGF4IHRhYmxlLiAgVGhlIGVmZmVjdCBpcyB0aGF0IGBhcHBseScgaW4gdGhlIGF0b20KK2Bmb29fYXBwbHknIHdpbGwgYmUgaGlnaGxpZ2h0ZWQgYXMgYSBiaWYuIikKKworDAorOzs7IEF2b2lkIGVycm9ycyB3aGlsZSBjb21waWxpbmcgdGhpcyBmaWxlLgorCis7OyBgZXZhbC13aGVuLWNvbXBpbGUnIGlzIG5vdCBkZWZpbmVkIGluIEVtYWNzIDE4LiAgV2UgZGVmaW5lIGl0IGFzIGEKKzs7IG5vLW9wLgorKG9yIChmYm91bmRwICdldmFsLXdoZW4tY29tcGlsZSkKKyAgICAoZGVmbWFjcm8gZXZhbC13aGVuLWNvbXBpbGUgKCZyZXN0IHJlc3QpIG5pbCkpCisKKzs7IFRoZXNlIHVtbS4uLmZ1bmN0aW9ucyBhcmUgbmV3IGluIEVtYWNzIDIwLiBBbmQsIHllcywgdW50aWwgdmVyc2lvbgorOzsgMTkuMjcgRW1hY3MgYmFja3F1b3RlcyB3ZXJlIHRoaXMgdWdseS4KKworKG9yIChmYm91bmRwICd1bmxlc3MpCisgICAgKGRlZm1hY3JvIHVubGVzcyAoY29uZGl0aW9uICZyZXN0IGJvZHkpCisgICAgICAiKHVubGVzcyBDT05ESVRJT04gQk9EWS4uLik6IElmIENPTkRJVElPTiBpcyBmYWxzZSwgZG8gQk9EWSwgZWxzZSByZXR1cm4gbmlsLiIKKyAgICAgIChgIChpZiAoLCBjb25kaXRpb24pIAorCSAgICAgbmlsIAorCSAgICgsQCBib2R5KSkpKSkKKworKG9yIChmYm91bmRwICd3aGVuKQorICAgIChkZWZtYWNybyB3aGVuIChjb25kaXRpb24gJnJlc3QgYm9keSkKKyAgICAgICIod2hlbiBDT05ESVRJT04gQk9EWS4uLik6IElmIENPTkRJVElPTiBpcyB0cnVlLCBkbyBCT0RZLCBlbHNlIHJldHVybiBuaWwuIgorICAgICAgKGAgKGlmICgsIGNvbmRpdGlvbikKKwkgICAgIChwcm9nbiAoLEAgYm9keSkpIAorCSAgIG5pbCkpKSkKKworKG9yIChmYm91bmRwICdjaGFyLWJlZm9yZSkKKyAgICAoZGVmbWFjcm8gY2hhci1iZWZvcmUgKCZvcHRpb25hbCBwb3MpCisgICAgICAiUmV0dXJuIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGp1c3QgYmVmb3JlIFBPUy4iCisgICAgICAoYCAoY2hhci1hZnRlciAoMS0gKG9yICgsIHBvcykgKHBvaW50KSkpKSkpKQorCQkJICAgCisob3IgKGZib3VuZHAgJ3JlZ2V4cC1vcHQpCisgICAgKGRlZnVuIHJlZ2V4cC1vcHQgKHN0cmluZ3MgJm9wdGlvbmFsIHBhcmVuKQorICAgICAgIlJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgYW55IHN0cmluZyBpbgorU1RSSU5HUy4gSWYgUEFSRU4gaXMgdHJ1ZSwgaXQgd2lsbCBhbHdheXMgZW5jbG9zZSB0aGUgcmVndWxhcgorZXhwcmVzc2lvbiBpbiBwYXJlbnRoZXNlcy4gCisKK1VubGlrZSBpdHMgRW1hY3MtMjAgbmFtZXNha2UsIGl0IHdpbGwgbm90IG9wdGltaXplIHRoZSBnZW5lcmF0ZWQKK2V4cHJlc3Npb24uIgorICAgICAgOzsgVGhpcyBzdG9wLWdhcCBkZWZpbml0aW9uIGlzIHRha2VuIGZyb20KKyAgICAgIDs7IF9HTlVfRW1hY3NfTGlzcF9SZWZlcmVuY2VfTWFudWFsXywgZWQgMi41LCBmb3IgRW1hY3MgMjAuMy4KKyAgICAgIChsZXQgKChvcGVuIChpZiBwYXJlbiAiXFwoIiAiIikpCisJICAgIChjbG9zZSAoaWYgcGFyZW4gIlxcKSIgIiIpKSkKKwkoY29uY2F0IG9wZW4KKwkJKG1hcGNvbmNhdCAncmVnZXhwLXF1b3RlIHN0cmluZ3MgIlxcfCIpCisJCWNsb3NlKSkpKQorCisoZXZhbC13aGVuLWNvbXBpbGUKKyAgKGlmIChvciAoZmVhdHVyZXAgJ2J5dGVjb21wKQorCSAgKGZlYXR1cmVwICdieXRlLWNvbXBpbGUpKQorICAgICAgKHByb2duCisJKGNvbmQgKChzdHJpbmctbWF0Y2ggIkx1Y2lkXFx8WEVtYWNzIiBlbWFjcy12ZXJzaW9uKQorCSAgICAgICAocHV0ICdjb21tZW50LWluZGVudC1ob29rICdieXRlLW9ic29sZXRlLXZhcmlhYmxlIG5pbCkKKwkgICAgICAgOzsgRG8gbm90IHdhcm4gZm9yIHVudXNlZCB2YXJpYWJsZXMKKwkgICAgICAgOzsgd2hlbiBjb21waWxpbmcgdW5kZXIgWEVtYWNzLgorCSAgICAgICAoc2V0cSBieXRlLWNvbXBpbGUtd2FybmluZ3MKKwkJICAgICAnKGZyZWUtdmFycyB1bnJlc29sdmVkIGNhbGxhcmdzIHJlZGVmaW5lKSkpKQorCShyZXF1aXJlICdjb21pbnQpCisJKHJlcXVpcmUgJ2NvbXBpbGUpKSkpCisKKwwKKyhkZWZ1biBlcmxhbmctdmVyc2lvbiAoKQorICAiUmV0dXJuIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgRXJsYW5nIG1vZGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChpZiAoaW50ZXJhY3RpdmUtcCkKKyAgICAgIChtZXNzYWdlICJFcmxhbmcgbW9kZSB2ZXJzaW9uICVzLCB3cml0dGVuIGJ5IEFuZGVycyBMaW5kZ3JlbiIKKwkgICAgICAgZXJsYW5nLXZlcnNpb24pKQorICBlcmxhbmctdmVyc2lvbikKKworCis7OzsjIyNhdXRvbG9hZAorKGRlZnVuIGVybGFuZy1tb2RlICgpCisgICJNYWpvciBtb2RlIGZvciBlZGl0aW5nIEVybGFuZyBzb3VyY2UgZmlsZXMgaW4gRW1hY3MuCitJdCBrbm93cyBhYm91dCBzeW50YXggYW5kIGNvbW1lbnQsIGl0IGNhbiBpbmRlbnQgY29kZSwgaXQgaXMgY2FwYWJsZQorb2YgZm9udGlmeWluZyB0aGUgc291cmNlIGZpbGUsIHRoZSBUQUdTIGNvbW1hbmRzIGFyZSBhd2FyZSBvZiBFcmxhbmcKK21vZHVsZXMsIGFuZCB0aGUgRXJsYW5nIG1hbiBwYWdlcyBjYW4gYmUgYWNjZXNzZWQuCisKK1Nob3VsZCB0aGlzIG1vZHVsZSwgXCJlcmxhbmcuZWxcIiwgYmUgaW5zdGFsbGVkIHByb3Blcmx5LCBFcmxhbmcgbW9kZQoraXMgYWN0aXZhdGVkIHdoZW5ldmVyIGFuIEVybGFuZyBzb3VyY2Ugb3IgaGVhZGVyIGZpbGUgaXMgbG9hZGVkIGludG8KK0VtYWNzLiAgVG8gaW5kaWNhdGUgdGhpcywgdGhlIG1vZGUgbGluZSBzaG91bGQgY29udGFpbiB0aGUgd29yZAorXCJFcmxhbmdcIi4KKworVGhlIG1haW4gZmVhdHVyZSBvZiBFcmxhbmcgbW9kZSBpcyBpbmRlbnRhdGlvbiwgcHJlc3MgVEFCIGFuZCB0aGUKK2N1cnJlbnQgbGluZSB3aWxsIGJlIGluZGVudGVkIGNvcnJlY3RseS4KKworQ29tbWVudHMgc3RhcnRpbmcgd2l0aCBvbmx5IG9uZSBgJScgYXJlIGluZGVudGVkIHRvIHRoZSBjb2x1bW4gc3RvcmVkCitpbiB0aGUgdmFyaWFibGUgYGNvbW1lbnQtY29sdW1uJy4gIENvbW1lbnRzIHN0YXJ0aW5nIHdpdGggdHdvIGAlJzpzCithcmUgaW5kZW50ZWQgd2l0aCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBhcyBjb2RlLiAgQ29tbWVudHMgc3RhcnRpbmcKK3dpdGggYXQgbGVhc3QgdGhyZWUgYCUnOnMgYXJlIGluZGVudGVkIHRvIHRoZSBmaXJzdCBjb2x1bW4uCisKK0hvd2V2ZXIsIEVybGFuZyBtb2RlIGNvbnRhaW5zIG11Y2ggbW9yZSwgdGhpcyBpcyBhIGxpc3Qgb2YgdGhlIG1vc3QKK3VzZWZ1bCBjb21tYW5kczoKKyAgICAgVEFCICAgICAtIEluZGVudCB0aGUgbGluZS4KKyAgICAgQy1jIEMtcSAtIEluZGVudCBjdXJyZW50IGZ1bmN0aW9uLgorICAgICBNLTsgICAgIC0gQ3JlYXRlIGEgY29tbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICAgICBNLXEgICAgIC0gRmlsbCBhIGNvbW1lbnQsIGkuZS4gd3JhcCBsaW5lcyBzbyB0aGF0IHRoZXkgKGhvcGVmdWxseSkKKwkJIHdpbGwgbG9vayBiZXR0ZXIuCisgICAgIE0tYSAgICAgLSBHb3RvIHRoZSBiZWdpbm5pbmcgb2YgYW4gRXJsYW5nIGNsYXVzZS4KKyAgICAgTS1DLWEgICAtIERpdHRvIGZvciBmdW5jdGlvbi4KKyAgICAgTS1lICAgICAtIEdvdG8gdGhlIGVuZCBvZiBhbiBFcmxhbmcgY2xhdXNlLgorICAgICBNLUMtZSAgIC0gRGl0dG8gZm9yIGZ1bmN0aW9uLgorICAgICBNLWggICAgIC0gTWFyayBjdXJyZW50IEVybGFuZyBjbGF1c2UuCisgICAgIE0tQy1oICAgLSBEaXR0byBmb3IgZnVuY3Rpb24uCisgICAgIEMtYyBDLXogLSBTdGFydCwgb3Igc3dpdGNoIHRvLCBhbiBpbmZlcmlvciBFcmxhbmcgc2hlbGwuCisgICAgIEMtYyBDLWsgLSBDb21waWxlIGN1cnJlbnQgZmlsZS4KKyAgICAgQy14IGAgICAtIE5leHQgZXJyb3IuCisgICAgICwgICAgICAgLSBFbGVjdHJpYyBjb21tYS4KKyAgICAgOyAgICAgICAtIEVsZWN0cmljIHNlbWljb2xvbi4KKworRXJsYW5nIG1vZGUgY2hlY2sgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYWdhaW5zdCB0aGUgbW9kdWxlIG5hbWUgd2hlbgorc2F2aW5nLCB3aGVuZXZlciBhIG1pc21hdGNoIG9jY3VycyBFcmxhbmcgbW9kZSBvZmZlcnMgdG8gbW9kaWZ5IHRoZQorc291cmNlLgorCitUaGUgdmFyaWFibGUgYGVybGFuZy1lbGVjdHJpYy1jb21tYW5kcycgY29udHJvbHMgdGhlIGVsZWN0cmljCitjb21tYW5kcy4gIFRvIGRlYWN0aXZhdGUgYWxsIG9mIHRoZW0sIHNldCBpdCB0byBuaWwuCisKK1RoZXJlIGV4aXN0cyBhIGxhcmdlIG51bWJlciBvZiBjb21tYW5kcyBhbmQgdmFyaWFibGVzIGluIHRoZSBFcmxhbmcKK21vZHVsZS4gIFBsZWFzZSBwcmVzcyBgTS14IGFwcm9wb3MgUkVUIGVybGFuZyBSRVQnIHRvIHNlZSBhIGNvbXBsZXRlCitsaXN0LiAgUHJlc3MgYEMtaCBmIG5hbWUtb2YtZnVuY3Rpb24gUkVUJyBhbmQgYEMtaCB2IG5hbWUtb2YtdmFyaWFibGUKK1JFVCd0byBzZWUgdGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMsCityZXNwZWN0aXZlbHkuCisKK09uIGVudHJ5IHRvIHRoaXMgbW9kZSB0aGUgY29udGVudHMgb2YgdGhlIGhvb2sgYGVybGFuZy1tb2RlLWhvb2snIGlzCitleGVjdXRlZC4KKworUGxlYXNlIHNlZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGBlcmxhbmcuZWwnIGZvciBtb3JlIGluZm9ybWF0aW9uCithbmQgZXhhbXBsZXMgb2YgaG9va3MuCisKK090aGVyIGNvbW1hbmRzOgorXFx7ZXJsYW5nLW1vZGUtbWFwfSIKKyAgKGludGVyYWN0aXZlKQorICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQorICAoc2V0cSBtYWpvci1tb2RlICdlcmxhbmctbW9kZSkKKyAgKHNldHEgbW9kZS1uYW1lICJFcmxhbmciKQorICAoZXJsYW5nLXN5bnRheC10YWJsZS1pbml0KQorICAoZXJsYW5nLWtleW1hcC1pbml0KQorICAoZXJsYW5nLWVsZWN0cmljLWluaXQpCisgIChlcmxhbmctbWVudS1pbml0KQorICAoZXJsYW5nLW1vZGUtdmFyaWFibGVzKQorICAoZXJsYW5nLWNoZWNrLW1vZHVsZS1uYW1lLWluaXQpCisgIChlcmxhbmctYWRkLWNvbXBpbGF0aW9uLWFsaXN0IGVybGFuZy1lcnJvci1yZWdleHAtYWxpc3QpCisgIChlcmxhbmctbWFuLWluaXQpCisgIChlcmxhbmctdGFncy1pbml0KQorICAoZXJsYW5nLWZvbnQtbG9jay1pbml0KQorICAoZXJsYW5nLXNrZWwtaW5pdCkKKyAgKHJ1bi1ob29rcyAnZXJsYW5nLW1vZGUtaG9vaykKKyAgKGlmICh6ZXJvcCAoYnVmZmVyLXNpemUpKQorICAgICAgKHJ1bi1ob29rcyAnZXJsYW5nLW5ldy1maWxlLWhvb2spKSkKKworCisoZGVmdW4gZXJsYW5nLXN5bnRheC10YWJsZS1pbml0ICgpCisgIChpZiAobnVsbCBlcmxhbmctbW9kZS1zeW50YXgtdGFibGUpCisgICAgKGxldCAoKHRhYmxlIChtYWtlLXN5bnRheC10YWJsZSkpKQorICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xuICI+IiB0YWJsZSkKKyAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9cIiAiXCIiIHRhYmxlKQorICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyMgIi4iIHRhYmxlKQorICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyQgIi8iIHRhYmxlKQorICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyUgIjwiIHRhYmxlKQorICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPyYgIi4iIHRhYmxlKQorICAgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1wnICJcIiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/KiAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/KyAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/LSAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/LyAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/OiAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/PCAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/PSAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/PiAiLiIgdGFibGUpCisgICAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XFwgIlxcIiB0YWJsZSkKKyAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9fICJfIiB0YWJsZSkKKyAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID98ICIuIiB0YWJsZSkKKyAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9eICIvIiB0YWJsZSkKKworICAgICAgOzsgUHNldWRvIGJpdC1zeW50YXg6IExhdGluMSBkb3VibGUgYW5nbGUgcXVvdGVzIGFzIHBhcmVucy4KKyAgICAgIDs7KG1vZGlmeS1zeW50YXgtZW50cnkgP1wyNTMgIig/XDI3MyIgdGFibGUpCisgICAgICA7Oyhtb2RpZnktc3ludGF4LWVudHJ5ID9cMjczICIpP1wyNTMiIHRhYmxlKQorCisgICAgICAoc2V0cSBlcmxhbmctbW9kZS1zeW50YXgtdGFibGUgdGFibGUpKSkKKworICAoc2V0LXN5bnRheC10YWJsZSBlcmxhbmctbW9kZS1zeW50YXgtdGFibGUpKQorCisKKyhkZWZ1biBlcmxhbmcta2V5bWFwLWluaXQgKCkKKyAgKGlmIGVybGFuZy1tb2RlLW1hcAorICAgICAgbmlsCisgICAgKHNldHEgZXJsYW5nLW1vZGUtbWFwIChtYWtlLXNwYXJzZS1rZXltYXApKQorICAgIChlcmxhbmctbW9kZS1jb21tYW5kcyBlcmxhbmctbW9kZS1tYXApKQorICAodXNlLWxvY2FsLW1hcCBlcmxhbmctbW9kZS1tYXApKQorCisKKyhkZWZ1biBlcmxhbmctbW9kZS1jb21tYW5kcyAobWFwKQorICAoZGVmaW5lLWtleSBtYXAgIlx0IiAgICAgICAgJ2VybGFuZy1pbmRlbnQtY29tbWFuZCkKKyAgKGRlZmluZS1rZXkgbWFwICI7IgkgICAgICAnZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbikKKyAgKGRlZmluZS1rZXkgbWFwICIsIgkgICAgICAnZXJsYW5nLWVsZWN0cmljLWNvbW1hKQorICAoZGVmaW5lLWtleSBtYXAgIjwiICAgICAgICAgJ2VybGFuZy1lbGVjdHJpYy1sdCkKKyAgKGRlZmluZS1rZXkgbWFwICI+IiAgICAgICAgICdlcmxhbmctZWxlY3RyaWMtZ3QpCisgIChkZWZpbmUta2V5IG1hcCAiXEMtbSIgICAgICAnZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUpCisgIChkZWZpbmUta2V5IG1hcCAiXDE3NyIgICAgICAnYmFja3dhcmQtZGVsZXRlLWNoYXItdW50YWJpZnkpCisgIChkZWZpbmUta2V5IG1hcCAiXE0tcSIgICAgICAnZXJsYW5nLWZpbGwtcGFyYWdyYXBoKQorICAoZGVmaW5lLWtleSBtYXAgIlxNLVxDLWEiICAgJ2VybGFuZy1iZWdpbm5pbmctb2YtZnVuY3Rpb24pCisgIChkZWZpbmUta2V5IG1hcCAiXE0tXEMtZSIgICAnZXJsYW5nLWVuZC1vZi1mdW5jdGlvbikKKyAgKGRlZmluZS1rZXkgbWFwICJcTS1cQy1oIiAgICdlcmxhbmctbWFyay1mdW5jdGlvbikKKyAgKGRlZmluZS1rZXkgbWFwICJcTS1cdCIgICAgICdlcmxhbmctY29tcGxldGUtdGFnKQorICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcTS1cdCIgJ3RlbXBvLWNvbXBsZXRlLXRhZykKKyAgKGRlZmluZS1rZXkgbWFwICJcQy1jXE0tYSIgICdlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKKyAgKGRlZmluZS1rZXkgbWFwICJcQy1jXE0tYiIgICd0ZW1wby1iYWNrd2FyZC1tYXJrKQorICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcTS1lIiAgJ2VybGFuZy1lbmQtb2YtY2xhdXNlKQorICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcTS1mIiAgJ3RlbXBvLWZvcndhcmQtbWFyaykKKyAgKGRlZmluZS1rZXkgbWFwICJcQy1jXE0taCIgICdlcmxhbmctbWFyay1jbGF1c2UpCisgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWMiICAnY29tbWVudC1yZWdpb24pCisgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWoiICAnZXJsYW5nLWdlbmVyYXRlLW5ldy1jbGF1c2UpCisgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWsiICAnZXJsYW5nLWNvbXBpbGUpCisgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLWwiICAnZXJsYW5nLWNvbXBpbGUtZGlzcGxheSkKKyAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtcyIgICdlcmxhbmctc2hvdy1zeW50YWN0aWMtaW5mb3JtYXRpb24pCisgIChkZWZpbmUta2V5IG1hcCAiXEMtY1xDLXEiICAnZXJsYW5nLWluZGVudC1mdW5jdGlvbikKKyAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMtdSIgICdlcmxhbmctdW5jb21tZW50LXJlZ2lvbikKKyAgKGRlZmluZS1rZXkgbWFwICJcQy1jXEMteSIgICdlcmxhbmctY2xvbmUtYXJndW1lbnRzKQorICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy16IiAgJ2VybGFuZy1zaGVsbC1kaXNwbGF5KQorICAoZGVmaW5lLWtleSBtYXAgIlxDLXhgIiAgICAgJ2VybGFuZy1uZXh0LWVycm9yKSkKKworCisoZGVmdW4gZXJsYW5nLWVsZWN0cmljLWluaXQgKCkKKyAgOzsgU2V0IHVwIGVsZWN0cmljIGNoYXJhY3RlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoCisgIDs7IGRlbHNlbC9wZW5kaW5nLWRlbCBtb2RlLiBBbHNvLCBzZXQgdXAgdGV4dCBwcm9wZXJ0aWVzIGZvciBiaXQKKyAgOzsgc3ludGF4IGhhbmRsaW5nLgorICAobWFwY2FyICMnKGxhbWJkYSAoY21kKQorCSAgICAgIChwdXQgY21kICdkZWxldGUtc2VsZWN0aW9uIHQpCTtmb3IgZGVsc2VsIChFbWFjcykKKwkgICAgICAocHV0IGNtZCAncGVuZGluZy1kZWxldGUgdCkpCTtmb3IgcGVuZGluZy1kZWwgKFhFbWFjcykKKwkgICcoZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbgorCSAgICBlcmxhbmctZWxlY3RyaWMtY29tbWEKKwkgICAgZXJsYW5nLWVsZWN0cmljLWd0KSkKKworICAocHV0ICdiaXRzeW50YXgtb3Blbi1vdXRlciAnc3ludGF4LXRhYmxlICcoNCAuID8+KSkKKyAgKHB1dCAnYml0c3ludGF4LW9wZW4tb3V0ZXIgJ3JlYXItbm9uc3RpY2t5ICcoY2F0ZWdvcnkpKQorICAocHV0ICdiaXRzeW50YXgtb3Blbi1pbm5lciAncmVhci1ub25zdGlja3kgJyhjYXRlZ29yeSkpCisgIChwdXQgJ2JpdHN5bnRheC1jbG9zZS1pbm5lciAncmVhci1ub25zdGlja3kgJyhjYXRlZ29yeSkpCisgIChwdXQgJ2JpdHN5bnRheC1jbG9zZS1vdXRlciAnc3ludGF4LXRhYmxlICcoNSAuID88KSkKKyAgKHB1dCAnYml0c3ludGF4LWNsb3NlLW91dGVyICdyZWFyLW5vbnN0aWNreSAnKGNhdGVnb3J5KSkKKyAgKHNldHEgcGFyc2Utc2V4cC1sb29rdXAtcHJvcGVydGllcyAndCkpCisKKworCisoZGVmdW4gZXJsYW5nLW1vZGUtdmFyaWFibGVzICgpCisgIChvciBlcmxhbmctbW9kZS1hYmJyZXYtdGFibGUKKyAgICAgIChkZWZpbmUtYWJicmV2LXRhYmxlICdlcmxhbmctbW9kZS1hYmJyZXYtdGFibGUgKCkpKQorICAoc2V0cSBsb2NhbC1hYmJyZXYtdGFibGUgZXJsYW5nLW1vZGUtYWJicmV2LXRhYmxlKQorICAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFyYWdyYXBoLXN0YXJ0KQorICAoc2V0cSBwYXJhZ3JhcGgtc3RhcnQgKGNvbmNhdCAiXiRcXHwiIHBhZ2UtZGVsaW1pdGVyKSkKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1zZXBhcmF0ZSkKKyAgKHNldHEgcGFyYWdyYXBoLXNlcGFyYXRlIHBhcmFncmFwaC1zdGFydCkKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhcmFncmFwaC1pZ25vcmUtZmlsbC1wcmVmaXgpCisgIChzZXRxIHBhcmFncmFwaC1pZ25vcmUtZmlsbC1wcmVmaXggdCkKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3JlcXVpcmUtZmluYWwtbmV3bGluZSkKKyAgKHNldHEgcmVxdWlyZS1maW5hbC1uZXdsaW5lIHQpCisgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdkZWZ1bi1wcm9tcHQtcmVnZXhwKQorICAoc2V0cSBkZWZ1bi1wcm9tcHQtcmVnZXhwIGVybGFuZy1kZWZ1bi1wcm9tcHQtcmVnZXhwKQorICAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29tbWVudC1zdGFydCkKKyAgKHNldHEgY29tbWVudC1zdGFydCAiJSIpCisgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdjb21tZW50LXN0YXJ0LXNraXApCisgIChzZXRxIGNvbW1lbnQtc3RhcnQtc2tpcCAiJStcXHMgKiIpCisgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdjb21tZW50LWNvbHVtbikKKyAgKHNldHEgY29tbWVudC1jb2x1bW4gNDgpCisgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdpbmRlbnQtbGluZS1mdW5jdGlvbikKKyAgKHNldHEgaW5kZW50LWxpbmUtZnVuY3Rpb24gJ2VybGFuZy1pbmRlbnQtY29tbWFuZCkKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2luZGVudC1yZWdpb24tZnVuY3Rpb24pCisgIChzZXRxIGluZGVudC1yZWdpb24tZnVuY3Rpb24gJ2VybGFuZy1pbmRlbnQtcmVnaW9uKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdjb21tZW50LWluZGVudC1mdW5jdGlvbikgJ2VybGFuZy1jb21tZW50LWluZGVudCkKKyAgKGlmICg8PSBlcmxhbmctZW1hY3MtbWFqb3ItdmVyc2lvbiAxOCkKKyAgICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2NvbW1lbnQtaW5kZW50LWhvb2spICdlcmxhbmctY29tbWVudC1pbmRlbnQpKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJzZS1zZXhwLWlnbm9yZS1jb21tZW50cykgdCkKKyAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZGFiYnJldi1jYXNlLWZvbGQtc2VhcmNoKSBuaWwpCisgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ltZW51LXByZXYtaW5kZXgtcG9zaXRpb24tZnVuY3Rpb24pCisgICAgICAgJ2VybGFuZy1iZWdpbm5pbmctb2YtZnVuY3Rpb24pCisgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ltZW51LWV4dHJhY3QtaW5kZXgtbmFtZS1mdW5jdGlvbikKKyAgICAgICAnZXJsYW5nLWdldC1mdW5jdGlvbi1uYW1lKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICd0ZW1wby1tYXRjaC1maW5kZXIpCisgICAgICAgIlteLWEtekEtWjAtOV9dXFwoWy1hLXpBLVowLTlfXSpcXClcXD0iKSkKKworCis7OyBDb21waWxhdGlvbi4KKzs7Cis7OyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBwYWNrYWdlIGBjb21waWxhdGlvbicsCis7OyBtYWtpbmcgaXQgcG9zc2libGUgdG8gZ28gdG8gZXJyb3JzIHVzaW5nIGBlcmxhbmctbmV4dC1lcnJvcicuCis7OworOzsgVGhlIG5vcm1hbCBgY29tcGlsZScgY29tbWFuZCB3b3JrcyBvZmNvdXJzZS4gIEZvciBiZXN0IHJlc3VsdCwgcGxlYXNlCis7OyBleGVjdXRlIGBtYWtlJyB3aXRoIHRoZSBgLXcnIGZsYWcuCis7OworOzsgUGxlYXNlIHNlZSB0aGUgdmFyaWFibGVzIG5hbWVkIGBjb21waWxpbmctLi4nIGFib3ZlLgorCisoZGVmdW4gZXJsYW5nLWFkZC1jb21waWxhdGlvbi1hbGlzdCAoYWxpc3QpCisgIChyZXF1aXJlICdjb21waWxlKQorICAoY29uZCAoKGJvdW5kcCAnY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0KSA7IEVtYWNzIDE5CisJICh3aGlsZSBhbGlzdAorCSAgIChvciAoYXNzb2MgKGNhciAoY2FyIGFsaXN0KSkgY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwLWFsaXN0KQorCSAgICAgICAoc2V0cSBjb21waWxhdGlvbi1lcnJvci1yZWdleHAtYWxpc3QKKwkJICAgICAoY29ucyAoY2FyIGFsaXN0KSBjb21waWxhdGlvbi1lcnJvci1yZWdleHAtYWxpc3QpKSkKKwkgICAoc2V0cSBhbGlzdCAoY2RyIGFsaXN0KSkpKQorCSgoYm91bmRwICdjb21waWxhdGlvbi1lcnJvci1yZWdleHApCisJIDs7IEVtYWNzIDE4LCAgT25seSBvbmUgcmVnZXhwIGlzIGFsbG93ZWQuCisJIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkKKwkJICAnY29tcGlsYXRpb24tZXJyb3ItcmVnZXhwIChjYXIgKGNhciBhbGlzdCkpKSkpKQorDAorKGRlZnVuIGVybGFuZy1mb250LWxvY2staW5pdCAoKQorICAiSW5pdGlhbGl6ZSBGb250IExvY2sgZm9yIEVybGFuZyBtb2RlLiIKKyAgKG9yIGVybGFuZy1mb250LWxvY2stc3ludGF4LXRhYmxlCisgICAgICAoc2V0cSBlcmxhbmctZm9udC1sb2NrLXN5bnRheC10YWJsZQorCSAgICAobGV0ICgodGFibGUgKGNvcHktc3ludGF4LXRhYmxlIGVybGFuZy1tb2RlLXN5bnRheC10YWJsZSkpKQorCSAgICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9fICJ3IiB0YWJsZSkKKwkgICAgICB0YWJsZSkpKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdmb250LWxvY2stc3ludGF4LXRhYmxlKQorICAgICAgIGVybGFuZy1mb250LWxvY2stc3ludGF4LXRhYmxlKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdmb250LWxvY2stYmVnaW5uaW5nLW9mLXN5bnRheC1mdW5jdGlvbikKKyAgICAgICAnZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCisgIChtYWtlLWxvY2FsLXZhcmlhYmxlICdmb250LWxvY2sta2V5d29yZHMpCisgIChsZXQgKChsZXZlbCAoY29uZCAoKGJvdW5kcCAnZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbikKKwkJICAgICAgKHN5bWJvbC12YWx1ZSAnZm9udC1sb2NrLW1heGltdW0tZGVjb3JhdGlvbikpCisJCSAgICAgKChib3VuZHAgJ2ZvbnQtbG9jay11c2UtbWF4aW1hbC1kZWNvcmF0aW9uKQorCQkgICAgICAoc3ltYm9sLXZhbHVlICdmb250LWxvY2stdXNlLW1heGltYWwtZGVjb3JhdGlvbikpCisJCSAgICAgKHQgbmlsKSkpKQorICAgIChpZiAoY29uc3AgbGV2ZWwpCisJKHNldHEgbGV2ZWwgKGNkci1zYWZlIChvciAoYXNzcSAnZXJsYW5nLW1vZGUgbGV2ZWwpCisJCQkJICAoYXNzcSB0IGxldmVsKSkpKSkKKyAgICA7OyBgbGV2ZWwnIGNhbiBoZXJlIGJlOgorICAgIDs7ICAgICAgQSBudW1iZXIgLSBUaGUgZm9udGlmaWNhdGlvbiBsZXZlbAorICAgIDs7ICAgICAgbmlsICAgICAgLSBVc2UgdGhlIGRlZmF1bHQKKyAgICA7OyAgICAgIHQgICAgICAgIC0gVXNlIG1heGltdW0KKyAgICAoY29uZCAoKGVxIGxldmVsIG5pbCkKKwkgICAoc2V0ICdmb250LWxvY2sta2V5d29yZHMgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3JkcykpCisJICAoKGVxIGxldmVsIDEpCisJICAgKHNldCAnZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMSkpCisJICAoKGVxIGxldmVsIDIpCisJICAgKHNldCAnZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMikpCisJICAodAorCSAgIChzZXQgJ2ZvbnQtbG9jay1rZXl3b3JkcyBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMpKSkpCisKKyAgOzsgTW9kZXJuIGZvbnQtbG9ja3MgY2FuIGhhbmRsZSB0aGUgYWJvdmUgbXVjaCBtb3JlIGVsZWdhbnQ6CisgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2ZvbnQtbG9jay1kZWZhdWx0cykKKyAgICAgICAnKChlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMQorICAgICAgICAgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMiBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLTMpCisJIG5pbCBuaWwgKCg/XyAuICJ3IikpIGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlCisJIChmb250LWxvY2stY29tbWVudC1zdGFydC1yZWdleHAgLiAiJSIpCisJIChmb250LWxvY2stbWFyay1ibG9jay1mdW5jdGlvbiAuIGVybGFuZy1tYXJrLWNsYXVzZSkpKSkKKworCisKKzs7IFVzZWZ1bCB3aGVuIGRlZmluaWcgeW91dCBvd24ga2V5d29yZHMuCisoZGVmdW4gZXJsYW5nLWZvbnQtbG9jay1zZXQtZmFjZSAoa3MgJnJlc3QgZmFjZXMpCisgICJSZXBsYWNlIHRoZSBmYWNlIGNvbXBvbmVudHMgaW4gYSBsaXN0IG9mIGtleXdvcmRzLgorCitUaGUgZmlyc3QgYXJndW1lbnQsIEtTLCBpcyBhIGxpc3Qgb2Yga2V5d29yZHMuICBUaGUgcmVzdCBvZiB0aGUKK2FyZ3VtZW50cyBhcmUgZXhwcmVzc2lvbnMgdG8gcmVwbGFjZSB0aGUgZmFjZSBpbmZvcm1hdGlvbiB3aXRoLiAgVGhlCitmaXJzdCBleHByZXNzaW9uIHJlcGxhY2VzIHRoZSBmYWNlIG9mIHRoZSBmaXJzdCBrZXl3b3JkLCB0aGUgc2Vjb25kCitleHByZXNzaW9uIHRoZSBzZWNvbmQga2V5d29yZCBldGMuCisKK1Nob3VsZCBhbiBleHByZXNzaW9uIGJlIG5pbCwgdGhlIGZhY2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcga2V5d29yZCBpcworbm90IGNoYW5nZWQuCisKK1Nob3VsZCBmZXdlciBleHByZXNzaW9ucyB0aGFuIGtleXdvcmRzIGJlIGdpdmVuLCB0aGUgbGFzdCBleHByZXNzaW9uCitpcyB1c2VkIGZvciBhbGwgcmVtYWluaW5nIGtleXdvcmRzLgorCitOb3JtYWxseSwgdGhlIGV4cHJlc3Npb25zIGFyZSBqdXN0IGF0b21zIHJlcHJlc2VudGluZyB0aGUgbmV3IGZhY2UuCitUaGV5IGNvdWxkIGhvd2V2ZXIgYmUgbW9yZSBjb21wbGV4LCByZXR1cm5pbmcgZGlmZmVyZW50IGZhY2VzIGluCitkaWZmZXJlbnQgc2l0dWF0aW9ucy4KKworVGhpcyBmdW5jdGlvbiBkb2VzIG9ubHkgaGFuZGxlIGtleXdvcmRzIHdpdGggZWxlbWVudHMgb24gdGhlIGZvcm1zOgorICAoUkVHRVhQIE5VTUJFUiBGQUNFKQorICAoUkVHRVhQIE5VTUJFUiBGQUNFIE9WRVJXUklURSkKKworVGhpcyBjb3VsZCBiZSB1c2VkIHdoZW4gZGVmaW5pbmcgeW91ciBvd24gc3BlY2lhbCBmb250LWxvY2sgc2V0dXAsIGUuZzoKKworXChzZXRxIG15LWZvbnQtbG9jay1rZXl3b3JkcworICAgICAgKGFwcGVuZCBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWZ1bmMKKyAgICAgICAgICAgICAgZXJsYW5nLWZvbnQtbG9jay1rZXl3b3Jkcy1kb2xsYXIKKyAgICAgICAgICAgICAgKGVybGFuZy1mb250LWxvY2stc2V0LWZhY2UKKyAgICAgICAgICAgICAgIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtbWFjcm9zICdteS1uZW9uLWdyZWVuLWZhY2UpCisgICAgICAgICAgICAgIChlcmxhbmctZm9udC1sb2NrLXNldC1mYWNlCisgICAgICAgICAgICAgICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWxjICdteS1kZWVwLXJlZCAnbXktbGlnaHQtcmVkKQorICAgICAgICAgICAgICBlcmxhbmctZm9udC1sb2NrLWtleXdvcmRzLWF0dHIpKQorCitGb3IgYSBtb3JlIGVsYWJvcmF0ZSBleGFtcGxlLCBwbGVhc2Ugc2VlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUKK2BlcmxhbmcuZWwnLiIKKyAgKGxldCAoKHJlcyAnKCkpKQorICAgICh3aGlsZSBrcworICAgICAgKGxldCogKChyZWdleHAgKGNhciAoY2FyIGtzKSkpCisJICAgICAobnVtYmVyIChjYXIgKGNkciAoY2FyIGtzKSkpKQorCSAgICAgKG5ldy1mYWNlIChpZiAoYW5kIGZhY2VzIChjYXIgZmFjZXMpKQorCQkJICAgKGNhciBmYWNlcykKKwkJCSAoY2FyIChjZHIgKGNkciAoY2FyIGtzKSkpKSkpCisJICAgICAob3ZlcndyaXRlIChjYXIgKGNkciAoY2RyIChjZHIgKGNhciBrcykpKSkpKQorCSAgICAgKG5ldy1rZXl3b3JkIChsaXN0IHJlZ2V4cCBudW1iZXIgbmV3LWZhY2UpKSkKKwkoaWYgb3ZlcndyaXRlIChuY29uYyBuZXcta2V5d29yZCAobGlzdCBvdmVyd3JpdGUpKSkKKwkoc2V0cSByZXMgKGNvbnMgbmV3LWtleXdvcmQgcmVzKSkKKwkoc2V0cSBrcyAoY2RyIGtzKSkKKwkoaWYgKGFuZCBmYWNlcyAoY2RyIGZhY2VzKSkKKwkgICAgKHNldHEgZmFjZXMgKGNkciBmYWNlcykpKSkpCisgICAgKG5yZXZlcnNlIHJlcykpKQorCisKKyhkZWZ1biBlcmxhbmctZm9udC1sb2NrLWxldmVsLTAgKCkKKyAgOzsgRG9jU3RyaW5nT3JpZzogZm9udC1jbWQKKyAgIkZvbnRpZnkgY3VycmVudCBidWZmZXIuIExldmVsIHJhbmdlcyBmcm9tIDAgKG9mZikgdG8gMyAoQ2hyaXN0bWFzIFRyZWUpLgorCitUaGUgZm9sbG93aW5nIGZvbnRpZmljYXRpb24gbGV2ZWwgZXhpc3RzOgorICAwIC0gTm8gZm9udGlmaWNhdGlvbgorICAxIC0gRnVuY3Rpb24gaGVhZGVycywgcmVzZXJ2ZWQga2V5d29yZHMsIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgorICAyIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2xlIHF1b3RlcycuCisgIDMgLSBWYXJpYWJsZXMsIG1hY3JvcyBhbmQgcmVjb3Jkcy4KKworVG8gYXV0b21hdGljYWxseSBhY3RpdmF0ZSBmb250IGxvY2sgbW9kZSwgcGxhY2UgdGhlIGZvbGxvd2luZyBsaW5lcworaW4geW91ciB+Ly5lbWFjcyBmaWxlOgorCitcKGRlZnVuIG15LWVybGFuZy1tb2RlLWhvb2sgKCkKKyAgKGNvbmQgKHdpbmRvdy1zeXN0ZW0KKwkgKGZvbnQtbG9jay1tb2RlIDEpKSkpCitcKGFkZC1ob29rICdlcmxhbmctbW9kZS1ob29rICdteS1lcmxhbmctbW9kZS1ob29rKQorXChzZXRxIGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24gdCkiCisgIChpbnRlcmFjdGl2ZSkKKyAgKGZvbnQtbG9jay1tb2RlIDApKQorCisKKyhkZWZ1biBlcmxhbmctZm9udC1sb2NrLWxldmVsLTEgKCkKKyAgOzsgRG9jU3RyaW5nQ29weTogZm9udC1jbWQKKyAgIkZvbnRpZnkgY3VycmVudCBidWZmZXIuIExldmVsIHJhbmdlcyBmcm9tIDAgKG9mZikgdG8gMyAoQ2hyaXN0bWFzIFRyZWUpLgorCitUaGUgZm9sbG93aW5nIGZvbnRpZmljYXRpb24gbGV2ZWwgZXhpc3RzOgorICAwIC0gTm8gZm9udGlmaWNhdGlvbgorICAxIC0gRnVuY3Rpb24gaGVhZGVycywgcmVzZXJ2ZWQga2V5d29yZHMsIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgorICAyIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2xlIHF1b3RlcycuCisgIDMgLSBWYXJpYWJsZXMsIG1hY3JvcyBhbmQgcmVjb3Jkcy4KKworVG8gYXV0b21hdGljYWxseSBhY3RpdmF0ZSBmb250IGxvY2sgbW9kZSwgcGxhY2UgdGhlIGZvbGxvd2luZyBsaW5lcworaW4geW91ciB+Ly5lbWFjcyBmaWxlOgorCitcKGRlZnVuIG15LWVybGFuZy1tb2RlLWhvb2sgKCkKKyAgKGNvbmQgKHdpbmRvdy1zeXN0ZW0KKwkgKGZvbnQtbG9jay1tb2RlIDEpKSkpCitcKGFkZC1ob29rICdlcmxhbmctbW9kZS1ob29rICdteS1lcmxhbmctbW9kZS1ob29rKQorXChzZXRxIGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24gdCkiCisgIChpbnRlcmFjdGl2ZSkKKyAgKHJlcXVpcmUgJ2ZvbnQtbG9jaykKKyAgKHNldCAnZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMSkKKyAgKGZvbnQtbG9jay1tb2RlIDEpCisgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2ZvbnQtbG9jay1mb250aWZ5LWJ1ZmZlcikpKQorCisKKyhkZWZ1biBlcmxhbmctZm9udC1sb2NrLWxldmVsLTIgKCkKKyAgOzsgRG9jU3RyaW5nQ29weTogZm9udC1jbWQKKyAgIkZvbnRpZnkgY3VycmVudCBidWZmZXIuIExldmVsIHJhbmdlcyBmcm9tIDAgKG9mZikgdG8gMyAoQ2hyaXN0bWFzIFRyZWUpLgorCitUaGUgZm9sbG93aW5nIGZvbnRpZmljYXRpb24gbGV2ZWwgZXhpc3RzOgorICAwIC0gTm8gZm9udGlmaWNhdGlvbgorICAxIC0gRnVuY3Rpb24gaGVhZGVycywgcmVzZXJ2ZWQga2V5d29yZHMsIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgorICAyIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2xlIHF1b3RlcycuCisgIDMgLSBWYXJpYWJsZXMsIG1hY3JvcyBhbmQgcmVjb3Jkcy4KKworVG8gYXV0b21hdGljYWxseSBhY3RpdmF0ZSBmb250IGxvY2sgbW9kZSwgcGxhY2UgdGhlIGZvbGxvd2luZyBsaW5lcworaW4geW91ciB+Ly5lbWFjcyBmaWxlOgorCitcKGRlZnVuIG15LWVybGFuZy1tb2RlLWhvb2sgKCkKKyAgKGNvbmQgKHdpbmRvdy1zeXN0ZW0KKwkgKGZvbnQtbG9jay1tb2RlIDEpKSkpCitcKGFkZC1ob29rICdlcmxhbmctbW9kZS1ob29rICdteS1lcmxhbmctbW9kZS1ob29rKQorXChzZXRxIGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24gdCkiCisgIChpbnRlcmFjdGl2ZSkKKyAgKHJlcXVpcmUgJ2ZvbnQtbG9jaykKKyAgKHNldCAnZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMikKKyAgKGZvbnQtbG9jay1tb2RlIDEpCisgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2ZvbnQtbG9jay1mb250aWZ5LWJ1ZmZlcikpKQorCisKKyhkZWZ1biBlcmxhbmctZm9udC1sb2NrLWxldmVsLTMgKCkKKyAgOzsgRG9jU3RyaW5nQ29weTogZm9udC1jbWQKKyAgIkZvbnRpZnkgY3VycmVudCBidWZmZXIuIExldmVsIHJhbmdlcyBmcm9tIDAgKG9mZikgdG8gMyAoQ2hyaXN0bWFzIFRyZWUpLgorCitUaGUgZm9sbG93aW5nIGZvbnRpZmljYXRpb24gbGV2ZWwgZXhpc3RzOgorICAwIC0gTm8gZm9udGlmaWNhdGlvbgorICAxIC0gRnVuY3Rpb24gaGVhZGVycywgcmVzZXJ2ZWQga2V5d29yZHMsIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgorICAyIC0gQmlmcywgZ3VhcmRzIGFuZCBgc2luZ2xlIHF1b3RlcycuCisgIDMgLSBWYXJpYWJsZXMsIG1hY3JvcyBhbmQgcmVjb3Jkcy4KKworVG8gYXV0b21hdGljYWxseSBhY3RpdmF0ZSBmb250IGxvY2sgbW9kZSwgcGxhY2UgdGhlIGZvbGxvd2luZyBsaW5lcworaW4geW91ciB+Ly5lbWFjcyBmaWxlOgorCitcKGRlZnVuIG15LWVybGFuZy1tb2RlLWhvb2sgKCkKKyAgKGNvbmQgKHdpbmRvdy1zeXN0ZW0KKwkgKGZvbnQtbG9jay1tb2RlIDEpKSkpCitcKGFkZC1ob29rICdlcmxhbmctbW9kZS1ob29rICdteS1lcmxhbmctbW9kZS1ob29rKQorXChzZXRxIGZvbnQtbG9jay1tYXhpbXVtLWRlY29yYXRpb24gdCkiCisgIChpbnRlcmFjdGl2ZSkKKyAgKHJlcXVpcmUgJ2ZvbnQtbG9jaykKKyAgKHNldCAnZm9udC1sb2NrLWtleXdvcmRzIGVybGFuZy1mb250LWxvY2sta2V5d29yZHMtMykKKyAgKGZvbnQtbG9jay1tb2RlIDEpCisgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2ZvbnQtbG9jay1mb250aWZ5LWJ1ZmZlcikpKQorCisMCisoZGVmdW4gZXJsYW5nLW1lbnUtaW5pdCAoKQorICAiSW5pdCBtZW51cyBmb3IgRXJsYW5nIG1vZGUuCisKK1RoZSB2YXJpYWJsZSBgZXJsYW5nLW1lbnUtaXRlbXMnIGNvbnRhaW4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgRXJsYW5nCittb2RlIG1lbnUuICBOb3JtYWxseSwgdGhlIGxpc3QgY29udGFpbnMgYXRvbXMsIHJlcHJlc2VudGluZyB2YXJpYWJsZXMKK2JvdW5kIHRvIHBpZWNlcyBvZiB0aGUgbWVudS4KKworUGVyc29uYWwgZXh0ZW50aW9ucyBjb3VsZCBiZSBhZGRlZCB0byBgZXJsYW5nLW1lbnUtcGVyc29uYWwtaXRlbXMnLgorCitTaG91bGQgYW55IHZhcmlhYmxlIGRlc2NyaWJpbmcgdGhlIG1lbnUgY29uZmlndXJhdGlvbiwgdGhpcyBmdW5jdGlvbgorc2hvdWxkIGJlIGNhbGxlZC4iCisgICAgKGVybGFuZy1tZW51LWluc3RhbGwgIkVybGFuZyIgZXJsYW5nLW1lbnUtaXRlbXMgZXJsYW5nLW1vZGUtbWFwIHQpKQorCisKKyhkZWZ1biBlcmxhbmctbWVudS1pbnN0YWxsIChuYW1lIGl0ZW1zIGtleW1hcCAmb3B0aW9uYWwgcG9wdXApCisgICJJbnN0YWxsIGEgbWVudSBvbiBFbWFjcyAxOSBvciBYRW1hY3MgYmFzZWQgb24gYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24uCisKK05BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIG1lbnUuCisKK0lURU1TIGlzIGEgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBlaXRoZXIgbmlsIHJlcHJlc2VudGluZyBhIGhvcmlzb250YWwKK2xpbmUgb3IgYSBsaXN0IHdpdGggdHdvIG9yIHRocmVlIGVsZW1lbnRzLiAgVGhlIGZpcnN0IGlzIHRoZSBuYW1lIG9mCit0aGUgbWVudSBpdGVtLCB0aGUgc2Vjb25kIHRoZSBmdW5jdGlvbiB0byBjYWxsLCBvciBhIHN1Ym1lbnUsIG9uIHRoZQorc2FtZSBzYW1lIGZvcm0gYXMgSVRFTVMuICBUaGUgdGhpcmQgb3B0aW9uYWwgZWxlbWVudCBpcyBhbiBleHByZXNzaW9uCit3aGljaCBpcyBldmFsdWF0ZWQgZXZlcnkgdGltZSB0aGUgbWVudSBpcyBkaXNwbGF5ZWQuICBTaG91bGQgdGhlCitleHByZXNzaW9uIGV2YWx1YXRlIHRvIG5pbCB0aGUgbWVudSBpdGVtIGlzIGdob3N0ZWQuCisKK0tFWU1BUCBpcyB0aGUga2V5bWFwIHRvIGFkZCB0byBtZW51IHRvLiAgKFdoZW4gdXNpbmcgWEVtYWNzLCB0aGUgbWVudQord2lsbCBvbmx5IGJlIHZpc2libGUgd2hlbiB0aGlzIG1lbnkgaXMgdGhlIGdsb2JhbCwgdGhlIGxvY2FsLCBvciBhbgorYWN0aXZhdGVkIG1pbm9yIG1vZGUga2V5bWFwLikKKworSWYgUE9QVVAgaXMgbm9uLW5pbCwgdGhlIG1lbnUgaXMgYm91bmQgdG8gdGhlIFhFbWFjcyBgbW9kZS1wb3B1cC1tZW51JwordmFyaWFibGUsIGkuZS4gaXQgd2lsbCBwb3B1cCB3aGVuIHByZXNzaW5nIHRoZSByaWdodCBtb3VzZSBidXR0b24uCisKK1BsZWFzZSBzZWUgdGhlIHZhcmlhYmxlIGBlcmxhbmctbWVudS1iYXNlLWl0ZW1zJy4iCisgIChjb25kIChlcmxhbmcteGVtYWNzLXAKKwkgKGxldCAoKG1lbnUgKGVybGFuZy1tZW51LXhlbWFjcyBuYW1lIGl0ZW1zIGtleW1hcCkpKQorCSAgIDs7IFdlIGFkZCB0aGUgbWVudSB0byB0aGUgZ2xvYmFsIG1lbnViYXIuCisJICAgOzsoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQtYnVmZmVyLW1lbnViYXIpCisJICAgOzsgICAgICAgICAoc3ltYm9sLXZhbHVlICdjdXJyZW50LW1lbnViYXIpKQorCSAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2FkZC1zdWJtZW51KSBuaWwgbWVudSkKKwkgICAoc2V0Y2RyIGVybGFuZy14ZW1hY3MtcG9wdXAtbWVudSAoY2RyIG1lbnUpKQorCSAgIChpZiAoYW5kIHBvcHVwIChib3VuZHAgJ21vZGUtcG9wdXAtbWVudSkpCisJICAgICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkKKwkJCSdtb2RlLXBvcHVwLW1lbnUgZXJsYW5nLXhlbWFjcy1wb3B1cC1tZW51KSkpKQorCSgoPj0gZXJsYW5nLWVtYWNzLW1ham9yLXZlcnNpb24gMTkpCisJIChkZWZpbmUta2V5IGtleW1hcCAodmVjdG9yICdtZW51LWJhciAoaW50ZXJuIG5hbWUpKQorCSAgIChlcmxhbmctbWVudS1tYWtlLWtleW1hcCBuYW1lIGl0ZW1zKSkpCisJKHQgbmlsKSkpCisKKworKGRlZnVuIGVybGFuZy1tZW51LW1ha2Uta2V5bWFwIChuYW1lIGl0ZW1zKQorICAiQnVpbGQgYSBtZW51IGZvciBFbWFjcyAxOS4iCisgIChsZXQgKChtZW51bWFwIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ21ha2Utc3BhcnNlLWtleW1hcCkKKwkJCSAgbmFtZSkpCisJKGNvdW50IDApCisJaWQgZGVmIGZpcnN0IHNlY29uZCB0aGlyZCkKKyAgICAoc2V0cSBpdGVtcyAocmV2ZXJzZSBpdGVtcykpCisgICAgKHdoaWxlIGl0ZW1zCisgICAgICA7OyBSZXBsYWNlIGFueSBvY2N1cmVuY2Ugb2YgYXRvbXMgYnkgdGhlaXIgdmFsdWUuCisgICAgICAod2hpbGUgKGFuZCBpdGVtcyAoYXRvbSAoY2FyIGl0ZW1zKSkgKG5vdCAobnVsbCAoY2FyIGl0ZW1zKSkpKQorCShpZiAoYW5kIChib3VuZHAgKGNhciBpdGVtcykpCisJCSAobGlzdHAgKHN5bWJvbC12YWx1ZSAoY2FyIGl0ZW1zKSkpKQorCSAgICAoc2V0cSBpdGVtcyAoYXBwZW5kIChyZXZlcnNlIChzeW1ib2wtdmFsdWUgKGNhciBpdGVtcykpKQorCQkJCShjZHIgaXRlbXMpKSkKKwkgIChzZXRxIGl0ZW1zIChjZHIgaXRlbXMpKSkpCisgICAgICAoc2V0cSBmaXJzdCAoY2FyLXNhZmUgKGNhciBpdGVtcykpKQorICAgICAgKHNldHEgc2Vjb25kIChjYXItc2FmZSAoY2RyLXNhZmUgKGNhciBpdGVtcykpKSkKKyAgICAgIChzZXRxIHRoaXJkIChjYXItc2FmZSAoY2RyLXNhZmUgKGNkci1zYWZlIChjYXIgaXRlbXMpKSkpKQorICAgICAgKGNvbmQgKChudWxsIGZpcnN0KQorCSAgICAgKHNldHEgY291bnQgKCsgY291bnQgMSkpCisJICAgICAoc2V0cSBpZCAoaW50ZXJuIChmb3JtYXQgInNlcGFyYXRvci0lZCIgY291bnQpKSkKKwkgICAgIChzZXRxIGRlZiAnKCItLSIgLiBuaWwpKSkKKwkgICAgKChhbmQgKGNvbnNwIHNlY29uZCkgKGVxIChjYXIgc2Vjb25kKSAnbGFtYmRhKSkKKwkgICAgIChzZXRxIGNvdW50ICgrIGNvdW50IDEpKQorCSAgICAgKHNldHEgaWQgKGludGVybiAoZm9ybWF0ICJsYW1iZGEtJWQiIGNvdW50KSkpCisJICAgICAoc2V0cSBkZWYgKGNvbnMgZmlyc3Qgc2Vjb25kKSkpCisJICAgICgoc3ltYm9scCBzZWNvbmQpCisJICAgICAoc2V0cSBpZCBzZWNvbmQpCisJICAgICAoc2V0cSBkZWYgKGNvbnMgZmlyc3Qgc2Vjb25kKSkpCisJICAgICh0CisJICAgICAoc2V0cSBjb3VudCAoKyBjb3VudCAxKSkKKwkgICAgIChzZXRxIGlkIChpbnRlcm4gKGZvcm1hdCAic3VibWVudS0lZCIgY291bnQpKSkKKwkgICAgIChzZXRxIGRlZiAoZXJsYW5nLW1lbnUtbWFrZS1rZXltYXAgZmlyc3Qgc2Vjb25kKSkpKQorICAgICAgKGRlZmluZS1rZXkgbWVudW1hcCAodmVjdG9yIGlkKSBkZWYpCisgICAgICAoaWYgdGhpcmQKKwkgIChwdXQgaWQgJ21lbnUtZW5hYmxlIHRoaXJkKSkKKyAgICAgIChzZXRxIGl0ZW1zIChjZHIgaXRlbXMpKSkKKyAgICAoY29ucyBuYW1lIG1lbnVtYXApKSkKKworCisoZGVmdW4gZXJsYW5nLW1lbnUteGVtYWNzIChuYW1lIGl0ZW1zICZvcHRpb25hbCBrZXltYXApCisgICJCdWlsZCBhIG1lbnUgZm9yIFhFbWFjcy4iCisgIChsZXQgKChyZXMgJygpKQorCWZpcnN0IHNlY29uZCB0aGlyZCBlbnRyeSkKKyAgICAod2hpbGUgaXRlbXMKKyAgICAgIDs7IFJlcGxhY2UgYW55IG9jY3VyZW5jZSBvZiBhdG9tcyBieSB0aGVpciB2YWx1ZS4KKyAgICAgICh3aGlsZSAoYW5kIGl0ZW1zIChhdG9tIChjYXIgaXRlbXMpKSAobm90IChudWxsIChjYXIgaXRlbXMpKSkpCisJKGlmIChhbmQgKGJvdW5kcCAoY2FyIGl0ZW1zKSkKKwkJIChsaXN0cCAoc3ltYm9sLXZhbHVlIChjYXIgaXRlbXMpKSkpCisJICAgIChzZXRxIGl0ZW1zIChhcHBlbmQgKHJldmVyc2UgKHN5bWJvbC12YWx1ZSAoY2FyIGl0ZW1zKSkpCisJCQkJKGNkciBpdGVtcykpKQorCSAgKHNldHEgaXRlbXMgKGNkciBpdGVtcykpKSkKKyAgICAgIChzZXRxIGZpcnN0IChjYXItc2FmZSAoY2FyIGl0ZW1zKSkpCisgICAgICAoc2V0cSBzZWNvbmQgKGNhci1zYWZlIChjZHItc2FmZSAoY2FyIGl0ZW1zKSkpKQorICAgICAgKHNldHEgdGhpcmQgKGNhci1zYWZlIChjZHItc2FmZSAoY2RyLXNhZmUgKGNhciBpdGVtcykpKSkpCisgICAgICAoY29uZCAoKG51bGwgZmlyc3QpCisJICAgICAoc2V0cSByZXMgKGNvbnMgIi0tLS0tLSIgcmVzKSkpCisJICAgICgoc3ltYm9scCBzZWNvbmQpCisJICAgICAoc2V0cSByZXMgKGNvbnMgKHZlY3RvciBmaXJzdCBzZWNvbmQgKG9yIHRoaXJkIHQpKSByZXMpKSkKKwkgICAgKChhbmQgKGNvbnNwIHNlY29uZCkgKGVxIChjYXIgc2Vjb25kKSAnbGFtYmRhKSkKKwkgICAgIChzZXRxIHJlcyAoY29ucyAodmVjdG9yIGZpcnN0IChsaXN0ICdjYWxsLWludGVyYWN0aXZlbHkgc2Vjb25kKQorCQkJCSAgICAgKG9yIHRoaXJkIHQpKSByZXMpKSkKKwkgICAgKHQKKwkgICAgIChzZXRxIHJlcyAoY29ucyAoY29ucyBmaXJzdAorCQkJCSAgIChjZHIgKGVybGFuZy1tZW51LXhlbWFjcworCQkJCQkgZmlyc3Qgc2Vjb25kKSkpCisJCQkgICAgIHJlcykpKSkKKyAgICAgIChzZXRxIGl0ZW1zIChjZHIgaXRlbXMpKSkKKyAgICAoc2V0cSByZXMgKHJldmVyc2UgcmVzKSkKKyAgICA7OyBXaGVuIGFkZGluZyBhIG1lbnUgdG8gYSBtaW5vci1tb2RlIGtleW1hcCB1bmRlciBFbWFjcyAxOSwKKyAgICA7OyBpdCBkaXNhcHBlYXJzIHdoZW4gdGhlIG1vZGUgaXMgZGlzYWJsZWQuICBUaGUgZXhwcmVzc2lvbgorICAgIDs7IGdlbmVyYXRlZCBiZWxvdyBpbWl0YXRlcyB0aGlzIGJlaGF2aW91ci4KKyAgICA7OyAoVGhpcyBjb3VsZCBiZSBleHByZXNzZWQgbXVjaCBjbGVhcmVyIHVzaW5nIGJhY2txdW90ZXMsCisgICAgOzsgYnV0IEkgZG9uJ3Qgd2FudCB0byBwdWxsIGluIGV2ZXJ5IHBhY2thZ2UuKQorICAgIChpZiBrZXltYXAKKwkobGV0ICgoZXhwciAobGlzdCAnb3IKKwkJCSAgKGxpc3QgJ2VxIGtleW1hcCAnZ2xvYmFsLW1hcCkKKwkJCSAgKGxpc3QgJ2VxIGtleW1hcCAobGlzdCAnY3VycmVudC1sb2NhbC1tYXApKQorCQkJICAobGlzdCAnc3ltYm9sLXZhbHVlCisJCQkJKGxpc3QgJ2Nhci1zYWZlCisJCQkJICAgICAgKGxpc3QgJ3Jhc3NxCisJCQkJCSAgICBrZXltYXAKKwkJCQkJICAgICdtaW5vci1tb2RlLW1hcC1hbGlzdCkpKSkpKQorCSAgKHNldHEgcmVzIChjb25zICc6aW5jbHVkZWQgKGNvbnMgZXhwciByZXMpKSkpKQorICAgIChjb25zIG5hbWUgcmVzKSkpCisKKworKGRlZnVuIGVybGFuZy1tZW51LXN1YnN0aXR1dGUgKGl0ZW1zIGFsaXN0KQorICAiU3Vic3RpdHV0ZSBmdW5jdGlvbnMgaW4gbWVudSBkZXNjcmliZWQgYnkgSVRFTVMuCisKK1RoZSBtZW51IElURU1TIGlzIHVwZGF0ZWQgZGVzdHJ1Y3RpdmVseS4KKworQUxJU1QgaXMgbGlzdCBvZiBwYWlycyB3aGVyZSB0aGUgY2FyIGlzIHRoZSBvbGQgZnVuY3Rpb24gYW5kIGNkciB0aGUgbmV3LiIKKyAgKGxldCAoZmlyc3Qgc2Vjb25kIHBhaXIpCisgICAgKHdoaWxlIGl0ZW1zCisgICAgICAoc2V0cSBmaXJzdCAoY2FyLXNhZmUgKGNhciBpdGVtcykpKQorICAgICAgKHNldHEgc2Vjb25kIChjYXItc2FmZSAoY2RyLXNhZmUgKGNhciBpdGVtcykpKSkKKyAgICAgIChjb25kICgobnVsbCBmaXJzdCkpCisJICAgICgoc3ltYm9scCBzZWNvbmQpCisJICAgICAoc2V0cSBwYWlyIChhbmQgc2Vjb25kIChhc3NxIHNlY29uZCBhbGlzdCkpKQorCSAgICAgKGlmIHBhaXIKKwkJIChzZXRjYXIgKGNkciAoY2FyIGl0ZW1zKSkgKGNkciBwYWlyKSkpKQorCSAgICAoKGFuZCAoY29uc3Agc2Vjb25kKSAoZXEgKGNhciBzZWNvbmQpICdsYW1iZGEpKSkKKwkgICAgKHQKKwkgICAgIChlcmxhbmctbWVudS1zdWJzdGl0dXRlIHNlY29uZCBhbGlzdCkpKQorICAgICAgKHNldHEgaXRlbXMgKGNkciBpdGVtcykpKSkpCisKKworKGRlZnVuIGVybGFuZy1tZW51LWFkZC1hYm92ZSAoZW50cnkgYWJvdmUgaXRlbXMpCisgICJBZGQgbWVudSBFTlRSWSBhYm92ZSBtZW51IGVudHJ5IEFCT1ZFIGluIG1lbnUgSVRFTVMuCitEbyBub3RoaW5nIGlmIHRoZSBpdGVtcyBhbHJlYWR5IHNob3VsZCBiZSBpbiB0aGUgbWVudS4KK1Nob3VsZCBBQk9WRSBub3QgYmUgaW4gdGhlIGxpc3QsIHRoZSBlbnRyeSBpcyBhZGRlZCBhdAordGhlIGJvdHRvbSBvZiB0aGUgbWVudS4KKworVGhlIG5ldyBtZW51IGlzIHJldHVybmVkLiAgTm8gZ3VhcmFudGVlIGlzIGdpdmVuIHRoYXQgdGhlIG9yaWdpbmFsCittZW51IGlzIGxlZnQgdW5jaGFuZ2VkLgorCitUaGUgZXF1YWxpdHkgdGVzdCBpcyBwZXJmb3JtZWQgYnkgYGVxJy4KKworRXhhbXBsZTogIChlcmxhbmctbWVudS1hZGQtYWJvdmUgJ215LWVybGFuZy1tZW51LWl0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJsYW5nLW1lbnUtbWFuLWl0ZW1zKSIKKyAgKGVybGFuZy1tZW51LWFkZC1iZWxvdyBlbnRyeSBhYm92ZSBpdGVtcyB0KSkKKworCisoZGVmdW4gZXJsYW5nLW1lbnUtYWRkLWJlbG93IChlbnRyeSBiZWxvdyBpdGVtcyAmb3B0aW9uYWwgYWJvdmUtcCkKKyAgIkFkZCBtZW51IEVOVFJZIGJlbG93IG1lbnUgaXRlbXMgQkVMT1cgaW4gdGhlIEVybGFuZyBtZW51LgorRG8gbm90aGluZyBpZiB0aGUgaXRlbXMgYWxyZWFkeSBzaG91bGQgYmUgaW4gdGhlIG1lbnUuCitTaG91bGQgQkVMT1cgbm90IGJlIGluIHRoZSBsaXN0LCBpdGVtcyBpcyBhZGRlZCBhdCB0aGUgYm90dG9tCitvZiB0aGUgbWVudS4KKworVGhlIG5ldyBtZW51IGlzIHJldHVybmVkLiAgTm8gZ3VhcmFudGVlIGlzIGdpdmVuIHRoYXQgdGhlIG9yaWdpbmFsCittZW51IGlzIGxlZnQgdW5jaGFuZ2VkLgorCitUaGUgZXF1YWxpdHkgdGVzdCBpcyBwZXJmb3JtZWQgYnkgYGVxJy4KKworRXhhbXBsZToKKworXChzZXRxIGVybGFuZy1tZW51LWl0ZW1zCisgICAgICAoZXJsYW5nLW1lbnUtYWRkLWJlbG93ICdteS1lcmxhbmctbWVudS1pdGVtcworCSAJICAgICAgICAgICAgICdlcmxhbmctbWVudS1iYXNlLWl0ZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVybGFuZy1tZW51LWl0ZW1zKSkiCisgIChpZiAobWVtcSBlbnRyeSBpdGVtcykKKyAgICAgIGl0ZW1zCQkJCTsgUmV0dXJuIHRoZSBvcmlnaW5hbCBtZW51LgorICAgIChsZXQgKChoZWFkICcoKSkKKwkgIChkb25lIG5pbCkKKwkgIHJlcykKKyAgICAgICh3aGlsZSAobm90IGRvbmUpCisJKGNvbmQgKChudWxsIGl0ZW1zKQorCSAgICAgICAoc2V0cSByZXMgKGFwcGVuZCBoZWFkIChsaXN0IGVudHJ5KSkpCisJICAgICAgIChzZXRxIGRvbmUgdCkpCisJICAgICAgKChlcSBiZWxvdyAoY2FyIGl0ZW1zKSkKKwkgICAgICAgKHNldHEgcmVzCisJCSAgICAgKGlmIGFib3ZlLXAKKwkJCSAoYXBwZW5kIGhlYWQgKGNvbnMgZW50cnkgaXRlbXMpKQorCQkgICAgICAgKGFwcGVuZCBoZWFkIChjb25zIChjYXIgaXRlbXMpCisJCQkJCSAgKGNvbnMgZW50cnkgKGNkciBpdGVtcykpKSkpKQorCSAgICAgICAoc2V0cSBkb25lIHQpKQorCSAgICAgICh0CisJICAgICAgIChzZXRxIGhlYWQgKGFwcGVuZCBoZWFkIChsaXN0IChjYXIgaXRlbXMpKSkpCisJICAgICAgIChzZXRxIGl0ZW1zIChjZHIgaXRlbXMpKSkpKQorICAgICAgcmVzKSkpCisKKyhkZWZ1biBlcmxhbmctbWVudS1kZWxldGUgKGVudHJ5IGl0ZW1zKQorICAiRGVsZXRlIEVOVFJZIGZyb20gbWVudSBJVEVNUy4KKworVGhlIG5ldyBtZW51IGlzIHJldHVybmVkLiAgTm8gZ3VhcmFudGVlIGlzIGdpdmVuIHRoYXQgdGhlIG9yaWdpbmFsCittZW51IGlzIGxlZnQgdW5jaGFuZ2VkLiIKKyAgKGRlbHEgZW50cnkgaXRlbXMpKQorDAorOzsgTWFuIGNvZGU6CisKKyhkZWZ1biBlcmxhbmctbWFuLWluaXQgKCkKKyAgIkFkZCBtZW51cyBjb250YWluaW5nIHRoZSBtYW51YWwgcGFnZXMgb2YgdGhlIEVybGFuZy4KKworVGhlIHZhcmlhYmxlIGBlcmxhbmctbWFuLWRpcnMnIGNvbnRhaW5zIGVudHJpZXMgZGVzY3JpYmluZwordGhlIGxvY2F0aW9uIG9mIHRoZSBtYW51YWwgcGFnZXMuIgorICAoaW50ZXJhY3RpdmUpCisgIChpZiBlcmxhbmctbWFuLWluaGliaXQKKyAgICAgICgpCisgICAgKHNldHEgZXJsYW5nLW1lbnUtbWFuLWl0ZW1zCisJICAnKG5pbAorCSAgICAoIk1hbiAtIEZ1bmN0aW9uIiBlcmxhbmctbWFuLWZ1bmN0aW9uKSkpCisgICAgKGlmIGVybGFuZy1tYW4tZGlycworCShzZXRxIGVybGFuZy1tZW51LW1hbi1pdGVtcworCSAgICAgIChhcHBlbmQgZXJsYW5nLW1lbnUtbWFuLWl0ZW1zCisJCSAgICAgIChlcmxhbmctbWFuLW1ha2UtdG9wLW1lbnUgZXJsYW5nLW1hbi1kaXJzKSkpKQorICAgIChzZXRxIGVybGFuZy1tZW51LWl0ZW1zCisJICAoZXJsYW5nLW1lbnUtYWRkLWFib3ZlICdlcmxhbmctbWVudS1tYW4taXRlbXMKKwkJCQkgJ2VybGFuZy1tZW51LXZlcnNpb24taXRlbXMKKwkJCQkgZXJsYW5nLW1lbnUtaXRlbXMpKQorICAgIChlcmxhbmctbWVudS1pbml0KSkpCisKKworKGRlZnVuIGVybGFuZy1tYW4tdW5pbnN0YWxsICgpCisgICJSZW1vdmUgdGhlIG1hbiBwYWdlcyBmcm9tIHRoZSBFcmxhbmcgbW9kZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHNldHEgZXJsYW5nLW1lbnUtaXRlbXMKKwkoZXJsYW5nLW1lbnUtZGVsZXRlICdlcmxhbmctbWVudS1tYW4taXRlbXMgZXJsYW5nLW1lbnUtaXRlbXMpKQorICAoZXJsYW5nLW1lbnUtaW5pdCkpCisKKworOzsgVGhlIG1hbiBtZW51IGlzIGEgaGllcmFyY2hhbCBzdHJ1Y3R1cmUsIHdpdGggdGhlIG1hbnVhbCBzZWN0aW9ucworOzsgYXQgdGhlIHRvcCwgZGVzY3JpYmVkIGJ5IGBlcmxhbmctbWFuLWRpcnMnLiAgVGhlIG5leHQgbGV2ZWwgY291bGQKKzs7IGVpdGhlciBiZSB0aGUgbWFudWFsIHBhZ2VzIGlmIG5vdCB0byBtYW55LCBvdGhlcndpc2UgaXQgaXMgYW4gaW5kZXgKKzs7IG1lbnUgd2hvc2Ugc3VibWVudXMgd2lsbCBjb250YWluIHVwIHRvIGBlcmxhbmctbWFuLW1heC1tZW51LXNpemUnCis7OyBtYW51YWwgcGFnZXMuCisKKyhkZWZ1biBlcmxhbmctbWFuLW1ha2UtdG9wLW1lbnUgKGRpci1saXN0KQorICAiQ3JlYXRlIG9uZSBtZW51IGVudHJ5IHBlciBlbGVtZW50IG9mIERJUi1MSVNULgorVGhlIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYGVybGFuZy1tYW4tZGlycycuIgorICAobGV0ICgobWVudSAnKCkpCisJZGlyKQorICAgICh3aGlsZSBkaXItbGlzdAorICAgICAgKHNldHEgZGlyIChjb25kICgobnRoIDIgKGNhciBkaXItbGlzdCkpCisJCSAgICAgICA7OyBSZWxhdGl2ZSB0byBgZXJsYW5nLXJvb3QtZGlyJy4KKwkJICAgICAgIChhbmQgKHN0cmluZ3AgZXJsYW5nLXJvb3QtZGlyKQorCQkJICAgIChjb25jYXQgZXJsYW5nLXJvb3QtZGlyIChudGggMSAoY2FyIGRpci1saXN0KSkpKSkKKwkJICAgICAgKHQKKwkJICAgICAgIDs7IEFic29sdXRlCisJCSAgICAgICAobnRoIDEgKGNhciBkaXItbGlzdCkpKSkpCisgICAgICAoaWYgKGFuZCBkaXIKKwkgICAgICAgKGZpbGUtcmVhZGFibGUtcCBkaXIpKQorCSAgKHNldHEgbWVudSAoY29ucyAobGlzdCAoY2FyIChjYXIgZGlyLWxpc3QpKQorCQkJCSAoZXJsYW5nLW1hbi1tYWtlLW1pZGRsZS1tZW51CisJCQkJICAoZXJsYW5nLW1hbi1nZXQtZmlsZXMgZGlyKSkpCisJCQkgICBtZW51KSkpCisgICAgICAoc2V0cSBkaXItbGlzdCAoY2RyIGRpci1saXN0KSkpCisgICAgOzsgU2hvdWxkIG5vIG1lbnVzIGJlIGZvdW5kLCBnZW5lcmF0ZSBhIG1lbnUgaXRlbSB3aGljaAorICAgIDs7IHdpbGwgZGlzcGxheSBhIGhlbHAgdGV4dCwgd2hlbiBzZWxlY3RlZC4KKyAgICAoaWYgbWVudQorCShucmV2ZXJzZSBtZW51KQorICAgICAgJygoIk1hbiBQYWdlcyIKKwkgKCgiRXJyb3IhIFdoeT8iIGVybGFuZy1tYW4tZGVzY3JpYmUtZXJyb3IpKSkpKSkpCisKKworOzsgU2hvdWxkIHRoZSBtZW51IGJlIHRvIGxvbmcsIGxldCdzIHNwbGl0IGl0IGludG8gYSBudW1iZXIgb2YKKzs7IHNtYWxsZXIgbWVudXMuICBXYXJuaW5nLCB0aGlzIGNvZGUgY29udGFpbnMgYmVhdGlmdWwKKzs7IGRlc3RydWN0aXZlIG9wZXJhdGlvbnMhCisoZGVmdW4gZXJsYW5nLW1hbi1tYWtlLW1pZGRsZS1tZW51IChmaWxlbGlzdCkKKyAgIkNyZWF0ZSB0aGUgc2Vjb25kIGxldmVsIG1lbnUgZnJvbSBGSUxFTElTVC4KKworU2hvdWxkIHRoZSBsaXN0IGJlIGxvbmdlciB0aGFuIGBlcmxhbmctbWFuLW1heC1tZW51LXNpemUnLCBhIHRyZWUgb2YKK21lbnVzIGlzIGNyZWF0ZWQuIgorICAoaWYgKDw9IChsZW5ndGggZmlsZWxpc3QpIGVybGFuZy1tYW4tbWF4LW1lbnUtc2l6ZSkKKyAgICAgIChlcmxhbmctbWFuLW1ha2UtbWVudSBmaWxlbGlzdCkKKyAgICAobGV0ICgobWVudSAnKCkpCisJICAoZmlsZWxpc3QgKGNvcHktc2VxdWVuY2UgZmlsZWxpc3QpKQorCSAgc2VnbWVudCBzdWJtZW51IHBhaXIpCisgICAgICAod2hpbGUgZmlsZWxpc3QKKwkoc2V0cSBwYWlyIChudGhjZHIgKC0gZXJsYW5nLW1hbi1tYXgtbWVudS1zaXplIDEpIGZpbGVsaXN0KSkKKwkoc2V0cSBzZWdtZW50IGZpbGVsaXN0KQorCShpZiAobnVsbCBwYWlyKQorCSAgICAoc2V0cSBmaWxlbGlzdCBuaWwpCisJICAoc2V0cSBmaWxlbGlzdCAoY2RyIHBhaXIpKQorCSAgKHNldGNkciBwYWlyIG5pbCkpCisJKHNldHEgc3VibWVudSAoZXJsYW5nLW1hbi1tYWtlLW1lbnUgc2VnbWVudCkpCisJKHNldHEgbWVudSAoY29ucyAobGlzdCAoY29uY2F0IChjYXIgKGNhciBzdWJtZW51KSkKKwkJCQkgICAgICAgIiAtLSAiCisJCQkJICAgICAgIChjYXIgKGNhciAocmV2ZXJzZSBzdWJtZW51KSkpKQorCQkJICAgICAgIHN1Ym1lbnUpCisJCQkgbWVudSkpKQorICAgICAgKG5yZXZlcnNlIG1lbnUpKSkpCisKKworKGRlZnVuIGVybGFuZy1tYW4tbWFrZS1tZW51IChmaWxlbGlzdCkKKyAgIk1ha2UgYSBsZWFmIG1lbnUgYmFzZWQgb24gRklMRUxJU1QuIgorICAobGV0ICgobWVudSAnKCkpCisJaXRlbSkKKyAgICAod2hpbGUgZmlsZWxpc3QKKyAgICAgIChzZXRxIGl0ZW0gKGVybGFuZy1tYW4tbWFrZS1tZW51LWl0ZW0gKGNhciBmaWxlbGlzdCkpKQorICAgICAgKGlmIGl0ZW0KKwkgIChzZXRxIG1lbnUgKGNvbnMgaXRlbSBtZW51KSkpCisgICAgICAoc2V0cSBmaWxlbGlzdCAoY2RyIGZpbGVsaXN0KSkpCisgICAgKG5yZXZlcnNlIG1lbnUpKSkKKworCisoZGVmdW4gZXJsYW5nLW1hbi1tYWtlLW1lbnUtaXRlbSAoZmlsZSkKKyAgIkNyZWF0ZSBhIG1lbnUgaXRlbSBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBtYW4gcGFnZS4iCisgIChhbmQgKHN0cmluZy1tYXRjaCAiLiovXFwoW14vXStcXClcXC5bXi5dJCIgZmlsZSkKKyAgICAgICAobGV0ICgocGFnZSAoc3Vic3RyaW5nIGZpbGUgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKSkpCisJIChsaXN0IChjYXBpdGFsaXplIHBhZ2UpCisJICAgICAgIChsaXN0ICdsYW1iZGEgJygpCisJCSAgICAgJyhpbnRlcmFjdGl2ZSkKKwkJICAgICAobGlzdCAnZnVuY2FsbCAnZXJsYW5nLW1hbi1kaXNwbGF5LWZ1bmN0aW9uCisJCQkgICBmaWxlKSkpKSkpCisKKworKGRlZnVuIGVybGFuZy1tYW4tZ2V0LWZpbGVzIChkaXIpCisgICJSZXR1cm4gZmlsZXMgaW4gZGlyZWN0b3J5IERJUi4iCisgIChkaXJlY3RvcnktZmlsZXMgZGlyIHQgIi4qXFwuWzAtOV1cXCciKSkKKworCisoZGVmdW4gZXJsYW5nLW1hbi1tb2R1bGUgKCZvcHRpb25hbCBtb2R1bGUpCisgICJGaW5kIG1hbnVhbCBwYWdlIGZvciBNT0RVTEUsIGRlZmF1bHRzIHRvIG1vZHVsZSBvZiBmdW5jdGlvbiB1bmRlciBwb2ludC4KK1RoaXMgZnVuY3Rpb24gaXMgYXdhcmUgb2YgaW1wb3J0ZWQgZnVuY3Rpb25zLiIKKyAgKGludGVyYWN0aXZlCisgICAobGlzdCAobGV0KiAoKG1vZCAoY2FyLXNhZmUgKGVybGFuZy1nZXQtZnVuY3Rpb24tdW5kZXItcG9pbnQpKSkKKwkJKGlucHV0IChyZWFkLXN0cmluZworCQkJKGZvcm1hdCAiTWFudWFsIGVudHJ5IGZvciBtb2R1bGUlczogIgorCQkJCShpZiAob3IgKG51bGwgbW9kKSAoc3RyaW5nPSBtb2QgIiIpKQorCQkJCSAgICAiIgorCQkJCSAgKGZvcm1hdCAiIChkZWZhdWx0ICVzKSIgbW9kKSkpKSkpCisJICAgKGlmIChzdHJpbmc9IGlucHV0ICIiKQorCSAgICAgICBtb2QKKwkgICAgIGlucHV0KSkpKQorICAob3IgbW9kdWxlIChzZXRxIG1vZHVsZSAoY2FyIChlcmxhbmctZ2V0LWZ1bmN0aW9uLXVuZGVyLXBvaW50KSkpKQorICAoaWYgKG9yIChudWxsIG1vZHVsZSkgKHN0cmluZz0gbW9kdWxlICIiKSkKKyAgICAgIChlcnJvciAiTm8gRXJsYW5nIG1vZHVsZSBuYW1lIGdpdmVuIikpCisgIChsZXQgKChkaXItbGlzdCBlcmxhbmctbWFuLWRpcnMpCisJKHBhdCAoY29uY2F0ICJcXGIiIChyZWdleHAtcXVvdGUgbW9kdWxlKSAiXFwuW14uXSQiKSkKKwkoZmlsZSBuaWwpCisJZmlsZS1saXN0KQorICAgICh3aGlsZSAoYW5kIGRpci1saXN0IChudWxsIGZpbGUpKQorICAgICAgKHNldHEgZmlsZS1saXN0IChlcmxhbmctbWFuLWdldC1maWxlcworCQkgICAgICAgKGlmIChudGggMiAoY2FyIGRpci1saXN0KSkKKwkJCSAgIChjb25jYXQgZXJsYW5nLXJvb3QtZGlyIChudGggMSAoY2FyIGRpci1saXN0KSkpCisJCQkgKG50aCAxIChjYXIgZGlyLWxpc3QpKSkpKQorICAgICAgKHdoaWxlIChhbmQgZmlsZS1saXN0IChudWxsIGZpbGUpKQorCShpZiAoc3RyaW5nLW1hdGNoIHBhdCAoY2FyIGZpbGUtbGlzdCkpCisJICAgIChzZXRxIGZpbGUgKGNhciBmaWxlLWxpc3QpKSkKKwkoc2V0cSBmaWxlLWxpc3QgKGNkciBmaWxlLWxpc3QpKSkKKyAgICAgIChzZXRxIGRpci1saXN0IChjZHIgZGlyLWxpc3QpKSkKKyAgICAoaWYgZmlsZQorCShmdW5jYWxsIGVybGFuZy1tYW4tZGlzcGxheS1mdW5jdGlvbiBmaWxlKQorICAgICAgKGVycm9yICJObyBtYW51YWwgcGFnZSBmb3IgbW9kdWxlICVzIGZvdW5kLiIgbW9kdWxlKSkpKQorCisKKzs7IFdhcm5pbmcsIHRoZSBmdW5jdGlvbiBgZXJsYW5nLW1hbi1mdW5jdGlvbicgaXMgYSBoYWNrIQorOzsgSXQgbGlua3MgaXRzZWxmIGludG8gdGhlIG1hbiBjb2RlIGluIGEgbm9uLWNsZWFuIHdheS4gIEkgaGF2ZQorOzsgY2hvb3NlZCB0byBrZWVwIGl0IHNpbmNlIGl0IHByb3ZpZGVzIGEgdmVyeSB1c2VmdWwgZnVuY3Rpb25hbGl0eQorOzsgd2hpY2ggaXMgbm90IHBvc3NpYmxlIHRvIGFjaGl2ZSB1c2luZyBhIGNsZWFuIGFwcHJvYWNoLgorOzsgICAvIEFuZGVyc0wKKworKGRlZnZhciBlcmxhbmctbWFuLWZ1bmN0aW9uLW5hbWUgbmlsCisgICJOYW1lIG9mIGZ1bmN0aW9uIGZvciBsYXN0IGBlcmxhbmctbWFuLWZ1bmN0aW9uJyBjYWxsLgorVXNlZCBmb3IgY29tbW5pY2F0aW9uIGJldHdlZW4gYGVybGFuZy1tYW4tZnVuY3Rpb24nIGFuZCB0aGUKK3BhdGNoIHRvIGBNYW4tbm90aWZ5LXdoZW4tcmVhZHknLiIpCisKKyhkZWZ1biBlcmxhbmctbWFuLWZ1bmN0aW9uICgmb3B0aW9uYWwgbmFtZSkKKyAgIkZpbmQgbWFudWFsIHBhZ2UgZm9yIE5BTUUsIHdoZXJlIE5BTUUgaXMgbW9kdWxlOmZ1bmN0aW9uLgorVGhlIGVudHJ5IGZvciBgZnVuY3Rpb24nIGlzIGRpc3BsYXllZC4KKworVGhpcyBmdW5jdGlvbiBpcyBhd2FyZSBvZiBpbXBvcnRlZCBmdW5jdGlvbnMuIgorICAoaW50ZXJhY3RpdmUKKyAgIChsaXN0IChsZXQqICgobW9kLWZ1bmMgKGVybGFuZy1nZXQtZnVuY3Rpb24tdW5kZXItcG9pbnQpKQorCQkobW9kIChjYXItc2FmZSBtb2QtZnVuYykpCisJCShmdW5jIChudGggMSBtb2QtZnVuYykpCisJCShpbnB1dCAocmVhZC1zdHJpbmcKKwkJCShmb3JtYXQKKwkJCSAiTWFudWFsIGVudHJ5IGZvciBgbW9kdWxlOmZ1bmMnIG9yIGBtb2R1bGUnJXM6ICIKKwkJCSAoaWYgKG9yIChudWxsIG1vZCkgKHN0cmluZz0gbW9kICIiKSkKKwkJCSAgICAgIiIKKwkJCSAgIChmb3JtYXQgIiAoZGVmYXVsdCAlczolcykiIG1vZCBmdW5jKSkpKSkpCisJICAgKGlmIChzdHJpbmc9IGlucHV0ICIiKQorCSAgICAgICAoaWYgKGFuZCBtb2QgZnVuYykKKwkJICAgKGNvbmNhdCBtb2QgIjoiIGZ1bmMpCisJCSBtb2QpCisJICAgICBpbnB1dCkpKSkKKyAgOzsgRW1hY3MgMTggZG9lc24ndCBwcm92aWRlIGBtYW4nLi4uCisgIChjb25kaXRpb24tY2FzZSBuaWwKKyAgICAgIChyZXF1aXJlICdtYW4pCisgICAgKGVycm9yIG5pbCkpCisgIChsZXQgKChtb2RuYW1lIG5pbCkKKwkoZnVuY25hbWUgbmlsKSkKKyAgICAoY29uZCAoKG51bGwgbmFtZSkKKwkgICAobGV0ICgobW9kLWZ1bmMgKGVybGFuZy1nZXQtZnVuY3Rpb24tdW5kZXItcG9pbnQpKSkKKwkgICAgIChzZXRxIG1vZG5hbWUgKGNhci1zYWZlIG1vZC1mdW5jKSkKKwkgICAgIChzZXRxIGZ1bmNuYW1lIChudGggMSBtb2QtZnVuYykpKSkKKwkgICgoc3RyaW5nLW1hdGNoICI6IiBuYW1lKQorCSAgIChzZXRxIG1vZG5hbWUgKHN1YnN0cmluZyBuYW1lIDAgKG1hdGNoLWJlZ2lubmluZyAwKSkpCisJICAgKHNldHEgZnVuY25hbWUgKHN1YnN0cmluZyBuYW1lIChtYXRjaC1lbmQgMCkgbmlsKSkpCisJICAoKHN0cmluZ3AgbmFtZSkKKwkgICAoc2V0cSBtb2RuYW1lIG5hbWUpKSkKKyAgICAoaWYgKG9yIChudWxsIG1vZG5hbWUpIChzdHJpbmc9IG1vZG5hbWUgIiIpKQorCShlcnJvciAiTm8gRXJsYW5nIG1vZHVsZSBuYW1lIGdpdmVuIikpCisgICAgKGNvbmQgKChmYm91bmRwICdNYW4tbm90aWZ5LXdoZW4tcmVhZHkpCisJICAgOzsgRW1hY3MgMTk6ICBUaGUgbWFuIGNvbW1hbmQgY291bGQgcG9zc2libHkgc3RhcnQgYW4KKwkgICA7OyBhc3luY3Jvbm91cyBwcm9jZXNzLCBpLmUuIHdlIG11c3QgaG9vayBvdXJzZWx2ZXMgaW50bworCSAgIDs7IHRoZSBzeXN0ZW0gdG8gYmUgYWN0aXZhdGVkIHdoZW4gdGhlIG1hbi1wcm9jZXNzCisJICAgOzsgdGVybWluYXRlcy4KKwkgICAoaWYgKG51bGwgZnVuY25hbWUpCisJICAgICAgICgpCisJICAgICAoZXJsYW5nLW1hbi1wYXRjaC1ub3RpZnkpCisJICAgICAoc2V0cSBlcmxhbmctbWFuLWZ1bmN0aW9uLW5hbWUgZnVuY25hbWUpKQorCSAgIChjb25kaXRpb24tY2FzZSBuaWwKKwkgICAgICAgKGVybGFuZy1tYW4tbW9kdWxlIG1vZG5hbWUpCisJICAgICAoZXJyb3IgKHNldHEgZXJsYW5nLW1hbi1mdW5jdGlvbi1uYW1lIG5pbCkpKSkKKwkgICh0CisJICAgKGVybGFuZy1tYW4tbW9kdWxlIG1vZG5hbWUpCisJICAgKGlmIGZ1bmNuYW1lCisJICAgICAgIChlcmxhbmctbWFuLWZpbmQtZnVuY3Rpb24KKwkJKG9yIChnZXQtYnVmZmVyICIqTWFudWFsIEVudHJ5KiIpIDsgRW1hY3MgMTgKKwkJICAgIChjdXJyZW50LWJ1ZmZlcikpCSAgICAgICAgICA7IFhFbWFjcworCQlmdW5jbmFtZSkpKSkpKQorCisKKzs7IFNob3VsZCB0aGUgZGVmYWR2aWNlIGJlIGF0IHRoZSB0b3AgbGV2ZWwsIHRoZSBwYWNrYWdlIGBhZHZpY2UnIHdvdWxkCis7OyBiZSByZXF1aXJlZC4gIE5vdyBpdCBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gdGhpcyBmdW5jdGlvbmFsaXR5Cis7OyBpcyB1c2VkLiAgKEVtYWNzIDE5IHNwZWNpZmljLikKKyhkZWZ1biBlcmxhbmctbWFuLXBhdGNoLW5vdGlmeSAoKQorICAiUGF0Y2ggdGhlIGZ1bmN0aW9uIGBNYW4tbm90aWZ5LXdoZW4tcmVhZHknIHRvIHNlYXJjaCBmb3IgZnVuY3Rpb24uCitUaGUgdmFyaWFibGUgYGVybGFuZy1tYW4tZnVuY3Rpb24tbmFtZScgaXMgYXNzdW1lZCB0byBiZSBib3VuZCB0bwordGhlIGZ1bmN0aW9uIG5hbWUsIG9yIHRvIG5pbC4KKworVGhlIHJlYXNvbiBmb3IgcGF0Y2hpbmcgYSBmdW5jdGlvbiBpcyB0aGF0IHVuZGVyIEVtYWNzIDE5LCB0aGUgbWFuCitjb21tYW5kIGlzIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5LiIKKyAgKGNvbmRpdGlvbi1jYXNlIG5pbAorICAgICAgKHJlcXVpcmUgJ2FkdmljZSkKKyAgICA7OyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW5kIHNpbmNlIHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbgorICAgIDs7IHJ1bm5pbmcgdW5kZXIgRW1hY3MgMTkuCisgICAgKGVycm9yIChlcnJvciAoY29uY2F0ICJUaGlzIGNvbW1hbmRzIG5lZWRzIHRoZSBwYWNrYWdlIGBhZHZpY2UnLCAiCisJCQkgICJwbGVhc2UgdXBncmFkZSB5b3VyIEVtYWNzLiIpKSkpCisgIChyZXF1aXJlICdtYW4pCisgIChkZWZhZHZpY2UgTWFuLW5vdGlmeS13aGVuLXJlYWR5CisgICAgKGFmdGVyIGVybGFuZy1NYW4tbm90aWZ5LXdoZW4tcmVhZHkgYWN0aXZhdGUpCisgICAgIlNldHMgcG9pbnQgYXQgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9uIG5hbWUgaW4KK2VybGFuZy1tYW4tZnVuY3Rpb24tbmFtZSB3aGVuIHRoZSBtYW4tcGFnZSBpcyBkaXNwbGF5ZWQuIgorICAgIChpZiBlcmxhbmctbWFuLWZ1bmN0aW9uLW5hbWUKKwkoZXJsYW5nLW1hbi1maW5kLWZ1bmN0aW9uIChhZC1nZXQtYXJnIDApIGVybGFuZy1tYW4tZnVuY3Rpb24tbmFtZSkpCisgICAgKHNldHEgZXJsYW5nLW1hbi1mdW5jdGlvbi1uYW1lIG5pbCkpKQorCisKKyhkZWZ1biBlcmxhbmctbWFuLWZpbmQtZnVuY3Rpb24gKGJ1ZiBmdW5jKQorICAiRmluZCBtYW51YWwgcGFnZSBmb3IgZnVuY3Rpb24gaW4gYGVybGFuZy1tYW4tZnVuY3Rpb24tbmFtZScgaW4gYnVmZmVyIEJVRi4iCisgIChpZiBmdW5jCisgICAgICAobGV0ICgod2luIChnZXQtYnVmZmVyLXdpbmRvdyBidWYpKSkKKwkoaWYgd2luCisJICAgIChwcm9nbgorCSAgICAgIChzZXQtYnVmZmVyIGJ1ZikKKwkgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorCSAgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQKKwkJICAgKGNvbmNhdCAiXlsgXHRdKyIgZnVuYyAiID8oIikKKwkJICAgKHBvaW50LW1heCkgdCkKKwkJICAocHJvZ24KKwkJICAgIChmb3J3YXJkLXdvcmQgLTEpCisJCSAgICAoc2V0LXdpbmRvdy1wb2ludCB3aW4gKHBvaW50KSkpCisJCShtZXNzYWdlICJDb3VsZCBub3QgZmluZCBmdW5jdGlvbiBgJXMnIiBmdW5jKSkpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctbWFuLWRpc3BsYXkgKGZpbGUpCisgICJEaXNwbGF5IEZJTEUgYXMgYSBgbWFuJyBmaWxlLgorVGhpcyBpcyBkZSBkZWZhdWx0IG1hbnVhbCBwYWdlIGRpc3BsYXkgZnVuY3Rpb24uCitUaGUgdmFyaWFibGVzIGBlcmxhbmctbWFuLWRpc3BsYXktZnVuY3Rpb24nIGNvbnRhaW5zIHRoZSBmdW5jdGlvbgordG8gYmUgdXNlZC4iCisgIDs7IEVtYWNzIDE4IGRvZXNuJ3QgYHByb3ZpZGUnIG1hbi4KKyAgKGNvbmRpdGlvbi1jYXNlIG5pbAorICAgICAgKHJlcXVpcmUgJ21hbikKKyAgICAoZXJyb3IgbmlsKSkKKyAgKGlmIGZpbGUKKyAgICAgIChsZXQgKChwcm9jZXNzLWVudmlyb25tZW50IChjb3B5LXNlcXVlbmNlIHByb2Nlc3MtZW52aXJvbm1lbnQpKSkKKwkoaWYgKHN0cmluZy1tYXRjaCAiXFwoLipcXCkvbWFuW14vXSovXFwoW14vXStcXClcXC5bXi5dJCIgZmlsZSkKKwkgICAgKGxldCAoKGRpciAoc3Vic3RyaW5nIGZpbGUgKG1hdGNoLWJlZ2lubmluZyAxKSAobWF0Y2gtZW5kIDEpKSkKKwkJICAocGFnZSAoc3Vic3RyaW5nIGZpbGUgKG1hdGNoLWJlZ2lubmluZyAyKSAobWF0Y2gtZW5kIDIpKSkpCisJICAgICAgKGlmIChmYm91bmRwICdzZXRlbnYpCisJCSAgKHNldGVudiAiTUFOUEFUSCIgZGlyKQorCQk7OyBFbWFjcyAxOAorCQkoc2V0cSBwcm9jZXNzLWVudmlyb25tZW50IChjb25zIChjb25jYXQgIk1BTlBBVEg9IiBkaXIpCisJCQkJCQlwcm9jZXNzLWVudmlyb25tZW50KSkpCisJICAgICAgKGNvbmQgKChub3QgKGFuZCAobm90IGVybGFuZy14ZW1hY3MtcCkKKwkJCSAgICAgICAoPSBlcmxhbmctZW1hY3MtbWFqb3ItdmVyc2lvbiAxOSkKKwkJCSAgICAgICAoPCBlcmxhbmctZW1hY3MtbWlub3ItdmVyc2lvbiAyOSkpKQorCQkgICAgIChtYW51YWwtZW50cnkgcGFnZSkpCisJCSAgICAodAorCQkgICAgIDs7IEVtYWNzIDE5LjI4IGFuZCBlYXJsaWVyIHZlcnNpb25zIG9mIDE5OgorCQkgICAgIDs7IFRoZSBtYW51YWwtZW50cnkgY29tbWFuZCB1bmNvbmRpdGlvbmFsbHkgcHJvbXB0cworCQkgICAgIDs7IHRoZSB1c2VyIDotKAorCQkgICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ01hbi1nZXRwYWdlLWluLWJhY2tncm91bmQpCisJCQkgICAgICBwYWdlKSkpKQorCSAgKGVycm9yICJDYW4ndCBmaW5kIG1hbiBwYWdlIGZvciAlc1xuIiBmaWxlKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLW1hbi1kZXNjcmliZS1lcnJvciAoKQorICAiRGVzY3JpYmUgd2h5IHRoZSBtYW51YWwgcGFnZXMgd2VyZW4ndCBmb3VuZC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHdpdGgtb3V0cHV0LXRvLXRlbXAtYnVmZmVyICIqRXJsYW5nIE1hbiBFcnJvcioiCisgICAgICAocHJpbmMgIk5vcm1hbGx5LCB0aGlzIG1lbnUgc2hvdWxkIGNvbnRhaW4gRXJsYW5nIG1hbnVhbCBwYWdlcy4KKworSW4gb3JkZXIgdG8gZmluZCB0aGUgbWFudWFsIHBhZ2VzLCB0aGUgdmFyaWFibGUgYGVybGFuZy1yb290LWRpcicKK3Nob3VsZCBiZSBib3VuZCB0byB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEVybGFuZworaW5zdGFsbGF0aW9uLiAgVGhlIG5hbWUgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBmaW5hbCBzbGFzaC4KKworUHJhY3RpY2FsbHksIHlvdSBzaG91bGQgYWRkIGEgbGluZSBvbiB0aGUgZm9sbG93aW5nIGZvcm0gdG8KK3lvdXIgfi8uZW1hY3MsIG9yIGFzayB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHRvIGFkZCBpdCB0bwordGhlIHNpdGUgaW5pdCBmaWxlOgorICAgIChzZXRxIGVybGFuZy1yb290LWRpciBcIi90aGUvZXJsYW5nL3Jvb3QvZGlyL2dvZXMvaGVyZVwiKQorCitGb3IgZXhhbXBsZToKKyAgICAoc2V0cSBlcmxhbmctcm9vdC1kaXIgXCIvdXNyL2xvY2FsL2VybGFuZ1wiKQorCitBZnRlciBpbnN0YWxsaW5nIHRoZSBsaW5lLCBraWxsIGFuZCByZXN0YXJ0IEVtYWNzLCBvciByZXN0YXJ0IEVybGFuZworbW9kZSB3aXRoIHRoZSBjb21tYW5kIGBNLXggZXJsYW5nLW1vZGUgUkVUJy4iKSkpCisMCis7OyBTa2VsZXRvbiBjb2RlOgorCis7OyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIHBhY2thZ2UgYHRlbXBvJyB3aGljaCBpcyBwYXJ0IG9mIG1vZGVybgorOzsgRW1hY3Nlbi4gIChHTlUgRW1hY3MgMTkuMjUgKD8pIGFuZCBYRW1hY3MgMTkuMTQuKQorCisoZGVmdW4gZXJsYW5nLXNrZWwtaW5pdCAoKQorICAiR2VuZXJhdGUgdGhlIHNrZWxldG9uIGZ1bmN0aW9ucyBhbmQgbWVudSBpdGVtcy4KK1RoZSB2YXJpYWJsZSBgZXJsYW5nLXNrZWwnIGNvbnRhaW5zIHRoZSBuYW1lIGFuZCBkZXNjcmlwdGlvbnMgb2YKK2FsbCBza2VsZXRvbnMuCisKK1RoZSBza2VsZXRvbiByb3V0aW5lcyBhcmUgYmFzZWQgb24gdGhlIGB0ZW1wbycgcGFja2FnZS4gIFNob3VsZCB0aGlzCitwYWNrYWdlIG5vdCBiZSBwcmVzZW50LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGNvbmRpdGlvbi1jYXNlIG5pbAorICAgICAgKHJlcXVpcmUgJ3RlbXBvKQorICAgIChlcnJvciB0KSkKKyAgKGlmIChmZWF0dXJlcCAndGVtcG8pCisgICAgICAobGV0ICgoc2tlbCBlcmxhbmctc2tlbCkKKwkgICAgKG1lbnUgJygpKSkKKwkod2hpbGUgc2tlbAorCSAgKGNvbmQgKChudWxsIChjYXIgc2tlbCkpCisJCSAoc2V0cSBtZW51IChjb25zIG5pbCBtZW51KSkpCisJCSh0CisJCSAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICd0ZW1wby1kZWZpbmUtdGVtcGxhdGUpCisJCSAgKGNvbmNhdCAiZXJsYW5nLSIgKG50aCAxIChjYXIgc2tlbCkpKQorCQkgIDs7IFRoZSB0ZW1wbyB0ZW1wbGF0ZSB1c2VkIGNvbnRhaW5zIGFuIGBpbmNsdWRlJworCQkgIDs7IGZ1bmN0aW9uIGNhbGwgb25seSwgaGVuY2UgY2hhbmdlcyB0byB0aGUKKwkJICA7OyB2YXJpYWJsZXMgZGVzY3JpYmluZyB0aGUgdGVtcGxhdGVzIHRha2UgZWZmZWN0CisJCSAgOzsgaW1tZGlhdGVseS4KKwkJICAobGlzdCAobGlzdCAnZXJsYW5nLXNrZWwtaW5jbHVkZSAobnRoIDIgKGNhciBza2VsKSkpKQorCQkgIChudGggMSAoY2FyIHNrZWwpKSkKKwkJIChzZXRxIG1lbnUgKGNvbnMgKGVybGFuZy1za2VsLW1ha2UtbWVudS1pdGVtCisJCQkJICAgKGNhciBza2VsKSkgbWVudSkpKSkKKwkgIChzZXRxIHNrZWwgKGNkciBza2VsKSkpCisJKHNldHEgZXJsYW5nLW1lbnUtc2tlbC1pdGVtcworCSAgICAgIChsaXN0IG5pbCAobGlzdCAiU2tlbGV0b25zIiAobnJldmVyc2UgbWVudSkpKSkKKwkoc2V0cSBlcmxhbmctbWVudS1pdGVtcworCSAgICAgIChlcmxhbmctbWVudS1hZGQtYWJvdmUgJ2VybGFuZy1tZW51LXNrZWwtaXRlbXMKKwkJCQkgICAgICdlcmxhbmctbWVudS12ZXJzaW9uLWl0ZW1zCisJCQkJICAgICBlcmxhbmctbWVudS1pdGVtcykpCisJKGVybGFuZy1tZW51LWluaXQpKSkpCisKKyhkZWZ1biBlcmxhbmctc2tlbC1tYWtlLW1lbnUtaXRlbSAoc2tlbCkKKyAgKGxldCAoKGZ1bmMgKGludGVybiAoY29uY2F0ICJ0ZW1wby10ZW1wbGF0ZS1lcmxhbmctIiAobnRoIDEgc2tlbCkpKSkpCisgICAgKGNvbmQgKChudWxsIChudGggMyBza2VsKSkKKwkgICAobGlzdCAoY2FyIHNrZWwpIGZ1bmMpKQorCSAgKHQKKwkgICAobGlzdCAoY2FyIHNrZWwpCisJCSAobGlzdCAnbGFtYmRhICcoKQorCQkgICAgICAgJyhpbnRlcmFjdGl2ZSkKKwkJICAgICAgIChsaXN0ICdmdW5jYWxsCisJCQkgICAgIChsaXN0ICdxdW90ZSAobnRoIDMgc2tlbCkpCisJCQkgICAgIChsaXN0ICdxdW90ZSBmdW5jKSkpKSkpKSkKKworOzsgRnVuY3Rpb25zIGRlc2lnbmVkIHRvIGJlIGFkZGVkIHRvIHRoZSBza2VsZXRvbiBtZW51LgorOzsgKE5vdCBub3JtYWxseSB1c2VkKQorKGRlZnVuIGVybGFuZy1za2VsLWluc2VydCAoZnVuYykKKyAgIkluc2VydCBza2VsZXRvbiBnZW5lcmF0ZWQgYnkgRlVOQyBhbmQgZ290byBmaXJzdCB0ZW1wbyBtYXJrLiIKKyAgKHNhdmUtZXhjdXJzaW9uIChmdW5jYWxsIGZ1bmMpKQorICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICd0ZW1wby1mb3J3YXJkLW1hcmspKSkKKworKGRlZnVuIGVybGFuZy1za2VsLWhlYWRlciAoZnVuYykKKyAgIkluc2VydCB0aGUgaGVhZGVyIGdlbmVyYXRlZCBieSBGVU5DIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4iCisgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgIChzYXZlLWV4Y3Vyc2lvbiAoZnVuY2FsbCBmdW5jKSkKKyAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAndGVtcG8tZm9yd2FyZC1tYXJrKSkpCisKKworOzsgRnVuY3Rpb25zIHVzZWQgaW5zaWRlIHRoZSBza2VsZXRvbiBkZXNjcmlwdGlvbnMuCisoZGVmdW4gZXJsYW5nLXNrZWwtc2tpcC1ibGFuayAoKQorICAoc2tpcC1jaGFycy1iYWNrd2FyZCAiIFx0IikKKyAgbmlsKQorCisoZGVmdW4gZXJsYW5nLXNrZWwtaW5jbHVkZSAoJnJlc3QgYXJncykKKyAgIkluY2x1ZGUgYSB0ZW1wbGF0ZSBpbnNpZGUgYW5vdGhlciB0ZW1wbGF0ZS4KKworRXhhbXBsZSBvZiB1c2UsIGFzc3VtaW5nIHRoYXQgYGVybGFuZy1za2VsLWZ1bmMnIGlzIGRlZmluZWQ6CisKKyAoZGVmdmFyIGZvby1za2VsZXRvbiAnKFwiJSUlIE5ldyBmdW5jdGlvbjpcIgorICAgICAgICAgICAgICAgICAgICAgICAgKGVybGFuZy1za2VsLWluY2x1ZGUgZXJsYW5nLXNrZWwtZnVuYykpKQorCitUZWNoaWNhbGx5LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGB0ZW1wbycgYXR0cmlidXRlYChsIC4uLiknIHdoaWNoCitjYW4gY29udGFpbiBvdGhlciBgdGVtcG8nIGF0dHJpYnV0ZXMuICBQbGVhc2Ugc2VlIHRoZSBmdW5jdGlvbgorYHRlbXBvLWRlZmluZS10ZW1wbGF0ZScgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGAobCAuLi4pJyBhdHRyaWJ1dGUuIgorICAobGV0ICgocmVzICcoKSkKKwllbnRyeSkKKyAgICAod2hpbGUgYXJncworICAgICAgKHNldHEgZW50cnkgKGNhciBhcmdzKSkKKyAgICAgICh3aGlsZSBlbnRyeQorCShzZXRxIHJlcyAoY29ucyAoY2FyIGVudHJ5KSByZXMpKQorCShzZXRxIGVudHJ5IChjZHIgZW50cnkpKSkKKyAgICAgIChzZXRxIGFyZ3MgKGNkciBhcmdzKSkpCisgICAgKGNvbnMgJ2wgKG5yZXZlcnNlIHJlcykpKSkKKworKGRlZnVuIGVybGFuZy1za2VsLXNlcGFyYXRvciAoJm9wdGlvbmFsIHBlcmNlbnQpCisgICJSZXR1cm4gYSBjb21tZW50IHNlcGFyYXRvci4iCisgIChsZXQgKChwZXJjZW50IChvciBwZXJjZW50IDMpKSkKKyAgICAoY29uY2F0IChtYWtlLXN0cmluZyBwZXJjZW50ID8lKSAKKwkgICAgKG1ha2Utc3RyaW5nICgtIDcwIHBlcmNlbnQpID8tKSAKKwkgICAgIlxuIikpKQorCisoZGVmdW4gZXJsYW5nLXNrZWwtZG91YmxlLXNlcGFyYXRvciAoJm9wdGlvbmFsIHBlcmNlbnQpCisgICJSZXR1cm4gYSBjb21tZW50IHNlcGFyYXRvci4iCisgIChsZXQgKChwZXJjZW50IChvciBwZXJjZW50IDMpKSkKKyAgICAoY29uY2F0IChtYWtlLXN0cmluZyBwZXJjZW50ID8lKSAKKwkgICAgKG1ha2Utc3RyaW5nICgtIDcwIHBlcmNlbnQpID89KSAKKwkgICAgIlxuIikpKQorCisoZGVmdW4gZXJsYW5nLXNrZWwtZGQtbW1tLXl5eXkgKCkKKyAgIlJldHVybiB0aGUgY3VycmVudCBkYXRlIGFzIGEgc3RyaW5nIGluIFwiREQgTW9uIFlZWVlcIiBmb3JtLgorVGhlIGZpcnN0IGNoYXJhY3RlciBvZiBERCBpcyBzcGFjZSBpZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIDEwLiIKKyAgKGxldCAoKGRhdGUgKGN1cnJlbnQtdGltZS1zdHJpbmcpKSkKKyAgICAoZm9ybWF0ICIlMmQgJXMgJXMiCisJICAgIChzdHJpbmctdG8taW50IChzdWJzdHJpbmcgZGF0ZSA4IDEwKSkKKwkgICAgKHN1YnN0cmluZyBkYXRlIDQgNykKKwkgICAgKHN1YnN0cmluZyBkYXRlIC00KSkpKQorDAorOzsgSW5kZW50YXRpb24gY29kZToKKworKGRlZnVuIGVybGFuZy1pbmRlbnQtY29tbWFuZCAoJm9wdGlvbmFsIHdob2xlLWV4cCkKKyAgIkluZGVudCBjdXJyZW50IGxpbmUgYXMgRXJsYW5nIGNvZGUuCitXaXRoIGFyZ3VtZW50LCBpbmRlbnQgYW55IGFkZGl0aW9uYWwgbGluZXMgb2YgdGhlIHNhbWUgY2xhdXNlCityaWdpZGx5IGFsb25nIHdpdGggdGhpcyBvbmUuIgorICAoaW50ZXJhY3RpdmUgIlAiKQorICAoaWYgd2hvbGUtZXhwCisgICAgICA7OyBJZiBhcmcsIGFsd3lzIGluZGVudCB0aGlzIGxpbmUgYXMgRXJsYW5nCisgICAgICA7OyBhbmQgc2hpZnQgcmVtYWluaW5nIGxpbmVzIG9mIGNsYXVzZSB0aGUgc2FtZSBhbW91bnQuCisgICAgICAobGV0ICgoc2hpZnQtYW10IChlcmxhbmctaW5kZW50LWxpbmUpKQorCSAgICBiZWcgZW5kKQorCShzYXZlLWV4Y3Vyc2lvbgorCSAgKGlmIGVybGFuZy10YWItYWx3YXlzLWluZGVudAorCSAgICAgIChiZWdpbm5pbmctb2YtbGluZSkpCisJICAoc2V0cSBiZWcgKHBvaW50KSkKKwkgIChlcmxhbmctZW5kLW9mLWNsYXVzZSAxKQorCSAgKHNldHEgZW5kIChwb2ludCkpCisJICAoZ290by1jaGFyIGJlZykKKwkgIChmb3J3YXJkLWxpbmUgMSkKKwkgIChzZXRxIGJlZyAocG9pbnQpKSkKKwkoaWYgKD4gZW5kIGJlZykKKwkgICAgKGluZGVudC1jb2RlLXJpZ2lkbHkgYmVnIGVuZCBzaGlmdC1hbXQgIlxuIikpKQorICAgIChpZiAoYW5kIChub3QgZXJsYW5nLXRhYi1hbHdheXMtaW5kZW50KQorCSAgICAgKHNhdmUtZXhjdXJzaW9uCisJICAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKQorCSAgICAgICAobm90IChib2xwKSkpKQorCShpbnNlcnQtdGFiKQorICAgICAgKGVybGFuZy1pbmRlbnQtbGluZSkpKSkKKworCisoZGVmdW4gZXJsYW5nLWluZGVudC1saW5lICgpCisgICJJbmRlbnQgY3VycmVudCBsaW5lIGFzIEVybGFuZyBjb2RlLgorUmV0dXJuIHRoZSBhbW91bnQgdGhlIGluZGVudGF0aW9uIGNoYW5nZWQgYnkuIgorICAobGV0ICgocG9zICgtIChwb2ludC1tYXgpIChwb2ludCkpKQorCWluZGVudCBiZWcKKwlzaGlmdC1hbXQpCisgICAgKGJlZ2lubmluZy1vZi1saW5lIDEpCisgICAgKHNldHEgYmVnIChwb2ludCkpCisgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKKyAgICAoY29uZCAoKGxvb2tpbmctYXQgIiUiKQorCSAgIChzZXRxIGluZGVudCAoZnVuY2FsbCBjb21tZW50LWluZGVudC1mdW5jdGlvbikpCisJICAgKHNldHEgc2hpZnQtYW10ICgtIGluZGVudCAoY3VycmVudC1jb2x1bW4pKSkpCisJICAodAorCSAgIChzZXRxIGluZGVudCAoZXJsYW5nLWNhbGN1bGF0ZS1pbmRlbnQpKQorCSAgIChjb25kICgobnVsbCBpbmRlbnQpCisJCSAgKHNldHEgaW5kZW50IChjdXJyZW50LWluZGVudGF0aW9uKSkpCisJCSAoKGVxIGluZGVudCB0KQorCQkgIDs7IFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyIGhlcmUuCisJCSAgKGVycm9yICJFcmxhbmcgbW9kZSBlcnJvciIpKQorCQkgKCg9IChjaGFyLXN5bnRheCAoZm9sbG93aW5nLWNoYXIpKSA/XCkpCisJCSAgKHNldHEgaW5kZW50ICgxLSBpbmRlbnQpKSkpCisJICAgKHNldHEgc2hpZnQtYW10ICgtIGluZGVudCAoY3VycmVudC1jb2x1bW4pKSkpKQorICAgIChpZiAoemVyb3Agc2hpZnQtYW10KQorCW5pbAorICAgICAgKGRlbGV0ZS1yZWdpb24gYmVnIChwb2ludCkpCisgICAgICAoaW5kZW50LXRvIGluZGVudCkpCisgICAgOzsgSWYgaW5pdGlhbCBwb2ludCB3YXMgd2l0aGluIGxpbmUncyBpbmRlbnRhdGlvbiwgcG9zaXRpb24KKyAgICA7OyBhZnRlciB0aGUgaW5kZW50YXRpb24uIEVsc2Ugc3RheSBhdCBzYW1lIHBvaW50IGluIHRleHQuCisgICAgKGlmICg+ICgtIChwb2ludC1tYXgpIHBvcykgKHBvaW50KSkKKwkoZ290by1jaGFyICgtIChwb2ludC1tYXgpIHBvcykpKQorICAgIHNoaWZ0LWFtdCkpCisKKworKGRlZnVuIGVybGFuZy1pbmRlbnQtcmVnaW9uIChiZWcgZW5kKQorICAiSW5kZW50IHJlZ2lvbiBvZiBlcmxhbmcgY29kZS4KKworVGhpcyBpcyBhdXRvbWFnaWNhbGx5IGNhbGxlZCBieSB0aGUgdXNlciBsZXZlbCBmdW5jdGlvbiBgaW5kZW50LXJlZ2lvbicuIgorICAoaW50ZXJhY3RpdmUgInIiKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAobGV0ICgoY2FzZS1mb2xkLXNlYXJjaCBuaWwpCisJICAoY29udGludWUgdCkKKwkgIChmcm9tLWVuZCAoLSAocG9pbnQtbWF4KSBlbmQpKQorCSAgaW5kZW50LXBvaW50CQk7OyBUaGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IGxpbmUKKwkgIGluZGVudCAJCTs7IFRoZSBpbmRlbnQgYW1vdW50CisJICBzdGF0ZSkKKyAgICAgIChnb3RvLWNoYXIgYmVnKQorICAgICAgKGJlZ2lubmluZy1vZi1saW5lKQorICAgICAgKHNldHEgaW5kZW50LXBvaW50IChwb2ludCkpCisgICAgICAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UpCisgICAgICA7OyBQYXJzZSB0aGUgRXJsYW5nIGNvZGUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGF1c2UgdG8KKyAgICAgIDs7IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbi4KKyAgICAgICh3aGlsZSAoPCAocG9pbnQpIGluZGVudC1wb2ludCkKKwkoc2V0cSBzdGF0ZSAoZXJsYW5nLXBhcnRpYWwtcGFyc2UgKHBvaW50KSBpbmRlbnQtcG9pbnQgc3RhdGUpKSkKKyAgICAgIDs7IEluZGVudCBldmVyeSBsaW5lIGluIHRoZSByZWdpb24KKyAgICAgICh3aGlsZSBjb250aW51ZQorCShnb3RvLWNoYXIgaW5kZW50LXBvaW50KQorCShza2lwLWNoYXJzLWZvcndhcmQgIiBcdCIpCisJKGNvbmQgKChsb29raW5nLWF0ICIlIikKKwkgICAgICAgOzsgRG8gbm90IHVzZSBvdXIgc3RhY2sgdG8gaGVscCB0aGUgdXNlciB0byBjdXN0b21pemUKKwkgICAgICAgOzsgY29tbWVudCBpbmRlbnRhdGlvbi4KKwkgICAgICAgKHNldHEgaW5kZW50IChmdW5jYWxsIGNvbW1lbnQtaW5kZW50LWZ1bmN0aW9uKSkpCisJICAgICAgKChsb29raW5nLWF0ICIkIikKKwkgICAgICAgOzsgRG9uJ3QgaW5kZW50IGVtcHR5IGxpbmVzLgorCSAgICAgICAoc2V0cSBpbmRlbnQgMCkpCisJICAgICAgKHQKKwkgICAgICAgKHNldHEgaW5kZW50CisJCSAgICAgKHNhdmUtZXhjdXJzaW9uCisJCSAgICAgICAoZXJsYW5nLWNhbGN1bGF0ZS1zdGFjay1pbmRlbnQgKHBvaW50KSBzdGF0ZSkpKQorCSAgICAgICAoY29uZCAoKG51bGwgaW5kZW50KQorCQkgICAgICAoc2V0cSBpbmRlbnQgKGN1cnJlbnQtaW5kZW50YXRpb24pKSkKKwkJICAgICAoKGVxIGluZGVudCB0KQorCQkgICAgICA7OyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ciBoZXJlLgorCQkgICAgICAoZXJyb3IgIkVybGFuZyBtb2RlIGVycm9yIikpCisJCSAgICAgKCg9IChjaGFyLXN5bnRheCAoZm9sbG93aW5nLWNoYXIpKSA/XCkpCisJCSAgICAgIChzZXRxIGluZGVudCAoMS0gaW5kZW50KSkpKSkpCisJKGlmICh6ZXJvcCAoLSBpbmRlbnQgKGN1cnJlbnQtY29sdW1uKSkpCisJICAgIG5pbAorCSAgKGRlbGV0ZS1yZWdpb24gaW5kZW50LXBvaW50IChwb2ludCkpCisJICAoaW5kZW50LXRvIGluZGVudCkpCisJOzsgRmluZCB0aGUgbmV4dCBsaW5lIGluIHRoZSByZWdpb24KKwkoZ290by1jaGFyIGluZGVudC1wb2ludCkKKwkoc2F2ZS1leGN1cnNpb24KKwkgIChmb3J3YXJkLWxpbmUgMSkKKwkgIChzZXRxIGluZGVudC1wb2ludCAocG9pbnQpKSkKKwkoaWYgKD49IGZyb20tZW5kICgtIChwb2ludC1tYXgpIGluZGVudC1wb2ludCkpCisJICAgIChzZXRxIGNvbnRpbnVlIG5pbCkKKwkgICh3aGlsZSAoPCAocG9pbnQpIGluZGVudC1wb2ludCkKKwkgICAgKHNldHEgc3RhdGUgKGVybGFuZy1wYXJ0aWFsLXBhcnNlCisJCQkgKHBvaW50KSBpbmRlbnQtcG9pbnQgc3RhdGUpKSkpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctaW5kZW50LWN1cnJlbnQtYnVmZmVyICgpCisgICJJbmRlbnQgY3VycmVudCBidWZmZXIgYXMgRXJsYW5nIGNvZGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzYXZlLXJlc3RyaWN0aW9uCisgICAgICAod2lkZW4pCisgICAgICAoZXJsYW5nLWluZGVudC1yZWdpb24gKHBvaW50LW1pbikgKHBvaW50LW1heCkpKSkpCisKKworKGRlZnVuIGVybGFuZy1pbmRlbnQtZnVuY3Rpb24gKCkKKyAgIkluZGVudCBjdXJyZW50IEVybGFuZyBmdW5jdGlvbi4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKGxldCAoKGVuZCAocHJvZ24gKGVybGFuZy1lbmQtb2YtZnVuY3Rpb24gMSkgKHBvaW50KSkpCisJICAoYmVnIChwcm9nbiAoZXJsYW5nLWJlZ2lubmluZy1vZi1mdW5jdGlvbiAxKSAocG9pbnQpKSkpCisgICAgICAoZXJsYW5nLWluZGVudC1yZWdpb24gYmVnIGVuZCkpKSkKKworCisoZGVmdW4gZXJsYW5nLWluZGVudC1jbGF1c2UgKCkKKyAgIkluZGVudCBjdXJyZW50IEVybGFuZyBjbGF1c2UuIgorICAoaW50ZXJhY3RpdmUpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChsZXQgKChlbmQgKHByb2duIChlcmxhbmctZW5kLW9mLWNsYXVzZSAxKSAocG9pbnQpKSkKKwkgIChiZWcgKHByb2duIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAxKSAocG9pbnQpKSkpCisgICAgICAoZXJsYW5nLWluZGVudC1yZWdpb24gYmVnIGVuZCkpKSkKKworCisoZGVmbWFjcm8gZXJsYW5nLXB1c2ggKHggc3RhY2spIChsaXN0ICdzZXRxIHN0YWNrIChsaXN0ICdjb25zIHggc3RhY2spKSkKKyhkZWZtYWNybyBlcmxhbmctcG9wIChzdGFjaykgKGxpc3QgJ3NldHEgc3RhY2sgKGxpc3QgJ2NkciBzdGFjaykpKQorOzsgV291bGQgbXVjaCBwcmVmZXIgdG8gbWFrZSBjYWRkciBhIG1hY3JvIGJ1dCB0aGlzIGNsYXNoZXMuCisoZGVmdW4gZXJsYW5nLWNhZGRyICh4KSAoY2FyIChjZHIgKGNkciB4KSkpKQorCisKKyhkZWZ1biBlcmxhbmctY2FsY3VsYXRlLWluZGVudCAoJm9wdGlvbmFsIHBhcnNlLXN0YXJ0KQorICAiQ29tcHV0ZSBhcHByb3ByaWF0ZSBpbmRlbnRhdGlvbiBmb3IgY3VycmVudCBsaW5lIGFzIEVybGFuZyBjb2RlLgorUmV0dXJuIG5pbCBpZiBsaW5lIHN0YXJ0cyBpbnNpZGUgc3RyaW5nLCB0IGlmIGluIGEgY29tbWVudC4iCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChsZXQgKChpbmRlbnQtcG9pbnQgKHBvaW50KSkKKwkgIChjYXNlLWZvbGQtc2VhcmNoIG5pbCkKKwkgIChzdGF0ZSBuaWwpKQorICAgICAgKGlmIHBhcnNlLXN0YXJ0CisJICAoZ290by1jaGFyIHBhcnNlLXN0YXJ0KQorCShlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkpCisgICAgICAod2hpbGUgKDwgKHBvaW50KSBpbmRlbnQtcG9pbnQpCisJKHNldHEgc3RhdGUgKGVybGFuZy1wYXJ0aWFsLXBhcnNlIChwb2ludCkgaW5kZW50LXBvaW50IHN0YXRlKSkpCisgICAgICAoZXJsYW5nLWNhbGN1bGF0ZS1zdGFjay1pbmRlbnQgaW5kZW50LXBvaW50IHN0YXRlKSkpKQorCisoZGVmdW4gZXJsYW5nLXNob3ctc3ludGFjdGljLWluZm9ybWF0aW9uICgpCisgICJTaG93IHN5bnRhY3RpYyBpbmZvcm1hdGlvbiBmb3IgY3VycmVudCBsaW5lLiIKKworICAoaW50ZXJhY3RpdmUpCisKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKGxldCAoKHN0YXJ0aW5nLXBvaW50IChwb2ludCkpCisJICAoY2FzZS1mb2xkLXNlYXJjaCBuaWwpCisJICAoc3RhdGUgbmlsKSkKKyAgICAgIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKKyAgICAgICh3aGlsZSAoPCAocG9pbnQpIHN0YXJ0aW5nLXBvaW50KQorCShzZXRxIHN0YXRlIChlcmxhbmctcGFydGlhbC1wYXJzZSAocG9pbnQpIHN0YXJ0aW5nLXBvaW50IHN0YXRlKSkpCisgICAgICAobWVzc2FnZSAiJVMiIHN0YXRlKSkpKQorCisKKyhkZWZ1biBlcmxhbmctcGFydGlhbC1wYXJzZSAoZnJvbSB0byAmb3B0aW9uYWwgc3RhdGUpCisgICJQYXJzZSBFcmxhbmcgc3ludGF4IHN0YXJ0aW5nIGF0IEZST00gdW50aWwgVE8sIHdpdGggYW4gb3B0aW9uYWwgU1RBVEUuCitWYWx1ZSBpcyBsaXN0IChzdGFjayB0b2tlbi1zdGFydCB0b2tlbi10eXBlIGluLXdoYXQpLiIKKyAgKGdvdG8tY2hhciBmcm9tKQkJCTsgU3RhcnQgYXQgdGhlIGJlZ2lubmluZworICAoZXJsYW5nLXNraXAtYmxhbmsgdG8pCisgIChsZXQgKChjcyAoY2hhci1zeW50YXggKGZvbGxvd2luZy1jaGFyKSkpCisJKHN0YWNrIChjYXIgc3RhdGUpKQorCSh0b2tlbiAocG9pbnQpKQorCWluLXdoYXQpCisgICAgKGNvbmQgCisKKyAgICAgOzsgRG9uZTogUmV0dXJuIHByZXZpb3VzIHN0YXRlLgorICAgICAoKD49IHRva2VuIHRvKQorCSAgIChzZXRxIHRva2VuIChudGggMSBzdGF0ZSkpCisJICAgKHNldHEgY3MgKG50aCAyIHN0YXRlKSkKKwkgICAoc2V0cSBpbi13aGF0IChudGggMyBzdGF0ZSkpKQorICAgICA7OyBXb3JkIGNvbnN0aXR1ZW50OiBjaGVjayBhbmQgaGFuZGxlIGtleXdvcmRzLgorICAgICAoKD0gY3MgP3cpCisgICAgICAoaWYgKGxvb2tpbmctYXQgIlxcKGVuZFxcfGFmdGVyXFwpW15fYS16QS1aMC05XSIpCisJICA7OyBNdXN0IHBvcCB0b3AgaWNyIGxheWVyLCBgYWZ0ZXInIHdpbGwgcHVzaCBhIG5ldworCSAgOzsgbGF5ZXIgbmV4dC4KKwkgIChwcm9nbgorCSAgICAod2hpbGUgKGFuZCBzdGFjayAoZXEgKGNhciAoY2FyIHN0YWNrKSkgJy0+KSkKKwkgICAgICAoZXJsYW5nLXBvcCBzdGFjaykpCisJICAgIChpZiAoYW5kIHN0YWNrIChtZW1xIChjYXIgKGNhciBzdGFjaykpICcoaWNyIGJlZ2luKSkpCisJCShlcmxhbmctcG9wIHN0YWNrKSkpKQorICAgICAgKGNvbmQgKChsb29raW5nLWF0CisJICAgICAgIlxcKGlmXFx8Y2FzZVxcfHJlY2VpdmVcXHxhZnRlclxcKVteX2EtekEtWjAtOV0iKQorCSAgICAgOzsgTXVzdCBwdXNoIGEgbmV3IGljciAoaWYvY2FzZS9yZWNlaXZlKSBsYXllci4KKwkgICAgIChlcmxhbmctcHVzaCAobGlzdCAnaWNyIHRva2VuIChjdXJyZW50LWNvbHVtbikpIHN0YWNrKSkKKwkgICAgKChsb29raW5nLWF0ICJcXChmdW5cXClbXl9hLXpBLVowLTldIikKKwkgICAgIDs7IFB1Y2ggYSBuZXcgaWNyIGxheWVyIGlmIHdlIGFyZSBkZWZpbmluZyBhIGBmdW4nCisJICAgICA7OyBleHByZXNzaW9uLCBub3Qgd2hlbiB3ZSBhcmUgcmVmZXJpbmcgYW4gZXhpc3RpbmcKKwkgICAgIDs7IGZ1bmN0aW9uLgorCSAgICAgKGlmIChzYXZlLWV4Y3Vyc2lvbgorCQkgICAoZ290by1jaGFyIChtYXRjaC1lbmQgMSkpCisJCSAgIChlcmxhbmctc2tpcC1ibGFuayB0bykKKwkJICAgKGVxIChmb2xsb3dpbmctY2hhcikgP1woKSkKKwkJIChlcmxhbmctcHVzaCAobGlzdCAnaWNyIHRva2VuIChjdXJyZW50LWNvbHVtbikpIHN0YWNrKSkpCisJICAgICgobG9va2luZy1hdCAiXFwoYmVnaW5cXHxxdWVyeVxcKVteX2EtekEtWjAtOV0iKQorCSAgICAgKGVybGFuZy1wdXNoIChsaXN0ICdiZWdpbiB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykpCisJICAgICgobG9va2luZy1hdCAid2hlblteX2EtekEtWjAtOV0iKQorCSAgICAgKGVybGFuZy1wdXNoIChsaXN0ICd3aGVuIHRva2VuIChjdXJyZW50LWNvbHVtbikpIHN0YWNrKSkpCisgICAgICAoZm9yd2FyZC1zZXhwIDEpKQorCisgICAgIDs7IFN0cmluZzogVHJ5IHRvIHNraXAgb3ZlciBpdC4gKENhdGNoIGVycm9yIGlmIG5vdCBjb21wbGV0ZS4pCisgICAgICgoPSBjcyA/XCIpCisgICAgICAoY29uZGl0aW9uLWNhc2UgbmlsCisJICAocHJvZ24KKwkgICAgKGZvcndhcmQtc2V4cCAxKQorCSAgICAoaWYgKD4gKHBvaW50KSB0bykKKwkJKHByb2duCisJCSAgKHNldHEgaW4td2hhdCAnc3RyaW5nKQorCQkgIChnb3RvLWNoYXIgdG8pKSkpCisJKGVycm9yCisJIChzZXRxIGluLXdoYXQgJ3N0cmluZykKKwkgKGdvdG8tY2hhciB0bykpKSkKKworICAgICA7OyBTeW1ib2wgY29uc3RpdHVlbnQsIHB1bmN0dWF0aW9uLCBvciBleHByZXNzaW9uIHByZWZpeD8KKyAgICAgKChtZW1xIGNzICcoPy4gP18gPycpKQorICAgICAgKGNvbmQgCisKKyAgICAgICA7OyBDbGF1c2UgZW5kCisgICAgICAgKCg9IChmb2xsb3dpbmctY2hhcikgP1w7KQorCShpZiAoYW5kIHN0YWNrIChlcSAoY2FyIChjYXIgc3RhY2spKSAnLT4pKQorCSAgICAoZXJsYW5nLXBvcCBzdGFjaykpCisJKGZvcndhcmQtY2hhciAxKSkKKworICAgICAgIDs7IEZ1bmN0aW9uIGVuZAorICAgICAgICgobG9va2luZy1hdCAiXFwuXFwoXFxzIFxcfFxuXFx8XFxzPFxcKSIpCisJKHNldHEgc3RhY2sgbmlsKQorCShmb3J3YXJkLWNoYXIgMSkpCisKKyAgICAgICA7OyBGdW5jdGlvbiBoZWFkCisgICAgICAgKChsb29raW5nLWF0ICItPlxcfDotIikKKwkoaWYgKGFuZCBzdGFjayAoZXEgKGNhciAoY2FyIHN0YWNrKSkgJ3doZW4pKQorCSAgICAoZXJsYW5nLXBvcCBzdGFjaykpCisJKGVybGFuZy1wdXNoIChsaXN0ICctPiB0b2tlbiAoY3VycmVudC1jb2x1bW4pKSBzdGFjaykKKwkoZm9yd2FyZC1jaGFyIDIpKQorCisgICAgICAgOzsgTGlzdC1jb21wcmVoZW5zaW9uIGRpdmlkZXIKKyAgICAgICAoKGxvb2tpbmctYXQgInx8IikKKwkoZXJsYW5nLXB1c2ggKGxpc3QgJ3x8IHRva2VuIChjdXJyZW50LWNvbHVtbikpIHN0YWNrKQorCShmb3J3YXJkLWNoYXIgMikpCisKKyAgICAgICA7OyBCaXQtc3ludGF4IG9wZW4gcGFyZW4KKyAgICAgICAoKGxvb2tpbmctYXQgIjw8IikKKwkoZXJsYW5nLXB1c2ggKGxpc3QgJ1woIHRva2VuIChjdXJyZW50LWNvbHVtbikpIHN0YWNrKQorCShmb3J3YXJkLWNoYXIgMikpCisKKyAgICAgICA7OyBCYml0LXN5bnRheCBjbG9zZSBwYXJlbgorICAgICAgICgobG9va2luZy1hdCAiPj4iKQorCSh3aGlsZSAobWVtcSAoY2FyIChjYXIgc3RhY2spKSAnKHx8IC0+KSkKKwkgIChlcmxhbmctcG9wIHN0YWNrKSkKKwkoY29uZCAoKGVxIChjYXIgKGNhciBzdGFjaykpICdcKCkKKwkgICAgICAgKGVybGFuZy1wb3Agc3RhY2spKQorCSAgICAgICgobWVtcSAoY2FyIChjYXIgc3RhY2spKSAnKGljciBiZWdpbikpCisJICAgICAgIChlcnJvciAiTWlzc2luZyBgZW5kJyIpKQorCSAgICAgICh0CisJICAgICAgIChlcnJvciAiVW5iYWxhbmNlZCBwYXJlbnRoZXNlcyIpKSkKKwkoZm9yd2FyZC1jaGFyIDIpKQorCisgICAgICAgOzsgTWFjcm8KKyAgICAgICAoKD0gKGZvbGxvd2luZy1jaGFyKSA/PykKKwk7OyBTa2lwIG92ZXIgbWFjcm8gbmFtZSBhbmQgYW55IGZvbGxvd2luZyB3aGl0ZXNwYWNlLgorCShmb3J3YXJkLXdvcmQgMSkKKwkoc2tpcC1zeW50YXgtZm9yd2FyZCAiLSIgdG8pCisJOzsgTWFjcm8gbWlnaHQgaGF2ZSBhbiBhcmd1bWVudCBsaXN0LiBTa2lwIGl0IHRvby4KKwkod2hlbiAoPSAoZm9sbG93aW5nLWNoYXIpID9cKCkKKwkgIChmb3J3YXJkLWxpc3QgMSkpKQorCisgICAgICAgOzsgT3RoZXIgcHVuY3R1YXRpb246IFNraXAgb3ZlciBpdCBhbmQgYW55IGZvbGxvd2luZyBwdW5jdHVhdGlvbgorICAgICAgICgoPSBjcyA/LikKKwk7OyBTa2lwIG92ZXIgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIG9wZXJhbmQuCisJKHNraXAtc3ludGF4LWZvcndhcmQgIi4iKSkKKworICAgICAgIDs7IE90aGVyIGNoYXI6IFNraXAgb3ZlciBpdC4KKyAgICAgICAodAorCShmb3J3YXJkLWNoYXIgMSkpKSkKKworICAgICA7OyBPcGVuIHBhcmVudGhlc2lzCisgICAgICgoPSBjcyA/XCgpCisgICAgICAoZXJsYW5nLXB1c2ggKGxpc3QgJ1woIHRva2VuIChjdXJyZW50LWNvbHVtbikpIHN0YWNrKQorICAgICAgKGZvcndhcmQtY2hhciAxKSkKKworICAgICA7OyBDbG9zZSBwYXJlbnRoZXNpcworICAgICAoKD0gY3MgP1wpKQorICAgICAgKHdoaWxlIChtZW1xIChjYXIgKGNhciBzdGFjaykpICcofHwgLT4pKQorCShlcmxhbmctcG9wIHN0YWNrKSkKKyAgICAgIChjb25kICgoZXEgKGNhciAoY2FyIHN0YWNrKSkgJ1woKQorCSAgICAgKGVybGFuZy1wb3Agc3RhY2spKQorCSAgICAoKG1lbXEgKGNhciAoY2FyIHN0YWNrKSkgJyhpY3IgYmVnaW4pKQorCSAgICAgKGVycm9yICJNaXNzaW5nIGBlbmQnIikpCisJICAgICh0CisJICAgICAoZXJyb3IgIlVuYmFsYW5jZWQgcGFyZW50aGVzaXMiKSkpCisgICAgICAoZm9yd2FyZC1jaGFyIDEpKQorICAgICAKKyAgICAgOzsgQ2hhcmFjdGVyIHF1b3RlOiBTa2lwIGl0IGFuZCB0aGUgcXVvdGVkIGNoYXIuCisgICAgICgoPSBjcyA/LykKKyAgICAgIChmb3J3YXJkLWNoYXIgMikpCisKKyAgICAgOzsgQ2hhcmFjdGVyIGVzY2FwZTogU2tpcCBpdCBhbmQgdGhlIGVzY2FwZSBzZXF1ZW5jZS4KKyAgICAgKCg9IGNzID9cXCkKKyAgICAgIChmb3J3YXJkLWNoYXIgMSkKKyAgICAgIChza2lwLXN5bnRheC1mb3J3YXJkICJ3IikpCisKKyAgICAgOzsgRXZlcnl0aGluZyBlbHNlCisgICAgICh0CisgICAgICAoZm9yd2FyZC1jaGFyIDEpKSkKKyAgICAobGlzdCBzdGFjayB0b2tlbiBjcyBpbi13aGF0KSkpCisKKworKGRlZnVuIGVybGFuZy1jYWxjdWxhdGUtc3RhY2staW5kZW50IChpbmRlbnQtcG9pbnQgc3RhdGUpCisgICJGcm9tIHRoZSBnaXZlbiBsYXN0IHBvc2l0aW9uIGFuZCBzdGF0ZSAoc3RhY2spIGNhbGN1bGF0ZSBpbmRlbnRhdGlvbi4KK1JldHVybiBuaWwgaWYgaW5zaWRlIHN0cmluZywgdCBpZiBpbiBhIGNvbW1lbnQuIgorICAobGV0KiAoKHN0YWNrIChhbmQgc3RhdGUgKGNhciBzdGF0ZSkpKQorCSAodG9rZW4gKG50aCAxIHN0YXRlKSkKKwkgKHN0YWNrLXRvcCAoYW5kIHN0YWNrIChjYXIgc3RhY2spKSkpCisgICAgKGNvbmQgKChudWxsIHN0YXRlKQkJCTtObyBzdGF0ZQorCSAgIDApCisJICAoKG50aCAzIHN0YXRlKQorCSAgIDs7IFJldHVybiBuaWwgb3IgdC4KKwkgICAoZXEgKG50aCAzIHN0YXRlKSAnY29tbWVudCkpCisJICAoKG51bGwgc3RhY2spCisJICAgKGlmIChsb29raW5nLWF0ICJ3aGVuW15fYS16QS1aMC05XSIpCisJICAgICAgIGVybGFuZy1pbmRlbnQtZ3VhcmQKKwkgICAgIDApKQorCSAgKChlcSAoY2FyIHN0YWNrLXRvcCkgJ1woKQorCSAgIDs7IEVsZW1lbnQgb2YgbGlzdCwgdHVwbGUgb3IgcGFydCBvZiBhbiBleHByZXNzaW9uLAorCSAgIChpZiAobnVsbCBlcmxhbmctYXJndW1lbnQtaW5kZW50KQorCSAgICAgICA7OyBpbmRlbnQgdG8gbmV4dCBjb2x1bW4uCisJICAgICAgICgxKyAobnRoIDIgc3RhY2stdG9wKSkKKwkgICAgIChnb3RvLWNoYXIgKG50aCAxIHN0YWNrLXRvcCkpCisJICAgICAoY29uZCAoKGxvb2tpbmctYXQgIlsoe11cXHMgKlxcKCRcXHwlXFwpIikKKwkJICAgIDs7IExpbmUgZW5kcyB3aXRoIHBhcmVudGhlc2lzLgorCQkgICAgKCsgKGVybGFuZy1pbmRlbnQtZmluZC1wcmVjZWRpbmctZXhwcikKKwkJICAgICAgIGVybGFuZy1hcmd1bWVudC1pbmRlbnQpKQorCQkgICAodAorCQkgICAgOzsgSW5kZW50IHRvIHRoZSBzYW1lIGNvbHVtbiBhcyB0aGUgZmlyc3QKKwkJICAgIDs7IGFyZ3VtZW50LgorCQkgICAgKGdvdG8tY2hhciAoMSsgKG50aCAxIHN0YWNrLXRvcCkpKQorCQkgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKKwkJICAgIChjdXJyZW50LWNvbHVtbikpKSkpCisJICAoKGVxIChjYXIgc3RhY2stdG9wKSAnaWNyKQorCSAgIDs7IFRoZSBkZWZhdWx0IGluZGVudGF0aW9uIGlzIHRoZSBjb2x1bW4gb2YgdGhlIG9wdGlvbgorCSAgIDs7IGRpcmVjdGx5IGZvbGxvd2luZyB0aGUga2V5d29yZC4gKFRoaXMgZG9lcyBub3QgYXBwbHkgdG8KKwkgICA7OyBgY2FzZScuKSAgU2hvdWxkIG5vIG9wdGlvbiBiZSBvbiB0aGUgc2FtZSBsaW5lLCB0aGUKKwkgICA7OyBpbmRlbnRhdGlvbiBpcyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGtleXdvcmQgKworCSAgIDs7IGBlcmxhbmctaW5kZW50LWxldmVsJy4KKwkgICA7OworCSAgIDs7IGBhZnRlcicgc2hvdWxkIGJlIGluZGVudGF0ZWQgdG8gdGhlIHNhdmUgbGV2ZWwgYXMgdGhlCisJICAgOzsgY29ycmVzcG9uZGluZyByZWNlaXZlLgorCSAgIChpZiAobG9va2luZy1hdCAiYWZ0ZXJbXl9hLXpBLVowLTldIikKKwkgICAgICAgKG50aCAyIHN0YWNrLXRvcCkKKwkgICAgIChzYXZlLWV4Y3Vyc2lvbgorCSAgICAgICAoZ290by1jaGFyIChudGggMSBzdGFjay10b3ApKQorCSAgICAgICAoaWYgKGxvb2tpbmctYXQgImNhc2VbXl9hLXpBLVowLTldIikKKwkJICAgKCsgKG50aCAyIHN0YWNrLXRvcCkgZXJsYW5nLWluZGVudC1sZXZlbCkKKwkJIChza2lwLWNoYXJzLWZvcndhcmQgImEteiIpCisJCSAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHQiKQorCQkgKGlmIChtZW1xIChmb2xsb3dpbmctY2hhcikgJyg/JSA/XG4pKQorCQkgICAgICgrIChudGggMiBzdGFjay10b3ApIGVybGFuZy1pbmRlbnQtbGV2ZWwpCisJCSAgIChjdXJyZW50LWNvbHVtbikpKSkpKQorCSAgOzsgUmVhbCBpbmRlbnRhdGlvbiwgd2hlcmUgb3BlcmF0b3JzIGNyZWF0ZSBleHRyYSBpbmRlbnRhdGlvbiBldGMuCisJICAoKG1lbXEgKGNhciBzdGFjay10b3ApICcoLT4gfHwgYmVnaW4pKQorCSAgIChnb3RvLWNoYXIgKG50aCAxIHN0YWNrLXRvcCkpCisJICAgOzsgQ2hlY2sgaWYgdGhlcmUgaXMgbW9yZSBjb2RlIGFmdGVyIHRoZSAnLT4nIG9uIHRoZQorCSAgIDs7IHNhbWUgbGluZS4gSWYgc28gdXNlIHRoaXMgaW5kZW50YXRpb24gYXMgYmFzZSwgZWxzZQorCSAgIDs7IHVzZSBwYXJlbnQgaW5kZW50YXRpb24gKyAyICogbGV2ZWwgYXMgYmFzZS4KKwkgICAobGV0ICgob2ZmIGVybGFuZy1pbmRlbnQtbGV2ZWwpCisJCSAoc2tpcCAyKSkKKwkgICAgIChjb25kICgobnVsbCAoY2RyIHN0YWNrKSkpCTsgVG9wIGxldmVsIGluIGZ1bmN0aW9uLgorCQkgICAoKGVxIChjYXIgc3RhY2stdG9wKSAnYmVnaW4pCisJCSAgICAoc2V0cSBza2lwIDUpKQorCQkgICAoKGVxIChjYXIgc3RhY2stdG9wKSAnLT4pCisJCSAgICAoc2V0cSBvZmYgKCogMiBlcmxhbmctaW5kZW50LWxldmVsKSkpKQorCSAgICAgKGxldCAoKGJhc2UgKGVybGFuZy1pbmRlbnQtZmluZC1iYXNlIHN0YWNrIGluZGVudC1wb2ludCBvZmYgc2tpcCkpKQorCSAgICAgICA7OyBMb29rIGF0IGxhc3QgdGhpbmcgdG8gc2VlIGhvdyB3ZSBhcmUgdG8gbW92ZSByZWxhdGl2ZQorCSAgICAgICA7OyB0byB0aGUgYmFzZS4KKwkgICAgICAgKGdvdG8tY2hhciB0b2tlbikKKwkgICAgICAgKGNvbmQgKChsb29raW5nLWF0ICJ8fFxcfCxcXHwtPlxcfDotIikKKwkJICAgICAgYmFzZSkKKwkJICAgICAoKGVybGFuZy1hdC1rZXl3b3JkKQorCQkgICAgICAoKyAoY3VycmVudC1jb2x1bW4pIGVybGFuZy1pbmRlbnQtbGV2ZWwpKQorCQkgICAgICgob3IgKD0gKGNoYXItc3ludGF4IChmb2xsb3dpbmctY2hhcikpID8uKQorCQkJICAoZXJsYW5nLWF0LW9wZXJhdG9yKSkKKwkJICAgICAgKCsgYmFzZSBlcmxhbmctaW5kZW50LWxldmVsKSkKKwkJICAgICAodAorCQkgICAgICAoZ290by1jaGFyIGluZGVudC1wb2ludCkKKwkJICAgICAgKGNvbmQgKChtZW1xIChmb2xsb3dpbmctY2hhcikgJyg/XCggP3spKQorCQkJICAgICA7OyBGdW5jdGlvbiBhcHBsaWNhdGlvbiBvciByZWNvcmQuCisJCQkgICAgICgrIChlcmxhbmctaW5kZW50LWZpbmQtcHJlY2VkaW5nLWV4cHIpCisJCQkJZXJsYW5nLWFyZ3VtZW50LWluZGVudCkpCisJCQkgICAgOzsgRW1wdHkgbGluZSwgb3IgZW5kOyB0cmVhdCBpdCBhcyB0aGUgZW5kIG9mCisJCQkgICAgOzsgdGhlIGJsb2NrLiAgKEhlcmUgd2UgaGF2ZSBhIGNob2ljZTogc2hvdWxkCisJCQkgICAgOzsgdGhlIHVzZXIgYmUgZm9yY2VkIHRvIHJlaW5kZW50IGNvbnRpbnVlZAorCQkJICAgIDs7IGxpbmVzLCBvciBzaG91bGQgdGhlICJlbmQiIGJlIHJlaW5kZW50ZWQ/KQorCQkJICAgICgobG9va2luZy1hdCAiXFwoZW5kXFx8YWZ0ZXJcXClbXl9hLXpBLVowLTldXFx8JCIpCisJCQkgICAgIChpZiAoZXEgKGNhciAoY2FyIHN0YWNrKSkgJy0+KQorCQkJCSAoZXJsYW5nLXBvcCBzdGFjaykpCisJCQkgICAgIChpZiBzdGFjaworCQkJCSAoZXJsYW5nLWNhZGRyIChjYXIgc3RhY2spKQorCQkJICAgICAgIDApKQorCQkJICAgIDs7IEF2b2lkIHRyYXRpbmcgY29tbWVudHMgYSBjb250aW51ZWQgbGluZS4KKwkJCSAgICAoKD0gKGZvbGxvd2luZy1jaGFyKSA/JSkKKwkJCSAgICAgYmFzZSkKKwkJCSAgICA7OyBDb250aW51ZWQgbGluZSAoZS5nLiBsaW5lIGJlZ2lubmluZworCQkJICAgIDs7IHdpdGggYW4gb3BlcmF0b3IuKQorCQkJICAgICh0ICgrIGJhc2UgZXJsYW5nLWluZGVudC1sZXZlbCkpKSkpKSkpCisJICAoKGVxIChjYXIgc3RhY2stdG9wKSAnd2hlbikKKwkgICAoZ290by1jaGFyIChudGggMSBzdGFjay10b3ApKQorCSAgIChpZiAobG9va2luZy1hdCAid2hlblxccyAqXFwoJFxcfCVcXCkiKQorCSAgICAgICAocHJvZ24KKwkJIChlcmxhbmctcG9wIHN0YWNrKQorCQkgKGlmIChhbmQgc3RhY2sgKGVxIChudGggMCAoY2FyIHN0YWNrKSkgJ2ljcikpCisJCSAgICAgKHByb2duCisJCSAgICAgICAoZ290by1jaGFyIChudGggMSAoY2FyIHN0YWNrKSkpCisJCSAgICAgICAoKyAobnRoIDIgKGNhciBzdGFjaykpIGVybGFuZy1pbmRlbnQtZ3VhcmQKKwkJCSAgOzsgcmVjZWl2ZSBYWVogICAgb3IgICAgcmVjZWl2ZQorCQkJICA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgWFlaCisJCQkgIChpZiAobG9va2luZy1hdCAiW2Etel0rXFxzICpcXCgkXFx8JVxcKSIpCisJCQkgICAgICBlcmxhbmctaW5kZW50LWxldmVsCisJCQkgICAgKCogMiBlcmxhbmctaW5kZW50LWxldmVsKSkpKQorCQkgICBlcmxhbmctaW5kZW50LWd1YXJkKSkKKwkgICAgIDs7ICJ3aGVuIiBpcyBmb2xsb3dlZCBieSBjb2RlLCBsZXQncyBpbmRlbnQgdG8gdGhlIHNhbWUKKwkgICAgIDs7IGNvbHVtbi4KKwkgICAgIChmb3J3YXJkLWNoYXIgNCkJCTsgU2tpcCAid2hlbiIKKwkgICAgIChza2lwLWNoYXJzLWZvcndhcmQgIiBcdCIpCisJICAgICAoY3VycmVudC1jb2x1bW4pKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLWluZGVudC1maW5kLWJhc2UgKHN0YWNrIGluZGVudC1wb2ludCAmb3B0aW9uYWwgb2Zmc2V0IHNraXApCisgICJGaW5kIHRoZSBiYXNlIGNvbHVtbiBmb3IgY3VycmVudCBzdGFjay4iCisgIChvciBza2lwIChzZXRxIHNraXAgMikpCisgIChvciBvZmZzZXQgKHNldHEgb2Zmc2V0IGVybGFuZy1pbmRlbnQtbGV2ZWwpKQorICAoc2F2ZS1leGN1cnNpb24KKyAgICAobGV0KiAoKHN0YWNrLXRvcCAoY2FyIHN0YWNrKSkpCisgICAgICAoZ290by1jaGFyIChudGggMSBzdGFjay10b3ApKQorICAgICAgKGZvcndhcmQtY2hhciBza2lwKQorICAgICAgKGlmIChsb29raW5nLWF0ICJcXHMgKlxcKCRcXHwlXFwpIikKKwkgIChwcm9nbgorCSAgICAoaWYgKG1lbXEgKGNhciBzdGFjay10b3ApICcoLT4gfHwpKQorCQkoZXJsYW5nLXBvcCBzdGFjaykpCisJICAgIDs7IFRha2UgcGFyZW50IGlkZW50YXRpb24gKyBvZmZzZXQsCisJICAgIDs7IGVsc2UganVzdCBlcmxhbmctaW5kZW50LWxldmVsIGlmIG5vIHBhcmVudAorCSAgICAoaWYgc3RhY2sKKwkJKCsgKGVybGFuZy1jYWRkciAoY2FyIHN0YWNrKSkKKwkJICAgb2Zmc2V0KQorCSAgICAgIGVybGFuZy1pbmRlbnQtbGV2ZWwpKQorCShlcmxhbmctc2tpcC1ibGFuayBpbmRlbnQtcG9pbnQpCisJKGN1cnJlbnQtY29sdW1uKSkpKSkKKworCis7OyBEb2VzIG5vdCBoYW5kbGUgYGJlZ2luJyAuLiBgZW5kJy4KKyhkZWZ1biBlcmxhbmctaW5kZW50LWZpbmQtcHJlY2VkaW5nLWV4cHIgKCkKKyAgIlJldHVybiB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBwcmVjZWRpbmcgZXhwcmVzc2lvbi4KK1RoaXMgYXNzdW1lcyB0aGF0IHRoZSBwcmVjZWRpbmcgZXhwcmVzc2lvbiBpcyBlaXRoZXIgc2ltcGxlCitcKGkuZS4gYW4gYXRvbSkgb3IgcGFyZW50aGVzaXplZC4iCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChmb3J3YXJkLXNleHAgLTEpCisgICAgKGxldCAoKGNvbCAoY3VycmVudC1jb2x1bW4pKSkKKyAgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKQorICAgICAgOzsgTmVlZGVkIHRvIG1hdGNoIHRoZSBjb2xvbiBpbiAiJ2Zvbyc6J2JhciciLgorICAgICAgKGlmIChub3QgKG1lbXEgKHByZWNlZGluZy1jaGFyKSAnKD8jID86KSkpCisJICBjb2wKKwkoYmFja3dhcmQtY2hhciAxKQorCShmb3J3YXJkLXNleHAgLTEpCisJKGN1cnJlbnQtY29sdW1uKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLXNraXAtYmxhbmsgKCZvcHRpb25hbCBsaW0pCisgICJTa2lwIG92ZXIgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgdW50aWwgbGltaXQgcmVhY2hlZC4iCisgIChvciBsaW0gKHNldHEgbGltIChwb2ludC1tYXgpKSkKKyAgKGxldCAoc3RvcCkKKyAgICAod2hpbGUgKGFuZCAobm90IHN0b3ApICg8IChwb2ludCkgbGltKSkKKyAgICAgIChjb25kICgoPSAoZm9sbG93aW5nLWNoYXIpID8lKQorCSAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiXlxuIiBsaW0pKQorCSAgICAoKD0gKGZvbGxvd2luZy1jaGFyKSA/XG4pCisJICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICJcbiIgbGltKSkKKwkgICAgKChsb29raW5nLWF0ICJcXHMgIikKKwkgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQgIlxcUyAiIGxpbSAnbW92ZSkKKwkJIChmb3J3YXJkLWNoYXIgLTEpKSkKKwkgICAgKHQKKwkgICAgIChzZXRxIHN0b3AgdCkpKSkKKyAgICBzdG9wKSkKKworKGRlZnVuIGVybGFuZy1hdC1rZXl3b3JkICgpCisgICJBcmUgd2UgbG9va2luZyBhdCBhbiBFcmxhbmcga2V5d29yZCB3aGljaCB3aWxsIGluY3JlYXNlIGluZGVudGF0aW9uPyIKKyAgKGxvb2tpbmctYXQgKGNvbmNhdCAiXFwod2hlblxcfGlmXFx8ZnVuXFx8Y2FzZVxcfGJlZ2luXFx8cXVlcnlcXHwiCisJCSAgICAgICJvZlxcfHJlY2VpdmVcXHxhZnRlclxcfGNhdGNoXFwpW15fYS16QS1aMC05XSIpKSkKKworKGRlZnVuIGVybGFuZy1hdC1vcGVyYXRvciAoKQorICAiQXJlIHdlIGxvb2tpbmcgYXQgYW4gRXJsYW5nIG9wZXJhdG9yPyIKKyAgKGxvb2tpbmctYXQKKyAgICJcXChibm90XFx8ZGl2XFx8bW9kXFx8YmFuZFxcfGJvclxcfGJ4b3JcXHxic2xcXHxic3JcXClbXl9hLXpBLVowLTldIikpCisKKyhkZWZ1biBlcmxhbmctY29tbWVudC1pbmRlbnQgKCkKKyAgIkNvbXB1dGUgZXJsYW5nIGNvbW1lbnQgaW5kZW50YXRpb24uCisKK1VzZWQgYm90aCBieSBgaW5kZW50LWZvci1jb21tZW50JyBhbmQgdGhlIGVybGFuZyBzcGVjaWZpYyBpbmRlbnRhdGlvbgorY29tbWFuZHMuIgorICAoY29uZCAoKGxvb2tpbmctYXQgIiUlJSIpIDApCisJKChsb29raW5nLWF0ICIlJSIpCisJIChvciAoZXJsYW5nLWNhbGN1bGF0ZS1pbmRlbnQpCisJICAgICAoY3VycmVudC1pbmRlbnRhdGlvbikpKQorCSh0CisJIChzYXZlLWV4Y3Vyc2lvbgorCSAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQiKQorCSAgIChtYXggKGlmIChib2xwKSAwICgxKyAoY3VycmVudC1jb2x1bW4pKSkKKwkJY29tbWVudC1jb2x1bW4pKSkpKQorDAorOzs7IEVybGFuZyBtb3ZlbWVudCBjb21tYW5kcworCis7OyBBbGwgY29tbWFuZHMgYmVsb3cgd29yayBhcyBtb3ZlbWVudCBjb21tYW5kcy4gIEkuZS4gaWYgdGhlIHBvaW50IGlzCis7OyBhdCB0aGUgZW5kIG9mIHRoZSBjbGF1c2UsIGFuZCB0aGUgY29tbWFuZCBgZXJsYW5nLWVuZC1vZi1jbGF1c2UnIGlzCis7OyBleGVjdXRlZCwgdGhlIHBvaW50IGlzIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIE5FWFQgY2xhdXNlLiAgKFRoaXMKKzs7IG1pbWljcyB0aGUgYmVoYXZpb3VyIG9mIGBlbmQtb2YtZGVmdW4nLikKKzs7Cis7OyBQZXJzb25hbGx5IEkgd291bGQgbGlrZSB0byByZXdyaXRlIHRoZW0gdG8gYmUgInB1cmUiLCBhbmQgYWRkIGEgc2V0Cis7OyBvZiBtb3ZlbWVudCBmdW5jdGlvbnMsIGxpa2UgYGVybGFuZy1uZXh0LWNsYXVzZScsCis7OyBgZXJsYW5nLXByZXZpb3VzLWNsYXVzZScsIGFuZCB0aGUgc2FtZSBmb3IgZnVuY3Rpb25zLgorOzsKKzs7IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGhvcGVsZXNzIHRvIHVzZSB0aGUgZnVuY3Rpb25zIGFzCis7OyBzdWJyb3V0aW5lcyBpbiBtb3JlIGNvbXBsZXggY29tbWFuZHMuICAgL2FuZGVyc2wKKworKGRlZnVuIGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlICgmb3B0aW9uYWwgYXJnKQorICAiTW92ZSBiYWNrd2FyZCB0byBwcmV2aW91cyBzdGFydCBvZiBjbGF1c2UuCitXaXRoIGFyZ3VtZW50LCBkbyB0aGlzIHRoYXQgbWFueSB0aW1lcy4KK1JldHVybiB0IHVubGVzcyBzZWFyY2ggc3RvcHMgZHVlIHRvIGVuZCBvZiBidWZmZXIuIgorICAoaW50ZXJhY3RpdmUgInAiKQorICAob3IgYXJnIChzZXRxIGFyZyAxKSkKKyAgKGlmICg8IGFyZyAwKQorICAgICAgOzsgU3RlcCBiYWNrIHRvIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIGxpbmUsIHVubGVzcyB3ZSBhcmUgYXQKKyAgICAgIDs7IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gIFRoZSByZWFzb24gZm9yIHRoaXMgbW92ZSBpcworICAgICAgOzsgdGhhdCB0aGUgcmVnZXhwIGJlbG93IGluY2x1ZGVzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKKyAgICAgIDs7IHByZXZpb3VzIGxpbmUuCisgICAgICAoaWYgKGJvYnApCisJICAob3IgKGxvb2tpbmctYXQgIlxuIikKKwkgICAgICAoZm9yd2FyZC1jaGFyIDEpKQorCShmb3J3YXJkLWNoYXIgLTEpCisJKGlmIChsb29raW5nLWF0ICJcXGBcbiIpCisJICAgIChmb3J3YXJkLWNoYXIgMSkpKSkKKyAgOzsgVGhlIHJlZ2V4cCBtYXRjaGVzIGEgZnVuY3Rpb24gaGVhZGVyIHRoYXQgaXNuJ3QKKyAgOzsgaW5jbHVkZWQgaW4gYSBzdHJpbmcuCisgIChhbmQgKHJlLXNlYXJjaC1mb3J3YXJkICJcXChcXGBcXHxcXGBcblxcfFteXFxdXG5cXClcXChbYS16XVxcfCdcXHwtXFwpIgorCQkJICBuaWwgJ21vdmUgKC0gYXJnKSkKKyAgICAgICAobGV0ICgoYmVnIChtYXRjaC1iZWdpbm5pbmcgMikpKQorCSAoYW5kIGJlZyAoZ290by1jaGFyIGJlZykpCisJIHQpKSkKKworKGRlZnVuIGVybGFuZy1lbmQtb2YtY2xhdXNlICgmb3B0aW9uYWwgYXJnKQorICAiTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGNsYXVzZS4KK1dpdGggYXJndW1lbnQsIGRvIHRoaXMgdGhhdCBtYW55IHRpbWVzLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKG9yIGFyZyAoc2V0cSBhcmcgMSkpCisgICh3aGlsZSAoYW5kIChsb29raW5nLWF0ICJbIFx0XSpbJVxuXSIpCisJICAgICAgKHplcm9wIChmb3J3YXJkLWxpbmUgMSkpKSkKKyAgOzsgTW92ZSB0byB0aGUgbmV4dCBjbGF1c2UuCisgIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAoLSBhcmcpKQorICAoYmVnaW5uaW5nLW9mLWxpbmUpICA7OyBKdXN0IHRvIGJlIHN1cmUuLi4KKyAgKGxldCAoKGNvbnRpbnVlIHQpKQorICAgICh3aGlsZSAoYW5kIChub3QgKGJvYnApKSBjb250aW51ZSkKKyAgICAgIChmb3J3YXJkLWxpbmUgLTEpCisgICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHQiKQorICAgICAgKGlmIChsb29raW5nLWF0ICJbJVxuXSIpCisJICBuaWwKKwkoZW5kLW9mLWxpbmUpCisJKHNldHEgY29udGludWUgbmlsKSkpKSkKKworKGRlZnVuIGVybGFuZy1tYXJrLWNsYXVzZSAoKQorICAiUHV0IG1hcmsgYXQgZW5kIG9mIGNsYXVzZSwgcG9pbnQgYXQgYmVnaW5uaW5nLiIKKyAgKGludGVyYWN0aXZlKQorICAocHVzaC1tYXJrIChwb2ludCkpCisgIChlcmxhbmctZW5kLW9mLWNsYXVzZSAxKQorICA7OyBTZXRzIHRoZSByZWdpb24uIEluIEVtYWNzIDE5IGFuZCBYRW1hY3MsIHdlIHdhbnRzIHRvIGFjdGl2YXRlCisgIDs7IHRoZSByZWdpb24uCisgIChjb25kaXRpb24tY2FzZSBuaWwKKyAgICAgIChwdXNoLW1hcmsgKHBvaW50KSBuaWwgdCkKKyAgICAoZXJyb3IgKHB1c2gtbWFyayAocG9pbnQpKSkpCisgIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAxKQorICA7OyBUaGUgYWJvdmUgZnVuY3Rpb24gZGVhY3RpdmF0ZXMgdGhlIG1hcmsuCisgIChpZiAoYm91bmRwICdkZWFjdGl2YXRlLW1hcmspCisgICAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpICdkZWFjdGl2YXRlLW1hcmsgbmlsKSkpCisKKyhkZWZ1biBlcmxhbmctYmVnaW5uaW5nLW9mLWZ1bmN0aW9uICgmb3B0aW9uYWwgYXJnKQorICAiTW92ZSBiYWNrd2FyZCB0byBwcmV2aW91cyBzdGFydCBvZiBmdW5jdGlvbi4KK1dpdGggcG9zaXRpdmUgYXJndW1lbnQsIGRvIHRoaXMgdGhhdCBtYW55IHRpbWVzLgorV2l0aCBuZWdhdGl2ZSBhcmd1bWVudCwgc2VhcmNoIGZvcndhcmQuCisKK1JldHVybiB0IHVubGVzcyBzZWFyY2ggc3RvcHMgZHVlIHRvIGVuZCBvZiBidWZmZXIuIgorICAoaW50ZXJhY3RpdmUgInAiKQorICAob3IgYXJnIChzZXRxIGFyZyAxKSkKKyAgKGNvbmQKKyAgIDs7IFNlYXJjaCBiYWNrd2FyZAorICAgKCg+IGFyZyAwKQorICAgICh3aGlsZSAoYW5kICg+IGFyZyAwKQorCQkoYW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAxKQorCQkgICAgIChsZXQgKChzdGFydCAocG9pbnQpKQorCQkJICAgKG5hbWUgKGVybGFuZy1uYW1lLW9mLWZ1bmN0aW9uKSkKKwkJCSAgIChhcml0eSAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eSkpKQorCQkgICAgICAgOzsgTm90ZTogImFyaXR5IiBpcyBuaWwgZm9yIGUuZy4gIi1pbXBvcnQiLCBoZW5jZQorCQkgICAgICAgOzsgdHdvICItaW1wb3J0IiBjbGF1c2VzIGFyZSBub3QgY29uc2lkZXJlZCB0bworCQkgICAgICAgOzsgYmUgcGFydCBvZiB0aGUgc2FtZSBmdW5jdGlvbi4KKwkJICAgICAgICh3aGlsZSAoYW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAxKQorCQkJCSAgIChzdHJpbmctZXF1YWwgbmFtZQorCQkJCQkJIChlcmxhbmctbmFtZS1vZi1mdW5jdGlvbikpCisJCQkJICAgYXJpdHkKKwkJCQkgICAoZXF1YWwgYXJpdHkKKwkJCQkJICAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eSkpKQorCQkJIChzZXRxIHN0YXJ0IChwb2ludCkpKQorCQkgICAgICAgKGdvdG8tY2hhciBzdGFydCkKKwkJICAgICAgIHQpKSkKKyAgICAgIChzZXRxIGFyZyAoMS0gYXJnKSkpKQorICAgOzsgU2VhcmNoIGZvcndhcmQKKyAgICgoPCBhcmcgMCkKKyAgICAoZW5kLW9mLWxpbmUpCisgICAgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlIDEpCisgICAgOzsgU3RlcCAtYXJnIGZ1bmN0aW9ucyBmb3J3YXJkLgorICAgICh3aGlsZSAoYW5kICg8IGFyZyAwKQorCQk7OyBTdGVwIG9uZSBmdW5jdGlvbiBmb3J3YXJkLCBvciBzdG9wIGlmIHRoZSBlbmQgb2YKKwkJOzsgdGhlIGJ1ZmZlciB3YXMgcmVhY2hlZC4gIFJldHVybiB0IGlmIHdlIGZvdW5kIHRoZQorCQk7OyBmdW5jdGlvbi4KKwkJKGxldCAoKG5hbWUgKGVybGFuZy1uYW1lLW9mLWZ1bmN0aW9uKSkKKwkJICAgICAgKGFyaXR5IChlcmxhbmctZ2V0LWZ1bmN0aW9uLWFyaXR5KSkKKwkJICAgICAgKGZvdW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAtMSkpKQorCQkgICh3aGlsZSAoYW5kIGZvdW5kCisJCQkgICAgICAoc3RyaW5nLWVxdWFsIG5hbWUgKGVybGFuZy1uYW1lLW9mLWZ1bmN0aW9uKSkKKwkJCSAgICAgIGFyaXR5CisJCQkgICAgICAoZXF1YWwgYXJpdHkKKwkJCQkgICAgIChlcmxhbmctZ2V0LWZ1bmN0aW9uLWFyaXR5KSkpCisJCSAgICAoc2V0cSBmb3VuZCAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgLTEpKSkKKwkJICBmb3VuZCkpCisgICAgICAoc2V0cSBhcmcgKDErIGFyZykpKSkpCisgICh6ZXJvcCBhcmcpKQorCisKKyhkZWZ1biBlcmxhbmctZW5kLW9mLWZ1bmN0aW9uICgmb3B0aW9uYWwgYXJnKQorICAiTW92ZSBmb3J3YXJkIHRvIG5leHQgZW5kIG9mIGZ1bmN0aW9uLgorCitXaXRoIGFyZ3VtZW50LCBkbyB0aGlzIHRoYXQgbWFueSB0aW1lcy4KK1dpdGggbmVnYXRpdmUgYXJndW1lbnQgZ28gdG93YXJkcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuIgorICAoaW50ZXJhY3RpdmUgInAiKQorICAob3IgYXJnIChzZXRxIGFyZyAxKSkKKyAgKGxldCAoKGZpcnN0IHQpKQorICAgIDs7IEZvcndhcmQKKyAgICAod2hpbGUgKGFuZCAoPiBhcmcgMCkgKDwgKHBvaW50KSAocG9pbnQtbWF4KSkpCisgICAgICAobGV0ICgocG9zIChwb2ludCkpKQorCSh3aGlsZSAocHJvZ24KKwkJIChpZiAoYW5kIGZpcnN0CisJCQkgIChwcm9nbgorCQkJICAgIChmb3J3YXJkLWNoYXIgMSkKKwkJCSAgICAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgMSkpKQorCQkgICAgIG5pbAorCQkgICAob3IgKGJvYnApIChmb3J3YXJkLWNoYXIgLTEpKQorCQkgICAoZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UgLTEpKQorCQkgKHNldHEgZmlyc3QgbmlsKQorCQkgKGVybGFuZy1wYXNzLW92ZXItZnVuY3Rpb24pCisJCSAoc2tpcC1jaGFycy1mb3J3YXJkICIgXHQiKQorCQkgKGlmIChsb29raW5nLWF0ICJbJVxuXSIpCisJCSAgICAgKGZvcndhcmQtbGluZSAxKSkKKwkJICg8PSAocG9pbnQpIHBvcykpKSkKKyAgICAgIChzZXRxIGFyZyAoMS0gYXJnKSkpCisgICAgOzsgQmFja3dhcmQKKyAgICAod2hpbGUgKDwgYXJnIDApCisgICAgICAobGV0ICgocG9zIChwb2ludCkpKQorCShlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSAxKQorCShlcmxhbmctcGFzcy1vdmVyLWZ1bmN0aW9uKQorCShmb3J3YXJkLWxpbmUgMSkKKwkoaWYgKD49IChwb2ludCkgcG9zKQorCSAgICAoaWYgKGVybGFuZy1iZWdpbm5pbmctb2YtZnVuY3Rpb24gMikKKwkJKHByb2duCisJCSAgKGVybGFuZy1wYXNzLW92ZXItZnVuY3Rpb24pCisJCSAgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKKwkJICAoaWYgKGxvb2tpbmctYXQgIlslXG5dIikKKwkJICAgICAgKGZvcndhcmQtbGluZSAxKSkpCisJICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkpKSkKKyAgICAgIChzZXRxIGFyZyAoMSsgYXJnKSkpKSkKKworKGRlZnVuIGVybGFuZy1tYXJrLWZ1bmN0aW9uICgpCisgICJQdXQgbWFyayBhdCBlbmQgb2YgZnVuY3Rpb24sIHBvaW50IGF0IGJlZ2lubmluZy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHB1c2gtbWFyayAocG9pbnQpKQorICAoZXJsYW5nLWVuZC1vZi1mdW5jdGlvbiAxKQorICA7OyBTZXRzIHRoZSByZWdpb24uIEluIEVtYWNzIDE5IGFuZCBYRW1hY3MsIHdlIHdhbnRzIHRvIGFjdGl2YXRlCisgIDs7IHRoZSByZWdpb24uCisgIChjb25kaXRpb24tY2FzZSBuaWwKKyAgICAgIChwdXNoLW1hcmsgKHBvaW50KSBuaWwgdCkKKyAgICAoZXJyb3IgKHB1c2gtbWFyayAocG9pbnQpKSkpCisgIChlcmxhbmctYmVnaW5uaW5nLW9mLWZ1bmN0aW9uIDEpCisgIDs7IFRoZSBhYm92ZSBmdW5jdGlvbiBkZWFjdGl2YXRlcyB0aGUgbWFyay4KKyAgKGlmIChib3VuZHAgJ2RlYWN0aXZhdGUtbWFyaykKKyAgICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkgJ2RlYWN0aXZhdGUtbWFyayBuaWwpKSkKKworKGRlZnVuIGVybGFuZy1wYXNzLW92ZXItZnVuY3Rpb24gKCkKKyAgKHdoaWxlIChwcm9nbgorCSAgIChlcmxhbmctc2tpcC1ibGFuaykKKwkgICAoYW5kIChub3QgKGxvb2tpbmctYXQgIlxcLlxcKFxccyBcXHxcblxcfFxcczxcXCkiKSkKKwkJKG5vdCAoZW9icCkpKSkKKyAgICAoZm9yd2FyZC1zZXhwIDEpKQorICAoaWYgKG5vdCAoZW9icCkpCisgICAgICAoZm9yd2FyZC1jaGFyIDEpKSkKKworKGRlZnVuIGVybGFuZy1uYW1lLW9mLWZ1bmN0aW9uICgpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIDs7IFNraXAgb3ZlciBhdHRyaWJ1dGUgbGVhZGVyLgorICAgIChpZiAobG9va2luZy1hdCAiLVsgXHRdKiIpCisJKHJlLXNlYXJjaC1mb3J3YXJkICItWyBcdF0qIiBuaWwgJ21vdmUpKQorICAgIChsZXQgKChzdGFydCAocG9pbnQpKSkKKyAgICAgIChmb3J3YXJkLXNleHAgMSkKKyAgICAgIChidWZmZXItc3Vic3RyaW5nIHN0YXJ0IChwb2ludCkpKSkpCisKKwwKKzs7OyBNaXNjZWxsYW5lb3VzCisKKyhkZWZ1biBlcmxhbmctZmlsbC1wYXJhZ3JhcGggKCZvcHRpb25hbCBqdXN0aWZ5KQorICAiTGlrZSBcXFtmaWxsLXBhcmFncmFwaF0sIGJ1dCBoYW5kbGUgRXJsYW5nIGNvbW1lbnRzLgorSWYgYW55IG9mIHRoZSBjdXJyZW50IGxpbmUgaXMgYSBjb21tZW50LCBmaWxsIHRoZSBjb21tZW50IG9yIHRoZQorcGFyYWdyYXBoIG9mIGl0IHRoYXQgcG9pbnQgaXMgaW4sIHByZXNlcnZpbmcgdGhlIGNvbW1lbnQncyBpbmRlbnRhdGlvbgorYW5kIGluaXRpYWwgYCUnOnMuIgorICAoaW50ZXJhY3RpdmUgIlAiKQorICAobGV0ICgoaGFzLWNvbW1lbnQgbmlsKQorCTs7IElmIGhhcy1jb21tZW50LCB0aGUgYXBwcm9wcmlhdGUgZmlsbC1wcmVmaXggZm9yIHRoZSBjb21tZW50LgorCWNvbW1lbnQtZmlsbC1wcmVmaXgpCisgICAgOzsgRmlndXJlIG91dCB3aGF0IGtpbmQgb2YgY29tbWVudCB3ZSBhcmUgbG9va2luZyBhdC4KKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChiZWdpbm5pbmctb2YtbGluZSkKKyAgICAgIChjb25kCisgICAgICAgOzsgRmluZCB0aGUgY29tbWFuZCBwcmVmaXguCisgICAgICAgKChsb29raW5nLWF0IChjb25jYXQgIlxccyAqIiBjb21tZW50LXN0YXJ0LXNraXApKQorCShzZXRxIGhhcy1jb21tZW50IHQpCisJKHNldHEgY29tbWVudC1maWxsLXByZWZpeCAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDApCisJCQkJCQkgICAgKG1hdGNoLWVuZCAwKSkpKQorICAgICAgIDs7IEEgbGluZSB3aXRoIHNvbWUgY29kZSwgZm9sbG93ZWQgYnkgYSBjb21tZW50PyAgUmVtZW1iZXIgdGhhdCB0aGUKKyAgICAgICA7OyAlIHdoaWNoIHN0YXJ0cyB0aGUgY29tbWVudCBzaG91bGRuJ3QgYmUgcGFydCBvZiBhIHN0cmluZyBvcgorICAgICAgIDs7IGNoYXJhY3Rlci4KKyAgICAgICAoKHByb2duCisJICAod2hpbGUgKG5vdCAobG9va2luZy1hdCAiJVxcfCQiKSkKKwkgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiXiVcblwiXFxcXCIpCisJICAgIChjb25kCisJICAgICAoKGVxIChjaGFyLWFmdGVyIChwb2ludCkpID9cXCkgKGZvcndhcmQtY2hhciAyKSkKKwkgICAgICgoZXEgKGNoYXItYWZ0ZXIgKHBvaW50KSkgP1wiKSAoZm9yd2FyZC1zZXhwIDEpKSkpCisJICAobG9va2luZy1hdCBjb21tZW50LXN0YXJ0LXNraXApKQorCShzZXRxIGhhcy1jb21tZW50IHQpCisJKHNldHEgY29tbWVudC1maWxsLXByZWZpeAorCSAgICAgIChjb25jYXQgKG1ha2Utc3RyaW5nIChjdXJyZW50LWNvbHVtbikgPyApCisJCSAgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMCkgKG1hdGNoLWVuZCAwKSkpKSkpKQorICAgIChpZiAobm90IGhhcy1jb21tZW50KQorCShmaWxsLXBhcmFncmFwaCBqdXN0aWZ5KQorICAgICAgOzsgTmFycm93IHRvIGluY2x1ZGUgb25seSB0aGUgY29tbWVudCwgYW5kIHRoZW4gZmlsbCB0aGUgcmVnaW9uLgorICAgICAgKHNhdmUtcmVzdHJpY3Rpb24KKwkobmFycm93LXRvLXJlZ2lvbgorCSA7OyBGaW5kIHRoZSBmaXJzdCBsaW5lIHdlIHNob3VsZCBpbmNsdWRlIGluIHRoZSByZWdpb24gdG8gZmlsbC4KKwkgKHNhdmUtZXhjdXJzaW9uCisJICAgKHdoaWxlIChhbmQgKHplcm9wIChmb3J3YXJkLWxpbmUgLTEpKQorCQkgICAgICAgKGxvb2tpbmctYXQgIl5cXHMgKiUiKSkpCisJICAgOzsgV2UgbWF5IGhhdmUgZ29uZSB0byBmYXIuICBHbyBmb3J3YXJkIGFnYWluLgorCSAgIChvciAobG9va2luZy1hdCAiXlxccyAqJSIpCisJICAgICAgIChmb3J3YXJkLWxpbmUgMSkpCisJICAgKHBvaW50KSkKKwkgOzsgRmluZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBsaW5lIHBhc3QgdGhlIHJlZ2lvbiB0byBmaWxsLgorCSAoc2F2ZS1leGN1cnNpb24KKwkgICAod2hpbGUgKHByb2duIChmb3J3YXJkLWxpbmUgMSkKKwkJCSAobG9va2luZy1hdCAiXlxccyAqJSIpKSkKKwkgICAocG9pbnQpKSkKKwk7OyBMaW5lcyB3aXRoIG9ubHkgJSBvbiB0aGVtIGNhbiBiZSBwYXJhZ3JhcGggYm91bmRhcmllcy4KKwkobGV0ICgocGFyYWdyYXBoLXN0YXJ0IChjb25jYXQgcGFyYWdyYXBoLXN0YXJ0ICJcXHxeWyBcdCVdKiQiKSkKKwkgICAgICAocGFyYWdyYXBoLXNlcGFyYXRlIChjb25jYXQgcGFyYWdyYXBoLXN0YXJ0ICJcXHxeWyBcdCVdKiQiKSkKKwkgICAgICAoZmlsbC1wcmVmaXggY29tbWVudC1maWxsLXByZWZpeCkpCisJICAoZmlsbC1wYXJhZ3JhcGgganVzdGlmeSkpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctdW5jb21tZW50LXJlZ2lvbiAoYmVnIGVuZCkKKyAgIlVuY29tbWVudCBhbGwgY29tbWVudGVkIGxpbmVzIGluIHRoZSByZWdpb24uIgorICAoaW50ZXJhY3RpdmUgInIiKQorICAoY29tbWVudC1yZWdpb24gYmVnIGVuZCAtMSkpCisKKworKGRlZnVuIGVybGFuZy1nZW5lcmF0ZS1uZXctY2xhdXNlICgpCisgICJDcmVhdGUgYWRkaXRpb25hbCBFcmxhbmcgY2xhdXNlIGhlYWRlci4KKworUGFyc2VzIHRoZSBzb3VyY2UgZmlsZSBmb3IgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgRXJsYW5nIGZ1bmN0aW9uLgorQ3JlYXRlIHRoZSBoZWFkZXIgY29udGFpbmluZyB0aGUgbmFtZSwgQSBwYWlyIG9mIHBhcmVudGhlc2VzLAorYW5kIGFuIGFycm93LiBUaGUgc3BhY2UgYmV0d2VlbiB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlCitmaXJzdCBwYXJlbnRoZXNpcyBpcyBwcmVzZXJ2ZWQuICBUaGUgcG9pbnQgaXMgcGxhY2VkIGJldHdlZW4KK3RoZSBwYXJlbnRoZXNlcy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCAoKG5hbWUgKHNhdmUtZXhjdXJzaW9uCisJCShhbmQgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlKQorCQkgICAgIChlcmxhbmctZ2V0LWZ1bmN0aW9uLW5hbWUgdCkpKSkKKwkoYXJyb3cgKHNhdmUtZXhjdXJzaW9uCisJCShhbmQgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlKQorCQkgICAgIChlcmxhbmctZ2V0LWZ1bmN0aW9uLWFycm93KSkpKSkKKyAgICAoaWYgKG9yIChudWxsIGFycm93KSAobnVsbCBuYW1lKSkKKwkoZXJyb3IgIkNhbid0IGZpbmQgbmFtZSBvZiBjdXJyZW50IEVybGFuZyBmdW5jdGlvbi4iKSkKKyAgICAoaWYgKGFuZCAoYm9scCkgKGVvbHApKQorCW5pbAorICAgICAgKGVuZC1vZi1saW5lKQorICAgICAgKG5ld2xpbmUpKQorICAgIChpbnNlcnQgbmFtZSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChpbnNlcnQgKGNvbmNhdCAiKSAiIGFycm93KSkpCisgICAgKGlmIGVybGFuZy1uZXctY2xhdXNlLXdpdGgtYXJndW1lbnRzCisJKGVybGFuZy1jbG9uZS1hcmd1bWVudHMpKSkpCisKKworKGRlZnVuIGVybGFuZy1jbG9uZS1hcmd1bWVudHMgKCkKKyAgIkluc2VydCwgYXQgdGhlIHBvaW50LCB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgcHJldmlvdXMgY2xhdXNlLgorCitUaGUgbWFyayBpcyBzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5zZXJ0ZWQgdGV4dCwgdGhlIHBvaW50CithdCB0aGUgZW5kLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoYXJncyAoc2F2ZS1leGN1cnNpb24KKwkJKGJlZ2lubmluZy1vZi1saW5lKQorCQkoYW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKKwkJICAgICAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcmd1bWVudHMpKSkpCisJKHAgKHBvaW50KSkpCisgICAgKGlmIChudWxsIGFyZ3MpCisJKGVycm9yICJDYW4ndCBjbG9uZSBhcmd1bWVudCBsaXN0LiIpKQorICAgIChpbnNlcnQgYXJncykKKyAgICAoc2V0LW1hcmsgcCkpKQorDAorOzs7IEluZm9ybWF0aW9uIHJldHJlaXZhbCBmdW5jdGlvbnMuCisKKyhkZWZ1biBlcmxhbmctYnVmZmVyLXN1YnN0cmluZyAoYmVnIGVuZCkKKyAgIkxpa2UgYGJ1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcycuCitBbHRob3VnaCwgdGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbGwgdmVyc2lvbnMgb2YgRW1hY3MuIgorICAoaWYgKGZib3VuZHAgJ2J1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcykKKyAgICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2J1ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcykgYmVnIGVuZCkKKyAgICAoYnVmZmVyLXN1YnN0cmluZyBiZWcgZW5kKSkpCisKKworKGRlZnVuIGVybGFuZy1nZXQtbW9kdWxlICgpCisgICJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBhcyBzcGVjaWZpZWQgYnkgYC1tb2R1bGUnLgorCitSZXR1cm4gbmlsIGlmIGZpbGUgY29udGFpbnMgbm8gYC1tb2R1bGUnIGF0dHJpYnV0ZS4iCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChzYXZlLXJlc3RyaWN0aW9uCisgICAgICAod2lkZW4pCisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgKGxldCAoKG1kIChtYXRjaC1kYXRhKSkpCisJKHVud2luZC1wcm90ZWN0CisJICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQKKwkJIChjb25jYXQgIl4tbW9kdWxlXFxzICooXFxzICpcXChcXCgiCisJCQkgZXJsYW5nLWF0b20tcmVnZXhwCisJCQkgIlxcKT9cXClcXHMgKilcXHMgKlxcLiIpCisJCSAocG9pbnQtbWF4KSB0KQorCQkoZXJsYW5nLXJlbW92ZS1xdW90ZXMKKwkJIChlcmxhbmctYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDEpCisJCQkJCSAgKG1hdGNoLWVuZCAxKSkpCisJICAgICAgbmlsKQorCSAgKHN0b3JlLW1hdGNoLWRhdGEgbWQpKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUgKCZvcHRpb25hbCBmaWxlKQorICAiRXh0cmFjdCB0aGUgbW9kdWxlIG5hbWUgZnJvbSBhIGZpbGUgbmFtZS4KKworRmlyc3QsIHRoZSBkaXJlY3RvcnkgcGFydCBpcyByZW1vdmVkLiAgU2Vjb25kLCB0aGUgcGFydCBvZiB0aGUgZmlsZSBuYW1lCittYXRjaGluZyBgZXJsYW5nLWZpbGUtbmFtZS1leHRlbnNpb24tcmVnZXhwJyBpcyByZW1vdmVkLgorCitTaG91bGQgdGhlIG1hdGNoIGZhaWwsIG5pbCBpcyByZXR1cm5lZC4KKworQnkgbW9kaWZ5aW5nIGBlcmxhbmctZmlsZS1uYW1lLWV4dGVuc2lvbi1yZWdleHAnIHRvIG1hdGNoIGZpbGVzIG90aGVyCit0aGFuIEVybGFuZyBzb3VyY2UgZmlsZXMsIEVybGFuZyBzcGVjaWZpYyBmdW5jdGlvbnMgY291bGQgYmUgYXBwbGllZCBvbgorbm9uLUVybGFuZyBmaWxlcy4gIE1vc3Qgbm90YWJseTsgdGhlIHN1cHBvcnQgZm9yIEVybGFuZyBtb2R1bGVzIGluIHRoZQordGFncyBzeXN0ZW0gY291bGQgYmUgdXNlZCBieSBmaWxlcyB3cml0dGVuIGluIG90aGVyIGxhbmd1YWdlcy4iCisgIChvciBmaWxlIChzZXRxIGZpbGUgYnVmZmVyLWZpbGUtbmFtZSkpCisgIChpZiAobnVsbCBmaWxlKQorICAgICAgbmlsCisgICAgKHNldHEgZmlsZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBmaWxlKSkKKyAgICAoaWYgKHN0cmluZy1tYXRjaCBlcmxhbmctZmlsZS1uYW1lLWV4dGVuc2lvbi1yZWdleHAgZmlsZSkKKwkoc3Vic3RyaW5nIGZpbGUgMCAobWF0Y2gtYmVnaW5uaW5nIDApKQorICAgICAgbmlsKSkpCisKKworOzsgVXNlZCBieSBgZXJsYW5nLWdldC1leHBvcnQnIGFuZCBgZXJsYW5nLWdldC1pbXBvcnQnLgorCisoZGVmdW4gZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eS1saXN0ICgpCisgICJQYXJzZXMgbGlzdCBvZiBgZnVuY3Rpb24vYXJpdHknIGFzIHVzZWQgYnkgYC1pbXBvcnQnIGFuZCBgLWV4cG9ydCcuCisKK1RoZSBwb2ludCBtdXN0IGJlIHBsYWNlZCBhdCBiZWZvcmUgdGhlIG9wZW5pbmcgYnJhY2tldC4gIFdoZW4gdGhlCitmdW5jdGlvbiByZXR1cm5zIHRoZSBwb2ludCB3aWxsIGJlIHBsYWNlZCBhZnRlciB0aGUgY2xvc2luZyBicmFja2V0LgorCitUaGUgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBsaXN0IGlzIGluY29ycmVjdGx5Citmb3JtYXR0ZWQuCisKK1JldHVybiBsaXN0IG9mIChmdW5jdGlvbiAuIGFyaXR5KS4gIFRoZSBvcmRlciBvZiB0aGUgcmV0dXJuZWQgbGlzdAorY29ycmVzcG9uZHMgdG8gdGhlIG9yZGVyIG9mIHRoZSBwYXJzZWQgRXJsYW5nIGxpc3QuIgorICAobGV0ICgocmVzICcoKSkpCisgICAgKGVybGFuZy1za2lwLWJsYW5rKQorICAgIChmb3J3YXJkLWNoYXIgMSkKKyAgICAoaWYgKG5vdCAoZXEgKHByZWNlZGluZy1jaGFyKSA/XFspKQorCScoKQkJCQk7IE5vdCBsb29raW5nIGF0IGFuIEVybGFuZyBsaXN0LgorICAgICAgKHdoaWxlCQkJCTsgTm90ZTogYHdoaWxlJyBoYXMgbm8gYm9keS4KKwkgIChwcm9nbgorCSAgICAoZXJsYW5nLXNraXAtYmxhbmspCisJICAgIChhbmQgKGxvb2tpbmctYXQgKGNvbmNhdCBlcmxhbmctYXRvbS1yZWdleHAKKwkJCQkgICAgICIvXFwoWzAtOV0rXFwpXFw+IikpCisJCSAocHJvZ24KKwkJICAgKHNldHEgcmVzIChjb25zCisJCQkgICAgICAoY29ucworCQkJICAgICAgIChlcmxhbmctcmVtb3ZlLXF1b3RlcworCQkJCShlcmxhbmctYnVmZmVyLXN1YnN0cmluZworCQkJCSAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpKQorCQkJICAgICAgIChzdHJpbmctdG8taW50CisJCQkJKGVybGFuZy1idWZmZXItc3Vic3RyaW5nCisJCQkJIChtYXRjaC1iZWdpbm5pbmcKKwkJCQkgICgrIDEgZXJsYW5nLWF0b20tcmVnZXhwLW1hdGNoZXMpKQorCQkJCSAobWF0Y2gtZW5kCisJCQkJICAoKyAxIGVybGFuZy1hdG9tLXJlZ2V4cC1tYXRjaGVzKSkpKSkKKwkJCSAgICAgIHJlcykpCisJCSAgIChnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkKKwkJICAgKGVybGFuZy1za2lwLWJsYW5rKQorCQkgICAoZm9yd2FyZC1jaGFyIDEpCisJCSAgIDs7IFRlc3QgaWYgdGhlcmUgYXJlIG1vcmUgZXhwb3J0ZWQgZnVuY3Rpb25zLgorCQkgICAoZXEgKHByZWNlZGluZy1jaGFyKSA/LCkpKSkpKQorICAgIChucmV2ZXJzZSByZXMpKSkKKworCis7OzsgIE5vdGUgdGhhdCBgLWV4cG9ydCcgYW5kIHRoZSBvcGVuIHBhcmVudGhlc2lzIG11c3QgYmUgd3JpdHRlbiBvbgorOzs7ICB0aGUgc2FtZSBsaW5lLgorCisoZGVmdW4gZXJsYW5nLWdldC1leHBvcnQgKCkKKyAgIlJldHVybiBhIGxpc3Qgb2YgYChmdW5jdGlvbiAuIGFyaXR5KScgYXMgc3BlY2lmaWVkIGJ5IGAtZXhwb3J0Jy4iCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgKGxldCAoKG1kIChtYXRjaC1kYXRhKSkKKwkgIChyZXMgJygpKSkKKyAgICAgICh1bndpbmQtcHJvdGVjdAorCSAgKHByb2duCisJICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIl4tZXhwb3J0XFxzICooIiAocG9pbnQtbWF4KSB0KQorCSAgICAgIChlcmxhbmctc2tpcC1ibGFuaykKKwkgICAgICAoc2V0cSByZXMgKG5jb25jIHJlcyAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eS1saXN0KSkpKQorCSAgICByZXMpCisJKHN0b3JlLW1hdGNoLWRhdGEgbWQpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctZ2V0LWltcG9ydCAoKQorICAiUGFyc2UgYW4gRXJsYW5nIHNvdXJjZSBmaWxlIGZvciBpbXBvcnRlZCBmdW5jdGlvbnMuCisKK1JldHVybiBhbiBhbGlzdCB3aXRoIG1vZHVsZSBuYW1lIGFzIGNhciBwYXJ0IGFuZCBsaXN0IG9mIGNvbnNlcyBjb250YWluaW5nCitmdW5jdGlvbiBhbmQgYXJpdHkgYXMgY2RyIHBhcnQuIgorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgIChsZXQgKChtZCAobWF0Y2gtZGF0YSkpCisJICAocmVzICcoKSkpCisgICAgICAodW53aW5kLXByb3RlY3QKKwkgIChwcm9nbgorCSAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJeLWltcG9ydFxccyAqKCIgKHBvaW50LW1heCkgdCkKKwkgICAgICAoZXJsYW5nLXNraXAtYmxhbmspCisJICAgICAgKGlmIChsb29raW5nLWF0IGVybGFuZy1hdG9tLXJlZ2V4cCkKKwkJICAobGV0ICgobW9kdWxlIChlcmxhbmctcmVtb3ZlLXF1b3RlcworCQkJCSAoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcKKwkJCQkgIChtYXRjaC1iZWdpbm5pbmcgMCkKKwkJCQkgIChtYXRjaC1lbmQgMCkpKSkpCisJCSAgICAoZ290by1jaGFyIChtYXRjaC1lbmQgMCkpCisJCSAgICAoZXJsYW5nLXNraXAtYmxhbmspCisJCSAgICAoaWYgKGVxIChmb2xsb3dpbmctY2hhcikgPywpCisJCQkocHJvZ24KKwkJCSAgKGZvcndhcmQtY2hhciAxKQorCQkJICAoZXJsYW5nLXNraXAtYmxhbmspCisJCQkgIChsZXQgKChmdW5jcyAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eS1saXN0KSkKKwkJCQkocGFpciAoYXNzb2MgbW9kdWxlIHJlcykpKQorCQkJICAgIChpZiBwYWlyCisJCQkJKHNldGNkciBwYWlyIChuY29uYyAoY2RyIHBhaXIpIGZ1bmNzKSkKKwkJCSAgICAgIChzZXRxIHJlcyAoY29ucyAoY29ucyBtb2R1bGUgZnVuY3MpCisJCQkJCSAgICAgIHJlcykpKSkpKSkpKQorCSAgICAobnJldmVyc2UgcmVzKSkKKwkoc3RvcmUtbWF0Y2gtZGF0YSBtZCkpKSkpCisKKworKGRlZnVuIGVybGFuZy1nZXQtZnVuY3Rpb24tbmFtZSAoJm9wdGlvbmFsIGFyZykKKyAgIlJldHVybiBuYW1lIG9mIGN1cnJlbnQgZnVuY3Rpb24sIG9yIG5pbC4KKworSWYgb3B0aW9uYWwgYXJndW1lbnQgaXMgbm9uLW5pbCwgZXZlcnl0aGluZyB1cCB0byBhbmQgaW5jbHVkaW5nCit0aGUgZmlyc3QgYCgnIGlzIHJldHVybmVkLgorCitOb3JtYWxseSB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBgZXJsYW5nLWJlZ2lubmluZy1vZi1jbGF1c2UnLCBlLmcuOgorICAgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgICAoaWYgKG5vdCAoZW9icCkpIChmb3J3YXJkLWNoYXIgMSkpCisJCShhbmQgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlKQorCQkgICAgIChlcmxhbmctZ2V0LWZ1bmN0aW9uLW5hbWUgdCkpKSIKKyAgKGxldCAoKG4gKGlmIGFyZyAwIDEpKSkKKyAgICAoYW5kIChsb29raW5nLWF0IChjb25jYXQgIl4iIGVybGFuZy1hdG9tLXJlZ2V4cCAiXFxzICooIikpCisJIChlcmxhbmctYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIG4pIChtYXRjaC1lbmQgbikpKSkpCisKKworKGRlZnVuIGVybGFuZy1nZXQtZnVuY3Rpb24tYXJyb3cgKCkKKyAgIlJldHVybiBhcnJvdyBvZiBjdXJyZW50IGZ1bmN0aW9uLCBjb3VsZCBiZSBcIi0+XCIsIFwiOi1cIiBvciBuaWwuCisKK1RoZSBcIjotXCIgYXJyb3cgaXMgdXNlZCBieSBtbmVzaWEgcXVlcmllcy4KKworTm9ybWFsbHkgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggYGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlJywgZS5nLjoKKyAgICAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCisgICAgICAgICAgICAgICAgKGlmIChub3QgKGVvYnApKSAoZm9yd2FyZC1jaGFyIDEpKQorCQkoYW5kIChlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKKwkJICAgICAoZXJsYW5nLWdldC1mdW5jdGlvbi1hcnJvdykpKSIKKyAgKGFuZCAobG9va2luZy1hdCAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIlxccyAqXFwoKFxcKSIpKQorICAgICAgIChjb25kaXRpb24tY2FzZSAoKQorCSAgIChzYXZlLWV4Y3Vyc2lvbgorCSAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nICgrIDEgZXJsYW5nLWF0b20tcmVnZXhwLW1hdGNoZXMpKSkKKwkgICAgIChmb3J3YXJkLXNleHAgMSkKKwkgICAgIChlcmxhbmctc2tpcC1ibGFuaykKKwkgICAgIChhbmQgKGxvb2tpbmctYXQgIi0+XFx8Oi0iKQorCQkgIChlcmxhbmctYnVmZmVyLXN1YnN0cmluZworCQkgICAobWF0Y2gtYmVnaW5uaW5nIDApIChtYXRjaC1lbmQgMCkpKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLWdldC1mdW5jdGlvbi1hcml0eSAoKQorICAiUmV0dXJuIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIG9mIGZ1bmN0aW9uIGF0IHBvaW50LCBvciBuaWwuIgorICAoYW5kIChsb29raW5nLWF0IChjb25jYXQgIl4iIGVybGFuZy1hdG9tLXJlZ2V4cCAiXFxzICooIikpCisgICAgICAgKHNhdmUtZXhjdXJzaW9uCisJIChnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkKKwkgKGNvbmRpdGlvbi1jYXNlIG5pbAorCSAgICAgKGxldCAoKHJlcyAwKQorCQkgICAoY29udCB0KSkKKwkgICAgICAgKHdoaWxlIGNvbnQKKwkJIChjb25kICgoZW9icCkKKwkJCShzZXRxIHJlcyBuaWwpCisJCQkoc2V0cSBjb250IG5pbCkpCisJCSAgICAgICAoKGxvb2tpbmctYXQgIlxccyAqKSIpCisJCQkoc2V0cSBjb250IG5pbCkpCisJCSAgICAgICAoKGxvb2tpbmctYXQgIlxccyAqXFwoJFxcfCVcXCkiKQorCQkJKGZvcndhcmQtbGluZSAxKSkKKwkJICAgICAgICgobG9va2luZy1hdCAiXFxzICosIikKKwkJCShnb3RvLWNoYXIgKG1hdGNoLWVuZCAwKSkpCisJCSAgICAgICAodAorCQkJKHNldHEgcmVzICgrIDEgcmVzKSkKKwkJCShmb3J3YXJkLXNleHAgMSkpKSkKKwkgICAgICAgcmVzKQorCSAgIChlcnJvciBuaWwpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctZ2V0LWZ1bmN0aW9uLWFyZ3VtZW50cyAoKQorICAiUmV0dXJuIGFyZ3VtZW50cyBvZiBjdXJyZW50IGZ1bmN0aW9uLCBvciBuaWwuIgorICAoaWYgKG5vdCAobG9va2luZy1hdCAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIlxccyAqKCIpKSkKKyAgICAgIG5pbAorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKGNvbmRpdGlvbi1jYXNlIG5pbAorCSAgKGxldCAoKHN0YXJ0IChtYXRjaC1lbmQgMCkpKQorCSAgICAoZ290by1jaGFyICgtIHN0YXJ0IDEpKQorCSAgICAoZm9yd2FyZC1zZXhwKQorCSAgICAoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcgc3RhcnQgKC0gKHBvaW50KSAxKSkpCisJKGVycm9yIG5pbCkpKSkpCisKKworKGRlZnVuIGVybGFuZy1nZXQtZnVuY3Rpb24tdW5kZXItcG9pbnQgKCkKKyAgIlJldHVybiB0aGUgbW9kdWxlIGFuZCBmdW5jdGlvbiB1bmRlciB0aGUgcG9pbnQsIG9yIG5pbC4KKworU2hvdWxkIG5vIGV4cGxpY2l0IG1vZHVsZSBuYW1lIGJlIHByZXNlbnQgYXQgdGhlIHBvaW50LCB0aGUKK2xpc3Qgb2YgaW1wb3J0ZWQgZnVuY3Rpb25zIGlzIHNlYXJjaGVkLgorCitUaGUgZm9sbG93aW5nIGNvdWxkIGJlIHJldHVyZWQ6CisgICAoXCJtb2R1bGVcIiAgXCJmdW5jdGlvblwiKSAgICAtLSBCb3RoIG1vZHVsZSBhbmQgZnVuY3Rpb24gbmFtZSBmb3VuZC4KKyAgIChuaWwgICAgICAgXCJmdW5jdGlvblwiKSAgICAtLSBObyBtb2R1bGUgbmFtZSB3YXMgZm91bmQuCisgICBuaWwgICAgICAgICAgICAgICAgICAgICAgIC0tIE5vIGZ1bmN0aW9uIG5hbWUgZm91bmQKKworSW4gdGhlIGZ1dHVyZSB0aGUgbGlzdCBtYXkgY29udGFpbiBtb3JlIGVsZW1lbnRzLiIKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKGxldCAoKG1kIChtYXRjaC1kYXRhKSkKKwkgIChyZXMgbmlsKSkKKyAgICAgIChpZiAoZXEgKGNoYXItc3ludGF4IChmb2xsb3dpbmctY2hhcikpID8gKQorCSAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpKQorICAgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgImEtekEtWjAtOV86JyIpCisgICAgICAoY29uZCAoKGxvb2tpbmctYXQgKGNvbmNhdCBlcmxhbmctYXRvbS1yZWdleHAgIjoiIGVybGFuZy1hdG9tLXJlZ2V4cCkpCisJICAgICAoc2V0cSByZXMgKGxpc3QKKwkJCShlcmxhbmctcmVtb3ZlLXF1b3RlcworCQkJIChlcmxhbmctYnVmZmVyLXN1YnN0cmluZworCQkJICAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpKQorCQkJKGVybGFuZy1yZW1vdmUtcXVvdGVzCisJCQkgKGVybGFuZy1idWZmZXItc3Vic3RyaW5nCisJCQkgIChtYXRjaC1iZWdpbm5pbmcgKDErIGVybGFuZy1hdG9tLXJlZ2V4cC1tYXRjaGVzKSkKKwkJCSAgKG1hdGNoLWVuZCAoMSsgZXJsYW5nLWF0b20tcmVnZXhwLW1hdGNoZXMpKSkpKSkpCisJICAgICgobG9va2luZy1hdCBlcmxhbmctYXRvbS1yZWdleHApCisJICAgICAobGV0ICgoZmsgKGVybGFuZy1yZW1vdmUtcXVvdGVzCisJCQkoZXJsYW5nLWJ1ZmZlci1zdWJzdHJpbmcKKwkJCSAobWF0Y2gtYmVnaW5uaW5nIDApIChtYXRjaC1lbmQgMCkpKSkKKwkJICAgKG1vZCBuaWwpCisJCSAgIChpbXBvcnRzIChlcmxhbmctZ2V0LWltcG9ydCkpKQorCSAgICAgICAod2hpbGUgKGFuZCBpbXBvcnRzIChudWxsIG1vZCkpCisJCSAoaWYgKGFzc29jIGZrIChjZHIgKGNhciBpbXBvcnRzKSkpCisJCSAgICAgKHNldHEgbW9kIChjYXIgKGNhciBpbXBvcnRzKSkpCisJCSAgIChzZXRxIGltcG9ydHMgKGNkciBpbXBvcnRzKSkpKQorCSAgICAgICAoc2V0cSByZXMgKGxpc3QgbW9kIGZrKSkpKSkKKyAgICAgIChzdG9yZS1tYXRjaC1kYXRhIG1kKQorICAgICAgcmVzKSkpCisKKworOzsgVE9ETzogRXNjYXBlIHNpbmdsZSBxdW90ZXMgaW5zaWRlIHRoZSBzdHJpbmcuCisoZGVmdW4gZXJsYW5nLWFkZC1xdW90ZXMtaWYtbmVlZGVkIChzdHIpCisgICJSZXR1cm4gU1RSLCBwb3NzaWJseSB3aXRoIHF1b3Rlcy4iCisgIChpZiAoYW5kIChzdHJpbmdwIHN0cikKKwkgICAobm90IChzdHJpbmctbWF0Y2ggKGNvbmNhdCAiXFxgIiBlcmxhbmctYXRvbS1yZWdleHAgIlxcJyIpIHN0cikpKQorICAgICAgKGNvbmNhdCAiJyIgc3RyICInIikKKyAgICBzdHIpKQorCisKKyhkZWZ1biBlcmxhbmctcmVtb3ZlLXF1b3RlcyAoc3RyKQorICAiUmV0dXJuIFNUUiB3aXRob3V0IHF1b3RlcywgaWYgcHJlc2VudC4iCisgIChsZXQgKChtZCAobWF0Y2gtZGF0YSkpKQorICAgIChwcm9nMQorCShpZiAoc3RyaW5nLW1hdGNoICJcXGAnXFwoLipcXCknXFwnIiBzdHIpCisJICAgIChzdWJzdHJpbmcgc3RyIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKKwkgIHN0cikKKyAgICAgIChzdG9yZS1tYXRjaC1kYXRhIG1kKSkpKQorCisMCis7OzsgQ2hlY2sgbW9kdWxlIG5hbWUKKworOzsgSSBkb24ndCB3YW50IHRvIHVzZSBgYWR2aWNlJyBzaW5jZSBpdCBpcyBub3QgcGFydCBvZiBFbWFjcyAxOC4KKzs7Cis7OyBUaGUgZnVuY3Rpb24gYHdyaXRlLWZpbGUnLCBib3VuZCB0byBDLXggQy13LCBjYWxscworOzsgYHNldC12aXNpdGVkLWZpbGUtbmFtZScgd2hpY2ggY2xlYXJzIHRoZSBob29rLiAgOi0oCis7OyBUbyBtYWtlIHN1cmUgdGhhdCB0aGUgaG9vayBhbHdheXMgaXMgcHJlc2VudCwgd2UgYWRkIGEgcGllY2Ugb2YKKzs7IGNvZGUgdG8gdGhlIGZ1bmN0aW9uIGBzZXQtdmlzaXRlZC1maWxlLW5hbWUnLgorKGRlZnVuIGVybGFuZy1jaGVjay1tb2R1bGUtbmFtZS1pbml0ICgpCisgICJJbml0aWFsaXplIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGNvbXBhcmUgZmlsZSBhbmQgbW9kdWxlIG5hbWVzLgorCitXZSByZWRlZmluZXMgdGhlIGZ1bmN0aW9uIGBzZXQtdmlzaXRlZC1maWxlLW5hbWUnIHNpbmNlIGl0IGNsZWFycwordGhlIHZhcmlhYmxlIGBsb2NhbC13cml0ZS1maWxlLWhvb2tzJy4gIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiBkZWZpbml0aW9uCitpcyBzdG9yZWQgaW4gYGVybGFuZy1vcmlnLXNldC12aXNpdGVkLWZpbGUtbmFtZScuIgorICAoaWYgKGZib3VuZHAgJ2VybGFuZy1vcmlnLXNldC12aXNpdGVkLWZpbGUtbmFtZSkKKyAgICAgICgpCisgICAgKGZzZXQgJ2VybGFuZy1vcmlnLXNldC12aXNpdGVkLWZpbGUtbmFtZQorCSAgKHN5bWJvbC1mdW5jdGlvbiAnc2V0LXZpc2l0ZWQtZmlsZS1uYW1lKSkKKyAgICAoZGVmdW4gc2V0LXZpc2l0ZWQtZmlsZS1uYW1lICgmcmVzdCBhcmdzKQorICAgICAgIlBsZWFzZSBzZWUgdGhlIGZ1bmN0aW9uIGBlcmxhbmctb3JpZy1zZXQtdmlzaXRlZC1maWxlLW5hbWUnLiIKKyAgICAgIChpbnRlcmFjdGl2ZSAiRlNldCB2aXNpdGVkIGZpbGUgbmFtZTogIikKKyAgICAgIChhcHBseSAoc3ltYm9sLWZ1bmN0aW9uICdlcmxhbmctb3JpZy1zZXQtdmlzaXRlZC1maWxlLW5hbWUpIGFyZ3MpCisgICAgICAoaWYgKGVxIG1ham9yLW1vZGUgJ2VybGFuZy1tb2RlKQorCSAgKGFkZC1ob29rICdsb2NhbC13cml0ZS1maWxlLWhvb2tzICdlcmxhbmctY2hlY2stbW9kdWxlLW5hbWUpKSkpCisgIChhZGQtaG9vayAnbG9jYWwtd3JpdGUtZmlsZS1ob29rcyAnZXJsYW5nLWNoZWNrLW1vZHVsZS1uYW1lKSkKKworCisoZGVmdW4gZXJsYW5nLWNoZWNrLW1vZHVsZS1uYW1lICgpCisgICJJZiB0aGUgbW9kdWxlIG5hbWUgZG9lc24ndCBtYXRjaCBmaWxlIG5hbWUsIGFzayBmb3IgcGVybWlzc2lvbiB0byBjaGFuZ2UuCisKK1RoZSB2YXJpYWJsZSBgZXJsYW5nLWNoZWNrLW1vZHVsZS1uYW1lJyBjb250cm9scyB0aGUgYmVoYXZpb3VyIG9mIHRoaXMKK2Z1bmN0aW9uLiAgSXQgaXQgaXMgbmlsLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4gIElmIGl0IGlzIHQsIHRoZQorc291cmNlIGlzIHNpbGVudGx5IGNoYW5nZWQuICBJZiBpdCBpcyBzZXQgdG8gdGhlIGF0b20gYGFzaycsIHRoZSB1c2VyCitpcyBwcm9tcHRlZC4KKworVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSBwbGFjZWQgaW4gdGhlIGhvb2sgYGxvY2FsLXdyaXRlLWZpbGUtaG9vaycuIgorICAoaWYgZXJsYW5nLWNoZWNrLW1vZHVsZS1uYW1lCisgICAgICAobGV0ICgobW4gKGVybGFuZy1nZXQtbW9kdWxlKSkKKwkgICAgKGZuIChlcmxhbmctZ2V0LW1vZHVsZS1mcm9tLWZpbGUtbmFtZSAoYnVmZmVyLWZpbGUtbmFtZSkpKSkKKwkoaWYgKGFuZCAoc3RyaW5ncCBtbikgKHN0cmluZ3AgZm4pKQorCSAgICAob3IgKHN0cmluZy1lcXVhbCBtbiBmbikKKwkJKGlmIChvciAoZXEgZXJsYW5nLWNoZWNrLW1vZHVsZS1uYW1lIHQpCisJCQkoeS1vci1uLXAKKwkJCSAiTW9kdWxlIGRvZXMgbm90IG1hdGNoIGZpbGUgbmFtZS4gTW9kaWZ5IHNvdXJjZT8gIikpCisJCSAgICAoc2F2ZS1leGN1cnNpb24KKwkJICAgICAgKHNhdmUtcmVzdHJpY3Rpb24KKwkJCSh3aWRlbikKKwkJCShnb3RvLWNoYXIgKHBvaW50LW1pbikpCisJCQkoaWYgKHJlLXNlYXJjaC1mb3J3YXJkCisJCQkgICAgIChjb25jYXQgIl4tbW9kdWxlXFxzICooXFxzICpcXChcXCgiCisJCQkJICAgICBlcmxhbmctYXRvbS1yZWdleHAKKwkJCQkgICAgICJcXCk/XFwpXFxzICopXFxzICpcXC4iKQorCQkJICAgICAocG9pbnQtbWF4KSB0KQorCQkJICAgIChwcm9nbgorCQkJICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDEpKQorCQkJICAgICAgKGRlbGV0ZS1yZWdpb24gKG1hdGNoLWJlZ2lubmluZyAxKQorCQkJCQkgICAgIChtYXRjaC1lbmQgMSkpCisJCQkgICAgICAoaW5zZXJ0IGZuKSkpKSkpKSkpKQorICA7OyBNdXN0IHJldHVybiBuaWwgc2luY2UgaXQgaXMgYWRkZWQgdG8gYGxvY2FsLXdyaXRlLWZpbGUtaG9vaycuCisgIG5pbCkKKworDAorOzs7IEVsZWN0cmljIGZ1bmN0aW9ucy4KKworKGRlZnVuIGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24gKCZvcHRpb25hbCBhcmcpCisgICJJbnNlcnQgYSBzZW1pY29sb24gY2hhcmFjdGVyIGFuZCBwb3NzaWJseSBhIHByb3RvdHlwZSBmb3IgdGhlIG5leHQgbGluZS4KKworVGhlIHZhcmlhYmxlIGBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uLWNyaXRlcmlhJyBzdGF0ZXMgYSBjcml0ZXJhLAord2hlbiBmdWxmaWxsZWQgYSBuZXdsaW5lIGlzIGluc2VydGVkLCB0aGUgbmV4dCBsaW5lIGlzIGluZGVudGVkIGFuZCBhCitwcm90b3R5cGUgZm9yIHRoZSBuZXh0IGxpbmUgaXMgaW5zZXJ0ZWQuICBOb3JtYWxseSB0aGUgcHJvdG90eXBlCitjb25zaXN0cyBvZiBcIiAtPlwiLiAgU2hvdWxkIHRoZSBzZW1pY29sb24gZW5kIHRoZSBjbGF1c2UgYSBuZXcgY2xhdXNlCitoZWFkZXIgaXMgZ2VuZXJhdGVkLgorCitUaGUgdmFyaWFibGUgYGVybGFuZy1lbGVjdHJpYy1zZW1pY29sb24taW5zZXJ0LWJsYW5rLWxpbmVzJyBjb250cm9scwordGhlIG51bWJlciBvZiBibGFuayBsaW5lcyBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBjdXJyZW50IGxpbmUgYW5kIG5ldworZnVuY3Rpb24gaGVhZGVyLgorCitCZWhhdmVzIGp1c3QgbGlrZSB0aGUgbm9ybWFsIHNlbWljb2xvbiB3aGVuIHN1cHBsaWVkIHdpdGggYQorbnVtZXJpY2FsIGFyZywgcG9pbnQgaXMgaW5zaWRlIHN0cmluZyBvciBjb21tZW50LCBvciB3aGVuIHRoZXJlIGFyZQorbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBmb2xsb3dpbmcgdGhlIHBvaW50IG9uIHRoZSBjdXJyZW50IGxpbmUuIgorICAoaW50ZXJhY3RpdmUgIlAiKQorICAoc2VsZi1pbnNlcnQtY29tbWFuZCAocHJlZml4LW51bWVyaWMtdmFsdWUgYXJnKSkKKyAgKGlmIChvciBhcmcKKwkgIChhbmQgKGxpc3RwIGVybGFuZy1lbGVjdHJpYy1jb21tYW5kcykKKwkgICAgICAgKG5vdCAobWVtcSAnZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbgorCQkJICBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpKSkKKwkgIChlcmxhbmctaW4tbGl0ZXJhbCkKKwkgIChub3QgKGxvb2tpbmctYXQgIlxccyAqXFwoJS4qXFwpPyQiKSkKKwkgIChudWxsIChlcmxhbmctdGVzdC1jcml0ZXJpYS1saXN0CisJCSBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uLWNyaXRlcmlhKSkpCisgICAgICAoc2V0cSBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1pbmhpYml0IG5pbCkKKyAgICAoc2V0cSBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1pbmhpYml0IHQpCisgICAgKHVuZG8tYm91bmRhcnkpCisgICAgKGVuZC1vZi1saW5lKQorICAgIChuZXdsaW5lKQorICAgIChpZiAoY29uZGl0aW9uLWNhc2UgbmlsCisJICAgIChwcm9nbiAoZXJsYW5nLWluZGVudC1saW5lKSB0KQorCSAgKGVycm9yIChpZiAoYm9scCkgKGRlbGV0ZS1iYWNrd2FyZC1jaGFyIDEpKSkpCisJKGlmIChub3QgKGJvbHApKQorCSAgICAoc2F2ZS1leGN1cnNpb24KKwkgICAgICAoaW5zZXJ0ICIgLT4iKSkKKwkgIChjb25kaXRpb24tY2FzZSBuaWwKKwkgICAgICAocHJvZ24KKwkJKGVybGFuZy1nZW5lcmF0ZS1uZXctY2xhdXNlKQorCQkoaWYgZXJsYW5nLWVsZWN0cmljLXNlbWljb2xvbi1pbnNlcnQtYmxhbmstbGluZXMKKwkJICAgIChzYXZlLWV4Y3Vyc2lvbgorCQkgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpCisJCSAgICAgIChuZXdsaW5lCisJCSAgICAgICBlcmxhbmctZWxlY3RyaWMtc2VtaWNvbG9uLWluc2VydC1ibGFuay1saW5lcykpKSkKKwkgICAgKGVycm9yIChpZiAoYm9scCkgKGRlbGV0ZS1iYWNrd2FyZC1jaGFyIDEpKSkpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctZWxlY3RyaWMtY29tbWEgKCZvcHRpb25hbCBhcmcpCisgICJJbnNlcnQgYSBjb21tYSBjaGFyYWN0ZXIgYW5kIHBvc3NpYmx5IGEgbmV3IGluZGVudGVkIGxpbmUuCitUaGUgdmFyaWFibGUgYGVybGFuZy1lbGVjdHJpYy1jb21tYS1jcml0ZXJpYScgc3RhdGVzIGEgY3JpdGVyYSwKK3doZW4gZnVsZmlsbGVkIGEgbmV3bGluZSBpcyBpbnNlcnRlZCBhbmQgdGhlIG5leHQgbGluZSBpcyBpbmRldGVkLgorCitCZWhhdmVzIGp1c3QgbGlrZSB0aGUgbm9ybWFsIGNvbW1hIHdoZW4gc3VwcGxpZWQgd2l0aCBhCitudW1lcmljYWwgYXJnLCBwb2ludCBpcyBpbnNpZGUgc3RyaW5nIG9yIGNvbW1lbnQsIG9yIHdoZW4gdGhlcmUgYXJlCitub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGZvbGxvd2luZyB0aGUgcG9pbnQgb24gdGhlIGN1cnJlbnQgbGluZS4iCisgIChpbnRlcmFjdGl2ZSAiUCIpCisKKyAgKHNlbGYtaW5zZXJ0LWNvbW1hbmQgKHByZWZpeC1udW1lcmljLXZhbHVlIGFyZykpCisKKyAgKGlmIChvciBhcmcKKwkgIChhbmQgKGxpc3RwIGVybGFuZy1lbGVjdHJpYy1jb21tYW5kcykKKwkgICAgICAgKG5vdCAobWVtcSAnZXJsYW5nLWVsZWN0cmljLWNvbW1hIGVybGFuZy1lbGVjdHJpYy1jb21tYW5kcykpKQorCSAgKGVybGFuZy1pbi1saXRlcmFsKQorCSAgKG5vdCAobG9va2luZy1hdCAiXFxzICpcXCglLipcXCk/JCIpKQorCSAgKG51bGwgKGVybGFuZy10ZXN0LWNyaXRlcmlhLWxpc3QKKwkJIGVybGFuZy1lbGVjdHJpYy1jb21tYS1jcml0ZXJpYSkpKQorICAgICAgKHNldHEgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdCBuaWwpCisgICAgKHNldHEgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdCB0KQorICAgICh1bmRvLWJvdW5kYXJ5KQorICAgIChlbmQtb2YtbGluZSkKKyAgICAobmV3bGluZSkKKyAgICAoY29uZGl0aW9uLWNhc2UgbmlsCisJKGVybGFuZy1pbmRlbnQtbGluZSkKKyAgICAgIChlcnJvciAoaWYgKGJvbHApIChkZWxldGUtYmFja3dhcmQtY2hhciAxKSkpKSkpCisKKyhkZWZ1biBlcmxhbmctZWxlY3RyaWMtbHQgKCZvcHRpb25hbCBhcmcpCisgICJJbnNlcnQgYSBsZXNzLXRoYW4gc2lnbiwgYW5kIG9wdGlvbmFsbHkgbWFyayBpdCBhcyBhbiBvcGVuIHBhcmVuLiIKKyAgCisgIChpbnRlcmFjdGl2ZSAicCIpCisKKyAgKHNlbGYtaW5zZXJ0LWNvbW1hbmQgYXJnKQorCisgIDs7IFdhcyB0aGlzIHRoZSBzZWNvbmQgY2hhciBpbiBiaXQtc3ludGF4IG9wZW4gKGA8PCcpPworICAodW5sZXNzICg8IChwb2ludCkgMikKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChiYWNrd2FyZC1jaGFyIDIpCisgICAgICAod2hlbiAoYW5kIChlcSAoY2hhci1hZnRlciAocG9pbnQpKSA/PCkKKwkJIChub3QgKGVxIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdjYXRlZ29yeSkKKwkJCSAgJ2JpdHN5bnRheC1vcGVuLWlubmVyKSkpCisJOzsgVGhlbiBtYXJrIHRoZSB0d28gY2hhcnMuLi4KKwkocHV0LXRleHQtcHJvcGVydHkgKHBvaW50KSAoMSsgKHBvaW50KSkgCisJCQkgICAnY2F0ZWdvcnkgJ2JpdHN5bnRheC1vcGVuLW91dGVyKQorCShmb3J3YXJkLWNoYXIgMSkKKwkocHV0LXRleHQtcHJvcGVydHkgKHBvaW50KSAoMSsgKHBvaW50KSkKKwkJCSAgICdjYXRlZ29yeSAnYml0c3ludGF4LW9wZW4taW5uZXIpCisJOzsuLi5hbmQgdW5tYXJrIGFueSBzdWJzZXF1ZW50IGxlc3MtdGhhbiBjaGFycy4KKwkoZm9yd2FyZC1jaGFyIDEpCisJKHdoaWxlIChlcSAoY2hhci1hZnRlciAocG9pbnQpKSA/PCkKKwkgIChyZW1vdmUtdGV4dC1wcm9wZXJ0aWVzIChwb2ludCkgKDErIChwb2ludCkpCisJCQkJICAnKGNhdGVnb3J5IG5pbCkpCisJICAoZm9yd2FyZC1jaGFyIDEpKSkpKSkKKworKGRlZnVuIGVybGFuZy1hZnRlci1iaXRzeW50YXgtY2xvc2UgKCkKKyAgIlJldHVybnMgdHJ1ZSBpZiBwb2ludCBpcyBwbGFjZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBiaXQtc3ludGF4IGNsb3NlIHBhcmVudGhlc2lzIChgPj4nKS4iCisgIChhbmQgKD49IChwb2ludCkgMikKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChiYWNrd2FyZC1jaGFyIDIpCisgICAgICAoYW5kIChlcSAoY2hhci1hZnRlciAocG9pbnQpKSA/PikKKwkgICAobm90IChlcSAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAnY2F0ZWdvcnkpCisJCSAgICAnYml0c3ludGF4LWNsb3NlLW91dGVyKSkpKSkpCisJIAorKGRlZnVuIGVybGFuZy1hZnRlci1hcnJvdyAoKQorICAiUmV0dXJucyB0cnVlIGlmIHBvaW50IGlzIHBsYWNlZCBpbW1lZGlhdGVseSBhZnRlciBhIGZ1bmN0aW9uIGFycm93IChgLT4nKS4iCisgIChhbmQgKD49IChwb2ludCkgMikKKwkgKGFuZCAKKwkgIChzYXZlLWV4Y3Vyc2lvbgorCSAgICAoYmFja3dhcmQtY2hhcikKKwkgICAgKGVxIChjaGFyLWJlZm9yZSAocG9pbnQpKSA/LSkpCisJICAob3IgKG5vdCAobGlzdHAgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzKSkKKwkgICAgICAobWVtcSAnZXJsYW5nLWVsZWN0cmljLWd0CisJCSAgICBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpKQorCSAgKG5vdCAoZXJsYW5nLWluLWxpdGVyYWwpKQorCSAgKGxvb2tpbmctYXQgIlxccyAqXFwoJS4qXFwpPyQiKQorCSAgKGVybGFuZy10ZXN0LWNyaXRlcmlhLWxpc3QgZXJsYW5nLWVsZWN0cmljLWFycm93LWNyaXRlcmlhKSkpKQorCisKKyhkZWZ1biBlcmxhbmctZWxlY3RyaWMtZ3QgKCZvcHRpb25hbCBhcmcpCisgICJJbnNlcnQgYSBncmVhdGVyLXRoYW4gc2lnbiwgYW5kIG9wdGlvbmFsbHkgbWFyayBpdCBhcyBhIGNsb3NlIHBhcmVuLiIKKyAgCisgIChpbnRlcmFjdGl2ZSAicCIpCisKKyAgKHNlbGYtaW5zZXJ0LWNvbW1hbmQgYXJnKQorCisgIChjb25kCisgICA7OyBEaWQgd2UganVzdCB3cml0ZSBhIGJpdC1zeW50YXggY2xvc2UgKGA+PicpPworICAgKChlcmxhbmctYWZ0ZXItYml0c3ludGF4LWNsb3NlKQorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgOzsgVGhlbiBtYXJrIHRoZSB0d28gY2hhcnMuLi4KKyAgICAgIChiYWNrd2FyZC1jaGFyIDIpCisgICAgICAocHV0LXRleHQtcHJvcGVydHkgKHBvaW50KSAoMSsgKHBvaW50KSkgCisJCQkgJ2NhdGVnb3J5ICdiaXRzeW50YXgtY2xvc2UtaW5uZXIpCisgICAgICAoZm9yd2FyZC1jaGFyKQorICAgICAgKHB1dC10ZXh0LXByb3BlcnR5IChwb2ludCkgKDErIChwb2ludCkpCisJCQkgJ2NhdGVnb3J5ICdiaXRzeW50YXgtY2xvc2Utb3V0ZXIpCisgICAgICA7Oy4uLmFuZCB1bm1hcmsgYW55IHN1YnNlcXVlbnQgZ3JlYXRlci10aGFuIGNoYXJzLgorICAgICAgKGZvcndhcmQtY2hhcikKKyAgICAgICh3aGlsZSAoZXEgKGNoYXItYWZ0ZXIgKHBvaW50KSkgPz4pCisJKHJlbW92ZS10ZXh0LXByb3BlcnRpZXMgKHBvaW50KSAoMSsgKHBvaW50KSkKKwkJCQknKGNhdGVnb3J5IG5pbCkpCisJKGZvcndhcmQtY2hhcikpKSkKKworICAgOzsgRGlkIHdlIGp1c3Qgd3JpdGUgYSBmdW5jdGlvbiBhcnJvdyAoYC0+Jyk/CisgICAoKGVybGFuZy1hZnRlci1hcnJvdykKKyAgICAobGV0ICgoZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdCB0KSkKKyAgICAgICh1bmRvLWJvdW5kYXJ5KQorICAgICAgKGVuZC1vZi1saW5lKQorICAgICAgKG5ld2xpbmUpCisgICAgICAoY29uZGl0aW9uLWNhc2UgbmlsCisJICAoZXJsYW5nLWluZGVudC1saW5lKQorCShlcnJvciAoaWYgKGJvbHApIChkZWxldGUtYmFja3dhcmQtY2hhciAxKSkpKSkpCisKKyAgIDs7IFRoZW4gaXQncyBqdXN0IGEgcGxhaW4gZ3JlYXRlci10aGFuLgorICAgKHQKKyAgICBuaWwpKSkKKyAgICAKKworKGRlZnVuIGVybGFuZy1lbGVjdHJpYy1hcnJvd1wgb2ZmICgmb3B0aW9uYWwgYXJnKQorICAiSW5zZXJ0IGEgJz4nLXNpZ24gYW5kIHBvc3NpYmxlIGEgbmV3IGluZGVudGVkIGxpbmUuCisKK1RoaXMgY29tbWFuZCBpcyBvbmx5IGBlbGVjdHJpYycgd2hlbiB0aGUgYD4nIGlzIHBhcnQgb2YgYW4gYC0+JyBhcnJvdy4KK1RoZSB2YXJpYWJsZSBgZXJsYW5nLWVsZWN0cmljLWFycm93LWNyaXRlcmlhJyBzdGF0ZXMgYSBzZXF1ZW5jZSBvZgorY3JpdGVyaWEsIHdoaWNoIGRlY2lkZXMgd2hlbiBhIG5ld2xpbmUgc2hvdWxkIGJlIGluc2VydGVkIGFuZCB0aGUgbmV4dAorbGluZSBpbmRlbnRlZC4KKworSXQgYmVoYXZlcyBqdXN0IGxpa2UgdGhlIG5vcm1hbCBncmVhdGVyIHRoYW4gc2lnbiB3aGVuIHN1cHBsaWVkIHdpdGggYQorbnVtZXJpY2FsIGFyZywgcG9pbnQgaXMgaW5zaWRlIHN0cmluZyBvciBjb21tZW50LCBvciB3aGVuIHRoZXJlIGFyZQorbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBmb2xsb3dpbmcgdGhlIHBvaW50IG9uIHRoZSBjdXJyZW50IGxpbmUuCisKK0FmdGVyIGJlaW5nIHNwbGl0L21lcmdlZCBpbnRvIGVybGFuZy1hZnRlci1hcnJvdyBhbmQKK2VybGFuZy1lbGVjdHJpYy1ndCwgaXQgaXMgbm93IHVudXNlZCBhbmQgZGlzYWJsZWQuIgorICAoaW50ZXJhY3RpdmUgIlAiKQorICAobGV0ICgocHJlYyAocHJlY2VkaW5nLWNoYXIpKSkKKyAgICAoc2VsZi1pbnNlcnQtY29tbWFuZCAocHJlZml4LW51bWVyaWMtdmFsdWUgYXJnKSkKKyAgICAoaWYgKG9yIGFyZworCSAgICAoYW5kIChsaXN0cCBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpCisJCSAobm90IChtZW1xICdlcmxhbmctZWxlY3RyaWMtYXJyb3cKKwkJCSAgICBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpKSkKKwkgICAgKG5vdCAoZXEgcHJlYyA/LSkpCisJICAgIChlcmxhbmctaW4tbGl0ZXJhbCkKKwkgICAgKG5vdCAobG9va2luZy1hdCAiXFxzICpcXCglLipcXCk/JCIpKQorCSAgICAobnVsbCAoZXJsYW5nLXRlc3QtY3JpdGVyaWEtbGlzdAorCQkgICBlcmxhbmctZWxlY3RyaWMtYXJyb3ctY3JpdGVyaWEpKSkKKwkoc2V0cSBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1pbmhpYml0IG5pbCkKKyAgICAgIChzZXRxIGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWluaGliaXQgdCkKKyAgICAgICh1bmRvLWJvdW5kYXJ5KQorICAgICAgKGVuZC1vZi1saW5lKQorICAgICAgKG5ld2xpbmUpCisgICAgICAoY29uZGl0aW9uLWNhc2UgbmlsCisJICAoZXJsYW5nLWluZGVudC1saW5lKQorCShlcnJvciAoaWYgKGJvbHApIChkZWxldGUtYmFja3dhcmQtY2hhciAxKSkpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctZWxlY3RyaWMtbmV3bGluZSAoJm9wdGlvbmFsIGFyZykKKyAgIkJyZWFrIGxpbmUgYXQgcG9pbnQgYW5kIGluZGVudCwgY29udGludWluZyBjb21tZW50IGlmIHdpdGhpbiBvbmUuCitUaGUgdmFyaWFibGUgYGVybGFuZy1lbGVjdHJpYy1uZXdsaW5lLWNyaXRlcmlhJyBzdGF0ZXMgYSBjcml0ZXJhLAord2hlbiBmdWxmaWxsZWQgYSBuZXdsaW5lIGlzIGluc2VydGVkIGFuZCB0aGUgbmV4dCBsaW5lIGlzIGluZGV0ZWQuCisKK1Nob3VsZCB0aGUgY3VycmVudCBsaW5lIGJlZ2luIHdpdGggYSBjb21tZW50LCBhbmQgdGhlIHZhcmlhYmxlCitgY29tbWVudC1tdWx0aS1saW5lJyBiZSBub24tbmlsLCBhIG5ldyBjb21tZW50IHN0YXJ0IGlzIGluc2VydGVkLgorCitTaG91bGQgdGhlIHByZXZpb3VzIGNvbW1hbmQgYmUgYW5vdGhlciBlbGVjdHJpYyBjb21tYW5kIHdlIGFzc3VtZSB0aGF0Cit0aGUgdXNlciBwcmVzc2VkIG5ld2xpbmUgb3V0IG9mIG9sZCBoYWJpdCwgaGVuY2Ugd2Ugd2lsbCBkbyBub3RoaW5nLiIKKyAgKGludGVyYWN0aXZlICJQIikKKyAgKGNvbmQgKChhbmQgKG5vdCBhcmcpCisJICAgICAgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtaW5oaWJpdAorCSAgICAgIChtZW1xIGxhc3QtY29tbWFuZCBlcmxhbmctZWxlY3RyaWMtbmV3bGluZS1pbmhpYml0LWxpc3QpKQorCSAoKSkJCQkJOyBEbyBub3RoaW5nIQorCSgob3IgYXJnCisJICAgICAoYW5kIChsaXN0cCBlcmxhbmctZWxlY3RyaWMtY29tbWFuZHMpCisJCSAgKG5vdCAobWVtcSAnZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUKKwkJCSAgICAgZXJsYW5nLWVsZWN0cmljLWNvbW1hbmRzKSkpCisJICAgICAobnVsbCAoZXJsYW5nLXRlc3QtY3JpdGVyaWEtbGlzdAorCQkgICAgZXJsYW5nLWVsZWN0cmljLW5ld2xpbmUtY3JpdGVyaWEpKSkKKwkgKG5ld2xpbmUgKHByZWZpeC1udW1lcmljLXZhbHVlIGFyZykpKQorCSh0CisJIChpZiAoYW5kIGNvbW1lbnQtbXVsdGktbGluZQorCQkgIChzYXZlLWV4Y3Vyc2lvbgorCQkgICAgKGJlZ2lubmluZy1vZi1saW5lKQorCQkgICAgKGxvb2tpbmctYXQgKGNvbmNhdCAiXFxzICoiIGNvbW1lbnQtc3RhcnQtc2tpcCkpKSkKKwkgICAgIChsZXQgKChzdHIgKGJ1ZmZlci1zdWJzdHJpbmcKKwkJCSAob3IgKG1hdGNoLWVuZCAxKSAobWF0Y2gtYmVnaW5uaW5nIDApKQorCQkJIChtaW4gKG1hdGNoLWVuZCAwKSAocG9pbnQpKSkpKQorCSAgICAgICAobmV3bGluZSkKKwkgICAgICAgKHVuZG8tYm91bmRhcnkpCisJICAgICAgIChpbnNlcnQgc3RyKSkKKwkgICAobmV3bGluZSkKKwkgICAodW5kby1ib3VuZGFyeSkKKwkgICAoaW5kZW50LWFjY29yZGluZy10by1tb2RlKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLXRlc3QtY3JpdGVyaWEtbGlzdCAoY3JpdGVyaWEpCisgICJHaXZlbiBhIGxpc3Qgb2YgY3JpdGVyaWEgZnVuY3Rpb25zLCB0ZXN0IGlmIGNyaXRlcmlhIGlzIGZ1bGZpbGxlZC4KKworRWFjaCBlbGVtZW50IGluIHRoZSBjcml0ZXJpYSBsaXN0IGNhbiBhIGZ1bmN0aW9uIHJldHVybmluZyBuaWwsIHQgb3IKK3RoZSBhdG9tIGBzdG9wJy4gIHQgbWVhbnMgdGhhdCB0aGUgY3JpdGVyaWEgaXMgZnVsZmlsbGVkLCBgc3RvcCcgbWVhbnMKK3RoYXQgaXQgdGhlIGNyaXRlcmlhIGlzbid0IGZ1bGZpbGxlZCBhbmQgdGhhdCB0aGUgc2VhcmNoIHNob3VsZCBzdG9wLAorYW5kIG5pbCBtZWFucyBjb250aW51ZSBzZWFyY2hpbmcuCisKK1Nob3VsZCB0aGUgbGlzdCBjb250YWluIHRoZSBhdG9tIHQgdGhlIGNyaXRlcmlhIGlzIGFzc3VtZWQgdG8gYmUKK2Z1bGZpbGxlZCwgdW5sZXNzIHByZWNlZGVkIGJ5IGEgZnVuY3Rpb24gcmV0dXJuaW5nIGBzdG9wJywgb2YgY291cnNlLgorCitTaG91bGQgdGhlIGFyZ3VtZW50IGJlIHRoZSBhdG9tIHQgaW5zdGVhZCBvZiBhIGxpc3QsIHRoZSBjcml0ZXJpYSBpcworYXNzdW1lZCB0byBiZSB0cml2aWFsbHkgdHJ1ZS4KKworU2hvdWxkIGFsbCBmdW5jdGlvbiByZXR1cm4gbmlsLCB0aGUgY3JpdGVyaWEgaXMgYXNzdW1lZCBub3QgdG8gYmUKK2Z1bGZpbGxlZC4KKworUmV0dXJuIHQgaWYgY3JpdGVyaWEgZnVsZmlsbGVkLCBuaWwgb3RoZXJ3aXNlLiIKKyAgKGlmIChlcSBjcml0ZXJpYSB0KQorICAgICAgdAorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKGxldCAoKGFuc3dlciBuaWwpKQorCSh3aGlsZSAoYW5kIGNyaXRlcmlhIChudWxsIGFuc3dlcikpCisJICAoaWYgKGVxIChjYXIgY3JpdGVyaWEpIHQpCisJICAgICAgKHNldHEgYW5zd2VyIHQpCisJICAgIChzZXRxIGFuc3dlciAoZnVuY2FsbCAoY2FyIGNyaXRlcmlhKSkpKQorCSAgKHNldHEgY3JpdGVyaWEgKGNkciBjcml0ZXJpYSkpKQorCShpZiAoYW5kIGFuc3dlciAobm90IChlcSBhbnN3ZXIgJ3N0b3ApKSkKKwkgICAgdAorCSAgbmlsKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLWluLWxpdGVyYWwgKCZvcHRpb25hbCBsaW0pCisgICJUZXN0IGlmIHBvaW50IGlzIGluIHN0cmluZywgcXVvdGVkIGF0b20gb3IgY29tbWVudC4KKworUmV0dXJuIG9uZSBvZiB0aGUgdGhyZWUgYXRvbXMgYGF0b20nLCBgc3RyaW5nJywgYW5kIGBjb21tZW50Jy4KK1Nob3VsZCB0aGUgcG9pbnQgYmUgaW5zaWRlIG5vbmUgb2YgdGhlIGFib3ZlIG1lbnRpb25lZCB0eXBlcyBvZgorY29udGV4dCwgbmlsIGlzIHJldHVybmVkLiIKKyAgKHNhdmUtZXhjdXJzaW9uCisgICAgKGxldCogKChsaW0gKG9yIGxpbSAoc2F2ZS1leGN1cnNpb24KKwkJCSAgKGVybGFuZy1iZWdpbm5pbmctb2YtY2xhdXNlKQorCQkJICAocG9pbnQpKSkpCisJICAgKHN0YXRlIChwYXJzZS1wYXJ0aWFsLXNleHAgbGltIChwb2ludCkpKSkKKyAgICAgIChjb25kCisgICAgICAgKChlcSAobnRoIDMgc3RhdGUpID8nKSAnYXRvbSkKKyAgICAgICAoKG50aCAzIHN0YXRlKSAnc3RyaW5nKQorICAgICAgICgobnRoIDQgc3RhdGUpICdjb21tZW50KQorICAgICAgICh0IG5pbCkpKSkpCisKKworKGRlZnVuIGVybGFuZy1hdC1lbmQtb2YtZnVuY3Rpb24tcCAoKQorICAiVGVzdCBpZiBwb2ludCBpcyBhdCBlbmQgb2YgYW4gRXJsYW5nIGZ1bmN0aW9uLgorCitUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGEgbWVtYmVyIG9mIGEgY3JpdGVyaWEgbGlzdC4iCisgIChlcSAoc2F2ZS1leGN1cnNpb24gKGVybGFuZy1za2lwLWJsYW5rKSAocG9pbnQpKQorICAgICAgKHNhdmUtZXhjdXJzaW9uCisJKGVybGFuZy1iZWdpbm5pbmctb2YtZnVuY3Rpb24gLTEpIChwb2ludCkpKSkKKworCisoZGVmdW4gZXJsYW5nLXN0b3Atd2hlbi1pbnNpZGUtYXJndW1lbnQtbGlzdCAoKQorICAiUmV0dXJuIGBzdG9wJyBpZiBpbnNpZGUgcGFyZW50aGVzaXMgbGlzdCwgbmlsIG90aGVyd2lzZS4KKworS25vd3MgYWJvdXQgdGhlIGxpc3QgY29tcHJlaGVuc2lvbiBzeW50YXguICBXaGVuIHRoZSBwb2ludCBpcworYWZ0ZXIgYHx8JywgYHN0b3AnIGlzIG5vdCByZXR1cm5lZC4KKworVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBhIG1lbWJlciBvZiBhIGNyaXRlcmlhIGxpc3QuIgorICAoc2F2ZS1leGN1cnNpb24KKyAgICAoY29uZGl0aW9uLWNhc2UgbmlsCisJKGxldCAoKG9yaWctcG9pbnQgKHBvaW50KSkKKwkgICAgICAoc3RhdGUgbmlsKSkKKwkgICh1cC1saXN0IC0xKQorCSAgKGlmIChub3QgKGVxIChmb2xsb3dpbmctY2hhcikgP1xbKSkKKwkgICAgICAnc3RvcAorCSAgICA7OyBEbyBub3QgcmV0dXJuIGBzdG9wJyB3aGVuIGluc2lkZSBhIGxpc3QgY29tcHJlaGVuc2lvbgorCSAgICA7OyBjb25zdHJ1bmN0aW9uLiAgKFRoZSBwb2ludCBtdXN0IGJlIGFmdGVyIGB8fCcpLgorCSAgICAod2hpbGUgKDwgKHBvaW50KSBvcmlnLXBvaW50KQorCSAgICAgIChzZXRxIHN0YXRlIChlcmxhbmctcGFydGlhbC1wYXJzZSAocG9pbnQpIG9yaWctcG9pbnQgc3RhdGUpKSkKKwkgICAgKGlmIChhbmQgKGNhciBzdGF0ZSkgKGVxIChjYXIgKGNhciAoY2FyIHN0YXRlKSkpICd8fCkpCisJCW5pbAorCSAgICAgICdzdG9wKSkpCisgICAgICAoZXJyb3IgCisgICAgICAgbmlsKSkpKQorCisKKyhkZWZ1biBlcmxhbmctc3RvcC13aGVuLWF0LWd1YXJkICgpCisgICJSZXR1cm4gYHN0b3AnIHdoZW4gYXQgZnVuY3Rpb24gZ3VhcmRzLgorCitUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGEgbWVtYmVyIG9mIGEgY3JpdGVyaWEgbGlzdC4iCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChiZWdpbm5pbmctb2YtbGluZSkKKyAgICAoaWYgKGFuZCAobG9va2luZy1hdCAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIlxccyAqKCIpKQorCSAgICAgKG5vdCAobG9va2luZy1hdAorCQkgICAoY29uY2F0ICJeIiBlcmxhbmctYXRvbS1yZWdleHAgIi4qXFwoLT5cXHw6LVxcKSIpKSkpCisJJ3N0b3AKKyAgICAgIG5pbCkpKQorCisKKyhkZWZ1biBlcmxhbmctbmV4dC1saW5lcy1lbXB0eS1wICgpCisgICJSZXR1cm4gbm9uLW5pbCBpZiBuZXh0IGxpbmVzIGFyZSBlbXB0eS4KKworVGhlIHZhcmlhYmxlIGBlcmxhbmctbmV4dC1saW5lcy1lbXB0eS10aHJlc2hvbGQnIGNvbnRhaW5zIHRoZSBudW1iZXIKK29mIGxpbmVzIHJlcXVpcmVkIHRvIGJlIGVtcHR5LgorCitBIGxpbmUgY29udGFpbmluZyBvbmx5IHNwYWNlcyBhbmQgdGFicyBpcyBjb25zaWRlcmVkIGVtcHR5LgorCitUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGEgbWVtYmVyIG9mIGEgY3JpdGVyaWEgbGlzdC4iCisgIChhbmQgZXJsYW5nLW5leHQtbGluZXMtZW1wdHktdGhyZXNob2xkCisgICAgICAgKHNhdmUtZXhjdXJzaW9uCisJIChsZXQgKChsZWZ0IGVybGFuZy1uZXh0LWxpbmVzLWVtcHR5LXRocmVzaG9sZCkKKwkgICAgICAgKGNvbnQgdCkpCisJICAgKHdoaWxlIChhbmQgY29udCAoPiBsZWZ0IDApKQorCSAgICAgKGZvcndhcmQtbGluZSAxKQorCSAgICAgKHNldHEgY29udCAobG9va2luZy1hdCAiXFxzICokIikpCisJICAgICAoc2V0cSBsZWZ0ICgtIGxlZnQgMSkpKQorCSAgIGNvbnQpKSkpCisKKworKGRlZnVuIGVybGFuZy1hdC1rZXl3b3JkLWVuZC1wICgpCisgICJUZXN0IGlmIG5leHQgcmVhZGFibGUgdG9rZW4gaXMgdGhlIGtleXdvcmQgZW5kLgorCitUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGEgbWVtYmVyIG9mIGEgY3JpdGVyaWEgbGlzdC4iCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChlcmxhbmctc2tpcC1ibGFuaykKKyAgICAobG9va2luZy1hdCAiZW5kW15fYS16QS1aMC05XSIpKSkKKworDAorOzsgRXJsYW5nIHRhZ3Mgc3VwcG9ydCB3aGljaCBpcyBhd2FyZSBvZiBlcmxhbmcgbW9kdWxlcy4KKzs7Cis7OyBOb3QgeWV0IGltcGxlbWVudGVkIHVuZGVyIFhFbWFjcy4gIChIaW50OiAgVGhlIEVtYWNzIDE5IGV0YWdzCis7OyBwYWNrYWdlIHdvcmsgdW5kZXIgWEVtYWNzLikKKworKGV2YWwtd2hlbi1jb21waWxlCisgIChpZiAob3IgKGZlYXR1cmVwICdieXRlY29tcCkKKwkgIChmZWF0dXJlcCAnYnl0ZS1jb21waWxlKSkKKyAgICAgIChwcm9nbgorCShyZXF1aXJlICdldGFncykpKSkKKworCis7OyBWYXJpYWJsZXM6CisKKyhkZWZ2YXIgZXJsYW5nLXRhZ3MtZnVuY3Rpb24tYWxpc3QKKyAgICcoKGZpbmQtdGFnICAgICAgICAgICAgICAgICAuIGVybGFuZy1maW5kLXRhZykKKyAgICAgKGZpbmQtdGFnLW90aGVyLXdpbmRvdyAgICAuIGVybGFuZy1maW5kLXRhZy1vdGhlci13aW5kb3cpCisgICAgIChmaW5kLXRhZy1yZWdleHAgICAgICAgICAgLiBlcmxhbmctZmluZC10YWctcmVnZXhwKQorICAgICAoZmluZC10YWctb3RoZXItZnJhbWUgICAgIC4gZXJsYW5nLWZpbmQtdGFnLW90aGVyLWZyYW1lKSkKKyAgICJBbGlzdCBvZiBvbGQgdGFncyBjb21tYW5kcyBhbmQgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucy4iKQorCisoZGVmdmFyIGVybGFuZy10YWdzLWluc3RhbGxlZCBuaWwKKyAgIk5vbi1uaWwgd2hlbiB0aGUgRXJsYW5nIHRhZ3Mgc3lzdGVtIGlzIGluc3RhbGxlZC4iKQorKGRlZnZhciBlcmxhbmctdGFncy1maWxlLWxpc3QgJygpCisgICJMaXN0IG9mIGZpbGVzIGluIHRhZyBsaXN0LiBVc2VkIHdoZW4gZmluZGluZyB0YWcgb24gZm9ybSBgbW9kdWxlOicuIikKKyhkZWZ2YXIgZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZSBuaWwKKyAgIkxpa2UgYHRhZ3MtY29tcGxldGlvbi10YWJsZScsIHRoaXMgdGFibGUgY29udGFpbnMgYHRhZycgYW5kIGBtb2R1bGU6dGFnJy4iKQorKGRlZnZhciBlcmxhbmctdGFncy1idWZmZXItaW5zdGFsbGVkLXAgbmlsCisgICJOb24tbmlsIHdoZW4gZXJsYW5nIG1vZHVsZSByZWNvZ25pc2luZyBmdW5jdGlvbnMgaW5zdGFsbGVkLiIpCisoZGVmdmFyIGVybGFuZy10YWdzLWJ1ZmZlci1saXN0ICcoKQorICAiVGVtcG9yYXJ5IGxpc3Qgb2YgYnVmZmVycy4iKQorKGRlZnZhciBlcmxhbmctdGFncy1vcmlnLWNvbXBsZXRpb24tdGFibGUgbmlsCisgICJUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYHRhZ3MtY29tcGxldGlvbi10YWJsZScuIikKKyhkZWZ2YXIgZXJsYW5nLXRhZ3Mtb3JpZy10YWctb3JkZXIgbmlsCisgICJUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYGZpbmQtdGFnLXRhZy1vcmRlcicuIikKKyhkZWZ2YXIgZXJsYW5nLXRhZ3Mtb3JpZy1yZWdleHAtdGFnLW9yZGVyIG5pbAorICAiVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGBmaW5kLXRhZy1yZWdleHAtdGFnLW9yZGVyJy4iKQorKGRlZnZhciBlcmxhbmctdGFncy1vcmlnLXNlYXJjaC1mdW5jdGlvbiBuaWwKKyAgIlRlbXBvcmFyeSBzdG9yYWdlIGZvciBgZmluZC10YWctc2VhcmNoLWZ1bmN0aW9uJy4iKQorKGRlZnZhciBlcmxhbmctdGFncy1vcmlnLXJlZ2V4cC1zZWFyY2gtZnVuY3Rpb24gbmlsCisgICJUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYGZpbmQtdGFnLXJlZ2V4cC1zZWFyY2gtZnVuY3Rpb24nLiIpCisoZGVmdmFyIGVybGFuZy10YWdzLW9yaWctZm9ybWF0LWhvb2tzIG5pbAorICAiVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGB0YWdzLXRhYmxlLWZvcm1hdC1ob29rcycuIikKKworKGRlZnVuIGVybGFuZy10YWdzLWluaXQgKCkKKyAgIkluc3RhbGwgYW4gYWx0ZXJuYXRlIHZlcnNpb24gb2YgdGFncywgYXdhcmUgb2YgRXJsYW5nIG1vZHVsZXMuCisKK0FmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIHRhZ3MgZnVuY3Rpb25zIGFyZSBhd2FyZSBvZgorRXJsYW5nIG1vZHVsZXMuICBUYWdzIGNhbiBiZSBlbnRlcmVkIG9uIHRoZSBmb3IgYG1vZHVsZTp0YWcnIGFzd2VsbAorYXMgb24gdGhlIG9sZCBmb3JtIGB0YWcnLgorCitJbiB0aGUgY29tcGxldGlvbiBsaXN0LCBgbW9kdWxlOnRhZycgYW5kIGBtb2R1bGU6JyBzaG93cyB1cC4KKworQ2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYW4gYXBwcm9wcmlhdGUgaW5pdCBmaWxlLCBvciBhZGQgaXQgdG8KK0VybGFuZyBtb2RlIGhvb2sgd2l0aCB0aGUgY29tbWFuZHM6CisgICAgKGFkZC1ob29rICdlcmxhbmctbW9kZS1ob29rICdlcmxhbmctdGFncy1pbml0KQorICAgIChhZGQtaG9vayAnZXJsYW5nLXNoZWxsLW1vZGUtaG9vayAnZXJsYW5nLXRhZ3MtaW5pdCkKKworVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHVuZGVyIEVtYWNzIDE4IGFuZCBFbWFjcyAxOS4gIEN1cnJlbnRseSwgSXQKK2lzIG5vdCBpbXBsZW1lbnRlZCB1bmRlciBYRW1hY3MuICAoSGludDogVGhlIEVtYWNzIDE5IGV0YWdzIG1vZHVsZQord29ya3MgdW5kZXIgWEVtYWNzLikiCisgIChpbnRlcmFjdGl2ZSkKKyAgKGNvbmQgKCg9IGVybGFuZy1lbWFjcy1tYWpvci12ZXJzaW9uIDE4KQorCSAocmVxdWlyZSAndGFncykKKwkgKGVybGFuZy10YWdzLWRlZmluZS1rZXlzIChjdXJyZW50LWxvY2FsLW1hcCkpCisJIChzZXRxIGVybGFuZy10YWdzLWluc3RhbGxlZCB0KSkKKwkodAorCSAocmVxdWlyZSAnZXRhZ3MpCisJIDs7IFRlc3Qgb24gYSBmdW5jdGlvbiBhdmFpbGFibGUgaW4gdGhlIEVtYWNzIDE5IHZlcnNpb24KKwkgOzsgb2YgdGFncyBidXQgbm90IGluIHRoZSBYRW1hY3MgdmVyc2lvbi4KKwkgKGlmIChub3QgKGZib3VuZHAgJ2ZpbmQtdGFnLW5vc2VsZWN0KSkKKwkgICAgICgpCisJICAgKGVybGFuZy10YWdzLWRlZmluZS1rZXlzIChjdXJyZW50LWxvY2FsLW1hcCkpCisJICAgKHNldHEgZXJsYW5nLXRhZ3MtaW5zdGFsbGVkIHQpKSkpKQorCisKKzs7IFNldCBhbGwga2V5cyBib3VuZCB0byBgZmluZC10YWcnIGV0LmFsLiBpbiB0aGUgZ2xvYmFsIG1hcCBhbmQgdGhlCis7OyBtZW51IHRvIGBlcmxhbmctZmluZC10YWcnIGV0LmFsLiBpbiBgbWFwJy4KKzs7Cis7OyBUaGUgZnVuY3Rpb24gYHN1YnN0aXR1dGUta2V5LWRlZmluaXRpb24nIGRvZXMgbm90IHdvcmsgcHJvcGVybHkKKzs7IGluIGFsbCB2ZXJzaW9uIG9mIEVtYWNzLgorCisoZGVmdW4gZXJsYW5nLXRhZ3MtZGVmaW5lLWtleXMgKG1hcCkKKyAgIkJpbmQgdGFncyBjb21tYW5kcyB0byBrZXltYXAgTUFQIGF3YXJlIG9mIEVybGFuZyBtb2R1bGVzLiIKKyAgKGxldCAoKGFsaXN0IGVybGFuZy10YWdzLWZ1bmN0aW9uLWFsaXN0KSkKKyAgICAod2hpbGUgYWxpc3QKKyAgICAgIChsZXQqICgob2xkIChjYXIgKGNhciBhbGlzdCkpKQorCSAgICAgKG5ldyAoY2RyIChjYXIgYWxpc3QpKSkKKwkgICAgIChrZXlzIChhcHBlbmQgKHdoZXJlLWlzLWludGVybmFsIG9sZCBnbG9iYWwtbWFwKSkpKQorCSh3aGlsZSBrZXlzCisJICAoZGVmaW5lLWtleSBtYXAgKGNhciBrZXlzKSBuZXcpCisJICAoc2V0cSBrZXlzIChjZHIga2V5cykpKSkKKyAgICAgIChzZXRxIGFsaXN0IChjZHIgYWxpc3QpKSkpCisgIDs7IFVwZGF0ZSB0aGUgbWVudS4KKyAgKGVybGFuZy1tZW51LXN1YnN0aXR1dGUgZXJsYW5nLW1lbnUtYmFzZS1pdGVtcyBlcmxhbmctdGFncy1mdW5jdGlvbi1hbGlzdCkKKyAgKGVybGFuZy1tZW51LWluaXQpKQorCisKKzs7IFRoZXJlIGV4aXN0cyBhIHZhcmlhYmxlIGBmaW5kLXRhZy1kZWZhdWx0LWZ1bmN0aW9uJy4gIEl0IGlzIG5vdCB1c2VkCis7OyBzaW5jZSBgY29tcGxldGUtdGFnJyB1c2VzIGl0IHRvIGdldCBjdXJyZW50IHdvcmQgdW5kZXIgcG9pbnQuICBJbiB0aGF0Cis7OyBzaXR1YXRpb24gd2UgZG9lc24ndCB3YW50IHRoZSBtb2R1bGUgdG8gYmUgcHJlcGVuZGVkLgorCisoZGVmdW4gZXJsYW5nLWZpbmQtdGFnLWRlZmF1bHQgKCkKKyAgIlJldHVybiB0aGUgZGVmYXVsdCB0YWcsIHNlYXJjaGVzIGAtaW1wb3J0JyBsaXN0IG9mIGltcG9ydGVkIGZ1bmN0aW9ucy4KK1NpbmdsZSBxdW90ZXMgaGFzIGJlZW4gc3RyaXBwZWQgYXdheS4iCisgIChsZXQgKChtb2QtZnVuYyAoZXJsYW5nLWdldC1mdW5jdGlvbi11bmRlci1wb2ludCkpKQorICAgIChjb25kICgobnVsbCBtb2QtZnVuYykKKwkgICBuaWwpCisJICAoKG51bGwgKGNhciBtb2QtZnVuYykpCisJICAgKG50aCAxIG1vZC1mdW5jKSkKKwkgICh0CisJICAgKGNvbmNhdCAoY2FyIG1vZC1mdW5jKSAiOiIgKG50aCAxIG1vZC1mdW5jKSkpKSkpCisKKworOzsgUmV0dXJuIGB0JyBzaW5jZSBpdCBpcyB1c2VkIGluc2lkZSBgdGFncy1sb29wLWZvcm0nLgorOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBlcmxhbmctZmluZC10YWcgKG1vZHRhZ25hbWUgJm9wdGlvbmFsIG5leHQtcCByZWdleHAtcCkKKyAgIkxpa2UgYGZpbmQtdGFnJy4gIENhcGFibGUgb2YgcmV0cmVpdmluZyBFcmxhbmcgbW9kdWxlcy4KKworVGFncyBjYW4gYmUgZ2l2ZW4gb24gdGhlIGZvcm1zIGB0YWcnLCBgbW9kdWxlOicsIGBtb2R1bGU6dGFnJy4iCisgIChpbnRlcmFjdGl2ZSAoZXJsYW5nLXRhZy1pbnRlcmFjdGl2ZSAiRmluZCBgbW9kdWxlOnRhZycgb3IgYHRhZyc6ICIpKQorICAoc3dpdGNoLXRvLWJ1ZmZlciAoZXJsYW5nLWZpbmQtdGFnLW5vc2VsZWN0IG1vZHRhZ25hbWUgbmV4dC1wIHJlZ2V4cC1wKSkKKyAgdCkKKworCis7OyBDb2RlIG1haW5seSBmcm9tIGBmaW5kLXRhZy1vdGhlci13aW5kb3cnIGluIGBldGFncy5lbCcuCis7OzsjIyNhdXRvbG9hZAorKGRlZnVuIGVybGFuZy1maW5kLXRhZy1vdGhlci13aW5kb3cgKHRhZ25hbWUgJm9wdGlvbmFsIG5leHQtcCByZWdleHAtcCkKKyAgIkxpa2UgYGZpbmQtdGFnLW90aGVyLXdpbmRvdycgYnV0IGF3YXJlIG9mIEVybGFuZyBtb2R1bGVzLiIKKyAgKGludGVyYWN0aXZlIChlcmxhbmctdGFnLWludGVyYWN0aXZlCisJCSJGaW5kIGBtb2R1bGU6dGFnJyBvciBgdGFnJyBvdGhlciB3aW5kb3c6ICIpKQorCisgIDs7IFRoaXMgaXMgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZSB0YWcgaXMgZm91bmQgaW4gdGhlCisgIDs7IHNlbGVjdGVkIHdpbmRvdydzIGJ1ZmZlcjsgd2l0aG91dCB0aGlzLCBwb2ludCBpcyBtb3ZlZCBpbiBib3RoCisgIDs7IHdpbmRvd3MuICBUbyBwcmV2ZW50IHRoaXMsIHdlIHNhdmUgdGhlIHNlbGVjdGVkIHdpbmRvdydzIHBvaW50CisgIDs7IGJlZm9yZSBkb2luZyBmaW5kLXRhZy1ub3NlbGVjdCwgYW5kIHJlc3RvcmUgaXQgYWZ0ZXJ3YXJkcy4KKyAgKGxldCogKCh3aW5kb3ctcG9pbnQgKHdpbmRvdy1wb2ludCAoc2VsZWN0ZWQtd2luZG93KSkpCisJICh0YWdidWYgKGVybGFuZy1maW5kLXRhZy1ub3NlbGVjdCB0YWduYW1lIG5leHQtcCByZWdleHAtcCkpCisJICh0YWdwb2ludCAocHJvZ24gKHNldC1idWZmZXIgdGFnYnVmKSAocG9pbnQpKSkpCisgICAgKHNldC13aW5kb3ctcG9pbnQgKHByb2cxCisJCQkgIChzZWxlY3RlZC13aW5kb3cpCisJCQkoc3dpdGNoLXRvLWJ1ZmZlci1vdGhlci13aW5kb3cgdGFnYnVmKQorCQkJOzsgV2UgaGF2ZSB0byBzZXQgdGhpcyBuZXcgd2luZG93J3MgcG9pbnQ7IGl0CisJCQk7OyBtaWdodCBhbHJlYWR5IGhhdmUgYmVlbiBkaXNwbGF5aW5nIGEKKwkJCTs7IGRpZmZlcmVudCBwb3J0aW9uIG9mIHRhZ2J1ZiwgaW4gd2hpY2ggY2FzZQorCQkJOzsgc3dpdGNoLXRvLWJ1ZmZlci1vdGhlci13aW5kb3cgZG9lc24ndCBzZXQKKwkJCTs7IHRoZSB3aW5kb3cncyBwb2ludCBmcm9tIHRoZSBidWZmZXIuCisJCQkoc2V0LXdpbmRvdy1wb2ludCAoc2VsZWN0ZWQtd2luZG93KSB0YWdwb2ludCkpCisJCSAgICAgIHdpbmRvdy1wb2ludCkpKQorCisKKyhkZWZ1biBlcmxhbmctZmluZC10YWctb3RoZXItZnJhbWUgKHRhZ25hbWUgJm9wdGlvbmFsIG5leHQtcCkKKyAgIkxpa2UgYGZpbmQtdGFnLW90aGVyLWZyYW1lJyBidXQgYXdhcmUgb2YgRXJsYW5nIG1vZHVsZXMuIgorICAoaW50ZXJhY3RpdmUgKGVybGFuZy10YWctaW50ZXJhY3RpdmUKKwkJIkZpbmQgYG1vZHVsZTp0YWcnIG9yIGB0YWcnIG90aGVyIGZyYW1lOiAiKSkKKyAgKGxldCAoKHBvcC11cC1mcmFtZXMgdCkpCisgICAgKGVybGFuZy1maW5kLXRhZy1vdGhlci13aW5kb3cgdGFnbmFtZSBuZXh0LXApKSkKKworCisoZGVmdW4gZXJsYW5nLWZpbmQtdGFnLXJlZ2V4cCAocmVnZXhwICZvcHRpb25hbCBuZXh0LXAgb3RoZXItd2luZG93KQorICAiTGlrZSBgZmluZC10YWctcmVnZXhwJyBidXQgYXdhcmUgb2YgRXJsYW5nIG1vZHVsZXMuIgorICAoaW50ZXJhY3RpdmUgKGlmIChmYm91bmRwICdmaW5kLXRhZy1yZWdleHApCisJCSAgIChlcmxhbmctdGFnLWludGVyYWN0aXZlCisJCSAgICAiRmluZCBgbW9kdWxlOnJlZ2V4cCcgb3IgYHJlZ2V4cCc6ICIpCisJCSAoZXJyb3IgIlRoaXMgdmVyc2lvbiBvZiBFbWFjcyBjYW4ndCBmaW5kIHRhZ3MgYnkgcmVnZXhwcy4iKSkpCisgIChmdW5jYWxsIChpZiBvdGhlci13aW5kb3cKKwkgICAgICAgJ2VybGFuZy1maW5kLXRhZy1vdGhlci13aW5kb3cKKwkgICAgICdlcmxhbmctZmluZC10YWcpCisJICAgcmVnZXhwIG5leHQtcCB0KSkKKworCis7OyBKdXN0IGxpa2UgQy11IE0tLiAgVGhpcyBjb3VsZCBiZSBhZGRlZCB0byB0aGUgbWVudS4KKyhkZWZ1biBlcmxhbmctZmluZC1uZXh0LXRhZyAoKQorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChjdXJyZW50LXByZWZpeC1hcmcgJyg0KSkpCisgICAgKGlmIGVybGFuZy10YWdzLWluc3RhbGxlZAorCShjYWxsLWludGVyYWN0aXZlbHkgJ2VybGFuZy1maW5kLXRhZykKKyAgICAgIChjYWxsLWludGVyYWN0aXZlbHkgJ2ZpbmQtdGFnKSkpKQorCisKKzs7IE1pbWljcyBgZmluZC10YWctbm9zZWxlY3QnIGZvdW5kIGluIGBldGFncy5lbCcsIGJ1dCB1c2VzIGBmaW5kLXRhZycgdG8KKzs7IGJlIGNvbXBhdGlibGUgd2l0aCBgdGFncy5lbCcuCis7OworOzsgSGFuZGxlcyB0aHJlZSBjYXNlczoKKzs7ICogYG1vZHVsZTonICBMb29wIG92ZXIgYWxsIHBvc3NpYmxlIGZpbGVuLWFtZXMuICBTdG9wIGlmIGEgZmlsZS1uYW1lCis7OyAgICAgICAgICAgICAgd2l0aG91dCBleHRlbnNpb24gYW5kIGRpcmVjdG9yeSBtYXRjaGVzIHRoZSBtb2R1bGUuCis7OworOzsgKiBgbW9kdWxlOnRhZycKKzs7CQlFbWFjcyAxOTogUmVwbGFjZSB0ZXN0ZnVuY3Rpb25zIHdpdGggZnVuY3Rpb25zIGF3YXJlIG9mCis7OwkgICAgICAgIEVybGFuZyBtb2R1bGVzLiAgVHJpY2t5IGJlY2F1c2UgdGhlIGV0YWdzIHN5c3RlbSB3YXNuJ3QKKzs7CQlidWlsdCBmb3IgdGhlc2Uga2luZCBvZiBvcGVyYXRpb25zLi4uCis7OworOzsgICAgICAgICAgICAgIEVtYWNzIDE4OiBXZSBsb29wIG92ZXIgYGZpbmQtdGFnJyB1bnRpbCB3ZSBmaW5kIGEgZmlsZQorOzsgICAgICAgICAgICAgIHdob3NlIG1vZHVsZSBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgbW9kdWxlLiAgVGhlCis7OyAgICAgICAgICAgICAgZHJhd2JhY2sgaXMgdGhhdCBhIGxvdCBvZiBmaWxlcyBjb3VsZCBiZSBsb2FkZWQgaW50bworOzsgICAgICAgICAgICAgIEVtYWNzLgorOzsKKzs7ICogYHRhZycgICAgICBKdXN0IGdpdmUgaXQgdG8gYGZpbmQtdGFnJy4KKworKGRlZnVuIGVybGFuZy1maW5kLXRhZy1ub3NlbGVjdCAobW9kdGFnbmFtZSAmb3B0aW9uYWwgbmV4dC1wIHJlZ2V4cC1wKQorICAiTGlrZSBgZmluZC10YWctbm9zZWxlY3QnIGJ1dCBhd2FyZSBvZiBFcmxhbmcgbW9kdWxlcy4iCisgIChpbnRlcmFjdGl2ZSAoZXJsYW5nLXRhZy1pbnRlcmFjdGl2ZSAiRmluZCBgbW9kdWxlOnRhZycgb3IgYHRhZyc6ICIpKQorICAob3IgbW9kdGFnbmFtZQorICAgICAgKHNldHEgbW9kdGFnbmFtZSAoc3ltYm9sLXZhbHVlICdsYXN0LXRhZykpKQorICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpICdsYXN0LXRhZyBtb2R0YWduYW1lKQorICA7OyBgdGFncy5lbCcgdXNlcyB0aGlzIHZhcmlhYmxlIHRvIHJlY29yZCBob3cgTS0sIHdvdWxkCisgIDs7IGtub3cgd2hlcmUgdG8gcmVzdGFydCBhIHRhZ3MgY29tbWFuZC4KKyAgKGlmIChib3VuZHAgJ3RhZ3MtbG9vcC1mb3JtKQorICAgICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KQorCSAgICAgICAndGFncy1sb29wLWZvcm0gJyhlcmxhbmctZmluZC10YWcgbmlsIHQpKSkKKyAgKHNhdmUtd2luZG93LWV4Y3Vyc2lvbgorICAgIChjb25kCisgICAgICgoc3RyaW5nLW1hdGNoICI6JCIgbW9kdGFnbmFtZSkKKyAgICAgIDs7IE9ubHkgdGhlIG1vZHVsZSBuYW1lIHdhcyBnaXZlbi4gIFJlYWQgYWxsIGZpbGVzIHdob3NlIGZpbGUgbmFtZQorICAgICAgOzsgbWF0Y2guCisgICAgICAobGV0ICgobW9kbmFtZSAoc3Vic3RyaW5nIG1vZHRhZ25hbWUgMCAobWF0Y2gtYmVnaW5uaW5nIDApKSkKKwkgICAgKGZpbGUgbmlsKSkKKwkoaWYgKG5vdCBuZXh0LXApCisJICAgIChzYXZlLWV4Y3Vyc2lvbgorCSAgICAgICh2aXNpdC10YWdzLXRhYmxlLWJ1ZmZlcikKKwkgICAgICAoc2V0cSBlcmxhbmctdGFncy1maWxlLWxpc3QKKwkJICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3RhZ3MtdGFibGUtZmlsZXMpKSkpKQorCSh3aGlsZSAobnVsbCBmaWxlKQorCSAgKG9yIGVybGFuZy10YWdzLWZpbGUtbGlzdAorCSAgICAgIChzYXZlLWV4Y3Vyc2lvbgorCQkoaWYgKGFuZCAoZmVhdHVyZXAgJ2V0YWdzKQorCQkJIChmdW5jYWxsCisJCQkgIChzeW1ib2wtZnVuY3Rpb24gJ3Zpc2l0LXRhZ3MtdGFibGUtYnVmZmVyKSAnc2FtZSkKKwkJCSAoZnVuY2FsbAorCQkJICAoc3ltYm9sLWZ1bmN0aW9uICd2aXNpdC10YWdzLXRhYmxlLWJ1ZmZlcikgdCkpCisJCSAgICAoc2V0cSBlcmxhbmctdGFncy1maWxlLWxpc3QKKwkJCSAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAndGFncy10YWJsZS1maWxlcykpKQorCQkgIChlcnJvciAiTm8gJXN0YWdzIGNvbnRhaW5pbmcgJXMiIChpZiBuZXh0LXAgIm1vcmUgIiAiIikKKwkJCSBtb2R0YWduYW1lKSkpKQorCSAgKGlmIGVybGFuZy10YWdzLWZpbGUtbGlzdAorCSAgICAgIChsZXQgKCh0aGlzLW1vZHVsZSAoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUKKwkJCQkgIChjYXIgZXJsYW5nLXRhZ3MtZmlsZS1saXN0KSkpKQorCQkoaWYgKGFuZCAoc3RyaW5ncCB0aGlzLW1vZHVsZSkKKwkJCSAoc3RyaW5nPSBtb2RuYW1lIHRoaXMtbW9kdWxlKSkKKwkJICAgIChzZXRxIGZpbGUgKGNhciBlcmxhbmctdGFncy1maWxlLWxpc3QpKSkKKwkJKHNldHEgZXJsYW5nLXRhZ3MtZmlsZS1saXN0IChjZHIgZXJsYW5nLXRhZ3MtZmlsZS1saXN0KSkpKSkKKwkoc2V0LWJ1ZmZlciAob3IgKGdldC1maWxlLWJ1ZmZlciBmaWxlKQorCQkJKGZpbmQtZmlsZS1ub3NlbGVjdCBmaWxlKSkpKSkKKworICAgICAoKHN0cmluZy1tYXRjaCAiOiIgbW9kdGFnbmFtZSkKKyAgICAgIChpZiAoYm91bmRwICdmaW5kLXRhZy10YWctb3JkZXIpCisJICA7OyBNZXRob2Qgb25lOiBBZGQgbW9kdWxlLXJlY29nbmlzaW5nIGZ1bmN0aW9ucyB0byB0aGUKKwkgIDs7IGxpc3Qgb2Ygb3JkZXIgZnVuY3Rpb25zLiAgSG93ZXZlciwgdGhlIHRhZ3Mgc3lzdGVtCisJICA7OyBmcm9tIEVtYWNzIDE4LCBhbmQgZGVyaXZlcyB0aGVyZW9mIChyZWFkOiBYRW1hY3MpCisJICA7OyBoYXNuJ3QgZ290IHRoaXMgZmVhdHVyZS4KKwkgIChwcm9nbgorCSAgICAoZXJsYW5nLXRhZ3MtaW5zdGFsbC1tb2R1bGUtY2hlY2spCisJICAgICh1bndpbmQtcHJvdGVjdAorCQkoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdmaW5kLXRhZykKKwkJCSBtb2R0YWduYW1lIG5leHQtcCByZWdleHAtcCkKKwkgICAgICAoZXJsYW5nLXRhZ3MtcmVtb3ZlLW1vZHVsZS1jaGVjaykpKQorCTs7IE1ldGhvZCB0d286IENhbGwgdGhlIHRhZ3Mgc3lzdGVtIHVudGlsIGEgZmlsZSBtYXRjaGluZworCTs7IHRoZSBtb2R1bGUgaXMgZm91bmQuICBUaGlzIGNvdWxkIHJlc3VsdCBpbiB0aGF0IG1hbnkKKwk7OyBmaWxlcyBhcmUgcmVhZC4gKGUuZy4gVGhlIHRhZyAiZm9vOmZpbGUiIHdpbGwgdGFrZSBhCisJOzsgd2hpbGUgdG8gcHJvY2Vzcy4pCisJKGxldCogKChtb2RuYW1lIChzdWJzdHJpbmcgbW9kdGFnbmFtZSAwIChtYXRjaC1iZWdpbm5pbmcgMCkpKQorCSAgICAgICAodGFnbmFtZSAoc3Vic3RyaW5nIG1vZHRhZ25hbWUgKG1hdGNoLWVuZCAwKSBuaWwpKQorCSAgICAgICAobGFzdC10YWcgdGFnbmFtZSkKKwkgICAgICAgZmlsZSkKKwkgICh3aGlsZQorCSAgICAgIChwcm9nbgorCQkoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdmaW5kLXRhZykgdGFnbmFtZSBuZXh0LXAgcmVnZXhwLXApCisJCShzZXRxIG5leHQtcCB0KQorCQk7OyBEZXRlcm1pbmUgdGhlIG1vZHVsZSBmb3JtIHRoZSBmaWxlIG5hbWUuICAoVGhlCisJCTs7IGFsdGVybmF0aXZlLCB0byBjaGVjayBgLW1vZHVsZScsIHdvdWxkIG1ha2UgdGhpcworCQk7OyBjb2RlIHVzZWxlc3MgZm9yIG5vbi1FcmxhbmcgcHJvZ3JhbXMuKQorCQkoc2V0cSBmaWxlIChlcmxhbmctZ2V0LW1vZHVsZS1mcm9tLWZpbGUtbmFtZSBidWZmZXItZmlsZS1uYW1lKSkKKwkJKG5vdCAoYW5kIChzdHJpbmdwIGZpbGUpCisJCQkgIChzdHJpbmc9IG1vZG5hbWUgZmlsZSkpKSkpKSkpCisgICAgICh0CisgICAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdmaW5kLXRhZykgbW9kdGFnbmFtZSBuZXh0LXAgcmVnZXhwLXApKSkKKyAgICAoY3VycmVudC1idWZmZXIpKSkJCTsgUmV0dXJuIHRoZSBuZXcgYnVmZmVyLgorCisKKzs7IFByb2Nlc3MgaW50ZXJhY3RpdmUgYXJndW1lbnRzIGZvciBlcmxhbmctZmluZC10YWctKi4KKzs7Cis7OyBOZWdhdGl2ZSBhcmd1bWVudHMgd29yayBvbmx5IGZvciBgZXRhZ3MnLCBub3QgYHRhZ3MnLiAgVGhpcyBpcyBub3QKKzs7IGEgcHJvYmxlbSBzaW5jZSBuZWdhdGl2ZSBhcmd1bWVudHMgbWVhbnMgc3RlcCBiYWNrIGludG8gdGhlCis7OyBoaXN0b3J5IGxpc3QsIGEgZmVhdHVyZSBub3QgaW1wbGVtZW50ZWQgaW4gYHRhZ3MnLgorCisoZGVmdW4gZXJsYW5nLXRhZy1pbnRlcmFjdGl2ZSAocHJvbXB0KQorICAoY29uZGl0aW9uLWNhc2UgbmlsCisgICAgICAocmVxdWlyZSAnZXRhZ3MpCisgICAgKGVycm9yCisgICAgIChyZXF1aXJlICd0YWdzKSkpCisgIChpZiBjdXJyZW50LXByZWZpeC1hcmcKKyAgICAgIChsaXN0IG5pbCAoaWYgKDwgKHByZWZpeC1udW1lcmljLXZhbHVlIGN1cnJlbnQtcHJlZml4LWFyZykgMCkKKwkJICAgICctCisJCSAgdCkpCisgICAgKGxldCogKChkZWZhdWx0IChlcmxhbmctZmluZC10YWctZGVmYXVsdCkpCisJICAgKHByb21wdCAoaWYgZGVmYXVsdAorCQkgICAgICAgKGZvcm1hdCAiJXMoZGVmYXVsdCAlcykgIiBwcm9tcHQgZGVmYXVsdCkKKwkJICAgICBwcm9tcHQpKQorCSAgIChzcGVjIChpZiAoZmVhdHVyZXAgJ2V0YWdzKQorCQkgICAgIChjb21wbGV0aW5nLXJlYWQgcHJvbXB0ICdlcmxhbmctdGFncy1jb21wbGV0ZS10YWcpCisJCSAgIChyZWFkLXN0cmluZyBwcm9tcHQpKSkpCisgICAgICAobGlzdCAoaWYgKGVxdWFsIHNwZWMgIiIpCisJCShvciBkZWZhdWx0IChlcnJvciAiVGhlcmUgaXMgbm8gZGVmYXVsdCB0YWciKSkKKwkgICAgICBzcGVjKSkpKSkKKworDAorOzsgU2VhcmNoIHRhZyBmdW5jdGlvbnMgd2hpY2ggYXJlIGF3YXJlIG9mIEVybGFuZyBtb2R1bGVzLiAgVGhlIHRhY3RpYworOzsgaXMgdG8gc3RvcmUgbmV3IHNlYXJjaCBmdW5jdGlvbnMgaW50byB0aGUgbG9jYWwgdmFyaWFiZWxzIG9mIHRoZQorOzsgVEFHUyBidWZmZXJzLiAgVGhlIHZhcmlhYmxlcyBhcmUgcmVzdG9yZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlCis7OyBzZWFyY2guICBUaGUgc2l0dWF0aW9uIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgbmV3IFRBR1MKKzs7IGZpbGVzIGNhbiBiZSBsb2FkZWQgZHVyaW5nIHRoZSBzZWFyY2guCis7OworOzsgVGhpcyBjb2RlIGlzIEVtYWNzIDE5IGBldGFncycgc3BlY2lmaWMuCisKKyhkZWZ1biBlcmxhbmctdGFncy1pbnN0YWxsLW1vZHVsZS1jaGVjayAoKQorICAiSW5zdGFsbCBvdXIgb3duIHRhZyBzZWFyY2ggZnVuY3Rpb25zLiIKKyAgOzsgTWFrZSBzdXJlIG91ciBmdW5jdGlvbnMgYXJlIGluc3RhbGxlZCBpbiBUQUdTIGZpbGVzIGxvYWRlZAorICA7OyBpbnRvIEVtYWNzIHdoaWxlIHNlYXJjaGluZy4KKyAgKHNldHEgZXJsYW5nLXRhZ3Mtb3JpZy1mb3JtYXQtaG9va3MKKwkoc3ltYm9sLXZhbHVlICd0YWdzLXRhYmxlLWZvcm1hdC1ob29rcykpCisgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkgJ3RhZ3MtdGFibGUtZm9ybWF0LWhvb2tzCisJICAgKGNvbnMgJ2VybGFuZy10YWdzLXJlY29nbml6ZS10YWdzLXRhYmxlCisJCSBlcmxhbmctdGFncy1vcmlnLWZvcm1hdC1ob29rcykpCisgIChzZXRxIGVybGFuZy10YWdzLWJ1ZmZlci1saXN0ICcoKSkKKyAgOzsgSW5zdGFsbCBvdXIgZnVuY3Rpb25zIGluIHRoZSBUQUdTIGZpbGVzIGFscmVhZHkgcmVzaWRlbnQuCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChsZXQgKChmaWxlcyAoc3ltYm9sLXZhbHVlICd0YWdzLXRhYmxlLWNvbXB1dGVkLWxpc3QpKSkKKyAgICAgICh3aGlsZSBmaWxlcworCShpZiAoc3RyaW5ncCAoY2FyIGZpbGVzKSkKKwkgICAgKGlmIChnZXQtZmlsZS1idWZmZXIgKGNhciBmaWxlcykpCisJCShwcm9nbgorCQkgIChzZXQtYnVmZmVyIChnZXQtZmlsZS1idWZmZXIgKGNhciBmaWxlcykpKQorCQkgIChlcmxhbmctdGFncy1pbnN0YWxsLWxvY2FsKSkpKQorCShzZXRxIGZpbGVzIChjZHIgZmlsZXMpKSkpKSkKKworCisoZGVmdW4gZXJsYW5nLXRhZ3MtaW5zdGFsbC1sb2NhbCAoKQorICAiSW5zdGFsbCBvdXIgdGFnIHNlYXJjaCBmdW5jdGlvbnMgaW4gY3VycmVudCBidWZmZXIuIgorICAoaWYgZXJsYW5nLXRhZ3MtYnVmZmVyLWluc3RhbGxlZC1wCisgICAgICAoKQorICAgIDs7IE1hcmsgdGhpcyBidWZmZXIgYXMgImluc3RhbGxlZCIgYW5kIHJlY29yZC4KKyAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdlcmxhbmctdGFncy1idWZmZXItaW5zdGFsbGVkLXApIHQpCisgICAgKHNldHEgZXJsYW5nLXRhZ3MtYnVmZmVyLWxpc3QKKwkgIChjb25zIChjdXJyZW50LWJ1ZmZlcikgZXJsYW5nLXRhZ3MtYnVmZmVyLWxpc3QpKQorCisgICAgOzsgU2F2ZSB0aGUgb3JpZ2luYWwgdmFsdWVzLgorICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2VybGFuZy10YWdzLW9yaWctdGFnLW9yZGVyKQorCSAoc3ltYm9sLXZhbHVlICdmaW5kLXRhZy10YWctb3JkZXIpKQorICAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2VybGFuZy10YWdzLW9yaWctcmVnZXhwLXRhZy1vcmRlcikKKwkgKHN5bWJvbC12YWx1ZSAnZmluZC10YWctcmVnZXhwLXRhZy1vcmRlcikpCisgICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZXJsYW5nLXRhZ3Mtb3JpZy1zZWFyY2gtZnVuY3Rpb24pCisJIChzeW1ib2wtdmFsdWUgJ2ZpbmQtdGFnLXNlYXJjaC1mdW5jdGlvbikpCisgICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZXJsYW5nLXRhZ3Mtb3JpZy1yZWdleHAtc2VhcmNoLWZ1bmN0aW9uKQorCSAoc3ltYm9sLXZhbHVlICdmaW5kLXRhZy1yZWdleHAtc2VhcmNoLWZ1bmN0aW9uKSkKKworICAgIDs7IEluc3RhbGwgb3VyIG93biBmdW5jdGlvbnMuCisgICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZmluZC10YWctc2VhcmNoLWZ1bmN0aW9uKQorCSAnZXJsYW5nLXRhZ3Mtc2VhcmNoLWZvcndhcmQpCisgICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZmluZC10YWctcmVnZXhwLXNlYXJjaC1mdW5jdGlvbikKKwkgJ2VybGFuZy10YWdzLXJlZ2V4cC1zZWFyY2gtZm9yd2FyZCkKKyAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdmaW5kLXRhZy10YWctb3JkZXIpCisJICcoZXJsYW5nLXRhZy1tYXRjaC1tb2R1bGUtcCkpCisgICAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZmluZC10YWctcmVnZXhwLXRhZy1vcmRlcikKKwkgJyhlcmxhbmctdGFnLW1hdGNoLW1vZHVsZS1yZWdleHAtcCkpKSkKKworCisoZGVmdW4gZXJsYW5nLXRhZ3MtcmVtb3ZlLW1vZHVsZS1jaGVjayAoKQorICAiUmVtb3ZlIG91ciBvd24gdGFncyBzZWFyY2ggZnVuY3Rpb25zLiIKKyAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KQorCSAgICd0YWdzLXRhYmxlLWZvcm1hdC1ob29rcworCSAgIGVybGFuZy10YWdzLW9yaWctZm9ybWF0LWhvb2tzKQorICA7OyBSZW1vdmUgb3VyIGZ1bmN0aW9ucyBmcm9tIHRoZSBUQUdTIGZpbGVzLiAgKE5vdGUgdGhhdAorICA7OyBgdGFncy10YWJsZS1jb21wdXRlZC1saXN0JyBuZWVkIG5vdCBiZSB0aGUgc2FtZSBsaXN0IGFzIHdoZW4KKyAgOzsgdGhlIHNlYXJjaCB3YXMgc3RhcnRlZC4pCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIChsZXQgKChidWZmZXJzIGVybGFuZy10YWdzLWJ1ZmZlci1saXN0KSkKKyAgICAgICh3aGlsZSBidWZmZXJzCisJKGlmIChidWZmZXItbmFtZSAoY2FyIGJ1ZmZlcnMpKQorCSAgICAocHJvZ24KKwkgICAgICAoc2V0LWJ1ZmZlciAoY2FyIGJ1ZmZlcnMpKQorCSAgICAgIChlcmxhbmctdGFncy1yZW1vdmUtbG9jYWwpKSkKKwkoc2V0cSBidWZmZXJzIChjZHIgYnVmZmVycykpKSkpKQorCisKKyhkZWZ1biBlcmxhbmctdGFncy1yZW1vdmUtbG9jYWwgKCkKKyAgIlJlbW92ZSBvdXIgdGFnIHNlYXJjaCBmdW5jdGlvbnMgZnJvbSBjdXJyZW50IGJ1ZmZlci4iCisgIChpZiAobnVsbCBlcmxhbmctdGFncy1idWZmZXItaW5zdGFsbGVkLXApCisgICAgICAoKQorICAgIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ3NldCkgJ2VybGFuZy10YWdzLWJ1ZmZlci1pbnN0YWxsZWQtcCBuaWwpCisgICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KQorCSAgICAgJ2ZpbmQtdGFnLXRhZy1vcmRlciBlcmxhbmctdGFncy1vcmlnLXRhZy1vcmRlcikKKyAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpCisJICAgICAnZmluZC10YWctcmVnZXhwLXRhZy1vcmRlciBlcmxhbmctdGFncy1vcmlnLXJlZ2V4cC10YWctb3JkZXIpCisgICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnc2V0KQorCSAgICAgJ2ZpbmQtdGFnLXNlYXJjaC1mdW5jdGlvbiBlcmxhbmctdGFncy1vcmlnLXNlYXJjaC1mdW5jdGlvbikKKyAgICAoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdzZXQpCisJICAgICAnZmluZC10YWctcmVnZXhwLXNlYXJjaC1mdW5jdGlvbgorCSAgICAgZXJsYW5nLXRhZ3Mtb3JpZy1yZWdleHAtc2VhcmNoLWZ1bmN0aW9uKSkpCisKKworKGRlZnVuIGVybGFuZy10YWdzLXJlY29nbml6ZS10YWdzLXRhYmxlICgpCisgICJJbnN0YWxsIG91ciBmdW5jdGlvbnMgaW4gYWxsIGxvYWRlZCBUQUdTIGZpbGVzLgorCitUaGlzIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIGB0YWdzLXRhYmxlLWZvcm1hdC1ob29rcycgd2hlbiBzZWFyY2hpbmcKK2ZvciBhIHRhZyBvbiB0aGUgZm9ybSBgbW9kdWxlOnRhZycuIgorICAoaWYgKG51bGwgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnZXRhZ3MtcmVjb2duaXplLXRhZ3MtdGFibGUpKSkKKyAgICAgIG5pbAorICAgIChlcmxhbmctdGFncy1pbnN0YWxsLWxvY2FsKQorICAgIHQpKQorCisKKyhkZWZ1biBlcmxhbmctdGFncy1zZWFyY2gtZm9yd2FyZCAodGFnICZvcHRpb25hbCBib3VuZCBub2Vycm9yIGNvdW50KQorICAiRm9yd2FyZCBzZWFyY2ggZnVuY3Rpb24sIGF3YXJlIG9mIEVybGFuZyBtb2R1bGUgcHJlZml4LiIKKyAgKGlmIChzdHJpbmctbWF0Y2ggIjoiIHRhZykKKyAgICAgIChzZXRxIHRhZyAoc3Vic3RyaW5nIHRhZyAobWF0Y2gtZW5kIDApIG5pbCkpKQorICA7OyBBdm9pZCB1bmludGVkZWQgcmVjdXJzaW9uLgorICAoaWYgKGVxIGVybGFuZy10YWdzLW9yaWctc2VhcmNoLWZ1bmN0aW9uICdlcmxhbmctdGFncy1zZWFyY2gtZm9yd2FyZCkKKyAgICAgIChzZWFyY2gtZm9yd2FyZCB0YWcgYm91bmQgbm9lcnJvciBjb3VudCkKKyAgICAoZnVuY2FsbCBlcmxhbmctdGFncy1vcmlnLXNlYXJjaC1mdW5jdGlvbiB0YWcgYm91bmQgbm9lcnJvciBjb3VudCkpKQorCisKKyhkZWZ1biBlcmxhbmctdGFncy1yZWdleHAtc2VhcmNoLWZvcndhcmQgKHRhZyAmb3B0aW9uYWwgYm91bmQgbm9lcnJvciBjb3VudCkKKyAgIkZvcndhcmQgcmVnZXhwIHNlYXJjaCBmdW5jdGlvbiwgYXdhcmUgb2YgRXJsYW5nIG1vZHVsZSBwcmVmaXguIgorICAoaWYgKHN0cmluZy1tYXRjaCAiOiIgdGFnKQorICAgICAgKHNldHEgdGFnIChzdWJzdHJpbmcgdGFnIChtYXRjaC1lbmQgMCkgbmlsKSkpCisgIChpZiAoZXEgZXJsYW5nLXRhZ3Mtb3JpZy1yZWdleHAtc2VhcmNoLWZ1bmN0aW9uCisJICAnZXJsYW5nLXRhZ3MtcmVnZXhwLXNlYXJjaC1mb3J3YXJkKQorICAgICAgKHJlLXNlYXJjaC1mb3J3YXJkIHRhZyBib3VuZCBub2Vycm9yIGNvdW50KQorICAgIChmdW5jYWxsIGVybGFuZy10YWdzLW9yaWctcmVnZXhwLXNlYXJjaC1mdW5jdGlvbgorCSAgICAgdGFnIGJvdW5kIG5vZXJyb3IgY291bnQpKSkKKworCis7OyB0IGlmIHBvaW50IGlzIGF0IGEgdGFnIGxpbmUgdGhhdCBtYXRjaGVzIFRBRywgY29udGFpbmluZworOzsgbW9kdWxlIGluZm9ybWF0aW9uLiAgQXNzdW1lcyB0aGF0IGFsbCBvdGhlciBvcmRlciBmdW5jdGlvbnMKKzs7IGFyZSBzdG9yZWQgaW4gYGVybGFuZy10YWdzLW9yaWctW3JlZ2V4XS10YWctb3JkZXInLgorCisoZGVmdW4gZXJsYW5nLXRhZy1tYXRjaC1tb2R1bGUtcCAodGFnKQorICAoZXJsYW5nLXRhZy1tYXRjaC1tb2R1bGUtY29tbW9uLXAgdGFnIGVybGFuZy10YWdzLW9yaWctdGFnLW9yZGVyKSkKKworKGRlZnVuIGVybGFuZy10YWctbWF0Y2gtbW9kdWxlLXJlZ2V4cC1wICh0YWcpCisgIChlcmxhbmctdGFnLW1hdGNoLW1vZHVsZS1jb21tb24tcCB0YWcgZXJsYW5nLXRhZ3Mtb3JpZy1yZWdleHAtdGFnLW9yZGVyKSkKKworKGRlZnVuIGVybGFuZy10YWctbWF0Y2gtbW9kdWxlLWNvbW1vbi1wICh0YWcgb3JkZXIpCisgIChsZXQgKChtb2QgbmlsKQorCShmb3VuZCBuaWwpKQorICAoaWYgKHN0cmluZy1tYXRjaCAiOiIgdGFnKQorICAgICAgKHByb2duCisJKHNldHEgbW9kIChzdWJzdHJpbmcgdGFnIDAgKG1hdGNoLWJlZ2lubmluZyAwKSkpCisJKHNldHEgdGFnIChzdWJzdHJpbmcgdGFnIChtYXRjaC1lbmQgMCkgbmlsKSkpKQorICAod2hpbGUgKGFuZCBvcmRlciAobm90IGZvdW5kKSkKKyAgICAoc2V0cSBmb3VuZAorCSAgKGFuZCAobm90IChtZW1xIChjYXIgb3JkZXIpCisJCQkgICcoZXJsYW5nLXRhZy1tYXRjaC1tb2R1bGUtcAorCQkJICAgIGVybGFuZy10YWctbWF0Y2gtbW9kdWxlLXJlZ2V4cC1wKSkpCisJICAgICAgIChmdW5jYWxsIChjYXIgb3JkZXIpIHRhZykpKQorICAgIChzZXRxIG9yZGVyIChjZHIgb3JkZXIpKSkKKyAgKGFuZCBmb3VuZAorICAgICAgIChvciAobnVsbCBtb2QpCisJICAgKHN0cmluZz0gbW9kIChlcmxhbmctZ2V0LW1vZHVsZS1mcm9tLWZpbGUtbmFtZQorCQkJIChmaWxlLW9mLXRhZykpKSkpKSkKKworDAorOzs7IFRhZ3MgY29tcGxldGlvbiwgRW1hY3MgMTkgYGV0YWdzJyBzcGVjaWZpYy4KKzs7OworOzs7IFRoZSBiYXNpYyBpZGVhIGlzIHRvIGNyZWF0ZSBhIHNlY29uZCBjb21wbGV0aW9uIHRhYmxlIGBlcmxhbmctdGFncy0KKzs7OyBjb21wbGV0aW9uLXRhYmxlJyBjb250YWluaW5nIGFsbCBub3JtYWwgdGFncyBwbHVzIHRhZ3Mgb24gdGhlIGZvcm0KKzs7OyBgbW9kdWxlOnRhZycuCisKKworKGRlZnVuIGVybGFuZy1jb21wbGV0ZS10YWcgKCkKKyAgIlBlcmZvcm0gdGFncyBjb21wbGV0aW9uIG9uIHRoZSB0ZXh0IGFyb3VuZCBwb2ludC4KK0NvbXBsZXRlcyB0byB0aGUgc2V0IG9mIG5hbWVzIGxpc3RlZCBpbiB0aGUgY3VycmVudCB0YWdzIHRhYmxlLgorCitTaG91bGQgdGhlIEVybGFuZyB0YWdzIHN5c3RlbSBiZSBpbnN0YWxsZWQgdGhpcyBjb21tYW5kIGtub3dzCithYm91dCBFcmxhbmcgbW9kdWxlcy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGNvbmRpdGlvbi1jYXNlIG5pbAorICAgICAgKHJlcXVpcmUgJ2V0YWdzKQorICAgIChlcnJvciBuaWwpKQorICAoY29uZCAoKGFuZCBlcmxhbmctdGFncy1pbnN0YWxsZWQKKwkgICAgICAoZmJvdW5kcCAnY29tcGxldGUtdGFnKSkJOyBFbWFjcyAxOQorCSAobGV0ICgob3JpZy10YWdzLWNvbXBsZXRlLXRhZyAoc3ltYm9sLWZ1bmN0aW9uICd0YWdzLWNvbXBsZXRlLXRhZykpKQorCSAgIChmc2V0ICd0YWdzLWNvbXBsZXRlLXRhZworCQkgKHN5bWJvbC1mdW5jdGlvbiAnZXJsYW5nLXRhZ3MtY29tcGxldGUtdGFnKSkKKwkgICAodW53aW5kLXByb3RlY3QKKwkgICAgICAgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnY29tcGxldGUtdGFnKSkKKwkgICAgIChmc2V0ICd0YWdzLWNvbXBsZXRlLXRhZyBvcmlnLXRhZ3MtY29tcGxldGUtdGFnKSkpKQorCSgoZmJvdW5kcCAnY29tcGxldGUtdGFnKQk7IEVtYWNzIDE5CisJIChmdW5jYWxsIChzeW1ib2wtZnVuY3Rpb24gJ2NvbXBsZXRlLXRhZykpKQorCSgoZmJvdW5kcCAndGFnLWNvbXBsZXRlLXN5bWJvbCkJOyBYRW1hY3MKKwkgKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAndGFnLWNvbXBsZXRlLXN5bWJvbCkpKQorCSh0CisJIChlcnJvciAiVGhpcyB2ZXJzaW9uIG9mIEVtYWNzIGNhbid0IGNvbXBsZXRlIHRhZ3MuIikpKSkKKworCis7OyBCYXNlZCBvbiBgdGFncy1jb21wbGV0ZS10YWcnLCBidXQgdGhpcyBvbmUgdXNlcworOzsgYGVybGFuZy10YWctY29tcGxldGlvbi10YWJsZScgaW5zdGVhZCBvZiBgdGFnLWNvbXBsZXRpb24tdGFibGUnLgorOzsKKzs7IFRoaXMgaXMgdGhlIGVudHJ5LXBvaW50IGNhbGxlZCBieSBzeXN0ZW0gZnVuY3Rpb24gYGNvbXBsZXRpbmctcmVhZCcuCisoZGVmdW4gZXJsYW5nLXRhZ3MtY29tcGxldGUtdGFnIChzdHJpbmcgcHJlZGljYXRlIHdoYXQpCisgIChzYXZlLWV4Y3Vyc2lvbgorICAgIDs7IElmIHdlIG5lZWQgdG8gYXNrIGZvciB0aGUgdGFnIHRhYmxlLCBhbGxvdyB0aGF0LgorICAgIChsZXQgKChlbmFibGUtcmVjdXJzaXZlLW1pbmlidWZmZXJzIHQpKQorICAgICAgKHZpc2l0LXRhZ3MtdGFibGUtYnVmZmVyKSkKKyAgICAoaWYgKGVxIHdoYXQgdCkKKwkoYWxsLWNvbXBsZXRpb25zIHN0cmluZyAoZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZSkgcHJlZGljYXRlKQorICAgICAgKHRyeS1jb21wbGV0aW9uIHN0cmluZyAoZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZSkgcHJlZGljYXRlKSkpKQorCisKKzs7IGB0YWdzLWNvbXBsZXRpb24tdGFibGUnIGNhbGxzIGl0c2VsZiByZWN1cnNpdmVseSwgbWFrZSBpdAorOzsgY2FsbCBvdXIgb3duIHdlZGdlIGluc3RlYWQuICBOb3RlIHRoYXQgdGhlIHJlY3Vyc2l2ZSBjYWxsCis7OyBpcyB2ZXJ5IHJhcmU7ICBpdCBvbmx5IG9jY3VycyB3aGVuIGEgdGFncy1maWxlIGNvbnRhaW5zCis7OyBgaW5jbHVkZSctc3RhdGVtZW50cy4KKyhkZWZ1biBlcmxhbmctdGFncy1jb21wbGV0aW9uLXRhYmxlICgpCisgICJCdWlsZCBjb21wbGV0aW9uIHRhYmxlLiAgVGFncyBvbiB0aGUgZm9ybSBgdGFnJyBvciBgbW9kdWxlOnRhZycuIgorICAoc2V0cSBlcmxhbmctdGFncy1vcmlnLWNvbXBsZXRpb24tdGFibGUKKwkoc3ltYm9sLWZ1bmN0aW9uICd0YWdzLWNvbXBsZXRpb24tdGFibGUpKQorICAoZnNldCAndGFncy1jb21wbGV0aW9uLXRhYmxlCisJKHN5bWJvbC1mdW5jdGlvbiAnZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZS0xKSkKKyAgKHVud2luZC1wcm90ZWN0CisgICAgICAoZXJsYW5nLXRhZ3MtY29tcGxldGlvbi10YWJsZS0xKQorICAgIChmc2V0ICd0YWdzLWNvbXBsZXRpb24tdGFibGUKKwkgIGVybGFuZy10YWdzLW9yaWctY29tcGxldGlvbi10YWJsZSkpKQorCisKKyhkZWZ1biBlcmxhbmctdGFncy1jb21wbGV0aW9uLXRhYmxlLTEgKCkKKyAgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2VybGFuZy10YWdzLWNvbXBsZXRpb24tdGFibGUpCisgIChvciBlcmxhbmctdGFncy1jb21wbGV0aW9uLXRhYmxlCisgICAgICAobGV0ICgodGFncy1jb21wbGV0aW9uLXRhYmxlIG5pbCkKKwkgICAgKHRhZ3MtY29tcGxldGlvbi10YWJsZS1mdW5jdGlvbgorCSAgICAgJ2VybGFuZy1ldGFncy10YWdzLWNvbXBsZXRpb24tdGFibGUpKQorCShmdW5jYWxsIGVybGFuZy10YWdzLW9yaWctY29tcGxldGlvbi10YWJsZSkKKwkoc2V0cSBlcmxhbmctdGFncy1jb21wbGV0aW9uLXRhYmxlIHRhZ3MtY29tcGxldGlvbi10YWJsZSkpKSkKKworCis7OyBCYXNlZCBvbiBgZXRhZ3MtdGFncy1jb21wbGV0aW9uLXRhYmxlJy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2UKKzs7IGFkZHMgdGhyZWUgc3ltYm9scyB0byB0aGUgdmVjdG9yLCB0aGUgdGFnLCBtb2R1bGU6IGFuZCBtb2R1bGU6dGFnLgorOzsgVGhlIG1vZHVsZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgZmlsZSBuYW1lIG9mIGEgdGFnLiAgKFRoaXMgb25lCis7OyBvbmx5IHdvcmtzIGlmIHdlIGFyZSBsb29raW5nIGF0IGFuIGBldGFncycgZmlsZS4gSG93ZXZlciwgdGhpcyBpcworOzsgdGhlIG9ubHkgZm9ybWF0IHN1cHBvcnRlZCBieSBFbWFjcywgc28gZmFyLikKKyhkZWZ1biBlcmxhbmctZXRhZ3MtdGFncy1jb21wbGV0aW9uLXRhYmxlICgpCisgIChsZXQgKCh0YWJsZSAobWFrZS12ZWN0b3IgNTExIDApKQorCShmaWxlIG5pbCkpCisgICAgKHNhdmUtZXhjdXJzaW9uCisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgOzsgVGhpcyBtb25zdGVyIHJlZ2V4cCBtYXRjaGVzIGFuIGV0YWdzIHRhZyBsaW5lLgorICAgICAgOzsgICBcMSBpcyB0aGUgc3RyaW5nIHRvIG1hdGNoOworICAgICAgOzsgICBcMiBpcyBub3QgaW50ZXJlc3Rpbmc7CisgICAgICA7OyAgIFwzIGlzIHRoZSBndWVzc2VkIHRhZyBuYW1lOyBYWFggZ3Vlc3Mgc2hvdWxkIGJlIGJldHRlciBlZyBERUZVTgorICAgICAgOzsgICBcNCBpcyBub3QgaW50ZXJlc3Rpbmc7CisgICAgICA7OyAgIFw1IGlzIHRoZSBleHBsaWNpdGx5LXNwZWNpZmllZCB0YWcgbmFtZS4KKyAgICAgIDs7ICAgXDYgaXMgdGhlIGxpbmUgdG8gc3RhcnQgc2VhcmNoaW5nIGF0OworICAgICAgOzsgICBcNyBpcyB0aGUgY2hhciB0byBzdGFydCBzZWFyY2hpbmcgYXQuCisgICAgICAod2hpbGUgKHByb2duCisJICAgICAgICh3aGlsZSAoYW5kCisJCSAgICAgICAoZXEgKGZvbGxvd2luZy1jaGFyKSA/XGYpCisJCSAgICAgICAobG9va2luZy1hdCAiXGZcblxcKFteLFxuXSpcXCksLipcbiIpKQorCQkgKHNldHEgZmlsZSAoYnVmZmVyLXN1YnN0cmluZworCQkJICAgICAobWF0Y2gtYmVnaW5uaW5nIDEpIChtYXRjaC1lbmQgMSkpKQorCQkgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKSkKKwkgICAgICAgKHJlLXNlYXJjaC1mb3J3YXJkCisJCSJcCiteXFwoXFwoW15cMTc3XStbXi1hLXpBLVowLTlfJFwxNzddK1xcKT9cXChbLWEtekEtWjAtOV8kPzpdK1xcKVwKK1xbXi1hLXpBLVowLTlfJD86XDE3N10qXFwpXDE3N1xcKFxcKFteXG5cMDAxXStcXClcMDAxXFwpP1wKK1xcKFswLTldK1xcKT8sXFwoWzAtOV0rXFwpP1xuIgorCQluaWwgdCkpCisJKGxldCAoKHRhZyAoaWYgKG1hdGNoLWJlZ2lubmluZyA1KQorCQkgICAgICAgOzsgVGhlcmUgaXMgYW4gZXhwbGljaXQgdGFnIG5hbWUuCisJCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAobWF0Y2gtYmVnaW5uaW5nIDUpIChtYXRjaC1lbmQgNSkpCisJCSAgICAgOzsgTm8gZXhwbGljaXQgdGFnIG5hbWUuICBCZXN0IGd1ZXNzLgorCQkgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMykgKG1hdGNoLWVuZCAzKSkpKQorCSAgICAgIChtb2R1bGUgKGFuZCBmaWxlCisJCQkgICAoZXJsYW5nLWdldC1tb2R1bGUtZnJvbS1maWxlLW5hbWUgZmlsZSkpKSkKKwkgIChpbnRlcm4gdGFnIHRhYmxlKQorCSAgKGlmIChzdHJpbmdwIG1vZHVsZSkKKwkgICAgICAocHJvZ24KKwkJKGludGVybiAoY29uY2F0IG1vZHVsZSAiOiIgdGFnKSB0YWJsZSkKKwkJOzsgT25seSB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB0YWJsZS4KKwkJKGludGVybiAoY29uY2F0IG1vZHVsZSAiOiIpIHRhYmxlKSkpKSkpCisgICAgdGFibGUpKQorDAorOzs7Cis7OzsgUHJlcGFyZSBmb3Igb3RoZXIgbWV0aG9kcyB0byBydW4gYW4gRXJsYW5nIHNsYXZlIHByb2Nlc3MuCis7OzsKKworKGRlZnZhciBlcmxhbmctc2hlbGwtZnVuY3Rpb24gJ2luZmVyaW9yLWVybGFuZworICAiQ29tbWFuZCB0byBleGVjdXRlIHN0YXJ0IGEgbmV3IEVybGFuZyBzaGVsbC4KKworQ2hhbmdlIHRoaXMgdmFyaWFibGUgdG8gdXNlIHlvdXIgZmF2b3JpdGUKK0VybGFuZyBjb21waWxhdGlvbiBwYWNrYWdlLiIpCisKKyhkZWZ2YXIgZXJsYW5nLXNoZWxsLWRpc3BsYXktZnVuY3Rpb24gJ2luZmVyaW9yLWVybGFuZy1ydW4tb3Itc2VsZWN0CisgICJDb21tYW5kIHRvIGV4ZWN1dGUgdG8gZGlzcGxheSBFcmxhbmcgc2hlbGwuCisKK0NoYW5nZSB0aGlzIHZhcmlhYmxlIHRvIHVzZSB5b3VyIGZhdm9yaXRlCitFcmxhbmcgY29tcGlsYXRpb24gcGFja2FnZS4iKQorCisoZGVmdmFyIGVybGFuZy1jb21waWxlLWZ1bmN0aW9uICdpbmZlcmlvci1lcmxhbmctY29tcGlsZQorICAiQ29tbWFuZCB0byBleGVjdXRlIHRvIGNvbXBpbGUgY3VycmVudCBidWZmZXIuCisKK0NoYW5nZSB0aGlzIHZhcmlhYmxlIHRvIHVzZSB5b3VyIGZhdm9yaXRlCitFcmxhbmcgY29tcGlsYXRpb24gcGFja2FnZS4iKQorCisoZGVmdmFyIGVybGFuZy1jb21waWxlLWRpc3BsYXktZnVuY3Rpb24gJ2luZmVyaW9yLWVybGFuZy1ydW4tb3Itc2VsZWN0CisgICJDb21tYW5kIHRvIGV4ZWN1dGUgdG8gdmlldyBsYXN0IGNvbXBpbGF0aW9uLgorCitDaGFuZ2UgdGhpcyB2YXJpYWJsZSB0byB1c2UgeW91ciBmYXZvcml0ZQorRXJsYW5nIGNvbXBpbGF0aW9uIHBhY2thZ2UuIikKKworKGRlZnZhciBlcmxhbmctbmV4dC1lcnJvci1mdW5jdGlvbiAnaW5mZXJpb3ItZXJsYW5nLW5leHQtZXJyb3IKKyAgIkNvbW1hbmQgdG8gZXhlY3V0ZSB0byBnbyB0byB0aGUgbmV4dCBlcnJvci4KKworQ2hhbmdlIHRoaXMgdmFyaWFibGUgdG8gdXNlIHlvdXIgZmF2b3JpdGUKK0VybGFuZyBjb21waWxhdGlvbiBwYWNrYWdlLiIpCisKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBlcmxhbmctc2hlbGwgKCkKKyAgIlN0YXJ0IGEgbmV3IEVybGFuZyBzaGVsbC4KKworVGhlIHZhcmlhYmxlIGBlcmxhbmctc2hlbGwtZnVuY3Rpb24nIGRlY2lkZXMgd2hpY2ggbWV0aG9kIHRvIHVzZSwKK2RlZmF1bHQgaXMgdG8gc3RhcnQgYSBuZXcgRXJsYW5nIGhvc3QuICBJdCBpcyBwb3NzaWJsZSB0aGF0LCBpbiB0aGUKK2Z1dHVyZSwgYSBuZXcgc2hlbGwgb24gYW4gYWxyZWFkeSBydW5uaW5nIGhvc3Qgd2lsbCBiZSBzdGFydGVkLiIKKyAgKGludGVyYWN0aXZlKQorICAoY2FsbC1pbnRlcmFjdGl2ZWx5IGVybGFuZy1zaGVsbC1mdW5jdGlvbikpCisKKworOzs7IyMjYXV0b2xvYWQgKGF1dG9sb2FkICdydW4tZXJsYW5nICJlcmxhbmciICJTdGFydCBhIG5ldyBFcmxhbmcgc2hlbGwuIiB0KQorCis7OyBJdCBpcyBjdXN0b21hcnkgZm9yIEVtYWNzIHBhY2thZ2VzIHRvIHN1cHBseSBhIGZ1bmN0aW9uIG9uIHRoaXMKKzs7IGZvcm0sIGV2ZW4gdGhvdWdoIGl0IHZpb2xhdGVzIHRoZSBgZXJsYW5nLSonIG5hbWUgY29udmVudGlvbi4KKyhmc2V0ICdydW4tZXJsYW5nICdlcmxhbmctc2hlbGwpCisKKworKGRlZnVuIGVybGFuZy1zaGVsbC1kaXNwbGF5ICgpCisgICJEaXNwbGF5IGFuIEVybGFuZyBzaGVsbCwgb3Igc3RhcnQgYSBuZXcuIgorICAoaW50ZXJhY3RpdmUpCisgIChjYWxsLWludGVyYWN0aXZlbHkgZXJsYW5nLXNoZWxsLWRpc3BsYXktZnVuY3Rpb24pKQorCisKKzs7OyMjI2F1dG9sb2FkCisoZGVmdW4gZXJsYW5nLWNvbXBpbGUgKCkKKyAgIkNvbXBpbGUgRXJsYW5nIG1vZHVsZSBpbiBjdXJyZW50IGJ1ZmZlci4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGNhbGwtaW50ZXJhY3RpdmVseSBlcmxhbmctY29tcGlsZS1mdW5jdGlvbikpCisKKworKGRlZnVuIGVybGFuZy1jb21waWxlLWRpc3BsYXkgKCkKKyAgIkRpc3BsYXkgY29tcGlsYXRpb24gb3V0cHV0LiIKKyAgKGludGVyYWN0aXZlKQorICAoY2FsbC1pbnRlcmFjdGl2ZWx5IGVybGFuZy1jb21waWxlLWRpc3BsYXktZnVuY3Rpb24pKQorCisKKyhkZWZ1biBlcmxhbmctbmV4dC1lcnJvciAoKQorICAiRGlzcGxheSBuZXh0IGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgbGF0ZXN0IGNvbXBpbGF0aW9uLiIKKyAgKGludGVyYWN0aXZlKQorICAoY2FsbC1pbnRlcmFjdGl2ZWx5IGVybGFuZy1uZXh0LWVycm9yLWZ1bmN0aW9uKSkKKworCisMCis7OzsKKzs7OyBFcmxhbmcgU2hlbGwgTW9kZSAtLSBNYWpvciBtb2RlIHVzZWQgZm9yIEVybGFuZyBzaGVsbHMuCis7OzsKKworOzsgVGhpcyBtb2RlIGlzIGRlc2lnbmVkIHRvIGJlIGltcGxlbWVudGF0aW9uIGluZGVwZW5kZW50LAorOzsgZS5nLiBpdCBkb2VzIG5vdCBhc3N1bWUgdGhhdCB3ZSBhcmUgcnVubmluZyBhbiBpbmZlcmlvcgorOzsgRXJsYW5nLCB0aGVyZSBleGlzdHMgYSBsb3Qgb2Ygb3RoZXIgcG9zc2liaWxpdGllcy4KKworCisoZGVmdmFyIGVybGFuZy1zaGVsbC1idWZmZXItbmFtZSAiKmVybGFuZyoiCisgICIqVGhlIG5hbWUgb2YgdGhlIEVybGFuZyBsaW5rIHNoZWxsIGJ1ZmZlci4iKQorCisKKyhkZWZ2YXIgZXJsYW5nLXNoZWxsLW1vZGUtbWFwIG5pbAorICAiKktleW1hcCB1c2VkIGJ5IEVybGFuZyBzaGVsbHMuIikKKworCisoZGVmdmFyIGVybGFuZy1zaGVsbC1tb2RlLWhvb2sgbmlsCisgICIqVXNlciBmdW5jdGlvbnMgdG8gcnVuIHdoZW4gYW4gRXJsYW5nIHNoZWxsIGlzIHN0YXJ0ZWQuCisKK1RoaXMgaG9vayBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIEVybGFuZyBtb2RlLiAgSXQgaXMKK25vcm1hbGx5IHVzZWQgYnkgdGhlIHVzZXIgdG8gcGVyc29uYWxpc2UgdGhlIHByb2dyYW1taW5nIGVudmlyb25tZW50LgorV2hlbiB1c2VkIGluIGEgc2l0ZSBpbml0IGZpbGUsIGl0IGNvdWxkIGJlIHVzZWQgdG8gY3VzdG9taXNlIEVybGFuZworbW9kZSBmb3IgYWxsIHVzZXJzIG9uIHRoZSBzeXN0ZW0uCisKK1RoZSBmdW5jdGlvbmVkIGFkZGVkIHRvIHRoaXMgaG9vayBpcyBydW5lZCBldmVyeSB0aW1lIGEgbmV3IEVybGFuZworc2hlbGwgaXMgc3RhcnRlZC4KKworU2VlIGFsc28gYGVybGFuZy1sb2FkLWhvb2snLCBhIGhvb2sgd2hpY2ggaXMgcnVuZWQgb25jZSwgd2hlbiBFcmxhbmcKK21vZGUgaXMgbG9hZGVkLCBhbmQgYGVybGFuZy1tb2RlLWhvb2snIHdoaWNoIGlzIHJ1bmVkIGV2ZXJ5IHRpbWUgYSBuZXcKK0VybGFuZyBzb3VyY2UgZmlsZSBpcyBsb2FkZWQgaW50byBFbWFjcy4iKQorCisKKyhkZWZ2YXIgZXJsYW5nLWlucHV0LXJpbmctZmlsZS1uYW1lICJ+Ly5lcmxhbmdfaGlzdG9yeSIKKyAgIipXaGVuIG5vbi1uaWwsIGZpbGUgbmFtZSB1c2VkIHRvIHN0b3JlIGVybGFuZyBzaGVsbCBoaXN0b3J5IGluZm9ybWF0aW9uLiIpCisKKworKGRlZnVuIGVybGFuZy1zaGVsbC1tb2RlICgpCisgICJNYWpvciBtb2RlIGZvciBpbnRlcmFjdGluZyB3aXRoIGFuIEVybGFuZyBzaGVsbC4KKworV2UgYXNzdW1lIHRoYXQgd2UgYWxyZWFkeSBhcmUgaW4gY29taW50LW1vZGUuCisKK1RoZSBmb2xsb3dpbmcgc3BlY2lhbCBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOgorXFx7ZXJsYW5nLXNoZWxsLW1vZGUtbWFwfSIKKyAgKGludGVyYWN0aXZlKQorICAoc2V0cSBtYWpvci1tb2RlICdlcmxhbmctc2hlbGwtbW9kZSkKKyAgKHNldHEgbW9kZS1uYW1lICJFcmxhbmcgU2hlbGwiKQorICAoZXJsYW5nLW1vZGUtdmFyaWFibGVzKQorICAoaWYgZXJsYW5nLXNoZWxsLW1vZGUtbWFwCisgICAgICBuaWwKKyAgICAoc2V0cSBlcmxhbmctc2hlbGwtbW9kZS1tYXAgKGNvcHkta2V5bWFwIGNvbWludC1tb2RlLW1hcCkpCisgICAgKGVybGFuZy1zaGVsbC1tb2RlLWNvbW1hbmRzIGVybGFuZy1zaGVsbC1tb2RlLW1hcCkpCisgICh1c2UtbG9jYWwtbWFwIGVybGFuZy1zaGVsbC1tb2RlLW1hcCkKKyAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29tcGlsYXRpb24tcGFyc2luZy1lbmQpIDEpCisgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2NvbXBpbGF0aW9uLWVycm9yLWxpc3QpIG5pbCkKKyAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnY29tcGlsYXRpb24tb2xkLWVycm9yLWxpc3QpIG5pbCkKKyAgOzsgTmVlZGVkIHdoZW4gY29tcGlsaW5nIGRpcmVjdGx5IGZyb20gdGhlIEVybGFuZyBzaGVsbC4KKyAgKHNldHEgY29tcGlsYXRpb24tbGFzdC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKyAgKGVybGFuZy1hZGQtY29tcGlsYXRpb24tYWxpc3QgZXJsYW5nLWVycm9yLXJlZ2V4cC1hbGlzdCkKKyAgKHNldHEgY29taW50LXByb21wdC1yZWdleHAgIl5bXj49XSo+ICoiKQorICAoc2V0cSBjb21pbnQtZW9sLW9uLXNlbmQgdCkKKyAgKHNldHEgY29taW50LWlucHV0LWlnbm9yZWR1cHMgdCkKKyAgKHNldHEgY29taW50LXNjcm9sbC1zaG93LW1heGltdW0tb3V0cHV0IHQpCisgIChzZXRxIGNvbWludC1zY3JvbGwtdG8tYm90dG9tLW9uLW91dHB1dCB0KQorICA7OyBJbiBFbWFjcyAxOS4zMCwgYGFkZC1ob29rJyBoYXMgZ290IGEgYGxvY2FsJyBmbGFnLCB1c2UgaXQuICBJZgorICA7OyB0aGUgY2FsbCBmYWlscywganVzdCBjYWxsIHRoZSBub3JtYWwgYGFkZC1ob29rJy4KKyAgKGNvbmRpdGlvbi1jYXNlIG5pbAorICAgICAgKHByb2duCisJKGZ1bmNhbGwgKHN5bWJvbC1mdW5jdGlvbiAnYWRkLWhvb2spICdjb21pbnQtb3V0cHV0LWZpbHRlci1mdW5jdGlvbnMKKwkJICAnaW5mZXJpb3ItZXJsYW5nLXN0cmlwLWRlbGV0ZSBuaWwgdCkKKwkoZnVuY2FsbCAoc3ltYm9sLWZ1bmN0aW9uICdhZGQtaG9vaykgJ2NvbWludC1vdXRwdXQtZmlsdGVyLWZ1bmN0aW9ucworCQkgICdpbmZlcmlvci1lcmxhbmctc3RyaXAtY3RybC1tIG5pbCB0KSkKKyAgICAoZXJyb3IKKyAgICAgKGFkZC1ob29rICdjb21pbnQtb3V0cHV0LWZpbHRlci1mdW5jdGlvbnMgJ2luZmVyaW9yLWVybGFuZy1zdHJpcC1kZWxldGUpCisgICAgIChhZGQtaG9vayAnY29taW50LW91dHB1dC1maWx0ZXItZnVuY3Rpb25zICdpbmZlcmlvci1lcmxhbmctc3RyaXAtY3RybC1tKSkpCisgIDs7IFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgY29taW50IGRvZXNuJ3QgaGF2ZSBhbiBpbnB1dCByaW5nLgorICAoaWYgKGZib3VuZHAgJ2NvbWludC1yZWFkLWlucHV0LXJpbmcpCisgICAgICAocHJvZ24KKwkoc2V0cSBjb21pbnQtaW5wdXQtcmluZy1maWxlLW5hbWUgZXJsYW5nLWlucHV0LXJpbmctZmlsZS1uYW1lKQorCShjb21pbnQtcmVhZC1pbnB1dC1yaW5nIHQpCisJKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2tpbGwtYnVmZmVyLWhvb2spCisJKGFkZC1ob29rICdraWxsLWJ1ZmZlci1ob29rICdjb21pbnQtd3JpdGUtaW5wdXQtcmluZykpKQorICAocnVuLWhvb2tzICdlcmxhbmctc2hlbGwtbW9kZS1ob29rKSkKKworCisoZGVmdW4gZXJsYW5nLXNoZWxsLW1vZGUtY29tbWFuZHMgKG1hcCkKKyAgKGRlZmluZS1rZXkgbWFwICJcTS1cdCIgICAgJ2VybGFuZy1jb21wbGV0ZS10YWcpCisgIChkZWZpbmUta2V5IG1hcCAiXEMtYSIgICAgICdjb21pbnQtYm9sKSA7IE5vcm1hbGx5IHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICAoZGVmaW5lLWtleSBtYXAgIlxDLWNcQy1hIiAnYmVnaW5uaW5nLW9mLWxpbmUpCisgIChkZWZpbmUta2V5IG1hcCAiXEMtZCIgICAgIG5pbCkJOyBXYXMgYGNvbWludC1kZWxjaGFyLW9yLW1heWJlLWVvZicKKyAgKGRlZmluZS1rZXkgbWFwICJcQy14YCIgICAgJ2VybGFuZy1uZXh0LWVycm9yKSkKKwwKKzs7OworOzs7IEluZmVyaW9yIEVybGFuZyAtLSBSdW4gYW4gRXJsYW5nIHNoZWxsIGFzIGEgc3VicHJvY2Vzcy4KKzs7OworCisoZGVmdmFyIGluZmVyaW9yLWVybGFuZy1kaXNwbGF5LWJ1ZmZlci1hbnktZnJhbWUgbmlsCisgICIqV2hlbiBuaWwsIGBpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXInIHVzZSBvbmx5IHNlbGVjdGVkIGZyYW1lLgorV2hlbiB0LCBhbGwgZnJhbWVzIGFyZSBzZWFyY2hlZC4gIFdoZW4gJ3JhaXNlLCB0aGUgZnJhbWUgaXMgcmFpc2VkLiIpCisKKyhkZWZ2YXIgaW5mZXJpb3ItZXJsYW5nLXNoZWxsLXR5cGUgJ25ld3NoZWxsCisgICJUaGUgdHlwZSBvZiBFcmxhbmcgc2hlbGwgdG8gdXNlLgorCitXaGVuIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBhdG9tIGBvbGRzaGVsbCcsIHRoZSBvbGQgc2hlbGwgaXMgdXNlZC4KK1doZW4gc2V0IHRvIGBuZXdzaGVsbCcgdGhlIG5ldyBzaGVsbCBpcyB1c2VkLiAgU2hvdWxkIHRoZSB2YXJpYWJsZSBiZQorbmlsLCB0aGUgZGVmYXVsdCBzaGVsbCBpcyB1c2VkLgorCitUaGlzIHZhcmlhYmxlIGluZmx1ZW5jZSB0aGUgc2V0dGluZyBvZiBvdGhlciB2YXJpYWJsZXMuIikKKworKGRlZnZhciBpbmZlcmlvci1lcmxhbmctbWFjaGluZSAiZXJsIgorICAiKlRoZSBuYW1lIG9mIHRoZSBFcmxhbmcgc2hlbGwuIikKKworKGRlZnZhciBpbmZlcmlvci1lcmxhbmctbWFjaGluZS1vcHRpb25zICcoKQorICAiKlRoZSBvcHRpb25zIHVzZWQgd2hlbiBhY3RpdmF0aW5nIHRoZSBFcmxhbmcgc2hlbGwuCisKK1RoaXMgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncy4iKQorCisoZGVmdmFyIGluZmVyaW9yLWVybGFuZy1wcm9jZXNzLW5hbWUgImluZmVyaW9yLWVybGFuZyIKKyAgIipUaGUgbmFtZSBvZiB0aGUgaW5mZXJpb3IgRXJsYW5nIHByb2Nlc3MuIikKKworKGRlZnZhciBpbmZlcmlvci1lcmxhbmctYnVmZmVyLW5hbWUgZXJsYW5nLXNoZWxsLWJ1ZmZlci1uYW1lCisgICIqVGhlIG5hbWUgb2YgdGhlIGluZmVyaW9yIGVybGFuZyBidWZmZXIuIikKKworKGRlZnZhciBpbmZlcmlvci1lcmxhbmctcHJvbXB0LXRpbWVvdXQgNjAKKyAgIipOdW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgYGluZmVyaW9yLWVybGFuZy13YWl0LXByb21wdCcgdGltZW91dHMuCisKK1RoZSB0aW1lIHNwZWNpZmllZCBpcyB3YWl0ZWQgYWZ0ZXIgZXZlcnkgb3V0cHV0IG1hZGUgYnkgdGhlIGluZmVyaW9yCitFcmxhbmcgc2hlbGwuICBXaGVuIHRoaXMgdmFyaWFibGUgaXMgdCwgd2UgYXNzdW1lIHRoYXQgd2UgYWx3YXlzIGhhdmUKK2EgcHJvbXB0LiAgV2hlbiBuaWwsIHdlIHdpbGwgd2FpdCBmb3JldmVyLCBvciB1bnRpbCBDLWcuIikKKworKGRlZnZhciBpbmZlcmlvci1lcmxhbmctcHJvY2VzcyBuaWwKKyAgIlByb2Nlc3Mgb2YgbGFzdCBpbnZva2VkIGluZmVyaW9yIEVybGFuZywgb3IgbmlsLiIpCisKKyhkZWZ2YXIgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlciBuaWwKKyAgIkJ1ZmZlciBvZiBsYXN0IGludm9rZWQgaW5mZXJpb3IgRXJsYW5nLCBvciBuaWwuIikKKworOzs7IyMjYXV0b2xvYWQKKyhkZWZ1biBpbmZlcmlvci1lcmxhbmcgKCkKKyAgIlJ1biBhbiBpbmZlcmlvciBFcmxhbmcuCisKK1RoaXMgaXMganVzdCBsaWtlIHJ1bm5pbmcgRXJsYW5nIGluIGEgbm9ybWFsIHNoZWxsLCBleGNlcHQgdGhhdAorYW4gRW1hY3MgYnVmZmVyIGlzIHVzZWQgZm9yIGlucHV0IGFuZCBvdXRwdXQuCisKK1RoZSBjb21tYW5kIGxpbmUgaGlzdG9yeSBjYW4gYmUgYWNjZXNzZWQgd2l0aCAgTS1wICBhbmQgIE0tbi4KK1RoZSBoaXN0b3J5IGlzIHNhdmVkIGJldHdlZW4gc2Vzc2lvbnMuCisKK0VudHJ5IHRvIHRoaXMgbW9kZSBjYWxscyB0aGUgZnVuY3Rpb25zIGluIHRoZSB2YXJpYWJsZXMKK2Bjb21pbnQtbW9kZS1ob29rJyBhbmQgYGVybGFuZy1zaGVsbC1tb2RlLWhvb2snIHdpdGggbm8gYXJndW1lbnRzLgorCitUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGltaXRhdGUgdGhlIHVzdWFsIFVuaXggaW50ZXJydXB0IGFuZAorZWRpdGluZyBjb250cm9sIGNoYXJhY3RlcnM6CitcXHtlcmxhbmctc2hlbGwtbW9kZS1tYXB9IgorICAoaW50ZXJhY3RpdmUpCisgIChyZXF1aXJlICdjb21pbnQpCisgIChsZXQgKChvcHRzIGluZmVyaW9yLWVybGFuZy1tYWNoaW5lLW9wdGlvbnMpKQorICAgIChjb25kICgoZXEgaW5mZXJpb3ItZXJsYW5nLXNoZWxsLXR5cGUgJ29sZHNoZWxsKQorCSAgIChzZXRxIG9wdHMgKGNvbnMgIi1vbGRzaGVsbCIgb3B0cykpKQorCSAgKChlcSBpbmZlcmlvci1lcmxhbmctc2hlbGwtdHlwZSAnbmV3c2hlbGwpCisJICAgKHNldHEgb3B0cyAoYXBwZW5kICcoIi1uZXdzaGVsbCIgIi1lbnYiICJURVJNIiAidnQxMDAiKSBvcHRzKSkpKQorICAgIChzZXRxIGluZmVyaW9yLWVybGFuZy1idWZmZXIKKwkgIChhcHBseSAnbWFrZS1jb21pbnQKKwkJIGluZmVyaW9yLWVybGFuZy1wcm9jZXNzLW5hbWUgaW5mZXJpb3ItZXJsYW5nLW1hY2hpbmUKKwkgICAgICAgbmlsIG9wdHMpKSkKKyAgKHNldHEgaW5mZXJpb3ItZXJsYW5nLXByb2Nlc3MKKwkoZ2V0LWJ1ZmZlci1wcm9jZXNzIGluZmVyaW9yLWVybGFuZy1idWZmZXIpKQorICAocHJvY2Vzcy1raWxsLXdpdGhvdXQtcXVlcnkgaW5mZXJpb3ItZXJsYW5nLXByb2Nlc3MpCisgIChzd2l0Y2gtdG8tYnVmZmVyIGluZmVyaW9yLWVybGFuZy1idWZmZXIpCisgIChpZiAoYW5kIChub3QgKGVxIHN5c3RlbS10eXBlICd3aW5kb3dzLW50KSkKKwkgICAoZXEgaW5mZXJpb3ItZXJsYW5nLXNoZWxsLXR5cGUgJ25ld3NoZWxsKSkKKyAgICAgIChzZXRxIGNvbWludC1wcm9jZXNzLWVjaG9lcyB0KSkKKyAgOzsgYHJlbmFtZS1idWZmZXInIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50IGluIEVtYWNzIDE4LgorICAoY29uZGl0aW9uLWNhc2UgbmlsCisgICAgICAocmVuYW1lLWJ1ZmZlciBpbmZlcmlvci1lcmxhbmctYnVmZmVyLW5hbWUgdCkKKyAgICAoZXJyb3IgKHJlbmFtZS1idWZmZXIgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlci1uYW1lKSkpCisgIChlcmxhbmctc2hlbGwtbW9kZSkpCisKKworKGRlZnVuIGluZmVyaW9yLWVybGFuZy1ydW4tb3Itc2VsZWN0ICgpCisgICJTd2l0Y2ggdG8gYW4gaW5mZXJpb3IgRXJsYW5nIGJ1ZmZlciwgcG9zc2libHkgc3RhcnRpbmcgbmV3IHByb2Nlc3MuIgorICAoaW50ZXJhY3RpdmUpCisgIChpZiAobnVsbCAoaW5mZXJpb3ItZXJsYW5nLXJ1bm5pbmctcCkpCisgICAgICAoaW5mZXJpb3ItZXJsYW5nKQorICAgIChpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXIgdCkpKQorCisKKyhkZWZ1biBpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXIgKCZvcHRpb25hbCBzZWxlY3QpCisgICJNYWtlIHRoZSBpbmZlcmlvciBFcmxhbmcgcHJvY2VzcyB2aXNpYmxlLgorVGhlIHdpbmRvdyBpcyByZXR1cm5lZC4KKworU2hvdWxkIGBpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXItYW55LWZyYW1lJyBiZSBuaWwgdGhlIGJ1ZmZlciBpcworZGlzcGxheWVkIGluIHRoZSBjdXJyZW50IGZyYW1lLiAgU2hvdWxkIGl0IGJlIG5vbi1uaWwsIGFuZCB0aGUgYnVmZmVyCithbHJlYWR5IGlzIHZpc2libGUgaW4gYW55IG90aGVyIGZyYW1lLCBubyBuZXcgd2luZG93IHdpbGwgYmUgY3JlYXRlZC4KK1Nob3VsZCBpdCBiZSB0aGUgYXRvbSAncmFpc2UsIHRoZSBmcmFtZSBjb250YWluaW5nIHRoZSB3aW5kb3cgd2lsbAorYmUgcmFpc2VkLgorCitTaG91bGQgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IFNFTEVDVCBiZSBub24tbmlsLCB0aGUgd2luZG93IGlzCitzZWxlY3RlZC4gIFNob3VsZCB0aGUgd2luZG93IGJlIGluIGFub3RoZXIgZnJhbWUsIHRoYXQgZnJhbWUgaXMgcmFpc2VkLgorCitOb3RlLCBzaG91bGQgdGhlIG1vdXNlIHBvaW50ZXIgYmUgcGxhY2VzIG91dHNpZGUgdGhlIHJhaXNlZCBmcmFtZSwgdGhhdAorZnJhbWUgd2lsbCBiZWNvbWUgZGVzZWxlY3RlZCBiZWZvcmUgdGhlIG5leHQgY29tbWFuZC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKG9yIChpbmZlcmlvci1lcmxhbmctcnVubmluZy1wKQorICAgICAgKGVycm9yICJObyBpbmZlcmlvciBFcmxhbmcgcHJvY2VzcyBpcyBydW5uaW5nLiIpKQorICAobGV0ICgod2luIChpbmZlcmlvci1lcmxhbmctd2luZG93CisJICAgICAgaW5mZXJpb3ItZXJsYW5nLWRpc3BsYXktYnVmZmVyLWFueS1mcmFtZSkpCisJKGZyYW1lcy1wIChmYm91bmRwICdzZWxlY3RlZC1mcmFtZSkpKQorICAgIChpZiAobnVsbCB3aW4pCisJKGxldCAoKG9sZC13aW4gKHNlbGVjdGVkLXdpbmRvdykpKQorCSAgKHNhdmUtZXhjdXJzaW9uCisJICAgIChzd2l0Y2gtdG8tYnVmZmVyLW90aGVyLXdpbmRvdyBpbmZlcmlvci1lcmxhbmctYnVmZmVyKQorCSAgICAoc2V0cSB3aW4gKHNlbGVjdGVkLXdpbmRvdykpKQorCSAgKHNlbGVjdC13aW5kb3cgb2xkLXdpbikpCisgICAgICAoaWYgKGFuZCB3aW5kb3ctc3lzdGVtCisJICAgICAgIGZyYW1lcy1wCisJICAgICAgIChvciBzZWxlY3QKKwkJICAgKGVxIGluZmVyaW9yLWVybGFuZy1kaXNwbGF5LWJ1ZmZlci1hbnktZnJhbWUgJ3JhaXNlKSkKKwkgICAgICAgKG5vdCAoZXEgKHNlbGVjdGVkLWZyYW1lKSAod2luZG93LWZyYW1lIHdpbikpKSkKKwkgIChyYWlzZS1mcmFtZSAod2luZG93LWZyYW1lIHdpbikpKSkKKyAgICAoaWYgc2VsZWN0CisJKHNlbGVjdC13aW5kb3cgd2luKSkKKyAgICAoc2l0LWZvciAwKQorICAgIHdpbikpCisKKworKGRlZnVuIGluZmVyaW9yLWVybGFuZy1ydW5uaW5nLXAgKCkKKyAgIk5vbi1uaWwgd2hlbiBhbiBpbmZlcmlvciBFcmxhbmcgaXMgcnVubmluZy4iCisgIChhbmQgaW5mZXJpb3ItZXJsYW5nLXByb2Nlc3MKKwkgICAobWVtcSAocHJvY2Vzcy1zdGF0dXMgaW5mZXJpb3ItZXJsYW5nLXByb2Nlc3MpICcocnVuIG9wZW4pKQorCSAgIGluZmVyaW9yLWVybGFuZy1idWZmZXIKKwkgICAoYnVmZmVyLW5hbWUgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlcikpKQorCisKKyhkZWZ1biBpbmZlcmlvci1lcmxhbmctd2luZG93ICgmb3B0aW9uYWwgYWxsLWZyYW1lcykKKyAgIlJldHVybiB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIGluZmVyaW9yIEVybGFuZywgb3IgbmlsLiIKKyAgKGFuZCAoaW5mZXJpb3ItZXJsYW5nLXJ1bm5pbmctcCkKKyAgICAgICAoaWYgKGFuZCBhbGwtZnJhbWVzICg+PSBlcmxhbmctZW1hY3MtbWFqb3ItdmVyc2lvbiAxOSkpCisJICAgKGdldC1idWZmZXItd2luZG93IGluZmVyaW9yLWVybGFuZy1idWZmZXIgdCkKKwkgKGdldC1idWZmZXItd2luZG93IGluZmVyaW9yLWVybGFuZy1idWZmZXIpKSkpCisKKworKGRlZnVuIGluZmVyaW9yLWVybGFuZy13YWl0LXByb21wdCAoKQorICAiV2FpdCB1bnRpbCB0aGUgaW5mZXJpb3IgRXJsYW5nIHNoZWxsIHByb21wdCBhcHBlYXIuIgorICAoaWYgKGVxIGluZmVyaW9yLWVybGFuZy1wcm9tcHQtdGltZW91dCB0KQorICAgICAgKCkKKyAgICAob3IgKGluZmVyaW9yLWVybGFuZy1ydW5uaW5nLXApCisJKGVycm9yICJObyBpbmZlcmlvciBFcmxhbmcgc2hlbGwgaXMgcnVubmluZy4iKSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgIChzZXQtYnVmZmVyIGluZmVyaW9yLWVybGFuZy1idWZmZXIpCisgICAgICAobGV0ICgobXNnIG5pbCkpCisJKHdoaWxlIChzYXZlLWV4Y3Vyc2lvbgorCQkgKGdvdG8tY2hhciAocHJvY2Vzcy1tYXJrIGluZmVyaW9yLWVybGFuZy1wcm9jZXNzKSkKKwkJIChmb3J3YXJkLWxpbmUgMCkKKwkJIChub3QgKGxvb2tpbmctYXQgY29taW50LXByb21wdC1yZWdleHApKSkKKwkgIChpZiBtc2cKKwkgICAgICAoKQorCSAgICAoc2V0cSBtc2cgdCkKKwkgICAgKG1lc3NhZ2UgIldhaXRpbmcgZm9yIEVybGFuZyBzaGVsbCBwcm9tcHQgKHByZXNzIEMtZyB0byBhYm9ydCkuIikpCisJICAob3IgKGFjY2VwdC1wcm9jZXNzLW91dHB1dCBpbmZlcmlvci1lcmxhbmctcHJvY2VzcworCQkJCSAgICAgaW5mZXJpb3ItZXJsYW5nLXByb21wdC10aW1lb3V0KQorCSAgICAgIChlcnJvciAiTm8gRXJsYW5nIHNoZWxsIHByb21wdCBiZWZvcmUgdGltZW91dC4iKSkpCisJKGlmIG1zZyAobWVzc2FnZSAiIikpKSkpKQorCisKKyhkZWZ1biBpbmZlcmlvci1lcmxhbmctc2VuZC1jb21tYW5kIChjbWQgJm9wdGlvbmFsIGhpc3QpCisgICJTZW5kIGNvbW1hbmQgQ01EIHRvIHRoZSBpbmZlcmlvciBFcmxhbmcuCisKK1RoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBjb21tYW5kIGxpbmUgKGlmIGFueSkgd2lsbAorYmUgcGxhY2VkIGF0IHRoZSBuZXh0IHByb21wdC4KKworSWYgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIG5vbi1uaWwgdGhlIGNvbW1hbmQgaXMgaW5zZXJ0ZWQgaW50bwordGhlIGhpc3RvcnkgbGlzdC4KKworUmV0dXJuIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgbmV3bHkgaW5zZXJ0ZWQgY29tbWFuZC4iCisgIChvciAoaW5mZXJpb3ItZXJsYW5nLXJ1bm5pbmctcCkKKyAgICAgIChlcnJvciAiTm8gaW5mZXJpb3IgRXJsYW5nIHByb2Nlc3MgaXMgcnVubmluZy4iKSkKKyAgKGxldCAoKG9sZC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKwkoaW5zZXJ0LXBvaW50IChtYXJrZXItcG9zaXRpb24KKwkJICAgICAgIChwcm9jZXNzLW1hcmsgaW5mZXJpb3ItZXJsYW5nLXByb2Nlc3MpKSkKKwkoaW5zZXJ0LWxlbmd0aCAoaWYgY29taW50LXByb2Nlc3MtZWNob2VzCisJCQkgICAwCisJCQkgKDErIChsZW5ndGggY21kKSkpKSkKKyAgICAoc2V0LWJ1ZmZlciBpbmZlcmlvci1lcmxhbmctYnVmZmVyKQorICAgIChnb3RvLWNoYXIgaW5zZXJ0LXBvaW50KQorICAgIChpbnNlcnQgY21kKQorICAgIDs7IFN0cmFuZ2UgdGhpbmdzIGhhcHBlbmQgaWYgYGNvbWludC1lb2wtb24tc2VuZCcgaXMgZGVjbGFyZWQKKyAgICA7OyBpbiB0aGUgYGxldCcgZXhwcmVzc2lvbiBhYm92ZSwgYnV0IHNldHE6ZCBoZXJlLiBUaGUKKyAgICA7OyBgc2V0LWJ1ZmZlcicgc3RhdGVtZW50IG9idmlvdXNseSBtYWtlcyB0aGUgYnVmZmVyIGxvY2FsCisgICAgOzsgaW5zdGFuY2Ugb2YgYGNvbWludC1lb2wtb24tc2VuZCcgc2hhZG93IHRoaXMgb25lLgorICAgIDs7IEknbSBjb25zaWRlcmluZyB0aGlzIGEgYnVnIGluIEVsaXNwLgorICAgIChsZXQgKChjb21pbnQtZW9sLW9uLXNlbmQgbmlsKQorCSAgKGNvbWludC1pbnB1dC1maWx0ZXIgKGlmIGhpc3QgY29taW50LWlucHV0LWZpbHRlciAnaWdub3JlKSkpCisgICAgICAoY29taW50LXNlbmQtaW5wdXQpKQorICAgIDs7IEFkanVzdCBhbGwgd2luZG93cyB3aG9zZSBwb2ludHMgYXJlIGluY29ycmVjdC4KKyAgICAoaWYgKG51bGwgY29taW50LXByb2Nlc3MtZWNob2VzKQorCSh3YWxrLXdpbmRvd3MKKwkgKGZ1bmN0aW9uCisJICAobGFtYmRhICh3aW5kb3cpCisJICAgIChpZiAoYW5kIChlcSAod2luZG93LWJ1ZmZlciB3aW5kb3cpIGluZmVyaW9yLWVybGFuZy1idWZmZXIpCisJCSAgICAgKGVxICh3aW5kb3ctcG9pbnQgd2luZG93KSBpbnNlcnQtcG9pbnQpKQorCQkoc2V0LXdpbmRvdy1wb2ludCB3aW5kb3cKKwkJCQkgICgrIGluc2VydC1wb2ludCBpbnNlcnQtbGVuZ3RoKSkpKSkKKwkgbmlsIHQpKQorICAgIChzZXQtYnVmZmVyIG9sZC1idWZmZXIpCisgICAgKCsgaW5zZXJ0LXBvaW50IGluc2VydC1sZW5ndGgpKSkKKworCisoZGVmdW4gaW5mZXJpb3ItZXJsYW5nLXN0cmlwLWRlbGV0ZSAoJm9wdGlvbmFsIHMpCisgICJSZW1vdmUgYF5IJyAoZGVsZXRlKSBhbmQgdGhlIGNoYXJhY3RlcnMgaXQgd2FzIHN1cHBvc2VkIHRvIHJlbW92ZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGlmIChhbmQgKGJvdW5kcCAnY29taW50LWxhc3QtaW5wdXQtZW5kKQorCSAgIChib3VuZHAgJ2NvbWludC1sYXN0LW91dHB1dC1zdGFydCkpCisgICAgICAoc2F2ZS1leGN1cnNpb24KKwkoZ290by1jaGFyCisJIChpZiAoaW50ZXJhY3RpdmUtcCkKKwkgICAgIChzeW1ib2wtdmFsdWUgJ2NvbWludC1sYXN0LWlucHV0LWVuZCkKKwkgICAoc3ltYm9sLXZhbHVlICdjb21pbnQtbGFzdC1vdXRwdXQtc3RhcnQpKSkKKwkod2hpbGUgKHByb2duIChza2lwLWNoYXJzLWZvcndhcmQgIl5cQy1oIikKKwkJICAgICAgKG5vdCAoZXEgKHBvaW50KSAocG9pbnQtbWF4KSkpKQorCSAgKGRlbGV0ZS1jaGFyIDEpCisJICAob3IgKGJvbHApCisJICAgICAgKGJhY2t3YXJkLWRlbGV0ZS1jaGFyIDEpKSkpKSkKKworCis7OyBCYXNpY2FsbHkgYGNvbWludC1zdHJpcC1jdHJsLW0nLCB3aXRoIGEgZmV3IGV4dHJhIGNoZWNrcy4KKyhkZWZ1biBpbmZlcmlvci1lcmxhbmctc3RyaXAtY3RybC1tICgmb3B0aW9uYWwgc3RyaW5nKQorICAiU3RyaXAgdHJhaWxpbmcgYF5NJyBjaGFyYWN0ZXJzIGZyb20gdGhlIGN1cnJlbnQgb3V0cHV0IGdyb3VwLiIKKyAgKGludGVyYWN0aXZlKQorICAoaWYgKGFuZCAoYm91bmRwICdjb21pbnQtbGFzdC1pbnB1dC1lbmQpCisJICAgKGJvdW5kcCAnY29taW50LWxhc3Qtb3V0cHV0LXN0YXJ0KSkKKyAgICAgIChsZXQgKChwbWFyayAocHJvY2Vzcy1tYXJrIChnZXQtYnVmZmVyLXByb2Nlc3MgKGN1cnJlbnQtYnVmZmVyKSkpKSkKKwkoc2F2ZS1leGN1cnNpb24KKwkgIChnb3RvLWNoYXIKKwkgICAoaWYgKGludGVyYWN0aXZlLXApCisJICAgICAgIChzeW1ib2wtdmFsdWUgJ2NvbWludC1sYXN0LWlucHV0LWVuZCkKKwkgICAgIChzeW1ib2wtdmFsdWUgJ2NvbWludC1sYXN0LW91dHB1dC1zdGFydCkpKQorCSAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAiXHIrJCIgcG1hcmsgdCkKKwkgICAgKHJlcGxhY2UtbWF0Y2ggIiIgdCB0KSkpKSkpCisKKworKGRlZnVuIGluZmVyaW9yLWVybGFuZy1jb21waWxlICgpCisgICJDb21waWxlIHRoZSBmaWxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KKworU2hvdWxkIEVybGFuZyByZXR1cm4gYHtlcnJvciwgbm9maWxlfScgaXQgY291bGQgbm90IGxvYWQgdGhlIG9iamVjdAorbW9kdWxlIGFmdGVyIGNvbXBsZXRpbmcgdGhlIGNvbXBpbGF0aW9uLiAgVGhpcyBpcyBkdWUgdG8gYSBidWcgaW4gdGhlCitjb21waWxlIGNvbW1hbmQgYGMnIHdoZW4gdXNpbmcgdGhlIG9wdGlvbiBgb3V0ZGlyJy4KKworVGhlcmUgZXhpc3RzIHR3byB3b3JrYXJvdW5kcyBmb3IgdGhpcyBidWc6CisKKyAgMSkgUGxhY2UgdGhlIGRpcmVjdG9yeSBpbiB0aGUgRXJsYW5nIGxvYWQgcGF0aC4KKworICAyKSBTZXQgdGhlIEVtYWNzIHZhcmlhYmxlIGBlcmxhbmctY29tcGlsZS11c2Utb3V0ZGlyJyB0byBuaWwuCisgICAgIFRvIGRvIHNvLCBwbGFjZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBgfi8uZW1hY3MnLWZpbGU6CisgICAgICAgIChzZXRxIGVybGFuZy1jb21waWxlLXVzZS1vdXRkaXIgbmlsKSIKKyAgKGludGVyYWN0aXZlKQorICAoc2F2ZS1zb21lLWJ1ZmZlcnMpCisgIChvciAoaW5mZXJpb3ItZXJsYW5nLXJ1bm5pbmctcCkKKyAgICAgIChzYXZlLWV4Y3Vyc2lvbgorCShpbmZlcmlvci1lcmxhbmcpKSkKKyAgKG9yIChpbmZlcmlvci1lcmxhbmctcnVubmluZy1wKQorICAgICAgKGVycm9yICJFcnJvciBzdGFydGluZyBpbmZlcmlvciBFcmxhbmcgc2hlbGwuIikpCisgIChsZXQgKChkaXIgKGZpbGUtbmFtZS1kaXJlY3RvcnkgKGJ1ZmZlci1maWxlLW5hbWUpKSkKKwk7OzsgKGZpbGUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgKGJ1ZmZlci1maWxlLW5hbWUpKSkKKwkobm9leHQgKHN1YnN0cmluZyAoYnVmZmVyLWZpbGUtbmFtZSkgMCAtNCkpCisJOzsgSG9wZWZ1bGx5LCBub29uZSBlbHNlIHdpbGwgZXZlciB1c2UgdGhlc2UuLi4KKwkodG1wdmFyICJUbXA3MjM2IikKKwkodG1wdmFyMiAiVG1wODc0MiIpCisJZW5kKQorICAgIChpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXIpCisgICAgKGluZmVyaW9yLWVybGFuZy13YWl0LXByb21wdCkKKyAgICAoc2V0cSBlbmQgKGluZmVyaW9yLWVybGFuZy1zZW5kLWNvbW1hbmQKKwkgICAgICAgKGlmIGVybGFuZy1jb21waWxlLXVzZS1vdXRkaXIKKwkJICAgKGZvcm1hdCAiYyhcIiVzXCIsIFt7b3V0ZGlyLCBcIiVzXCJ9XSkuIiBub2V4dCBkaXIpCisJCSAoZm9ybWF0CisJCSAgKGNvbmNhdAorCQkgICAiZiglcyksIHtvaywgJXN9ID0gZmlsZTpnZXRfY3dkKCksICIKKwkJICAgImZpbGU6c2V0X2N3ZChcIiVzXCIpLCAiCisJCSAgICIlcyA9IGMoXCIlc1wiKSwgZmlsZTpzZXRfY3dkKCVzKSwgZiglcyksICVzLiIpCisJCSAgdG1wdmFyMiB0bXB2YXIKKwkJICAgIGRpcgorCQkgICAgdG1wdmFyMiBub2V4dCB0bXB2YXIgdG1wdmFyIHRtcHZhcjIpKQorCSAgICAgICBuaWwpKQorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHNldC1idWZmZXIgaW5mZXJpb3ItZXJsYW5nLWJ1ZmZlcikKKyAgICAgIChzZXRxIGNvbXBpbGF0aW9uLWVycm9yLWxpc3QgbmlsKQorICAgICAgKHNldHEgY29tcGlsYXRpb24tcGFyc2luZy1lbmQgZW5kKSkKKyAgICAoc2V0cSBjb21waWxhdGlvbi1sYXN0LWJ1ZmZlciBpbmZlcmlvci1lcmxhbmctYnVmZmVyKSkpCisKKworOzsgYG5leHQtZXJyb3InIG9ubHkgYWNjZXB0cyBidWZmZXJzIHdpdGggbWFqb3IgbW9kZSBgY29tcGlsYXRpb24tbW9kZScKKzs7IG9yIHdpdGggdGhlIG1pbm9yIG1vZGUgYGNvbXBpbGF0aW9uLW1pbm9yLW1vZGUnIGFjdGl2YXRlZC4KKzs7IChUbyBhY3RpdmF0ZSB0aGUgbWlub3IgbW9kZSBpcyBvdXQgb2YgdGhlIHF1ZXN0aW9uLCBzaW5jZSBpdCB3aWxsCis7OyBydWluIHRoZSBpbmZlcmlvciBFcmxhbmcga2V5bWFwLikKKyhkZWZ1biBpbmZlcmlvci1lcmxhbmctbmV4dC1lcnJvciAoJm9wdGlvbmFsIGFyZ3ApCisgICJKdXN0IGxpa2UgYG5leHQtZXJyb3InLgorQ2FwYWJsZSBvZiBmaW5kaW5nIGVycm9yIG1lc3NhZ2VzIGluIGFuIGluZmVyaW9yIEVybGFuZyBidWZmZXIuIgorICAoaW50ZXJhY3RpdmUgIlAiKQorICAobGV0ICgoZG9uZSBuaWwpCisJKGJ1ZiAoYW5kIChib3VuZHAgJ2NvbXBpbGF0aW9uLWxhc3QtYnVmZmVyKQorCQkgIGNvbXBpbGF0aW9uLWxhc3QtYnVmZmVyKSkpCisgICAgKGlmIChhbmQgKGJ1ZmZlcnAgYnVmKQorCSAgICAgKHNhdmUtZXhjdXJzaW9uCisJICAgICAgIChzZXQtYnVmZmVyIGJ1ZikKKwkgICAgICAgKGFuZCAoZXEgbWFqb3ItbW9kZSAnZXJsYW5nLXNoZWxsLW1vZGUpCisJCSAgICAoc2V0cSBtYWpvci1tb2RlICdjb21waWxhdGlvbi1tb2RlKSkpKQorCSh1bndpbmQtcHJvdGVjdAorCSAgICAocHJvZ24KKwkgICAgICAoc2V0cSBkb25lIHQpCisJICAgICAgKG5leHQtZXJyb3IgYXJncCkpCisJICAoc2F2ZS1leGN1cnNpb24KKwkgICAgKHNldC1idWZmZXIgYnVmKQorCSAgICAoc2V0cSBtYWpvci1tb2RlICdlcmxhbmctc2hlbGwtbW9kZSkpKSkKKyAgICAob3IgZG9uZQorCShuZXh0LWVycm9yIGFyZ3ApKSkpCisKKworKGRlZnVuIGluZmVyaW9yLWVybGFuZy1jaGFuZ2UtZGlyZWN0b3J5ICgmb3B0aW9uYWwgZGlyKQorICAiTWFrZSB0aGUgaW5mZXJpb3IgZXJsYW5nIGNoYW5nZSBkaXJlY3RvcnkuCitUaGUgZGVmYXVsdCBpcyB0byBnbyB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKG9yIGRpciAoc2V0cSBkaXIgKGZpbGUtbmFtZS1kaXJlY3RvcnkgKGJ1ZmZlci1maWxlLW5hbWUpKSkpCisgIChvciAoaW5mZXJpb3ItZXJsYW5nLXJ1bm5pbmctcCkKKyAgICAgIChlcnJvciAiTm8gaW5mZXJpb3IgRXJsYW5nIGlzIHJ1bm5pbmcuIikpCisgIChpbmZlcmlvci1lcmxhbmctZGlzcGxheS1idWZmZXIpCisgIChpbmZlcmlvci1lcmxhbmctd2FpdC1wcm9tcHQpCisgIChpbmZlcmlvci1lcmxhbmctc2VuZC1jb21tYW5kIChmb3JtYXQgImNkKCclcycpLiIgZGlyKSBuaWwpKQorDAorOzsgQWxpYXNlcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEVybGFuZyBNb2RlLgorOzsKKzs7IFVuZm9ydHVhbnRlbHksIG9sZGVyIHZlcnNpb25zIG9mIEVtYWNzIGRvZXNuJ3QgaGF2ZSBgZGVmYWxpYXMnIGFuZAorOzsgYG1ha2Utb2Jzb2xldGUnIHNvIHdlIGhhdmUgdG8gZGVmaW5lIG91ciBvd24gYG9ic29sZXRlJyBmdW5jdGlvbi4KKworKGRlZnVuIGVybGFuZy1vYnNvbGV0ZSAoc3ltIG5ld2RlZikKKyAgIk1ha2UgdGhlIG9ic29sZXRlIGZ1bmN0aW9uIFNZTSByZWZlciB0byB0aGUgZGVmaW5lZCBmdW5jdGlvbiBORVdERUYuCisKK1NpbXBsaWZpZWQgdmVyc2lvbiBvZiBhIGNvbWJpbmF0aW9uIGBkZWZhbGlhcycgYW5kIGBtYWtlLW9ic29sZXRlJywKK2l0IGFzc3VtZXMgdGhhdCBORVdERUYgaXMgbG9hZGVkLiIKKyAgKGZzZXQgc3ltIChzeW1ib2wtZnVuY3Rpb24gbmV3ZGVmKSkKKyAgKGlmIChmYm91bmRwICdtYWtlLW9ic29sZXRlKQorICAgICAgKG1ha2Utb2Jzb2xldGUgc3ltIG5ld2RlZikpKQorCisKKyhlcmxhbmctb2Jzb2xldGUgJ2NhbGN1bGF0ZS1lcmxhbmctaW5kZW50ICdlcmxhbmctY2FsY3VsYXRlLWluZGVudCkKKyhlcmxhbmctb2Jzb2xldGUgJ2NhbGN1bGF0ZS1lcmxhbmctc3RhY2staW5kZW50CisJCSAnZXJsYW5nLWNhbGN1bGF0ZS1zdGFjay1pbmRlbnQpCisoZXJsYW5nLW9ic29sZXRlICdhdC1lcmxhbmcta2V5d29yZCAnZXJsYW5nLWF0LWtleXdvcmQpCisoZXJsYW5nLW9ic29sZXRlICdhdC1lcmxhbmctb3BlcmF0b3IgJ2VybGFuZy1hdC1vcGVyYXRvcikKKyhlcmxhbmctb2Jzb2xldGUgJ2JlZ2lubmluZy1vZi1lcmxhbmctY2xhdXNlICdlcmxhbmctYmVnaW5uaW5nLW9mLWNsYXVzZSkKKyhlcmxhbmctb2Jzb2xldGUgJ2VuZC1vZi1lcmxhbmctY2xhdXNlICdlcmxhbmctZW5kLW9mLWNsYXVzZSkKKyhlcmxhbmctb2Jzb2xldGUgJ21hcmstZXJsYW5nLWNsYXVzZSAnZXJsYW5nLW1hcmstY2xhdXNlKQorKGVybGFuZy1vYnNvbGV0ZSAnYmVnaW5uaW5nLW9mLWVybGFuZy1mdW5jdGlvbiAnZXJsYW5nLWJlZ2lubmluZy1vZi1mdW5jdGlvbikKKyhlcmxhbmctb2Jzb2xldGUgJ2VuZC1vZi1lcmxhbmctZnVuY3Rpb24gJ2VybGFuZy1lbmQtb2YtZnVuY3Rpb24pCisoZXJsYW5nLW9ic29sZXRlICdtYXJrLWVybGFuZy1mdW5jdGlvbiAnZXJsYW5nLW1hcmstZnVuY3Rpb24pCisoZXJsYW5nLW9ic29sZXRlICdwYXNzLW92ZXItZXJsYW5nLWNsYXVzZSAnZXJsYW5nLXBhc3Mtb3Zlci1mdW5jdGlvbikKKyhlcmxhbmctb2Jzb2xldGUgJ25hbWUtb2YtZXJsYW5nLWZ1bmN0aW9uICdlcmxhbmctbmFtZS1vZi1mdW5jdGlvbikKKworCis7OyBUaGUgZW5kLi4uCisKKyhwcm92aWRlICdlcmxhbmcpCisKKyhydW4taG9va3MgJ2VybGFuZy1sb2FkLWhvb2spCisKKzs7OyBlcmxhbmcuZWwgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rvb2xzL3V0aWxpdGllcy9hcHBnZW4gYi9saWIvZXJsL3Rvb2xzL3V0aWxpdGllcy9hcHBnZW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjYxOTIyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdG9vbHMvdXRpbGl0aWVzL2FwcGdlbgpAQCAtMCwwICsxLDY5IEBACisjIS9iaW4vc2gKKworCitpZiBbICQjIC1uZSAyIF07dGhlbgorCWVjaG8gIiIKKwllY2hvICJ1c2FnZTogJDAgPGFwcG5hbWU+IDxwcmVmaXg+IgorCWVjaG8gIiIKKwllY2hvICJhcHBuYW1lIGlzIHRoZSB0aXRsZSBvZiB0aGUgYXBwbGljYXRpb24gdG8gYmUgZ2VuZXJhdGVkIgorCWVjaG8gInByZWZpeCBpcyB0aGUgcHJlZml4IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byBhbGwgZmlsZXMgaW4iCisJZWNobyAidGhlIGFwcGxpY2F0aW9uIGR1ZSB0byBlcmxhbmdzIGxhY2sgb2YgYSBwYWNrYWdlIHN0cnVjdHVyZS4gIFRoZSBwcmVmaXgiCisJZWNobyAiaXMgdHlwaWNhbHkgdGhlIGZpcnN0IGxldHRlciBvZiBlYWNoIHdvcmQgaW4gdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIgorCWVjaG8gIiIKKwllY2hvICJleGFtcGxlOiAkMCBjaGF0X3NlcnZlciBjcyIKKwllY2hvICIiCisJZXhpdCAxCitmaQorCitBUFBfTkFNRT0kMQorQVBQX05BTUVfVVBQRVJfQ0FTRT0kKGVjaG8gJEFQUF9OQU1FIHwgdHIgYS16IEEtWikKK1BSRUZJWD0kMgorCitjZCAuLi8uYXBwZ2VuCitlY2hvIGBwd2RgCisKK2NwIC1yIGJsYW5rX2FwcCAkQVBQX05BTUUKK2NwIC1yIGJsYW5rX2FwcF9yZWwgIiRBUFBfTkFNRSJfcmVsCisKK2NkICIkQVBQX05BTUUiX3JlbAorbHMgYmxhbmtfYXBwKiB8IC4uL3JlbmFtZS5zaCBibGFua19hcHAgJEFQUF9OQU1FCitjZCAuLgorCisjIFRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgcmVsZWFzZQorLi9zdWJzdGl0dXRlLnNoICUlQVBQX05BTUUlJSAkQVBQX05BTUUgIiRBUFBfTkFNRSJfcmVsLyIkQVBQX05BTUUiX3JlbC5yZWwuc3JjCisKKworY2QgJEFQUF9OQU1FL3NyYworbHMgYmEqIHwgLi4vLi4vcmVuYW1lLnNoIGJhICRQUkVGSVgKK2xzIGJsYW5rX2FwcCogfCAuLi8uLi9yZW5hbWUuc2ggYmxhbmtfYXBwICRBUFBfTkFNRQorY2QgLQorCisjIFRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgYXBwbGljYXRpb24KKy4vc3Vic3RpdHV0ZS5zaCAlJUFQUF9OQU1FX1VQUEVSX0NBU0UlJSAkQVBQX05BTUVfVVBQRVJfQ0FTRSAkQVBQX05BTUUvTWFrZWZpbGUKKy4vc3Vic3RpdHV0ZS5zaCAlJUFQUF9OQU1FX1VQUEVSX0NBU0UlJSAkQVBQX05BTUVfVVBQRVJfQ0FTRSAkQVBQX05BTUUvdnNuLm1rCisKKyMgVGhlIHNyYyBkaXJlY3Rvcnkgb2YgdGhlIGFwcGxpY2F0aW9uCisuL3N1YnN0aXR1dGUuc2ggJSVBUFBfTkFNRSUlICRBUFBfTkFNRSAkQVBQX05BTUUvc3JjL01ha2VmaWxlCisuL3N1YnN0aXR1dGUuc2ggJSVBUFBfTkFNRV9VUFBFUl9DQVNFJSUgJEFQUF9OQU1FX1VQUEVSX0NBU0UgJEFQUF9OQU1FL3NyYy9NYWtlZmlsZQorLi9zdWJzdGl0dXRlLnNoICUlUEZYJSUgJFBSRUZJWCAkQVBQX05BTUUvc3JjL01ha2VmaWxlCisKKy4vc3Vic3RpdHV0ZS5zaCAlJUFQUF9OQU1FJSUgJEFQUF9OQU1FICRBUFBfTkFNRS9zcmMvIiRBUFBfTkFNRSIuZXJsCisuL3N1YnN0aXR1dGUuc2ggJSVQRlglJSAkUFJFRklYICRBUFBfTkFNRS9zcmMvIiRBUFBfTkFNRSIuZXJsCisuL3N1YnN0aXR1dGUuc2ggJSVQRlglJSAkUFJFRklYICRBUFBfTkFNRS9zcmMvIiRQUkVGSVgiX3N1cC5lcmwKKy4vc3Vic3RpdHV0ZS5zaCAlJUFQUF9OQU1FJSUgJEFQUF9OQU1FICRBUFBfTkFNRS9zcmMvIiRQUkVGSVgiX3N1cC5lcmwKKy4vc3Vic3RpdHV0ZS5zaCAlJVBGWCUlICRQUkVGSVggJEFQUF9OQU1FL3NyYy8iJFBSRUZJWCJfc2VydmVyLmVybAorLi9zdWJzdGl0dXRlLnNoICUlQVBQX05BTUUlJSAkQVBQX05BTUUgJEFQUF9OQU1FL3NyYy8iJFBSRUZJWCJfc2VydmVyLmVybAorCisjIGluY2x1ZGUgZGlyZWN0b3J5CittdiAkQVBQX05BTUUvaW5jbHVkZS9ibGFua19hcHAuaHJsICRBUFBfTkFNRS9pbmNsdWRlLyIkQVBQX05BTUUiLmhybAorCitmaW5kICRBUFBfTkFNRSAtbmFtZSAiLnN2biIgfCB4YXJncyBybSAtcgorbXYgJEFQUF9OQU1FIC4uLy4uL2xpYgorbXYgIiRBUFBfTkFNRSJfcmVsIC4uLy4uL3JlbGVhc2UKKworZWNobyAiIgorZWNobyAiJEFQUF9OQU1FIGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgcGxhY2VkIHVuZGVyIGxpYi8kQVBQX05BTUUiCitlY2hvICRBUFBfTkFNRSJfcmVsIGhhcyBiZWVuIGdlbmVyYXRlZCBhbmQgcGxhY2VkIHVuZGVyIHJlbGVhc2UvJEFQUF9OQU1FIiJfcmVsIgorZWNobyAiIgorCitjZCAuLi91dGlsaXRpZXMKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvdXRpbGl0aWVzL2NsZWFuX3JlbGVhc2UgYi9saWIvZXJsL3Rvb2xzL3V0aWxpdGllcy9jbGVhbl9yZWxlYXNlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyMDI2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzL3V0aWxpdGllcy9jbGVhbl9yZWxlYXNlCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9iYXNoCisKK2lmIFsgJCMgLWVxIDEgXTsgdGhlbgorCVJFTEVBU0VfTkFNRT0kMQorZWxzZQorCVJFTEVBU0VfTkFNRT0kKGJhc2VuYW1lICQoZGlybmFtZSAkKGRpcm5hbWUgJChkaXJuYW1lICQod2hpY2ggJDApKSkpKQorZmkKKworTE9DQUw9JChkaXJuYW1lICQod2hpY2ggJDApKQorCitlY2hvICRMT0NBTAorZWNobyAkUkVMRUFTRV9OQU1FCitjZCAkTE9DQUwKKworZWNobyAiCistbW9kdWxlKGNsZWFuX3JlbGVhc2UpLiAKKy1leHBvcnQoW2NsZWFuX3JlbGVhc2UvMV0pLiAKKworY2xlYW5fcmVsZWFzZShbUmVsZWFzZU5hbWVdKSAtPiAKKyAgICBSZWxGaWxlID0gYXRvbV90b19saXN0KFJlbGVhc2VOYW1lKSArKyBcIi5yZWxcIiwKKyAgICBjYXNlIGZpbGU6Y29uc3VsdChSZWxGaWxlKSBvZgorCXtvaywgW3tyZWxlYXNlLCB7UmVsTmFtZSwgUmVsVnNufSwgRXJ0c1NwZWMsIFJlbGVhc2VTcGVjc31dfSAtPiBkb19yZXN0KFJlbEZpbGUsIFJlbGVhc2VTcGVjcyk7CisJe2Vycm9yLCBSZWFzb259IC0+IGlvOmZvcm1hdChcIkVSUk9SIC0gQ291bGQgbm90IGZpbmQgZmlsZSB+c35uXCIsIFtSZWxGaWxlXSksIGV4aXQoUmVhc29uKQorICAgIGVuZCwKKyAgICBvczpjbWQoXCJjZCAuLi87cm0gLXJmIFwiICsrIHN0cmluZzpzdHJpcChvczpjbWQoXCJiYXNlbmFtZSBgcHdkYFwiKSkpLgorCSAgICAgCitkb19yZXN0KFJlbEZpbGUsIFJlbGVhc2VTcGVjcykgLT4KKyAgICBpbzpmb3JtYXQoXCJGaW5kaW5nIE9ycGhhbnMgaW4gfnAgYW1vbmcgY3VycmVudCByZWxlYXNlIHNwZWNzIH5wfm5cIiwgW1JlbEZpbGUsIFJlbGVhc2VTcGVjc10pLAorICAgIHtvaywgRmlsZU5hbWVMaXN0fSAgICA9IGZpbGU6bGlzdF9kaXIoXCIuLi9cIiksCisgICAgRGlycyA9IFtGaWxlTmFtZSB8fCBGaWxlTmFtZSA8LSBGaWxlTmFtZUxpc3QsIGZpbGVsaWI6aXNfZGlyKFwiLi4vXCIgKysgRmlsZU5hbWUpXSAtLQorCSAgIFtzdHJpbmc6c3RyaXAob3M6Y21kKFwiYmFzZW5hbWUgYHB3ZGBcIiksIHJpZ2h0LCAkXG4pXSwKKyAgICBCaWdMaXN0T2ZSZWxlYXNlU3BlY3MgPSBsaXN0czpmb2xkbChmdW4oRGlyLCBBY2MpIC0+IAorCQkJCQkJT3RoZXJSZWxGaWxlID0gXCIuLi9cIiArKyBEaXIgKysgXCIvXCIgKysgUmVsRmlsZSwKKwkJCQkJCWlvOmZvcm1hdChcIkNoZWNraW5nIGV4dGVybmFsIHJlbGVhc2UgZmlsZSB+cH5uXCIsIFtPdGhlclJlbEZpbGVdKSwKKwkJCQkJCWNhc2UgZmlsZTpjb25zdWx0KE90aGVyUmVsRmlsZSkgb2YKKwkJCQkJCSAgICB7b2ssIFt7cmVsZWFzZSwge1JlbE5hbWUsIFJlbFZzbn0sIEVydHNTcGVjLCBSZWxlYXNlU3BlY3NffV19IC0+IAorCQkJCQkJCUFjYyArKyBSZWxlYXNlU3BlY3NfOworCQkJCQkJICAgIF8gIC0+IAorCQkJCQkJCUFjYworCQkJCQkJZW5kIGVuZCwgW10sIERpcnMpLAorICAgIE9ycGhhbnMgPSBSZWxlYXNlU3BlY3MgLS0gQmlnTGlzdE9mUmVsZWFzZVNwZWNzLAorICAgIGlvOmZvcm1hdChcIlJlbW92aW5nIG9ycGhhbiByZWxlYXNlIHNwZWNzIH5wIGZyb20gLi4vLi4vbGliIH5uXCIsIFtPcnBoYW5zXSksCisgICAgbGlzdHM6Zm9yZWFjaChmdW4oT3JwaGFuKSAtPiAKKwkJCSAgb3M6Y21kKFwicm0gLXJmIC4uLy4uL2xpYi9cIiArKyBhdG9tX3RvX2xpc3QoZWxlbWVudCgxLCBPcnBoYW4pKSArKyBcIi1cIiArKyBlbGVtZW50KDIsIE9ycGhhbikpIAorCQkgIGVuZCwgT3JwaGFucykuCisiID4gY2xlYW5fcmVsZWFzZS5lcmwKKworZXJsYyBjbGVhbl9yZWxlYXNlLmVybAorCitDTUQ9ImVybCAtcyBjbGVhbl9yZWxlYXNlIGNsZWFuX3JlbGVhc2UgJFJFTEVBU0VfTkFNRSAtcyBlcmxhbmcgaGFsdCAtbm9zaGVsbCIKKyRDTUQKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdG9vbHMvdXRpbGl0aWVzL2Vkb2MgYi9saWIvZXJsL3Rvb2xzL3V0aWxpdGllcy9lZG9jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzMmYyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rvb2xzL3V0aWxpdGllcy9lZG9jCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAoraWYgWyAiJCMiIC1uZSAiMSIgXQordGhlbgorCWVjaG8gJFVTQUdFCisJZXhpdCAxCitmaQorCitDVVJSRU5UX0RJUj1gcHdkYAorZWNobyAkQ1VSUkVOVF9ESVIKKworIyBFc3RhYmxpc2ggdGhlIG90cCBiYXNlIGRpcmVjdG9yeS4KK01ZX0NNRD1gd2hpY2ggJDBgCitNWV9DTURfRElSPWBkaXJuYW1lICRNWV9DTURgCitPVFBfQkFTRV9ESVI9JE1ZX0NNRF9ESVIvLi4vLi4KKworZXJsIC1ub3NoZWxsIC1weiAkT1RQX0JBU0VfRElSL2xpYi9mc2xpYi9lYmluIC1zIGZzX2xpYiBzX2FwcGx5IGVkb2MgYXBwbGljYXRpb24gIiQxIi4gICJcIi4uLy4uLyQxIlwiLiBbXS4iICIgLXMgaW5pdCBzdG9wIHwgZWdyZXAgIihFWElUfHRlcm1pbmF0aW5nKSIK