ZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggMTE5ZjY1NC4uZjVhODlhZCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTUwLDE5ICs1MCwxNCBAQAogCWxpYndpbmVfdW5pY29kZS4kKExJQkVYVCkgXAogCWxpYndpbmVfdXVpZC5hCiAKLSMgU3ViLWRpcmVjdG9yaWVzIHRvIHJ1biBtYWtlIGRlcGVuZC9jbGVhbiBpbnRvCisjIFN1Yi1kaXJlY3RvcmllcyB0byBydW4gbWFrZSBkZXBlbmQvY2xlYW4vaW5zdGFsbCBpbnRvCiBTVUJESVJTID0gXAotCSQoSU5TVEFMTFNVQkRJUlMpIFwKLQlsaWJ0ZXN0IFwKLQltaXNjZW11Ci0KLSMgU3ViLWRpcmVjdG9yaWVzIHRvIHJ1biBtYWtlIGluc3RhbGwgaW50bwotSU5TVEFMTFNVQkRJUlMgPSBcCiAJZGVidWdnZXIgXAogCWRsbHMgXAogCWRvY3VtZW50YXRpb24gXAogCWluY2x1ZGUgXAogCWxpYnJhcnkgXAorCW1pc2NlbXUgXAogCW9sZSBcCiAJcHJvZ3JhbXMgXAogCXNlcnZlciBcCkBAIC05NiwxMCArOTEsMTAgQEAKIAkkKE1LSU5TVEFMTERJUlMpICQoYmluZGlyKQogCSQoSU5TVEFMTF9QUk9HUkFNKSB3aW5lICQoYmluZGlyKS93aW5lCiAKLWluc3RhbGw6OiBhbGwgaW5zdGFsbF93aW5lICQoSU5TVEFMTFNVQkRJUlM6JT0lL19faW5zdGFsbF9fKQoraW5zdGFsbDo6IGFsbCBpbnN0YWxsX3dpbmUgJChTVUJESVJTOiU9JS9fX2luc3RhbGxfXykKIAktJChMRENPTkZJRykKIAotdW5pbnN0YWxsOjogJChJTlNUQUxMU1VCRElSUzolPSUvX191bmluc3RhbGxfXykKK3VuaW5zdGFsbDo6ICQoU1VCRElSUzolPSUvX191bmluc3RhbGxfXykKIAkkKFJNKSAkKGJpbmRpcikvd2luZQogCiAkKEVNVU9CSlMpICQoUFJPR1JBTVMpICQoTElCUkFSSUVTKTogZHVtbXkKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBjMmRiNzc4Li5kZjkwNDI3IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0xMzE5NCw3ICsxMzE5NCw3IEBACiBNQUtFX1BST0dfUlVMRVM9cHJvZ3JhbXMvTWFrZXByb2cucnVsZXMKIAogCi1hY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgTWFrZS5ydWxlcyBkbGxzL01ha2VkbGwucnVsZXMgcHJvZ3JhbXMvTWFrZXByb2cucnVsZXMgTWFrZWZpbGUgZGVidWdnZXIvTWFrZWZpbGUgZGxscy9NYWtlZmlsZSBkbGxzL2FkdmFwaTMyL01ha2VmaWxlIGRsbHMvYXZpY2FwMzIvTWFrZWZpbGUgZGxscy9hdmlmaWwzMi9NYWtlZmlsZSBkbGxzL2NvbWNhdC9NYWtlZmlsZSBkbGxzL2NvbWN0bDMyL01ha2VmaWxlIGRsbHMvY29tbWRsZy9NYWtlZmlsZSBkbGxzL2NydGRsbC9NYWtlZmlsZSBkbGxzL2NyeXB0MzIvTWFrZWZpbGUgZGxscy9kY2ltYW4zMi9NYWtlZmlsZSBkbGxzL2RkcmF3L01ha2VmaWxlIGRsbHMvZGV2ZW51bS9NYWtlZmlsZSBkbGxzL2RpbnB1dC9NYWtlZmlsZSBkbGxzL2RwbGF5L01ha2VmaWxlIGRsbHMvZHBsYXl4L01ha2VmaWxlIGRsbHMvZHNvdW5kL01ha2VmaWxlIGRsbHMvZ2RpL01ha2VmaWxlIGRsbHMvZ2x1MzIvTWFrZWZpbGUgZGxscy9pY21wL01ha2VmaWxlIGRsbHMvaW1hZ2VobHAvTWFrZWZpbGUgZGxscy9pbW0zMi9NYWtlZmlsZSBkbGxzL2tlcm5lbC9NYWtlZmlsZSBkbGxzL2x6ZXhwYW5kL01ha2VmaWxlIGRsbHMvbWFwaTMyL01ha2VmaWxlIGRsbHMvbXByL01ha2VmaWxlIGRsbHMvbXNhY20vTWFrZWZpbGUgZGxscy9tc2FjbS9pbWFhZHAzMi9NYWtlZmlsZSBkbGxzL21zYWNtL21zZzcxMS9NYWtlZmlsZSBkbGxzL21zZG1vL01ha2VmaWxlIGRsbHMvbXNpbWczMi9NYWtlZmlsZSBkbGxzL21zaXN5cy9NYWtlZmlsZSBkbGxzL21zbmV0MzIvTWFrZWZpbGUgZGxscy9tc3JsZTMyL01ha2VmaWxlIGRsbHMvbXN2Y3J0L01ha2VmaWxlIGRsbHMvbXN2Y3J0MjAvTWFrZWZpbGUgZGxscy9tc3ZpZGVvL01ha2VmaWxlIGRsbHMvbmV0YXBpMzIvTWFrZWZpbGUgZGxscy9udGRsbC9NYWtlZmlsZSBkbGxzL29kYmMzMi9NYWtlZmlsZSBkbGxzL29sZTMyL01ha2VmaWxlIGRsbHMvb2xlYXV0MzIvTWFrZWZpbGUgZGxscy9vbGVjbGkvTWFrZWZpbGUgZGxscy9vbGVkbGcvTWFrZWZpbGUgZGxscy9vbGVwcm8zMi9NYWtlZmlsZSBkbGxzL29sZXN2ci9NYWtlZmlsZSBkbGxzL29wZW5nbDMyL01ha2VmaWxlIGRsbHMvcHNhcGkvTWFrZWZpbGUgZGxscy9xY2FwL01ha2VmaWxlIGRsbHMvcXVhcnR6L01ha2VmaWxlIGRsbHMvcmFzYXBpMzIvTWFrZWZpbGUgZGxscy9yaWNoZWRpdC9NYWtlZmlsZSBkbGxzL3JwY3J0NC9NYWtlZmlsZSBkbGxzL3NlcmlhbHVpL01ha2VmaWxlIGRsbHMvc2V0dXBhcGkvTWFrZWZpbGUgZGxscy9zaGRvY3Z3L01ha2VmaWxlIGRsbHMvc2hlbGwzMi9NYWtlZmlsZSBkbGxzL3NoZm9sZGVyL01ha2VmaWxlIGRsbHMvc2hsd2FwaS9NYWtlZmlsZSBkbGxzL3NubXBhcGkvTWFrZWZpbGUgZGxscy9zdGkvTWFrZWZpbGUgZGxscy90YXBpMzIvTWFrZWZpbGUgZGxscy90dHlkcnYvTWFrZWZpbGUgZGxscy90d2Fpbi9NYWtlZmlsZSBkbGxzL3VybC9NYWtlZmlsZSBkbGxzL3VybG1vbi9NYWtlZmlsZSBkbGxzL3VzZXIvTWFrZWZpbGUgZGxscy92ZXJzaW9uL01ha2VmaWxlIGRsbHMvd2luMzJzL01ha2VmaWxlIGRsbHMvd2luYXNwaS9NYWtlZmlsZSBkbGxzL3dpbmVkb3MvTWFrZWZpbGUgZGxscy93aW5lcHMvTWFrZWZpbGUgZGxscy93aW5pbmV0L01ha2VmaWxlIGRsbHMvd2lubW0vTWFrZWZpbGUgZGxscy93aW5tbS9qb3lzdGljay9NYWtlZmlsZSBkbGxzL3dpbm1tL21jaWFuaW0vTWFrZWZpbGUgZGxscy93aW5tbS9tY2lhdmkvTWFrZWZpbGUgZGxscy93aW5tbS9tY2ljZGEvTWFrZWZpbGUgZGxscy93aW5tbS9tY2lzZXEvTWFrZWZpbGUgZGxscy93aW5tbS9tY2l3YXZlL01ha2VmaWxlIGRsbHMvd2lubW0vbWlkaW1hcC9NYWtlZmlsZSBkbGxzL3dpbm1tL3dhdmVtYXAvTWFrZWZpbGUgZGxscy93aW5tbS93aW5lYXJ0cy9NYWtlZmlsZSBkbGxzL3dpbm1tL3dpbmVvc3MvTWFrZWZpbGUgZGxscy93aW5ubHMvTWFrZWZpbGUgZGxscy93aW5zb2NrL01ha2VmaWxlIGRsbHMvd2luc3Bvb2wvTWFrZWZpbGUgZGxscy93aW50cnVzdC9NYWtlZmlsZSBkbGxzL3dvdzMyL01ha2VmaWxlIGRsbHMvd3NvY2szMi9NYWtlZmlsZSBkbGxzL3gxMWRydi9NYWtlZmlsZSBkb2N1bWVudGF0aW9uL01ha2VmaWxlIGluY2x1ZGUvTWFrZWZpbGUgbGlicmFyeS9NYWtlZmlsZSBsaWJ0ZXN0L01ha2VmaWxlIG1pc2NlbXUvTWFrZWZpbGUgb2xlL01ha2VmaWxlIHByb2dyYW1zL01ha2VmaWxlIHByb2dyYW1zL2F2aXRvb2xzL01ha2VmaWxlIHByb2dyYW1zL2Nsb2NrL01ha2VmaWxlIHByb2dyYW1zL2NtZGxndHN0L01ha2VmaWxlIHByb2dyYW1zL2NvbnRyb2wvTWFrZWZpbGUgcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZSBwcm9ncmFtcy9vc3ZlcnNpb25jaGVjay9NYWtlZmlsZSBwcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlIHByb2dyYW1zL3JlZ2FwaS9NYWtlZmlsZSBwcm9ncmFtcy9yZWdlZGl0L01ha2VmaWxlIHByb2dyYW1zL3JlZ3N2cjMyL01ha2VmaWxlIHByb2dyYW1zL3JlZ3Rlc3QvTWFrZWZpbGUgcHJvZ3JhbXMvdW5pbnN0YWxsZXIvTWFrZWZpbGUgcHJvZ3JhbXMvdmlldy9NYWtlZmlsZSBwcm9ncmFtcy93Y21kL01ha2VmaWxlIHByb2dyYW1zL3dpbmVjb25zb2xlL01ha2VmaWxlIHByb2dyYW1zL3dpbmVtaW5lL01ha2VmaWxlIHByb2dyYW1zL3dpbmVwYXRoL01ha2VmaWxlIHByb2dyYW1zL3dpbmV0ZXN0L01ha2VmaWxlIHByb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUgcHJvZ3JhbXMvd2ludmVyL01ha2VmaWxlIHNlcnZlci9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSB0b29scy93aW5hcGkvTWFrZWZpbGUgdG9vbHMvd2luZWJ1aWxkL01ha2VmaWxlIHRvb2xzL3dpbmVkdW1wL01ha2VmaWxlIHRvb2xzL3dtYy9NYWtlZmlsZSB0b29scy93cmMvTWFrZWZpbGUgdHN4MTEvTWFrZWZpbGUgdW5pY29kZS9NYWtlZmlsZSIKK2FjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlLnJ1bGVzIGRsbHMvTWFrZWRsbC5ydWxlcyBwcm9ncmFtcy9NYWtlcHJvZy5ydWxlcyBNYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkbGxzL01ha2VmaWxlIGRsbHMvYWR2YXBpMzIvTWFrZWZpbGUgZGxscy9hdmljYXAzMi9NYWtlZmlsZSBkbGxzL2F2aWZpbDMyL01ha2VmaWxlIGRsbHMvY29tY2F0L01ha2VmaWxlIGRsbHMvY29tY3RsMzIvTWFrZWZpbGUgZGxscy9jb21tZGxnL01ha2VmaWxlIGRsbHMvY3J0ZGxsL01ha2VmaWxlIGRsbHMvY3J5cHQzMi9NYWtlZmlsZSBkbGxzL2RjaW1hbjMyL01ha2VmaWxlIGRsbHMvZGRyYXcvTWFrZWZpbGUgZGxscy9kZXZlbnVtL01ha2VmaWxlIGRsbHMvZGlucHV0L01ha2VmaWxlIGRsbHMvZHBsYXkvTWFrZWZpbGUgZGxscy9kcGxheXgvTWFrZWZpbGUgZGxscy9kc291bmQvTWFrZWZpbGUgZGxscy9nZGkvTWFrZWZpbGUgZGxscy9nbHUzMi9NYWtlZmlsZSBkbGxzL2ljbXAvTWFrZWZpbGUgZGxscy9pbWFnZWhscC9NYWtlZmlsZSBkbGxzL2ltbTMyL01ha2VmaWxlIGRsbHMva2VybmVsL01ha2VmaWxlIGRsbHMvbHpleHBhbmQvTWFrZWZpbGUgZGxscy9tYXBpMzIvTWFrZWZpbGUgZGxscy9tcHIvTWFrZWZpbGUgZGxscy9tc2FjbS9NYWtlZmlsZSBkbGxzL21zYWNtL2ltYWFkcDMyL01ha2VmaWxlIGRsbHMvbXNhY20vbXNnNzExL01ha2VmaWxlIGRsbHMvbXNkbW8vTWFrZWZpbGUgZGxscy9tc2ltZzMyL01ha2VmaWxlIGRsbHMvbXNpc3lzL01ha2VmaWxlIGRsbHMvbXNuZXQzMi9NYWtlZmlsZSBkbGxzL21zcmxlMzIvTWFrZWZpbGUgZGxscy9tc3ZjcnQvTWFrZWZpbGUgZGxscy9tc3ZjcnQyMC9NYWtlZmlsZSBkbGxzL21zdmlkZW8vTWFrZWZpbGUgZGxscy9uZXRhcGkzMi9NYWtlZmlsZSBkbGxzL250ZGxsL01ha2VmaWxlIGRsbHMvb2RiYzMyL01ha2VmaWxlIGRsbHMvb2xlMzIvTWFrZWZpbGUgZGxscy9vbGVhdXQzMi9NYWtlZmlsZSBkbGxzL29sZWNsaS9NYWtlZmlsZSBkbGxzL29sZWRsZy9NYWtlZmlsZSBkbGxzL29sZXBybzMyL01ha2VmaWxlIGRsbHMvb2xlc3ZyL01ha2VmaWxlIGRsbHMvb3BlbmdsMzIvTWFrZWZpbGUgZGxscy9wc2FwaS9NYWtlZmlsZSBkbGxzL3FjYXAvTWFrZWZpbGUgZGxscy9xdWFydHovTWFrZWZpbGUgZGxscy9yYXNhcGkzMi9NYWtlZmlsZSBkbGxzL3JpY2hlZGl0L01ha2VmaWxlIGRsbHMvcnBjcnQ0L01ha2VmaWxlIGRsbHMvc2VyaWFsdWkvTWFrZWZpbGUgZGxscy9zZXR1cGFwaS9NYWtlZmlsZSBkbGxzL3NoZG9jdncvTWFrZWZpbGUgZGxscy9zaGVsbDMyL01ha2VmaWxlIGRsbHMvc2hmb2xkZXIvTWFrZWZpbGUgZGxscy9zaGx3YXBpL01ha2VmaWxlIGRsbHMvc25tcGFwaS9NYWtlZmlsZSBkbGxzL3N0aS9NYWtlZmlsZSBkbGxzL3RhcGkzMi9NYWtlZmlsZSBkbGxzL3R0eWRydi9NYWtlZmlsZSBkbGxzL3R3YWluL01ha2VmaWxlIGRsbHMvdXJsL01ha2VmaWxlIGRsbHMvdXJsbW9uL01ha2VmaWxlIGRsbHMvdXNlci9NYWtlZmlsZSBkbGxzL3ZlcnNpb24vTWFrZWZpbGUgZGxscy93aW4zMnMvTWFrZWZpbGUgZGxscy93aW5hc3BpL01ha2VmaWxlIGRsbHMvd2luZWRvcy9NYWtlZmlsZSBkbGxzL3dpbmVwcy9NYWtlZmlsZSBkbGxzL3dpbmluZXQvTWFrZWZpbGUgZGxscy93aW5tbS9NYWtlZmlsZSBkbGxzL3dpbm1tL2pveXN0aWNrL01ha2VmaWxlIGRsbHMvd2lubW0vbWNpYW5pbS9NYWtlZmlsZSBkbGxzL3dpbm1tL21jaWF2aS9NYWtlZmlsZSBkbGxzL3dpbm1tL21jaWNkYS9NYWtlZmlsZSBkbGxzL3dpbm1tL21jaXNlcS9NYWtlZmlsZSBkbGxzL3dpbm1tL21jaXdhdmUvTWFrZWZpbGUgZGxscy93aW5tbS9taWRpbWFwL01ha2VmaWxlIGRsbHMvd2lubW0vd2F2ZW1hcC9NYWtlZmlsZSBkbGxzL3dpbm1tL3dpbmVhcnRzL01ha2VmaWxlIGRsbHMvd2lubW0vd2luZW9zcy9NYWtlZmlsZSBkbGxzL3dpbm5scy9NYWtlZmlsZSBkbGxzL3dpbnNvY2svTWFrZWZpbGUgZGxscy93aW5zcG9vbC9NYWtlZmlsZSBkbGxzL3dpbnRydXN0L01ha2VmaWxlIGRsbHMvd293MzIvTWFrZWZpbGUgZGxscy93c29jazMyL01ha2VmaWxlIGRsbHMveDExZHJ2L01ha2VmaWxlIGRvY3VtZW50YXRpb24vTWFrZWZpbGUgaW5jbHVkZS9NYWtlZmlsZSBsaWJyYXJ5L01ha2VmaWxlIG1pc2NlbXUvTWFrZWZpbGUgb2xlL01ha2VmaWxlIHByb2dyYW1zL01ha2VmaWxlIHByb2dyYW1zL2F2aXRvb2xzL01ha2VmaWxlIHByb2dyYW1zL2Nsb2NrL01ha2VmaWxlIHByb2dyYW1zL2NtZGxndHN0L01ha2VmaWxlIHByb2dyYW1zL2NvbnRyb2wvTWFrZWZpbGUgcHJvZ3JhbXMvZXhwYW5kL01ha2VmaWxlIHByb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUgcHJvZ3JhbXMvb3N2ZXJzaW9uY2hlY2svTWFrZWZpbGUgcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZSBwcm9ncmFtcy9yZWdhcGkvTWFrZWZpbGUgcHJvZ3JhbXMvcmVnZWRpdC9NYWtlZmlsZSBwcm9ncmFtcy9yZWdzdnIzMi9NYWtlZmlsZSBwcm9ncmFtcy9yZWd0ZXN0L01ha2VmaWxlIHByb2dyYW1zL3VuaW5zdGFsbGVyL01ha2VmaWxlIHByb2dyYW1zL3ZpZXcvTWFrZWZpbGUgcHJvZ3JhbXMvd2NtZC9NYWtlZmlsZSBwcm9ncmFtcy93aW5lY29uc29sZS9NYWtlZmlsZSBwcm9ncmFtcy93aW5lbWluZS9NYWtlZmlsZSBwcm9ncmFtcy93aW5lcGF0aC9NYWtlZmlsZSBwcm9ncmFtcy93aW5ldGVzdC9NYWtlZmlsZSBwcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlIHByb2dyYW1zL3dpbnZlci9NYWtlZmlsZSBzZXJ2ZXIvTWFrZWZpbGUgdG9vbHMvTWFrZWZpbGUgdG9vbHMvd2luYXBpL01ha2VmaWxlIHRvb2xzL3dpbmVidWlsZC9NYWtlZmlsZSB0b29scy93aW5lZHVtcC9NYWtlZmlsZSB0b29scy93bWMvTWFrZWZpbGUgdG9vbHMvd3JjL01ha2VmaWxlIHRzeDExL01ha2VmaWxlIHVuaWNvZGUvTWFrZWZpbGUiCiAKIAogY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCkBAIC0xMzc2OSw3ICsxMzc2OSw2IEBACiAgICJkb2N1bWVudGF0aW9uL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkb2N1bWVudGF0aW9uL01ha2VmaWxlIiA7OwogICAiaW5jbHVkZS9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW5jbHVkZS9NYWtlZmlsZSIgOzsKICAgImxpYnJhcnkvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGxpYnJhcnkvTWFrZWZpbGUiIDs7Ci0gICJsaWJ0ZXN0L01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsaWJ0ZXN0L01ha2VmaWxlIiA7OwogICAibWlzY2VtdS9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbWlzY2VtdS9NYWtlZmlsZSIgOzsKICAgIm9sZS9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgb2xlL01ha2VmaWxlIiA7OwogICAicHJvZ3JhbXMvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHByb2dyYW1zL01ha2VmaWxlIiA7OwpAQCAtMTM3NzcsNiArMTM3NzYsNyBAQAogICAicHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHByb2dyYW1zL2Nsb2NrL01ha2VmaWxlIiA7OwogICAicHJvZ3JhbXMvY21kbGd0c3QvTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHByb2dyYW1zL2NtZGxndHN0L01ha2VmaWxlIiA7OwogICAicHJvZ3JhbXMvY29udHJvbC9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcHJvZ3JhbXMvY29udHJvbC9NYWtlZmlsZSIgOzsKKyAgInByb2dyYW1zL2V4cGFuZC9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcHJvZ3JhbXMvZXhwYW5kL01ha2VmaWxlIiA7OwogICAicHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZSIgKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZSIgOzsKICAgInByb2dyYW1zL29zdmVyc2lvbmNoZWNrL01ha2VmaWxlIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwcm9ncmFtcy9vc3ZlcnNpb25jaGVjay9NYWtlZmlsZSIgOzsKICAgInByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUiICkgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUiIDs7CmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggNjgyNDVlNi4uOGFhMzM4NyAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMTMzMiw3ICsxMzMyLDYgQEAKIGRvY3VtZW50YXRpb24vTWFrZWZpbGUKIGluY2x1ZGUvTWFrZWZpbGUKIGxpYnJhcnkvTWFrZWZpbGUKLWxpYnRlc3QvTWFrZWZpbGUKIG1pc2NlbXUvTWFrZWZpbGUKIG9sZS9NYWtlZmlsZQogcHJvZ3JhbXMvTWFrZWZpbGUKQEAgLTEzNDAsNiArMTMzOSw3IEBACiBwcm9ncmFtcy9jbG9jay9NYWtlZmlsZQogcHJvZ3JhbXMvY21kbGd0c3QvTWFrZWZpbGUKIHByb2dyYW1zL2NvbnRyb2wvTWFrZWZpbGUKK3Byb2dyYW1zL2V4cGFuZC9NYWtlZmlsZQogcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZQogcHJvZ3JhbXMvb3N2ZXJzaW9uY2hlY2svTWFrZWZpbGUKIHByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2xpYnRlc3QvLmN2c2lnbm9yZSBiL2xpYnRlc3QvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlNTIzZi4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYWtlZmlsZQotZXhwYW5kCi1leHBhbmQuc3BlYy5jCi1oZWxsbwotaGVsbG8uc3BlYy5jCi1oZWxsbzIKLWhlbGxvMi5zcGVjLmMKLWhlbGxvMwotaGVsbG8zLnNwZWMuYwotaGVsbG8zcmVzLnJlcwotaGVsbG80Ci1oZWxsbzQuc3BlYy5jCi1oZWxsbzUKLWhlbGxvNS5zcGVjLmMKLW5ldwotbmV3LnNwZWMuYwotcm9sZXgKLXJvbGV4LnNwZWMuYwotdmFydGVzdAotdmFydGVzdC5zcGVjLmMKLXZvbGluZm8KLXZvbGluZm8uc3BlYy5jCmRpZmYgLS1naXQgYS9saWJ0ZXN0L01ha2VmaWxlLmluIGIvbGlidGVzdC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1YTJmMC4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0L01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotREVGUyAgICAgICA9IEBETExGTEFHU0AgLURTVFJJQ1QgLUROT05BTUVMRVNTVU5JT04gLUROT05BTUVMRVNTU1RSVUNUICQoRVhUUkFERUZTKQotTERETExGTEFHUyA9IEBMRERMTEZMQUdTQAotVE9QU1JDRElSICA9IEB0b3Bfc3JjZGlyQAotVE9QT0JKRElSICA9IC4uCi1TUkNESVIgICAgID0gQHNyY2RpckAKLVZQQVRIICAgICAgPSBAc3JjZGlyQAotTU9EVUxFICAgICA9IG5vbmUKLVBST0dSQU1TICAgPSBleHBhbmQgaGVsbG8gaGVsbG8yIGhlbGxvMyBoZWxsbzQgaGVsbG81IG5ldyByb2xleCB2b2xpbmZvCi1BTExfTElCUyAgID0gJChMSUJXSU5FKSAkKExJQlMpCi0KLUNfU1JDUyA9IFwKLQlleHBhbmQuYyBcCi0JaGVsbG8uYyBcCi0JaGVsbG8yLmMgXAotCWhlbGxvMy5jIFwKLQloZWxsbzQuYyBcCi0JaGVsbG81LmMgXAotCW5ldy5jIFwKLQlyb2xleC5jIFwKLQl2b2xpbmZvLmMKLQotU1BFQ19TUkNTID0gXAotCWV4cGFuZC5zcGVjIFwKLQloZWxsby5zcGVjIFwKLQloZWxsbzIuc3BlYyBcCi0JaGVsbG8zLnNwZWMgXAotCWhlbGxvNC5zcGVjIFwKLQloZWxsbzUuc3BlYyBcCi0JbmV3LnNwZWMgXAotCXJvbGV4LnNwZWMgXAotCXZvbGluZm8uc3BlYwotCi1SQ19TUkNTID0gXAotCWhlbGxvM3Jlcy5yYwotCi1hbGw6ICQoUFJPR1JBTVMpICQoUFJPR1JBTVM6JT0lLnNvKQotCi1ATUFLRV9SVUxFU0AKLQotZXhwYW5kLnNwZWMuYzogZXhwYW5kLm8gJChXSU5FQlVJTEQpCi0JJChMRFBBVEgpICQoV0lORUJVSUxEKSAkKERFRlMpIC1zeW0gZXhwYW5kLm8gLW8gZXhwYW5kLnNwZWMuYyAtZXhlIGV4cGFuZCAtbWd1aSAtTCQoRExMRElSKSAtbGx6MzIgLWxrZXJuZWwzMgotZXhwYW5kLnNvOiBleHBhbmQubyBleHBhbmQuc3BlYy5vCi0JJChMRFNIQVJFRCkgJChMRERMTEZMQUdTKSAtbyBleHBhbmQuc28gJCsgJChBTExfTElCUykKLQotaGVsbG8uc3BlYy5jOiBoZWxsby5vICQoV0lORUJVSUxEKQotCSQoTERQQVRIKSAkKFdJTkVCVUlMRCkgJChERUZTKSAtc3ltIGhlbGxvLm8gLW8gaGVsbG8uc3BlYy5jIC1leGUgaGVsbG8gLW1ndWkgLUwkKERMTERJUikgLWx1c2VyMzIgLWxnZGkzMiAtbGtlcm5lbDMyCi1oZWxsby5zbzogaGVsbG8ubyBoZWxsby5zcGVjLm8KLQkkKExEU0hBUkVEKSAkKExERExMRkxBR1MpIC1vIGhlbGxvLnNvICQrICQoQUxMX0xJQlMpCi0KLWhlbGxvMi5zcGVjLmM6IGhlbGxvMi5vICQoV0lORUJVSUxEKQotCSQoTERQQVRIKSAkKFdJTkVCVUlMRCkgJChERUZTKSAtc3ltIGhlbGxvMi5vIC1vIGhlbGxvMi5zcGVjLmMgLWV4ZSBoZWxsbzIgLW1ndWkgLUwkKERMTERJUikgLWx1c2VyMzIgLWxrZXJuZWwzMgotaGVsbG8yLnNvOiBoZWxsbzIubyBoZWxsbzIuc3BlYy5vCi0JJChMRFNIQVJFRCkgJChMRERMTEZMQUdTKSAtbyBoZWxsbzIuc28gJCsgJChBTExfTElCUykKLQotaGVsbG8zLnNwZWMuYzogaGVsbG8zLm8gaGVsbG8zcmVzLnJlcyAkKFdJTkVCVUlMRCkKLQkkKExEUEFUSCkgJChXSU5FQlVJTEQpICQoREVGUykgLXN5bSBoZWxsbzMubyAtcmVzIGhlbGxvM3Jlcy5yZXMgLW8gaGVsbG8zLnNwZWMuYyAtZXhlIGhlbGxvMyAtbWd1aSAtTCQoRExMRElSKSAtbGNvbWRsZzMyIC1sdXNlcjMyIC1sZ2RpMzIgLWxrZXJuZWwzMgotaGVsbG8zLnNvOiBoZWxsbzMubyBoZWxsbzMuc3BlYy5vCi0JJChMRFNIQVJFRCkgJChMRERMTEZMQUdTKSAtbyBoZWxsbzMuc28gJCsgJChBTExfTElCUykKLQotaGVsbG80LnNwZWMuYzogaGVsbG80Lm8gJChXSU5FQlVJTEQpCi0JJChMRFBBVEgpICQoV0lORUJVSUxEKSAkKERFRlMpIC1zeW0gaGVsbG80Lm8gLW8gaGVsbG80LnNwZWMuYyAtZXhlIGhlbGxvNCAtbWd1aSAtTCQoRExMRElSKSAtbHVzZXIzMiAtbGdkaTMyIC1sa2VybmVsMzIKLWhlbGxvNC5zbzogaGVsbG80Lm8gaGVsbG80LnNwZWMubwotCSQoTERTSEFSRUQpICQoTERETExGTEFHUykgLW8gaGVsbG80LnNvICQrICQoQUxMX0xJQlMpCi0KLWhlbGxvNS5zcGVjLmM6IGhlbGxvNS5vICQoV0lORUJVSUxEKQotCSQoTERQQVRIKSAkKFdJTkVCVUlMRCkgJChERUZTKSAtc3ltIGhlbGxvNS5vIC1vIGhlbGxvNS5zcGVjLmMgLWV4ZSBoZWxsbzUgLW1ndWkgLUwkKERMTERJUikgLWxrZXJuZWwzMgotaGVsbG81LnNvOiBoZWxsbzUubyBoZWxsbzUuc3BlYy5vCi0JJChMRFNIQVJFRCkgJChMRERMTEZMQUdTKSAtbyBoZWxsbzUuc28gJCsgJChBTExfTElCUykKLQotbmV3LnNwZWMuYzogbmV3Lm8gJChXSU5FQlVJTEQpCi0JJChMRFBBVEgpICQoV0lORUJVSUxEKSAkKERFRlMpIC1zeW0gbmV3Lm8gLW8gbmV3LnNwZWMuYyAtZXhlIG5ldyAtbWd1aSAtTCQoRExMRElSKSAtbHVzZXIzMiAtbGdkaTMyIC1sa2VybmVsMzIKLW5ldy5zbzogbmV3Lm8gbmV3LnNwZWMubwotCSQoTERTSEFSRUQpICQoTERETExGTEFHUykgLW8gbmV3LnNvICQrICQoQUxMX0xJQlMpCi0KLXJvbGV4LnNwZWMuYzogcm9sZXgubyAkKFdJTkVCVUlMRCkKLQkkKExEUEFUSCkgJChXSU5FQlVJTEQpICQoREVGUykgLXN5bSByb2xleC5vIC1vIHJvbGV4LnNwZWMuYyAtZXhlIHJvbGV4IC1tZ3VpIC1MJChETExESVIpIC1sdXNlcjMyIC1sZ2RpMzIgLWxrZXJuZWwzMgotcm9sZXguc286IHJvbGV4Lm8gcm9sZXguc3BlYy5vCi0JJChMRFNIQVJFRCkgJChMRERMTEZMQUdTKSAtbyByb2xleC5zbyAkKyAkKEFMTF9MSUJTKQotCi12b2xpbmZvLnNwZWMuYzogdm9saW5mby5vICQoV0lORUJVSUxEKQotCSQoTERQQVRIKSAkKFdJTkVCVUlMRCkgJChERUZTKSAtc3ltIHZvbGluZm8ubyAtbyB2b2xpbmZvLnNwZWMuYyAtZXhlIHZvbGluZm8gLW1ndWkgLUwkKERMTERJUikgLWxrZXJuZWwzMgotdm9saW5mby5zbzogdm9saW5mby5vIHZvbGluZm8uc3BlYy5vCi0JJChMRFNIQVJFRCkgJChMRERMTEZMQUdTKSAtbyB2b2xpbmZvLnNvICQrICQoQUxMX0xJQlMpCi0KLSQoUFJPR1JBTVMpOgotCSQoUk0pICRAICYmICQoTE5fUykgJChUT1BPQkpESVIpL3dpbmUgJEAKLQotJChQUk9HUkFNUzolPSUuc28vX2NoZWNrbGlua18pOiAkKFBST0dSQU1TOiU9JS5zbykKLQkkKENDKSAtbyBjaGVja2xpbmsgJChUT1BTUkNESVIpL2xpYnJhcnkvY2hlY2tsaW5rLmMgYGRpcm5hbWUgJEBgICYmICQoUk0pIGNoZWNrbGluawotCi1jaGVja2xpbms6OiAkKFBST0dSQU1TOiU9JS5zby9fY2hlY2tsaW5rXykKLQotIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL2xpYnRlc3QvZ3VpdGVzdC5jIGIvbGlidGVzdC9ndWl0ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNzYyMTEuLjAwMDAwMDAKLS0tIGEvbGlidGVzdC9ndWl0ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjcgKzAsMCBAQAotLyogV2luZG93cyBHVUkgQmVoYXZpb3VyIFRlc3RlcgotICoKLSAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2luY2x1ZGUgImd1aXRlc3QucmgiCi0KLS8qIGNoZWNrcyB0byBpbmNsdWRlICovCi0jZGVmaW5lIExPR0dJTkcgLyogY2FuIGJlIHVuZGVmaW5lZCB1bmRlciBXaW5lIGFuZCB1c2UgLWRlYnVnbXNnICttZXNzYWdlIGluc3RlYWQgKi8KLSNkZWZpbmUgTUFJTl9TVFlMRSBXU19PVkVSTEFQUEVEV0lORE9XfFdTX0hTQ1JPTEwKLSNkZWZpbmUgTUFJTl9FWFNUWUxFIDAKLSN1bmRlZiBURVNUX0RFU1RST1lfTUFJTgotI2RlZmluZSBTSE9XX1NVQgotI3VuZGVmIFRFU1RfRElBTE9HCi0jZGVmaW5lIFJFU0laRV9ESUFMT0cKLSN1bmRlZiBURVNUX1NVQkRJQUxPRwotI3VuZGVmIFRFU1RfQ09NTUNUTAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiBHTE9CQUwgVkFSSUFCTEVTICoqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUhJTlNUQU5DRSBoSW5zdDsKLURXT1JEIFN0YXJ0VGltZTsKLUhXTkQgaExpc3RCb3gsaE1haW5XbmQsaFN1YlduZDsKLUhXTkQgaEJ1dHRvbls0XT17MCwwLDAsMH07Ci1IV05EIGhEaWFsb2c9MCxoR3JvdXA9MCxoU3ViRGxnPTA7Ci1XTkRQUk9DIHduZEJ1dHRvbls0XSx3bmREaWFsb2csd25kR3JvdXAsd25kU3ViRGxnOwotQk9PTCBDbGlja2VkPTAsUmVhZHk9MDsKLWludCBTdGF0ZT0wLFJlYz0wOwotI2RlZmluZSBTVEFURV9DUkVBVEUgMAotI2RlZmluZSBTVEFURV9ERVNUUk9ZIDEKLSNkZWZpbmUgU1RBVEVfU0hPVyAyCi0jZGVmaW5lIFNUQVRFX1VQREFURSAzCi0jZGVmaW5lIFNUQVRFX0RJQUxPRyA0Ci0jZGVmaW5lIFNUQVRFX1RFU1QgNQotI2RlZmluZSBTVEFURV9ESVJFQ1QgNgotI2RlZmluZSBTVEFURV9ESVNQQVRDSCA3Ci0jZGVmaW5lIFNUQVRFX1JFQ1VSUyA4Ci1jaGFyKlN0YXRlTmFtZVtdPXsKLSAiQ3JlYXQiLAotICJEZXN0ciIsCi0gIlNob3cgIiwKLSAiVXBkYXQiLAotICJEaWFsZyIsCi0gIlRlc3QgIiwKLSAiQ2FsbCAiLAotICJEaXNwICIsCi0gIlJDYWxsIgotfTsKLQotc3RhdGljIGNoYXIgd2NsYXNzbmFtZVtdID0gIkdVSVRlc3RDbGFzcyI7Ci1zdGF0aWMgY2hhciB3Y2NsYXNzbmFtZVtdID0gIkdVSVRlc3RDaGlsZENsYXNzIjsKLXN0YXRpYyBjaGFyIHdpbm5hbWVbXSA9ICJHVUlUZXN0IjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiBMT0dHSU5HIEZBQ0lMSVRJRVMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgTVNHTkFNRVMgewotIGludCBtc2c7Ci0gY2hhcipuYW1lOwotfSBNc2dOYW1lc1tdPXsKLSNkZWZpbmUgTVNHKHgpIHt4LCN4fSwKLSNkZWZpbmUgTVNHMih4LHkpIHt5LCN4fSwKLSNkZWZpbmUgRU5ETVNHIHswfQotCi0vKiB3ZSBnZXQgdGhlc2UgaW4gQ3JlYXRlV2luZG93ICovCi1NU0coV01fR0VUTUlOTUFYSU5GTykKLU1TRyhXTV9OQ0NSRUFURSkKLU1TRyhXTV9OQ0NBTENTSVpFKQotTVNHKFdNX0NSRUFURSkKLU1TRyhXTV9QQVJFTlROT1RJRlkpCi0KLS8qIHdlIGdldCB0aGVzZSBpbiBTaG93V2luZG93ICovCi1NU0coV01fU0hPV1dJTkRPVykKLU1TRyhXTV9XSU5ET1dQT1NDSEFOR0lORykKLU1TRyhXTV9RVUVSWU5FV1BBTEVUVEUpCi1NU0coV01fQUNUSVZBVEVBUFApCi1NU0coV01fTkNBQ1RJVkFURSkKLU1TRyhXTV9HRVRURVhUKQotTVNHKFdNX0FDVElWQVRFKQotTVNHKFdNX1NFVEZPQ1VTKQotTVNHKFdNX05DUEFJTlQpCi1NU0coV01fRVJBU0VCS0dORCkKLU1TRyhXTV9XSU5ET1dQT1NDSEFOR0VEKQotTVNHKFdNX1NJWkUpCi1NU0coV01fTU9WRSkKLQotLyogd2UgZ2V0IHRoZXNlIGluIERlc3Ryb3lXaW5kb3cgKi8KLU1TRyhXTV9LSUxMRk9DVVMpCi1NU0coV01fREVTVFJPWSkKLU1TRyhXTV9OQ0RFU1RST1kpCi0KLS8qIHdlIGdldCB0aGVzZSBkaXJlY3RseSBzZW50ICovCi1NU0coV01fTkNISVRURVNUKQotTVNHKFdNX1NFVENVUlNPUikKLU1TRyhXTV9NT1VTRUFDVElWQVRFKQotTVNHKFdNX0NISUxEQUNUSVZBVEUpCi1NU0coV01fQ09NTUFORCkKLU1TRyhXTV9TWVNDT01NQU5EKQotCi0vKiBwb3N0ZWQgZXZlbnRzICovCi1NU0coV01fTU9VU0VNT1ZFKQotTVNHKFdNX05DTU9VU0VNT1ZFKQotTVNHKFdNX1BBSU5UKQotTVNHKFdNX0xCVVRUT05ET1dOKQotTVNHKFdNX0xCVVRUT05VUCkKLU1TRyhXTV9MQlVUVE9OREJMQ0xLKQotTVNHKFdNX05DTEJVVFRPTkRPV04pCi1NU0coV01fTkNMQlVUVE9OVVApCi1NU0coV01fTkNMQlVUVE9OREJMQ0xLKQotCi1NU0coV01fS0VZRE9XTikKLU1TRyhXTV9LRVlVUCkKLU1TRyhXTV9DSEFSKQotCi0jaWZkZWYgV0lOMzIKLU1TRyhXTV9DVExDT0xPUkJUTikKLU1TRyhXTV9DVExDT0xPUkRMRykKLU1TRyhXTV9DVExDT0xPUlNUQVRJQykKLSNlbHNlCi1NU0coV01fQ1RMQ09MT1IpCi0jZW5kaWYKLQotLyogbW92aW5nIGFuZCBzaXppbmcgKi8KLU1TRzIoV01fRU5URVJTSVpFTU9WRSwweDAyMzEpCi1NU0cyKFdNX0VYSVRTSVpFTU9WRSwweDAyMzIpCi0jaWZkZWYgV0lOMzIKLU1TRyhXTV9TSVpJTkcpCi0jZW5kaWYKLQotLyogbWVudXMvZGlhbG9nIGJveGVzICovCi1NU0coV01fQ0FOQ0VMTU9ERSkKLU1TRyhXTV9FTkFCTEUpCi1NU0coV01fU0VURk9OVCkKLU1TRyhXTV9JTklURElBTE9HKQotTVNHKFdNX0dFVERMR0NPREUpCi1NU0coV01fRU5URVJJRExFKQotCi0vKiBzY3JvbGwgYmFycyAqLwotTVNHKFdNX0hTQ1JPTEwpCi1NU0coV01fVlNDUk9MTCkKLQotLyogZ2V0dGluZyB0aGVzZSBmcm9tIFdpbmUgYnV0IG5vdCBmcm9tIFdpbmRvd3MgKi8KLU1TRzIoV01fU0VUVklTSUJMRSwweDAwMDkpIC8qIHVuaGVhcmQgb2YgaW4gQkMrKyA0LjUyICovCi0jaWZkZWYgV0lOMzIKLU1TRyhXTV9DQVBUVVJFQ0hBTkdFRCkKLSNlbmRpZgotCi1FTkRNU0d9OwotCi1zdHJ1Y3QgTVNHTkFNRVMgQnV0TXNnc1tdPXsKLU1TRyhCTV9TRVRTVEFURSkKLU1TRyhCTV9TRVRTVFlMRSkKLQotRU5ETVNHfTsKLQotY2hhcipNc2dOYW1lKFVJTlQgbXNnLEhXTkQgaFduZCkKLXsKLSBpbnQgaTsKLSBzdGF0aWMgY2hhciBidWZmZXJbNjRdLHdjbGFzc1s2NF07Ci0gR2V0Q2xhc3NOYW1lKGhXbmQsd2NsYXNzLHNpemVvZih3Y2xhc3MpKTsKLQotI2RlZmluZSBNU0dTRUFSQ0gobXNncykgeyBcCi0gIGZvciAoaT0wOyBtc2dzW2ldLm5hbWUmJm1zZ3NbaV0ubXNnIT1tc2c7IGkrKyk7IFwKLSAgaWYgKG1zZ3NbaV0ubmFtZSkgcmV0dXJuIG1zZ3NbaV0ubmFtZTsgXAotIH0KLQotIGlmICghc3RyaWNtcCh3Y2xhc3MsIkJ1dHRvbiIpKSBNU0dTRUFSQ0goQnV0TXNncyk7Ci0gTVNHU0VBUkNIKE1zZ05hbWVzKTsKLSAvKiBXTV9VU0VSICovCi0gaWYgKG1zZz49V01fVVNFUikgewotICBzcHJpbnRmKGJ1ZmZlciwiV01fVVNFUislMDR4eyVzfSIsbXNnLVdNX1VTRVIsd2NsYXNzKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLSB9Ci0gLyogbWVzc2FnZSBub3QgZm91bmQgKi8KLSBzcHJpbnRmKGJ1ZmZlciwiJTA0eHslc30iLG1zZyx3Y2xhc3MpOwotIHJldHVybiBidWZmZXI7Ci19Ci0KLWNoYXIqV25kTmFtZShIV05EIGhXbmQsaW50IHN0YXRlKQotewotIHN0YXRpYyBjaGFyIGJ1ZmZlclsxNl07Ci0gaWYgKCFoV25kKSByZXR1cm4gIjAwMDAiOwotIGlmIChoV25kPT1oTWFpblduZCB8fCAoc3RhdGU9PVNUQVRFX0NSRUFURSAmJiAhaE1haW5XbmQpKSByZXR1cm4gIm1haW4iOwotIGlmIChoV25kPT1oU3ViV25kIHx8IChzdGF0ZT09U1RBVEVfQ1JFQVRFICYmICFoU3ViV25kKSkgcmV0dXJuICJjaGxkIjsKLSBpZiAoaFduZD09aERpYWxvZyB8fCAoc3RhdGU9PVNUQVRFX0RJQUxPRyAmJiAhaERpYWxvZykpIHJldHVybiAidGRsZyI7Ci0gaWYgKGhXbmQ9PWhHcm91cCkgcmV0dXJuICJ0Z3JwIjsKLSBpZiAoaFduZD09aEJ1dHRvblswXSkgcmV0dXJuICJidXQxIjsKLSBpZiAoaFduZD09aEJ1dHRvblsxXSkgcmV0dXJuICJidXQyIjsKLSBpZiAoaFduZD09aEJ1dHRvblsyXSkgcmV0dXJuICJidXQzIjsKLSBpZiAoaFduZD09aEJ1dHRvblszXSkgcmV0dXJuICJidXQ0IjsKLSBpZiAoaFduZD09aFN1YkRsZyB8fCAoc3RhdGU9PVNUQVRFX0NSRUFURSAmJiAhaFN1YkRsZykpIHJldHVybiAic2RsZyI7Ci0gaWYgKGhEaWFsb2cpIHsKLSAgaW50IGlkPUdldERsZ0N0cmxJRChoV25kKTsKLSAgaWYgKGlkKSB7Ci0gICBzcHJpbnRmKGJ1ZmZlciwiZGxnaXRlbSglZCkiLGlkKTsKLSAgIHJldHVybiBidWZmZXI7Ci0gIH0KLSB9Ci0gc3ByaW50ZihidWZmZXIsIiUwNHgiLGhXbmQpOwotIHJldHVybiBidWZmZXI7Ci19Ci0KLXZvaWQgTG9nKGNvbnN0IGNoYXIqZm10KQotewotI2lmZGVmIExPR0dJTkcKLSBpZiAoIUNsaWNrZWQpIFNlbmRNZXNzYWdlKGhMaXN0Qm94LExCX0FERFNUUklORywwLChMUEFSQU0pZm10KTsKLSNlbmRpZgotfQotCi12b2lkIExvZ2YoY29uc3QgY2hhcipmbXQsLi4uKQotewotIHZhX2xpc3QgcGFyOwotIHN0YXRpYyBjaGFyIGJ1ZmZlclsyNTZdOwotCi0gdmFfc3RhcnQocGFyLGZtdCk7Ci0gdnNwcmludGYoYnVmZmVyLGZtdCxwYXIpOwotIHZhX2VuZChwYXIpOwotIExvZyhidWZmZXIpOwotfQotCi12b2lkIExvZ0NoaWxkT3JkZXIoSFdORCBoV25kKQotewotIEhXTkQgaFduZENoaWxkID0gR2V0V2luZG93KGhXbmQsR1dfQ0hJTEQpOwotIHN0YXRpYyBjaGFyIGJ1ZmZlclsyNTZdOwotCi0gc3RyY3B5KGJ1ZmZlciwiY2hpbGQgbGlzdDoiKTsKLSB3aGlsZSAoaFduZENoaWxkKSB7Ci0gIHN0cmNhdChzdHJjYXQoYnVmZmVyLCIgIiksV25kTmFtZShoV25kQ2hpbGQsU3RhdGUpKTsKLSAgaFduZENoaWxkPUdldFdpbmRvdyhoV25kQ2hpbGQsR1dfSFdORE5FWFQpOwotIH0KLSBMb2coYnVmZmVyKTsKLX0KLQotdm9pZCBMb2dNZXNzYWdlKGludCBzdGF0ZSxIV05EIGhXbmQsVUlOVCBtc2csV1BBUkFNIHdQYXJhbSxMUEFSQU0gbFBhcmFtLGNoYXIqbmFtZSkKLXsKLSBzdGF0aWMgY2hhciBidWZmZXJbMjU2XTsKLSBEV09SRCB0aWNrPUdldFRpY2tDb3VudCgpLVN0YXJ0VGltZTsKLSBjaGFyKm1zZ25hbWU9TXNnTmFtZShtc2csaFduZCk7Ci0gaWYgKCFuYW1lKSBuYW1lPVduZE5hbWUoaFduZCxzdGF0ZSk7Ci0gc3dpdGNoIChtc2cpIHsKLSAgY2FzZSBXTV9TRVRGT0NVUzoKLSAgY2FzZSBXTV9LSUxMRk9DVVM6Ci0gIGNhc2UgV01fU0VUQ1VSU09SOgotICAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJXMsJTA4eCkiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCi0gICAgICAgIG5hbWUsbXNnbmFtZSxXbmROYW1lKChIV05EKXdQYXJhbSxTdGF0ZSksbFBhcmFtKTsKLSAgIGJyZWFrOwotI2lmZGVmIFdJTjMyCi0gIGNhc2UgV01fRU5URVJJRExFOgotICBjYXNlIFdNX0NUTENPTE9SQlROOgotICBjYXNlIFdNX0NUTENPTE9SRExHOgotICAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJTA4eCwlcykiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCi0gICAgICAgIG5hbWUsbXNnbmFtZSx3UGFyYW0sV25kTmFtZSgoSFdORClsUGFyYW0sU3RhdGUpKTsKLSAgIGJyZWFrOwotI2Vsc2UKLSAgY2FzZSBXTV9FTlRFUklETEU6Ci0gIGNhc2UgV01fQ1RMQ09MT1I6Ci0gICBMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglMDh4LCUwNHg6JXMpIix0aWNrLFN0YXRlTmFtZVtzdGF0ZV0sUmVjLAotICAgICAgICBuYW1lLG1zZ25hbWUsd1BhcmFtLEhJV09SRChsUGFyYW0pLFduZE5hbWUoKEhXTkQpTE9XT1JEKGxQYXJhbSksU3RhdGUpKTsKLSAgIGJyZWFrOwotI2VuZGlmCi0gIGNhc2UgV01fV0lORE9XUE9TQ0hBTkdJTkc6Ci0gIGNhc2UgV01fV0lORE9XUE9TQ0hBTkdFRDoKLSAgIHsKLSAgICBXSU5ET1dQT1MqcG9zPShXSU5ET1dQT1MqKWxQYXJhbTsKLSNpZmRlZiBXSU4zMgotCSBMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglMDh4LCVwKSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKLQkJCW5hbWUsbXNnbmFtZSx3UGFyYW0scG9zKTsKLSNlbHNlCi0JIExvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCUwNHgsJXApIix0aWNrLFN0YXRlTmFtZVtzdGF0ZV0sUmVjLAotCQkJbmFtZSxtc2duYW1lLHdQYXJhbSxwb3MpOwotI2VuZGlmCi0JIHN0cmNweShidWZmZXIsIkZMQUdTOiIpOwotCSBpZiAocG9zLT5mbGFncyZTV1BfRFJBV0ZSQU1FKSBzdHJjYXQoYnVmZmVyLCIgRFJBV0ZSQU1FIik7Ci0JIGlmIChwb3MtPmZsYWdzJlNXUF9ISURFV0lORE9XKSBzdHJjYXQoYnVmZmVyLCIgSElERVdJTkRPVyIpOwotCSBpZiAocG9zLT5mbGFncyZTV1BfTk9BQ1RJVkFURSkgc3RyY2F0KGJ1ZmZlciwiIE5PQUNUSVZBVEUiKTsKLQkgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PQ09QWUJJVFMpIHN0cmNhdChidWZmZXIsIiBOT0NPUFlCSVRTIik7Ci0JIGlmIChwb3MtPmZsYWdzJlNXUF9OT01PVkUpIHN0cmNhdChidWZmZXIsIiBOT01PVkUiKTsKLQkgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PT1dORVJaT1JERVIpIHN0cmNhdChidWZmZXIsIiBOT09XTkVSWk9SREVSIik7Ci0JIGlmIChwb3MtPmZsYWdzJlNXUF9OT1NJWkUpIHN0cmNhdChidWZmZXIsIiBOT1NJWkUiKTsKLQkgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PUkVEUkFXKSBzdHJjYXQoYnVmZmVyLCIgTk9SRURSQVciKTsKLQkgaWYgKHBvcy0+ZmxhZ3MmU1dQX05PWk9SREVSKSBzdHJjYXQoYnVmZmVyLCIgTk9aT1JERVIiKTsKLQkgaWYgKHBvcy0+ZmxhZ3MmU1dQX1NIT1dXSU5ET1cpIHN0cmNhdChidWZmZXIsIiBTSE9XV0lORE9XIik7Ci0JIExvZyhidWZmZXIpOwotCX0KLQlicmVhazsKLSAgY2FzZSBXTV9TWVNDT01NQU5EOgotCXsKLQkgY2hhcipjbWQ9TlVMTDsKLQkgc3dpdGNoICh3UGFyYW0mMHhGRkYwKSB7Ci0jZGVmaW5lIENBU0UoeCkgY2FzZSBTQ18jI3g6IGNtZD0jeDsgYnJlYWs7Ci0JICBDQVNFKENMT1NFKQotCSAgQ0FTRShERUZBVUxUKQotCSAgQ0FTRShIT1RLRVkpCi0JICBDQVNFKEhTQ1JPTEwpCi0JICBDQVNFKEtFWU1FTlUpCi0JICBDQVNFKE1BWElNSVpFKQotCSAgQ0FTRShNSU5JTUlaRSkKLQkgIENBU0UoTU9VU0VNRU5VKQotCSAgQ0FTRShNT1ZFKQotCSAgQ0FTRShORVhUV0lORE9XKQotCSAgQ0FTRShQUkVWV0lORE9XKQotCSAgQ0FTRShSRVNUT1JFKQotCSAgQ0FTRShTQ1JFRU5TQVZFKQotCSAgQ0FTRShTSVpFKQotCSAgQ0FTRShUQVNLTElTVCkKLQkgIENBU0UoVlNDUk9MTCkKLSN1bmRlZiBDQVNFCi0JIH0KLQkgaWYgKGNtZCkgewotCSAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJXMrJXgsJTA4eCkiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCi0JCQkgbmFtZSxtc2duYW1lLGNtZCx3UGFyYW0mMHhGLGxQYXJhbSk7Ci0JIH0gZWxzZSBnb3RvIEdFTkVSSUNfTVNHOwotCX0KLQlicmVhazsKLSAgY2FzZSBXTV9IU0NST0xMOgotICBjYXNlIFdNX1ZTQ1JPTEw6Ci0JewotCSBjaGFyKmNtZD1OVUxMOwotCSBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSB7Ci0jZGVmaW5lIENBU0UoeCkgY2FzZSBTQl8jI3g6IGNtZD0jeDsgYnJlYWs7Ci0jZGVmaW5lIENBU0UyKGgsdikgY2FzZSBTQl8jI2g6IGlmIChtc2c9PVdNX0hTQ1JPTEwpIGNtZD0jaDsgZWxzZSBjbWQ9I3Y7IGJyZWFrOwotCSAgQ0FTRShCT1RUT00pCi0JICBDQVNFKEVORFNDUk9MTCkKLQkgIENBU0UyKExJTkVMRUZULExJTkVVUCkKLQkgIENBU0UyKExJTkVSSUdIVCxMSU5FRE9XTikKLQkgIENBU0UyKFBBR0VMRUZULFBBR0VVUCkKLQkgIENBU0UyKFBBR0VSSUdIVCxQQUdFRE9XTikKLQkgIENBU0UoVEhVTUJQT1NJVElPTikKLQkgIENBU0UoVEhVTUJUUkFDSykKLSAgICAgQ0FTRShUT1ApCi0jdW5kZWYgQ0FTRQotCSB9Ci0JIGlmIChjbWQpIHsKLSNpZmRlZiBXSU4zMgotCSAgTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJXMsJTA0eCwlcykiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCi0JCQkgbmFtZSxtc2duYW1lLGNtZCxISVdPUkQod1BhcmFtKSxXbmROYW1lKChIV05EKWxQYXJhbSxTdGF0ZSkpOwotI2Vsc2UKLQkgIExvZ2YoIiUwNGRbJXMoJWQpOiVzXSVzKCUwNHgsJTA0eCwlcykiLHRpY2ssU3RhdGVOYW1lW3N0YXRlXSxSZWMsCi0JCQkgbmFtZSxtc2duYW1lLGNtZCxMT1dPUkQobFBhcmFtKSxXbmROYW1lKChIV05EKUhJV09SRChsUGFyYW0pLFN0YXRlKSk7Ci0jZW5kaWYKLQkgfSBlbHNlIGdvdG8gR0VORVJJQ19NU0c7Ci0JfQotCWJyZWFrOwotICBkZWZhdWx0OgotR0VORVJJQ19NU0c6Ci0jaWZkZWYgV0lOMzIKLQlMb2dmKCIlMDRkWyVzKCVkKTolc10lcyglMDh4LCUwOHgpIix0aWNrLFN0YXRlTmFtZVtzdGF0ZV0sUmVjLAotCQkgIG5hbWUsbXNnbmFtZSx3UGFyYW0sbFBhcmFtKTsKLSNlbHNlCi0JTG9nZigiJTA0ZFslcyglZCk6JXNdJXMoJTA0eCwlMDh4KSIsdGljayxTdGF0ZU5hbWVbc3RhdGVdLFJlYywKLQkJICBuYW1lLG1zZ25hbWUsd1BhcmFtLGxQYXJhbSk7Ci0jZW5kaWYKLSB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqIEdSQVBISUNTIEZBQ0lMSVRJRVMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBQYWludChIV05EIGhXbmQpCi17Ci0gSERDIGRjOwotIFBBSU5UU1RSVUNUIHBzOwotIGRjPUJlZ2luUGFpbnQoaFduZCwmcHMpOwotIEVuZFBhaW50KGhXbmQsJnBzKTsKLX0KLQotdm9pZCBGaWxsUGF0dGVybihIV05EIGhXbmQsSERDIHBkYykKLXsKLSBIREMgZGM9cGRjP3BkYzpHZXREQyhoV25kKTsKLSBIQlJVU0ggb2xkYnJ1c2g7Ci0gUkVDVCByZWN0OwotIGlmICghZGMpIHsKLSAgTG9nZigiZmFpbGVkIHRvIGFjcXVpcmUgREMgZm9yIHdpbmRvdyAlcyIsV25kTmFtZShoV25kLFN0YXRlKSk7Ci0gIHJldHVybjsKLSB9IGVsc2UgewotICBMb2dmKCJhY3F1aXJlZCBEQyBmb3IgJXMgd2luZG93ICVzLCBwYWludGluZyIsCi0gICAgICAgSXNXaW5kb3dWaXNpYmxlKGhXbmQpPyJ2aXNpYmxlIjoiaW52aXNpYmxlIixXbmROYW1lKGhXbmQsU3RhdGUpKTsKLSB9Ci0gR2V0Q2xpZW50UmVjdChoV25kLCZyZWN0KTsKLSBvbGRicnVzaD1TZWxlY3RPYmplY3QoZGMsR2V0U3RvY2tPYmplY3QoTFRHUkFZX0JSVVNIKSk7Ci0gUGF0Qmx0KGRjLDAsMCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLFBBVENPUFkpOwotIFNlbGVjdE9iamVjdChkYyxvbGRicnVzaCk7Ci0gaWYgKCFwZGMpIFJlbGVhc2VEQyhoV25kLGRjKTsKLX0KLQotdm9pZCBQYWludFBhdHRlcm4oSFdORCBoV25kKQotewotIEhEQyBkYzsKLSBQQUlOVFNUUlVDVCBwczsKLSBkYz1CZWdpblBhaW50KGhXbmQsJnBzKTsKLSBGaWxsUGF0dGVybihoV25kLGRjKTsKLSBFbmRQYWludChoV25kLCZwcyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiBXSU5ET1cgUFJPQ0VEVVJFUyAqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTUFJTiBXSU5ET1cgKi8KLUxSRVNVTFQgRkFSIENBTExCQUNLIF9leHBvcnQgTWFpbldpbmRvd1Byb2MoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSBMUkVTVUxUIGxSZXN1bHQ9MDsKLSBSRUNUIHJlY3Q7Ci0gaW50IE9sZFN0YXRlPVN0YXRlOwotCi0gU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKLSBpZiAoIUNsaWNrZWQpIExvZ01lc3NhZ2UoT2xkU3RhdGUsaFduZCxtc2csd1BhcmFtLGxQYXJhbSxOVUxMKTsKLSBzd2l0Y2ggKG1zZykgewotICBjYXNlIFdNX05DSElUVEVTVDoKLSAgIGxSZXN1bHQ9RGVmV2luZG93UHJvYyhoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKLSAgIGJyZWFrOwotICBjYXNlIFdNX0xCVVRUT05ET1dOOgotICBjYXNlIFdNX0NIQVI6Ci0gICBpZiAoIUNsaWNrZWQpIHsKLSAgICBTZXRQYXJlbnQoaExpc3RCb3gsaFduZCk7Ci0gICAgR2V0Q2xpZW50UmVjdChoV25kLCZyZWN0KTsKLSAgICBNb3ZlV2luZG93KGhMaXN0Qm94LDAsMCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLFRSVUUpOwotICAgIFNob3dXaW5kb3coaExpc3RCb3gsU1dfU0hPVyk7Ci0gICAgU2V0Rm9jdXMoaExpc3RCb3gpOwotICAgIENsaWNrZWQ9VFJVRTsKLSAgIH0KLSAgIGJyZWFrOwotICBjYXNlIFdNX1NJWkU6Ci0gICBHZXRDbGllbnRSZWN0KGhXbmQsJnJlY3QpOwotICAgaWYgKENsaWNrZWQpIHsKLSAgICBNb3ZlV2luZG93KGhMaXN0Qm94LDAsMCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLFRSVUUpOwotICAgfQotICAgTW92ZVdpbmRvdyhoU3ViV25kLDAscmVjdC5ib3R0b20vMixyZWN0LnJpZ2h0LHJlY3QuYm90dG9tLShyZWN0LmJvdHRvbS8yKSxUUlVFKTsKLSAgIGJyZWFrOwotICBjYXNlIFdNX1BBSU5UOgotICAgUGFpbnQoaFduZCk7Ci0gICBicmVhazsKLSAgY2FzZSBXTV9ERVNUUk9ZOgotICAgUG9zdFF1aXRNZXNzYWdlKDApOwotICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICBsUmVzdWx0PURlZldpbmRvd1Byb2MoaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7Ci0gfQotIFN0YXRlPU9sZFN0YXRlOyBSZWMtLTsKLSByZXR1cm4gbFJlc3VsdDsKLX0KLQotLyogQ0hJTEQgV0lORE9XICovCi1MUkVTVUxUIEZBUiBDQUxMQkFDSyBfZXhwb3J0IFN1YldpbmRvd1Byb2MoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSBMUkVTVUxUIGxSZXN1bHQ9MDsKLSBSRUNUIHJlY3Q7Ci0gaW50IE9sZFN0YXRlPVN0YXRlOwotCi0gU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKLSBpZiAoIUNsaWNrZWQpIExvZ01lc3NhZ2UoT2xkU3RhdGUsaFduZCxtc2csd1BhcmFtLGxQYXJhbSxOVUxMKTsKLSBzd2l0Y2ggKG1zZykgewotICBjYXNlIFdNX1BBSU5UOgotICAgUGFpbnQoaFduZCk7Ci0gICBicmVhazsKLSAgZGVmYXVsdDoKLSAgIGxSZXN1bHQ9RGVmV2luZG93UHJvYyhoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKLSB9Ci0gU3RhdGU9T2xkU3RhdGU7IFJlYy0tOwotIHJldHVybiBsUmVzdWx0OwotfQotCi1CT09MIEZBUiBDQUxMQkFDSyBfZXhwb3J0IFN1YkRpYWxvZ1Byb2MoSFdORCBoV25kRGxnLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci0KLS8qIFNVQkNMQVNTRUQgQ09OVFJPTFMgKi8KLUxSRVNVTFQgRkFSIENBTExCQUNLIF9leHBvcnQgU3ViQ2xhc3NXaW5kb3dQcm9jKEhXTkQgaFduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gTFJFU1VMVCBsUmVzdWx0PTA7Ci0gUkVDVCByZWN0OwotIGludCBPbGRTdGF0ZT1TdGF0ZTsKLSBpbnQgQnV0PS0xOwotCi0gaWYgKGhXbmQ9PWhCdXR0b25bMF0pIEJ1dD0wOyBlbHNlCi0gaWYgKGhXbmQ9PWhCdXR0b25bMV0pIEJ1dD0xOyBlbHNlCi0gaWYgKGhXbmQ9PWhCdXR0b25bMl0pIEJ1dD0yOyBlbHNlCi0gaWYgKGhXbmQ9PWhCdXR0b25bM10pIEJ1dD0zOwotCi0gU3RhdGU9U1RBVEVfUkVDVVJTOyBSZWMrKzsKLSBpZiAoIUNsaWNrZWQpIHsKLSAgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kLG1zZyx3UGFyYW0sbFBhcmFtLE5VTEwpOwotICBpZiAoQnV0IT0tMSkgewotICAgbFJlc3VsdD1DYWxsV2luZG93UHJvYygoRkFSUFJPQyl3bmRCdXR0b25bQnV0XSxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKLSAgIGlmIChtc2c9PVdNX0xCVVRUT05VUCkgewotICAgIExvZ0NoaWxkT3JkZXIoR2V0UGFyZW50KGhXbmQpKTsKLSAgIH0KLSAgfQotICBlbHNlIGlmIChoV25kPT1oRGlhbG9nKSB7Ci0gICBsUmVzdWx0PUNhbGxXaW5kb3dQcm9jKChGQVJQUk9DKXduZERpYWxvZyxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKLSAgfQotICBlbHNlIGlmIChoV25kPT1oU3ViRGxnKSB7Ci0gICBsUmVzdWx0PUNhbGxXaW5kb3dQcm9jKChGQVJQUk9DKXduZFN1YkRsZyxoV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKLSAgfQotICBlbHNlIGlmIChoV25kPT1oR3JvdXApIHsKLSAgIGxSZXN1bHQ9Q2FsbFdpbmRvd1Byb2MoKEZBUlBST0Mpd25kR3JvdXAsaFduZCxtc2csd1BhcmFtLGxQYXJhbSk7Ci0gICBpZiAobXNnPT1XTV9TRVRGT0NVUykgewotICAgIC8qIGNyZWF0ZSBzdWJkaWFsb2cgKi8KLSAgICBpZiAoaFN1YkRsZykgewotI2lmIDAKLSAgICAgU2V0UmVjdCgmcmVjdCwwLDAsMSwxKTsKLSAgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwmcmVjdCxGQUxTRSk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotI2lmZGVmIFRFU1RfU1VCRElBTE9HCi0gICAgIFN0YXRlPVNUQVRFX0NSRUFURTsKLSAgICAgaFN1YkRsZz1DcmVhdGVEaWFsb2coaEluc3QsTUFLRUlOVFJFU09VUkNFKDIpLGhXbmQsKEZBUlBST0MpU3ViRGlhbG9nUHJvYyk7Ci0gICAgIFN0YXRlPVNUQVRFX1JFQ1VSUzsKLSNlbHNlCi0jaWZkZWYgUkVTSVpFX0RJQUxPRwotICAgICBHZXRXaW5kb3dSZWN0KEdldFBhcmVudChoV25kKSwmcmVjdCk7Ci0gICAgIHJlY3QucmlnaHQrKzsKLSAgICAgU2V0V2luZG93UG9zKEdldFBhcmVudChoV25kKSwwLDAsMCwKLSAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LHJlY3QuYm90dG9tLXJlY3QudG9wLAotICAgICAgICAgICAgICAgICAgU1dQX05PTU9WRXxTV1BfTk9aT1JERVIpOwotI2VuZGlmCi0jZW5kaWYKLSAgICB9Ci0gICB9Ci0gIH0KLSB9Ci0gU3RhdGU9T2xkU3RhdGU7IFJlYy0tOwotIHJldHVybiBsUmVzdWx0OwotfQotCi0vKiBNQUlOIERJQUxPRyBQUk9DRURVUkUgKi8KLUJPT0wgRkFSIENBTExCQUNLIF9leHBvcnQgVGVzdERpYWxvZ1Byb2MoSFdORCBoV25kRGxnLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSBCT09MIGJSZXN1bHQ9MDsKLSBSRUNUIHJlY3Q7Ci0gaW50IE9sZFN0YXRlPVN0YXRlOwotIGludCBCdXQ9LTE7Ci0KLSBTdGF0ZT1TVEFURV9SRUNVUlM7IFJlYysrOwotIGlmICghQ2xpY2tlZCkgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kRGxnLG1zZyx3UGFyYW0sbFBhcmFtLCJkbGdwIik7Ci0gc3dpdGNoIChtc2cpIHsKLSAgY2FzZSBXTV9JTklURElBTE9HOgotICAgaERpYWxvZyA9IGhXbmREbGc7Ci0gICAvKiBzdWJjbGFzcyBkaWFsb2cgd2luZG93IHByb2MgKi8KLSAgIHduZERpYWxvZyA9IChXTkRQUk9DKVNldFdpbmRvd0xvbmcoaERpYWxvZyxHV0xfV05EUFJPQywoTE9ORylTdWJDbGFzc1dpbmRvd1Byb2MpOwotICAgTG9nZigiZGlhbG9nIHZpc2libGU9JXMiLElzV2luZG93VmlzaWJsZShoV25kRGxnKT8iVFJVRSI6IkZBTFNFIik7Ci0gICAvKiBzdWJjbGFzcyBPSyBidXR0b24gKi8KLSAgIGhCdXR0b25bM10gPSBHZXREbGdJdGVtKGhXbmREbGcsSURPSyk7Ci0gICB3bmRCdXR0b25bM10gPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhCdXR0b25bM10sR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKLSAgIC8qIHN1YmNsYXNzIGdyb3VwIGJveCAqLwotICAgaEdyb3VwID0gR2V0RGxnSXRlbShoV25kRGxnLElEQ19HUk9VUEJPWDEpOwotICAgd25kR3JvdXAgPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhHcm91cCxHV0xfV05EUFJPQywoTE9ORylTdWJDbGFzc1dpbmRvd1Byb2MpOwotCi0jaWZkZWYgUkVTSVpFX0RJQUxPRwotICAgR2V0V2luZG93UmVjdChoV25kRGxnLCZyZWN0KTsKLSAgIHJlY3QucmlnaHQtLTsKLSAgIFNldFdpbmRvd1BvcyhoV25kRGxnLDAsMCwwLAotICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LHJlY3QuYm90dG9tLXJlY3QudG9wLAotICAgICAgICAgICAgICAgIFNXUF9OT01PVkV8U1dQX05PWk9SREVSKTsKLS8vICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhXbmREbGcsSURDQU5DRUwpLFNXX0hJREUpOwotI2VuZGlmCi0KLSAgIGJSZXN1bHQ9VFJVRTsgLyogd2UgZG9uJ3QgZG8gU2V0Rm9jdXMgKi8KLSAgIGJyZWFrOwotICBjYXNlIFdNX1BBSU5UOgotICAgUGFpbnRQYXR0ZXJuKGhXbmREbGcpOwotICAgYlJlc3VsdD1UUlVFOwotICAgYnJlYWs7Ci0gIGNhc2UgV01fQ09NTUFORDoKLSAgIEVuZERpYWxvZyhoV25kRGxnLExPV09SRCh3UGFyYW0pKTsKLSAgIGJSZXN1bHQ9VFJVRTsKLSAgIGJyZWFrOwotICBjYXNlIFdNX0NMT1NFOgotICAgRW5kRGlhbG9nKGhXbmREbGcsSURDQU5DRUwpOwotICAgYlJlc3VsdD1UUlVFOwotICAgYnJlYWs7Ci0gIGNhc2UgV01fTkNERVNUUk9ZOgotICAgaERpYWxvZyA9IDA7Ci0gICBicmVhazsKLSB9Ci0gU3RhdGU9T2xkU3RhdGU7IFJlYy0tOwotIHJldHVybiBiUmVzdWx0OwotfQotCi0vKiBTVUJESUFMT0cgUFJPQ0VEVVJFICovCi1CT09MIEZBUiBDQUxMQkFDSyBfZXhwb3J0IFN1YkRpYWxvZ1Byb2MoSFdORCBoV25kRGxnLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSBCT09MIGJSZXN1bHQ9MDsKLSBSRUNUIHJlY3Q7Ci0gaW50IE9sZFN0YXRlPVN0YXRlOwotIGludCBCdXQ9LTE7Ci0KLSBTdGF0ZT1TVEFURV9SRUNVUlM7IFJlYysrOwotIGlmICghQ2xpY2tlZCkgTG9nTWVzc2FnZShPbGRTdGF0ZSxoV25kRGxnLG1zZyx3UGFyYW0sbFBhcmFtLE5VTEwpOwotIHN3aXRjaCAobXNnKSB7Ci0gIGNhc2UgV01fSU5JVERJQUxPRzoKLSAgIGhTdWJEbGcgPSBoV25kRGxnOwotICAgLyogc3ViY2xhc3MgZGlhbG9nIHdpbmRvdyBwcm9jICovCi0gICB3bmRTdWJEbGcgPSAoV05EUFJPQylTZXRXaW5kb3dMb25nKGhEaWFsb2csR1dMX1dORFBST0MsKExPTkcpU3ViQ2xhc3NXaW5kb3dQcm9jKTsKLQotICAgYlJlc3VsdD1UUlVFOyAvKiB3ZSBkb24ndCBkbyBTZXRGb2N1cyAqLwotICAgYnJlYWs7Ci0gIGNhc2UgV01fTkNERVNUUk9ZOgotICAgaFN1YkRsZyA9IDA7Ci0gICBicmVhazsKLSB9Ci0gU3RhdGU9T2xkU3RhdGU7IFJlYy0tOwotIHJldHVybiBiUmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKiovCi0vKioqIE1BSU4gUFJPR1JBTSAqKiovCi0vKioqKioqKioqKioqKioqKioqKiovCi0KLUJPT0wgQXBwSW5pdCh2b2lkKQotewotIFdORENMQVNTIHdjbGFzczsKLQotIHdjbGFzcy5zdHlsZSA9IENTX0hSRURSQVd8Q1NfVlJFRFJBVzsKLSB3Y2xhc3MubHBmblduZFByb2MgPSBNYWluV2luZG93UHJvYzsKLSB3Y2xhc3MuY2JDbHNFeHRyYSA9IDA7Ci0gd2NsYXNzLmNiV25kRXh0cmEgPSAwOwotIHdjbGFzcy5oSW5zdGFuY2UgPSBoSW5zdDsKLSB3Y2xhc3MuaEljb24gPSBMb2FkSWNvbihoSW5zdCxNQUtFSU5UUkVTT1VSQ0UoMSkpOwotIHdjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcigwLElEQ19BUlJPVyk7Ci0gd2NsYXNzLmhickJhY2tncm91bmQgPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7Ci0gd2NsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7Ci0gd2NsYXNzLmxwc3pDbGFzc05hbWUgPSB3Y2xhc3NuYW1lOwotIGlmICghUmVnaXN0ZXJDbGFzcygmd2NsYXNzKSkgcmV0dXJuIEZBTFNFOwotIHdjbGFzcy5scGZuV25kUHJvYyA9IFN1YldpbmRvd1Byb2M7Ci0gd2NsYXNzLmxwc3pDbGFzc05hbWUgPSB3Y2NsYXNzbmFtZTsKLSBpZiAoIVJlZ2lzdGVyQ2xhc3MoJndjbGFzcykpIHJldHVybiBGQUxTRTsKLSByZXR1cm4gVFJVRTsKLX0KLQotaW50IFBBU0NBTCBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgIExQU1RSIGxwc3pDbWRMaW5lLCBpbnQgbkNtZFNob3cpCi17Ci0gTVNHIG1zZzsKLSBSRUNUIHJlY3Q7Ci0KLSBoSW5zdCA9IGhJbnN0YW5jZTsKLSBpZiAoIWhQcmV2SW5zdGFuY2UpCi0gIGlmICghQXBwSW5pdCgpKQotICAgcmV0dXJuIDA7Ci0KLSBTdGFydFRpbWU9R2V0VGlja0NvdW50KCk7Ci0gaExpc3RCb3ggPSBDcmVhdGVXaW5kb3coIkxJU1RCT1giLCJNZXNzYWdlcyIsV1NfQk9SREVSfFdTX1ZTQ1JPTEx8V1NfQ0hJTER8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJTX0hBU1NUUklOR1N8TEJTX05PVElGWXxMQlNfV0FOVEtFWUJPQVJESU5QVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMCxHZXREZXNrdG9wV2luZG93KCksMCxoSW5zdCwwKTsKLSBpZiAoIWhMaXN0Qm94KSB7Ci0gIE1lc3NhZ2VCb3goMCwiQ291bGQgbm90IGNyZWF0ZSBsaXN0IGJveCIsIkVycm9yIixNQl9PSyk7Ci0gfQotCi0gU3RhdGU9U1RBVEVfQ1JFQVRFOwotIGhNYWluV25kID0gQ3JlYXRlV2luZG93RXgoTUFJTl9FWFNUWUxFLHdjbGFzc25hbWUsd2lubmFtZSxNQUlOX1NUWUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dfVVNFREVGQVVMVCwwLDQwMCwzMDAsMCwwLGhJbnN0LDApOwotIGlmICghaE1haW5XbmQpIHJldHVybiAwOwotIFN0YXRlPVNUQVRFX1NIT1c7Ci0gU2hvd1dpbmRvdyhoTWFpblduZCxuQ21kU2hvdyk7Ci0jaWZkZWYgVEVTVF9ERVNUUk9ZX01BSU4KLSBTdGF0ZT1TVEFURV9ERVNUUk9ZOwotIERlc3Ryb3lXaW5kb3coaE1haW5XbmQpOwotIFN0YXRlPVNUQVRFX0RJUkVDVDsKLSB3aGlsZSAoR2V0TWVzc2FnZSgmbXNnLDAsMCwwKSkgewotICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOwotICBTdGF0ZT1TVEFURV9ESVNQQVRDSDsKLSAgRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotICBTdGF0ZT1TVEFURV9ESVJFQ1Q7Ci0gfQotIFN0YXRlPVNUQVRFX0NSRUFURTsKLSBoTWFpblduZCA9IENyZWF0ZVdpbmRvd0V4KE1BSU5fRVhTVFlMRSx3Y2xhc3NuYW1lLHdpbm5hbWUsTUFJTl9TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENXX1VTRURFRkFVTFQsMCw0MDAsMzAwLDAsMCxoSW5zdCwwKTsKLSBpZiAoIWhNYWluV25kKSByZXR1cm4gMDsKLSBTdGF0ZT1TVEFURV9TSE9XOwotIFNob3dXaW5kb3coaE1haW5XbmQsbkNtZFNob3cpOwotI2VuZGlmCi0vKiB1cGRhdGUsIHNvIG5vIFdNX1BBSU5UcyBhcmUgcGVuZGluZyAqLwotIFN0YXRlPVNUQVRFX1VQREFURTsKLS8vIFVwZGF0ZVdpbmRvdyhoTWFpblduZCk7Ci0gUmVhZHk9VFJVRTsKLS8qIGZpbGwgY2xpZW50IGFyZWEgd2l0aCBhIHBhdHRlcm4gKi8KLSBGaWxsUGF0dGVybihoTWFpblduZCwwKTsKLS8qIGNyZWF0ZSBzdWJ3aW5kb3cgKi8KLSBTdGF0ZT1TVEFURV9DUkVBVEU7Ci0gR2V0Q2xpZW50UmVjdChoTWFpblduZCwmcmVjdCk7Ci0gaFN1YlduZCA9IENyZWF0ZVdpbmRvdyh3Y2NsYXNzbmFtZSx3aW5uYW1lLFdTX0NISUxEfFdTX0JPUkRFUnxXU19DTElQU0lCTElOR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLHJlY3QuYm90dG9tLzIscmVjdC5yaWdodCxyZWN0LmJvdHRvbS0ocmVjdC5ib3R0b20vMiksaE1haW5XbmQsMCxoSW5zdCwwKTsKLSBpZiAoIWhTdWJXbmQpIHJldHVybiAwOwotLyogY3JlYXRlIGJ1dHRvbnMgKi8KLSBoQnV0dG9uWzBdID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCIxIixXU19DSElMRHxXU19DTElQU0lCTElOR1N8V1NfVklTSUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsOCw0OCwyMCxoTWFpblduZCwwLGhJbnN0LDApOwotIGhCdXR0b25bMV0gPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsIjIiLFdTX0NISUxEfFdTX0NMSVBTSUJMSU5HU3xXU19WSVNJQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsMTIsNDgsMjAsaE1haW5XbmQsMCxoSW5zdCwwKTsKLSBoQnV0dG9uWzJdID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCIzIixXU19DSElMRHxXU19DTElQU0lCTElOR1N8V1NfVklTSUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2LDE2LDQ4LDIwLGhNYWluV25kLDAsaEluc3QsMCk7Ci0vKiBzdWJjbGFzcyB0aGVtICovCi0gd25kQnV0dG9uWzBdID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhoQnV0dG9uWzBdLEdXTF9XTkRQUk9DLChMT05HKVN1YkNsYXNzV2luZG93UHJvYyk7Ci0gd25kQnV0dG9uWzFdID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhoQnV0dG9uWzFdLEdXTF9XTkRQUk9DLChMT05HKVN1YkNsYXNzV2luZG93UHJvYyk7Ci0gd25kQnV0dG9uWzJdID0gKFdORFBST0MpU2V0V2luZG93TG9uZyhoQnV0dG9uWzJdLEdXTF9XTkRQUk9DLChMT05HKVN1YkNsYXNzV2luZG93UHJvYyk7Ci0vKiBzaG93IHRoZW0gKi8KLSBTdGF0ZT1TVEFURV9VUERBVEU7Ci0gVXBkYXRlV2luZG93KGhCdXR0b25bMF0pOwotIExvZ0NoaWxkT3JkZXIoaE1haW5XbmQpOwotIExvZ2YoImJ1dDEgdmlzaWJsZT0lZCIsSXNXaW5kb3dWaXNpYmxlKGhCdXR0b25bMF0pKTsKLQotLyogbm93IHJlcGFyZW50IHRoZSBidXR0b24gdG8gb3VyIChpbnZpc2libGUpIHN1YndpbmRvdyAqLwotIFN0YXRlPVNUQVRFX1RFU1Q7Ci0gLyogaW4gZGlmZmVyZW50IG9yZGVyLCBzZWVpbmcgd2hvIGdldHMgdG9wbW9zdCAqLwotIFNldFBhcmVudChoQnV0dG9uWzBdLGhTdWJXbmQpOwotIFNldFBhcmVudChoQnV0dG9uWzJdLGhTdWJXbmQpOwotIFNldFBhcmVudChoQnV0dG9uWzFdLGhTdWJXbmQpOwotIExvZ0NoaWxkT3JkZXIoaFN1YlduZCk7Ci0vKiB0aGUgYnV0dG9uIHNob3VsZCBub3cgYmUgaW52aXNpYmxlICovCi0gTG9nZigiYnV0MSB2aXNpYmxlPSVkIixJc1dpbmRvd1Zpc2libGUoaEJ1dHRvblswXSkpOwotLyogc2VlIGlmIHdlIGNhbiBkcmF3IG9uIHRoZW0gKi8KLSBGaWxsUGF0dGVybihoQnV0dG9uWzBdLDApOwotCi0jaWZkZWYgU0hPV19TVUIKLSBTdGF0ZT1TVEFURV9TSE9XOwotIFNob3dXaW5kb3coaFN1YlduZCxTV19TSE9XTk9STUFMKTsKLSBTdGF0ZT1TVEFURV9VUERBVEU7Ci0gVXBkYXRlV2luZG93KGhTdWJXbmQpOwotIEZpbGxQYXR0ZXJuKGhTdWJXbmQsMCk7Ci0vLyBJbnZhbGlkYXRlUmVjdChoTWFpblduZCxOVUxMLFRSVUUpOwotIExvZ2YoImJ1dDEgdmlzaWJsZT0lZCIsSXNXaW5kb3dWaXNpYmxlKGhCdXR0b25bMF0pKTsKLSNlbmRpZgotCi0jaWZkZWYgVEVTVF9ESUFMT0cKLSBTdGF0ZT1TVEFURV9ESUFMT0c7Ci0gRGlhbG9nQm94KGhJbnN0LE1BS0VJTlRSRVNPVVJDRSgxKSxoTWFpblduZCwoRkFSUFJPQylUZXN0RGlhbG9nUHJvYyk7Ci0jZW5kaWYKLSNpZmRlZiBURVNUX0NPTU1DVEwKLSB7Ci0gIERXT1JEIGFyclsxNl07Ci0gIENIT09TRUNPTE9SIGNjPXtzaXplb2YoY2MpLDAsaEluc3QsMCxhcnIsMH07Ci0gIENob29zZUNvbG9yKCZjYyk7Ci0gfQotI2VuZGlmCi0KLSBTdGF0ZT1TVEFURV9ESVJFQ1Q7Ci0gd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywwLDAsMCkpIHsKLSAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLSAgU3RhdGU9U1RBVEVfRElTUEFUQ0g7Ci0gIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLSAgU3RhdGU9U1RBVEVfRElSRUNUOwotIH0KLSByZXR1cm4gMDsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJ0ZXN0L2d1aXRlc3QucmMgYi9saWJ0ZXN0L2d1aXRlc3QucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjg0ZmQuLjAwMDAwMDAKLS0tIGEvbGlidGVzdC9ndWl0ZXN0LnJjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEdVSVRFU1QuUkMKLSAqCi0gKiBwcm9kdWNlZCBieSBCb3JsYW5kIFJlc291cmNlIFdvcmtzaG9wCi0gKgotICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJndWl0ZXN0LnJoIgotCi0xIElDT04gCi17Ci0nMDAgMDAgMDEgMDAgMDEgMDAgMjAgMjAgMTAgMDAgMDAgMDAgMDAgMDAgRTggMDInCi0nMDAgMDAgMTYgMDAgMDAgMDAgMjggMDAgMDAgMDAgMjAgMDAgMDAgMDAgNDAgMDAnCi0nMDAgMDAgMDEgMDAgMDQgMDAgMDAgMDAgMDAgMDAgODAgMDIgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgODAgMDAgMDAgODAgMDAgMDAgMDAgODAgODAgMDAgODAgMDAnCi0nMDAgMDAgODAgMDAgODAgMDAgODAgODAgMDAgMDAgQzAgQzAgQzAgMDAgODAgODAnCi0nODAgMDAgMDAgMDAgRkYgMDAgMDAgRkYgMDAgMDAgMDAgRkYgRkYgMDAgRkYgMDAnCi0nMDAgMDAgRkYgMDAgRkYgMDAgRkYgRkYgMDAgMDAgRkYgRkYgRkYgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMEEnCi0nQTAgMDAgMDAgMDAgMDAgMDAgQUEgQTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nQTAgMEEgQUEgQTAgMDAgQUEgMDAgMEEgMDAgMDAgMDAgQTAgQTAgMDAgMDAgMDAnCi0nQTAgMEEgMDAgMDAgMEEgQTAgMDAgMEEgMDAgMDAgMDAgQTAgMDAgMDAgMDAgMDAnCi0nQTAgMEEgMDAgMDAgQUEgMDAgMDAgMEEgMDAgMDAgMEEgQTAgMEEgMDAgMDAgMDAnCi0nQTAgMEEgMDAgMDAgMDAgMDAgMDAgQTAgMDAgMDAgMEEgMDAgMEEgMDAgMjIgMjInCi0nQTIgMkEgMjIgMjIgMjIgMkEgQUEgMjIgMjIgMjIgMkEgMjIgMkEgMjIgMjIgMjInCi0nQUEgMkEgQUEgQTIgMjIgQTIgMjIgMjIgMjIgMjIgMkEgMjIgMkEgMjIgMDAgMDAnCi0nMEEgMEEgMDAgMDAgMDAgQTAgMDAgMDAgMDAgMDAgMEEgMDAgMEEgMDAgMDAgMDAnCi0nMEEgMEEgMDAgMDAgMDAgQTAgMDAgMDAgMDAgMDAgMEEgMDAgMEEgMDAgMDAgMDAnCi0nMEEgMDAgQTAgMDAgMDAgQUEgMDAgMDAgMDAgMDAgMEEgMDAgMEEgMDAgMDAgMDAnCi0nMEEgMDAgQUEgQTAgMDAgMEEgQUEgQTAgMEEgQUEgQUEgQUEgMDAgMDAgMEEgQUEnCi0nQUEgQUEgQTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMEEgQTAgMDAgMEEgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgNzcgNzAgNzAgMDAgNzcgNzcgMDAgMDcgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDcgMDAgMDcgMDcgMDcgMDAgMDAgNzAgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgNzAgNzcgNzAgMDcgNzAgNzcgNzcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgNzAgNzAgMDcgMDcgNzAgNzAgMDcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgNzAgNzAgNzcgMDcgNzAgNzAgMDcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgNzAgNzcgMDAgMDcgNzAgNzAgMDcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgNzAgNzAgNzcgNzAgNzAgNzAgMDcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgNzAgNzAgMDAgNzAgNzAgNzAgMDcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgNzAgNzcgNzcgMDcgNzAgNzAgMDcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDcgMDAgMDAgNzAgNzAgNzAgMDcgMDcgNzAgNzAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgNzcgNzcgMDAgMDcgMDAgMDAgNzAgMDcgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAnCi0nMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgRkYgRkYnCi0nRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYnCi0nRkYgRkYgRTcgRkYgMUYgRkYgRjYgMUMgRUYgRDcgRjYgRjkgRUYgREYgRjYgRjMnCi0nRUYgOUIgRjYgRkYgREYgQkIgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgRkEgRkQnCi0nRkYgQkIgRkEgRkQgRkYgQkIgRkIgN0MgRkYgQkIgRkIgMUUgMTggMEYgODAgN0YnCi0nRkYgRTcgQkYgRkYgRkYgRkYgRkYgMTcgMEUgRkYgRkUgMDIgMDQgN0YgRkMgMDAnCi0nMDAgN0YgRkMgNjAgNjAgN0YgRkMgNDAgNjAgN0YgRkMgMDAgNjAgN0YgRkMgNDQnCi0nNjAgN0YgRkMgNzQgNjAgN0YgRkMgMDAgNjAgN0YgRkUgMDQgNjAgN0YgRkYgMEUnCi0nRjYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYgRkYnCi19Ci0KLQotMSBESUFMT0cgNiwgMTUsIDE5NiwgMTE5Ci1TVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKLUNBUFRJT04gIlRlc3QgRGlhbG9nIgotRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKLXsKLSBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDEyLCA5NiwgNTAsIDE0Ci0gUFVTSEJVVFRPTiAiQ2FuY2VsIiwgSURDQU5DRUwsIDcyLCA5NiwgNTAsIDE0Ci0gUFVTSEJVVFRPTiAiSGVscCIsIElESEVMUCwgMTMyLCA5NiwgNTAsIDE0Ci0gR1JPVVBCT1ggIkdyb3VwIiwgSURDX0dST1VQQk9YMSwgNCwgNCwgMTg4LCA4NCwgQlNfR1JPVVBCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLX0KLQotMiBESUFMT0cgNiwgMTUsIDE4MCwgNzIKLVNUWUxFIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0JPUkRFUgotRk9OVCA4LCAiTVMgU2FucyBTZXJpZiIKLXsKLSBBVVRPQ0hFQ0tCT1ggIkNoZWNrYm94IDEiLCBJRENfQ0hFQ0tCT1gxLCA4LCA4LCA4MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIEFVVE9DSEVDS0JPWCAiQ2hlY2tib3ggMiIsIElEQ19DSEVDS0JPWDIsIDgsIDI4LCA4MCwgMTIKLSBBVVRPQ0hFQ0tCT1ggIkNoZWNrYm94IDMiLCBJRENfQ0hFQ0tCT1gzLCA4LCA0OCwgNjAsIDEyCi19CmRpZmYgLS1naXQgYS9saWJ0ZXN0L2d1aXRlc3QucmggYi9saWJ0ZXN0L2d1aXRlc3QucmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODM1MTkuLjAwMDAwMDAKLS0tIGEvbGlidGVzdC9ndWl0ZXN0LnJoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGd1aXRlc3QucmgKLSAqCi0gKiBwcm9kdWNlZCBieSBCb3JsYW5kIFJlc291cmNlIFdvcmtzaG9wCi0gKgotICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSURDX0NIRUNLQk9YMQkxMDQKLSNkZWZpbmUgSURDX0NIRUNLQk9YMgkxMDUKLSNkZWZpbmUgSURDX0NIRUNLQk9YMwkxMDYKLSNkZWZpbmUgRElBTE9HXzIJMgotI2RlZmluZSBJRENfR1JPVVBCT1gxCTEwCi0jZGVmaW5lIERJQUxPR18xCTEKLSNkZWZpbmUgSUNPTl8xCTEKZGlmZiAtLWdpdCBhL2xpYnRlc3QvaGVsbG8uYyBiL2xpYnRlc3QvaGVsbG8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4ZGQzZi4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0L2hlbGxvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk0IE1pZ3VlbCBkZSBJY2F6YQotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLWNoYXIgc3pBcHBOYW1lW10gPSAiSGVsbG8iOwotCi1sb25nIEZBUiBQQVNDQUwgV25kUHJvYyhIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSk7Ci0KLWludCBQQVNDQUwgV2luTWFpbiAoSElOU1RBTkNFIGhJbnN0YW5jZSwgSElOU1RBTkNFIGhQcmV2SW5zdCwgTFBTVFIgbHBzekNtZExpbmUsCi0JCQkgaW50IG5DbWRTaG93KQotewotCUhXTkQgaHduZDsKLQlNU0cgbXNnOwotCVdORENMQVNTIHduZGNsYXNzOwotCi0JaWYoIWhQcmV2SW5zdCkgewotCi0JCXduZGNsYXNzLnN0eWxlID0gIENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotCQl3bmRjbGFzcy5scGZuV25kUHJvYyA9IFduZFByb2M7Ci0JCXduZGNsYXNzLmNiQ2xzRXh0cmEgPSAwOwotCQl3bmRjbGFzcy5jYlduZEV4dHJhID0gMDsKLQkJd25kY2xhc3MuaEluc3RhbmNlID0gaEluc3RhbmNlOwotCQl3bmRjbGFzcy5oSWNvbiA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7Ci0JCXduZGNsYXNzLmhDdXJzb3IgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7Ci0JCXduZGNsYXNzLmhickJhY2tncm91bmQgPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7Ci0JCXduZGNsYXNzLmxwc3pNZW51TmFtZSA9IE5VTEw7Ci0JCXduZGNsYXNzLmxwc3pDbGFzc05hbWUgPSBzekFwcE5hbWU7Ci0KLQkJUmVnaXN0ZXJDbGFzcygmd25kY2xhc3MpOwotCi0JCQkJCQotCX0KLQotCWh3bmQgPSBDcmVhdGVXaW5kb3coc3pBcHBOYW1lLCBzekFwcE5hbWUsCi0JIFdTX0hTQ1JPTEwgfCBXU19WU0NST0xMIHwgV1NfT1ZFUkxBUFBFRFdJTkRPVywKLQkgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgNjAwLAotCSA0MDAsIE5VTEwsIE5VTEwsIGhJbnN0YW5jZSwgTlVMTCk7Ci0KLQlTaG93V2luZG93KGh3bmQsIG5DbWRTaG93KTsKLQlVcGRhdGVXaW5kb3coaHduZCk7Ci0JCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQkJCQotCXdoaWxlKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpIHsKLQkJVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLQkJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotCX0JCQkJCQotCXJldHVybiBtc2cud1BhcmFtOwotfQkJCQkJCi0KLQotCi1sb25nIEZBUiBQQVNDQUwgV25kUHJvYyhIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwKLQkJCQlMUEFSQU0gbFBhcmFtKQotewotCUhEQyBoZGM7Ci0JUkVDVCByZWN0OwotCVNJWkUgc2l6ZTsKLQlQQUlOVFNUUlVDVCBwczsKLQotCXN3aXRjaChtZXNzYWdlKSB7Ci0JCQkKLQljYXNlIFdNX1BBSU5UOgotCSAgICAJaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOwotCQlHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKLQkJSW5mbGF0ZVJlY3QoJnJlY3QsIC0xMCwgLTEwKTsKLQkJaWYoICFJc1JlY3RFbXB0eSggJnJlY3QgKSApCi0JCXsKLSAgICAgICAgICAgICAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MzIoaGRjLCBzekFwcE5hbWUsIHN0cmxlbihzekFwcE5hbWUpLCAmc2l6ZSk7Ci0JCSAgICBTZWxlY3RPYmplY3QoaGRjLCBHZXRTdG9ja09iamVjdChMVEdSQVlfQlJVU0gpKTsKLQkJICAgIFJlY3RhbmdsZShoZGMsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKLQkJICAgIHJlY3QubGVmdCA9IChyZWN0LnJpZ2h0ICsgcmVjdC5sZWZ0IC0gc2l6ZS5jeCkgLyAyOwotCQkgICAgcmVjdC50b3AgID0gKHJlY3QuYm90dG9tICsgcmVjdC50b3AgLSBzaXplLmN5KSAvIDI7Ci0JCSAgICBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7Ci0JCSAgICBUZXh0T3V0KGhkYywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgc3pBcHBOYW1lLCBzdHJsZW4oc3pBcHBOYW1lKSApOwotCQl9Ci0JCUVuZFBhaW50KGh3bmQsICZwcyk7Ci0JCXJldHVybiAwOwotCQkJCQkJCQotCWNhc2UgV01fREVTVFJPWToKLQkJUG9zdFF1aXRNZXNzYWdlKDApOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotfQkJCQkJCQkJCQkJCQotCmRpZmYgLS1naXQgYS9saWJ0ZXN0L2hlbGxvMi5jIGIvbGlidGVzdC9oZWxsbzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiNDQzNy4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0L2hlbGxvMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAxOTk0IE1pZ3VlbCBkZSBJY2F6YQotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0KLWludCBQQVNDQUwgV2luTWFpbiAoSElOU1RBTkNFIGluc3QsIEhJTlNUQU5DRSBwcmV2LCBMUFNUUiBjbWRsaW5lLCBpbnQgc2hvdykKLXsKLSAgcmV0dXJuIE1lc3NhZ2VCb3goKEhXTkQpMCwKLQkJICAgIChMUFNUUikiSGVsbG8sIGhlbGxvISIsCi0JCSAgICAoTFBTVFIpIkhlbGxvIFdpbmUgQXBwbGljYXRpb24iLAotCQkgICAgKE1CX09LIHwgTUJfSUNPTkVYQ0xBTUFUSU9OKSk7Ci19CmRpZmYgLS1naXQgYS9saWJ0ZXN0L2hlbGxvMy5jIGIvbGlidGVzdC9oZWxsbzMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxYzI1Yy4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0L2hlbGxvMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcwotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8Y29tbWRsZy5oPgotCi10eXBlZGVmIHN0cnVjdAotewotICBIQU5ETEUgIGhJbnN0YW5jZTsKLSAgSFdORCAgICBoTWFpblduZDsKLSAgSE1FTlUgICBoTWFpbk1lbnU7Ci19IEdMT0JBTFM7Ci0KLUdMT0JBTFMgR2xvYmFsczsKLQotQk9PTCBGaWxlT3BlbihIV05EIGhXbmQpCi17Ci0gIGNoYXIgZmlsZW5hbWVbODBdID0gInRlc3QuYyI7Ci0gIE9QRU5GSUxFTkFNRSBvZm4gPSB7IHNpemVvZihPUEVORklMRU5BTUUpLAotCQkgICAgICAgaFduZCwgTlVMTCwgIkMgY29kZVwwKi5jXDAiLCBOVUxMLCAwLCAwLCBmaWxlbmFtZSwgODAsCi0JCSAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMLCBPRk5fQ1JFQVRFUFJPTVBUIHwKLQkJICAgICAgIE9GTl9TSE9XSEVMUCwgMCwgMCwgTlVMTCwgMCwgTlVMTCB9OwotICByZXR1cm4gR2V0T3BlbkZpbGVOYW1lKCZvZm4pOwotfQotCi1MUkVTVUxUIENBTExCQUNLIERsZ1Byb2MoSFdORCBoV25kLFVJTlQgbXNnLFdQQVJBTSB3UGFyYW0sTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBzd2l0Y2gobXNnKQotICAgIHsKLQljYXNlIFdNX0lOSVRESUFMT0c6Ci0JICAgIGJyZWFrOwotCWNhc2UgV01fQ09NTUFORDoKLQkgICAgc3dpdGNoICh3UGFyYW0pCi0JICAgIHsKLQkJY2FzZSAxMDA6Ci0JCSAgICBFbmREaWFsb2coaFduZCwgMTAwKTsKLQkJICAgIHJldHVybiBUUlVFOwotCSAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jIChIV05EIHduZCwgVUlOVCBtc2csIFdQQVJBTSB3LCBMUEFSQU0gbCkKLXsKLSAgICBzd2l0Y2ggKG1zZyl7Ci0KLQljYXNlIFdNX0NPTU1BTkQ6Ci0Jc3dpdGNoKHcpewotCQljYXNlIDEwMDoKLQkJCURpYWxvZ0JveChHbG9iYWxzLmhJbnN0YW5jZSwKLQkJCQkiRElBREVNTyIsIHduZCwKLQkJCQkoRExHUFJPQylEbGdQcm9jKTsKLQkJCXJldHVybiAwOwotCQljYXNlIDEwMToKLQkJewotCQkJSERDIGhkYywgaE1lbURDOwotCQkJSEJJVE1BUCBoQml0bWFwLCBoUHJldkJpdG1hcDsKLQkJCUJJVE1BUCBibXA7Ci0KLQkJCWhCaXRtYXAgPSBMb2FkQml0bWFwQSAoR2xvYmFscy5oSW5zdGFuY2UsICJCSVRERU1PIik7Ci0JCQloZGMgPSBHZXREQyAod25kKTsKLQkJCWhNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyAoaGRjKTsKLQkJCWhQcmV2Qml0bWFwID0gU2VsZWN0T2JqZWN0IChoTWVtREMsIGhCaXRtYXApOwotCQkJR2V0T2JqZWN0QSAoaEJpdG1hcCwgc2l6ZW9mKEJJVE1BUCksICZibXApOwotCQkJQml0Qmx0IChoZGMsIDAsIDAsIGJtcC5ibVdpZHRoLCBibXAuYm1IZWlnaHQsCi0JCQkJaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKLQkJCVNlbGVjdE9iamVjdCAoaE1lbURDLCBoUHJldkJpdG1hcCk7Ci0JCQlEZWxldGVEQyAoaE1lbURDKTsKLQkJCVJlbGVhc2VEQyAod25kLCBoZGMpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkgICAgICAgIGNhc2UgMTAyOgotCQkgICAgICAgIEZpbGVPcGVuKHduZCk7Ci0JCQlyZXR1cm4gMDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBEZWZXaW5kb3dQcm9jICh3bmQsIG1zZywgdywgbCk7Ci0JfQotICAgIGNhc2UgV01fREVTVFJPWToKLQlQb3N0UXVpdE1lc3NhZ2UgKDApOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlyZXR1cm4gRGVmV2luZG93UHJvYyAod25kLCBtc2csIHcsIGwpOwotICAgIH0KLSAgICByZXR1cm4gMGw7Ci19Ci0KLWludCBQQVNDQUwgV2luTWFpbiAoSElOU1RBTkNFIGluc3QsIEhJTlNUQU5DRSBwcmV2LCBMUFNUUiBjbWRsaW5lLCBpbnQgc2hvdykKLXsKLSAgICBNU0cgICAgICBtc2c7Ci0gICAgV05EQ0xBU1MgY2xhc3M7Ci0gICAgY2hhciBjbGFzc05hbWVbXSA9ICJjbGFzcyI7ICAvKiBUbyBtYWtlIHN1cmUgY2xhc3NOYW1lID49IDB4MTAwMDAgKi8KLSAgICBjaGFyIHdpbk5hbWVbXSA9ICJUZXN0IGFwcCI7Ci0KLSAgICBHbG9iYWxzLmhJbnN0YW5jZSA9IGluc3Q7Ci0gICAgaWYgKCFwcmV2KXsKLQljbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotCWNsYXNzLmxwZm5XbmRQcm9jID0gV25kUHJvYzsKLQljbGFzcy5jYkNsc0V4dHJhID0gMDsKLQljbGFzcy5jYlduZEV4dHJhID0gMDsKLQljbGFzcy5oSW5zdGFuY2UgID0gaW5zdDsKLQljbGFzcy5oSWNvbiAgICAgID0gTG9hZEljb24gKDAsIElESV9BUFBMSUNBVElPTik7Ci0JY2xhc3MuaEN1cnNvciAgICA9IExvYWRDdXJzb3IgKDAsIElEQ19BUlJPVyk7Ci0JY2xhc3MuaGJyQmFja2dyb3VuZCA9IEdldFN0b2NrT2JqZWN0IChXSElURV9CUlVTSCk7Ci0JY2xhc3MubHBzek1lbnVOYW1lID0gMDsKLQljbGFzcy5scHN6Q2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLSAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZjbGFzcykpCi0JcmV0dXJuIEZBTFNFOwotCi0gICAgR2xvYmFscy5oTWFpblduZCA9IENyZWF0ZVdpbmRvdyAoY2xhc3NOYW1lLCB3aW5OYW1lLCBXU19PVkVSTEFQUEVEV0lORE9XLAotCQkJQ1dfVVNFREVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgMCwgCi0JCQlMb2FkTWVudShpbnN0LCJNQUlOIiksIGluc3QsIDApOwotICAgIFNob3dXaW5kb3cgKEdsb2JhbHMuaE1haW5XbmQsIHNob3cpOwotICAgIFVwZGF0ZVdpbmRvdyAoR2xvYmFscy5oTWFpblduZCk7Ci0KLSAgICB3aGlsZSAoR2V0TWVzc2FnZSAoJm1zZywgMCwgMCwgMCkpewotCVRyYW5zbGF0ZU1lc3NhZ2UgKCZtc2cpOwotCURpc3BhdGNoTWVzc2FnZSAoJm1zZyk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlidGVzdC9oZWxsbzNyZXMucmMgYi9saWJ0ZXN0L2hlbGxvM3Jlcy5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3OGJjYi4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0L2hlbGxvM3Jlcy5yYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcwotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLU1BSU4gTUVOVSAKLXsKLSBQT1BVUCAiTWVudSBkZW1vIiB7Ci0gICBNRU5VSVRFTSAiRGlhbG9nIERlbW8iLCAxMDAKLSAgIE1FTlVJVEVNICJCaXRtYXAgRGVtbyIsIDEwMQotICAgTUVOVUlURU0gIk9wZW4uLi4iLCAxMDIKLSB9Ci19Ci0KLS8qQklUREVNTyBCSVRNQVAgIi4uL3JjL3dpbmVsb2dvLmJtcCIqLwotCi1ESUFERU1PIERJQUxPRyAyMCwgMjAsIDE3OSwgMTE4Ci1TVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX1NZU01FTlUKLUNBUFRJT04gIkRpYWxvZyBkZW1vIgotRk9OVCA4LCAiSGVsdiIKLUJFR0lOCi0JQ09OVFJPTCAiUHVzaGJ1dHRvbiIsIDEwMCwgIkJVVFRPTiIsIEJTX1BVU0hCVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCAxNCwgOTIsIDUyLCAxMwotCUNPTlRST0wgIkNoZWNrYm94IiwgMTAxLCAiQlVUVE9OIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCwgMTksIDc2LCA0NywgMTIKLQlDT05UUk9MICJTdGF0aWMgdGV4dCIsIDEwMiwgIlNUQVRJQyIsIFNTX0xFRlQgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUsIDE3LCA2MCwgMzksIDEwCi0JQ09OVFJPTCAiRWRpdCBjb250cm9sIiwgMTAzLCAiRURJVCIsIEVTX0xFRlQgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QLCAxOCwgNDEsIDQ0LCAxMwotCUNPTlRST0wgIlJhZGlvIGJ1dHRvbiIsIDEwNCwgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMTcsIDIzLCA1OCwgMTIKLQlDT05UUk9MICIiLCAxMDUsICJDT01CT0JPWCIsIENCU19EUk9QRE9XTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AsIDg2LCAxMywgODYsIDg1Ci0JQ09OVFJPTCAiIiwgMTA2LCAiTElTVEJPWCIsIExCU19TVEFOREFSRCB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCA4NiwgMzMsIDg2LCA4NQotRU5ECmRpZmYgLS1naXQgYS9saWJ0ZXN0L2hlbGxvNC5jIGIvbGlidGVzdC9oZWxsbzQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1ZTQxNy4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0L2hlbGxvNC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5NiBKaW0gUGV0ZXJzb24KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0vKiBXaW4zMiBjb3VudGVycGFydCBmb3IgQ2FsY0NoaWxkU2Nyb2xsMTYgaXMgbm90IGltcGxlbWVudGVkICovCi0vKiBldmVuIGluIE1TIFZpc3VhbCBDKysgKi8KLSNpbmNsdWRlICJ3aW5kZWYuaCIKLSNpbmNsdWRlICJ3aW5nZGkuaCIKLS8qI2luY2x1ZGUgPHdpbmUvd2ludXNlcjE2Lmg+Ki8KLQotdm9pZCBXcml0ZSAoSERDIGRjLCBpbnQgeCwgaW50IHksIGNoYXIgKnMpCi17Ci0gICAgU2V0QmtNb2RlKGRjLCBUUkFOU1BBUkVOVCk7Ci0gICAgVGV4dE91dCAoZGMsIHgsIHksIHMsIHN0cmxlbiAocykpOwotfQotCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MgKEhXTkQgd25kLCBVSU5UIG1zZywgV1BBUkFNIHcsIExQQVJBTSBsKQotewotICAgIHN0YXRpYyBzaG9ydCB4Q2hhciwgeUNoYXI7Ci0gICAgc3RhdGljIFJFQ1QgIHJlY3RIb2xhOwotICAgIHN0YXRpYyBjaGFyKiBzdHJIb2xhID0gIkhvbGEiOwotICAgIEhEQyBkYzsKLSAgICBQQUlOVFNUUlVDVCBwczsKLSAgICBURVhUTUVUUklDIHRtOwotCi0gICAgc3dpdGNoIChtc2cpewotICAgIGNhc2UgV01fQ1JFQVRFOgotCWRjID0gR2V0REMgKHduZCk7Ci0JR2V0VGV4dE1ldHJpY3MgKGRjLCAmdG0pOwotCXhDaGFyID0gdG0udG1BdmVDaGFyV2lkdGg7Ci0JeUNoYXIgPSB0bS50bUhlaWdodDsKLQlHZXRUZXh0RXh0ZW50UG9pbnQzMiggZGMsIHN0ckhvbGEsIHN0cmxlbihzdHJIb2xhKSwgKChMUFNJWkUpJnJlY3RIb2xhKSArIDEgKTsKLQlPZmZzZXRSZWN0KCAmcmVjdEhvbGEsIHhDaGFyLCB5Q2hhciApOwotCVJlbGVhc2VEQyAod25kLCBkYyk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFdNX0hTQ1JPTEw6Ci0gICAgY2FzZSBXTV9WU0NST0xMOgotCUludmFsaWRhdGVSZWN0KHduZCwgJnJlY3RIb2xhLCBUUlVFICk7Ci0gICAgICAgIFNjcm9sbENoaWxkcmVuKHduZCwgbXNnLCB3LCBsKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIFdNX1BBSU5UOgotCWRjID0gQmVnaW5QYWludCAod25kLCAmcHMpOwotCVdyaXRlIChkYywgeENoYXIsIHlDaGFyLCBzdHJIb2xhKTsKLQlFbmRQYWludCAod25kLCAmcHMpOwotCWJyZWFrOwotCi0gICAgY2FzZSBXTV9ERVNUUk9ZOgotCVBvc3RRdWl0TWVzc2FnZSAoMCk7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCXJldHVybiBEZWZXaW5kb3dQcm9jICh3bmQsIG1zZywgdywgbCk7Ci0gICAgfQotICAgIHJldHVybiAwbDsKLX0KLQotTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jMiAoSFdORCB3bmQsIFVJTlQgbXNnLCBXUEFSQU0gdywgTFBBUkFNIGwpCi17Ci0gICAgc3RhdGljIHNob3J0IHhDaGFyLCB5Q2hhcjsKLSAgICBzdGF0aWMgUkVDVCAgcmVjdEluZm87Ci0gICAgY2hhciBidWZbMTI4XTsKLSAgICBIREMgZGM7Ci0gICAgUEFJTlRTVFJVQ1QgcHM7Ci0gICAgVEVYVE1FVFJJQyB0bTsKLQotICAgIHN3aXRjaCAobXNnKXsKLSAgICBjYXNlIFdNX0NSRUFURToKLQlkYyA9IEdldERDICh3bmQpOwotCUdldFRleHRNZXRyaWNzIChkYywgJnRtKTsKLQl4Q2hhciA9IHRtLnRtQXZlQ2hhcldpZHRoOwotCXlDaGFyID0gdG0udG1IZWlnaHQ7Ci0JUmVsZWFzZURDICh3bmQsIGRjKTsKLQlicmVhazsKLQotICAgIGNhc2UgV01fUEFJTlQ6Ci0JZGMgPSBCZWdpblBhaW50ICh3bmQsICZwcyk7Ci0gICAgICAgIHNwcmludGYoYnVmLCJwcy5yY1BhaW50ID0ge2xlZnQgPSAlZCwgdG9wID0gJWQsIHJpZ2h0ID0gJWQsIGJvdHRvbSA9ICVkfSIsCi0gICAgICAgICAgICAgICAgcHMucmNQYWludC5sZWZ0LHBzLnJjUGFpbnQudG9wLHBzLnJjUGFpbnQucmlnaHQscHMucmNQYWludC5ib3R0b20pOwotCXJlY3RJbmZvLmxlZnQgPSByZWN0SW5mby50b3AgPSAwOwotCUdldFRleHRFeHRlbnRQb2ludDMyIChkYywgYnVmLCBzdHJsZW4oYnVmKSwgKChMUFNJWkUpJnJlY3RJbmZvKSArIDEgKTsKLQlPZmZzZXRSZWN0ICgmcmVjdEluZm8sIHhDaGFyLCB5Q2hhciApOwotCVdyaXRlIChkYywgeENoYXIsIHlDaGFyLCBidWYpOwotCUVuZFBhaW50ICh3bmQsICZwcyk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFdNX01PVkU6Ci0gICAgY2FzZSBXTV9TSVpFOgotCUludmFsaWRhdGVSZWN0KCB3bmQsICZyZWN0SW5mbywgVFJVRSApOwotCS8qQ2FsY0NoaWxkU2Nyb2xsMTYoIChVSU5UMTYpR2V0UGFyZW50KHduZCksIFNCX0JPVEggKTsqLwotCWJyZWFrOwotCi0gICAgY2FzZSBXTV9ERVNUUk9ZOgotCVBvc3RRdWl0TWVzc2FnZSAoMCk7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCXJldHVybiBEZWZXaW5kb3dQcm9jICh3bmQsIG1zZywgdywgbCk7Ci0gICAgfQotICAgIHJldHVybiAwbDsKLX0KLQotaW50IFBBU0NBTCBXaW5NYWluIChISU5TVEFOQ0UgaW5zdCwgSElOU1RBTkNFIHByZXYsIExQU1RSIGNtZGxpbmUsIGludCBzaG93KQotewotICAgIEhXTkQgICAgIHduZCx3bmQyOwotICAgIE1TRyAgICAgIG1zZzsKLSAgICBXTkRDTEFTUyBjbGFzczsKLSAgICBjaGFyIGNsYXNzTmFtZVtdID0gImNsYXNzIjsgIC8qIFRvIG1ha2Ugc3VyZSBjbGFzc05hbWUgPj0gMHgxMDAwMCAqLwotICAgIGNoYXIgY2xhc3MyTmFtZVtdID0gImNsYXNzMiI7Ci0gICAgY2hhciB3aW5OYW1lW10gPSAiVGVzdCBhcHAiOwotCi0gICAgaWYgKCFwcmV2KXsKLQljbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotCWNsYXNzLmxwZm5XbmRQcm9jID0gV25kUHJvYzsKLQljbGFzcy5jYkNsc0V4dHJhID0gMDsKLQljbGFzcy5jYlduZEV4dHJhID0gMDsKLQljbGFzcy5oSW5zdGFuY2UgID0gaW5zdDsKLQljbGFzcy5oSWNvbiAgICAgID0gTG9hZEljb24gKDAsIElESV9BUFBMSUNBVElPTik7Ci0JY2xhc3MuaEN1cnNvciAgICA9IExvYWRDdXJzb3IgKDAsIElEQ19BUlJPVyk7Ci0JY2xhc3MuaGJyQmFja2dyb3VuZCA9IEdldFN0b2NrT2JqZWN0IChXSElURV9CUlVTSCk7Ci0JY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKLQljbGFzcy5scHN6Q2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZjbGFzcykpCi0JICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB3bmQgPSBDcmVhdGVXaW5kb3cgKGNsYXNzTmFtZSwgd2luTmFtZSwgV1NfT1ZFUkxBUFBFRFdJTkRPVyB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMLAotCQkJQ1dfVVNFREVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgMCwgCi0JCQkwLCBpbnN0LCAwKTsKLQotICAgIGlmICghcHJldil7Ci0gICAgICAgIGNsYXNzLmxwZm5XbmRQcm9jID0gV25kUHJvYzI7Ci0JY2xhc3MubHBzekNsYXNzTmFtZSA9IGNsYXNzMk5hbWU7Ci0JY2xhc3MuaGJyQmFja2dyb3VuZCA9IEdldFN0b2NrT2JqZWN0KEdSQVlfQlJVU0gpOwotICAgICAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZjbGFzcykpCi0JICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB3bmQyPSBDcmVhdGVXaW5kb3cgKGNsYXNzMk5hbWUsIkNoaWxkIHdpbmRvdyIsIFdTX0NBUFRJT04gfCBXU19DSElMRCB8IFdTX1RISUNLRlJBTUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgNTAsIDUwLCAzNTAsIDEwMCwgd25kLCAwLCBpbnN0LCAwKTsKLQotICAgIFNob3dXaW5kb3cgKHduZCwgc2hvdyk7Ci0gICAgVXBkYXRlV2luZG93ICh3bmQpOwotICAgIFNob3dXaW5kb3cgKHduZDIsIHNob3cpOwotICAgIFVwZGF0ZVdpbmRvdyAod25kMik7Ci0KLSAgICB3aGlsZSAoR2V0TWVzc2FnZSAoJm1zZywgMCwgMCwgMCkpewotCVRyYW5zbGF0ZU1lc3NhZ2UgKCZtc2cpOwotCURpc3BhdGNoTWVzc2FnZSAoJm1zZyk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlidGVzdC9oZWxsbzUuYyBiL2xpYnRlc3QvaGVsbG81LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NjM1MGMuLjAwMDAwMDAKLS0tIGEvbGlidGVzdC9oZWxsbzUuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGR5bmFtaWNhbCBsb2FkaW5nIG9mIChpbnRlcm5hbCkgV2luMzIgRExMUy4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5OCBNYXJjdXMgTWVpc3NuZXIKLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLWludCBQQVNDQUwgV2luTWFpbiAoSElOU1RBTkNFIGluc3QsIEhJTlNUQU5DRSBwcmV2LCBMUFNUUiBjbWRsaW5lLCBpbnQgc2hvdykKLXsKLQlTWVNURU1fSU5GTwlzaTsKLQl2b2lkIChDQUxMQkFDSyAqZm5HZXRTeXN0ZW1JbmZvKShMUFNZU1RFTV9JTkZPIHNpKTsKLQlITU9EVUxFCWtlcm5lbDMyOwotCi0Ja2VybmVsMzIgPSBMb2FkTGlicmFyeSgiS0VSTkVMMzIiKTsKLQlpZiAoIWtlcm5lbDMyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJGQVRBTDogY291bGQgbm90IGxvYWQgS0VSTkVMMzIhXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWZuR2V0U3lzdGVtSW5mbyA9ICh2b2lkKilHZXRQcm9jQWRkcmVzcyhrZXJuZWwzMiwiR2V0U3lzdGVtSW5mbyIpOwotCWlmICghZm5HZXRTeXN0ZW1JbmZvKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJGQVRBTDogY291bGQgbm90IGZpbmQgR2V0U3lzdGVtSW5mbyFcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm5HZXRTeXN0ZW1JbmZvKCZzaSk7Ci0JZnByaW50ZihzdGRlcnIsIlF1ZXJ5U3lzdGVtSW5mbyByZXR1cm5zOlxuIik7Ci0JZnByaW50ZihzdGRlcnIsIgl3UHJvY2Vzc29yQXJjaGl0ZWN0dXJlOiAlZFxuIixzaS51LnMud1Byb2Nlc3NvckFyY2hpdGVjdHVyZSk7Ci0JZnByaW50ZihzdGRlcnIsIglkd1BhZ2VTaXplOiAlbGRcbiIsc2kuZHdQYWdlU2l6ZSk7Ci0JZnByaW50ZihzdGRlcnIsIglscE1pbmltdW1BcHBsaWNhdGlvbkFkZHJlc3M6ICVwXG4iLHNpLmxwTWluaW11bUFwcGxpY2F0aW9uQWRkcmVzcyk7Ci0JZnByaW50ZihzdGRlcnIsIglscE1heGltdW1BcHBsaWNhdGlvbkFkZHJlc3M6ICVwXG4iLHNpLmxwTWF4aW11bUFwcGxpY2F0aW9uQWRkcmVzcyk7Ci0JZnByaW50ZihzdGRlcnIsIglkd0FjdGl2ZVByb2Nlc3Nvck1hc2s6ICVsZFxuIixzaS5kd0FjdGl2ZVByb2Nlc3Nvck1hc2spOwotCWZwcmludGYoc3RkZXJyLCIJZHdOdW1iZXJPZlByb2Nlc3NvcnM6ICVsZFxuIixzaS5kd051bWJlck9mUHJvY2Vzc29ycyk7Ci0JZnByaW50ZihzdGRlcnIsIglkd1Byb2Nlc3NvclR5cGU6ICVsZFxuIixzaS5kd1Byb2Nlc3NvclR5cGUpOwotCWZwcmludGYoc3RkZXJyLCIJZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHk6ICVsZFxuIixzaS5kd0FsbG9jYXRpb25HcmFudWxhcml0eSk7Ci0JZnByaW50ZihzdGRlcnIsIgl3UHJvY2Vzc29yTGV2ZWw6ICVkXG4iLHNpLndQcm9jZXNzb3JMZXZlbCk7Ci0JZnByaW50ZihzdGRlcnIsIgl3UHJvY2Vzc29yUmV2aXNpb246ICVkXG4iLHNpLndQcm9jZXNzb3JSZXZpc2lvbik7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJ0ZXN0L25ldy5jIGIvbGlidGVzdC9uZXcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmODE2NS4uMDAwMDAwMAotLS0gYS9saWJ0ZXN0L25ldy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMTk5NiBKaW0gUGV0ZXJzb24KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi1IQU5ETEUgZ2hJbnN0YW5jZTsKLQotCi1MUkVTVUxUIENBTExCQUNLIFduZFByb2MgKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLUxSRVNVTFQgQ0FMTEJBQ0sgQ2hpbGRQcm9jIChIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSk7Ci0KLWludCBQQVNDQUwgV2luTWFpbiAoSElOU1RBTkNFIGhJbnN0YW5jZSwgSElOU1RBTkNFIGhQcmV2SW5zdGFuY2UsCi0JCSAgICBMUFNUUiBscHN6Q21kUGFyYW0sIGludCBuQ21kU2hvdykKLSAgICB7Ci0gICAgY2hhciBzekFwcE5hbWVbXSA9ICJDbGFzc0xvb2siIDsKLSAgICBIV05EICAgICAgICBod25kIDsKLSAgICBNU0cJCW1zZyA7Ci0gICAgV05EQ0xBU1MgICAgd25kY2xhc3MgOwotCi0gICAgZ2hJbnN0YW5jZSA9IGhJbnN0YW5jZTsKLSAgICBpZiAoIWhQcmV2SW5zdGFuY2UpCi0JIHsKLQkgd25kY2xhc3Muc3R5bGUJCT0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVcgOwotCSB3bmRjbGFzcy5scGZuV25kUHJvYwk9IFduZFByb2MgOwotCSB3bmRjbGFzcy5jYkNsc0V4dHJhCT0gMCA7Ci0JIHduZGNsYXNzLmNiV25kRXh0cmEJPSAwIDsKLQkgd25kY2xhc3MuaEluc3RhbmNlCT0gaEluc3RhbmNlIDsKLQkgd25kY2xhc3MuaEljb24JCT0gTG9hZEljb24gKE5VTEwsIElESV9BUFBMSUNBVElPTikgOwotCSB3bmRjbGFzcy5oQ3Vyc29yCT0gTG9hZEN1cnNvciAoTlVMTCwgSURDX0FSUk9XKSA7Ci0JIHduZGNsYXNzLmhickJhY2tncm91bmQJPSBHZXRTdG9ja09iamVjdCAoV0hJVEVfQlJVU0gpIDsKLQkgd25kY2xhc3MubHBzek1lbnVOYW1lCT0gTlVMTCA7Ci0JIHduZGNsYXNzLmxwc3pDbGFzc05hbWUJPSBzekFwcE5hbWUgOwotCi0JIFJlZ2lzdGVyQ2xhc3MgKCZ3bmRjbGFzcykgOwotCSB9Ci0KLSAgICBod25kID0gQ3JlYXRlV2luZG93IChzekFwcE5hbWUsCS8qIHdpbmRvdyBjbGFzcyBuYW1lICovCi0JCSAgc3pBcHBOYW1lLAkJLyogd2luZG93IGNhcHRpb24gKi8KLQkJICBXU19PVkVSTEFQUEVEV0lORE9XLAkvKiB3aW5kb3cgc3R5bGUgKi8KLQkJICBDV19VU0VERUZBVUxULAkvKiBpbml0aWFsIHggcG9zaXRpb24gKi8KLQkJICBDV19VU0VERUZBVUxULAkvKiBpbml0aWFsIHkgcG9zaXRpb24gKi8KLQkJICA2MDAsCS8qIGluaXRpYWwgeCBzaXplICovCi0JCSAgNDAwLAkvKiBpbml0aWFsIHkgc2l6ZSAqLwotCQkgIE5VTEwsCQkJLyogcGFyZW50IHdpbmRvdyBoYW5kbGUgKi8KLQkJICBOVUxMLAkJCS8qIHdpbmRvdyBtZW51IGhhbmRsZSAqLwotCQkgIGhJbnN0YW5jZSwJCS8qIHByb2dyYW0gaW5zdGFuY2UgaGFuZGxlICovCi0JCSAgTlVMTCkgOwkJLyogY3JlYXRpb24gcGFyYW1ldGVycyAqLwotCi0gICAgU2hvd1dpbmRvdyAoaHduZCwgbkNtZFNob3cpIDsKLSAgICBVcGRhdGVXaW5kb3cgKGh3bmQpIDsKLQotICAgIHdoaWxlIChHZXRNZXNzYWdlICgmbXNnLCBOVUxMLCAwLCAwKSkKLQkgewotCSBUcmFuc2xhdGVNZXNzYWdlICgmbXNnKSA7Ci0JIERpc3BhdGNoTWVzc2FnZSAoJm1zZykgOwotCSB9Ci0gICAgcmV0dXJuIG1zZy53UGFyYW0gOwotICAgIH0KLQotTFJFU1VMVCBDQUxMQkFDSyBXbmRQcm9jIChIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLSAgICB7Ci0gICAgSERDCQloZGMgOwotICAgIFBBSU5UU1RSVUNUCXBzIDsKLSAgICBSRUNUCXJlY3QgOwotICAgIFdORENMQVNTICAgIHduZGNsYXNzIDsKLSAgICBjaGFyIGNsc05hbWVbXSA9ICJTZWNvbmRDbGFzcyI7Ci0KLSAgICBzdGF0aWMgSFdORAloQ2hpbGQ7Ci0KLSAgICBzd2l0Y2ggKG1lc3NhZ2UpCi0JIHsKLQkgY2FzZSBXTV9DUkVBVEUgOgotCSAgICAgd25kY2xhc3Muc3R5bGUJCT0gQ1NfUEFSRU5UREMgfCBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKLSAgICAJICAgICB3bmRjbGFzcy5scGZuV25kUHJvYwk9IENoaWxkUHJvYyA7Ci0gICAgCSAgICAgd25kY2xhc3MuY2JDbHNFeHRyYQk9IDAgOwotICAgIAkgICAgIHduZGNsYXNzLmNiV25kRXh0cmEJPSAwIDsKLSAgICAJICAgICB3bmRjbGFzcy5oSW5zdGFuY2UJCT0gZ2hJbnN0YW5jZSA7Ci0gICAgCSAgICAgd25kY2xhc3MuaEljb24JCT0gTlVMTCA7Ci0gICAgCSAgICAgd25kY2xhc3MuaEN1cnNvcgkJPSBMb2FkQ3Vyc29yIChOVUxMLCBJRENfQ1JPU1MpIDsKLSAgICAJICAgICB3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kCT0gR2V0U3RvY2tPYmplY3QgKExUR1JBWV9CUlVTSCkgOwotICAgIAkgICAgIHduZGNsYXNzLmxwc3pNZW51TmFtZQk9IE5VTEwgOwotICAgIAkgICAgIHduZGNsYXNzLmxwc3pDbGFzc05hbWUJPSBjbHNOYW1lOwotCi0JICAgICBSZWdpc3RlckNsYXNzICgmd25kY2xhc3MpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICBoQ2hpbGQgPSBDcmVhdGVXaW5kb3coY2xzTmFtZSwiQ2hpbGQgV2luZG93IiwKLSAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSLAotICAgICAgICAgICAgICAgICAxMCwgMTAsIDU4MCwgMzgwLCBod25kLCBOVUxMLCBnaEluc3RhbmNlLCBOVUxMKTsKLSAgICAgICAgICAgICBTaG93V2luZG93KGhDaGlsZCwgU1dfU0hPVyk7Ci0JIGNhc2UgV01fUEFJTlQgOgotCSAgICAgIGhkYyA9IEJlZ2luUGFpbnQgKGh3bmQsICZwcykgOwotCi0JICAgICAgR2V0Q2xpZW50UmVjdCAoaHduZCwgJnJlY3QpIDsKLQotCSAgICAgIERyYXdUZXh0IChoZGMsICJIZWxsbywgV2luZG93cyEiLCAtMSwgJnJlY3QsCi0JCQlEVF9TSU5HTEVMSU5FIHwgRFRfQ0VOVEVSIHwgRFRfVkNFTlRFUikgOwotCi0JICAgICAgRW5kUGFpbnQgKGh3bmQsICZwcyk7Ci0JICAgICAgcmV0dXJuIDAgOwotCi0JIGNhc2UgV01fREVTVFJPWSA6Ci0JICAgICAgUG9zdFF1aXRNZXNzYWdlICgwKSA7Ci0JICAgICAgcmV0dXJuIDAgOwotCSB9Ci0gICAgcmV0dXJuIERlZldpbmRvd1Byb2MgKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKSA7Ci0gICAgfQotCi1MUkVTVUxUIENBTExCQUNLIENoaWxkUHJvYyAoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgSERDCQkJaERDOwotICAgIFBBSU5UU1RSVUNUCQlwczsKLSAgICBXTkRDTEFTUwkJd25kQ2xhc3M7Ci0gICAgY2hhcgkJKmNsYXNzZXNbXT17IkVESVQiLCJCVVRUT04iLCJMSVNUQk9YIiwiU1RBVElDIiwiU0NST0xMQkFSIiwiQ09NQk9CT1giLCJDT01CT0xCT1giLCBOVUxMfTsKLSAgICBjaGFyKioJCWN1cnI7Ci0gICAgY2hhcgkJYnVmWzI1Nl07Ci0gICAgUkVDVAlyZWN0IDsKLSAgICBpbnQgaTsKLQotICAgIHN3aXRjaCAobWVzc2FnZSkgewotICAgICAgICBjYXNlIFdNX1BBSU5UOgotICAgICAgICAgICAgY3VyciA9IGNsYXNzZXM7Ci0gICAgICAgICAgICBpPTA7Ci0gICAgICAgICAgICBoREMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QoaERDLEdldFN0b2NrT2JqZWN0KEFOU0lfRklYRURfRk9OVCkpOwotICAgICAgICAgICAgd2hpbGUgKCpjdXJyKSB7Ci0gICAgICAgICAgICAgIHdzcHJpbnRmKGJ1ZiwiJTEyczoiLCpjdXJyKTsKLSAgICAgICAgICAgICAgR2V0Q2xhc3NJbmZvKE5VTEwsICpjdXJyLCAmd25kQ2xhc3MpOwotICAgICAgICAgICAgICBpZih3bmRDbGFzcy5zdHlsZSZDU19WUkVEUkFXKSAgbHN0cmNhdChidWYsIiB8IENTX1ZSRURSQVciKTsKLSAgICAgICAgICAgICAgaWYod25kQ2xhc3Muc3R5bGUmQ1NfSFJFRFJBVykgIGxzdHJjYXQoYnVmLCIgfCBDU19IUkVEUkFXIiApOwotICAgICAgICAgICAgICBpZih3bmRDbGFzcy5zdHlsZSZDU19LRVlDVlRXSU5ET1cpIGxzdHJjYXQoYnVmLCIgfCBDU19LRVlDVlRXSU5ET1ciICk7Ci0gICAgICAgICAgICAgIGlmKHduZENsYXNzLnN0eWxlJkNTX0RCTENMS1MpIGxzdHJjYXQoYnVmLCIgfCBDU19EQkxDTEtTIiApOwotICAgICAgICAgICAgICBpZih3bmRDbGFzcy5zdHlsZSZDU19PV05EQykgbHN0cmNhdChidWYsIiB8IENTX09XTkRDIiApOwotICAgICAgICAgICAgICBpZih3bmRDbGFzcy5zdHlsZSZDU19DTEFTU0RDKSBsc3RyY2F0KGJ1ZiwiIHwgQ1NfQ0xBU1NEQyIgKTsKLSAgICAgICAgICAgICAgaWYod25kQ2xhc3Muc3R5bGUmQ1NfUEFSRU5UREMpIGxzdHJjYXQoYnVmLCIgfCBDU19QQVJFTlREQyIgKTsKLSAgICAgICAgICAgICAgaWYod25kQ2xhc3Muc3R5bGUmQ1NfTk9LRVlDVlQpIGxzdHJjYXQoYnVmLCIgfCBDU19OT0tFWUNWVCIgKTsKLSAgICAgICAgICAgICAgaWYod25kQ2xhc3Muc3R5bGUmQ1NfTk9DTE9TRSkgbHN0cmNhdChidWYsIiB8IENTX05PQ0xPU0UiICk7Ci0gICAgICAgICAgICAgIGlmKHduZENsYXNzLnN0eWxlJkNTX1NBVkVCSVRTKSBsc3RyY2F0KGJ1ZiwiIHwgQ1NfU0FWRUJJVFMiICk7Ci0gICAgICAgICAgICAgIGlmKHduZENsYXNzLnN0eWxlJkNTX0dMT0JBTENMQVNTKSBsc3RyY2F0KGJ1ZiwiIHwgQ1NfR0xPQkFMQ0xBU1MiKTsKLQkgICAgICBHZXRDbGllbnRSZWN0IChod25kLCAmcmVjdCkgOwotCSAgICAgIFRleHRPdXQgKGhEQywgNSwyMCtpLGJ1Zixsc3RybGVuKGJ1ZikpIDsKLSAgICAgICAgICAgICAgaSArPSAxNTsKLSAgICAgICAgICAgICAgY3VycisrOwotICAgICAgICAgICAgfQotLyogICAgICAgICAgICBFbmRQYWludChod25kLCAmcHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBoREMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7Ci0qLwotICAgICAgICAgICAgTW92ZVRvRXgoaERDLCAwLCAwLCBOVUxMKTsKLSAgICAgICAgICAgIExpbmVUbyhoREMsIDUwMCwgNTAwKTsKLSAgICAgICAgICAgIEVuZFBhaW50KGh3bmQsICZwcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jIChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSkgOwotICAgIH0KLSAgICByZXR1cm4gKDBMKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidGVzdC9yb2xleC5jIGIvbGlidGVzdC9yb2xleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2FmZGFkLi4wMDAwMDAwCi0tLSBhL2xpYnRlc3Qvcm9sZXguYworKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgcm9sZXguYzogV2luZG93cyBjbG9jayBhcHBsaWNhdGlvbiBmb3IgV0lORSAoYnkgSmltIFBldGVyc29uKSAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgVGhpcyBpcyBhIHRyYW5zbGF0aW9uIG9mIGEgVHVyYm8gUGFzY2FsIE9XTCBhcHBsaWNhdGlvbiBJIG1hZGUgICAqCi0gKiAgb25jZSwgc28gaXQncyBhIGxpdHRsZSBmbGFreSAodG9ucyBvZiBnbG9iYWxzLCBmdW5jdGlvbnMgdGhhdCAgICAqCi0gKiAgY291bGQgaGF2ZSBiZWVuIGluLWxpbmVkLCBldGMuKS4gIFRoZSBzb3VyY2UgY29kZSBzaG91bGQgZWFzaWx5ICAqCi0gKiAgY29tcGlsZSB3aXRoIGEgc3RhbmRhcmQgV2luMzIgQyBjb21waWxlci4gICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgVG8gdHJ5IGl0IG91dCwgdHlwZSAnbWFrZSByb2xleCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKgotICogQ29weXJpZ2h0IEppbSBQZXRlcnNvbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0KLWNoYXIgQXBwTmFtZVtdID0gIlJvbGV4IjsKLWNoYXIgV2luZG93TmFtZVtdID0gIlJvbGV4IjsKLWludCBXaW5kb3dXaWR0aCA9IDEwMDsKLWludCBXaW5kb3dIZWlnaHQgPSAxMjE7Ci1DT0xPUlJFRiBGYWNlQ29sb3IgPSBSR0IoMTkyLDE5MiwxOTIpOwotQ09MT1JSRUYgSGFuZENvbG9yID0gUkdCKDAsMCwwKTsKLUNPTE9SUkVGIEV0Y2hDb2xvciA9IFJHQigwLDAsMCk7Ci0KLWZsb2F0IFBpPTMuMTQxNTkyNjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IFN0YXJ0WCxTdGFydFksRW5kWCxFbmRZOwotfSBIYW5kRGF0YTsKLQotaW50IE1heFgsTWF4WTsKLUhhbmREYXRhIE9sZFNlY29uZCxPbGRIb3VyLE9sZE1pbnV0ZTsKLQotSFdORCBIV2luZG93OwotCi12b2lkIERyYXdGYWNlKEhEQyBkYykKLXsKLSAgaW50IE1pZFgsIE1pZFksIHQ7Ci0KLSAgTWlkWD1NYXhYLzI7Ci0gIE1pZFk9TWF4WS8yOwotICBTZWxlY3RPYmplY3QoZGMsQ3JlYXRlU29saWRCcnVzaChGYWNlQ29sb3IpKTsKLSAgU2VsZWN0T2JqZWN0KGRjLENyZWF0ZVBlbihQU19TT0xJRCwxLEV0Y2hDb2xvcikpOwotICBFbGxpcHNlKGRjLDAsMCxNYXhYLE1heFkpOwotCi0gIGZvcih0PTA7IHQ8MTI7IHQrKykKLSAgewotICAgIE1vdmVUb0V4KGRjLE1pZFgrc2luKHQqUGkvNikqMC45Kk1pZFgsTWlkWS1jb3ModCpQaS82KSowLjkqTWlkWSxOVUxMKTsKLSAgICBMaW5lVG8oZGMsTWlkWCtzaW4odCpQaS82KSowLjgqTWlkWCxNaWRZLWNvcyh0KlBpLzYpKjAuOCpNaWRZKTsKLSAgfQotICBpZihNYXhYPjY0ICYmIE1heFk+NjQpCi0gICAgZm9yKHQ9MDsgdDw2MDsgdCsrKQotICAgICAgU2V0UGl4ZWwoZGMsTWlkWCtzaW4odCpQaS8zMCkqMC45Kk1pZFgsTWlkWS1jb3ModCpQaS8zMCkqMC45Kk1pZFkKLQkgICAgICAgLEV0Y2hDb2xvcik7Ci0gIERlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoZGMsR2V0U3RvY2tPYmplY3QoTlVMTF9CUlVTSCkpKTsKLSAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxHZXRTdG9ja09iamVjdChOVUxMX1BFTikpKTsKLSAgbWVtc2V0KCZPbGRTZWNvbmQsMCxzaXplb2YoT2xkU2Vjb25kKSk7Ci0gIG1lbXNldCgmT2xkTWludXRlLDAsc2l6ZW9mKE9sZE1pbnV0ZSkpOwotICBtZW1zZXQoJk9sZEhvdXIsMCxzaXplb2YoT2xkSG91cikpOwotfQotCi12b2lkIERyYXdIb3VySGFuZChIREMgZGMpCi17Ci0gIE1vdmVUb0V4KGRjLCBPbGRIb3VyLlN0YXJ0WCwgT2xkSG91ci5TdGFydFksIE5VTEwpOwotICBMaW5lVG8oZGMsIE9sZEhvdXIuRW5kWCwgT2xkSG91ci5FbmRZKTsKLX0KLQotdm9pZCBEcmF3TWludXRlSGFuZChIREMgZGMpCi17Ci0gIE1vdmVUb0V4KGRjLCBPbGRNaW51dGUuU3RhcnRYLCBPbGRNaW51dGUuU3RhcnRZLCBOVUxMKTsKLSAgTGluZVRvKGRjLCBPbGRNaW51dGUuRW5kWCwgT2xkTWludXRlLkVuZFkpOwotfQotCi12b2lkIERyYXdTZWNvbmRIYW5kKEhEQyBkYykKLXsKLSAgTW92ZVRvRXgoZGMsIE9sZFNlY29uZC5TdGFydFgsIE9sZFNlY29uZC5TdGFydFksIE5VTEwpOwotICBMaW5lVG8oZGMsIE9sZFNlY29uZC5FbmRYLCBPbGRTZWNvbmQuRW5kWSk7Ci19Ci0KLUJPT0wgVXBkYXRlSG91ckhhbmQoSERDIGRjLGludCBNaWRYLGludCBNaWRZLGludCBYRXh0LGludCBZRXh0LFdPUkQgUG9zKQotewotICBpbnQgU3gsIFN5LCBFeCwgRXk7Ci0gIEJPT0wgcnY7Ci0KLSAgcnYgPSBGQUxTRTsKLSAgU3ggPSBNaWRYOyBTeSA9IE1pZFk7Ci0gIEV4ID0gTWlkWCtzaW4oUG9zKlBpLzYwMDApKlhFeHQ7Ci0gIEV5ID0gTWlkWS1jb3MoUG9zKlBpLzYwMDApKllFeHQ7Ci0gIHJ2ID0gKCBTeCE9T2xkSG91ci5TdGFydFggfHwgRXghPU9sZEhvdXIuRW5kWCB8fCAKLQkgU3khPU9sZEhvdXIuU3RhcnRZIHx8IEV5IT1PbGRIb3VyLkVuZFkgKTsKLSAgaWYocnYpRHJhd0hvdXJIYW5kKGRjKTsKLSAgT2xkSG91ci5TdGFydFggPSBTeDsgT2xkSG91ci5FbmRYID0gRXg7Ci0gIE9sZEhvdXIuU3RhcnRZID0gU3k7IE9sZEhvdXIuRW5kWSA9IEV5OwotICByZXR1cm4gcnY7Ci19Ci0KLUJPT0wgVXBkYXRlTWludXRlSGFuZChIREMgZGMsaW50IE1pZFgsaW50IE1pZFksaW50IFhFeHQsaW50IFlFeHQsV09SRCBQb3MpCi17Ci0gIGludCBTeCwgU3ksIEV4LCBFeTsKLSAgQk9PTCBydjsKLQotICBydiA9IEZBTFNFOwotICBTeCA9IE1pZFg7IFN5ID0gTWlkWTsKLSAgRXggPSBNaWRYK3NpbihQb3MqUGkvMzAwMDApKlhFeHQ7Ci0gIEV5ID0gTWlkWS1jb3MoUG9zKlBpLzMwMDAwKSpZRXh0OwotICBydiA9ICggU3ghPU9sZE1pbnV0ZS5TdGFydFggfHwgRXghPU9sZE1pbnV0ZS5FbmRYIHx8Ci0JIFN5IT1PbGRNaW51dGUuU3RhcnRZIHx8IEV5IT1PbGRNaW51dGUuRW5kWSApOwotICBpZihydilEcmF3TWludXRlSGFuZChkYyk7Ci0gIE9sZE1pbnV0ZS5TdGFydFggPSBTeDsgT2xkTWludXRlLkVuZFggPSBFeDsKLSAgT2xkTWludXRlLlN0YXJ0WSA9IFN5OyBPbGRNaW51dGUuRW5kWSA9IEV5OwotICByZXR1cm4gcnY7Ci19Ci0KLUJPT0wgVXBkYXRlU2Vjb25kSGFuZChIREMgZGMsaW50IE1pZFgsaW50IE1pZFksaW50IFhFeHQsaW50IFlFeHQsV09SRCBQb3MpCi17Ci0gIGludCBTeCwgU3ksIEV4LCBFeTsKLSAgQk9PTCBydjsKLQotICBydiA9IEZBTFNFOwotICBTeCA9IE1pZFg7IFN5ID0gTWlkWTsKLSAgRXggPSBNaWRYK3NpbihQb3MqUGkvMzAwMCkqWEV4dDsKLSAgRXkgPSBNaWRZLWNvcyhQb3MqUGkvMzAwMCkqWUV4dDsKLSAgcnYgPSAoIFN4IT1PbGRTZWNvbmQuU3RhcnRYIHx8IEV4IT1PbGRTZWNvbmQuRW5kWCB8fAotCSBTeSE9T2xkU2Vjb25kLlN0YXJ0WSB8fCBFeSE9T2xkU2Vjb25kLkVuZFkgKTsKLSAgaWYocnYpRHJhd1NlY29uZEhhbmQoZGMpOwotICBPbGRTZWNvbmQuU3RhcnRYID0gU3g7IE9sZFNlY29uZC5FbmRYID0gRXg7Ci0gIE9sZFNlY29uZC5TdGFydFkgPSBTeTsgT2xkU2Vjb25kLkVuZFkgPSBFeTsKLSAgcmV0dXJuIHJ2OwotfQotCi12b2lkIElkbGUoSERDIGlkYykKLXsKLSAgU1lTVEVNVElNRSBzdDsKLSAgV09SRCBILCBNLCBTLCBGOwotICBpbnQgTWlkWCwgTWlkWTsKLSAgSERDIGRjOwotICBCT09MIFJlZHJhdzsKLQotICBpZihpZGMpCi0gICAgZGM9aWRjOwotICBlbHNlCi0gICAgZGM9R2V0REMoSFdpbmRvdyk7Ci0gIGlmKCFkYylyZXR1cm47Ci0KLSAgR2V0TG9jYWxUaW1lKCZzdCk7Ci0gIEggPSBzdC53SG91cjsKLSAgTSA9IHN0LndNaW51dGU7Ci0gIFMgPSBzdC53U2Vjb25kOwotICBGID0gc3Qud01pbGxpc2Vjb25kcyAvIDEwOwotICBGID0gRiArIFMqMTAwOwotICBNID0gTSoxMDAwK0YvNjsKLSAgSCA9IEgqMTAwMCtNLzYwOwotICBNaWRYID0gTWF4WC8yOwotICBNaWRZID0gTWF4WS8yOwotICBTZWxlY3RPYmplY3QoZGMsQ3JlYXRlUGVuKFBTX1NPTElELDEsRmFjZUNvbG9yKSk7Ci0gIFJlZHJhdyA9IEZBTFNFOwotICBpZihVcGRhdGVIb3VySGFuZChkYyxNaWRYLE1pZFksTWlkWCowLjUsTWlkWSowLjUsSCkpIFJlZHJhdyA9IFRSVUU7Ci0gIGlmKFVwZGF0ZU1pbnV0ZUhhbmQoZGMsTWlkWCxNaWRZLE1pZFgqMC42NSxNaWRZKjAuNjUsTSkpIFJlZHJhdyA9IFRSVUU7Ci0gIGlmKFVwZGF0ZVNlY29uZEhhbmQoZGMsTWlkWCxNaWRZLE1pZFgqMC43OSxNaWRZKjAuNzksRikpIFJlZHJhdyA9IFRSVUU7Ci0gIERlbGV0ZU9iamVjdChTZWxlY3RPYmplY3QoZGMsQ3JlYXRlUGVuKFBTX1NPTElELDEsSGFuZENvbG9yKSkpOwotICBpZihSZWRyYXcpCi0gIHsKLSAgICBEcmF3U2Vjb25kSGFuZChkYyk7Ci0gICAgRHJhd01pbnV0ZUhhbmQoZGMpOwotICAgIERyYXdIb3VySGFuZChkYyk7Ci0gIH0KLSAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChkYyxHZXRTdG9ja09iamVjdChOVUxMX1BFTikpKTsKLSAgaWYoIWlkYykgUmVsZWFzZURDKEhXaW5kb3csZGMpOwotfQotCi1MUkVTVUxUIENBTExCQUNLIFByb2Nlc3NBcHBNc2coSFdORCB3bmQsVUlOVCBtc2csV1BBUkFNIHcsTFBBUkFNIGwpCi17Ci0gIFBBSU5UU1RSVUNUIFBhaW50SW5mbzsKLSAgSERDIGRjOwotCi0gIHN3aXRjaChtc2cpCi0gIHsKLSAgY2FzZSBXTV9QQUlOVDoKLSAgICBpZihHZXRVcGRhdGVSZWN0KHduZCxOVUxMLEZBTFNFKSkKLSAgICB7Ci0gICAgICBkYz1CZWdpblBhaW50KHduZCwmUGFpbnRJbmZvKTsKLSAgICAgIERyYXdGYWNlKGRjKTsKLSAgICAgIElkbGUoZGMpOwotICAgICAgRW5kUGFpbnQod25kLCZQYWludEluZm8pOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIFdNX1NJWkU6Ci0gICAgTWF4WCA9IExPV09SRChsKTsKLSAgICBNYXhZID0gSElXT1JEKGwpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgV01fREVTVFJPWToKLSAgICBQb3N0UXVpdE1lc3NhZ2UgKDApOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIERlZldpbmRvd1Byb2MgKHduZCwgbXNnLCB3LCBsKTsKLSAgfQotICByZXR1cm4gMGw7Ci19Ci0KLVdQQVJBTSBNZXNzYWdlTG9vcCgpCi17Ci0gIE1TRyBtc2c7Ci0KLSAgd2hpbGUoMSkKLSAgewotICAgIFNsZWVwKDEpOyAvKiBzbGVlcCAxIG1pbGxpc2Vjb25kICovCi0gICAgaWYoUGVla01lc3NhZ2UoJm1zZywwLDAsMCxQTV9SRU1PVkUpKQotICAgIHsKLSAgICAgIGlmKG1zZy5tZXNzYWdlID09IFdNX1FVSVQpIHJldHVybiBtc2cud1BhcmFtOwotICAgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLSAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgSWRsZShOVUxMKTsKLSAgfQotfQotCi1pbnQgUEFTQ0FMIFdpbk1haW4gKEhJTlNUQU5DRSBpbnN0LCBISU5TVEFOQ0UgcHJldiwgTFBTVFIgY21kbGluZSwgaW50IHNob3cpCi17Ci0gIFdORENMQVNTIGNsYXNzOwotICBpZighcHJldikKLSAgewotICAgIGNsYXNzLnN0eWxlID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVc7Ci0gICAgY2xhc3MubHBmblduZFByb2MgPSBQcm9jZXNzQXBwTXNnOwotICAgIGNsYXNzLmNiQ2xzRXh0cmEgPSAwOwotICAgIGNsYXNzLmNiV25kRXh0cmEgPSAwOwotICAgIGNsYXNzLmhJbnN0YW5jZSAgPSBpbnN0OwotICAgIGNsYXNzLmhJY29uICAgICAgPSAwOyAvKiBEcmF3IG15IG93biBpY29uICovCi0gICAgY2xhc3MuaEN1cnNvciAgICA9IExvYWRDdXJzb3IgKDAsIElEQ19BUlJPVyk7Ci0gICAgY2xhc3MuaGJyQmFja2dyb3VuZCA9IChIQlJVU0gpKENPTE9SX0JBQ0tHUk9VTkQgKyAxKTsKLSAgICBjbGFzcy5scHN6TWVudU5hbWUgPSAwOwotICAgIGNsYXNzLmxwc3pDbGFzc05hbWUgPSBBcHBOYW1lOwotICB9Ci0gIGlmICghUmVnaXN0ZXJDbGFzcyAoJmNsYXNzKSkgcmV0dXJuIC0xOwotCi0gIEhXaW5kb3c9Q3JlYXRlV2luZG93RXgoV1NfRVhfVE9QTU9TVCxBcHBOYW1lLFdpbmRvd05hbWUsV1NfT1ZFUkxBUFBFRFdJTkRPVywKLQkJCSBDV19VU0VERUZBVUxULENXX1VTRURFRkFVTFQsV2luZG93V2lkdGgsV2luZG93SGVpZ2h0LAotCQkJIDAsMCxpbnN0LDApOwotICBtZW1zZXQoJk9sZFNlY29uZCwwLHNpemVvZihPbGRTZWNvbmQpKTsKLSAgbWVtc2V0KCZPbGRNaW51dGUsMCxzaXplb2YoT2xkTWludXRlKSk7Ci0gIG1lbXNldCgmT2xkSG91ciwwLHNpemVvZihPbGRIb3VyKSk7Ci0gIE1heFggPSBXaW5kb3dXaWR0aDsKLSAgTWF4WSA9IFdpbmRvd0hlaWdodDsKLQotICBTaG93V2luZG93IChIV2luZG93LCBzaG93KTsKLSAgVXBkYXRlV2luZG93IChIV2luZG93KTsKLQotICByZXR1cm4gTWVzc2FnZUxvb3AoKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnRlc3Qvdm9saW5mby5jIGIvbGlidGVzdC92b2xpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMGE3NzAuLjAwMDAwMDAKLS0tIGEvbGlidGVzdC92b2xpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogVGhpcyB0ZXN0IHByb2dyYW0gd2FzIGNvcGllZCBmcm9tIHRoZSBmb3JtZXIgZmlsZSBkb2N1bWVudGF0aW9uL2Nkcm9tLWxhYmVsCi0gKgotICogQ29weXJpZ2h0IDE5OTggUGV0dGVyIFJlaW5ob2xkdHNlbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gLyogZm9yIHN0cmNhdCgpICovCi0KLWludCBQQVNDQUwgV2luTWFpbihISU5TVEFOQ0UgaEluc3RhbmNlLCBISU5TVEFOQ0UgaFByZXZJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN6Q21kTGluZSwgaW50IG5DbWRTaG93KQotewotICAgIGNoYXIgIGRyaXZlLCByb290W109IkM6XFwiLCBsYWJlbFsxMDAyXSwgZnNuYW1lWzEwMDJdOwotICAgIERXT1JEIHNlcmlhbCwgZmxhZ3MsIGZpbGVuYW1lbGVuLCBsYWJlbGxlbiA9IDEwMDAsIGZzbmFtZWxlbiA9IDEwMDA7Ci0KLSAgICBwcmludGYoIkRyaXZlIFNlcmlhbCAgICAgRmxhZ3MgICAgICBGaWxlbmFtZS1MZW5ndGggIgotICAgICAgICAgICAiTGFiZWwgICAgICAgICAgICAgICAgIEZzbmFtZVxuIik7Ci0gICAgZm9yIChkcml2ZSA9ICdBJzsgZHJpdmUgPD0gJ1onOyBkcml2ZSsrKQotICAgIHsKLSAgICAgICAgcm9vdFswXSA9IGRyaXZlOwotICAgICAgICBpZiAoR2V0Vm9sdW1lSW5mb3JtYXRpb24ocm9vdCxsYWJlbCxsYWJlbGxlbiwmc2VyaWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZWxlbiwmZmxhZ3MsZnNuYW1lLGZzbmFtZWxlbikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmNhdChsYWJlbCwiXCIiKTsgc3RyY2F0IChmc25hbWUsIlwiIik7Ci0gICAgICAgICAgICBwcmludGYoIiVjOlxcICAgMHglMDhseCAweCUwOGx4ICUxNWxkIFwiJS0yMHMgXCIlLTIwc1xuIiwKLSAgICAgICAgICAgICAgICAgICBkcml2ZSwgKGxvbmcpIHNlcmlhbCwgKGxvbmcpIGZsYWdzLCAobG9uZykgZmlsZW5hbWVsZW4sCi0gICAgICAgICAgICAgICAgICAgbGFiZWwsIGZzbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL01ha2VmaWxlLmluCmluZGV4IDU1OTQ1MDUuLjc2ZmUxOGUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL01ha2VmaWxlLmluCkBAIC02LDYgKzYsNyBAQAogCiBJTlNUQUxMU1VCRElSUyA9IFwKIAljb250cm9sIFwKKwlleHBhbmQgXAogCW5vdGVwYWQgXAogCXByb2dtYW4gXAogCXJlZ2VkaXQgXApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvZXhwYW5kLy5jdnNpZ25vcmUgYi9wcm9ncmFtcy9leHBhbmQvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTFiMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvZXhwYW5kLy5jdnNpZ25vcmUKQEAgLTAsMCArMSwzIEBACitNYWtlZmlsZQorZXhwYW5kLmRiZy5jCitleHBhbmQuc3BlYy5jCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9leHBhbmQvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9leHBhbmQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5OTFiMwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2V4cGFuZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDEzIEBACitUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKK1RPUE9CSkRJUiA9IC4uLy4uCitTUkNESVIgICAgPSBAc3JjZGlyQAorVlBBVEggICAgID0gQHNyY2RpckAKK01PRFVMRSAgICA9IGV4cGFuZAorQVBQTU9ERSAgID0gY3VpCitJTVBPUlRTICAgPSBsejMyIGtlcm5lbDMyCisKK0NfU1JDUyA9IGV4cGFuZC5jCisKK0BNQUtFX1BST0dfUlVMRVNACisKKyMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS9saWJ0ZXN0L2V4cGFuZC5jIGIvcHJvZ3JhbXMvZXhwYW5kL2V4cGFuZC5jCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIGxpYnRlc3QvZXhwYW5kLmMKcmVuYW1lIHRvIHByb2dyYW1zL2V4cGFuZC9leHBhbmQuYwppbmRleCBmMWRhZjhjLi45NGI3MTgzIDEwMDY0NAotLS0gYS9saWJ0ZXN0L2V4cGFuZC5jCisrKyBiL3Byb2dyYW1zL2V4cGFuZC9leHBhbmQuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgMTk5NyBWaWN0b3IgU2NobmVpZGVyCisgKiBDb3B5cmlnaHQgMjAwMiBBbGV4YW5kcmUgSnVsbGlhcmQKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yMiwzMiArMjMsMjkgQEAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSA8bHpleHBhbmQuaD4KIAotaW50IFBBU0NBTCBXaW5NYWluKEhJTlNUQU5DRSBoaW5zdEN1cnJlbnQsCi0JCQkJSElOU1RBTkNFIGhpbnN0UHJldmlvdXMsCi0JCQkJTFBTVFIgbHBDbWRMaW5lLAotCQkJCWludCBuQ21kU2hvdykKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAgIE9GU1RSVUNUIFNvdXJjZU9wZW5TdHJ1Y3QxLCBTb3VyY2VPcGVuU3RydWN0MjsKLSAgY2hhciBPcmlnaW5hbE5hbWVbMjU2XTsKLSAgY2hhciBGQVIgKmxwekRlc3RGaWxlOwogICBEV09SRCBkd3JldHVybjsKICAgSEZJTEUgaFNvdXJjZUZpbGUsIGhEZXN0RmlsZTsKLSAgLyogTW9zdCBXaW5kb3dzIGNvbXBpbGVycyBoYXZlIHNvbWV0aGluZyBsaWtlIHRoaXM6ICovCi0gIGV4dGVybiBpbnQgX0FSR0M7Ci0gIGV4dGVybiBjaGFyICoqX0FSR1Y7CiAKLSAgaFNvdXJjZUZpbGUgPSBMWk9wZW5GaWxlKF9BUkdWWzFdLCAoTFBPRlNUUlVDVCkgJlNvdXJjZU9wZW5TdHJ1Y3QxLCBPRl9SRUFEKTsKLSAgaWYgKChfQVJHQyA9PSAzKSAmJiAoX0FSR1ZbMl0gIT0gTlVMTCkpCi0JbHB6RGVzdEZpbGUgPSBfQVJHVlsyXTsKLSAgZWxzZSB7Ci0gIAlscHpEZXN0RmlsZSA9IE9yaWdpbmFsTmFtZTsKLSAgCUdldEV4cGFuZGVkTmFtZShfQVJHVlsxXSwgbHB6RGVzdEZpbGUpOwotICB9OwotICBoRGVzdEZpbGUgPSBMWk9wZW5GaWxlKGxwekRlc3RGaWxlLCAoTFBPRlNUUlVDVCkgJlNvdXJjZU9wZW5TdHJ1Y3QyLAotCQkJT0ZfQ1JFQVRFIHwgT0ZfV1JJVEUpOworICBpZiAoYXJnYyA8IDIpCisgIHsKKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIlVzYWdlOiAlcyBpbmZpbGUgW291dGZpbGVdXG4iLCBhcmd2WzBdICk7CisgICAgICByZXR1cm4gMTsKKyAgfQorICBoU291cmNlRmlsZSA9IExaT3BlbkZpbGUoYXJndlsxXSwgJlNvdXJjZU9wZW5TdHJ1Y3QxLCBPRl9SRUFEKTsKKyAgaWYgKGFyZ3ZbMl0pCisgICAgICBoRGVzdEZpbGUgPSBMWk9wZW5GaWxlKGFyZ3ZbMl0sICZTb3VyY2VPcGVuU3RydWN0MiwgT0ZfQ1JFQVRFIHwgT0ZfV1JJVEUpOworICBlbHNlCisgIHsKKyAgICAgIGNoYXIgT3JpZ2luYWxOYW1lW01BWF9QQVRIXTsKKyAgICAgIEdldEV4cGFuZGVkTmFtZShhcmd2WzFdLCBPcmlnaW5hbE5hbWUpOworICAgICAgaERlc3RGaWxlID0gTFpPcGVuRmlsZShPcmlnaW5hbE5hbWUsICZTb3VyY2VPcGVuU3RydWN0MiwgT0ZfQ1JFQVRFIHwgT0ZfV1JJVEUpOworICB9CiAgIGR3cmV0dXJuID0gTFpDb3B5KGhTb3VyY2VGaWxlLCBoRGVzdEZpbGUpOwogICBpZiAoZHdyZXR1cm4gIT0gMCkKLQkgIGZwcmludGYoc3RkZXJyLCJMWkNvcHkgZmFpbGVkOiByZXR1cm4gaXMgJWxkXG4iLGR3cmV0dXJuKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCJMWkNvcHkgZmFpbGVkOiByZXR1cm4gaXMgJWxkXG4iLGR3cmV0dXJuKTsKICAgTFpDbG9zZShoU291cmNlRmlsZSk7CiAgIExaQ2xvc2UoaERlc3RGaWxlKTsKICAgcmV0dXJuIGR3cmV0dXJuOwo=